From ea3aee4d5f946f82b64ef64092651ab702ca38e9 Mon Sep 17 00:00:00 2001 From: Olivia Jain Date: Wed, 17 Feb 2021 19:07:38 -0800 Subject: [PATCH 01/37] Bumping up version to 1.7 (#6736) * bumping up version to 1.7 * Windows AI should align with ORT Version --- VERSION_NUMBER | 2 +- docs/Versioning.md | 1 + docs/python/README.rst | 5 + nodejs/package-lock.json | 19000 ++++++++-------- nodejs/package.json | 130 +- onnxruntime/__init__.py | 2 +- onnxruntime/core/session/onnxruntime_c_api.cc | 3 +- package/rpm/onnxruntime.spec | 2 +- 8 files changed, 9575 insertions(+), 9570 deletions(-) diff --git a/VERSION_NUMBER b/VERSION_NUMBER index dc1e644a10..bd8bf882d0 100644 --- a/VERSION_NUMBER +++ b/VERSION_NUMBER @@ -1 +1 @@ -1.6.0 +1.7.0 diff --git a/docs/Versioning.md b/docs/Versioning.md index 4aa736977b..9bcb2ddc79 100644 --- a/docs/Versioning.md +++ b/docs/Versioning.md @@ -26,6 +26,7 @@ For more details on ONNX Release versions, see [this page](https://github.com/on | ONNX Runtime release version | ONNX release version | ONNX opset version | ONNX ML opset version | Supported ONNX IR version | [Windows ML Availability](https://docs.microsoft.com/en-us/windows/ai/windows-ml/release-notes/)| |------------------------------|--------------------|--------------------|----------------------|------------------|------------------| +| 1.7.0 | **1.8** down to 1.2 | 13 | 2 | 7 | Windows AI 1.7+ | | 1.6.0 | **1.8** down to 1.2 | 13 | 2 | 7 | Windows AI 1.6+ | | 1.5.3 | **1.7** down to 1.2 | 12 | 2 | 7 | Windows AI 1.5+ | | 1.5.2 | **1.7** down to 1.2 | 12 | 2 | 7 | Windows AI 1.5+ | diff --git a/docs/python/README.rst b/docs/python/README.rst index 5bc52fe4ff..8d58e4bc0e 100644 --- a/docs/python/README.rst +++ b/docs/python/README.rst @@ -8,6 +8,11 @@ For more information on ONNX Runtime, please see `aka.ms/onnxruntime =0.5 0", + "rimraf": "2" + }, + "version": "1.0.12", + "integrity": "sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU=", + "dev": true + }, + "is-plain-obj": { + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "version": "2.1.0", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "es6-promisify": { + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "requires": { + "es6-promise": "^4.0.3" + }, + "version": "5.0.0", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true + }, + "spdx-expression-parse": { + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "requires": { + "spdx-license-ids": "^3.0.0", + "spdx-exceptions": "^2.1.0" + }, + "version": "3.0.1", + "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", + "dev": true + }, + "flat": { + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "version": "5.0.2", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "jsonc": { + "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", + "integrity": "sha1-niolEA0WSpu4ZMV1F1Y3F/qIJVE=", + "dev": true, + "version": "2.0.0", + "dependencies": { + "parse-json": { + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "version": "4.0.0", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true + }, + "strip-json-comments": { + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "version": "3.1.1", + "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", + "dev": true + }, + "strip-bom": { + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha1-nDUFwdtFvO3KPZz3oW9cWqOQGHg=", + "dev": true + } + }, + "requires": { + "strip-bom": "^4.0.0", + "parse-json": "^4.0.0", + "strip-json-comments": "^3.0.1", + "graceful-fs": "^4.1.15", + "mkdirp": "^0.5.1", + "fast-safe-stringify": "^2.0.6" + } + }, + "onigasm": { + "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", + "requires": { + "lru-cache": "^5.1.1" + }, + "version": "2.2.5", + "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", + "dev": true + }, + "big-integer": { + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "version": "1.6.48", + "integrity": "sha1-j9iL0WMsukocjD49cVnwi7lbS54=", + "dev": true + }, + "emoji-regex": { + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "version": "8.0.0", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "tsutils": { + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz", + "requires": { + "tslib": "^1.8.1" + }, + "version": "3.20.0", + "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==", + "dev": true + }, + "slice-ansi": { + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "version": "4.0.0", + "dependencies": { + "color-convert": { + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "requires": { + "color-name": "~1.1.4" + }, + "version": "2.0.1", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true + }, + "ansi-styles": { + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "requires": { + "color-convert": "^2.0.1" + }, + "version": "4.3.0", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true + }, + "color-name": { + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "version": "1.1.4", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "is-fullwidth-code-point": { + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + } + }, + "requires": { + "is-fullwidth-code-point": "^3.0.0", + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0" + } + }, + "har-validator": { + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "requires": { + "har-schema": "^2.0.0", + "ajv": "^6.12.3" + }, + "version": "5.1.5", + "integrity": "sha1-HwgDufjLIMD6E4It8ezds2veHv0=", + "dev": true + }, + "jsonfile": { + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "requires": { + "graceful-fs": "^4.1.6" + }, + "version": "4.0.0", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true + }, + "path-key": { + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "version": "2.0.1", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "@babel/code-frame": { + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "requires": { + "@babel/highlight": "^7.10.4" + }, + "version": "7.10.4", + "integrity": "sha1-Fo2ho26Q2miujUnA8bSMfGJJITo=", + "dev": true + }, + "spdx-correct": { + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "requires": { + "spdx-license-ids": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + }, + "version": "3.1.1", + "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", + "dev": true + }, + "eslint-plugin-jsdoc": { + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-31.6.0.tgz", + "integrity": "sha512-kYhdW+BXHij9n12oHvAC27oDHKEFITz1YJP/C0NPtb+gsGJWxejh5B6dEmmj6oLYOsmNvuCVkdIcqYOyabP2QA==", + "dev": true, + "version": "31.6.0", + "dependencies": { + "yallist": { + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "semver": { + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "requires": { + "lru-cache": "^6.0.0" + }, + "version": "7.3.4", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true + }, + "lru-cache": { + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "requires": { + "yallist": "^4.0.0" + }, + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true + } + }, + "requires": { + "regextras": "^0.7.1", + "lodash": "^4.17.20", + "comment-parser": "1.1.1", + "semver": "^7.3.4", + "jsdoctypeparser": "^9.0.0", + "debug": "^4.3.1", + "spdx-expression-parse": "^3.0.1" + } + }, + "micromatch": { + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "requires": { + "picomatch": "^2.0.5", + "braces": "^3.0.1" + }, + "version": "4.0.2", + "integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=", + "dev": true + }, + "p-locate": { + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "requires": { + "p-limit": "^1.1.0" + }, + "version": "2.0.0", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true + }, + "ms": { + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "version": "2.1.2", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "lru-cache": { + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "requires": { + "yallist": "^3.0.2" + }, + "version": "5.1.1", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true + }, + "tar": { + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "requires": { + "yallist": "^3.0.3", + "safe-buffer": "^5.1.2", + "mkdirp": "^0.5.0", + "minipass": "^2.8.6", + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minizlib": "^1.2.1" + }, + "version": "4.4.13", + "integrity": "sha1-Q7NkvFKIjVVSmGN7ENYHkCVKtSU=", + "dev": true + }, + "json-schema-traverse": { + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "version": "0.4.1", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "fast-levenshtein": { + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "version": "2.0.6", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "expand-template": { + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "version": "2.0.3", + "integrity": "sha1-bhSz/O4POmNA7LV9LokYaSBSpHw=" + }, + "chokidar": { + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "requires": { + "anymatch": "~3.1.1", + "readdirp": "~3.5.0", + "glob-parent": "~5.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "is-binary-path": "~2.1.0", + "fsevents": "~2.1.2", + "braces": "~3.0.2" + }, + "version": "3.4.3", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "dev": true + }, + "tweetnacl": { + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "version": "0.14.5", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "@types/json-schema": { + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "version": "7.0.7", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "klaw-sync": { + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "requires": { + "graceful-fs": "^4.1.11" + }, + "version": "6.0.0", + "integrity": "sha1-H9LP1W67YlAYERTwpYEWcJnCsow=", + "dev": true + }, + "shiki": { + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.2.tgz", + "requires": { + "vscode-textmate": "^5.2.0", + "onigasm": "^2.2.5" + }, + "version": "0.9.2", + "integrity": "sha512-BjUCxVbxMnvjs8jC4b+BQ808vwjJ9Q8NtLqPwXShZ307HdXiDFYP968ORSVfaTNNSWYDBYdMnVKJ0fYNsoZUBA==", + "dev": true + }, + "@protobufjs/eventemitter": { + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", + "dev": true + }, + "rechoir": { + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "requires": { + "resolve": "^1.1.6" + }, + "version": "0.6.2", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true + }, + "fs-constants": { + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0=" + }, + "resolve-from": { + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "dev": true + }, + "lodash.padend": { + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "version": "4.6.1", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", + "dev": true + }, + "lodash.padstart": { + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "version": "4.6.1", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", + "dev": true + }, + "window-size": { + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "version": "0.1.4", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "dashdash": { + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "requires": { + "assert-plus": "^1.0.0" + }, + "version": "1.14.1", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true + }, + "levn": { + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "version": "0.4.1", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true + }, + "serialize-javascript": { + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "requires": { + "randombytes": "^2.1.0" + }, + "version": "5.0.1", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.14.2.tgz", + "integrity": "sha512-ESiFl8afXxt1dNj8ENEZT12p+jl9PqRur+Y19m0Z/SPikGL6rqq4e7Me60SU9a2M28uz48/8yct97VQYaGl0Vg==", + "dev": true, + "version": "4.14.2", + "dependencies": { + "yallist": { + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "semver": { + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "requires": { + "lru-cache": "^6.0.0" + }, + "version": "7.3.4", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true + }, + "lru-cache": { + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "requires": { + "yallist": "^4.0.0" + }, + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true + } + }, + "requires": { + "semver": "^7.3.2", + "lodash": "^4.17.15", + "globby": "^11.0.1", + "@typescript-eslint/visitor-keys": "4.14.2", + "is-glob": "^4.0.1", + "@typescript-eslint/types": "4.14.2", + "debug": "^4.1.1", + "tsutils": "^3.17.1" + } + }, + "memory-stream": { + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", + "integrity": "sha1-6+jdHDuLw4wOeUHp3dWuvmtN6D8=", + "dev": true, + "version": "0.0.3", + "dependencies": { + "isarray": { + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "version": "0.0.1", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "version": "0.10.31", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "readable-stream": { + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "requires": { + "inherits": "~2.0.1", + "isarray": "0.0.1", + "core-util-is": "~1.0.0", + "string_decoder": "~0.10.x" + }, + "version": "1.0.34", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true + } + }, + "requires": { + "readable-stream": "~1.0.26-2" + } + }, + "yargs-parser": { + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=", + "dev": true, + "version": "13.1.2", + "dependencies": { + "camelcase": { + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "version": "5.3.1", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", + "dev": true + } + }, + "requires": { + "decamelize": "^1.2.0", + "camelcase": "^5.0.0" + } + }, + "argparse": { + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "requires": { + "sprintf-js": "~1.0.2" + }, + "version": "1.0.10", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true + }, + "delayed-stream": { + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "globby": { + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "dev": true, + "version": "11.0.2", + "dependencies": { + "ignore": { + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "version": "5.1.8", + "integrity": "sha1-8VCotQo0KJsz4i9YiavU2AFvDlc=", + "dev": true + } + }, + "requires": { + "array-union": "^2.1.0", + "merge2": "^1.3.0", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "dir-glob": "^3.0.1", + "slash": "^3.0.0" + } + }, + "buffer-indexof-polyfill": { + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-0nMhNcWZnGSyd/z5savjSYJUcpw=", + "dev": true + }, + "wordwrap": { + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "eslint": { + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.19.0.tgz", + "integrity": "sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==", + "dev": true, + "version": "7.19.0", + "dependencies": { + "yallist": { + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "ansi-regex": { + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "version": "5.0.0", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "color-convert": { + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "requires": { + "color-name": "~1.1.4" + }, + "version": "2.0.1", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true + }, + "has-flag": { + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "cross-spawn": { + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "requires": { + "shebang-command": "^2.0.0", + "which": "^2.0.1", + "path-key": "^3.1.0" + }, + "version": "7.0.3", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true + }, + "strip-json-comments": { + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "version": "3.1.1", + "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", + "dev": true + }, + "supports-color": { + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "requires": { + "has-flag": "^4.0.0" + }, + "version": "7.2.0", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true + }, + "shebang-command": { + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "requires": { + "shebang-regex": "^3.0.0" + }, + "version": "2.0.0", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true + }, + "semver": { + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "requires": { + "lru-cache": "^6.0.0" + }, + "version": "7.3.4", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true + }, + "path-key": { + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "version": "3.1.1", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "chalk": { + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "requires": { + "supports-color": "^7.1.0", + "ansi-styles": "^4.1.0" + }, + "version": "4.1.0", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true + }, + "ansi-styles": { + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "requires": { + "color-convert": "^2.0.1" + }, + "version": "4.3.0", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true + }, + "color-name": { + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "version": "1.1.4", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "which": { + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "requires": { + "isexe": "^2.0.0" + }, + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true + }, + "strip-ansi": { + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "requires": { + "ansi-regex": "^5.0.0" + }, + "version": "6.0.0", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true + }, + "shebang-regex": { + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "lru-cache": { + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "requires": { + "yallist": "^4.0.0" + }, + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true + } + }, + "requires": { + "semver": "^7.2.1", + "glob-parent": "^5.0.0", + "cross-spawn": "^7.0.2", + "js-yaml": "^3.13.1", + "globals": "^12.1.0", + "doctrine": "^3.0.0", + "table": "^6.0.4", + "optionator": "^0.9.1", + "espree": "^7.3.1", + "import-fresh": "^3.0.0", + "ignore": "^4.0.6", + "enquirer": "^2.3.5", + "natural-compare": "^1.4.0", + "regexpp": "^3.1.0", + "v8-compile-cache": "^2.0.3", + "ajv": "^6.10.0", + "@eslint/eslintrc": "^0.3.0", + "eslint-scope": "^5.1.1", + "progress": "^2.0.0", + "minimatch": "^3.0.4", + "file-entry-cache": "^6.0.0", + "is-glob": "^4.0.0", + "strip-ansi": "^6.0.0", + "levn": "^0.4.1", + "eslint-visitor-keys": "^2.0.0", + "text-table": "^0.2.0", + "@babel/code-frame": "^7.0.0", + "eslint-utils": "^2.1.0", + "esutils": "^2.0.2", + "lodash": "^4.17.20", + "esquery": "^1.2.0", + "strip-json-comments": "^3.1.0", + "chalk": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "debug": "^4.0.1", + "imurmurhash": "^0.1.4" + } + }, + "@types/node": { + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz", + "version": "14.11.8", + "integrity": "sha1-/iAS8jVeTOCLykSus6u7Ic+I0z8=", + "dev": true + }, + "listenercount": { + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", + "dev": true + }, + "handlebars": { + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "requires": { + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0", + "minimist": "^1.2.5" + }, + "version": "4.7.6", + "integrity": "sha1-1MBcG6+Q6ZRfd6pop6IZqkp9904=", + "dev": true + }, + "lunr": { + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "version": "2.3.9", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "json-parse-better-errors": { + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "dev": true + }, + "@types/fs-extra": { + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.6.tgz", + "requires": { + "@types/node": "*" + }, + "version": "9.0.6", + "integrity": "sha512-ecNRHw4clCkowNOBJH1e77nvbPxHYnWIXMv1IAoG/9+MYGkgoyr3Ppxr7XYFNL41V422EDhyV4/4SSK8L2mlig==", + "dev": true + }, + "has-unicode": { + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "version": "2.0.1", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "asynckit": { + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "version": "0.4.0", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "type-check": { + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "requires": { + "prelude-ls": "^1.2.1" + }, + "version": "0.4.0", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true + }, + "uuid": { + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "version": "3.4.0", + "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", + "dev": true + }, + "@typescript-eslint/parser": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.14.2.tgz", + "requires": { + "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "4.14.2", + "@typescript-eslint/typescript-estree": "4.14.2", + "@typescript-eslint/types": "4.14.2" + }, + "version": "4.14.2", + "integrity": "sha512-ipqSP6EuUsMu3E10EZIApOJgWSpcNXeKZaFeNKQyzqxnQl8eQCbV+TSNsl+s2GViX2d18m1rq3CWgnpOxDPgHg==", + "dev": true + }, + "regexpp": { + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "version": "3.1.0", + "integrity": "sha1-IG0K0KVkjP+9uK5GQ489xRyfeOI=", + "dev": true + }, + "http-proxy-agent": { + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=", + "dev": true, + "version": "2.1.0", + "dependencies": { + "debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "requires": { + "ms": "2.0.0" + }, + "version": "3.1.0", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true + }, + "ms": { + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + }, + "requires": { + "debug": "3.1.0", + "agent-base": "4" + } + }, + "ansi-colors": { + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "version": "4.1.1", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "unzipper": { + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", + "integrity": "sha1-reBSTNL8FNEbjeJYviL50kfT95s=", + "dev": true, + "version": "0.8.14", + "dependencies": { + "string_decoder": { + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "version": "0.10.31", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "process-nextick-args": { + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "version": "1.0.7", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "requires": { + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "core-util-is": "~1.0.0", + "string_decoder": "~0.10.x", + "process-nextick-args": "~1.0.6", + "util-deprecate": "~1.0.1", + "buffer-shims": "^1.0.0" + }, + "version": "2.1.5", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "dev": true + } + }, + "requires": { + "listenercount": "~1.0.1", + "binary": "~0.3.0", + "duplexer2": "~0.1.4", + "big-integer": "^1.6.17", + "fstream": "~1.0.10", + "setimmediate": "~1.0.4", + "readable-stream": "~2.1.5", + "buffer-indexof-polyfill": "~1.0.0", + "bluebird": "~3.4.1" + } + }, + "tough-cookie": { + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "requires": { + "punycode": "^2.1.1", + "psl": "^1.1.28" + }, + "version": "2.5.0", + "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=", + "dev": true + }, + "cliui": { + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "requires": { + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0", + "string-width": "^1.0.1" + }, + "version": "3.2.0", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true + }, + "eslint-plugin-prefer-arrow": { + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "requires": {}, + "version": "1.2.3", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", + "dev": true + }, + "typescript": { + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", + "version": "4.1.3", + "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", + "dev": true + }, + "code-point-at": { + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "p-try": { + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "node-pre-gyp-github": { + "resolved": "https://registry.npmjs.org/node-pre-gyp-github/-/node-pre-gyp-github-1.4.3.tgz", + "requires": { + "@octokit/rest": "^15.9.5", + "mime-types": "^2.1.19", + "commander": "^2.17.0" + }, + "version": "1.4.3", + "integrity": "sha1-VhmZmEMhbfaHDLLaukbBOCWAaMU=", + "dev": true + }, + "eslint-visitor-keys": { + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "simple-get": { + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "requires": { + "decompress-response": "^4.2.0", + "simple-concat": "^1.0.0", + "once": "^1.3.1" + }, + "version": "3.1.0", + "integrity": "sha1-tFvgYkNeUNFZVAtXYgLO7EC5xrM=" + }, + "execa": { + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "requires": { + "cross-spawn": "^6.0.0", + "signal-exit": "^3.0.0", + "p-finally": "^1.0.0", + "strip-eof": "^1.0.0", + "is-stream": "^1.1.0", + "get-stream": "^4.0.0", + "npm-run-path": "^2.0.0" + }, + "version": "1.0.0", + "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", + "dev": true + }, + "read-pkg-up": { + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "requires": { + "read-pkg": "^2.0.0", + "find-up": "^2.0.0" + }, + "version": "2.0.0", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true + }, + "caseless": { + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "version": "0.12.0", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "oauth-sign": { + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "version": "0.9.0", + "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", + "dev": true + }, + "lcid": { + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "requires": { + "invert-kv": "^1.0.0" + }, + "version": "1.0.0", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true + }, + "debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "requires": { + "ms": "2.1.2" + }, + "version": "4.3.1", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true + }, + "esrecurse": { + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", + "dev": true, + "version": "4.3.0", + "dependencies": { + "estraverse": { + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "version": "5.2.0", + "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", + "dev": true + } + }, + "requires": { + "estraverse": "^5.2.0" + } + }, + "core-util-is": { + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "contains-path": { + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "version": "0.1.0", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "har-schema": { + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "nice-try": { + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "version": "1.0.5", + "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", + "dev": true + }, + "dir-glob": { + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=", + "dev": true, + "version": "3.0.1", + "dependencies": { + "path-type": { + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", + "dev": true + } + }, + "requires": { + "path-type": "^4.0.0" + } + }, + "@protobufjs/fetch": { + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "requires": { + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/aspromise": "^1.1.1" + }, + "version": "1.1.0", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dev": true + }, + "buffers": { + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "version": "0.1.1", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "dev": true + }, + "minimatch": { + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "requires": { + "brace-expansion": "^1.1.7" + }, + "version": "3.0.4", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true + }, + "os-locale": { + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "requires": { + "lcid": "^1.0.0" + }, + "version": "1.4.0", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true + }, + "@octokit/rest": { + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-15.18.3.tgz", + "integrity": "sha1-/07Lt4TKKGxAzB1WirztptmbNvw=", + "dev": true, + "version": "15.18.3", + "dependencies": { + "debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "requires": { + "ms": "^2.1.1" + }, + "version": "3.2.6", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true + } + }, + "requires": { + "lodash": "^4.17.4", + "url-template": "^2.0.8", + "before-after-hook": "^1.1.0", + "btoa-lite": "^1.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.0", + "node-fetch": "^2.1.1", + "debug": "^3.1.0", + "universal-user-agent": "^2.0.0" + } + }, + "natural-compare": { + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "version": "1.4.0", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "ajv": { + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "requires": { + "uri-js": "^4.2.2", + "json-schema-traverse": "^0.4.1", + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0" + }, + "version": "6.12.6", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true + }, + "rc": { + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "requires": { + "strip-json-comments": "~2.0.1", + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0" + }, + "version": "1.2.8", + "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=" + }, + "napi-build-utils": { + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-sf3cCyxG44Cgt6dvmE3UfEGhOAY=" + }, + "prebuild-install": { + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.0.tgz", + "requires": { + "npmlog": "^4.0.1", + "github-from-package": "0.0.0", + "noop-logger": "^0.1.1", + "minimist": "^1.2.3", + "pump": "^3.0.0", + "simple-get": "^3.0.3", + "node-abi": "^2.7.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0", + "expand-template": "^2.0.3", + "mkdirp-classic": "^0.5.3", + "tar-fs": "^2.0.0", + "rc": "^1.2.7", + "napi-build-utils": "^1.0.1", + "detect-libc": "^1.0.3" + }, + "version": "6.0.0", + "integrity": "sha512-h2ZJ1PXHKWZpp1caLw0oX9sagVpL2YTk+ZwInQbQ3QqNd4J03O6MpFNmMTJlkfgPENWqe5kP0WjQLqz5OjLfsw==" + }, + "delegates": { + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "btoa-lite": { + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "dev": true + }, + "decompress-response": { + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "requires": { + "mimic-response": "^2.0.0" + }, + "version": "4.2.1", + "integrity": "sha1-QUAjzHowLaJc4uyC0NUjjMr9iYY=" + }, + "ansi-styles": { + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "requires": { + "color-convert": "^1.9.0" + }, + "version": "3.2.1", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true + }, + "acorn": { + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "version": "7.4.1", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "is-callable": { + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "version": "1.2.2", + "integrity": "sha1-x8ZxXNItTdtI0+GZcCI6zquwgNk=", + "dev": true + }, + "deep-is": { + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "version": "0.1.3", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "universalify": { + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "version": "0.1.2", + "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", + "dev": true + }, + "uri-js": { + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "requires": { + "punycode": "^2.1.0" + }, + "version": "4.4.0", + "integrity": "sha1-qnFCYd55PoqCNHp7zJznTobyhgI=", + "dev": true + }, + "is-string": { + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "version": "1.0.5", + "integrity": "sha1-QEk+0ZjvP/R3uMf5L2ROyCpc06Y=", + "dev": true + }, + "isstream": { + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "version": "0.1.2", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "safer-buffer": { + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "version": "2.1.2", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true + }, + "@nodelib/fs.scandir": { + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "requires": { + "run-parallel": "^1.1.9", + "@nodelib/fs.stat": "2.0.3" + }, + "version": "2.1.3", + "integrity": "sha1-Olgr21OATGum0UZXnEblITDPSjs=", + "dev": true + }, + "imurmurhash": { + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "version": "0.1.4", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "define-properties": { + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "requires": { + "object-keys": "^1.0.12" + }, + "version": "1.1.3", + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", + "dev": true + }, + "before-after-hook": { + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.4.0.tgz", + "version": "1.4.0", + "integrity": "sha1-K2vyPcpPMuYo/SdHwQo3x0pLSE0=", + "dev": true + }, + "string-width": { + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "requires": { + "strip-ansi": "^3.0.0", + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0" + }, + "version": "1.0.2", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + }, + "long": { + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=", + "dev": true + }, + "braces": { + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "requires": { + "fill-range": "^7.0.1" + }, + "version": "3.0.2", + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", + "dev": true + }, + "simple-concat": { + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-9Gl2CCujXCJj8cirXt/ibEHJVS8=" + }, + "decamelize": { + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "version": "1.2.0", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "camelcase": { + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "version": "2.1.1", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "ieee754": { + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "version": "1.1.13", + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" + }, + "inflight": { + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "requires": { + "wrappy": "1", + "once": "^1.3.0" + }, + "version": "1.0.6", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true + }, + "@nodelib/fs.walk": { + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "requires": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + }, + "version": "1.2.4", + "integrity": "sha1-ARuSAqcKY2bkNspcBlhEUoqwSXY=", + "dev": true + }, + "binary-extensions": { + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "version": "2.2.0", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "node-addon-api": { + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", + "version": "3.1.0", + "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", + "dev": true + }, + "source-map": { + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "version": "0.6.1", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true + }, + "p-limit": { + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "requires": { + "p-try": "^1.0.0" + }, + "version": "1.3.0", + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", + "dev": true + }, + "setimmediate": { + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "version": "1.0.5", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "is-glob": { + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "requires": { + "is-extglob": "^2.1.1" + }, + "version": "4.0.1", + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", + "dev": true + }, + "concat-map": { + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "version": "0.0.1", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "path-exists": { + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "url-template": { + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "version": "2.0.8", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", + "dev": true + }, + "ecc-jsbn": { + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "requires": { + "safer-buffer": "^2.1.0", + "jsbn": "~0.1.0" + }, + "version": "0.1.2", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true + }, + "supports-color": { + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "requires": { + "has-flag": "^3.0.0" + }, + "version": "5.5.0", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true + }, + "object-keys": { + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "version": "1.1.1", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", + "dev": true + }, + "yallist": { + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "version": "3.1.1", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", + "dev": true + }, + "fastq": { + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "requires": { + "reusify": "^1.0.4" + }, + "version": "1.8.0", + "integrity": "sha1-VQ4fn1m7xl/hhctqm02VNXEH9IE=", + "dev": true + }, + "nanoid": { + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", + "version": "3.1.12", + "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", + "dev": true + }, + "getpass": { + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "requires": { + "assert-plus": "^1.0.0" + }, + "version": "0.1.7", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true + }, + "signal-exit": { + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "version": "3.0.3", + "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=" + }, + "path-type": { + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "requires": { + "pify": "^2.0.0" + }, + "version": "2.0.0", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true + }, + "optionator": { + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "requires": { + "type-check": "^0.4.0", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "word-wrap": "^1.2.3", + "prelude-ls": "^1.2.1", + "levn": "^0.4.1" + }, + "version": "0.9.1", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true + }, + "pify": { + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "version": "2.3.0", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "which": { + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "requires": { + "isexe": "^2.0.0" + }, + "version": "1.3.1", + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", + "dev": true + }, + "hosted-git-info": { + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "version": "2.8.8", + "integrity": "sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg=", + "dev": true + }, + "is-negative-zero": { + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, + "neo-async": { + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "version": "2.6.2", + "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", + "dev": true + }, + "log-symbols": { + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "version": "4.0.0", + "dependencies": { + "color-convert": { + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "requires": { + "color-name": "~1.1.4" + }, + "version": "2.0.1", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true + }, + "has-flag": { + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "requires": { + "has-flag": "^4.0.0" + }, + "version": "7.2.0", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true + }, + "chalk": { + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "requires": { + "supports-color": "^7.1.0", + "ansi-styles": "^4.1.0" + }, + "version": "4.1.0", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true + }, + "ansi-styles": { + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "requires": { + "color-convert": "^2.0.1" + }, + "version": "4.3.0", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true + }, + "color-name": { + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "version": "1.1.4", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + }, + "requires": { + "chalk": "^4.0.0" + } + }, + "@typescript-eslint/experimental-utils": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.14.2.tgz", + "requires": { + "@typescript-eslint/scope-manager": "4.14.2", + "eslint-scope": "^5.0.0", + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "4.14.2", + "@typescript-eslint/typescript-estree": "4.14.2", + "eslint-utils": "^2.0.0" + }, + "version": "4.14.2", + "integrity": "sha512-mV9pmET4C2y2WlyHmD+Iun8SAEqkLahHGBkGqDVslHkmoj3VnxnGP4ANlwuxxfq1BsKdl/MPieDbohCEQgKrwA==", + "dev": true + }, + "buffer": { + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "requires": { + "ieee754": "^1.1.4", + "base64-js": "^1.0.2" + }, + "version": "5.6.0", + "integrity": "sha1-oxdJ3H2B2E2wir+Te2uMQDP2J4Y=" + }, + "file-entry-cache": { + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "requires": { + "flat-cache": "^3.0.4" + }, + "version": "6.0.0", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "dev": true + }, + "glob": { + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "requires": { + "inherits": "2", + "minimatch": "^3.0.4", + "inflight": "^1.0.4", + "fs.realpath": "^1.0.0", + "path-is-absolute": "^1.0.0", + "once": "^1.3.0" + }, + "version": "7.1.6", + "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", + "dev": true + }, + "find-up": { + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "requires": { + "locate-path": "^2.0.0" + }, + "version": "2.1.0", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true + }, + "chownr": { + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "version": "1.1.4", + "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=" + }, + "shelljs": { + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "version": "0.8.4", + "integrity": "sha1-3naE/ut2f4cWsyYHiooAh1iQ48I=", + "dev": true + }, + "detect-libc": { + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "version": "1.0.3", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "request": { + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "requires": { + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "extend": "~3.0.2", + "http-signature": "~1.2.0", + "json-stringify-safe": "~5.0.1", + "uuid": "^3.3.2", + "performance-now": "^2.1.0", + "caseless": "~0.12.0", + "isstream": "~0.1.2", + "form-data": "~2.3.2", + "oauth-sign": "~0.9.0", + "tough-cookie": "~2.5.0", + "combined-stream": "~1.0.6", + "mime-types": "~2.1.19", + "tunnel-agent": "^0.6.0", + "aws-sign2": "~0.7.0", + "is-typedarray": "~1.0.0", + "forever-agent": "~0.6.1", + "aws4": "^1.8.0", + "har-validator": "~5.1.3" + }, + "version": "2.88.2", + "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=", + "dev": true + }, + "mkdirp-classic": { + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "version": "0.5.3", + "integrity": "sha1-+hDJEVzG2IZb4iG6R+6b7XhgERM=" + }, + "npm-run-path": { + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "requires": { + "path-key": "^2.0.0" + }, + "version": "2.0.2", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true + }, + "y18n": { + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "version": "3.2.1", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.14.2.tgz", + "requires": { + "eslint-visitor-keys": "^2.0.0", + "@typescript-eslint/types": "4.14.2" + }, + "version": "4.14.2", + "integrity": "sha512-KBB+xLBxnBdTENs/rUgeUKO0UkPBRs2vD09oMRRIkj5BEN8PX1ToXV532desXfpQnZsYTyLLviS7JrPhdL154w==", + "dev": true + }, + "randombytes": { + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "requires": { + "safe-buffer": "^5.1.0" + }, + "version": "2.1.0", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true + }, + "@protobufjs/aspromise": { + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "version": "1.1.2", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", + "dev": true + }, + "tsconfig-paths": { + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "requires": { + "json5": "^1.0.1", + "strip-bom": "^3.0.0", + "@types/json5": "^0.0.29", + "minimist": "^1.2.0" + }, + "version": "3.9.0", + "integrity": "sha1-CYVHpsREiAfo/Ljq4IEGTumjyQs=", + "dev": true + }, + "locate-path": { + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "requires": { + "path-exists": "^3.0.0", + "p-locate": "^2.0.0" + }, + "version": "2.0.0", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true + }, + "colors": { + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "version": "1.4.0", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "gauge": { + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "requires": { + "object-assign": "^4.1.0", + "console-control-strings": "^1.0.0", + "wide-align": "^1.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "has-unicode": "^2.0.0", + "aproba": "^1.0.3" + }, + "version": "2.7.4", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=" + }, + "flat-cache": { + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "version": "3.0.4", + "dependencies": { + "rimraf": { + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "requires": { + "glob": "^7.1.3" + }, + "version": "3.0.2", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true + } + }, + "requires": { + "rimraf": "^3.0.2", + "flatted": "^3.1.0" + } + }, + "punycode": { + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "version": "2.1.1", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", + "dev": true + }, + "parent-module": { + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "requires": { + "callsites": "^3.0.0" + }, + "version": "1.0.1", + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", + "dev": true + }, + "object.values": { + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "requires": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + }, + "version": "1.1.1", + "integrity": "sha1-aKmezeNWt+kpWjxeDOMdyMlT3l4=", + "dev": true + }, + "workerpool": { + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", + "version": "6.0.2", + "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", + "dev": true + }, + "asn1": { + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "requires": { + "safer-buffer": "~2.1.0" + }, + "version": "0.2.4", + "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", + "dev": true + }, + "util-deprecate": { + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "clang-format": { + "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.5.0.tgz", + "requires": { + "async": "^1.5.2", + "glob": "^7.0.0", + "resolve": "^1.1.6" + }, + "version": "1.5.0", + "integrity": "sha512-C1LucFX7E+ABVYcPEbBHM4PYQ2+WInXsqsLpFlQ9cmRfSbk7A7b1I06h/nE4bQ3MsyEkb31jY2gC0Dtc76b4IA==", + "dev": true + }, + "mimic-response": { + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "version": "2.1.0", + "integrity": "sha1-0Tdj019hPQnsN+uzC6wEacDuj0M=" + }, + "bcrypt-pbkdf": { + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "requires": { + "tweetnacl": "^0.14.3" + }, + "version": "1.0.2", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true + }, + "fs.realpath": { + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "is-extglob": { + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "version": "2.1.1", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "are-we-there-yet": { + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "version": "1.1.5", + "integrity": "sha1-SzXClE8GKov82mZBB2A1D+nd/CE=" + }, + "end-of-stream": { + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "requires": { + "once": "^1.4.0" + }, + "version": "1.4.4", + "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=" + }, + "spdx-license-ids": { + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "version": "3.0.6", + "integrity": "sha1-yAdXODwoq/cpZ0SZjLwQaui4VM4=", + "dev": true + }, + "validate-npm-package-license": { + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + }, + "version": "3.0.4", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "dev": true + }, + "isarray": { + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "qs": { + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "version": "6.5.2", + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", + "dev": true + }, + "resolve": { + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "requires": { + "path-parse": "^1.0.6" + }, + "version": "1.17.0", + "integrity": "sha1-sllBtUloIxzC0bt2p5y38sC/hEQ=", + "dev": true + }, + "merge2": { + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "version": "1.4.1", + "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", + "dev": true + }, + "strip-ansi": { + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "requires": { + "ansi-regex": "^2.0.0" + }, + "version": "3.0.1", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" + }, + "run-parallel": { + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "version": "1.1.9", + "integrity": "sha1-yd06fPn0ssS2JE4XOm7YZuYd1nk=", + "dev": true + }, + "jsdoctypeparser": { + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", + "version": "9.0.0", + "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", + "dev": true + }, + "combined-stream": { + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "requires": { + "delayed-stream": "~1.0.0" + }, + "version": "1.0.8", + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", + "dev": true + }, + "@babel/highlight": { + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "version": "7.10.4", + "integrity": "sha1-fRvf1ldTU4+r5sOFls23bZrGAUM=", + "dev": true + }, + "traverse": { + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "version": "0.3.9", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true + }, + "browser-stdout": { + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "version": "1.3.1", + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", + "dev": true + }, + "callsites": { + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "version": "3.1.0", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", + "dev": true + }, + "color-name": { + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "version": "1.1.3", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "wide-align": { + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "version": "1.1.3", + "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=" + }, + "pump": { + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + }, + "version": "3.0.0", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=" + }, + "tar-fs": { + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "requires": { + "tar-stream": "^2.0.0", + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0" + }, + "version": "2.1.0", + "integrity": "sha1-0c3RIatGXuDrnM3i01BJ0/Pa8NU=" + }, + "progress": { + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "version": "2.0.3", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", + "dev": true + }, + "require-main-filename": { + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", + "dev": true + }, + "astral-regex": { + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "extend": { + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "version": "3.0.2", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", + "dev": true + }, + "@typescript-eslint/scope-manager": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.14.2.tgz", + "requires": { + "@typescript-eslint/visitor-keys": "4.14.2", + "@typescript-eslint/types": "4.14.2" + }, + "version": "4.14.2", + "integrity": "sha512-cuV9wMrzKm6yIuV48aTPfIeqErt5xceTheAgk70N1V4/2Ecj+fhl34iro/vIssJlb7XtzcaD07hWk7Jk0nKghg==", + "dev": true + }, + "@types/mocha": { + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz", + "version": "8.2.0", + "integrity": "sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==", + "dev": true + }, + "node-fetch": { + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "version": "2.6.1", + "integrity": "sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI=", + "dev": true + }, + "aws-sign2": { + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "version": "0.7.0", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "es6-promise": { + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "version": "4.2.8", + "integrity": "sha1-TrIVlMlyvEBVPSduUQU5FD21Pgo=", + "dev": true + }, + "github-from-package": { + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "version": "0.0.0", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, + "object-inspect": { + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "version": "1.8.0", + "integrity": "sha1-34B+Xs9TpgnMa/6T6sPMe+WzqdA=", + "dev": true + }, + "splitargs": { + "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", + "version": "0.0.7", + "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=", + "dev": true + }, + "tar-stream": { + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "fs-constants": "^1.0.0", + "readable-stream": "^3.1.1" + }, + "version": "2.2.0", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "readable-stream": { + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "version": "3.6.0", + "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=" + } + } + }, + "eslint-plugin-import": { + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha1-CJbH5qDPRBCaLZe5WQPCu2iddwI=", + "dev": true, + "version": "2.22.1", + "dependencies": { + "debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "requires": { + "ms": "2.0.0" + }, + "version": "2.6.9", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true + }, + "ms": { + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "doctrine": { + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "requires": { + "isarray": "^1.0.0", + "esutils": "^2.0.2" + }, + "version": "1.5.0", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true + } + }, + "requires": { + "minimatch": "^3.0.4", + "resolve": "^1.17.0", + "contains-path": "^0.1.0", + "object.values": "^1.1.1", + "array.prototype.flat": "^1.2.3", + "eslint-import-resolver-node": "^0.3.4", + "read-pkg-up": "^2.0.0", + "tsconfig-paths": "^3.9.0", + "doctrine": "1.5.0", + "debug": "^2.6.9", + "array-includes": "^3.1.1", + "has": "^1.0.3", + "eslint-module-utils": "^2.6.0" + } + }, + "globals": { + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "requires": { + "type-fest": "^0.8.1" + }, + "version": "12.4.0", + "integrity": "sha1-oYgTV2pBsAokqX5/gVkYwuGZJfg=", + "dev": true + }, + "diff": { + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "version": "4.0.2", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "@protobufjs/float": { + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "dev": true + }, + "picomatch": { + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "version": "2.2.2", + "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=", + "dev": true + }, + "aws4": { + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "version": "1.10.1", + "integrity": "sha1-4eguTz6Zniz9YbFhKA0WoRH4ZCg=", + "dev": true + }, + "string.prototype.trimstart": { + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "requires": { + "es-abstract": "^1.17.5", + "define-properties": "^1.1.3" + }, + "version": "1.0.1", + "integrity": "sha1-FK9tnzSwU/fPyJty+PLuFLkDmlQ=", + "dev": true + }, + "minimist": { + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "version": "1.2.5", + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" + }, + "https-proxy-agent": { + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha1-TuenN6vZJniik9mzShr00NCMeHs=", + "dev": true, + "version": "2.2.4", + "dependencies": { + "debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "requires": { + "ms": "^2.1.1" + }, + "version": "3.2.6", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true + } + }, + "requires": { + "debug": "^3.1.0", + "agent-base": "^4.3.0" + } + }, + "fs-minipass": { + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "requires": { + "minipass": "^2.6.0" + }, + "version": "1.2.7", + "integrity": "sha1-zP+FcIQef+QmVpPaiJNsVa7X98c=", + "dev": true + }, + "sshpk": { + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "requires": { + "jsbn": "~0.1.0", + "asn1": "~0.2.3", + "getpass": "^0.1.1", + "ecc-jsbn": "~0.1.1", + "safer-buffer": "^2.0.2", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "tweetnacl": "~0.14.0" + }, + "version": "1.16.1", + "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", + "dev": true + }, + "mime-db": { + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "version": "1.44.0", + "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=", + "dev": true + }, + "which-module": { + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.14.2.tgz", + "integrity": "sha512-uMGfG7GFYK/nYutK/iqYJv6K/Xuog/vrRRZX9aEP4Zv1jsYXuvFUMDFLhUnc8WFv3D2R5QhNQL3VYKmvLS5zsQ==", + "dev": true, + "version": "4.14.2", + "dependencies": { + "yallist": { + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "semver": { + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "requires": { + "lru-cache": "^6.0.0" + }, + "version": "7.3.4", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true + }, + "lru-cache": { + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "requires": { + "yallist": "^4.0.0" + }, + "version": "6.0.0", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true + } + }, + "requires": { + "semver": "^7.3.2", + "lodash": "^4.17.15", + "@typescript-eslint/experimental-utils": "4.14.2", + "@typescript-eslint/scope-manager": "4.14.2", + "functional-red-black-tree": "^1.0.1", + "debug": "^4.1.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "balanced-match": { + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "acorn-jsx": { + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "requires": {}, + "version": "5.3.1", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "lodash": { + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "version": "4.17.20", + "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=", + "dev": true + }, + "parse-json": { + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "requires": { + "error-ex": "^1.2.0" + }, + "version": "2.2.0", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true + }, + "json-stringify-safe": { + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "version": "5.0.1", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "chalk": { + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "requires": { + "supports-color": "^5.3.0", + "escape-string-regexp": "^1.0.5", + "ansi-styles": "^3.2.1" + }, + "version": "2.4.2", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true + }, + "shebang-command": { + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "requires": { + "shebang-regex": "^1.0.0" + }, + "version": "1.2.0", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true + }, + "functional-red-black-tree": { + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "reusify": { + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "version": "1.0.4", + "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=", + "dev": true + }, + "forever-agent": { + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "version": "0.6.1", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "@protobufjs/codegen": { + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "version": "2.0.4", + "integrity": "sha1-fvN/DQEPsCitGtWXIuUG2SYoFcs=", + "dev": true + }, + "inherits": { + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "version": "2.0.4", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" + }, + "base64-js": { + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "version": "1.3.1", + "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=" + }, + "commander": { + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "version": "2.20.3", + "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", + "dev": true + }, + "object.assign": { + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha1-MDhnpmbN1Bk27N7fsfjz4ypHjN0=", + "dev": true, + "version": "4.1.1", + "dependencies": { + "es-abstract": { + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "requires": { + "is-callable": "^1.2.2", + "has": "^1.0.3", + "object-inspect": "^1.8.0", + "is-regex": "^1.1.1", + "has-symbols": "^1.0.1", + "es-to-primitive": "^1.2.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1", + "function-bind": "^1.1.1", + "is-negative-zero": "^2.0.0", + "object.assign": "^4.1.1", + "object-keys": "^1.1.1" + }, + "version": "1.18.0-next.1", + "integrity": "sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg=", + "dev": true + } + }, + "requires": { + "es-abstract": "^1.18.0-next.0", + "define-properties": "^1.1.3", + "object-keys": "^1.1.1", + "has-symbols": "^1.0.1" + } + }, + "is-stream": { + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "import-fresh": { + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "requires": { + "resolve-from": "^4.0.0", + "parent-module": "^1.0.0" + }, + "version": "3.2.1", + "integrity": "sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY=", + "dev": true + }, + "binary": { + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "requires": { + "chainsaw": "~0.1.0", + "buffers": "~0.1.1" + }, + "version": "0.3.0", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dev": true + }, + "growl": { + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "version": "1.10.5", + "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", + "dev": true + }, + "tunnel-agent": { + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "requires": { + "safe-buffer": "^5.0.1" + }, + "version": "0.6.0", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" + }, + "@eslint/eslintrc": { + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", + "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", + "dev": true, + "version": "0.3.0", + "dependencies": { + "strip-json-comments": { + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "version": "3.1.1", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + }, + "requires": { + "import-fresh": "^3.2.1", + "minimatch": "^3.0.4", + "lodash": "^4.17.20", + "strip-json-comments": "^3.1.1", + "ajv": "^6.12.4", + "ignore": "^4.0.6", + "js-yaml": "^3.13.1", + "globals": "^12.1.0", + "debug": "^4.1.1", + "espree": "^7.3.0" + } + }, + "eslint-scope": { + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "requires": { + "estraverse": "^4.1.1", + "esrecurse": "^4.3.0" + }, + "version": "5.1.1", + "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=", + "dev": true + }, + "readable-stream": { + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "requires": { + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "core-util-is": "~1.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "process-nextick-args": "~2.0.0", + "util-deprecate": "~1.0.1" + }, + "version": "2.3.7", + "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=" + }, + "es-abstract": { + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "requires": { + "is-callable": "^1.2.2", + "object.assign": "^4.1.1", + "object-inspect": "^1.8.0", + "is-regex": "^1.1.1", + "has-symbols": "^1.0.1", + "es-to-primitive": "^1.2.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "object-keys": "^1.1.1" + }, + "version": "1.17.7", + "integrity": "sha1-pN5hsvZpifx0IWdsHLl4dXOs5Uw=", + "dev": true + }, + "v8-compile-cache": { + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "version": "2.1.1", + "integrity": "sha1-VLw83UMxe8qR413K8wWxpyN950U=", + "dev": true + }, + "mkdirp": { + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "requires": { + "minimist": "^1.2.5" + }, + "version": "0.5.5", + "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", + "dev": true + }, + "enquirer": { + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "requires": { + "ansi-colors": "^4.1.1" + }, + "version": "2.3.6", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true + }, + "js-yaml": { + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "version": "3.14.0", + "integrity": "sha1-p6NBcPJqIbsWJCTYray0ETpp5II=", + "dev": true + }, + "uglify-js": { + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.2.tgz", + "optional": true, + "version": "3.11.2", + "integrity": "sha1-n1AyVUQnPCeyDlht7xQOdybFJeo=", + "dev": true + }, + "protobufjs": { + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.1.tgz", + "integrity": "sha1-5qSE3Y8EspYp6QUzROOXDMzxPNI=", + "dev": true, + "version": "6.10.1", + "dependencies": { + "@types/node": { + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.25.tgz", + "version": "13.13.25", + "integrity": "sha1-do1nErFQmadEgSqSuE/96PThPPE=", + "dev": true + } + }, + "requires": { + "@protobufjs/pool": "^1.1.0", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "long": "^4.0.0", + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/codegen": "^2.0.4" + } + }, + "onnx-proto": { + "resolved": "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz", + "requires": { + "protobufjs": "^6.8.8" + }, + "version": "4.0.4", + "integrity": "sha1-JDGiW+4lFI6RWQbdoGh6r+O54EQ=", + "dev": true + }, + "minizlib": { + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "requires": { + "minipass": "^2.9.0" + }, + "version": "1.3.3", + "integrity": "sha1-IpDeloGKNMKVUcio0wEha9Zahh0=", + "dev": true + }, + "glob-parent": { + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "requires": { + "is-glob": "^4.0.1" + }, + "version": "5.1.1", + "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", + "dev": true + }, + "duplexer2": { + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "requires": { + "readable-stream": "^2.0.2" + }, + "version": "0.1.4", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true + }, + "number-is-nan": { + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "graceful-fs": { + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "version": "4.2.4", + "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=", + "dev": true + }, + "normalize-package-data": { + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "requires": { + "hosted-git-info": "^2.1.4", + "semver": "2 || 3 || 4 || 5", + "resolve": "^1.10.0", + "validate-npm-package-license": "^3.0.1" + }, + "version": "2.5.0", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", + "dev": true + }, + "@types/long": { + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "version": "4.0.1", + "integrity": "sha1-RZxl+hhn2v5qjzIsTFFpVmPMVek=", + "dev": true + }, + "to-regex-range": { + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "requires": { + "is-number": "^7.0.0" + }, + "version": "5.0.1", + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", + "dev": true + }, + "color-convert": { + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "requires": { + "color-name": "1.1.3" + }, + "version": "1.9.3", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dev": true + }, + "load-json-file": { + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "requires": { + "parse-json": "^2.2.0", + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "version": "2.0.0", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true + }, + "has": { + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "requires": { + "function-bind": "^1.1.1" + }, + "version": "1.0.3", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "dev": true + }, + "psl": { + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "version": "1.8.0", + "integrity": "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ=", + "dev": true + }, + "word-wrap": { + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "version": "1.2.3", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "jsprim": { + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "requires": { + "json-schema": "0.2.3", + "verror": "1.10.0", + "extsprintf": "1.3.0", + "assert-plus": "1.0.0" + }, + "version": "1.4.1", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true + }, + "chainsaw": { + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "requires": { + "traverse": ">=0.3.0 <0.4" + }, + "version": "0.1.0", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true + }, + "get-stream": { + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "requires": { + "pump": "^3.0.0" + }, + "version": "4.1.0", + "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", + "dev": true + }, + "assert-plus": { + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "@protobufjs/pool": { + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "dev": true + }, + "array.prototype.flat": { + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "requires": { + "es-abstract": "^1.17.0-next.1", + "define-properties": "^1.1.3" + }, + "version": "1.2.3", + "integrity": "sha1-DegrQmsDGNv9uUAInjiwQ9N/bHs=", + "dev": true + }, + "fs-extra": { + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "version": "9.1.0", + "dependencies": { + "jsonfile": { + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha1-mJZsuiFDeMjIS4LghZB7QL9hQXk=", + "dev": true, + "version": "6.0.1", + "dependencies": { + "universalify": { + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "dev": true + } + }, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + } + }, + "universalify": { + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + }, + "requires": { + "jsonfile": "^6.0.1", + "graceful-fs": "^4.2.0", + "at-least-node": "^1.0.0", + "universalify": "^2.0.0" + } + }, + "wrappy": { + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "@protobufjs/path": { + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "version": "1.1.2", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "dev": true + }, + "async": { + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "version": "1.5.2", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "is-fullwidth-code-point": { + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "requires": { + "number-is-nan": "^1.0.0" + }, + "version": "1.0.0", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" + }, + "extsprintf": { + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "version": "1.3.0", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "semver": { + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "version": "5.7.1", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=" + }, + "windows-release": { + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", + "requires": { + "execa": "^1.0.0" + }, + "version": "3.3.3", + "integrity": "sha1-HBACfHIldD7sa4nfFg1kwuApOZk=", + "dev": true + }, + "table": { + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", + "dev": true, + "version": "6.0.7", + "dependencies": { + "ansi-regex": { + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "version": "5.0.0", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "json-schema-traverse": { + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "ajv": { + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.4.tgz", + "requires": { + "uri-js": "^4.2.2", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "fast-deep-equal": "^3.1.1" + }, + "version": "7.0.4", + "integrity": "sha512-xzzzaqgEQfmuhbhAoqjJ8T/1okb6gAzXn/eQRNpAN1AEUoHJTNF9xCDRTtf/s3SKldtZfa+RJeTs+BQq+eZ/sw==", + "dev": true + }, + "string-width": { + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "requires": { + "strip-ansi": "^6.0.0", + "is-fullwidth-code-point": "^3.0.0", + "emoji-regex": "^8.0.0" + }, + "version": "4.2.0", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true + }, + "strip-ansi": { + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "requires": { + "ansi-regex": "^5.0.0" + }, + "version": "6.0.0", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true + }, + "is-fullwidth-code-point": { + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + } + }, + "requires": { + "string-width": "^4.2.0", + "slice-ansi": "^4.0.0", + "lodash": "^4.17.20", + "ajv": "^7.0.2" + } + }, + "fast-safe-stringify": { + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "version": "2.0.7", + "integrity": "sha1-EkqohYmSYfaK7bQqfAgN6dpgh0M=", + "dev": true + }, + "verror": { + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "requires": { + "core-util-is": "1.0.2", + "assert-plus": "^1.0.0", + "extsprintf": "^1.2.0" + }, + "version": "1.10.0", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true + }, + "flatted": { + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "version": "3.1.1", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "ignore": { + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "version": "4.0.6", + "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", + "dev": true + }, + "at-least-node": { + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-YCzUtG6EStTv/JKoARo8RuAjjcI=", + "dev": true + }, + "process-nextick-args": { + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "version": "2.0.1", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" + }, + "is-number": { + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "version": "7.0.0", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "dev": true + }, + "@types/klaw-sync": { + "resolved": "https://registry.npmjs.org/@types/klaw-sync/-/klaw-sync-6.0.0.tgz", + "requires": { + "@types/node": "*" + }, + "version": "6.0.0", + "integrity": "sha1-/ws2YB76qhCdUTxM7RCTEf0GujY=", + "dev": true + }, + "slash": { + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=", + "dev": true + }, + "buffer-shims": { + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "is-typedarray": { + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "fast-deep-equal": { + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "version": "3.1.3", + "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", + "dev": true + }, + "require-directory": { + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "version": "2.1.1", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "bl": { + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "version": "4.0.3", + "integrity": "sha1-EtYoetwpCA4ipwXldksqlSLNxIk=", + "dependencies": { + "readable-stream": { + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "version": "3.6.0", + "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=" + } + } + }, + "estraverse": { + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "version": "4.3.0", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "dev": true + }, + "prelude-ls": { + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "version": "1.2.1", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "is-binary-path": { + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "requires": { + "binary-extensions": "^2.0.0" + }, + "version": "2.1.0", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true + }, + "jsbn": { + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "version": "0.1.1", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "esquery": { + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha1-t4tYKKqOIU4p+3TE1bdS4cAz2lc=", + "dev": true, + "version": "1.3.1", + "dependencies": { + "estraverse": { + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "version": "5.2.0", + "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", + "dev": true + } + }, + "requires": { + "estraverse": "^5.1.0" + } + }, + "strip-json-comments": { + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "version": "2.0.1", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "@ungap/promise-all-settled": { + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "version": "1.1.2", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "get-caller-file": { + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "version": "2.0.5", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", + "dev": true + }, + "universal-user-agent": { + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.1.0.tgz", + "requires": { + "os-name": "^3.0.0" + }, + "version": "2.1.0", + "integrity": "sha1-Wr+8wDahukkMuUH4/WjEbTZp6OQ=", + "dev": true + }, + "js-tokens": { + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", + "dev": true + }, + "string_decoder": { + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "requires": { + "safe-buffer": "~5.1.0" + }, + "version": "1.1.1", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=" + }, + "fast-glob": { + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "requires": { + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "@nodelib/fs.stat": "^2.0.2", + "micromatch": "^4.0.2", + "@nodelib/fs.walk": "^1.2.3", + "picomatch": "^2.2.1" + }, + "version": "3.2.4", + "integrity": "sha1-0grvv5lXk4Pn88xmUpFYybmFVNM=", + "dev": true + }, + "mocha": { + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", + "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", + "dev": true, + "version": "8.2.1", + "dependencies": { + "y18n": { + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", + "dev": true + }, + "ansi-regex": { + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "version": "4.1.0", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "dev": true + }, + "find-up": { + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "version": "5.0.0", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true + }, + "has-flag": { + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "locate-path": { + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "requires": { + "p-locate": "^5.0.0" + }, + "version": "6.0.0", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true + }, + "supports-color": { + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "requires": { + "has-flag": "^4.0.0" + }, + "version": "7.2.0", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true + }, + "wrap-ansi": { + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "requires": { + "strip-ansi": "^5.0.0", + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0" + }, + "version": "5.1.0", + "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", + "dev": true + }, + "strip-json-comments": { + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "version": "3.1.1", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "p-try": { + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "version": "2.2.0", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "emoji-regex": { + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "version": "7.0.3", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "escape-string-regexp": { + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "p-locate": { + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "requires": { + "p-limit": "^3.0.2" + }, + "version": "5.0.0", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true + }, + "string-width": { + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "requires": { + "strip-ansi": "^5.1.0", + "is-fullwidth-code-point": "^2.0.0", + "emoji-regex": "^7.0.1" + }, + "version": "3.1.0", + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", + "dev": true + }, + "which": { + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "requires": { + "isexe": "^2.0.0" + }, + "version": "2.0.2", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true + }, + "path-exists": { + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "requires": { + "ms": "2.1.2" + }, + "version": "4.2.0", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true + }, + "cliui": { + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "requires": { + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0", + "string-width": "^3.1.0" + }, + "version": "5.0.0", + "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", + "dev": true + }, + "is-fullwidth-code-point": { + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "requires": { + "ansi-regex": "^4.1.0" + }, + "version": "5.2.0", + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", + "dev": true + }, + "p-limit": { + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "requires": { + "yocto-queue": "^0.1.0" + }, + "version": "3.1.0", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true + }, + "yargs": { + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=", + "dev": true, + "version": "13.3.2", + "dependencies": { + "locate-path": { + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "requires": { + "path-exists": "^3.0.0", + "p-locate": "^3.0.0" + }, + "version": "3.0.0", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true + }, + "find-up": { + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "requires": { + "locate-path": "^3.0.0" + }, + "version": "3.0.0", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true + }, + "p-locate": { + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "requires": { + "p-limit": "^2.0.0" + }, + "version": "3.0.0", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true + }, + "path-exists": { + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "p-limit": { + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "requires": { + "p-try": "^2.0.0" + }, + "version": "2.3.0", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true + } + }, + "requires": { + "which-module": "^2.0.0", + "find-up": "^3.0.0", + "y18n": "^4.0.0", + "get-caller-file": "^2.0.1", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "require-directory": "^2.1.1", + "cliui": "^5.0.0", + "require-main-filename": "^2.0.0", + "yargs-parser": "^13.1.2" + } + } + }, + "requires": { + "browser-stdout": "1.3.1", + "nanoid": "3.1.12", + "chokidar": "3.4.3", + "diff": "4.0.2", + "yargs-unparser": "2.0.0", + "yargs": "13.3.2", + "minimatch": "3.0.4", + "find-up": "5.0.0", + "wide-align": "1.1.3", + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "which": "2.0.2", + "log-symbols": "4.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "serialize-javascript": "5.0.1", + "js-yaml": "3.14.0", + "yargs-parser": "13.1.2", + "he": "1.2.0", + "workerpool": "6.0.2", + "supports-color": "7.2.0", + "strip-json-comments": "3.1.1", + "escape-string-regexp": "4.0.0", + "ms": "2.1.2", + "debug": "4.2.0" + } + }, + "json-stable-stringify-without-jsonify": { + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "doctrine": { + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "requires": { + "esutils": "^2.0.2" + }, + "version": "3.0.0", + "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", + "dev": true + }, + "is-arrayish": { + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "version": "0.2.1", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "yargs-unparser": { + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "version": "2.0.0", + "dependencies": { + "decamelize": { + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "camelcase": { + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "version": "6.2.0", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + } + }, + "requires": { + "flat": "^5.0.2", + "decamelize": "^4.0.0", + "is-plain-obj": "^2.1.0", + "camelcase": "^6.0.0" + } + }, + "yargs": { + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "requires": { + "os-locale": "^1.4.0", + "camelcase": "^2.0.1", + "y18n": "^3.2.0", + "window-size": "^0.1.4", + "string-width": "^1.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1" + }, + "version": "3.32.0", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true + }, + "noop-logger": { + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "version": "0.1.1", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + }, + "@protobufjs/inquire": { + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", + "dev": true + }, + "text-table": { + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "version": "0.2.0", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "comment-parser": { + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.1.tgz", + "version": "1.1.1", + "integrity": "sha512-vue7cRi1ZO5/72FJ+wZ5+siTSBlUv3ZksTk8bWD2IkaA6obitzMZP3yI65azTJLckwmi8lxfPP5Sd9oGuZ8e2g==", + "dev": true + }, + "performance-now": { + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "version": "2.1.0", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "bluebird": { + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "version": "3.4.7", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", + "dev": true + }, + "function-bind": { + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "version": "1.1.1", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "dev": true + }, + "vscode-textmate": { + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "version": "5.2.0", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, + "pkg-dir": { + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "requires": { + "find-up": "^2.1.0" + }, + "version": "2.0.0", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true + }, + "safe-buffer": { + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "version": "5.1.2", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "read-pkg": { + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "version": "2.0.0", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true + }, + "is-iojs": { + "resolved": "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=", + "dev": true + }, + "deep-extend": { + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "version": "0.6.0", + "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=" + }, + "he": { + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "version": "1.2.0", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "dev": true + }, + "object-assign": { + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "version": "4.1.1", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "path-is-absolute": { + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "typedoc-default-themes": { + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.7.tgz", + "version": "0.12.7", + "integrity": "sha512-0XAuGEqID+gon1+fhi4LycOEFM+5Mvm2PjwaiVZNAzU7pn3G2DEpsoXnFOPlLDnHY6ZW0BY0nO7ur9fHOFkBLQ==", + "dev": true + }, + "form-data": { + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "version": "2.3.3", + "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", + "dev": true + }, + "brace-expansion": { + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "version": "1.1.11", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true + }, + "@types/minimist": { + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "version": "1.2.1", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", + "dev": true + }, + "yocto-queue": { + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "version": "0.1.0", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "is-regex": { + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "requires": { + "has-symbols": "^1.0.1" + }, + "version": "1.1.1", + "integrity": "sha1-xvmKrMVG9s7FRooHt7FTq1ZKV7k=", + "dev": true + }, + "os-name": { + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "requires": { + "windows-release": "^3.1.0", + "macos-release": "^2.2.0" + }, + "version": "3.1.0", + "integrity": "sha1-3sGdlmKW4c1i1wGlpm7h3ernCAE=", + "dev": true + }, + "has-symbols": { + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", + "dev": true + }, + "ini": { + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "version": "1.3.8", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "mime-types": { + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "requires": { + "mime-db": "1.44.0" + }, + "version": "2.1.27", + "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=", + "dev": true + }, + "readdirp": { + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "requires": { + "picomatch": "^2.2.1" + }, + "version": "3.5.0", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true + }, + "lodash.pad": { + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "version": "4.5.1", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", + "dev": true + }, + "minipass": { + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "requires": { + "yallist": "^3.0.0", + "safe-buffer": "^5.1.2" + }, + "version": "2.9.0", + "integrity": "sha1-5xN2Ln0+Mv7YAxFc+T4EvKn8yaY=", + "dev": true + }, + "ansi": { + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "version": "0.3.1", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", + "dev": true + }, + "rimraf": { + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "requires": { + "glob": "^7.1.3" + }, + "version": "2.7.1", + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", + "dev": true + }, + "fsevents": { + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "optional": true, + "version": "2.1.3", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true + }, + "fast-json-stable-stringify": { + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "version": "2.1.0", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", + "dev": true + }, + "eslint-utils": { + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "version": "2.1.0", + "dependencies": { + "eslint-visitor-keys": { + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "version": "1.3.0", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + }, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "fill-range": { + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "requires": { + "to-regex-range": "^5.0.1" + }, + "version": "7.0.1", + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", + "dev": true + }, + "@protobufjs/utf8": { + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "dev": true + }, + "escape-string-regexp": { + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "version": "1.0.5", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "version": "4.0.1", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", + "dev": true + }, + "once": { + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "requires": { + "wrappy": "1" + }, + "version": "1.4.0", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" + } + }, "packages": { "": { - "name": "onnxruntime", - "version": "1.6.0", - "hasInstallScript": true, - "license": "MIT", - "os": [ - "win32", - "darwin", - "linux" - ], + "hasInstallScript": true, + "name": "onnxruntime", + "license": "MIT", + "version": "1.6.0", "dependencies": { "prebuild-install": "^6.0.0" - }, + }, "devDependencies": { - "@types/fs-extra": "^9.0.6", - "@types/klaw-sync": "^6.0.0", - "@types/minimist": "1.2.1", - "@types/mocha": "^8.2.0", - "@types/tar-stream": "^2.2.0", - "@typescript-eslint/eslint-plugin": "^4.14.2", - "@typescript-eslint/parser": "^4.14.2", - "clang-format": "^1.5.0", - "cmake-js": "^6.1.0", - "eslint": "^7.19.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-jsdoc": "^31.6.0", - "eslint-plugin-prefer-arrow": "^1.2.3", - "fs-extra": "^9.1.0", - "globby": "^11.0.2", - "jsonc": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.5", - "mocha": "^8.2.1", - "node-addon-api": "^3.1.0", - "node-pre-gyp-github": "^1.4.3", - "onnx-proto": "^4.0.4", - "tar-stream": "^2.2.0", - "typedoc": "^0.20.25", - "typescript": "^4.1.3" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha1-Fo2ho26Q2miujUnA8bSMfGJJITo=", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI=", - "dev": true - }, - "node_modules/@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha1-fRvf1ldTU4+r5sOFls23bZrGAUM=", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", - "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha1-Olgr21OATGum0UZXnEblITDPSjs=", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha1-NNxfTKu8cg9OYPdadH5+zWwXW9M=", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha1-ARuSAqcKY2bkNspcBlhEUoqwSXY=", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/rest": { - "version": "15.18.3", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-15.18.3.tgz", - "integrity": "sha1-/07Lt4TKKGxAzB1WirztptmbNvw=", - "dev": true, - "dependencies": { - "before-after-hook": "^1.1.0", - "btoa-lite": "^1.0.0", - "debug": "^3.1.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.0", - "lodash": "^4.17.4", - "node-fetch": "^2.1.1", - "universal-user-agent": "^2.0.0", - "url-template": "^2.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@octokit/rest/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", - "dev": true - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU=", - "dev": true - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha1-fvN/DQEPsCitGtWXIuUG2SYoFcs=", - "dev": true - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", - "dev": true - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "dev": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", - "dev": true - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", - "dev": true - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", - "dev": true - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", - "dev": true - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", - "dev": true - }, - "node_modules/@types/fs-extra": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.6.tgz", - "integrity": "sha512-ecNRHw4clCkowNOBJH1e77nvbPxHYnWIXMv1IAoG/9+MYGkgoyr3Ppxr7XYFNL41V422EDhyV4/4SSK8L2mlig==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "node_modules/@types/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha1-/ws2YB76qhCdUTxM7RCTEf0GujY=", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha1-RZxl+hhn2v5qjzIsTFFpVmPMVek=", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz", - "integrity": "sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.11.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz", - "integrity": "sha1-/iAS8jVeTOCLykSus6u7Ic+I0z8=", - "dev": true - }, - "node_modules/@types/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-sRTpT180sVigzD4SiCWJQQrqcdkWnmscWvx+cXvAoPtXbLFC5+QmKi2xwRcPe4iRu0GcVl1qTeJKUTS5hULfrw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.14.2.tgz", - "integrity": "sha512-uMGfG7GFYK/nYutK/iqYJv6K/Xuog/vrRRZX9aEP4Zv1jsYXuvFUMDFLhUnc8WFv3D2R5QhNQL3VYKmvLS5zsQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "4.14.2", - "@typescript-eslint/scope-manager": "4.14.2", - "debug": "^4.1.1", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.14.2.tgz", - "integrity": "sha512-mV9pmET4C2y2WlyHmD+Iun8SAEqkLahHGBkGqDVslHkmoj3VnxnGP4ANlwuxxfq1BsKdl/MPieDbohCEQgKrwA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.14.2", - "@typescript-eslint/types": "4.14.2", - "@typescript-eslint/typescript-estree": "4.14.2", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.14.2.tgz", - "integrity": "sha512-ipqSP6EuUsMu3E10EZIApOJgWSpcNXeKZaFeNKQyzqxnQl8eQCbV+TSNsl+s2GViX2d18m1rq3CWgnpOxDPgHg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "4.14.2", - "@typescript-eslint/types": "4.14.2", - "@typescript-eslint/typescript-estree": "4.14.2", - "debug": "^4.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.14.2.tgz", - "integrity": "sha512-cuV9wMrzKm6yIuV48aTPfIeqErt5xceTheAgk70N1V4/2Ecj+fhl34iro/vIssJlb7XtzcaD07hWk7Jk0nKghg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.14.2", - "@typescript-eslint/visitor-keys": "4.14.2" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.14.2.tgz", - "integrity": "sha512-LltxawRW6wXy4Gck6ZKlBD05tCHQUj4KLn4iR69IyRiDHX3d3NCAhO+ix5OR2Q+q9bjCrHE/HKt+riZkd1At8Q==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.14.2.tgz", - "integrity": "sha512-ESiFl8afXxt1dNj8ENEZT12p+jl9PqRur+Y19m0Z/SPikGL6rqq4e7Me60SU9a2M28uz48/8yct97VQYaGl0Vg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.14.2", - "@typescript-eslint/visitor-keys": "4.14.2", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.14.2.tgz", - "integrity": "sha512-KBB+xLBxnBdTENs/rUgeUKO0UkPBRs2vD09oMRRIkj5BEN8PX1ToXV532desXfpQnZsYTyLLviS7JrPhdL154w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.14.2", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha1-gWXwHENgCbzK0LHRIvBe13Dvxu4=", - "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, + "typedoc": "^0.20.25", + "mocha": "^8.2.1", + "@types/fs-extra": "^9.0.6", + "@types/tar-stream": "^2.2.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.5", + "@typescript-eslint/parser": "^4.14.2", + "clang-format": "^1.5.0", + "@types/klaw-sync": "^6.0.0", + "node-addon-api": "^3.1.0", + "cmake-js": "^6.1.0", + "eslint-plugin-prefer-arrow": "^1.2.3", + "typescript": "^4.1.3", + "jsonc": "^2.0.0", + "@types/mocha": "^8.2.0", + "node-pre-gyp-github": "^1.4.3", + "@typescript-eslint/eslint-plugin": "^4.14.2", + "eslint-plugin-jsdoc": "^31.6.0", + "onnx-proto": "^4.0.4", + "globby": "^11.0.2", + "fs-extra": "^9.1.0", + "eslint": "^7.19.0", + "tar-stream": "^2.2.0", + "@types/minimist": "1.2.1", + "eslint-plugin-import": "^2.22.1" + }, + "os": [ + "win32", + "darwin", + "linux" + ] + }, "node_modules/ansi": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "version": "0.3.1", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", "dev": true - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=" - }, - "node_modules/are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha1-SzXClE8GKov82mZBB2A1D+nd/CE=", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha1-zdZ+aFK9+cEhVGB4ZzIlXtJFk0g=", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha1-DegrQmsDGNv9uUAInjiwQ9N/bHs=", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "engines": { - "node": ">= 0.4" - } - }, + }, "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", - "dev": true, + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "dependencies": { "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + }, + "version": "0.2.4", + "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha1-YCzUtG6EStTv/JKoARo8RuAjjcI=", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha1-4eguTz6Zniz9YbFhKA0WoRH4ZCg=", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/before-after-hook": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.4.0.tgz", - "integrity": "sha1-K2vyPcpPMuYo/SdHwQo3x0pLSE0=", - "dev": true - }, - "node_modules/big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha1-j9iL0WMsukocjD49cVnwi7lbS54=", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha1-EtYoetwpCA4ipwXldksqlSLNxIk=", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", - "dev": true - }, - "node_modules/btoa-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", - "dev": true - }, - "node_modules/buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha1-oxdJ3H2B2E2wir+Te2uMQDP2J4Y=", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha1-0nMhNcWZnGSyd/z5savjSYJUcpw=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "dev": true, - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dev": true, - "dependencies": { - "traverse": ">=0.3.0 <0.4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=" - }, - "node_modules/clang-format": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.5.0.tgz", - "integrity": "sha512-C1LucFX7E+ABVYcPEbBHM4PYQ2+WInXsqsLpFlQ9cmRfSbk7A7b1I06h/nE4bQ3MsyEkb31jY2gC0Dtc76b4IA==", - "dev": true, - "dependencies": { - "async": "^1.5.2", - "glob": "^7.0.0", - "resolve": "^1.1.6" - }, + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", "bin": { - "check-clang-format": "bin/check-clang-format.js", - "clang-format": "index.js", - "git-clang-format": "bin/git-clang-format" - } - }, - "node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, + "semver": "bin/semver.js" + }, + "version": "7.3.4", + "engines": { + "node": ">=10" + }, + "dev": true, "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/cmake-js": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-6.1.0.tgz", - "integrity": "sha1-vsc4G1jUVKzuCdT7AEcVOgBQY6Y=", - "dev": true, + "lru-cache": "^6.0.0" + }, + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==" + }, + "node_modules/flat-cache": { + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "version": "3.0.4", + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "dev": true, "dependencies": { - "debug": "^4", - "fs-extra": "^5.0.0", - "is-iojs": "^1.0.1", - "lodash": "^4", - "memory-stream": "0", - "npmlog": "^1.2.0", - "rc": "^1.2.7", - "request": "^2.54.0", - "semver": "^5.0.3", - "splitargs": "0", - "tar": "^4", - "unzipper": "^0.8.13", - "url-join": "0", - "which": "^1.0.9", - "yargs": "^3.6.0" - }, + "rimraf": "^3.0.2", + "flatted": "^3.1.0" + }, + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" + }, + "node_modules/mocha/node_modules/y18n": { + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", + "dev": true + }, + "node_modules/tar-fs": { + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "version": "2.1.0", + "integrity": "sha1-0c3RIatGXuDrnM3i01BJ0/Pa8NU=", + "dependencies": { + "tar-stream": "^2.0.0", + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0" + } + }, + "node_modules/util-deprecate": { + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/node-fetch": { + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "version": "2.6.1", + "integrity": "sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI=", + "engines": { + "node": "4.x || >=6.0.0" + }, + "dev": true + }, + "node_modules/signal-exit": { + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "version": "3.0.3", + "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=" + }, + "node_modules/eslint/node_modules/strip-ansi": { + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "version": "6.0.0", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==" + }, + "node_modules/semver": { + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "bin": { - "cmake-js": "bin/cmake-js" - }, + "semver": "bin/semver" + }, + "version": "5.7.1", + "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=" + }, + "node_modules/jsonc/node_modules/strip-json-comments": { + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "version": "3.1.1", + "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/cmake-js/node_modules/are-we-there-yet": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", - "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.0 || ^1.1.13" - } - }, - "node_modules/cmake-js/node_modules/fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/cmake-js/node_modules/gauge": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", - "dev": true, - "dependencies": { - "ansi": "^0.3.0", - "has-unicode": "^2.0.0", - "lodash.pad": "^4.1.0", - "lodash.padend": "^4.1.0", - "lodash.padstart": "^4.1.0" - } - }, - "node_modules/cmake-js/node_modules/npmlog": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", - "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", - "dev": true, - "dependencies": { - "ansi": "~0.3.0", - "are-we-there-yet": "~1.0.0", - "gauge": "~1.2.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "node": ">=8" + }, + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, + "node": ">=8" + }, + "dev": true + }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "version": "1.1.3", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", - "dev": true, + }, + "node_modules/unzipper/node_modules/readable-stream": { + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "core-util-is": "~1.0.0", + "string_decoder": "~0.10.x", + "process-nextick-args": "~1.0.6", + "util-deprecate": "~1.0.1", + "buffer-shims": "^1.0.0" + }, + "version": "2.1.5", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", "dev": true - }, - "node_modules/comment-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.1.tgz", - "integrity": "sha512-vue7cRi1ZO5/72FJ+wZ5+siTSBlUv3ZksTk8bWD2IkaA6obitzMZP3yI65azTJLckwmi8lxfPP5Sd9oGuZ8e2g==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "node_modules/contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha1-QUAjzHowLaJc4uyC0NUjjMr9iYY=", - "dependencies": { - "mimic-response": "^2.0.0" - }, + }, + "node_modules/mocha/node_modules/has-flag": { + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" + }, + "dev": true + }, + "node_modules/is-negative-zero": { + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "engines": { + "node": ">= 0.4" + }, + "dev": true + }, + "node_modules/is-fullwidth-code-point": { + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "engines": { + "node": ">=0.10.0" + }, + "dependencies": { + "number-is-nan": "^1.0.0" } - }, + }, + "node_modules/traverse": { + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "version": "0.3.9", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true + }, + "node_modules/js-tokens": { + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", + "dev": true + }, + "node_modules/isarray": { + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/concat-map": { + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "version": "0.0.1", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/@eslint/eslintrc": { + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", + "version": "0.3.0", + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "minimatch": "^3.0.4", + "lodash": "^4.17.20", + "strip-json-comments": "^3.1.1", + "ajv": "^6.12.4", + "ignore": "^4.0.6", + "js-yaml": "^3.13.1", + "globals": "^12.1.0", + "debug": "^4.1.1", + "espree": "^7.3.0" + }, + "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==" + }, "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "version": "0.6.0", + "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=", "engines": { "node": ">=4.0.0" } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + }, + "node_modules/napi-build-utils": { + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-sf3cCyxG44Cgt6dvmE3UfEGhOAY=" + }, + "node_modules/eslint-plugin-prefer-arrow": { + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "peerDependencies": { + "eslint": ">=2.0.0" + }, + "version": "1.2.3", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", "dev": true - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", - "dev": true, + }, + "node_modules/@nodelib/fs.walk": { + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "version": "1.2.4", + "engines": { + "node": ">= 8" + }, + "dev": true, "dependencies": { - "object-keys": "^1.0.12" - }, + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + }, + "integrity": "sha1-ARuSAqcKY2bkNspcBlhEUoqwSXY=" + }, + "node_modules/ansi-regex": { + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "version": "2.1.1", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, + }, + "node_modules/json-stringify-safe": { + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "version": "5.0.1", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/parent-module": { + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "version": "1.0.1", "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "node": ">=6" + }, + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=" + }, + "node_modules/bcrypt-pbkdf": { + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "dependencies": { + "tweetnacl": "^0.14.3" + }, + "version": "1.0.2", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true + }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "semver": "bin/semver.js" + }, + "version": "7.3.4", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==" + }, + "node_modules/noop-logger": { + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "version": "0.1.1", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + }, + "node_modules/is-glob": { + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "version": "4.0.1", + "engines": { + "node": ">=0.10.0" + }, + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=" + }, + "node_modules/estraverse": { + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "version": "4.3.0", + "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", + "engines": { + "node": ">=4.0" + }, + "dev": true + }, + "node_modules/path-parse": { + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "version": "1.0.6", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", + "dev": true + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dependencies": { + "ms": "2.0.0" + }, + "version": "2.6.9", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true + }, + "node_modules/table/node_modules/ansi-regex": { + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "version": "5.0.0", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/npm-run-path": { + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "version": "2.0.2", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=" + }, + "node_modules/anymatch": { + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "version": "3.1.1", + "engines": { + "node": ">= 8" + }, + "dev": true, + "dependencies": { + "picomatch": "^2.0.4", + "normalize-path": "^3.0.0" + }, + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==" + }, + "node_modules/strip-ansi": { + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "version": "3.0.1", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "engines": { + "node": ">=0.10.0" + }, + "dependencies": { + "ansi-regex": "^2.0.0" + } + }, + "node_modules/esquery": { + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "version": "1.3.1", "engines": { "node": ">=0.10" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=", - "dev": true, + }, + "dev": true, "dependencies": { - "path-type": "^4.0.0" - }, + "estraverse": "^5.1.0" + }, + "integrity": "sha1-t4tYKKqOIU4p+3TE1bdS4cAz2lc=" + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { "node": ">=8" - } - }, - "node_modules/dir-glob/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", - "dev": true, + }, + "dev": true + }, + "node_modules/ms": { + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "version": "2.1.2", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", + "dev": true + }, + "node_modules/table/node_modules/string-width": { + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "version": "4.2.0", "engines": { "node": ">=8" - } - }, + }, + "dev": true, + "dependencies": { + "strip-ansi": "^6.0.0", + "is-fullwidth-code-point": "^3.0.0", + "emoji-regex": "^8.0.0" + }, + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==" + }, + "node_modules/regexpp": { + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "version": "3.1.0", + "integrity": "sha1-IG0K0KVkjP+9uK5GQ489xRyfeOI=", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/table": { + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "version": "6.0.7", + "engines": { + "node": ">=10.0.0" + }, + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "slice-ansi": "^4.0.0", + "lodash": "^4.17.20", + "ajv": "^7.0.2" + }, + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==" + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/flat-cache/node_modules/rimraf": { + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "version": "3.0.2", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" + }, + "node_modules/base64-js": { + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "version": "1.3.1", + "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=" + }, + "node_modules/@nodelib/fs.scandir": { + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "version": "2.1.3", + "engines": { + "node": ">= 8" + }, + "dev": true, + "dependencies": { + "run-parallel": "^1.1.9", + "@nodelib/fs.stat": "2.0.3" + }, + "integrity": "sha1-Olgr21OATGum0UZXnEblITDPSjs=" + }, + "node_modules/object-keys": { + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "version": "1.1.1", + "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", + "engines": { + "node": ">= 0.4" + }, + "dev": true + }, + "node_modules/console-control-strings": { + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "node_modules/fast-safe-stringify": { + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "version": "2.0.7", + "integrity": "sha1-EkqohYmSYfaK7bQqfAgN6dpgh0M=", + "dev": true + }, + "node_modules/is-number": { + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "version": "7.0.0", + "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", + "engines": { + "node": ">=0.12.0" + }, + "dev": true + }, + "node_modules/eslint-utils": { + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "version": "2.1.0", + "engines": { + "node": ">=6" + }, + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==" + }, + "node_modules/levn": { + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "version": "0.4.1", + "engines": { + "node": ">= 0.8.0" + }, + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" + }, + "node_modules/inflight": { + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "dependencies": { + "wrappy": "1", + "once": "^1.3.0" + }, + "version": "1.0.6", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true + }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "version": "3.0.0", "engines": { "node": ">=6.0.0" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, + }, + "dev": true, "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, + "esutils": "^2.0.2" + }, + "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=" + }, + "node_modules/randombytes": { + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "safe-buffer": "^5.1.0" + }, + "version": "2.1.0", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true - }, + }, + "node_modules/jsprim": { + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "version": "1.4.1", + "engines": [ + "node >=0.6.0" + ], + "dev": true, + "dependencies": { + "json-schema": "0.2.3", + "verror": "1.10.0", + "extsprintf": "1.3.0", + "assert-plus": "1.0.0" + }, + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=" + }, + "node_modules/memory-stream/node_modules/string_decoder": { + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "version": "0.10.31", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/chalk": { + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "version": "2.4.2", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "supports-color": "^5.3.0", + "escape-string-regexp": "^1.0.5", + "ansi-styles": "^3.2.1" + }, + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=" + }, + "node_modules/os-locale": { + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "version": "1.4.0", + "engines": { + "node": ">=0.10.0" + }, + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=" + }, + "node_modules/supports-color": { + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "version": "5.5.0", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=" + }, + "node_modules/yallist": { + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "version": "3.1.1", + "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "dependencies": { + "spdx-license-ids": "^3.0.0", + "spdx-exceptions": "^2.1.0" + }, + "version": "3.0.1", + "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", + "dev": true + }, + "node_modules/code-point-at": { + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/graceful-fs": { + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "version": "4.2.4", + "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=", + "dev": true + }, + "node_modules/get-stream": { + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "version": "4.1.0", + "engines": { + "node": ">=6" + }, + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=" + }, + "node_modules/shebang-regex": { + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/hosted-git-info": { + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "version": "2.8.8", + "integrity": "sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg=", + "dev": true + }, + "node_modules/string-width": { + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "engines": { + "node": ">=0.10.0" + }, + "dependencies": { + "strip-ansi": "^3.0.0", + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "dependencies": { + "safer-buffer": "^2.1.0", + "jsbn": "~0.1.0" + }, + "version": "0.1.2", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true + }, + "node_modules/readdirp": { + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "version": "3.5.0", + "engines": { + "node": ">=8.10.0" + }, + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==" + }, + "node_modules/path-type": { + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "version": "2.0.0", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=" + }, + "node_modules/type-fest": { + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "version": "0.8.1", + "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/is-extglob": { + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "version": "2.1.1", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/expand-template": { + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "version": "2.0.3", + "integrity": "sha1-bhSz/O4POmNA7LV9LokYaSBSpHw=", + "engines": { + "node": ">=6" + } + }, + "node_modules/growl": { + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "version": "1.10.5", + "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", + "engines": { + "node": ">=4.x" + }, + "dev": true + }, + "node_modules/@babel/highlight": { + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "version": "7.10.4", + "integrity": "sha1-fRvf1ldTU4+r5sOFls23bZrGAUM=", + "dev": true + }, + "node_modules/text-table": { + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "version": "0.2.0", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/mkdirp-classic": { + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "version": "0.5.3", + "integrity": "sha1-+hDJEVzG2IZb4iG6R+6b7XhgERM=" + }, + "node_modules/is-regex": { + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "version": "1.1.1", + "engines": { + "node": ">= 0.4" + }, + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "integrity": "sha1-xvmKrMVG9s7FRooHt7FTq1ZKV7k=" + }, + "node_modules/he": { + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "bin": { + "he": "bin/he" + }, + "version": "1.2.0", + "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", + "dev": true + }, + "node_modules/mocha/node_modules/strip-json-comments": { + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "engines": { + "node": ">=8" + }, + "dev": true, + "version": "3.1.1", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "node_modules/performance-now": { + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "version": "2.1.0", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/fs.realpath": { + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/minizlib": { + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "dependencies": { + "minipass": "^2.9.0" + }, + "version": "1.3.3", + "integrity": "sha1-IpDeloGKNMKVUcio0wEha9Zahh0=", + "dev": true + }, + "node_modules/eslint-plugin-jsdoc": { + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-31.6.0.tgz", + "version": "31.6.0", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "regextras": "^0.7.1", + "lodash": "^4.17.20", + "comment-parser": "1.1.1", + "semver": "^7.3.4", + "jsdoctypeparser": "^9.0.0", + "debug": "^4.3.1", + "spdx-expression-parse": "^3.0.1" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0" + }, + "integrity": "sha512-kYhdW+BXHij9n12oHvAC27oDHKEFITz1YJP/C0NPtb+gsGJWxejh5B6dEmmj6oLYOsmNvuCVkdIcqYOyabP2QA==" + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + }, + "version": "4.3.0", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + }, + "node_modules/number-is-nan": { + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-license-ids": { + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "version": "3.0.6", + "integrity": "sha1-yAdXODwoq/cpZ0SZjLwQaui4VM4=", + "dev": true + }, + "node_modules/@typescript-eslint/types": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.14.2.tgz", + "funding": { + "url": "https://opencollective.com/typescript-eslint", + "type": "opencollective" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "dev": true, + "version": "4.14.2", + "integrity": "sha512-LltxawRW6wXy4Gck6ZKlBD05tCHQUj4KLn4iR69IyRiDHX3d3NCAhO+ix5OR2Q+q9bjCrHE/HKt+riZkd1At8Q==" + }, + "node_modules/vscode-textmate": { + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "version": "5.2.0", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, + "node_modules/simple-concat": { + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-9Gl2CCujXCJj8cirXt/ibEHJVS8=" + }, + "node_modules/protobufjs/node_modules/@types/node": { + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.25.tgz", + "version": "13.13.25", + "integrity": "sha1-do1nErFQmadEgSqSuE/96PThPPE=", + "dev": true + }, + "node_modules/pump": { + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/marked": { + "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.0.tgz", + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 8.16.2" + }, + "dev": true, + "version": "2.0.0", + "integrity": "sha512-NqRSh2+LlN2NInpqTQnS614Y/3NkVMFFU6sJlRFEpxJ/LHuK/qJECH7/fXZjk4VZstPW/Pevjil/VtSONsLc7Q==" + }, + "node_modules/log-symbols": { + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "version": "4.0.0", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "chalk": "^4.0.0" + }, + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==" + }, + "node_modules/camelcase": { + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "version": "2.1.1", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "engines": { + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/reusify": { + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "version": "1.0.4", + "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=", + "engines": { + "node": ">=0.10.0", + "iojs": ">=1.0.0" + }, + "dev": true + }, + "node_modules/fs-extra/node_modules/universalify": { + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + }, + "dev": true + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "dependencies": { + "ms": "^2.1.1" + }, + "version": "3.2.6", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true + }, + "node_modules/ieee754": { + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "version": "1.1.13", + "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" + }, + "node_modules/brace-expansion": { + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + }, + "version": "1.1.11", + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "dev": true + }, + "node_modules/fast-glob": { + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "version": "3.2.4", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "@nodelib/fs.stat": "^2.0.2", + "micromatch": "^4.0.2", + "@nodelib/fs.walk": "^1.2.3", + "picomatch": "^2.2.1" + }, + "integrity": "sha1-0grvv5lXk4Pn88xmUpFYybmFVNM=" + }, + "node_modules/os-name": { + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "version": "3.1.0", + "engines": { + "node": ">=6" + }, + "dev": true, + "dependencies": { + "windows-release": "^3.1.0", + "macos-release": "^2.2.0" + }, + "integrity": "sha1-3sGdlmKW4c1i1wGlpm7h3ernCAE=" + }, + "node_modules/mocha/node_modules/locate-path": { + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "version": "6.0.0", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" + }, + "node_modules/fstream": { + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "version": "1.0.12", + "engines": { + "node": ">=0.6" + }, + "dev": true, + "dependencies": { + "inherits": "~2.0.0", + "graceful-fs": "^4.1.2", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "integrity": "sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU=" + }, + "node_modules/shiki": { + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.2.tgz", + "dependencies": { + "vscode-textmate": "^5.2.0", + "onigasm": "^2.2.5" + }, + "version": "0.9.2", + "integrity": "sha512-BjUCxVbxMnvjs8jC4b+BQ808vwjJ9Q8NtLqPwXShZ307HdXiDFYP968ORSVfaTNNSWYDBYdMnVKJ0fYNsoZUBA==", + "dev": true + }, + "node_modules/gauge": { + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "version": "2.7.4", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dependencies": { + "object-assign": "^4.1.0", + "console-control-strings": "^1.0.0", + "wide-align": "^1.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "has-unicode": "^2.0.0", + "aproba": "^1.0.3" + } + }, + "node_modules/is-plain-obj": { + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "version": "2.1.0", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/error-ex": { + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "dependencies": { + "is-arrayish": "^0.2.1" + }, + "version": "1.3.2", + "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", + "dev": true + }, + "node_modules/chownr": { + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "version": "1.1.4", + "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=" + }, + "node_modules/combined-stream": { + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "version": "1.0.8", + "engines": { + "node": ">= 0.8" + }, + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=" + }, + "node_modules/form-data": { + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "version": "2.3.3", + "engines": { + "node": ">= 0.12" + }, + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=" + }, + "node_modules/eslint-module-utils": { + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "version": "2.6.0", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "integrity": "sha1-V569CU9Wr3eX0ZyYZsnJSGYpv6Y=" + }, + "node_modules/which-pm-runs": { + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" + }, + "node_modules/nice-try": { + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "version": "1.0.5", + "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", + "dev": true + }, + "node_modules/shebang-command": { + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "version": "1.2.0", + "engines": { + "node": ">=0.10.0" + }, + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=" + }, + "node_modules/array.prototype.flat": { + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "version": "1.2.3", + "engines": { + "node": ">= 0.4" + }, + "dev": true, + "dependencies": { + "es-abstract": "^1.17.0-next.1", + "define-properties": "^1.1.3" + }, + "integrity": "sha1-DegrQmsDGNv9uUAInjiwQ9N/bHs=" + }, + "node_modules/eslint/node_modules/color-name": { + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "version": "1.1.4", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@types/json-schema": { + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "version": "7.0.7", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "dev": true + }, + "node_modules/inherits": { + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "version": "2.0.4", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" + }, + "node_modules/fs-extra/node_modules/jsonfile/node_modules/universalify": { + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "engines": { + "node": ">= 10.0.0" + }, + "dev": true + }, + "node_modules/function-bind": { + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "version": "1.1.1", + "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", + "dev": true + }, + "node_modules/slice-ansi": { + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + }, + "version": "4.0.0", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^3.0.0", + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0" + }, + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==" + }, + "node_modules/escape-string-regexp": { + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "version": "1.0.5", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + }, + "dev": true + }, + "node_modules/simple-get": { + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "version": "3.1.0", + "integrity": "sha1-tFvgYkNeUNFZVAtXYgLO7EC5xrM=", + "dependencies": { + "decompress-response": "^4.2.0", + "simple-concat": "^1.0.0", + "once": "^1.3.1" + } + }, + "node_modules/eslint-import-resolver-node": { + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "version": "0.3.4", + "integrity": "sha1-hf+oGULCUBLYIxCW3fZ5wDBCxxc=", + "dev": true + }, + "node_modules/path-key": { + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "version": "2.0.1", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + }, + "dev": true + }, + "node_modules/lodash.padend": { + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "version": "4.6.1", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", + "dev": true + }, + "node_modules/es-abstract": { + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "version": "1.17.7", + "engines": { + "node": ">= 0.4" + }, + "dev": true, + "dependencies": { + "is-callable": "^1.2.2", + "object.assign": "^4.1.1", + "object-inspect": "^1.8.0", + "is-regex": "^1.1.1", + "has-symbols": "^1.0.1", + "es-to-primitive": "^1.2.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "object-keys": "^1.1.1" + }, + "integrity": "sha1-pN5hsvZpifx0IWdsHLl4dXOs5Uw=" + }, + "node_modules/dir-glob": { + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "version": "3.0.1", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=" + }, + "node_modules/fast-json-stable-stringify": { + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "version": "2.1.0", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", + "dev": true + }, + "node_modules/are-we-there-yet": { + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "version": "1.1.5", + "integrity": "sha1-SzXClE8GKov82mZBB2A1D+nd/CE=", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/diff": { + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "version": "4.0.2", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + }, + "dev": true + }, + "node_modules/optionator": { + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "version": "0.9.1", + "engines": { + "node": ">= 0.8.0" + }, + "dev": true, + "dependencies": { + "type-check": "^0.4.0", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "word-wrap": "^1.2.3", + "prelude-ls": "^1.2.1", + "levn": "^0.4.1" + }, + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==" + }, + "node_modules/color-convert": { + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "dependencies": { + "color-name": "1.1.3" + }, + "version": "1.9.3", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dev": true + }, + "node_modules/glob": { + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "version": "7.1.6", + "engines": { + "node": "*" + }, + "dev": true, + "dependencies": { + "inherits": "2", + "minimatch": "^3.0.4", + "inflight": "^1.0.4", + "fs.realpath": "^1.0.0", + "path-is-absolute": "^1.0.0", + "once": "^1.3.0" + }, + "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=" + }, + "node_modules/eslint/node_modules/color-convert": { + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "version": "2.0.1", + "engines": { + "node": ">=7.0.0" + }, + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + }, + "node_modules/cmake-js/node_modules/npmlog": { + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "dependencies": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + }, + "version": "1.2.1", + "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", + "dev": true + }, + "node_modules/cmake-js/node_modules/fs-extra": { + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "dependencies": { + "jsonfile": "^4.0.0", + "graceful-fs": "^4.1.2", + "universalify": "^0.1.0" + }, + "version": "5.0.0", + "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=", + "dev": true + }, + "node_modules/find-up": { + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "version": "2.1.0", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" + }, + "node_modules/mocha/node_modules/p-try": { + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "version": "2.2.0", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + }, + "dev": true + }, + "node_modules/eslint-visitor-keys": { + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "engines": { + "node": ">=10" + }, + "dev": true + }, + "node_modules/@types/long": { + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "version": "4.0.1", + "integrity": "sha1-RZxl+hhn2v5qjzIsTFFpVmPMVek=", + "dev": true + }, + "node_modules/fs-constants": { + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0=" + }, + "node_modules/cmake-js/node_modules/are-we-there-yet": { + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" + }, + "version": "1.0.6", + "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", + "dev": true + }, + "node_modules/lodash": { + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "version": "4.17.20", + "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=", + "dev": true + }, + "node_modules/es6-promisify": { + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "dependencies": { + "es6-promise": "^4.0.3" + }, + "version": "5.0.0", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true + }, + "node_modules/delegates": { + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/oauth-sign": { + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "version": "0.9.0", + "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", + "engines": { + "node": "*" + }, + "dev": true + }, + "node_modules/dashdash": { + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "version": "1.14.1", + "engines": { + "node": ">=0.10" + }, + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=" + }, + "node_modules/is-binary-path": { + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "version": "2.1.0", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" + }, + "node_modules/has": { + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "version": "1.0.3", + "engines": { + "node": ">= 0.4.0" + }, + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=" + }, + "node_modules/eslint/node_modules/chalk": { + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + }, + "version": "4.1.0", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "supports-color": "^7.1.0", + "ansi-styles": "^4.1.0" + }, + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==" + }, + "node_modules/yargs-parser": { + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "dependencies": { + "decamelize": "^1.2.0", + "camelcase": "^5.0.0" + }, + "version": "13.1.2", + "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=", + "dev": true + }, + "node_modules/@typescript-eslint/parser": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.14.2.tgz", + "funding": { + "url": "https://opencollective.com/typescript-eslint", + "type": "opencollective" + }, + "version": "4.14.2", + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "dev": true, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + }, + "dependencies": { + "debug": "^4.1.1", + "@typescript-eslint/scope-manager": "4.14.2", + "@typescript-eslint/typescript-estree": "4.14.2", + "@typescript-eslint/types": "4.14.2" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "integrity": "sha512-ipqSP6EuUsMu3E10EZIApOJgWSpcNXeKZaFeNKQyzqxnQl8eQCbV+TSNsl+s2GViX2d18m1rq3CWgnpOxDPgHg==" + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "version": "5.3.1", + "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", + "engines": { + "node": ">=6" + }, + "dev": true + }, + "node_modules/locate-path": { + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "version": "2.0.0", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "path-exists": "^3.0.0", + "p-locate": "^2.0.0" + }, + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=" + }, + "node_modules/browser-stdout": { + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "version": "1.3.1", + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", + "dev": true + }, + "node_modules/extsprintf": { + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "version": "1.3.0", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ], + "dev": true + }, + "node_modules/binary": { + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "dependencies": { + "chainsaw": "~0.1.0", + "buffers": "~0.1.1" + }, + "version": "0.3.0", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dev": true + }, + "node_modules/log-symbols/node_modules/color-name": { + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "version": "1.1.4", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/unzipper": { + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", + "dependencies": { + "listenercount": "~1.0.1", + "binary": "~0.3.0", + "duplexer2": "~0.1.4", + "big-integer": "^1.6.17", + "fstream": "~1.0.10", + "setimmediate": "~1.0.4", + "readable-stream": "~2.1.5", + "buffer-indexof-polyfill": "~1.0.0", + "bluebird": "~3.4.1" + }, + "version": "0.8.14", + "integrity": "sha1-reBSTNL8FNEbjeJYviL50kfT95s=", + "dev": true + }, + "node_modules/@protobufjs/codegen": { + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "version": "2.0.4", + "integrity": "sha1-fvN/DQEPsCitGtWXIuUG2SYoFcs=", + "dev": true + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + }, + "version": "4.3.0", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + }, + "node_modules/fast-deep-equal": { + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "version": "3.1.3", + "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", + "dev": true + }, + "node_modules/mocha/node_modules/strip-ansi": { + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "version": "5.2.0", + "engines": { + "node": ">=6" + }, + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=" + }, + "node_modules/tsconfig-paths": { + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "dependencies": { + "json5": "^1.0.1", + "strip-bom": "^3.0.0", + "@types/json5": "^0.0.29", + "minimist": "^1.2.0" + }, + "version": "3.9.0", + "integrity": "sha1-CYVHpsREiAfo/Ljq4IEGTumjyQs=", + "dev": true + }, + "node_modules/decamelize": { + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "version": "1.2.0", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/eslint-scope": { + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "version": "5.1.1", + "engines": { + "node": ">=8.0.0" + }, + "dev": true, + "dependencies": { + "estraverse": "^4.1.1", + "esrecurse": "^4.3.0" + }, + "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=" + }, + "node_modules/yargs": { + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "dependencies": { + "os-locale": "^1.4.0", + "camelcase": "^2.0.1", + "y18n": "^3.2.0", + "window-size": "^0.1.4", + "string-width": "^1.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1" + }, + "version": "3.32.0", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true + }, + "node_modules/typedoc": { + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.25.tgz", + "bin": { + "typedoc": "bin/typedoc" + }, + "version": "0.20.25", + "engines": { + "node": ">= 10.8.0" + }, + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "shiki": "^0.9.2", + "lodash": "^4.17.20", + "handlebars": "^4.7.6", + "minimatch": "^3.0.0", + "marked": "^2.0.0", + "typedoc-default-themes": "^0.12.7", + "fs-extra": "^9.1.0", + "colors": "^1.4.0", + "progress": "^2.0.3", + "shelljs": "^0.8.4" + }, + "peerDependencies": { + "typescript": "3.9.x || 4.0.x || 4.1.x" + }, + "integrity": "sha512-ZQZnjJPrt0rjp216gp6FQC1QC4ojcoKikhfOJ/51CqaJunVDilRLlIO5tCGWj1tzlYYT9eOGhJv7MF3t7rxSmw==" + }, + "node_modules/is-date-object": { + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", + "engines": { + "node": ">= 0.4" + }, + "dev": true + }, + "node_modules/enquirer": { + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "version": "2.3.6", + "engines": { + "node": ">=8.6" + }, + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==" + }, + "node_modules/@octokit/rest": { + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-15.18.3.tgz", + "version": "15.18.3", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "lodash": "^4.17.4", + "url-template": "^2.0.8", + "before-after-hook": "^1.1.0", + "btoa-lite": "^1.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.0", + "node-fetch": "^2.1.1", + "debug": "^3.1.0", + "universal-user-agent": "^2.0.0" + }, + "integrity": "sha1-/07Lt4TKKGxAzB1WirztptmbNvw=" + }, + "node_modules/acorn-jsx": { + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "version": "5.3.1", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "node_modules/astral-regex": { + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/eslint-plugin-jsdoc/node_modules/yallist": { + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/array-union": { + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "version": "2.1.0", + "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/flat": { + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "bin": { + "flat": "cli.js" + }, + "version": "5.0.2", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "node_modules/path-exists": { + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + }, + "dev": true + }, + "node_modules/eslint/node_modules/ansi-regex": { + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "version": "5.0.0", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/node-pre-gyp-github": { + "resolved": "https://registry.npmjs.org/node-pre-gyp-github/-/node-pre-gyp-github-1.4.3.tgz", + "bin": { + "node-pre-gyp-github": "bin/node-pre-gyp-github.js" + }, + "version": "1.4.3", + "dev": true, + "dependencies": { + "@octokit/rest": "^15.9.5", + "mime-types": "^2.1.19", + "commander": "^2.17.0" + }, + "integrity": "sha1-VhmZmEMhbfaHDLLaukbBOCWAaMU=" + }, + "node_modules/is-iojs": { + "resolved": "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=", + "dev": true + }, + "node_modules/isexe": { + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/mocha/node_modules/yargs/node_modules/path-exists": { + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + }, + "dev": true + }, + "node_modules/p-try": { + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" + }, + "dev": true + }, + "node_modules/jsonc/node_modules/parse-json": { + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "version": "4.0.0", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=" + }, + "node_modules/url-template": { + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "version": "2.0.8", + "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", + "dev": true + }, + "node_modules/rc": { + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "bin": { + "rc": "cli.js" + }, + "version": "1.2.8", + "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=", + "dependencies": { + "strip-json-comments": "~2.0.1", + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0" + } + }, + "node_modules/eslint/node_modules/yallist": { + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "version": "1.3.0", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + }, + "dev": true + }, + "node_modules/typescript": { + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + }, + "dev": true, + "version": "4.1.3", + "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==" + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "bin": { + "semver": "bin/semver.js" + }, + "version": "7.3.4", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==" + }, + "node_modules/import-fresh": { + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "version": "3.2.1", + "engines": { + "node": ">=6" + }, + "dev": true, + "dependencies": { + "resolve-from": "^4.0.0", + "parent-module": "^1.0.0" + }, + "integrity": "sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY=" + }, + "node_modules/argparse": { + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "dependencies": { + "sprintf-js": "~1.0.2" + }, + "version": "1.0.10", + "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true + }, + "node_modules/fill-range": { + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "version": "7.0.1", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=" + }, + "node_modules/which-module": { + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/mocha/node_modules/cliui": { + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "dependencies": { + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0", + "string-width": "^3.1.0" + }, + "version": "5.0.0", + "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", + "dev": true + }, + "node_modules/qs": { + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "version": "6.5.2", + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", + "engines": { + "node": ">=0.6" + }, + "dev": true + }, + "node_modules/@protobufjs/float": { + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", + "dev": true + }, + "node_modules/delayed-stream": { + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + }, + "dev": true + }, + "node_modules/esprima": { + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "bin": { + "esvalidate": "bin/esvalidate.js", + "esparse": "bin/esparse.js" + }, + "engines": { + "node": ">=4" + }, + "dev": true, + "version": "4.0.1", + "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=" + }, + "node_modules/string.prototype.trimend": { + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "dependencies": { + "es-abstract": "^1.17.5", + "define-properties": "^1.1.3" + }, + "version": "1.0.1", + "integrity": "sha1-hYEqa4R6wAInD1gIFGBkyZX7aRM=", + "dev": true + }, + "node_modules/is-symbol": { + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "version": "1.0.3", + "engines": { + "node": ">= 0.4" + }, + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=" + }, + "node_modules/node-abi": { + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.1.tgz", + "version": "2.19.1", + "integrity": "sha1-aqMlYdCl4v22gQ2MJWQbZXqM6oU=", + "dependencies": { + "semver": "^5.4.1" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/require-from-string": { + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "version": "2.0.2", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/@ungap/promise-all-settled": { + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "version": "1.1.2", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/dir-glob/node_modules/path-type": { + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/mocha": { + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "funding": { + "url": "https://opencollective.com/mochajs", + "type": "opencollective" + }, + "version": "8.2.1", + "engines": { + "node": ">= 10.12.0" + }, + "dev": true, + "dependencies": { + "browser-stdout": "1.3.1", + "nanoid": "3.1.12", + "chokidar": "3.4.3", + "diff": "4.0.2", + "yargs-unparser": "2.0.0", + "yargs": "13.3.2", + "minimatch": "3.0.4", + "find-up": "5.0.0", + "wide-align": "1.1.3", + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "which": "2.0.2", + "log-symbols": "4.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "serialize-javascript": "5.0.1", + "js-yaml": "3.14.0", + "yargs-parser": "13.1.2", + "he": "1.2.0", + "workerpool": "6.0.2", + "supports-color": "7.2.0", + "strip-json-comments": "3.1.1", + "escape-string-regexp": "4.0.0", + "ms": "2.1.2", + "debug": "4.2.0" + }, + "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==" + }, + "node_modules/yocto-queue": { + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "engines": { + "node": ">=10" + }, + "dev": true, + "version": "0.1.0", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "node_modules/mimic-response": { + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "version": "2.1.0", + "integrity": "sha1-0Tdj019hPQnsN+uzC6wEacDuj0M=", + "engines": { + "node": ">=8" + } + }, + "node_modules/har-validator": { + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "version": "5.1.5", + "engines": { + "node": ">=6" + }, + "dev": true, + "dependencies": { + "har-schema": "^2.0.0", + "ajv": "^6.12.3" + }, + "integrity": "sha1-HwgDufjLIMD6E4It8ezds2veHv0=" + }, + "node_modules/prebuild-install": { + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.0.tgz", + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=6" + }, + "version": "6.0.0", + "dependencies": { + "npmlog": "^4.0.1", + "github-from-package": "0.0.0", + "noop-logger": "^0.1.1", + "minimist": "^1.2.3", + "pump": "^3.0.0", + "simple-get": "^3.0.3", + "node-abi": "^2.7.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0", + "expand-template": "^2.0.3", + "mkdirp-classic": "^0.5.3", + "tar-fs": "^2.0.0", + "rc": "^1.2.7", + "napi-build-utils": "^1.0.1", + "detect-libc": "^1.0.3" + }, + "integrity": "sha512-h2ZJ1PXHKWZpp1caLw0oX9sagVpL2YTk+ZwInQbQ3QqNd4J03O6MpFNmMTJlkfgPENWqe5kP0WjQLqz5OjLfsw==" + }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "version": "1.4.4", + "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", "dependencies": { "once": "^1.4.0" } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha1-pN5hsvZpifx0IWdsHLl4dXOs5Uw=", - "dev": true, - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha1-TrIVlMlyvEBVPSduUQU5FD21Pgo=", - "dev": true - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.19.0.tgz", - "integrity": "sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.3.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^6.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.4", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha1-hf+oGULCUBLYIxCW3fZ5wDBCxxc=", - "dev": true, - "dependencies": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha1-V569CU9Wr3eX0ZyYZsnJSGYpv6Y=", - "dev": true, - "dependencies": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, + }, + "node_modules/p-limit": { + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "version": "1.3.0", "engines": { "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, + }, + "dev": true, "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-module-utils/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "p-try": "^1.0.0" + }, + "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=" + }, + "node_modules/@protobufjs/fetch": { + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "dependencies": { + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/aspromise": "^1.1.1" + }, + "version": "1.1.0", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", "dev": true - }, - "node_modules/eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha1-CJbH5qDPRBCaLZe5WQPCu2iddwI=", - "dev": true, - "dependencies": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "dependencies": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/eslint-plugin-jsdoc": { - "version": "31.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-31.6.0.tgz", - "integrity": "sha512-kYhdW+BXHij9n12oHvAC27oDHKEFITz1YJP/C0NPtb+gsGJWxejh5B6dEmmj6oLYOsmNvuCVkdIcqYOyabP2QA==", - "dev": true, - "dependencies": { - "comment-parser": "1.1.1", - "debug": "^4.3.1", - "jsdoctypeparser": "^9.0.0", - "lodash": "^4.17.20", - "regextras": "^0.7.1", - "semver": "^7.3.4", - "spdx-expression-parse": "^3.0.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0" - } - }, - "node_modules/eslint-plugin-jsdoc/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-jsdoc/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-plugin-jsdoc/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/eslint-plugin-prefer-arrow": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", - "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", - "dev": true, - "peerDependencies": { - "eslint": ">=2.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha1-t4tYKKqOIU4p+3TE1bdS4cAz2lc=", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha1-bhSz/O4POmNA7LV9LokYaSBSpHw=", - "engines": { - "node": ">=6" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha1-0grvv5lXk4Pn88xmUpFYybmFVNM=", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha1-EkqohYmSYfaK7bQqfAgN6dpgh0M=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha1-VQ4fn1m7xl/hhctqm02VNXEH9IE=", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", - "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0=" - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs-extra/node_modules/jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha1-mJZsuiFDeMjIS4LghZB7QL9hQXk=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "node_modules/fs-extra/node_modules/jsonfile/node_modules/universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha1-zP+FcIQef+QmVpPaiJNsVa7X98c=", - "dev": true, - "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, + }, "node_modules/glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "version": "5.1.1", "engines": { "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha1-oYgTV2pBsAokqX5/gVkYwuGZJfg=", - "dev": true, + }, + "dev": true, "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha1-8VCotQo0KJsz4i9YiavU2AFvDlc=", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=", + "is-glob": "^4.0.1" + }, + "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=" + }, + "node_modules/asynckit": { + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "version": "0.4.0", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", - "dev": true, + }, + "node_modules/is-stream": { + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "engines": { - "node": ">=4.x" - } - }, - "node_modules/handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha1-1MBcG6+Q6ZRfd6pop6IZqkp9904=", - "dev": true, + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/punycode": { + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "version": "2.1.1", + "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", + "engines": { + "node": ">=6" + }, + "dev": true + }, + "node_modules/mocha/node_modules/emoji-regex": { + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "version": "7.0.3", + "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + "dev": true + }, + "node_modules/npmlog": { + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "version": "4.1.2", + "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, + "console-control-strings": "~1.1.0", + "set-blocking": "~2.0.0", + "are-we-there-yet": "~1.1.2", + "gauge": "~2.7.3" + } + }, + "node_modules/p-locate": { + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "version": "2.0.0", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=" + }, + "node_modules/shelljs": { + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "bin": { + "shjs": "bin/shjs" + }, + "version": "0.8.4", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "integrity": "sha1-3naE/ut2f4cWsyYHiooAh1iQ48I=" + }, + "node_modules/tough-cookie": { + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "version": "2.5.0", + "engines": { + "node": ">=0.8" + }, + "dev": true, + "dependencies": { + "punycode": "^2.1.1", + "psl": "^1.1.28" + }, + "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=" + }, + "node_modules/get-caller-file": { + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "version": "2.0.5", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", + "engines": { + "node": "6.* || 8.* || >= 10.*" + }, + "dev": true + }, + "node_modules/set-blocking": { + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/handlebars": { + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", "bin": { "handlebars": "bin/handlebars" - }, + }, + "version": "4.7.6", "engines": { "node": ">=0.4.7" - }, + }, "optionalDependencies": { "uglify-js": "^3.1.4" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, + }, + "dev": true, + "dependencies": { + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0", + "minimist": "^1.2.5" + }, + "integrity": "sha1-1MBcG6+Q6ZRfd6pop6IZqkp9904=" + }, + "node_modules/process-nextick-args": { + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "version": "2.0.1", + "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" + }, + "node_modules/to-regex-range": { + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "version": "5.0.1", + "engines": { + "node": ">=8.0" + }, + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=" + }, + "node_modules/memory-stream/node_modules/readable-stream": { + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "dependencies": { + "inherits": "~2.0.1", + "isarray": "0.0.1", + "core-util-is": "~1.0.0", + "string_decoder": "~0.10.x" + }, + "version": "1.0.34", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true + }, + "node_modules/read-pkg": { + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "version": "2.0.0", "engines": { "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha1-HwgDufjLIMD6E4It8ezds2veHv0=", - "dev": true, + }, + "dev": true, "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg=", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=", - "dev": true, - "dependencies": { - "agent-base": "4", - "debug": "3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha1-TuenN6vZJniik9mzShr00NCMeHs=", - "dev": true, - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY=", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha1-x8ZxXNItTdtI0+GZcCI6zquwgNk=", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-iojs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz", - "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha1-xvmKrMVG9s7FRooHt7FTq1ZKV7k=", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha1-QEk+0ZjvP/R3uMf5L2ROyCpc06Y=", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha1-p6NBcPJqIbsWJCTYray0ETpp5II=", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "node_modules/jsdoctypeparser": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", - "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", - "dev": true, - "bin": { - "jsdoctypeparser": "bin/jsdoctypeparser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", - "integrity": "sha1-niolEA0WSpu4ZMV1F1Y3F/qIJVE=", - "dev": true, - "dependencies": { - "fast-safe-stringify": "^2.0.6", - "graceful-fs": "^4.1.15", - "mkdirp": "^0.5.1", - "parse-json": "^4.0.0", - "strip-bom": "^4.0.0", - "strip-json-comments": "^3.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsonc/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jsonc/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha1-nDUFwdtFvO3KPZz3oW9cWqOQGHg=", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsonc/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha1-H9LP1W67YlAYERTwpYEWcJnCsow=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=" + }, + "node_modules/type-check": { + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "version": "0.4.0", "engines": { "node": ">= 0.8.0" - } - }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", - "dev": true - }, - "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, + }, + "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=", - "dev": true - }, - "node_modules/lodash.pad": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", - "dev": true - }, - "node_modules/lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", - "dev": true - }, - "node_modules/lodash.padstart": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/macos-release": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", - "integrity": "sha1-ZAM9Dsal5jdRVadLGh66jlCYIKw=", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/marked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.0.tgz", - "integrity": "sha512-NqRSh2+LlN2NInpqTQnS614Y/3NkVMFFU6sJlRFEpxJ/LHuK/qJECH7/fXZjk4VZstPW/Pevjil/VtSONsLc7Q==", - "dev": true, - "bin": { - "marked": "bin/marked" - }, - "engines": { - "node": ">= 8.16.2" - } - }, - "node_modules/memory-stream": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", - "integrity": "sha1-6+jdHDuLw4wOeUHp3dWuvmtN6D8=", - "dev": true, - "dependencies": { - "readable-stream": "~1.0.26-2" - } - }, - "node_modules/memory-stream/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "node_modules/memory-stream/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/memory-stream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - }, - "engines": { - "node": ">=8" - } - }, + "prelude-ls": "^1.2.1" + }, + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" + }, "node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=", - "dev": true, + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "version": "1.44.0", + "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=", "engines": { "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=", - "dev": true, - "dependencies": { - "mime-db": "1.44.0" - }, + }, + "dev": true + }, + "node_modules/fsevents": { + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "hasInstallScript": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha1-0Tdj019hPQnsN+uzC6wEacDuj0M=", + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + }, + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "version": "2.1.3", + "optional": true, + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==" + }, + "node_modules/yargs-unparser": { + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "version": "2.0.0", "engines": { - "node": ">=8" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, + "node": ">=10" + }, + "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" - }, + "flat": "^5.0.2", + "decamelize": "^4.0.0", + "is-plain-obj": "^2.1.0", + "camelcase": "^6.0.0" + }, + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==" + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "version": "6.0.0", "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" - }, - "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha1-5xN2Ln0+Mv7YAxFc+T4EvKn8yaY=", - "dev": true, + "node": ">=10" + }, + "dev": true, "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha1-IpDeloGKNMKVUcio0wEha9Zahh0=", - "dev": true, - "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, + "yallist": "^4.0.0" + }, + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + }, + "node_modules/uuid": { + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha1-+hDJEVzG2IZb4iG6R+6b7XhgERM=" - }, - "node_modules/mocha": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", - "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.4.3", - "debug": "4.2.0", - "diff": "4.0.2", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.14.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.2", - "nanoid": "3.1.12", - "serialize-javascript": "5.0.1", - "strip-json-comments": "3.1.1", - "supports-color": "7.2.0", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.0.2", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 10.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, + "uuid": "bin/uuid" + }, + "version": "3.4.0", + "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", + "dev": true + }, + "node_modules/debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "version": "4.3.1", "engines": { "node": ">=6.0" - }, + }, + "dev": true, "peerDependenciesMeta": { "supports-color": { "optional": true } - } - }, - "node_modules/mocha/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", + }, + "dependencies": { + "ms": "2.1.2" + }, + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==" + }, + "node_modules/bluebird": { + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "version": "3.4.7", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", "dev": true - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, + }, + "node_modules/globby": { + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "version": "11.0.2", "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, + }, + "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, + "array-union": "^2.1.0", + "merge2": "^1.3.0", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "dir-glob": "^3.0.1", + "slash": "^3.0.0" + }, + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==" + }, + "node_modules/@types/json5": { + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "version": "0.0.29", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@nodelib/fs.stat": { + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "version": "2.0.3", + "integrity": "sha1-NNxfTKu8cg9OYPdadH5+zWwXW9M=", "engines": { "node": ">= 8" - } - }, - "node_modules/mocha/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", + }, "dev": true - }, - "node_modules/mocha/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || >=13.7" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha1-sf3cCyxG44Cgt6dvmE3UfEGhOAY=" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", - "dev": true - }, - "node_modules/node-abi": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.1.tgz", - "integrity": "sha1-aqMlYdCl4v22gQ2MJWQbZXqM6oU=", - "dependencies": { - "semver": "^5.4.1" - } - }, - "node_modules/node-addon-api": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", - "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI=", - "dev": true, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-pre-gyp-github": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/node-pre-gyp-github/-/node-pre-gyp-github-1.4.3.tgz", - "integrity": "sha1-VhmZmEMhbfaHDLLaukbBOCWAaMU=", - "dev": true, - "dependencies": { - "@octokit/rest": "^15.9.5", - "commander": "^2.17.0", - "mime-types": "^2.1.19" - }, - "bin": { - "node-pre-gyp-github": "bin/node-pre-gyp-github.js" - } - }, - "node_modules/noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", - "dev": true, + }, + "node_modules/forever-agent": { + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "version": "0.6.1", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "engines": { "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha1-34B+Xs9TpgnMa/6T6sPMe+WzqdA=", + }, "dev": true - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha1-MDhnpmbN1Bk27N7fsfjz4ypHjN0=", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign/node_modules/es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg=", - "dev": true, - "dependencies": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha1-aKmezeNWt+kpWjxeDOMdyMlT3l4=", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onigasm": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", - "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", - "dev": true, - "dependencies": { - "lru-cache": "^5.1.1" - } - }, - "node_modules/onnx-proto": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz", - "integrity": "sha1-JDGiW+4lFI6RWQbdoGh6r+O54EQ=", - "dev": true, - "dependencies": { - "protobufjs": "^6.8.8" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha1-3sGdlmKW4c1i1wGlpm7h3ernCAE=", - "dev": true, - "dependencies": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", - "dev": true - }, - "node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=", - "dev": true, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/prebuild-install": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.0.tgz", - "integrity": "sha512-h2ZJ1PXHKWZpp1caLw0oX9sagVpL2YTk+ZwInQbQ3QqNd4J03O6MpFNmMTJlkfgPENWqe5kP0WjQLqz5OjLfsw==", - "dependencies": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" - }, + }, "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", - "dev": true, + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "version": "2.0.3", + "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", "engines": { "node": ">=0.4.0" - } - }, - "node_modules/protobufjs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.1.tgz", - "integrity": "sha1-5qSE3Y8EspYp6QUzROOXDMzxPNI=", - "dev": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": "^13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/protobufjs/node_modules/@types/node": { - "version": "13.13.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.25.tgz", - "integrity": "sha1-do1nErFQmadEgSqSuE/96PThPPE=", + }, "dev": true - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ=", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", + }, + "node_modules/@octokit/rest/node_modules/debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", - "dev": true, + "ms": "^2.1.1" + }, + "version": "3.2.6", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "dev": true + }, + "node_modules/callsites": { + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "version": "3.1.0", + "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", "engines": { "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", - "dev": true, + }, + "dev": true + }, + "node_modules/flatted": { + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "version": "3.1.1", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/klaw-sync": { + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "dependencies": { + "graceful-fs": "^4.1.11" + }, + "version": "6.0.0", + "integrity": "sha1-H9LP1W67YlAYERTwpYEWcJnCsow=", + "dev": true + }, + "node_modules/lcid": { + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "version": "1.0.0", "engines": { - "node": ">=0.6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, + "node": ">=0.10.0" + }, + "dev": true, "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=", + "invert-kv": "^1.0.0" + }, + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=" + }, + "node_modules/eslint-plugin-jsdoc/node_modules/lru-cache": { + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "version": "6.0.0", + "engines": { + "node": ">=10" + }, + "dev": true, "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, + "yallist": "^4.0.0" + }, + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + }, + "node_modules/listenercount": { + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", + "dev": true + }, + "node_modules/es6-promise": { + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "version": "4.2.8", + "integrity": "sha1-TrIVlMlyvEBVPSduUQU5FD21Pgo=", + "dev": true + }, + "node_modules/esutils": { + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "version": "2.0.3", + "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", + "engines": { + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/neo-async": { + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "version": "2.6.2", + "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", + "dev": true + }, + "node_modules/clang-format": { + "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.5.0.tgz", "bin": { - "rc": "cli.js" - } - }, - "node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, + "git-clang-format": "bin/git-clang-format", + "clang-format": "index.js", + "check-clang-format": "bin/check-clang-format.js" + }, + "version": "1.5.0", + "dev": true, "dependencies": { + "async": "^1.5.2", + "glob": "^7.0.0", "resolve": "^1.1.6" - }, + }, + "integrity": "sha512-C1LucFX7E+ABVYcPEbBHM4PYQ2+WInXsqsLpFlQ9cmRfSbk7A7b1I06h/nE4bQ3MsyEkb31jY2gC0Dtc76b4IA==" + }, + "node_modules/parse-json": { + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "version": "2.2.0", + "engines": { + "node": ">=0.10.0" + }, + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" + }, + "node_modules/spdx-exceptions": { + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "version": "2.3.0", + "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=", + "dev": true + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "version": "1.3.0", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "engines": { + "node": ">=4" + }, + "dev": true + }, + "node_modules/jsonfile": { + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "dependencies": { + "graceful-fs": "^4.1.6" + }, + "version": "4.0.0", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true + }, + "node_modules/mocha/node_modules/yargs/node_modules/locate-path": { + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "version": "3.0.0", + "engines": { + "node": ">=6" + }, + "dev": true, + "dependencies": { + "path-exists": "^3.0.0", + "p-locate": "^3.0.0" + }, + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==" + }, + "node_modules/cliui": { + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "dependencies": { + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0", + "string-width": "^1.0.1" + }, + "version": "3.2.0", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true + }, + "node_modules/braces": { + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "version": "3.0.2", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=" + }, + "node_modules/chainsaw": { + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "version": "0.1.0", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true + }, + "node_modules/macos-release": { + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", + "version": "2.4.1", + "integrity": "sha1-ZAM9Dsal5jdRVadLGh66jlCYIKw=", + "engines": { + "node": ">=6" + }, + "dev": true + }, + "node_modules/comment-parser": { + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.1.tgz", + "version": "1.1.1", + "integrity": "sha512-vue7cRi1ZO5/72FJ+wZ5+siTSBlUv3ZksTk8bWD2IkaA6obitzMZP3yI65azTJLckwmi8lxfPP5Sd9oGuZ8e2g==", + "engines": { + "node": ">= 10.0.0" + }, + "dev": true + }, + "node_modules/object-inspect": { + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "version": "1.8.0", + "integrity": "sha1-34B+Xs9TpgnMa/6T6sPMe+WzqdA=", + "dev": true + }, + "node_modules/espree": { + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "version": "7.3.1", + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.3.0", + "acorn-jsx": "^5.3.1", + "acorn": "^7.4.0" + }, + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==" + }, + "node_modules/@typescript-eslint/typescript-estree": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.14.2.tgz", + "funding": { + "url": "https://opencollective.com/typescript-eslint", + "type": "opencollective" + }, + "version": "4.14.2", + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "dev": true, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + }, + "dependencies": { + "semver": "^7.3.2", + "lodash": "^4.17.15", + "globby": "^11.0.1", + "@typescript-eslint/visitor-keys": "4.14.2", + "is-glob": "^4.0.1", + "@typescript-eslint/types": "4.14.2", + "debug": "^4.1.1", + "tsutils": "^3.17.1" + }, + "integrity": "sha512-ESiFl8afXxt1dNj8ENEZT12p+jl9PqRur+Y19m0Z/SPikGL6rqq4e7Me60SU9a2M28uz48/8yct97VQYaGl0Vg==" + }, + "node_modules/safer-buffer": { + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "version": "2.1.2", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "dev": true + }, + "node_modules/@protobufjs/inquire": { + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", + "dev": true + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dependencies": { + "ms": "2.0.0" + }, + "version": "2.6.9", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true + }, + "node_modules/http-proxy-agent": { + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "version": "2.1.0", + "engines": { + "node": ">= 4.5.0" + }, + "dev": true, + "dependencies": { + "debug": "3.1.0", + "agent-base": "4" + }, + "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=" + }, + "node_modules/interpret": { + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "version": "1.4.0", + "integrity": "sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4=", "engines": { "node": ">= 0.10" - } - }, - "node_modules/regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha1-IG0K0KVkjP+9uK5GQ489xRyfeOI=", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/regextras": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", - "integrity": "sha1-vpVxnV9D+e8Ln6B62Jt8YGmVo7I=", - "dev": true, - "engines": { - "node": ">=0.1.14" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", + }, "dev": true - }, - "node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha1-sllBtUloIxzC0bt2p5y38sC/hEQ=", - "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha1-yd06fPn0ssS2JE4XOm7YZuYd1nk=", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", - "dev": true - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha1-3naE/ut2f4cWsyYHiooAh1iQ48I=", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shiki": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.2.tgz", - "integrity": "sha512-BjUCxVbxMnvjs8jC4b+BQ808vwjJ9Q8NtLqPwXShZ307HdXiDFYP968ORSVfaTNNSWYDBYdMnVKJ0fYNsoZUBA==", - "dev": true, - "dependencies": { - "onigasm": "^2.2.5", - "vscode-textmate": "^5.2.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha1-9Gl2CCujXCJj8cirXt/ibEHJVS8=" - }, - "node_modules/simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha1-tFvgYkNeUNFZVAtXYgLO7EC5xrM=", - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, + }, + "node_modules/log-symbols/node_modules/chalk": { + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + }, + "version": "4.1.0", "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + }, + "dev": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "supports-color": "^7.1.0", + "ansi-styles": "^4.1.0" + }, + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==" + }, + "node_modules/onnx-proto": { + "resolved": "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "protobufjs": "^6.8.8" + }, + "version": "4.0.4", + "integrity": "sha1-JDGiW+4lFI6RWQbdoGh6r+O54EQ=", "dev": true - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha1-yAdXODwoq/cpZ0SZjLwQaui4VM4=", - "dev": true - }, - "node_modules/splitargs": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", - "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, + }, "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", - "dev": true, + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "version": "1.16.1", + "engines": { + "node": ">=0.10.0" + }, + "dev": true, "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", + "jsbn": "~0.1.0", + "asn1": "~0.2.3", + "getpass": "^0.1.1", + "ecc-jsbn": "~0.1.1", + "safer-buffer": "^2.0.2", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", "tweetnacl": "~0.14.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha1-hYEqa4R6wAInD1gIFGBkyZX7aRM=", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha1-FK9tnzSwU/fPyJty+PLuFLkDmlQ=", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/table": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", - "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", - "dev": true, - "dependencies": { - "ajv": "^7.0.2", - "lodash": "^4.17.20", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.4.tgz", - "integrity": "sha512-xzzzaqgEQfmuhbhAoqjJ8T/1okb6gAzXn/eQRNpAN1AEUoHJTNF9xCDRTtf/s3SKldtZfa+RJeTs+BQq+eZ/sw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + }, + "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=" + }, + "node_modules/v8-compile-cache": { + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "version": "2.1.1", + "integrity": "sha1-VLw83UMxe8qR413K8wWxpyN950U=", "dev": true - }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, + }, + "node_modules/path-is-absolute": { + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.0" - }, + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/har-schema": { + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "engines": { - "node": ">=8" + "node": ">=4" + }, + "dev": true + }, + "node_modules/setimmediate": { + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "version": "1.0.5", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/strip-json-comments": { + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "version": "2.0.1", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" } - }, + }, + "node_modules/core-util-is": { + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/colors": { + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "version": "1.4.0", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + }, + "dev": true + }, + "node_modules/mocha/node_modules/yargs/node_modules/find-up": { + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "version": "3.0.0", + "engines": { + "node": ">=6" + }, + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==" + }, + "node_modules/wordwrap": { + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/unzipper/node_modules/string_decoder": { + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "version": "0.10.31", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, "node_modules/tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha1-Q7NkvFKIjVVSmGN7ENYHkCVKtSU=", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "version": "4.4.13", "engines": { "node": ">=4.5" - } - }, - "node_modules/tar-fs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", - "integrity": "sha1-0c3RIatGXuDrnM3i01BJ0/Pa8NU=", + }, + "dev": true, "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "yallist": "^3.0.3", + "safe-buffer": "^5.1.2", + "mkdirp": "^0.5.0", + "minipass": "^2.8.6", + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minizlib": "^1.2.1" + }, + "integrity": "sha1-Q7NkvFKIjVVSmGN7ENYHkCVKtSU=" + }, + "node_modules/isstream": { + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "version": "0.1.2", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/tslib": { + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "version": "1.14.1", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz", + "version": "3.20.0", "engines": { "node": ">= 6" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true - }, - "node_modules/tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha1-CYVHpsREiAfo/Ljq4IEGTumjyQs=", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz", - "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==", - "dev": true, + }, + "dev": true, "dependencies": { "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, + }, "peerDependencies": { "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, + }, + "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==" + }, + "node_modules/mocha/node_modules/debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "node": ">=6.0" + }, + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + }, + "version": "4.2.0", + "dependencies": { + "ms": "2.1.2" + }, + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==" + }, + "node_modules/picomatch": { + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "version": "2.2.2", + "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=", + "engines": { + "node": ">=8.6" + }, "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=", - "dev": true, + }, + "node_modules/eslint/node_modules/has-flag": { + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" - } - }, - "node_modules/typedoc": { - "version": "0.20.25", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.25.tgz", - "integrity": "sha512-ZQZnjJPrt0rjp216gp6FQC1QC4ojcoKikhfOJ/51CqaJunVDilRLlIO5tCGWj1tzlYYT9eOGhJv7MF3t7rxSmw==", - "dev": true, + }, + "dev": true + }, + "node_modules/node-addon-api": { + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", + "version": "3.1.0", + "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", + "dev": true + }, + "node_modules/object.assign": { + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "version": "4.1.1", + "engines": { + "node": ">= 0.4" + }, + "dev": true, "dependencies": { - "colors": "^1.4.0", - "fs-extra": "^9.1.0", - "handlebars": "^4.7.6", - "lodash": "^4.17.20", - "lunr": "^2.3.9", - "marked": "^2.0.0", - "minimatch": "^3.0.0", - "progress": "^2.0.3", - "shelljs": "^0.8.4", - "shiki": "^0.9.2", - "typedoc-default-themes": "^0.12.7" - }, - "bin": { - "typedoc": "bin/typedoc" - }, + "es-abstract": "^1.18.0-next.0", + "define-properties": "^1.1.3", + "object-keys": "^1.1.1", + "has-symbols": "^1.0.1" + }, + "integrity": "sha1-MDhnpmbN1Bk27N7fsfjz4ypHjN0=" + }, + "node_modules/mime-types": { + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "version": "2.1.27", "engines": { - "node": ">= 10.8.0" - }, - "peerDependencies": { - "typescript": "3.9.x || 4.0.x || 4.1.x" - } - }, - "node_modules/typedoc-default-themes": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.7.tgz", - "integrity": "sha512-0XAuGEqID+gon1+fhi4LycOEFM+5Mvm2PjwaiVZNAzU7pn3G2DEpsoXnFOPlLDnHY6ZW0BY0nO7ur9fHOFkBLQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/typescript": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", - "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, + "node": ">= 0.6" + }, + "dev": true, + "dependencies": { + "mime-db": "1.44.0" + }, + "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=" + }, + "node_modules/table/node_modules/ajv": { + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.4.tgz", + "funding": { + "url": "https://github.com/sponsors/epoberezkin", + "type": "github" + }, + "version": "7.0.4", + "dev": true, + "dependencies": { + "uri-js": "^4.2.2", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "fast-deep-equal": "^3.1.1" + }, + "integrity": "sha512-xzzzaqgEQfmuhbhAoqjJ8T/1okb6gAzXn/eQRNpAN1AEUoHJTNF9xCDRTtf/s3SKldtZfa+RJeTs+BQq+eZ/sw==" + }, + "node_modules/cmake-js/node_modules/gauge": { + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "dependencies": { + "lodash.padend": "^4.1.0", + "ansi": "^0.3.0", + "lodash.pad": "^4.1.0", + "has-unicode": "^2.0.0", + "lodash.padstart": "^4.1.0" + }, + "version": "1.2.7", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "dev": true + }, "node_modules/uglify-js": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.2.tgz", - "integrity": "sha1-n1AyVUQnPCeyDlht7xQOdybFJeo=", - "dev": true, - "optional": true, + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.2.tgz", "bin": { "uglifyjs": "bin/uglifyjs" - }, + }, "engines": { "node": ">=0.8.0" - } - }, - "node_modules/universal-user-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.1.0.tgz", - "integrity": "sha1-Wr+8wDahukkMuUH4/WjEbTZp6OQ=", - "dev": true, - "dependencies": { - "os-name": "^3.0.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", - "dev": true, + }, + "integrity": "sha1-n1AyVUQnPCeyDlht7xQOdybFJeo=", + "dev": true, + "version": "3.11.2", + "optional": true + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unzipper": { - "version": "0.8.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", - "integrity": "sha1-reBSTNL8FNEbjeJYviL50kfT95s=", - "dev": true, - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "~1.0.10", - "listenercount": "~1.0.1", - "readable-stream": "~2.1.5", - "setimmediate": "~1.0.4" - } - }, - "node_modules/unzipper/node_modules/process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "node": ">=10" + }, + "dev": true, + "version": "4.0.0", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "node_modules/@protobufjs/utf8": { + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", "dev": true - }, - "node_modules/unzipper/node_modules/readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, + }, + "node_modules/mocha/node_modules/yargs/node_modules/p-locate": { + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "version": "3.0.0", + "engines": { + "node": ">=6" + }, + "dev": true, "dependencies": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", + "p-limit": "^2.0.0" + }, + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==" + }, + "node_modules/workerpool": { + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", + "version": "6.0.2", + "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", + "dev": true + }, + "node_modules/eslint/node_modules/shebang-command": { + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "version": "2.0.0", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + }, + "node_modules/mocha/node_modules/yargs/node_modules/p-limit": { + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "version": "2.3.0", + "engines": { + "node": ">=6" + }, + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" + }, + "node_modules/http-signature": { + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "version": "1.2.0", + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + }, + "dev": true, + "dependencies": { + "sshpk": "^1.7.0", + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2" + }, + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=" + }, + "node_modules/deep-is": { + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "version": "0.1.3", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/wrap-ansi": { + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "version": "2.1.0", + "engines": { + "node": ">=0.10.0" + }, + "dev": true, + "dependencies": { + "strip-ansi": "^3.0.1", + "string-width": "^1.0.1" + }, + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=" + }, + "node_modules/string.prototype.trimstart": { + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "dependencies": { + "es-abstract": "^1.17.5", + "define-properties": "^1.1.3" + }, + "version": "1.0.1", + "integrity": "sha1-FK9tnzSwU/fPyJty+PLuFLkDmlQ=", + "dev": true + }, + "node_modules/require-main-filename": { + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", + "dev": true + }, + "node_modules/wrappy": { + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/define-properties": { + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "version": "1.1.3", + "engines": { + "node": ">= 0.4" + }, + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=" + }, + "node_modules/imurmurhash": { + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "version": "0.1.4", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + }, + "dev": true + }, + "node_modules/before-after-hook": { + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.4.0.tgz", + "version": "1.4.0", + "integrity": "sha1-K2vyPcpPMuYo/SdHwQo3x0pLSE0=", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/table/node_modules/strip-ansi": { + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "version": "6.0.0", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==" + }, + "node_modules/buffer-shims": { + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "node_modules/readable-stream": { + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "version": "2.3.7", + "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", + "dependencies": { + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "core-util-is": "~1.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "process-nextick-args": "~2.0.0", "util-deprecate": "~1.0.1" } - }, - "node_modules/unzipper/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "node_modules/uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha1-qnFCYd55PoqCNHp7zJznTobyhgI=", - "dev": true, + }, + "node_modules/log-symbols/node_modules/supports-color": { + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "version": "7.2.0", + "engines": { + "node": ">=8" + }, + "dev": true, "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", - "integrity": "sha1-HbSK1CLTQCRpqH99l73r/k+x48g=", + "has-flag": "^4.0.0" + }, + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + }, + "node_modules/buffer-indexof-polyfill": { + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-0nMhNcWZnGSyd/z5savjSYJUcpw=", + "engines": { + "node": ">=0.10" + }, "dev": true - }, - "node_modules/url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", + }, + "node_modules/btoa-lite": { + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true, + }, + "node_modules/mocha/node_modules/wrap-ansi": { + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "version": "5.1.0", + "engines": { + "node": ">=6" + }, + "dev": true, + "dependencies": { + "strip-ansi": "^5.0.0", + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0" + }, + "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=" + }, + "node_modules/json-parse-better-errors": { + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "version": "1.0.2", + "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", + "dev": true + }, + "node_modules/aws4": { + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "version": "1.10.1", + "integrity": "sha1-4eguTz6Zniz9YbFhKA0WoRH4ZCg=", + "dev": true + }, + "node_modules/@types/fs-extra": { + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.6.tgz", + "dependencies": { + "@types/node": "*" + }, + "version": "9.0.6", + "integrity": "sha512-ecNRHw4clCkowNOBJH1e77nvbPxHYnWIXMv1IAoG/9+MYGkgoyr3Ppxr7XYFNL41V422EDhyV4/4SSK8L2mlig==", + "dev": true + }, + "node_modules/@typescript-eslint/experimental-utils": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.14.2.tgz", + "funding": { + "url": "https://opencollective.com/typescript-eslint", + "type": "opencollective" + }, + "version": "4.14.2", + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.14.2", + "eslint-scope": "^5.0.0", + "@types/json-schema": "^7.0.3", + "@typescript-eslint/types": "4.14.2", + "@typescript-eslint/typescript-estree": "4.14.2", + "eslint-utils": "^2.0.0" + }, + "peerDependencies": { + "eslint": "*" + }, + "integrity": "sha512-mV9pmET4C2y2WlyHmD+Iun8SAEqkLahHGBkGqDVslHkmoj3VnxnGP4ANlwuxxfq1BsKdl/MPieDbohCEQgKrwA==" + }, + "node_modules/eslint/node_modules/path-key": { + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "version": "3.1.1", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/eslint/node_modules/which": { + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha1-VLw83UMxe8qR413K8wWxpyN950U=", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", - "dev": true - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", - "dev": true, + "node-which": "bin/node-which" + }, + "version": "2.0.2", + "engines": { + "node": ">= 8" + }, + "dev": true, "dependencies": { "isexe": "^2.0.0" - }, + }, + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + }, + "node_modules/object.assign/node_modules/es-abstract": { + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "version": "1.18.0-next.1", + "engines": { + "node": ">= 0.4" + }, + "dev": true, + "dependencies": { + "is-callable": "^1.2.2", + "has": "^1.0.3", + "object-inspect": "^1.8.0", + "is-regex": "^1.1.1", + "has-symbols": "^1.0.1", + "es-to-primitive": "^1.2.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1", + "function-bind": "^1.1.1", + "is-negative-zero": "^2.0.0", + "object.assign": "^4.1.1", + "object-keys": "^1.1.1" + }, + "integrity": "sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg=" + }, + "node_modules/ajv": { + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "dependencies": { + "uri-js": "^4.2.2", + "json-schema-traverse": "^0.4.1", + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0" + }, + "version": "6.12.6", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true + }, + "node_modules/regextras": { + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", + "version": "0.7.1", + "integrity": "sha1-vpVxnV9D+e8Ln6B62Jt8YGmVo7I=", + "engines": { + "node": ">=0.1.14" + }, + "dev": true + }, + "node_modules/fs-extra": { + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "version": "9.1.0", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "jsonfile": "^6.0.1", + "graceful-fs": "^4.2.0", + "at-least-node": "^1.0.0", + "universalify": "^2.0.0" + }, + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==" + }, + "node_modules/duplexer2": { + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "dependencies": { + "readable-stream": "^2.0.2" + }, + "version": "0.1.4", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "engines": { + "node": ">=10" + }, + "dev": true, + "version": "6.2.0", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "node_modules/y18n": { + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "version": "3.2.1", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "node_modules/mkdirp": { + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "version": "0.5.5", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=" + }, + "node_modules/sprintf-js": { + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "version": "1.0.3", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "version": "1.5.0", + "engines": { + "node": ">=0.10.0" + }, + "dev": true, + "dependencies": { + "isarray": "^1.0.0", + "esutils": "^2.0.2" + }, + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=" + }, + "node_modules/resolve-from": { + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", + "engines": { + "node": ">=4" + }, + "dev": true + }, + "node_modules/mocha/node_modules/path-exists": { + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/tweetnacl": { + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "version": "0.14.5", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/safe-buffer": { + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "version": "5.1.2", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "node_modules/fastq": { + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "dependencies": { + "reusify": "^1.0.4" + }, + "version": "1.8.0", + "integrity": "sha1-VQ4fn1m7xl/hhctqm02VNXEH9IE=", + "dev": true + }, + "node_modules/@types/tar-stream": { + "resolved": "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-2.2.0.tgz", + "dependencies": { + "@types/node": "*" + }, + "version": "2.2.0", + "integrity": "sha512-sRTpT180sVigzD4SiCWJQQrqcdkWnmscWvx+cXvAoPtXbLFC5+QmKi2xwRcPe4iRu0GcVl1qTeJKUTS5hULfrw==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + }, + "version": "3.0.4", + "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", + "dev": true + }, + "node_modules/minimatch": { + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "version": "3.0.4", + "engines": { + "node": "*" + }, + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=" + }, + "node_modules/strip-eof": { + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/windows-release": { + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", + "version": "3.3.3", + "engines": { + "node": ">=6" + }, + "dev": true, + "dependencies": { + "execa": "^1.0.0" + }, + "integrity": "sha1-HBACfHIldD7sa4nfFg1kwuApOZk=" + }, + "node_modules/invert-kv": { + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "engines": { + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/rimraf": { + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "bin": { + "rimraf": "bin.js" + }, + "version": "2.7.1", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=" + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "version": "6.0.0", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + }, + "node_modules/merge2": { + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "version": "1.4.1", + "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", + "engines": { + "node": ">= 8" + }, + "dev": true + }, + "node_modules/emoji-regex": { + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "version": "8.0.0", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/@protobufjs/pool": { + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", + "dev": true + }, + "node_modules/has-flag": { + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + }, + "dev": true + }, + "node_modules/micromatch": { + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "version": "4.0.2", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "picomatch": "^2.0.5", + "braces": "^3.0.1" + }, + "integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=" + }, + "node_modules/minipass": { + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "dependencies": { + "yallist": "^3.0.0", + "safe-buffer": "^5.1.2" + }, + "version": "2.9.0", + "integrity": "sha1-5xN2Ln0+Mv7YAxFc+T4EvKn8yaY=", + "dev": true + }, + "node_modules/@protobufjs/path": { + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "version": "1.1.2", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", + "dev": true + }, + "node_modules/ini": { + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "version": "1.3.8", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/esrecurse": { + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "version": "4.3.0", + "engines": { + "node": ">=4.0" + }, + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=" + }, + "node_modules/which": { + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "bin": { "which": "bin/which" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + }, + "version": "1.3.1", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=" + }, + "node_modules/fs-minipass": { + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "dependencies": { + "minipass": "^2.6.0" + }, + "version": "1.2.7", + "integrity": "sha1-zP+FcIQef+QmVpPaiJNsVa7X98c=", "dev": true - }, - "node_modules/which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true, - "bin": { - "window-size": "cli.js" - }, + }, + "node_modules/ignore": { + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "version": "4.0.6", + "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/windows-release": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", - "integrity": "sha1-HBACfHIldD7sa4nfFg1kwuApOZk=", - "dev": true, - "dependencies": { - "execa": "^1.0.0" - }, + "node": ">= 4" + }, + "dev": true + }, + "node_modules/globby/node_modules/ignore": { + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "version": "5.1.8", + "integrity": "sha1-8VCotQo0KJsz4i9YiavU2AFvDlc=", "engines": { - "node": ">=6" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, + "node": ">= 4" + }, + "dev": true + }, + "node_modules/chokidar": { + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "version": "3.4.3", + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + }, + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "readdirp": "~3.5.0", + "glob-parent": "~5.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "is-binary-path": "~2.1.0", + "fsevents": "~2.1.2", + "braces": "~3.0.2" + }, + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==" + }, + "node_modules/p-finally": { + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + }, + "dev": true + }, + "node_modules/contains-path": { + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "version": "0.1.0", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "engines": { "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + }, "dev": true - }, - "node_modules/workerpool": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", - "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + }, + "node_modules/long": { + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=", "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", + }, + "node_modules/@protobufjs/aspromise": { + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "version": "1.1.2", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", "dev": true - }, - "node_modules/yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "dependencies": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true, + }, + "node_modules/tar-stream": { + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "version": "2.2.0", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "engines": { "node": ">=6" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, + }, "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "fs-constants": "^1.0.0", + "readable-stream": "^3.1.1" + } + }, + "node_modules/require-directory": { + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "version": "2.1.1", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "engines": { - "node": ">=10" + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/once": { + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "version": "1.4.0", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, + }, + "node_modules/execa": { + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "version": "1.0.0", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, + "node": ">=6" + }, + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "signal-exit": "^3.0.0", + "p-finally": "^1.0.0", + "strip-eof": "^1.0.0", + "is-stream": "^1.1.0", + "get-stream": "^4.0.0", + "npm-run-path": "^2.0.0" + }, + "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=" + }, + "node_modules/prelude-ls": { + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "version": "1.2.1", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, + "node": ">= 0.8.0" + }, + "dev": true + }, + "node_modules/pify": { + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "version": "2.3.0", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha1-Fo2ho26Q2miujUnA8bSMfGJJITo=", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI=", + "node": ">=0.10.0" + }, "dev": true - }, - "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha1-fRvf1ldTU4+r5sOFls23bZrGAUM=", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@eslint/eslintrc": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", - "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, + }, + "node_modules/rechoir": { + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "version": "0.6.2", + "engines": { + "node": ">= 0.10" + }, + "dev": true, "dependencies": { - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", - "integrity": "sha1-Olgr21OATGum0UZXnEblITDPSjs=", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.3", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", - "integrity": "sha1-NNxfTKu8cg9OYPdadH5+zWwXW9M=", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", - "integrity": "sha1-ARuSAqcKY2bkNspcBlhEUoqwSXY=", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.3", - "fastq": "^1.6.0" - } - }, - "@octokit/rest": { - "version": "15.18.3", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-15.18.3.tgz", - "integrity": "sha1-/07Lt4TKKGxAzB1WirztptmbNvw=", - "dev": true, - "requires": { - "before-after-hook": "^1.1.0", - "btoa-lite": "^1.0.0", - "debug": "^3.1.0", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.0", - "lodash": "^4.17.4", - "node-fetch": "^2.1.1", - "universal-user-agent": "^2.0.0", - "url-template": "^2.0.8" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", - "dev": true - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU=", - "dev": true - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha1-fvN/DQEPsCitGtWXIuUG2SYoFcs=", - "dev": true - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", - "dev": true - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", - "dev": true - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", - "dev": true - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", - "dev": true - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=", - "dev": true - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", - "dev": true - }, - "@types/fs-extra": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.6.tgz", - "integrity": "sha512-ecNRHw4clCkowNOBJH1e77nvbPxHYnWIXMv1IAoG/9+MYGkgoyr3Ppxr7XYFNL41V422EDhyV4/4SSK8L2mlig==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha1-/ws2YB76qhCdUTxM7RCTEf0GujY=", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha1-RZxl+hhn2v5qjzIsTFFpVmPMVek=", - "dev": true - }, - "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", - "dev": true - }, - "@types/mocha": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz", - "integrity": "sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==", - "dev": true - }, - "@types/node": { - "version": "14.11.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz", - "integrity": "sha1-/iAS8jVeTOCLykSus6u7Ic+I0z8=", - "dev": true - }, - "@types/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-sRTpT180sVigzD4SiCWJQQrqcdkWnmscWvx+cXvAoPtXbLFC5+QmKi2xwRcPe4iRu0GcVl1qTeJKUTS5hULfrw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.14.2.tgz", - "integrity": "sha512-uMGfG7GFYK/nYutK/iqYJv6K/Xuog/vrRRZX9aEP4Zv1jsYXuvFUMDFLhUnc8WFv3D2R5QhNQL3VYKmvLS5zsQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.14.2", - "@typescript-eslint/scope-manager": "4.14.2", - "debug": "^4.1.1", - "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.15", - "regexpp": "^3.0.0", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.14.2.tgz", - "integrity": "sha512-mV9pmET4C2y2WlyHmD+Iun8SAEqkLahHGBkGqDVslHkmoj3VnxnGP4ANlwuxxfq1BsKdl/MPieDbohCEQgKrwA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.14.2", - "@typescript-eslint/types": "4.14.2", - "@typescript-eslint/typescript-estree": "4.14.2", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.14.2.tgz", - "integrity": "sha512-ipqSP6EuUsMu3E10EZIApOJgWSpcNXeKZaFeNKQyzqxnQl8eQCbV+TSNsl+s2GViX2d18m1rq3CWgnpOxDPgHg==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.14.2", - "@typescript-eslint/types": "4.14.2", - "@typescript-eslint/typescript-estree": "4.14.2", - "debug": "^4.1.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.14.2.tgz", - "integrity": "sha512-cuV9wMrzKm6yIuV48aTPfIeqErt5xceTheAgk70N1V4/2Ecj+fhl34iro/vIssJlb7XtzcaD07hWk7Jk0nKghg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.14.2", - "@typescript-eslint/visitor-keys": "4.14.2" - } - }, - "@typescript-eslint/types": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.14.2.tgz", - "integrity": "sha512-LltxawRW6wXy4Gck6ZKlBD05tCHQUj4KLn4iR69IyRiDHX3d3NCAhO+ix5OR2Q+q9bjCrHE/HKt+riZkd1At8Q==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.14.2.tgz", - "integrity": "sha512-ESiFl8afXxt1dNj8ENEZT12p+jl9PqRur+Y19m0Z/SPikGL6rqq4e7Me60SU9a2M28uz48/8yct97VQYaGl0Vg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.14.2", - "@typescript-eslint/visitor-keys": "4.14.2", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "lodash": "^4.17.15", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.14.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.14.2.tgz", - "integrity": "sha512-KBB+xLBxnBdTENs/rUgeUKO0UkPBRs2vD09oMRRIkj5BEN8PX1ToXV532desXfpQnZsYTyLLviS7JrPhdL154w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.14.2", - "eslint-visitor-keys": "^2.0.0" - } - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true, - "requires": {} - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha1-gWXwHENgCbzK0LHRIvBe13Dvxu4=", - "dev": true, - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", - "dev": true - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha1-SzXClE8GKov82mZBB2A1D+nd/CE=", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha1-zdZ+aFK9+cEhVGB4ZzIlXtJFk0g=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", - "is-string": "^1.0.5" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha1-t5hCCtvrHego2ErNii4j0+/oXo0=", - "dev": true - }, - "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha1-DegrQmsDGNv9uUAInjiwQ9N/bHs=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha1-YCzUtG6EStTv/JKoARo8RuAjjcI=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha1-4eguTz6Zniz9YbFhKA0WoRH4ZCg=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha1-WOzoy3XdB+ce0IxzarxfrE2/jfE=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "before-after-hook": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.4.0.tgz", - "integrity": "sha1-K2vyPcpPMuYo/SdHwQo3x0pLSE0=", - "dev": true - }, - "big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha1-j9iL0WMsukocjD49cVnwi7lbS54=", - "dev": true - }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", - "integrity": "sha1-EtYoetwpCA4ipwXldksqlSLNxIk=", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha1-NFThpGLujVmeI23zNs2epPiv4Qc=", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", - "dev": true - }, - "btoa-lite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", - "dev": true - }, - "buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha1-oxdJ3H2B2E2wir+Te2uMQDP2J4Y=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha1-0nMhNcWZnGSyd/z5savjSYJUcpw=", - "dev": true - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dev": true, - "requires": { - "traverse": ">=0.3.0 <0.4" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha1-b8nXtC0ypYNZYzdmbn0ICE2izGs=" - }, - "clang-format": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.5.0.tgz", - "integrity": "sha512-C1LucFX7E+ABVYcPEbBHM4PYQ2+WInXsqsLpFlQ9cmRfSbk7A7b1I06h/nE4bQ3MsyEkb31jY2gC0Dtc76b4IA==", - "dev": true, - "requires": { - "async": "^1.5.2", - "glob": "^7.0.0", "resolve": "^1.1.6" - } - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "cmake-js": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-6.1.0.tgz", - "integrity": "sha1-vsc4G1jUVKzuCdT7AEcVOgBQY6Y=", - "dev": true, - "requires": { - "debug": "^4", - "fs-extra": "^5.0.0", - "is-iojs": "^1.0.1", - "lodash": "^4", - "memory-stream": "0", - "npmlog": "^1.2.0", - "rc": "^1.2.7", - "request": "^2.54.0", - "semver": "^5.0.3", - "splitargs": "0", - "tar": "^4", - "unzipper": "^0.8.13", - "url-join": "0", - "which": "^1.0.9", - "yargs": "^3.6.0" - }, + }, + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=" + }, + "node_modules/file-entry-cache": { + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "version": "6.0.0", + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "dev": true, "dependencies": { - "are-we-there-yet": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", - "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.0 || ^1.1.13" - } - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "gauge": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", - "dev": true, - "requires": { - "ansi": "^0.3.0", - "has-unicode": "^2.0.0", - "lodash.pad": "^4.1.0", - "lodash.padend": "^4.1.0", - "lodash.padstart": "^4.1.0" - } - }, - "npmlog": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", - "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", - "dev": true, - "requires": { - "ansi": "~0.3.0", - "are-we-there-yet": "~1.0.0", - "gauge": "~1.2.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "flat-cache": "^3.0.4" + }, + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==" + }, + "node_modules/protobufjs": { + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.1.tgz", + "bin": { + "pbts": "bin/pbts", + "pbjs": "bin/pbjs" + }, + "version": "6.10.1", + "dev": true, + "dependencies": { + "@protobufjs/pool": "^1.1.0", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "long": "^4.0.0", + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/codegen": "^2.0.4" + }, + "integrity": "sha1-5qSE3Y8EspYp6QUzROOXDMzxPNI=" + }, + "node_modules/splitargs": { + "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", + "version": "0.0.7", + "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=", "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + }, + "node_modules/slice-ansi/node_modules/color-name": { + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "version": "1.1.4", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", + }, + "node_modules/async": { + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "version": "1.5.2", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true - }, - "comment-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.1.tgz", - "integrity": "sha512-vue7cRi1ZO5/72FJ+wZ5+siTSBlUv3ZksTk8bWD2IkaA6obitzMZP3yI65azTJLckwmi8lxfPP5Sd9oGuZ8e2g==", + }, + "node_modules/aws-sign2": { + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "version": "0.7.0", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + }, "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + }, + "node_modules/resolve": { + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "dependencies": { + "path-parse": "^1.0.6" + }, + "version": "1.17.0", + "integrity": "sha1-sllBtUloIxzC0bt2p5y38sC/hEQ=", "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + }, + "node_modules/big-integer": { + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "version": "1.6.48", + "integrity": "sha1-j9iL0WMsukocjD49cVnwi7lbS54=", + "engines": { + "node": ">=0.6" + }, "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + }, + "node_modules/normalize-package-data": { + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "dependencies": { + "hosted-git-info": "^2.1.4", + "semver": "2 || 3 || 4 || 5", + "resolve": "^1.10.0", + "validate-npm-package-license": "^3.0.1" + }, + "version": "2.5.0", + "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", "dev": true - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha1-QUAjzHowLaJc4uyC0NUjjMr9iYY=", - "requires": { + }, + "node_modules/ansi-colors": { + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "version": "4.1.1", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "engines": { + "node": ">=6" + }, + "dev": true + }, + "node_modules/fs-extra/node_modules/jsonfile": { + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "dependencies": { + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" + }, + "version": "6.0.1", + "integrity": "sha1-mJZsuiFDeMjIS4LghZB7QL9hQXk=", + "dev": true + }, + "node_modules/lru-cache": { + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "dependencies": { + "yallist": "^3.0.2" + }, + "version": "5.1.1", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true + }, + "node_modules/is-arrayish": { + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "version": "0.2.1", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/lunr": { + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "version": "2.3.9", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/jsbn": { + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "version": "0.1.1", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsdoctypeparser": { + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", + "bin": { + "jsdoctypeparser": "bin/jsdoctypeparser" + }, + "engines": { + "node": ">=10" + }, + "dev": true, + "version": "9.0.0", + "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==" + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@typescript-eslint/visitor-keys": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.14.2.tgz", + "funding": { + "url": "https://opencollective.com/typescript-eslint", + "type": "opencollective" + }, + "version": "4.14.2", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0", + "@typescript-eslint/types": "4.14.2" + }, + "integrity": "sha512-KBB+xLBxnBdTENs/rUgeUKO0UkPBRs2vD09oMRRIkj5BEN8PX1ToXV532desXfpQnZsYTyLLviS7JrPhdL154w==" + }, + "node_modules/eslint/node_modules/strip-json-comments": { + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "version": "3.1.1", + "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/memory-stream": { + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", + "dependencies": { + "readable-stream": "~1.0.26-2" + }, + "version": "0.0.3", + "integrity": "sha1-6+jdHDuLw4wOeUHp3dWuvmtN6D8=", + "dev": true + }, + "node_modules/array-includes": { + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "version": "3.1.1", + "engines": { + "node": ">= 0.4" + }, + "dev": true, + "dependencies": { + "es-abstract": "^1.17.0", + "define-properties": "^1.1.3", + "is-string": "^1.0.5" + }, + "integrity": "sha1-zdZ+aFK9+cEhVGB4ZzIlXtJFk0g=" + }, + "node_modules/mocha/node_modules/ansi-regex": { + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "version": "4.1.0", + "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", + "engines": { + "node": ">=6" + }, + "dev": true + }, + "node_modules/decompress-response": { + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "version": "4.2.1", + "integrity": "sha1-QUAjzHowLaJc4uyC0NUjjMr9iYY=", + "engines": { + "node": ">=8" + }, + "dependencies": { "mimic-response": "^2.0.0" } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw=" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=", - "dev": true, - "requires": { - "path-type": "^4.0.0" - }, + }, + "node_modules/cmake-js": { + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-6.1.0.tgz", + "bin": { + "cmake-js": "bin/cmake-js" + }, + "version": "6.1.0", + "engines": { + "node": ">= 10.0.0" + }, + "dev": true, "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=", - "dev": true - } - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=", - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha1-pN5hsvZpifx0IWdsHLl4dXOs5Uw=", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha1-TrIVlMlyvEBVPSduUQU5FD21Pgo=", - "dev": true - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, - "requires": { - "es6-promise": "^4.0.3" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.19.0.tgz", - "integrity": "sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.3.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^6.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.4", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, + "npmlog": "^1.2.0", + "semver": "^5.0.3", + "lodash": "^4", + "tar": "^4", + "request": "^2.54.0", + "fs-extra": "^5.0.0", + "unzipper": "^0.8.13", + "which": "^1.0.9", + "is-iojs": "^1.0.1", + "url-join": "0", + "splitargs": "0", + "rc": "^1.2.7", + "debug": "^4", + "memory-stream": "0", + "yargs": "^3.6.0" + }, + "integrity": "sha1-vsc4G1jUVKzuCdT7AEcVOgBQY6Y=" + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha1-hf+oGULCUBLYIxCW3fZ5wDBCxxc=", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - }, + "ms": "2.0.0" + }, + "version": "3.1.0", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "dev": true + }, + "node_modules/window-size": { + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + }, + "dev": true, + "version": "0.1.4", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "node_modules/typedoc-default-themes": { + "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.7.tgz", + "version": "0.12.7", + "integrity": "sha512-0XAuGEqID+gon1+fhi4LycOEFM+5Mvm2PjwaiVZNAzU7pn3G2DEpsoXnFOPlLDnHY6ZW0BY0nO7ur9fHOFkBLQ==", + "engines": { + "node": ">= 8" + }, + "dev": true + }, + "node_modules/@types/mocha": { + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz", + "version": "8.2.0", + "integrity": "sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==", + "dev": true + }, + "node_modules/tunnel-agent": { + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "version": "0.6.0", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "engines": { + "node": "*" + }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", - "integrity": "sha1-V569CU9Wr3eX0ZyYZsnJSGYpv6Y=", - "dev": true, - "requires": { - "debug": "^2.6.9", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", - "integrity": "sha1-CJbH5qDPRBCaLZe5WQPCu2iddwI=", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.0", - "has": "^1.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.1", - "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-jsdoc": { - "version": "31.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-31.6.0.tgz", - "integrity": "sha512-kYhdW+BXHij9n12oHvAC27oDHKEFITz1YJP/C0NPtb+gsGJWxejh5B6dEmmj6oLYOsmNvuCVkdIcqYOyabP2QA==", - "dev": true, - "requires": { - "comment-parser": "1.1.1", - "debug": "^4.3.1", - "jsdoctypeparser": "^9.0.0", - "lodash": "^4.17.20", - "regextras": "^0.7.1", - "semver": "^7.3.4", - "spdx-expression-parse": "^3.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "eslint-plugin-prefer-arrow": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", - "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha1-54blmmbLkrP2wfsNUIqrF0hI9Iw=", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", - "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true - }, - "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha1-t4tYKKqOIU4p+3TE1bdS4cAz2lc=", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha1-eteWTWeauyi+5yzsY3WLHF0smSE=", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha1-bhSz/O4POmNA7LV9LokYaSBSpHw=" - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", - "dev": true - }, - "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha1-0grvv5lXk4Pn88xmUpFYybmFVNM=", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", - "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha1-EkqohYmSYfaK7bQqfAgN6dpgh0M=", - "dev": true - }, - "fastq": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", - "integrity": "sha1-VQ4fn1m7xl/hhctqm02VNXEH9IE=", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", - "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha1-GRmmp8df44ssfHflGYU12prN2kA=", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flatted": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", - "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha1-a+Dem+mYzhavivwkSXue6bfM2a0=" - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "dependencies": { - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha1-mJZsuiFDeMjIS4LghZB7QL9hQXk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - }, - "dependencies": { - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - } - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha1-zP+FcIQef+QmVpPaiJNsVa7X98c=", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha1-wbJVV189wh1Zv8ec09K0axw6VLU=", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha1-tsHvQXxOVmPqSY8cRa+saRa7wik=", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha1-oYgTV2pBsAokqX5/gVkYwuGZJfg=", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha1-8VCotQo0KJsz4i9YiavU2AFvDlc=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", - "dev": true - }, - "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha1-1MBcG6+Q6ZRfd6pop6IZqkp9904=", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha1-HwgDufjLIMD6E4It8ezds2veHv0=", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", - "dev": true - }, - "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg=", - "dev": true - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=", - "dev": true, - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha1-TuenN6vZJniik9mzShr00NCMeHs=", - "dev": true, - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q=" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", - "dev": true - }, - "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha1-Yz/2GFBueTr1rJG/SLcmd+FcvmY=", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4=", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha1-x8ZxXNItTdtI0+GZcCI6zquwgNk=", - "dev": true - }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-iojs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz", - "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha1-xvmKrMVG9s7FRooHt7FTq1ZKV7k=", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha1-QEk+0ZjvP/R3uMf5L2ROyCpc06Y=", - "dev": true - }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", - "dev": true - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha1-p6NBcPJqIbsWJCTYray0ETpp5II=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdoctypeparser": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", - "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha1-u4Z8+zRQ5pEHwTHRxRS6s9yLyqk=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", - "integrity": "sha1-niolEA0WSpu4ZMV1F1Y3F/qIJVE=", - "dev": true, - "requires": { - "fast-safe-stringify": "^2.0.6", - "graceful-fs": "^4.1.15", - "mkdirp": "^0.5.1", - "parse-json": "^4.0.0", - "strip-bom": "^4.0.0", - "strip-json-comments": "^3.0.1" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha1-nDUFwdtFvO3KPZz3oW9cWqOQGHg=", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha1-MfEoGzgyYwQ0gxwxDAHMzajL4AY=", - "dev": true - } - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha1-H9LP1W67YlAYERTwpYEWcJnCsow=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", - "dev": true - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha1-tEqbYpe8tpjxxRo1RaKzs2jVnFI=", - "dev": true - }, - "lodash.pad": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", - "dev": true - }, - "lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=", - "dev": true - }, - "lodash.padstart": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", - "dev": true - }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "requires": { - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "macos-release": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", - "integrity": "sha1-ZAM9Dsal5jdRVadLGh66jlCYIKw=", - "dev": true - }, - "marked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.0.tgz", - "integrity": "sha512-NqRSh2+LlN2NInpqTQnS614Y/3NkVMFFU6sJlRFEpxJ/LHuK/qJECH7/fXZjk4VZstPW/Pevjil/VtSONsLc7Q==", - "dev": true - }, - "memory-stream": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", - "integrity": "sha1-6+jdHDuLw4wOeUHp3dWuvmtN6D8=", - "dev": true, - "requires": { - "readable-stream": "~1.0.26-2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha1-T8sJmb+fvC/L3SEvbWKbmlbDklk=", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha1-+hHF6wrKEzS0Izy01S8QxaYnL5I=", - "dev": true - }, - "mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha1-R5SfmOJ56lMRn1ci4PNOUpvsAJ8=", - "dev": true, - "requires": { - "mime-db": "1.44.0" - } - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha1-0Tdj019hPQnsN+uzC6wEacDuj0M=" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha1-5xN2Ln0+Mv7YAxFc+T4EvKn8yaY=", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha1-IpDeloGKNMKVUcio0wEha9Zahh0=", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha1-+hDJEVzG2IZb4iG6R+6b7XhgERM=" - }, - "mocha": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", - "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.4.3", - "debug": "4.2.0", - "diff": "4.0.2", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.14.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.2", - "nanoid": "3.1.12", - "serialize-javascript": "5.0.1", - "strip-json-comments": "3.1.1", - "supports-color": "7.2.0", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.0.2", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=", - "dev": true - }, - "nanoid": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", - "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", - "dev": true - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha1-sf3cCyxG44Cgt6dvmE3UfEGhOAY=" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", - "dev": true - }, - "node-abi": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.1.tgz", - "integrity": "sha1-aqMlYdCl4v22gQ2MJWQbZXqM6oU=", - "requires": { - "semver": "^5.4.1" - } - }, - "node-addon-api": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz", - "integrity": "sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==", - "dev": true - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI=", - "dev": true - }, - "node-pre-gyp-github": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/node-pre-gyp-github/-/node-pre-gyp-github-1.4.3.tgz", - "integrity": "sha1-VhmZmEMhbfaHDLLaukbBOCWAaMU=", - "dev": true, - "requires": { - "@octokit/rest": "^15.9.5", - "commander": "^2.17.0", - "mime-types": "^2.1.19" - } - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha1-CKfyqL9zRgR3mp76StXMcXq7lUs=", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha1-34B+Xs9TpgnMa/6T6sPMe+WzqdA=", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", - "dev": true - }, - "object.assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", - "integrity": "sha1-MDhnpmbN1Bk27N7fsfjz4ypHjN0=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.0", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha1-bjoKS9pxflAjqzuOkL7DYQjSLGg=", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } - } - }, - "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha1-aKmezeNWt+kpWjxeDOMdyMlT3l4=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "onigasm": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", - "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", - "dev": true, - "requires": { - "lru-cache": "^5.1.1" - } - }, - "onnx-proto": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz", - "integrity": "sha1-JDGiW+4lFI6RWQbdoGh6r+O54EQ=", - "dev": true, - "requires": { - "protobufjs": "^6.8.8" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha1-3sGdlmKW4c1i1wGlpm7h3ernCAE=", - "dev": true, - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg=", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha1-IfMz6ba46v8CRo9RRupAbTRfTa0=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "prebuild-install": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.0.tgz", - "integrity": "sha512-h2ZJ1PXHKWZpp1caLw0oX9sagVpL2YTk+ZwInQbQ3QqNd4J03O6MpFNmMTJlkfgPENWqe5kP0WjQLqz5OjLfsw==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha1-foz42PW48jnBvGi+tOt4Vn1XLvg=", - "dev": true - }, - "protobufjs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.1.tgz", - "integrity": "sha1-5qSE3Y8EspYp6QUzROOXDMzxPNI=", - "dev": true, - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": "^13.7.0", - "long": "^4.0.0" - }, - "dependencies": { - "@types/node": { - "version": "13.13.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.25.tgz", - "integrity": "sha1-do1nErFQmadEgSqSuE/96PThPPE=", - "dev": true - } - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ=", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0=", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regexpp": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", - "integrity": "sha1-IG0K0KVkjP+9uK5GQ489xRyfeOI=", - "dev": true - }, - "regextras": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", - "integrity": "sha1-vpVxnV9D+e8Ln6B62Jt8YGmVo7I=", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", - "dev": true - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha1-sllBtUloIxzC0bt2p5y38sC/hEQ=", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha1-yd06fPn0ssS2JE4XOm7YZuYd1nk=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=" - }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha1-3naE/ut2f4cWsyYHiooAh1iQ48I=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shiki": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.2.tgz", - "integrity": "sha512-BjUCxVbxMnvjs8jC4b+BQ808vwjJ9Q8NtLqPwXShZ307HdXiDFYP968ORSVfaTNNSWYDBYdMnVKJ0fYNsoZUBA==", - "dev": true, - "requires": { - "onigasm": "^2.2.5", - "vscode-textmate": "^5.2.0" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw=" - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha1-9Gl2CCujXCJj8cirXt/ibEHJVS8=" - }, - "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha1-tFvgYkNeUNFZVAtXYgLO7EC5xrM=", - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha1-yAdXODwoq/cpZ0SZjLwQaui4VM4=", - "dev": true - }, - "splitargs": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", - "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha1-hYEqa4R6wAInD1gIFGBkyZX7aRM=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha1-FK9tnzSwU/fPyJty+PLuFLkDmlQ=", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "table": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", - "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", - "dev": true, - "requires": { - "ajv": "^7.0.2", - "lodash": "^4.17.20", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "ajv": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.4.tgz", - "integrity": "sha512-xzzzaqgEQfmuhbhAoqjJ8T/1okb6gAzXn/eQRNpAN1AEUoHJTNF9xCDRTtf/s3SKldtZfa+RJeTs+BQq+eZ/sw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha1-Q7NkvFKIjVVSmGN7ENYHkCVKtSU=", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "tar-fs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", - "integrity": "sha1-0c3RIatGXuDrnM3i01BJ0/Pa8NU=", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.0.0" - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true - }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha1-CYVHpsREiAfo/Ljq4IEGTumjyQs=", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz", - "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { "safe-buffer": "^5.0.1" } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha1-CeJJ696FHTseSNJ8EFREZn8XuD0=", - "dev": true - }, - "typedoc": { - "version": "0.20.25", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.20.25.tgz", - "integrity": "sha512-ZQZnjJPrt0rjp216gp6FQC1QC4ojcoKikhfOJ/51CqaJunVDilRLlIO5tCGWj1tzlYYT9eOGhJv7MF3t7rxSmw==", - "dev": true, - "requires": { - "colors": "^1.4.0", - "fs-extra": "^9.1.0", - "handlebars": "^4.7.6", - "lodash": "^4.17.20", - "lunr": "^2.3.9", - "marked": "^2.0.0", - "minimatch": "^3.0.0", - "progress": "^2.0.3", - "shelljs": "^0.8.4", - "shiki": "^0.9.2", - "typedoc-default-themes": "^0.12.7" - } - }, - "typedoc-default-themes": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.7.tgz", - "integrity": "sha512-0XAuGEqID+gon1+fhi4LycOEFM+5Mvm2PjwaiVZNAzU7pn3G2DEpsoXnFOPlLDnHY6ZW0BY0nO7ur9fHOFkBLQ==", - "dev": true - }, - "typescript": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", - "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", - "dev": true - }, - "uglify-js": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.2.tgz", - "integrity": "sha1-n1AyVUQnPCeyDlht7xQOdybFJeo=", - "dev": true, - "optional": true - }, - "universal-user-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.1.0.tgz", - "integrity": "sha1-Wr+8wDahukkMuUH4/WjEbTZp6OQ=", - "dev": true, - "requires": { - "os-name": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", - "dev": true - }, - "unzipper": { - "version": "0.8.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", - "integrity": "sha1-reBSTNL8FNEbjeJYviL50kfT95s=", - "dev": true, - "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "~1.0.10", - "listenercount": "~1.0.1", - "readable-stream": "~2.1.5", - "setimmediate": "~1.0.4" - }, + }, + "node_modules/eslint/node_modules/semver": { + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "bin": { + "semver": "bin/semver.js" + }, + "version": "7.3.4", + "engines": { + "node": ">=10" + }, + "dev": true, "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } + "lru-cache": "^6.0.0" + }, + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==" + }, + "node_modules/esquery/node_modules/estraverse": { + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "version": "5.2.0", + "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", + "engines": { + "node": ">=4.0" + }, + "dev": true + }, + "node_modules/onigasm": { + "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", + "dependencies": { + "lru-cache": "^5.1.1" + }, + "version": "2.2.5", + "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", + "dev": true + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "version": "3.6.0", + "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", + "engines": { + "node": ">= 6" + }, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha1-qnFCYd55PoqCNHp7zJznTobyhgI=", - "dev": true, - "requires": { - "punycode": "^2.1.0" + }, + "node_modules/mocha/node_modules/string-width": { + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "version": "3.1.0", + "engines": { + "node": ">=6" + }, + "dev": true, + "dependencies": { + "strip-ansi": "^5.1.0", + "is-fullwidth-code-point": "^2.0.0", + "emoji-regex": "^7.0.1" + }, + "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=" + }, + "node_modules/caseless": { + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "version": "0.12.0", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/eslint-import-resolver-node/node_modules/ms": { + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/universalify": { + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "version": "0.1.2", + "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", + "engines": { + "node": ">= 4.0.0" + }, + "dev": true + }, + "node_modules/word-wrap": { + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "version": "1.2.3", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/agent-base": { + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "version": "4.3.0", + "engines": { + "node": ">= 4.0.0" + }, + "dev": true, + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "integrity": "sha1-gWXwHENgCbzK0LHRIvBe13Dvxu4=" + }, + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "engines": { + "node": ">=8" + }, + "dev": true, + "version": "3.1.1", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "node_modules/object-assign": { + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "version": "4.1.1", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" } - }, - "url-join": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", - "integrity": "sha1-HbSK1CLTQCRpqH99l73r/k+x48g=", - "dev": true - }, - "url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=", - "dev": true - }, - "v8-compile-cache": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", - "integrity": "sha1-VLw83UMxe8qR413K8wWxpyN950U=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", + }, + "node_modules/@typescript-eslint/scope-manager": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.14.2.tgz", + "funding": { + "url": "https://opencollective.com/typescript-eslint", + "type": "opencollective" + }, + "version": "4.14.2", + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "dev": true, + "dependencies": { + "@typescript-eslint/visitor-keys": "4.14.2", + "@typescript-eslint/types": "4.14.2" + }, + "integrity": "sha512-cuV9wMrzKm6yIuV48aTPfIeqErt5xceTheAgk70N1V4/2Ecj+fhl34iro/vIssJlb7XtzcaD07hWk7Jk0nKghg==" + }, + "node_modules/spdx-correct": { + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "dependencies": { + "spdx-license-ids": "^3.0.0", "spdx-expression-parse": "^3.0.0" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + }, + "version": "3.1.1", + "integrity": "sha1-3s6BrJweZxPl99G28X1Gj6U9iak=", "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + }, + "node_modules/cross-spawn": { + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "version": "6.0.5", + "engines": { + "node": ">=4.8" + }, + "dev": true, + "dependencies": { + "shebang-command": "^1.2.0", + "semver": "^5.5.0", + "path-key": "^2.0.1", + "which": "^1.2.9", + "nice-try": "^1.0.4" + }, + "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=" + }, + "node_modules/uri-js": { + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "dependencies": { + "punycode": "^2.1.0" + }, + "version": "4.4.0", + "integrity": "sha1-qnFCYd55PoqCNHp7zJznTobyhgI=", "dev": true - }, - "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", - "requires": { + }, + "node_modules/acorn": { + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + }, + "dev": true, + "version": "7.4.1", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "node_modules/natural-compare": { + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "version": "1.4.0", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/lodash.pad": { + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "version": "4.5.1", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.14.2.tgz", + "funding": { + "url": "https://opencollective.com/typescript-eslint", + "type": "opencollective" + }, + "version": "4.14.2", + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "dev": true, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + }, + "dependencies": { + "semver": "^7.3.2", + "lodash": "^4.17.15", + "@typescript-eslint/experimental-utils": "4.14.2", + "@typescript-eslint/scope-manager": "4.14.2", + "functional-red-black-tree": "^1.0.1", + "debug": "^4.1.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "integrity": "sha512-uMGfG7GFYK/nYutK/iqYJv6K/Xuog/vrRRZX9aEP4Zv1jsYXuvFUMDFLhUnc8WFv3D2R5QhNQL3VYKmvLS5zsQ==" + }, + "node_modules/mocha/node_modules/is-fullwidth-code-point": { + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + }, + "dev": true + }, + "node_modules/slash": { + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/@types/node": { + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.8.tgz", + "version": "14.11.8", + "integrity": "sha1-/iAS8jVeTOCLykSus6u7Ic+I0z8=", + "dev": true + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/minimist": { + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "version": "1.2.5", + "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=" + }, + "node_modules/pkg-dir": { + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "version": "2.0.0", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=" + }, + "node_modules/has-symbols": { + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", + "engines": { + "node": ">= 0.4" + }, + "dev": true + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "version": "2.0.1", + "engines": { + "node": ">=7.0.0" + }, + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + }, + "node_modules/mocha/node_modules/p-locate": { + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "version": "5.0.0", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" + }, + "node_modules/es-to-primitive": { + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "version": "1.2.1", + "engines": { + "node": ">= 0.4" + }, + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-symbol": "^1.0.2", + "is-date-object": "^1.0.1" + }, + "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=" + }, + "node_modules/log-symbols/node_modules/color-convert": { + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "version": "2.0.1", + "engines": { + "node": ">=7.0.0" + }, + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + }, + "node_modules/mocha/node_modules/find-up": { + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "version": "5.0.0", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" + }, + "node_modules/eslint/node_modules/lru-cache": { + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "version": "6.0.0", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" + }, + "node_modules/nanoid": { + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || >=13.7" + }, + "dev": true, + "version": "3.1.12", + "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==" + }, + "node_modules/object.values": { + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "version": "1.1.1", + "engines": { + "node": ">= 0.4" + }, + "dev": true, + "dependencies": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + }, + "integrity": "sha1-aKmezeNWt+kpWjxeDOMdyMlT3l4=" + }, + "node_modules/@babel/helper-validator-identifier": { + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "version": "7.10.4", + "integrity": "sha1-p4x6clHgH2FlEtMbEK3PUq2l4NI=", + "dev": true + }, + "node_modules/is-typedarray": { + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/load-json-file": { + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "version": "2.0.0", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "parse-json": "^2.2.0", + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=" + }, + "node_modules/read-pkg-up": { + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "version": "2.0.0", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "read-pkg": "^2.0.0", + "find-up": "^2.0.0" + }, + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=" + }, + "node_modules/normalize-path": { + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/assert-plus": { + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + }, + "dev": true + }, + "node_modules/getpass": { + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "version": "0.1.7", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true + }, + "node_modules/psl": { + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "version": "1.8.0", + "integrity": "sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ=", + "dev": true + }, + "node_modules/eslint-module-utils/node_modules/ms": { + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "version": "2.0.0", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/bl/node_modules/readable-stream": { + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "version": "3.6.0", + "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", + "engines": { + "node": ">= 6" + }, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "node_modules/eslint/node_modules/cross-spawn": { + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "version": "7.0.3", + "engines": { + "node": ">= 8" + }, + "dev": true, + "dependencies": { + "shebang-command": "^2.0.0", + "which": "^2.0.1", + "path-key": "^3.1.0" + }, + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + }, + "node_modules/https-proxy-agent": { + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "version": "2.2.4", + "engines": { + "node": ">= 4.5.0" + }, + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "agent-base": "^4.3.0" + }, + "integrity": "sha1-TuenN6vZJniik9mzShr00NCMeHs=" + }, + "node_modules/ansi-styles": { + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "version": "3.2.1", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=" + }, + "node_modules/json-schema-traverse": { + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "version": "0.4.1", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true + }, + "node_modules/buffers": { + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "version": "0.1.1", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "engines": { + "node": ">=0.2.0" + }, + "dev": true + }, + "node_modules/eslint": { + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.19.0.tgz", + "bin": { + "eslint": "bin/eslint.js" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "version": "7.19.0", + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "dev": true, + "dependencies": { + "semver": "^7.2.1", + "glob-parent": "^5.0.0", + "cross-spawn": "^7.0.2", + "js-yaml": "^3.13.1", + "globals": "^12.1.0", + "doctrine": "^3.0.0", + "table": "^6.0.4", + "optionator": "^0.9.1", + "espree": "^7.3.1", + "import-fresh": "^3.0.0", + "ignore": "^4.0.6", + "enquirer": "^2.3.5", + "natural-compare": "^1.4.0", + "regexpp": "^3.1.0", + "v8-compile-cache": "^2.0.3", + "ajv": "^6.10.0", + "@eslint/eslintrc": "^0.3.0", + "eslint-scope": "^5.1.1", + "progress": "^2.0.0", + "minimatch": "^3.0.4", + "file-entry-cache": "^6.0.0", + "is-glob": "^4.0.0", + "strip-ansi": "^6.0.0", + "levn": "^0.4.1", + "eslint-visitor-keys": "^2.0.0", + "text-table": "^0.2.0", + "@babel/code-frame": "^7.0.0", + "eslint-utils": "^2.1.0", + "esutils": "^2.0.2", + "lodash": "^4.17.20", + "esquery": "^1.2.0", + "strip-json-comments": "^3.1.0", + "chalk": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "debug": "^4.0.1", + "imurmurhash": "^0.1.4" + }, + "integrity": "sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==" + }, + "node_modules/wide-align": { + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "version": "1.1.3", + "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", + "dependencies": { "string-width": "^1.0.2 || 2" } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true - }, - "windows-release": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", - "integrity": "sha1-HBACfHIldD7sa4nfFg1kwuApOZk=", - "dev": true, - "requires": { - "execa": "^1.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "workerpool": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", - "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", - "dev": true - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "dev": true, - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha1-Ew8JcC667vJlDVTObj5XBvek+zg=", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, + }, + "node_modules/string_decoder": { + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "version": "1.1.1", + "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", - "dev": true - } + "safe-buffer": "~5.1.0" } - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, + }, + "node_modules/@types/klaw-sync": { + "resolved": "https://registry.npmjs.org/@types/klaw-sync/-/klaw-sync-6.0.0.tgz", "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - } + "@types/node": "*" + }, + "version": "6.0.0", + "integrity": "sha1-/ws2YB76qhCdUTxM7RCTEf0GujY=", + "dev": true + }, + "node_modules/strip-bom": { + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "engines": { + "node": ">=4" + }, + "dev": true + }, + "node_modules/@babel/code-frame": { + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "dependencies": { + "@babel/highlight": "^7.10.4" + }, + "version": "7.10.4", + "integrity": "sha1-Fo2ho26Q2miujUnA8bSMfGJJITo=", + "dev": true + }, + "node_modules/jsonc/node_modules/strip-bom": { + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "version": "4.0.0", + "integrity": "sha1-nDUFwdtFvO3KPZz3oW9cWqOQGHg=", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/serialize-javascript": { + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "dependencies": { + "randombytes": "^2.1.0" + }, + "version": "5.0.1", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "version": "1.0.1", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/buffer": { + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "version": "5.6.0", + "integrity": "sha1-oxdJ3H2B2E2wir+Te2uMQDP2J4Y=", + "dependencies": { + "ieee754": "^1.1.4", + "base64-js": "^1.0.2" } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + }, + "node_modules/github-from-package": { + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "version": "0.0.0", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, + "node_modules/@protobufjs/eventemitter": { + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "version": "1.1.0", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", + "dev": true + }, + "node_modules/url-join": { + "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", + "version": "0.0.1", + "integrity": "sha1-HbSK1CLTQCRpqH99l73r/k+x48g=", + "dev": true + }, + "node_modules/globals": { + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "version": "12.4.0", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "integrity": "sha1-oYgTV2pBsAokqX5/gVkYwuGZJfg=" + }, + "node_modules/request": { + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "version": "2.88.2", + "engines": { + "node": ">= 6" + }, + "dev": true, + "dependencies": { + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "extend": "~3.0.2", + "http-signature": "~1.2.0", + "json-stringify-safe": "~5.0.1", + "uuid": "^3.3.2", + "performance-now": "^2.1.0", + "caseless": "~0.12.0", + "isstream": "~0.1.2", + "form-data": "~2.3.2", + "oauth-sign": "~0.9.0", + "tough-cookie": "~2.5.0", + "combined-stream": "~1.0.6", + "mime-types": "~2.1.19", + "tunnel-agent": "^0.6.0", + "aws-sign2": "~0.7.0", + "is-typedarray": "~1.0.0", + "forever-agent": "~0.6.1", + "aws4": "^1.8.0", + "har-validator": "~5.1.3" + }, + "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=" + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "dependencies": { + "ms": "2.0.0" + }, + "version": "2.6.9", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true + }, + "node_modules/verror": { + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "version": "1.10.0", + "engines": [ + "node >=0.6.0" + ], + "dev": true, + "dependencies": { + "core-util-is": "1.0.2", + "assert-plus": "^1.0.0", + "extsprintf": "^1.2.0" + }, + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=" + }, + "node_modules/mocha/node_modules/p-limit": { + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "version": "3.1.0", + "engines": { + "node": ">=10" + }, + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" + }, + "node_modules/at-least-node": { + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-YCzUtG6EStTv/JKoARo8RuAjjcI=", + "engines": { + "node": ">= 4.0.0" + }, + "dev": true + }, + "node_modules/jsonc": { + "resolved": "https://registry.npmjs.org/jsonc/-/jsonc-2.0.0.tgz", + "version": "2.0.0", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0", + "parse-json": "^4.0.0", + "strip-json-comments": "^3.0.1", + "graceful-fs": "^4.1.15", + "mkdirp": "^0.5.1", + "fast-safe-stringify": "^2.0.6" + }, + "integrity": "sha1-niolEA0WSpu4ZMV1F1Y3F/qIJVE=" + }, + "node_modules/memory-stream/node_modules/isarray": { + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "version": "0.0.1", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/lodash.padstart": { + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "version": "4.6.1", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", + "dev": true + }, + "node_modules/json-schema": { + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "version": "0.2.3", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/aproba": { + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "version": "1.2.0", + "integrity": "sha1-aALmJk79GMeQobDVF/DyYnvyyUo=" + }, + "node_modules/@protobufjs/base64": { + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "version": "1.1.2", + "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU=", + "dev": true + }, + "node_modules/extend": { + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "version": "3.0.2", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=", + "dev": true + }, + "node_modules/balanced-match": { + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "version": "1.0.0", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/fast-levenshtein": { + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "version": "2.0.6", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/eslint-plugin-import": { + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "version": "2.22.1", + "engines": { + "node": ">=4" + }, + "dev": true, + "dependencies": { + "minimatch": "^3.0.4", + "resolve": "^1.17.0", + "contains-path": "^0.1.0", + "object.values": "^1.1.1", + "array.prototype.flat": "^1.2.3", + "eslint-import-resolver-node": "^0.3.4", + "read-pkg-up": "^2.0.0", + "tsconfig-paths": "^3.9.0", + "doctrine": "1.5.0", + "debug": "^2.6.9", + "array-includes": "^3.1.1", + "has": "^1.0.3", + "eslint-module-utils": "^2.6.0" + }, + "integrity": "sha1-CJbH5qDPRBCaLZe5WQPCu2iddwI=" + }, + "node_modules/is-callable": { + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "version": "1.2.2", + "integrity": "sha1-x8ZxXNItTdtI0+GZcCI6zquwgNk=", + "engines": { + "node": ">= 0.4" + }, + "dev": true + }, + "node_modules/binary-extensions": { + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "version": "2.2.0", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/mocha/node_modules/yargs": { + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "dependencies": { + "which-module": "^2.0.0", + "find-up": "^3.0.0", + "y18n": "^4.0.0", + "get-caller-file": "^2.0.1", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "require-directory": "^2.1.1", + "cliui": "^5.0.0", + "require-main-filename": "^2.0.0", + "yargs-parser": "^13.1.2" + }, + "version": "13.3.2", + "integrity": "sha1-rX/+/sGqWVZayRX4Lcyzipwxot0=", + "dev": true + }, + "node_modules/mocha/node_modules/which": { + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "bin": { + "node-which": "bin/node-which" + }, + "version": "2.0.2", + "engines": { + "node": ">= 8" + }, + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + }, + "node_modules/js-yaml": { + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "bin": { + "js-yaml": "bin/js-yaml.js" + }, + "version": "3.14.0", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "integrity": "sha1-p6NBcPJqIbsWJCTYray0ETpp5II=" + }, + "node_modules/json5": { + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "bin": { + "json5": "lib/cli.js" + }, + "version": "1.0.1", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=" + }, + "node_modules/eslint/node_modules/supports-color": { + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "version": "7.2.0", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + }, + "node_modules/source-map": { + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "version": "0.6.1", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "engines": { + "node": ">=0.10.0" + }, + "dev": true + }, + "node_modules/detect-libc": { + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "version": "1.0.3", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/has-unicode": { + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "version": "2.0.1", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/eslint/node_modules/ansi-styles": { + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + }, + "version": "4.3.0", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + }, + "node_modules/eslint/node_modules/shebang-regex": { + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "version": "3.0.0", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + }, + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "version": "7.2.0", + "engines": { + "node": ">=8" + }, + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + }, + "node_modules/@types/minimist": { + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "version": "1.2.1", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", + "dev": true + }, + "node_modules/bl": { + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "version": "4.0.3", + "integrity": "sha1-EtYoetwpCA4ipwXldksqlSLNxIk=", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/is-string": { + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "version": "1.0.5", + "integrity": "sha1-QEk+0ZjvP/R3uMf5L2ROyCpc06Y=", + "engines": { + "node": ">= 0.4" + }, + "dev": true + }, + "node_modules/run-parallel": { + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "version": "1.1.9", + "integrity": "sha1-yd06fPn0ssS2JE4XOm7YZuYd1nk=", + "dev": true + }, + "node_modules/commander": { + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "version": "2.20.3", + "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", + "dev": true + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "engines": { + "node": ">=10" + }, + "dev": true, + "version": "4.0.0", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" + }, + "node_modules/unzipper/node_modules/process-nextick-args": { + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "version": "1.0.7", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "node_modules/esrecurse/node_modules/estraverse": { + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "version": "5.2.0", + "integrity": "sha1-MH30JUfmzHMk088DwVXVzbjFOIA=", + "engines": { + "node": ">=4.0" + }, + "dev": true + }, + "node_modules/universal-user-agent": { + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.1.0.tgz", + "dependencies": { + "os-name": "^3.0.0" + }, + "version": "2.1.0", + "integrity": "sha1-Wr+8wDahukkMuUH4/WjEbTZp6OQ=", "dev": true } - } -} + }, + "requires": true, + "name": "onnxruntime" +} \ No newline at end of file diff --git a/nodejs/package.json b/nodejs/package.json index 4187e9649a..2669c5e6fd 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -1,72 +1,72 @@ { - "name": "onnxruntime", - "description": "Node.js binding of ONNXRuntime", - "version": "1.6.0", - "main": "./lib/index.js", - "types": "./types/lib/index.d.ts", - "scripts": { - "install": "prebuild-install -r napi || (tsc && node ./script/build)", - "build": "tsc && node ./script/build", - "buildd": "tsc && node ./script/build --config=Debug", - "buildr": "tsc && node ./script/build --config=RelWithDebInfo", - "rebuild": "tsc && node ./script/build --rebuild", - "rebuildd": "tsc && node ./script/build --rebuild --config=Debug", - "rebuildr": "tsc && node ./script/build --rebuild --config=RelWithDebInfo", - "test": "mocha ./test/test-main", - "lint": "eslint . --ext .ts", - "prepack": "node ./script/pack-prebuild", - "format": "clang-format --glob=\"{{lib,test,script}/**/*.ts,src/**/*.{cc,h}}\" --style=file -i" - }, - "repository": { - "type": "git", - "url": "https://github.com/Microsoft/onnxruntime.git" - }, - "keywords": [ - "ONNX", - "ONNX Runtime" - ], - "os": [ - "win32", - "darwin", - "linux" - ], "binary": { - "module_path": "./bin", - "host": "https://onnxruntimetestdata.blob.core.windows.net/onnxruntime-node-prebuild/", + "module_path": "./bin", + "host": "https://onnxruntimetestdata.blob.core.windows.net/onnxruntime-node-prebuild/", "napi_versions": [ 3 ] - }, - "author": "fs-eire", - "license": "MIT", - "devDependencies": { - "@types/fs-extra": "^9.0.6", - "@types/klaw-sync": "^6.0.0", - "@types/minimist": "1.2.1", - "@types/mocha": "^8.2.0", - "@types/tar-stream": "^2.2.0", - "@typescript-eslint/eslint-plugin": "^4.14.2", - "@typescript-eslint/parser": "^4.14.2", - "clang-format": "^1.5.0", - "cmake-js": "^6.1.0", - "eslint": "^7.19.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-jsdoc": "^31.6.0", - "eslint-plugin-prefer-arrow": "^1.2.3", - "fs-extra": "^9.1.0", - "globby": "^11.0.2", - "jsonc": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.5", - "mocha": "^8.2.1", - "node-addon-api": "^3.1.0", - "node-pre-gyp-github": "^1.4.3", - "onnx-proto": "^4.0.4", - "tar-stream": "^2.2.0", - "typedoc": "^0.20.25", - "typescript": "^4.1.3" - }, + }, + "license": "MIT", + "name": "onnxruntime", + "repository": { + "url": "https://github.com/Microsoft/onnxruntime.git", + "type": "git" + }, + "author": "fs-eire", + "version": "1.7.0", "dependencies": { "prebuild-install": "^6.0.0" - } -} + }, + "scripts": { + "lint": "eslint . --ext .ts", + "buildr": "tsc && node ./script/build --config=RelWithDebInfo", + "format": "clang-format --glob=\"{{lib,test,script}/**/*.ts,src/**/*.{cc,h}}\" --style=file -i", + "rebuild": "tsc && node ./script/build --rebuild", + "rebuildd": "tsc && node ./script/build --rebuild --config=Debug", + "buildd": "tsc && node ./script/build --config=Debug", + "build": "tsc && node ./script/build", + "install": "prebuild-install -r napi || (tsc && node ./script/build)", + "test": "mocha ./test/test-main", + "prepack": "node ./script/pack-prebuild", + "rebuildr": "tsc && node ./script/build --rebuild --config=RelWithDebInfo" + }, + "keywords": [ + "ONNX", + "ONNX Runtime" + ], + "devDependencies": { + "typedoc": "^0.20.25", + "mocha": "^8.2.1", + "@types/fs-extra": "^9.0.6", + "@types/tar-stream": "^2.2.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.5", + "@typescript-eslint/parser": "^4.14.2", + "clang-format": "^1.5.0", + "@types/klaw-sync": "^6.0.0", + "node-addon-api": "^3.1.0", + "cmake-js": "^6.1.0", + "eslint-plugin-prefer-arrow": "^1.2.3", + "typescript": "^4.1.3", + "jsonc": "^2.0.0", + "@types/mocha": "^8.2.0", + "node-pre-gyp-github": "^1.4.3", + "@typescript-eslint/eslint-plugin": "^4.14.2", + "eslint-plugin-jsdoc": "^31.6.0", + "onnx-proto": "^4.0.4", + "globby": "^11.0.2", + "fs-extra": "^9.1.0", + "eslint": "^7.19.0", + "tar-stream": "^2.2.0", + "@types/minimist": "1.2.1", + "eslint-plugin-import": "^2.22.1" + }, + "main": "./lib/index.js", + "os": [ + "win32", + "darwin", + "linux" + ], + "types": "./types/lib/index.d.ts", + "description": "Node.js binding of ONNXRuntime" +} \ No newline at end of file diff --git a/onnxruntime/__init__.py b/onnxruntime/__init__.py index b74c899bc1..8eeca65890 100644 --- a/onnxruntime/__init__.py +++ b/onnxruntime/__init__.py @@ -7,7 +7,7 @@ ONNX Runtime is a performance-focused scoring engine for Open Neural Network Exc For more information on ONNX Runtime, please see `aka.ms/onnxruntime `_ or the `Github project `_. """ -__version__ = "1.6.0" +__version__ = "1.7.0" __author__ = "Microsoft" import os diff --git a/onnxruntime/core/session/onnxruntime_c_api.cc b/onnxruntime/core/session/onnxruntime_c_api.cc index beb05e20db..ecafbc4ce5 100644 --- a/onnxruntime/core/session/onnxruntime_c_api.cc +++ b/onnxruntime/core/session/onnxruntime_c_api.cc @@ -2104,12 +2104,11 @@ static constexpr OrtApi ort_api_1_to_7 = { &OrtApis::ReleaseArenaCfg, // End of Version 6 - DO NOT MODIFY ABOVE (see above text for more information) - // Version 7 - In development, feel free to add/remove/rearrange here &OrtApis::ModelMetadataGetGraphDescription, - &OrtApis::SessionOptionsAppendExecutionProvider_TensorRT, &OrtApis::SetCurrentGpuDeviceId, &OrtApis::GetCurrentGpuDeviceId, + // End of Version 7 - DO NOT MODIFY ABOVE (see above text for more information) }; // Assert to do a limited check to ensure Version 1 of OrtApi never changes (will detect an addition or deletion but not if they cancel out each other) diff --git a/package/rpm/onnxruntime.spec b/package/rpm/onnxruntime.spec index 164809dccd..1866f3353d 100644 --- a/package/rpm/onnxruntime.spec +++ b/package/rpm/onnxruntime.spec @@ -1,5 +1,5 @@ Name: onnxruntime -Version: 1.6.0 +Version: 1.7.0 Release: 1%{?dist} Summary: onnxruntime From b1a12b49b71a24d3236895ab0fa74638ab63d0da Mon Sep 17 00:00:00 2001 From: Yufeng Li Date: Wed, 17 Feb 2021 19:55:19 -0800 Subject: [PATCH 02/37] Avoid removing constant weight that is graph output (#6735) --- .../E2E_example_model/image_classification/cpu/run.py | 5 +++-- onnxruntime/python/tools/quantization/onnx_model.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/onnxruntime/python/tools/quantization/E2E_example_model/image_classification/cpu/run.py b/onnxruntime/python/tools/quantization/E2E_example_model/image_classification/cpu/run.py index 5212967a8d..100057cf95 100644 --- a/onnxruntime/python/tools/quantization/E2E_example_model/image_classification/cpu/run.py +++ b/onnxruntime/python/tools/quantization/E2E_example_model/image_classification/cpu/run.py @@ -12,7 +12,7 @@ from PIL import Image import onnx import onnxruntime from onnx import helper, TensorProto, numpy_helper -from onnxruntime.quantization import quantize_static, CalibrationDataReader, QuantFormat +from onnxruntime.quantization import quantize_static, CalibrationDataReader, QuantFormat, QuantType class ResNet50DataReader(CalibrationDataReader): @@ -107,7 +107,8 @@ def main(): output_model_path, dr, quant_format=args.quant_format, - per_channel=args.per_channel) + per_channel=args.per_channel, + weight_type=QuantType.QInt8) print('Calibrated and quantized model saved.') print('benchmarking fp32 model...') diff --git a/onnxruntime/python/tools/quantization/onnx_model.py b/onnxruntime/python/tools/quantization/onnx_model.py index 6ba2e99a99..22af9071aa 100644 --- a/onnxruntime/python/tools/quantization/onnx_model.py +++ b/onnxruntime/python/tools/quantization/onnx_model.py @@ -232,14 +232,15 @@ class ONNXModel: unused_nodes = [] nodes = self.nodes() for node in nodes: - if node.op_type == "Constant" and node.output[0] not in input_name_to_nodes: + if node.op_type == "Constant" and not self.is_graph_output( + node.output[0]) and node.output[0] not in input_name_to_nodes: unused_nodes.append(node) self.remove_nodes(unused_nodes) ununsed_weights = [] for w in self.initializer(): - if w.name not in input_name_to_nodes: + if w.name not in input_name_to_nodes and not self.is_graph_output(w.name): ununsed_weights.append(w) # Remove from graph.input for graph_input in self.graph().input: From 53eb948f4c4524565ade8af4d0171bef226363d1 Mon Sep 17 00:00:00 2001 From: stevenlix <38092805+stevenlix@users.noreply.github.com> Date: Thu, 18 Feb 2021 04:30:47 -0800 Subject: [PATCH 03/37] Upgrade TensorRT to v7.2.2 (#6452) * upgrade to TensorRT 7.2.2 * extend GPU tensorrt CI timeout to 150 minutes * update docker image name * disable user interaction to avoid tensorrt container stuck when install tzdata * upgrade to libssl1.1 for ubuntu20.04 * remove libicu60 from ubuntu20.04 * add libicu66 for ubuntu20.04 * debug * llvm * llvm * disable ReverseSequenceTest.InvalidInput * disable ReverseSequenceTest.InvalidInput * fix issues * fix issues * Update linux-gpu-tensorrt-ci-pipeline.yml * disable warning 4458 for TensorRT parser * update onnx-tensorrt submodule * disable warnings for TensorRT parser * update onnx-tensorrt submodule to include latest bug fixes * update setup_env_trt * update pool for win trt ci pipeline' Co-authored-by: George Wu --- .gitmodules | 1 - cgmanifests/submodules/cgmanifest.json | 2 +- cmake/external/onnx-tensorrt | 2 +- cmake/onnxruntime_providers.cmake | 2 +- dockerfiles/Dockerfile.tensorrt | 2 +- .../cpu/tensor/reverse_sequence_test.cc | 4 +- .../linux-gpu-tensorrt-ci-perf-pipeline.yml | 2 +- .../linux-gpu-tensorrt-ci-pipeline.yml | 4 +- .../linux-multi-gpu-tensorrt-ci-pipeline.yml | 4 +- .../win-gpu-tensorrt-ci-pipeline.yml | 6 +- .../linux/docker/Dockerfile.ubuntu_tensorrt | 13 ++-- .../linux/docker/scripts/install_ubuntu.sh | 60 +++++++++++++++++-- .../ci_build/github/linux/run_dockerbuild.sh | 4 +- .../ci_build/github/windows/setup_env_trt.bat | 2 +- 14 files changed, 79 insertions(+), 29 deletions(-) diff --git a/.gitmodules b/.gitmodules index 567e643b6e..093983c00d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -68,4 +68,3 @@ [submodule "cmake/external/onnx-tensorrt"] path = cmake/external/onnx-tensorrt url = https://github.com/onnx/onnx-tensorrt.git - branch = 7.1 diff --git a/cgmanifests/submodules/cgmanifest.json b/cgmanifests/submodules/cgmanifest.json index 3f894e4689..47e84a421a 100644 --- a/cgmanifests/submodules/cgmanifest.json +++ b/cgmanifests/submodules/cgmanifest.json @@ -272,7 +272,7 @@ "component": { "type": "git", "git": { - "commitHash": "a3a4e38b2dfa7a62b6dcae33c0d1678b3bb5ef2a", + "commitHash": "dc22bb323ece3c65419717be8a0d3d0f318a61fa", "repositoryUrl": "https://github.com/onnx/onnx-tensorrt.git" }, "comments": "git submodule at cmake/external/onnx-tensorrt" diff --git a/cmake/external/onnx-tensorrt b/cmake/external/onnx-tensorrt index b3eda616d3..dc22bb323e 160000 --- a/cmake/external/onnx-tensorrt +++ b/cmake/external/onnx-tensorrt @@ -1 +1 @@ -Subproject commit b3eda616d3bb60dcd40a142e4a0a2ad95a7aa166 +Subproject commit dc22bb323ece3c65419717be8a0d3d0f318a61fa diff --git a/cmake/onnxruntime_providers.cmake b/cmake/onnxruntime_providers.cmake index a34b9f9f97..4ce604158c 100644 --- a/cmake/onnxruntime_providers.cmake +++ b/cmake/onnxruntime_providers.cmake @@ -426,7 +426,7 @@ if (onnxruntime_USE_TENSORRT) if (WIN32) add_definitions(-D_SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING=1) set(OLD_CMAKE_CUDA_FLAGS ${CMAKE_CUDA_FLAGS}) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4996 /wd4244 /wd4267 /wd4099 /wd4551 /wd4505 /wd4515 /wd4706 /wd4456 /wd4324 /wd4701 /wd4804 /wd4702") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4996 /wd4244 /wd4267 /wd4099 /wd4551 /wd4505 /wd4515 /wd4706 /wd4456 /wd4324 /wd4701 /wd4804 /wd4702 /wd4458 /wd4703") if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4805") endif() diff --git a/dockerfiles/Dockerfile.tensorrt b/dockerfiles/Dockerfile.tensorrt index 2ea672c3cb..4c8d980f93 100644 --- a/dockerfiles/Dockerfile.tensorrt +++ b/dockerfiles/Dockerfile.tensorrt @@ -5,7 +5,7 @@ # Dockerfile to run ONNXRuntime with TensorRT integration # nVidia TensorRT Base Image -FROM nvcr.io/nvidia/tensorrt:20.07.1-py3 +FROM nvcr.io/nvidia/tensorrt:20.12-py3 MAINTAINER Vinitra Swamy "viswamy@microsoft.com" ARG ONNXRUNTIME_REPO=https://github.com/Microsoft/onnxruntime diff --git a/onnxruntime/test/providers/cpu/tensor/reverse_sequence_test.cc b/onnxruntime/test/providers/cpu/tensor/reverse_sequence_test.cc index aa20c9b60c..a5961f5042 100644 --- a/onnxruntime/test/providers/cpu/tensor/reverse_sequence_test.cc +++ b/onnxruntime/test/providers/cpu/tensor/reverse_sequence_test.cc @@ -114,7 +114,7 @@ TEST(ReverseSequenceTest, InvalidInput) { test.AddInput("input", input_shape, input); test.AddInput("sequence_lens", {batch_size}, sequence_lens); test.AddOutput("Y", input_shape, expected_output); - test.Run(test::OpTester::ExpectResult::kExpectFailure, err_msg); + test.Run(test::OpTester::ExpectResult::kExpectFailure, err_msg, {kTensorrtExecutionProvider}); //TensorRT engine build error }; check_bad_axis(2, 1, {1, seq_size, batch_size}, "Invalid batch_axis of 2. Must be 0 or 1"); @@ -140,7 +140,7 @@ TEST(ReverseSequenceTest, InvalidInput) { test.AddInput("sequence_lens", {3}, sequence_lens); test.AddOutput("Y", {2, 4, 1}, expected_output); test.Run(test::OpTester::ExpectResult::kExpectFailure, - "sequence_lens shape must be {batch_size}. Got:{3}. batch_size=2"); + "sequence_lens shape must be {batch_size}. Got:{3}. batch_size=2", {kTensorrtExecutionProvider}); //TensorRT engine build error } } diff --git a/tools/ci_build/github/azure-pipelines/linux-gpu-tensorrt-ci-perf-pipeline.yml b/tools/ci_build/github/azure-pipelines/linux-gpu-tensorrt-ci-perf-pipeline.yml index 9accca485d..9f5d4f282b 100644 --- a/tools/ci_build/github/azure-pipelines/linux-gpu-tensorrt-ci-perf-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/linux-gpu-tensorrt-ci-perf-pipeline.yml @@ -7,7 +7,7 @@ jobs: steps: #- template: templates/set-test-data-variables-step.yml # - - script: 'python3 ort_build_latest.py -c /usr/local/cuda-11.0/ -t /home/hcsuser/tensorrt/TensorRT-7.1.3.4/ -o /home/hcsuser/repos/onnxruntime' + - script: 'python3 ort_build_latest.py -c /usr/local/cuda-11.1/ -t /home/hcsuser/tensorrt/TensorRT-7.2.2/ -o /home/hcsuser/repos/onnxruntime' displayName: 'Upgrade ORT wheel' workingDirectory: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/' diff --git a/tools/ci_build/github/azure-pipelines/linux-gpu-tensorrt-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/linux-gpu-tensorrt-ci-pipeline.yml index 4c235e217a..df24bf5062 100644 --- a/tools/ci_build/github/azure-pipelines/linux-gpu-tensorrt-ci-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/linux-gpu-tensorrt-ci-pipeline.yml @@ -8,8 +8,8 @@ jobs: - template: templates/run-docker-build-steps.yml parameters: - # Latest TensorRT container only supports ubuntu18.04 - RunDockerBuildArgs: '-o ubuntu18.04 -d tensorrt -r $(Build.BinariesDirectory) -p 3.6 -x "--build_wheel"' + # Latest TensorRT container only supports ubuntu20.04 and python 3.8 + RunDockerBuildArgs: '-o ubuntu20.04 -d tensorrt -r $(Build.BinariesDirectory) -p 3.8 -x "--build_wheel"' - template: templates/component-governance-component-detection-steps.yml parameters : diff --git a/tools/ci_build/github/azure-pipelines/linux-multi-gpu-tensorrt-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/linux-multi-gpu-tensorrt-ci-pipeline.yml index e51234a262..fdf252cdcc 100644 --- a/tools/ci_build/github/azure-pipelines/linux-multi-gpu-tensorrt-ci-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/linux-multi-gpu-tensorrt-ci-pipeline.yml @@ -3,7 +3,7 @@ jobs: parameters: AgentPool : 'Linux-Multi-GPU' JobName: 'Linux_CI_Multi_GPU_TensorRT_Dev' - # The latest TensorRT container only supports ubuntu18.04 - RunDockerBuildArgs: '-o ubuntu18.04 -d tensorrt -r $(Build.BinariesDirectory) -p 3.6 -x "--enable_multi_device_test"' + # The latest TensorRT container only supports ubuntu20.04 and python 3.8 + RunDockerBuildArgs: '-o ubuntu20.04 -d tensorrt -r $(Build.BinariesDirectory) -p 3.8 -x "--enable_multi_device_test"' DoNugetPack: 'false' ArtifactName: 'drop-linux' diff --git a/tools/ci_build/github/azure-pipelines/win-gpu-tensorrt-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/win-gpu-tensorrt-ci-pipeline.yml index 395e87c1f6..2b13a4e98a 100644 --- a/tools/ci_build/github/azure-pipelines/win-gpu-tensorrt-ci-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/win-gpu-tensorrt-ci-pipeline.yml @@ -1,6 +1,6 @@ jobs: - job: 'build' - pool: 'Win-GPU-2019' + pool: 'Win-TRT' variables: OrtPackageId: 'Microsoft.ML.OnnxRuntime' MsbuildArguments: '-detailedsummary -maxcpucount -consoleloggerparameters:PerformanceSummary' @@ -47,7 +47,7 @@ jobs: displayName: 'Generate cmake config' inputs: scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py' - arguments: '--config $(BuildConfig) --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --update --cmake_generator "Visual Studio 16 2019" --build_wheel --enable_onnx_tests --use_tensorrt --tensorrt_home="C:\local\TensorRT-7.1.3.4.cuda-11.0.cudnn8.0\TensorRT-7.1.3.4" --cuda_version=11.0 --cuda_home="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0" --cudnn_home="C:\local\cudnn-11.0-windows-x64-v8.0.2.39\cuda" --cmake_extra_defines CMAKE_SYSTEM_VERSION=10.0.18362.0' + arguments: '--config $(BuildConfig) --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --update --cmake_generator "Visual Studio 16 2019" --build_wheel --enable_onnx_tests --use_tensorrt --tensorrt_home="C:\local\TensorRT-7.2.2.3" --cuda_version=11.1 --cuda_home="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1" --cudnn_home="C:\local\cudnn-11.1-windows-x64-v8.0.5.39\cuda" --cmake_extra_defines CMAKE_SYSTEM_VERSION=10.0.18362.0' workingDirectory: '$(Build.BinariesDirectory)' - task: VSBuild@1 @@ -77,7 +77,7 @@ jobs: del wheel_filename_file python.exe -m pip install -q --upgrade %WHEEL_FILENAME% set PATH=$(Build.BinariesDirectory)\$(BuildConfig)\$(BuildConfig);%PATH% - python $(Build.SourcesDirectory)\tools\ci_build\build.py --config $(BuildConfig) --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --test --cmake_generator "Visual Studio 16 2019" --build_wheel --enable_onnx_tests --use_tensorrt --tensorrt_home="C:\local\TensorRT-7.1.3.4.cuda-11.0.cudnn8.0\TensorRT-7.1.3.4" --cuda_version=11.0 --cuda_home="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0" --cudnn_home="C:\local\cudnn-11.0-windows-x64-v8.0.2.39\cuda" --cmake_extra_defines CMAKE_SYSTEM_VERSION=10.0.18362.0 + python $(Build.SourcesDirectory)\tools\ci_build\build.py --config $(BuildConfig) --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --test --cmake_generator "Visual Studio 16 2019" --build_wheel --enable_onnx_tests --use_tensorrt --tensorrt_home="C:\local\TensorRT-7.2.2.3" --cuda_version=11.1 --cuda_home="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1" --cudnn_home="C:\local\cudnn-11.1-windows-x64-v8.0.5.39\cuda" --cmake_extra_defines CMAKE_SYSTEM_VERSION=10.0.18362.0 workingDirectory: '$(Build.BinariesDirectory)\$(BuildConfig)\$(BuildConfig)' displayName: 'Run tests' diff --git a/tools/ci_build/github/linux/docker/Dockerfile.ubuntu_tensorrt b/tools/ci_build/github/linux/docker/Dockerfile.ubuntu_tensorrt index 7e9d8cbe22..477ff4cbc6 100644 --- a/tools/ci_build/github/linux/docker/Dockerfile.ubuntu_tensorrt +++ b/tools/ci_build/github/linux/docker/Dockerfile.ubuntu_tensorrt @@ -1,10 +1,11 @@ -# Tag: nvcr.io/nvidia/tensorrt:20.07.1-py3 -# Label: com.nvidia.cuda.version: 11.0.194 -# Label: com.nvidia.cudnn.version: 8.0.1 -# Ubuntu 18.04 -FROM nvcr.io/nvidia/tensorrt:20.07.1-py3 +# Tag: nvcr.io/nvidia/tensorrt:20.12-py3 +# Label: com.nvidia.cuda.version: 11.1.1 +# Label: com.nvidia.cudnn.version: 8.0.5 +# Ubuntu 20.04 +FROM nvcr.io/nvidia/tensorrt:20.12-py3 -ARG PYTHON_VERSION=3.6 +ARG PYTHON_VERSION=3.8 +ARG DEBIAN_FRONTEND=noninteractive ADD scripts /tmp/scripts RUN /tmp/scripts/install_ubuntu.sh -p $PYTHON_VERSION && /tmp/scripts/install_deps.sh -p $PYTHON_VERSION && rm -rf /tmp/scripts \ diff --git a/tools/ci_build/github/linux/docker/scripts/install_ubuntu.sh b/tools/ci_build/github/linux/docker/scripts/install_ubuntu.sh index 85f07637d9..023855e1b5 100755 --- a/tools/ci_build/github/linux/docker/scripts/install_ubuntu.sh +++ b/tools/ci_build/github/linux/docker/scripts/install_ubuntu.sh @@ -55,7 +55,7 @@ if [ "$OS_VERSION" = "16.04" ]; then rsync libunwind8 libpng16-dev libexpat1-dev \ python3-setuptools python3-numpy python3-wheel python python3-pip python3-pytest \ openjdk-8-jdk" -else # ubuntu18.04 +elif [ "$OS_VERSION" = "18.04" ]; then PACKAGE_LIST="autotools-dev \ automake \ build-essential \ @@ -88,6 +88,39 @@ else # ubuntu18.04 rsync libunwind8 libpng-dev libexpat1-dev \ python3-setuptools python3-numpy python3-wheel python python3-pip python3-pytest \ openjdk-11-jdk" +else # ubuntu20.04 + PACKAGE_LIST="autotools-dev \ + automake \ + build-essential \ + git apt-transport-https apt-utils \ + ca-certificates \ + pkg-config \ + wget \ + zlib1g \ + zlib1g-dev \ + libssl-dev \ + curl libcurl4-openssl-dev \ + autoconf \ + sudo \ + gfortran \ + python3-dev \ + language-pack-en \ + libopenblas-dev \ + liblttng-ust0 \ + libcurl4 \ + libssl1.1 \ + libkrb5-3 \ + libicu66 \ + libtinfo-dev \ + libtool \ + openssh-server \ + aria2 \ + bzip2 \ + unzip \ + zip \ + rsync libunwind8 libpng-dev libexpat1-dev \ + python3-setuptools python3-numpy python3-wheel python python3-pip python3-pytest \ + openjdk-11-jdk" fi if [ $DEVICE_TYPE = "Normal" ]; then @@ -98,7 +131,6 @@ apt-get update && apt-get install -y --no-install-recommends $PACKAGE_LIST locale-gen en_US.UTF-8 update-locale LANG=en_US.UTF-8 -echo "Installing dotnet-sdk" if [ "$SYS_LONG_BIT" = "64" ]; then mkdir -p /tmp/dotnet aria2c -q -d /tmp/dotnet https://packages.microsoft.com/config/ubuntu/${OS_VERSION}/packages-microsoft-prod.deb @@ -123,7 +155,7 @@ if [ "$OS_VERSION" = "16.04" ]; then /usr/bin/python${PYTHON_VER} -m pip install --upgrade --force-reinstall pip==19.0.3 fi -else # ubuntu18.04 +elif [ "$OS_VERSION" = "18.04" ]; then if [ "$PYTHON_VER" != "3.6" ]; then add-apt-repository -y ppa:deadsnakes/ppa apt-get update @@ -137,14 +169,32 @@ else # ubuntu18.04 #put at /usr/local/. Then there will be two pips. /usr/bin/python${PYTHON_VER} -m pip install --upgrade --force-reinstall pip==19.0.3 fi + +else # ubuntu20.04 + if [ "$PYTHON_VER" != "3.8" ]; then + add-apt-repository -y ppa:deadsnakes/ppa + apt-get update + apt-get install -y --no-install-recommends \ + python${PYTHON_VER} \ + python${PYTHON_VER}-dev + update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VER} 1 + update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2 + update-alternatives --set python3 /usr/bin/python${PYTHON_VER} + #TODO: the old one(/usr/bin/pip3) should be uninstalled first. Because the one will be + #put at /usr/local/. Then there will be two pips. + /usr/bin/python${PYTHON_VER} -m pip install --upgrade --force-reinstall pip==19.0.3 + fi fi rm -rf /var/lib/apt/lists/* if [ "$SYS_LONG_BIT" = "64" ]; then if [ "$DEVICE_TYPE" = "Normal" ]; then - aria2c -q -d /tmp -o llvm.tar.xz http://releases.llvm.org/9.0.0/clang+llvm-9.0.0-x86_64-linux-gnu-ubuntu-${OS_VERSION}.tar.xz + if [ "$OS_VERSION" = "20.04" ]; then + aria2c -q -d /tmp -o llvm.tar.xz https://github.com/llvm/llvm-project/releases/download/llvmorg-11.0.0/llvm-project-11.0.0.tar.xz + else + aria2c -q -d /tmp -o llvm.tar.xz http://releases.llvm.org/9.0.0/clang+llvm-9.0.0-x86_64-linux-gnu-ubuntu-${OS_VERSION}.tar.xz + fi tar --strip 1 -Jxf /tmp/llvm.tar.xz -C /usr fi fi - diff --git a/tools/ci_build/github/linux/run_dockerbuild.sh b/tools/ci_build/github/linux/run_dockerbuild.sh index ec1a9b6c24..6e2d4511cf 100755 --- a/tools/ci_build/github/linux/run_dockerbuild.sh +++ b/tools/ci_build/github/linux/run_dockerbuild.sh @@ -87,8 +87,8 @@ else --docker-build-args="--build-arg BUILD_USER=onnxruntimedev --build-arg BUILD_UID=$(id -u) --build-arg PYTHON_VERSION=${PYTHON_VER} --build-arg INSTALL_DEPS_EXTRA_ARGS=\"${INSTALL_DEPS_EXTRA_ARGS}\"" \ --dockerfile $DOCKER_FILE --context . elif [ $BUILD_DEVICE = "tensorrt" ]; then - # TensorRT container release 20.07 - IMAGE="$BUILD_OS-cuda11.0-cudnn8.0-tensorrt7.1" + # TensorRT container release 20.12 + IMAGE="$BUILD_OS-cuda11.1-cudnn8.0-tensorrt7.2" DOCKER_FILE=Dockerfile.ubuntu_tensorrt $GET_DOCKER_IMAGE_CMD --repository "onnxruntime-$IMAGE" \ --docker-build-args="--build-arg BUILD_USER=onnxruntimedev --build-arg BUILD_UID=$(id -u) --build-arg PYTHON_VERSION=${PYTHON_VER}" \ diff --git a/tools/ci_build/github/windows/setup_env_trt.bat b/tools/ci_build/github/windows/setup_env_trt.bat index 1ab8e7ee73..f5ff7efb45 100644 --- a/tools/ci_build/github/windows/setup_env_trt.bat +++ b/tools/ci_build/github/windows/setup_env_trt.bat @@ -1,2 +1,2 @@ -set PATH=C:\azcopy;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0\bin;C:\local\cudnn-11.0-windows-x64-v8.0.2.39\cuda\bin;%PATH% +set PATH=C:\azcopy;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\bin;C:\local\cudnn-11.1-windows-x64-v8.0.5.39\cuda\bin;%PATH% set GRADLE_OPTS=-Dorg.gradle.daemon=false From 3722dd26925ac0915c731be0cdd6a722c0cd47ca Mon Sep 17 00:00:00 2001 From: "S. Manohar Karlapalem" Date: Thu, 18 Feb 2021 05:45:46 -0800 Subject: [PATCH 04/37] Update docs MCR image publishing policy change (#6743) ONNX Runtime 1.7 will the last release that will publish MCR container images for ONNX Runtime with OpenVINO EP. From ONNX Runtime 1.8 onwards, this will be discontinued. Users are advised to switch to using PyPi packages or build their own containers using dockerfiles. --- dockerfiles/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dockerfiles/README.md b/dockerfiles/README.md index b74a210129..b5e9b0379e 100644 --- a/dockerfiles/README.md +++ b/dockerfiles/README.md @@ -88,6 +88,8 @@ Use `docker pull` with any of the images and tags below to pull an image and try ### **1. Using MCR container images** +*Note: ONNX Runtime 1.7 will be the last release that will publish MCR container images. Please switch to using PyPi packages or bulding from Dockefile section below from ONNX Runtime 1.8 onwards.* + The unified MCR container image can be used to run an application on any of the target accelerators. In order to select the target accelerator, the application should explicitly specifiy the choice using the *device_type* configuration option for OpenVINO Execution provider. Refer to [OpenVINO EP runtime configuration documentation](https://github.com/microsoft/onnxruntime/blob/master/docs/execution_providers/OpenVINO-ExecutionProvider.md#runtime-configuration-options) for details on specifying this option in the application code. If the *device_type* runtime config option is not explicitly specified, CPU will be chosen as the hardware target execution. ### **2. Building from Dockerfile** From 67c478ede453fde70fcbd0b3f880aab419afd682 Mon Sep 17 00:00:00 2001 From: Chi Lo <54722500+chilo-ms@users.noreply.github.com> Date: Thu, 18 Feb 2021 05:50:59 -0800 Subject: [PATCH 05/37] Entropy method for calibration-based quantization (#6619) * Add entropy method * Update pre/post-preprocessing of yolov3 * Code refactor * Code refactor --- .../trt/yolov3/data_reader.py | 17 +- .../trt/yolov3/e2e_user_yolov3_example.py | 5 +- .../object_detection/trt/yolov3/evaluate.py | 262 ++++++++++++++-- .../trt/yolov3/postprocessing.py | 52 ++-- .../trt/yolov3/preprocessing.py | 143 ++++++++- .../python/tools/quantization/__init__.py | 2 +- .../python/tools/quantization/calibrate.py | 284 ++++++++++++++++-- .../python/tools/quantization/quant_utils.py | 26 ++ .../python/tools/quantization/quantize.py | 11 +- 9 files changed, 708 insertions(+), 94 deletions(-) diff --git a/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/data_reader.py b/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/data_reader.py index bba0144e25..7421b64bcb 100644 --- a/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/data_reader.py +++ b/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/data_reader.py @@ -1,5 +1,5 @@ from onnxruntime.quantization import CalibrationDataReader -from preprocessing import yolov3_preprocess_func, yolov3_variant_preprocess_func +from preprocessing import yolov3_preprocess_func, yolov3_preprocess_func_2, yolov3_variant_preprocess_func, yolov3_variant_preprocess_func_2, yolov3_variant_preprocess_func_3 import onnxruntime from argparse import Namespace import os @@ -93,8 +93,10 @@ class YoloV3DataReader(ObejctDetectionDataReader): def load_serial(self): width = self.width height = self.width - nchw_data_list, filename_list, image_size_list = yolov3_preprocess_func(self.image_folder, height, width, + nchw_data_list, filename_list, image_size_list = yolov3_preprocess_func_2(self.image_folder, height, width, self.start_index, self.stride) + # nchw_data_list, filename_list, image_size_list = yolov3_preprocess_func(self.image_folder, height, width, + # self.start_index, self.stride) input_name = self.input_name print("Start from index %s ..." % (str(self.start_index))) @@ -179,18 +181,19 @@ class YoloV3VariantDataReader(YoloV3DataReader): annotations='./annotations/instances_val2017.json'): YoloV3DataReader.__init__(self, calibration_image_folder, width, height, start_index, end_index, stride, batch_size, model_path, is_evaluation, annotations) - self.input_name = '000_net' - # self.input_name = 'images' + # self.input_name = '000_net' + self.input_name = 'images' def load_serial(self): width = self.width height = self.height input_name = self.input_name - nchw_data_list, filename_list, image_size_list = yolov3_variant_preprocess_func( + # nchw_data_list, filename_list, image_size_list = yolov3_variant_preprocess_func_2( + # self.image_folder, height, width, self.start_index, self.stride) + nchw_data_list, filename_list, image_size_list = yolov3_variant_preprocess_func_3( self.image_folder, height, width, self.start_index, self.stride) - # nchw_data_list, filename_list, image_size_list = yolov3_variant_2_preprocess_func( - # self.image_folder, height, width, self.start_index, self.stride) + print("Start from index %s ..." % (str(self.start_index))) data = [] if self.is_evaluation: img_name_to_img_id = self.img_name_to_img_id diff --git a/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/e2e_user_yolov3_example.py b/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/e2e_user_yolov3_example.py index 129577cccd..dc607ea54f 100644 --- a/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/e2e_user_yolov3_example.py +++ b/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/e2e_user_yolov3_example.py @@ -1,5 +1,5 @@ import os -from onnxruntime.quantization import create_calibrator, write_calibration_table +from onnxruntime.quantization import create_calibrator, write_calibration_table, CalibrationMethod from data_reader import YoloV3DataReader, YoloV3VariantDataReader from evaluate import YoloV3Evaluator, YoloV3VariantEvaluator @@ -64,7 +64,8 @@ def get_prediction_evaluation(model_path, validation_dataset, providers): def get_calibration_table_yolov3_variant(model_path, augmented_model_path, calibration_dataset): - calibrator = create_calibrator(model_path, None, augmented_model_path=augmented_model_path) + calibrator = create_calibrator(model_path, [], augmented_model_path=augmented_model_path, calibrate_method=CalibrationMethod.Entropy) + calibrator.set_execution_providers(["CUDAExecutionProvider"]) # DataReader can handle dataset with batch or serial processing depends on its implementation # Following examples show two different ways to generate calibration table diff --git a/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/evaluate.py b/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/evaluate.py index 93c1180a1c..d647a05b06 100644 --- a/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/evaluate.py +++ b/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/evaluate.py @@ -10,6 +10,8 @@ import onnxruntime from onnxruntime.quantization.calibrate import CalibrationDataReader import numpy as np +import torch +import torchvision class YoloV3Evaluator: def __init__(self, @@ -51,6 +53,8 @@ class YoloV3Evaluator: self.generate_class_to_id(ground_truth_object_class_file) print(self.class_to_id) + self.session = onnxruntime.InferenceSession(model_path, providers=providers) + def generate_class_to_id(self, ground_truth_object_class_file): with open(ground_truth_object_class_file) as f: import json @@ -106,7 +110,7 @@ class YoloV3Evaluator: }) def predict(self): - session = onnxruntime.InferenceSession(self.model_path, providers=self.providers) + session = self.session outputs = [] @@ -184,23 +188,20 @@ class YoloV3Evaluator: cocoEval.accumulate() cocoEval.summarize() +class YoloV3VariantEvaluator(YoloV3Evaluator): + def __init__(self, model_path, + data_reader: CalibrationDataReader, + width=608, + height=384, + providers=["CUDAExecutionProvider"], + ground_truth_object_class_file="./coco-object-categories-2017.json", + onnx_object_class_file="./onnx_coco_classes.txt"): -class YoloV3VariantEvaluator(YoloV3Evaluator): - def __init__(self, - model_path, - data_reader: CalibrationDataReader, - width=608, - height=384, - providers=["CUDAExecutionProvider"], - ground_truth_object_class_file="./coco-object-categories-2017.json", - onnx_object_class_file="./onnx_coco_classes.txt"): - - YoloV3Evaluator.__init__(self, model_path, data_reader, width, height, providers, - ground_truth_object_class_file, onnx_object_class_file) + YoloV3Evaluator.__init__(self, model_path, data_reader,width, height, providers, ground_truth_object_class_file, onnx_object_class_file) def predict(self): - from postprocessing import PostprocessYOLOWrapper - session = onnxruntime.InferenceSession(self.model_path, providers=self.providers) + from postprocessing import PostprocessYOLOWrapper + session = self.session outputs = [] image_id_list = [] @@ -224,24 +225,25 @@ class YoloV3VariantEvaluator(YoloV3Evaluator): image_size_list = [image_size_list] image_id_list = [image_id_list] + image_size_batch.append(image_size_list) image_id_batch.append(image_id_list) outputs.append(session.run(None, inputs)) for i in range(len(outputs)): output = outputs[i] - + for batch_i in range(self.data_reader.get_batch_size()): - if batch_i > len(image_size_batch[i]) - 1 or batch_i > len(image_id_batch[i]) - 1: + if batch_i > len(image_size_batch[i])-1 or batch_i > len(image_id_batch[i])-1: continue image_height = image_size_batch[i][batch_i][0] - image_width = image_size_batch[i][batch_i][1] + image_width= image_size_batch[i][batch_i][1] image_id = image_id_batch[i][batch_i] - boxes, classes, scores = postprocess_yolo.postprocessor.process(output, (image_width, image_height), - 0.01) + boxes, classes, scores = postprocess_yolo.postprocessor.process( + output, (image_width, image_height), 0.01) for j in range(len(boxes)): box = boxes[j] @@ -253,13 +255,7 @@ class YoloV3VariantEvaluator(YoloV3Evaluator): y = float(box[1]) w = float(box[2] - box[0] + 1) h = float(box[3] - box[1] + 1) - self.prediction_result_list.append({ - "image_id": int(image_id), - "category_id": int(id), - "bbox": [x, y, w, h], - "score": scores[j] - }) - + self.prediction_result_list.append({"image_id":int(image_id), "category_id":int(id), "bbox":[x,y,w,h], "score":scores[j]}) class YoloV3Variant2Evaluator(YoloV3Evaluator): def __init__(self, @@ -328,7 +324,7 @@ class YoloV3Variant2Evaluator(YoloV3Evaluator): }) def predict(self): - session = onnxruntime.InferenceSession(self.model_path, providers=self.providers) + session = self.session outputs = [] image_id_list = [] @@ -367,3 +363,213 @@ class YoloV3Variant2Evaluator(YoloV3Evaluator): image_width = image_size_batch[i][batch_i][1] image_id = image_id_batch[i][batch_i] self.set_bbox_prediction(bboxes, scores, image_height, image_width, image_id) + +def xywh2xyxy(x): + # Convert nx4 boxes from [x, y, w, h] to [x1, y1, x2, y2] where xy1=top-left, xy2=bottom-right + y = np.zeros_like(x) + y[:, 0] = x[:, 0] - x[:, 2] / 2 # top left x + y[:, 1] = x[:, 1] - x[:, 3] / 2 # top left y + y[:, 2] = x[:, 0] + x[:, 2] / 2 # bottom right x + y[:, 3] = x[:, 1] + x[:, 3] / 2 # bottom right y + return y + + +def scale_coords(img1_shape, coords, img0_shape, ratio_pad=None): + # Rescale coords (xyxy) from img1_shape to img0_shape + if ratio_pad is None: # calculate from img0_shape + # gain = max(img1_shape) / max(img0_shape) # gain = old / new + gain = min(img1_shape[0] / img0_shape[0], img1_shape[1] / img0_shape[1]) + pad = (img1_shape[1] - img0_shape[1] * gain) / 2, (img1_shape[0] - img0_shape[0] * gain) / 2 # wh padding + else: + gain = ratio_pad[0][0] + pad = ratio_pad[1] + + coords[:, [0, 2]] -= pad[0] # x padding + coords[:, [1, 3]] -= pad[1] # y padding + coords[:, :4] /= gain + return coords + + +def letterbox(img, new_shape=(416, 416), color=(114, 114, 114), auto=True, scaleFill=False, scaleup=True): + # Resize image to a 32-pixel-multiple rectangle https://github.com/ultralytics/yolov3/issues/232 + shape = img.shape[:2] # current shape [height, width] + if isinstance(new_shape, int): + new_shape = (new_shape, new_shape) + + # Scale ratio (new / old) + r = min(new_shape[0] / shape[0], new_shape[1] / shape[1]) + if not scaleup: # only scale down, do not scale up (for better test mAP) + r = min(r, 1.0) + + # Compute padding + ratio = r, r # width, height ratios + new_unpad = int(round(shape[1] * r)), int(round(shape[0] * r)) + dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1] # wh padding + if auto: # minimum rectangle + dw, dh = np.mod(dw, 64), np.mod(dh, 64) # wh padding + elif scaleFill: # stretch + dw, dh = 0.0, 0.0 + new_unpad = new_shape + ratio = new_shape[0] / shape[1], new_shape[1] / shape[0] # width, height ratios + + dw /= 2 # divide padding into 2 sides + dh /= 2 + + if shape[::-1] != new_unpad: # resize + img = cv2.resize(img, new_unpad, interpolation=cv2.INTER_LINEAR) + top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1)) + left, right = int(round(dw - 0.1)), int(round(dw + 0.1)) + img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color) # add border + return img, ratio, (dw, dh) + + +def post_process_without_nms(opts): + final_output = [] + for batch_i in range(opt.batch_size): + batch_idx = opts[0][:, 0] == batch_i + bbox = opts[1][batch_idx, :] + score = opts[2][batch_idx, :] + bbox[:, 0] *= opt.input_w #x + bbox[:, 1] *= opt.input_h #y + bbox[:, 2] *= opt.input_w #w + bbox[:, 3] *= opt.input_h #h + bbox = xywh2xyxy(bbox) + bbox0 = scale_coords(img.shape[2:], bbox, img0.shape[0:2]) + if bbox0.shape[0] == 0: + final_output.append(torch.empty(0, 5).numpy()) + continue + + output = np.concatenate((bbox, score), axis=1) + final_output.append(output) + + return final_output + + +def post_process_with_nms(predictions, image_height, image_width, conf_thres=0.35, nms_thres=0.35): + """Performs NMS and score thresholding + """ + final_output = [] + batch_size = 1 + input_w = 512 + input_h = 288 + for batch_i in range(batch_size): + scores = predictions[0][batch_i, :, 0] + keep_idx = scores >= conf_thres + boxes_ = predictions[1][batch_i, keep_idx, :] + boxes_[:, 0] *= input_w #x + boxes_[:, 1] *= input_h #y + boxes_[:, 2] *= input_w #w + boxes_[:, 3] *= input_h #h + boxes_ = xywh2xyxy(boxes_) + img0_shape = (image_height, image_width) + img1_shape = (input_h, input_w) + # bbox = self.scale_coords(img1_shape, bbox, img0_shape) + boxes_ = scale_coords(img1_shape, boxes_, img0_shape) + # boxes_ = scale_coords(img.shape[2:], boxes_, img0.shape[0:2]) + boxes_ = torch.from_numpy(boxes_) + scores = torch.from_numpy(scores[keep_idx]) + if scores.dim() == 0: + final_output.append(torch.empty(0, 5).numpy()) + continue + keep_idx = torchvision.ops.nms(boxes_, scores, nms_thres) + scores = scores[keep_idx].view(-1, 1) + boxes_ = boxes_[keep_idx].view(-1, 4) + output = torch.cat((boxes_, scores), dim=-1) + final_output.append(output.numpy()) + return final_output + +class YoloV3Variant3Evaluator(YoloV3Evaluator): + def __init__(self, + model_path, + data_reader: CalibrationDataReader, + width=512, + height=288, + providers=["CUDAExecutionProvider"], + ground_truth_object_class_file="./coco-object-categories-2017.json", + onnx_object_class_file="./onnx_coco_classes.txt"): + + YoloV3Evaluator.__init__(self, model_path, data_reader, width, height, providers, + ground_truth_object_class_file, onnx_object_class_file) + + + def set_bbox_prediction(self, bboxes, scores, image_height, image_width, image_id): + + for i in range(bboxes.shape[0]): + bbox = bboxes[i] + bbox[0] *= self.width #x + bbox[1] *= self.height #y + bbox[2] *= self.width #w + bbox[3] *= self.height #h + + img0_shape = (image_height, image_width) + img1_shape = (self.height, self.width) + bbox = self.xywh2xyxy(bbox) + bbox = self.scale_coords(img1_shape, bbox, img0_shape) + + class_name = 'person' + if class_name in self.identical_class_map: + class_name = self.identical_class_map[class_name] + id = self.class_to_id[class_name] + + bbox[2] = bbox[2] - bbox[0] + bbox[3] = bbox[3] - bbox[1] + + self.prediction_result_list.append({ + "image_id": int(image_id), + "category_id": int(id), + "bbox": list(bbox), + "score": scores[i][0] + }) + + def predict(self): + session = onnxruntime.InferenceSession(self.model_path, providers=self.providers) + outputs = [] + + image_id_list = [] + image_id_batch = [] + image_size_list = [] + image_size_batch = [] + + class_name = 'person' + id = self.class_to_id[class_name] + + while True: + inputs = self.data_reader.get_next() + if not inputs: + break + image_size_list = inputs["image_size"] + image_id_list = inputs["image_id"] + del inputs["image_size"] + del inputs["image_id"] + + # in the case of batch size is 1 + if type(image_id_list) == int: + image_size_list = [image_size_list] + image_id_list = [image_id_list] + + image_size_batch.append(image_size_list) + image_id_batch.append(image_id_list) + outputs.append(session.run(None, inputs)) + + for j in range(len(outputs)): + output = outputs[j] + image_id = image_id_batch[j][0] + image_height = image_size_batch[j][0][0] + image_width = image_size_batch[j][0][1] + dets = post_process_with_nms(output, image_height, image_width)[0] + + for i in range(dets.shape[0]): + x1 = dets[i, 0] + y1 = dets[i, 1] + x2 = dets[i, 2] + y2 = dets[i, 3] + score = dets[i, 4] + + bbox = [x1, y1, x2-x1, y2-y1] + self.prediction_result_list.append({ + "image_id": int(image_id), + "category_id": int(id), + "bbox": list(bbox), + "score": score + }) + diff --git a/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/postprocessing.py b/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/postprocessing.py index 52daab0bb5..7b4a84380d 100644 --- a/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/postprocessing.py +++ b/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/postprocessing.py @@ -1,9 +1,13 @@ import numpy as np - - class PostprocessYOLO(object): """Class for post-processing the three output tensors from YOLO.""" - def __init__(self, yolo_masks, yolo_anchors, nms_threshold, yolo_input_resolution, category_num=80): + + def __init__(self, + yolo_masks, + yolo_anchors, + nms_threshold, + yolo_input_resolution, + category_num=80): """Initialize with all values that will be kept when processing several frames. Assuming 3 outputs of the network in the case of (large) YOLO, or 2 for the Tiny YOLO. @@ -37,7 +41,8 @@ class PostprocessYOLO(object): for output in outputs: outputs_reshaped.append(self._reshape_output(output)) - boxes_xywh, categories, confidences = self._process_yolo_output(outputs_reshaped, resolution_raw, conf_th) + boxes_xywh, categories, confidences = self._process_yolo_output( + outputs_reshaped, resolution_raw, conf_th) if len(boxes_xywh) > 0: # convert (x, y, width, height) to (x1, y1, x2, y2) @@ -46,9 +51,9 @@ class PostprocessYOLO(object): yy = boxes_xywh[:, 1].reshape(-1, 1) ww = boxes_xywh[:, 2].reshape(-1, 1) hh = boxes_xywh[:, 3].reshape(-1, 1) - boxes = np.concatenate([xx, yy, xx + ww, yy + hh], axis=1) + 0.5 - boxes[:, [0, 2]] = np.clip(boxes[:, [0, 2]], 0., float(img_w - 1)) - boxes[:, [1, 3]] = np.clip(boxes[:, [1, 3]], 0., float(img_h - 1)) + boxes = np.concatenate([xx, yy, xx+ww, yy+hh], axis=1) + 0.5 + boxes[:, [0, 2]] = np.clip(boxes[:, [0, 2]], 0., float(img_w-1)) + boxes[:, [1, 3]] = np.clip(boxes[:, [1, 3]], 0., float(img_h-1)) boxes = boxes.astype(np.int) else: boxes = np.zeros((0, 4), dtype=np.int) # empty @@ -118,8 +123,9 @@ class PostprocessYOLO(object): nscores.append(confidence[keep]) if not nms_categories and not nscores: - return (np.empty((0, 4), dtype=np.float32), np.empty((0, 1), - dtype=np.float32), np.empty((0, 1), dtype=np.float32)) + return (np.empty((0, 4), dtype=np.float32), + np.empty((0, 1), dtype=np.float32), + np.empty((0, 1), dtype=np.float32)) boxes = np.concatenate(nms_boxes) categories = np.concatenate(nms_categories) @@ -136,6 +142,7 @@ class PostprocessYOLO(object): output_reshaped -- reshaped YOLO output as NumPy arrays with shape (height,width,3,85) mask -- 2-dimensional tuple with mask specification for this output """ + def sigmoid_v(array): return np.reciprocal(np.exp(-array) + 1.0) @@ -238,24 +245,27 @@ class PostprocessYOLO(object): keep = np.array(keep) return keep - class PostprocessYOLOWrapper(object): """This class encapsulates things needed to run yolo.""" """Reference from here https://github.com/jkjung-avt/tensorrt_demos/blob/3fb15c908b155d5edc1bf098c6b8c31886cd8e8d/utils/yolo.py""" + def _init_yolov3_postprocessor(self): h, w = self.input_shape filters = (self.category_num + 5) * 3 if 'tiny' in self.model: - self.output_shapes = [(1, filters, h // 32, w // 32), (1, filters, h // 16, w // 16)] + self.output_shapes = [(1, filters, h // 32, w // 32), + (1, filters, h // 16, w // 16)] else: - self.output_shapes = [(1, filters, h // 32, w // 32), (1, filters, h // 16, w // 16), - (1, filters, h // 8, w // 8)] + self.output_shapes = [(1, filters, h // 32, w // 32), + (1, filters, h // 16, w // 16), + (1, filters, h // 8, w // 8)] if 'tiny' in self.model: postprocessor_args = { # A list of 2 three-dimensional tuples for the Tiny YOLO masks 'yolo_masks': [(3, 4, 5), (0, 1, 2)], # A list of 6 two-dimensional tuples for the Tiny YOLO anchors - 'yolo_anchors': [(10, 14), (23, 27), (37, 58), (81, 82), (135, 169), (344, 319)], + 'yolo_anchors': [(10, 14), (23, 27), (37, 58), + (81, 82), (135, 169), (344, 319)], # Threshold for non-max suppression algorithm, float # value between 0 and 1 'nms_threshold': 0.5, @@ -267,16 +277,14 @@ class PostprocessYOLOWrapper(object): # A list of 3 three-dimensional tuples for the YOLO masks 'yolo_masks': [(6, 7, 8), (3, 4, 5), (0, 1, 2)], # A list of 9 two-dimensional tuples for the YOLO anchors - 'yolo_anchors': [(10, 13), (16, 30), (33, 23), (30, 61), (62, 45), (59, 119), (116, 90), (156, 198), - (373, 326)], + 'yolo_anchors': [(10, 13), (16, 30), (33, 23), + (30, 61), (62, 45), (59, 119), + (116, 90), (156, 198), (373, 326)], # Threshold for non-max suppression algorithm, float # value between 0 and 1 - 'nms_threshold': - 0.5, - 'yolo_input_resolution': - self.input_shape, - 'category_num': - self.category_num + 'nms_threshold': 0.5, + 'yolo_input_resolution': self.input_shape, + 'category_num': self.category_num } self.postprocessor = PostprocessYOLO(**postprocessor_args) diff --git a/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/preprocessing.py b/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/preprocessing.py index 4ed9ba709f..dc62470a5c 100644 --- a/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/preprocessing.py +++ b/onnxruntime/python/tools/quantization/E2E_example_model/object_detection/trt/yolov3/preprocessing.py @@ -6,7 +6,6 @@ from PIL import Image import cv2 import pdb - def yolov3_preprocess_func(images_folder, height, width, start_index=0, size_limit=0): ''' Loads a batch of images and preprocess them @@ -16,20 +15,19 @@ def yolov3_preprocess_func(images_folder, height, width, start_index=0, size_lim parameter size_limit: number of images to load. Default is 0 which means all images are picked. return: list of matrices characterizing multiple images ''' - # this function is from yolo3.utils.letterbox_image # https://github.com/qqwweee/keras-yolo3/blob/master/yolo3/utils.py def letterbox_image(image, size): '''resize image with unchanged aspect ratio using padding''' iw, ih = image.size w, h = size - scale = min(w / iw, h / ih) - nw = int(iw * scale) - nh = int(ih * scale) + scale = min(w/iw, h/ih) + nw = int(iw*scale) + nh = int(ih*scale) - image = image.resize((nw, nh), Image.BICUBIC) - new_image = Image.new('RGB', size, (128, 128, 128)) - new_image.paste(image, ((w - nw) // 2, (h - nh) // 2)) + image = image.resize((nw,nh), Image.BICUBIC) + new_image = Image.new('RGB', size, (128,128,128)) + new_image.paste(image, ((w-nw)//2, (h-nh)//2)) return new_image image_names = os.listdir(images_folder) @@ -44,6 +42,66 @@ def yolov3_preprocess_func(images_folder, height, width, start_index=0, size_lim else: batch_filenames = image_names + + unconcatenated_batch_data = [] + image_size_list = [] + + print(batch_filenames) + print("size: %s" % str(len(batch_filenames))) + + for image_name in batch_filenames: + image_filepath = images_folder + '/' + image_name + img = Image.open(image_filepath) + model_image_size = (height, width) + boxed_image = letterbox_image(img, tuple(reversed(model_image_size))) + image_data = np.array(boxed_image, dtype='float32') + image_data /= 255. + image_data = np.transpose(image_data, [2, 0, 1]) + image_data = np.expand_dims(image_data, 0) + unconcatenated_batch_data.append(image_data) + image_size_list.append(np.array([img.size[1], img.size[0]], dtype=np.float32).reshape(1, 2)) + + batch_data = np.concatenate(np.expand_dims(unconcatenated_batch_data, axis=0), axis=0) + return batch_data, batch_filenames, image_size_list + +def yolov3_preprocess_func_2(images_folder, height, width, start_index=0, size_limit=0): + ''' + Loads a batch of images and preprocess them + parameter images_folder: path to folder storing images + parameter height: image height in pixels + parameter width: image width in pixels + parameter size_limit: number of images to load. Default is 0 which means all images are picked. + return: list of matrices characterizing multiple images + ''' + + # reference from here: + # https://github.com/jkjung-avt/tensorrt_demos/blob/3fb15c908b155d5edc1bf098c6b8c31886cd8e8d/utils/yolo.py#L60 + def _preprocess_yolo(img, input_shape): + """Preprocess an image before TRT YOLO inferencing. + # Args + img: int8 numpy array of shape (img_h, img_w, 3) + input_shape: a tuple of (H, W) + # Returns + preprocessed img: float32 numpy array of shape (3, H, W) + """ + img = cv2.resize(img, (input_shape[1], input_shape[0])) + img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) + img = img.transpose((2, 0, 1)).astype(np.float32) + img /= 255.0 + return img + + image_names = os.listdir(images_folder) + if start_index >= len(image_names): + return np.asanyarray([]), np.asanyarray([]), np.asanyarray([]) + elif size_limit > 0 and len(image_names) >= size_limit: + end_index = start_index + size_limit + if end_index > len(image_names): + end_index = len(image_names) + + batch_filenames = [image_names[i] for i in range(start_index, end_index)] + else: + batch_filenames = image_names + unconcatenated_batch_data = [] image_size_list = [] @@ -52,7 +110,66 @@ def yolov3_preprocess_func(images_folder, height, width, start_index=0, size_lim for image_name in batch_filenames: image_filepath = images_folder + '/' + image_name - img = Image.open(image_filepath) + model_image_size = (height, width) + + img = cv2.imread(image_filepath) + image_data = _preprocess_yolo(img, tuple(model_image_size)) + image_data = np.ascontiguousarray(image_data) + image_data = np.expand_dims(image_data, 0) + unconcatenated_batch_data.append(image_data) + _height, _width, _ = img.shape + # image_size_list.append(img.shape[0:2]) # img.shape is h, w, c + image_size_list.append(np.array([img.shape[0], img.shape[1]], dtype=np.float32).reshape(1, 2)) + + batch_data = np.concatenate(np.expand_dims(unconcatenated_batch_data, axis=0), axis=0) + return batch_data, batch_filenames, image_size_list + +def yolov3_variant_preprocess_func(images_folder, height, width, start_index=0, size_limit=0): + ''' + Loads a batch of images and preprocess them + parameter images_folder: path to folder storing images + parameter height: image height in pixels + parameter width: image width in pixels + parameter size_limit: number of images to load. Default is 0 which means all images are picked. + return: list of matrices characterizing multiple images + ''' + # this function is from yolo3.utils.letterbox_image + # https://github.com/qqwweee/keras-yolo3/blob/master/yolo3/utils.py + def letterbox_image(image, size): + '''resize image with unchanged aspect ratio using padding''' + iw, ih = image.size + w, h = size + scale = min(w/iw, h/ih) + nw = int(iw*scale) + nh = int(ih*scale) + + image = image.resize((nw,nh), Image.BICUBIC) + new_image = Image.new('RGB', size, (128,128,128)) + new_image.paste(image, ((w-nw)//2, (h-nh)//2)) + return new_image + + image_names = os.listdir(images_folder) + if start_index >= len(image_names): + return np.asanyarray([]), np.asanyarray([]), np.asanyarray([]) + elif size_limit > 0 and len(image_names) >= size_limit: + end_index = start_index + size_limit + if end_index > len(image_names): + end_index = len(image_names) + + batch_filenames = [image_names[i] for i in range(start_index, end_index)] + else: + batch_filenames = image_names + + + unconcatenated_batch_data = [] + image_size_list = [] + + print(batch_filenames) + print("size: %s" % str(len(batch_filenames))) + + for image_name in batch_filenames: + image_filepath = images_folder + '/' + image_name + img = Image.open(image_filepath) model_image_size = (height, width) boxed_image = letterbox_image(img, tuple(reversed(model_image_size))) image_data = np.array(boxed_image, dtype='float32') @@ -60,13 +177,13 @@ def yolov3_preprocess_func(images_folder, height, width, start_index=0, size_lim image_data = np.transpose(image_data, [2, 0, 1]) image_data = np.expand_dims(image_data, 0) unconcatenated_batch_data.append(image_data) - image_size_list.append(np.array([img.size[1], img.size[0]], dtype=np.float32).reshape(1, 2)) + image_size_list.append((img.size[1], img.size[0])) # img.shape is h, w, c + # image_size_list.append(np.array([img.size[1], img.size[0]], dtype=np.float32).reshape(1, 2)) batch_data = np.concatenate(np.expand_dims(unconcatenated_batch_data, axis=0), axis=0) return batch_data, batch_filenames, image_size_list - -def yolov3_variant_preprocess_func(images_folder, height, width, start_index=0, size_limit=0): +def yolov3_variant_preprocess_func_2(images_folder, height, width, start_index=0, size_limit=0): ''' Loads a batch of images and preprocess them parameter images_folder: path to folder storing images @@ -127,7 +244,7 @@ def yolov3_variant_preprocess_func(images_folder, height, width, start_index=0, # This is for special tuned yolov3 model -def yolov3_variant_2_preprocess_func(images_folder, height, width, start_index=0, size_limit=0): +def yolov3_variant_preprocess_func_3(images_folder, height, width, start_index=0, size_limit=0): def letterbox(img, new_shape=(416, 416), color=(114, 114, 114), auto=True, scaleFill=False, scaleup=True): # Resize image to a 32-pixel-multiple rectangle https://github.com/ultralytics/yolov3/issues/232 shape = img.shape[:2] # current shape [height, width] diff --git a/onnxruntime/python/tools/quantization/__init__.py b/onnxruntime/python/tools/quantization/__init__.py index c08331ca81..f16c20ce8b 100644 --- a/onnxruntime/python/tools/quantization/__init__.py +++ b/onnxruntime/python/tools/quantization/__init__.py @@ -1,4 +1,4 @@ from .quantize import quantize, quantize_static, quantize_dynamic, quantize_qat from .quantize import QuantizationMode -from .calibrate import CalibrationDataReader, CalibraterBase, MinMaxCalibrater, create_calibrator +from .calibrate import CalibrationDataReader, CalibraterBase, MinMaxCalibrater, create_calibrator, CalibrationMethod from .quant_utils import QuantType, QuantFormat, write_calibration_table diff --git a/onnxruntime/python/tools/quantization/calibrate.py b/onnxruntime/python/tools/quantization/calibrate.py index c07e99738c..2b8c9693d5 100644 --- a/onnxruntime/python/tools/quantization/calibrate.py +++ b/onnxruntime/python/tools/quantization/calibrate.py @@ -15,7 +15,7 @@ from onnx import onnx_pb as onnx_proto from six import string_types from enum import Enum -from .quant_utils import QuantType +from .quant_utils import QuantType, smooth_distribution from .registry import QLinearOpsRegistry import abc @@ -24,6 +24,7 @@ import itertools class CalibrationMethod(Enum): MinMax = 0 + Entropy = 1 class CalibrationDataReader(metaclass=abc.ABCMeta): @@ -80,6 +81,33 @@ class CalibraterBase: sess_options=sess_options, providers=self.execution_providers) + def select_tensors_to_calibrate(self, model): + ''' + select all quantization_candidates op type nodes' input/output tensors. + returns: + tensors (set): set of tensor name. + value_infos (dict): tensor name to value info. + ''' + value_infos = {vi.name: vi for vi in model.graph.value_info} + value_infos.update({ot.name: ot for ot in model.graph.output}) + value_infos.update({it.name: it for it in model.graph.input}) + initializer = set(init.name for init in model.graph.initializer) + + tensors_to_calibrate = set() + tensor_type_to_calibrate = set([TensorProto.FLOAT, TensorProto.FLOAT16]) + + for node in model.graph.node: + if len(self.op_types_to_calibrate) == 0 or node.op_type in self.op_types_to_calibrate: + for tensor_name in itertools.chain(node.input, node.output): + if tensor_name in value_infos.keys(): + vi = value_infos[tensor_name] + if vi.type.HasField('tensor_type') and ( + vi.type.tensor_type.elem_type in tensor_type_to_calibrate) and ( + tensor_name not in initializer): + tensors_to_calibrate.add(tensor_name) + + return tensors_to_calibrate, value_infos + def get_augment_model(self): ''' return: augmented onnx model @@ -129,27 +157,12 @@ class MinMaxCalibrater(CalibraterBase): model = onnx_proto.ModelProto() model.CopyFrom(self.model) model = onnx.shape_inference.infer_shapes(model) - value_infos = {vi.name: vi for vi in model.graph.value_info} - value_infos.update({ot.name: ot for ot in model.graph.output}) - value_infos.update({it.name: it for it in model.graph.input}) - initializer = set(init.name for init in model.graph.initializer) added_nodes = [] added_outputs = [] - tensors_to_calibrate = set() - tensor_type_to_calibrate = set([TensorProto.FLOAT, TensorProto.FLOAT16]) + tensors, _ = self.select_tensors_to_calibrate(model) - for node in model.graph.node: - if len(self.op_types_to_calibrate) == 0 or node.op_type in self.op_types_to_calibrate: - for tensor_name in itertools.chain(node.input, node.output): - if tensor_name in value_infos.keys(): - vi = value_infos[tensor_name] - if vi.type.HasField('tensor_type') and ( - vi.type.tensor_type.elem_type in tensor_type_to_calibrate) and ( - tensor_name not in initializer): - tensors_to_calibrate.add(tensor_name) - - for tensor in tensors_to_calibrate: + for tensor in tensors: # Adding ReduceMin nodes reduce_min_name = tensor + '_ReduceMin' reduce_min_node = onnx.helper.make_node('ReduceMin', [tensor], [tensor + '_ReduceMin'], @@ -226,6 +239,239 @@ class MinMaxCalibrater(CalibraterBase): return self.calibrate_tensors_range +class EntropyCalibrater(CalibraterBase): + def __init__(self, model, op_types_to_calibrate=[], augmented_model_path='augmented_model.onnx'): + ''' + :param model: ONNX model to calibrate. It can be a ModelProto or a model path + :param op_types_to_calibrate: operator types to calibrate. By default, calibrate all the float32/float16 tensors. + :param augmented_model_path: save augmented model to this path. + ''' + super(EntropyCalibrater, self).__init__(model, op_types_to_calibrate, augmented_model_path) + self.intermediate_outputs = [] + self.calibrate_tensors_range = None + self.num_model_outputs = len(self.model.graph.output) + self.model_original_outputs = set(output.name for output in self.model.graph.output) + self.collector = None + + def augment_graph(self): + ''' + make all quantization_candidates op type nodes as part of the graph output. + :return: augmented ONNX model + ''' + model = onnx_proto.ModelProto() + model.CopyFrom(self.model) + model = onnx.shape_inference.infer_shapes(model) + + added_nodes = [] + added_outputs = [] + tensors, value_infos = self.select_tensors_to_calibrate(model) + + for tensor in tensors: + added_outputs.append(value_infos[tensor]) + + model.graph.node.extend(added_nodes) + model.graph.output.extend(added_outputs) + onnx.save(model, self.augmented_model_path) + self.augment_model = model + + def clear_collected_data(self): + self.intermediate_outputs = [] + + def collect_data(self, data_reader: CalibrationDataReader): + ''' + Entropy Calibrator collects operators' tensors as well as generates tensor histogram for each operator. + ''' + while True: + inputs = data_reader.get_next() + if not inputs: + break + self.intermediate_outputs.append(self.infer_session.run(None, inputs)) + + + if len(self.intermediate_outputs) == 0: + raise ValueError("No data is collected.") + + output_names = [self.infer_session.get_outputs()[i].name for i in range(len(self.intermediate_outputs[0]))] + output_dicts_list = [ + dict(zip(output_names, intermediate_output)) for intermediate_output in self.intermediate_outputs + ] + + merged_dict = {} + for d in output_dicts_list: + for k, v in d.items(): + merged_dict.setdefault(k, []).append(v) + + clean_merged_dict = dict((i, merged_dict[i]) for i in merged_dict if i not in self.model_original_outputs) + + if not self.collector: + self.collector = HistogramCollector() + self.collector.collect(clean_merged_dict) + + def compute_range(self): + ''' + Compute the min-max range of tensor + :return: dictionary mapping: {added node names: (ReduceMin, ReduceMax) pairs } + ''' + if not self.collector: + raise ValueError("No collector created and can't generate calibration data.") + + return self.collector.get_optimal_collection_result() + + +class CalibrationDataCollector(metaclass=abc.ABCMeta): + """ + Base class for collecting data for calibration-based quantization. + """ + + @abc.abstractmethod + def collect(self, name_to_arr): + """ + Generate informative data based on given data. + name_to_arr : dict + tensor name to NDArray data + """ + raise NotImplementedError + + @abc.abstractmethod + def get_optimal_collection_result(self): + """ + Get the optimal result among collection data. + """ + raise NotImplementedError + +class HistogramCollector(CalibrationDataCollector): + """ + Implementation of collecting histogram data as dict for each tensor targeting on entropy calibration. + + ref: https://github.com//apache/incubator-mxnet/blob/master/python/mxnet/contrib/quantization.py + """ + def __init__(self, num_quantized_bins=128): + self.histogram_dict = {} + self.num_quantized_bins= num_quantized_bins + + def get_histogram_dict(self): + return self.histogram_dict + + def collect(self, name_to_arr): + for tensor, data_arr in name_to_arr.items(): + data_arr = np.asarray(data_arr) + data_arr = data_arr.flatten() + + if data_arr.size > 0: + min_value = np.min(data_arr) + max_value = np.max(data_arr) + else: + min_value = 0 + max_value = 0 + + threshold = max(abs(min_value), abs(max_value)) + + if tensor in self.histogram_dict: + old_histogram = self.histogram_dict[tensor] + self.histogram_dict[tensor] = self.merge_histogram(old_histogram, data_arr, min_value, max_value, threshold) + else: + # hist, hist_edges = np.histogram(data_arr, self.num_quantized_bins, range=(min_value, max_value)) + hist, hist_edges = np.histogram(data_arr, self.num_quantized_bins, range=(-threshold, threshold)) + self.histogram_dict[tensor] = (hist, hist_edges, min_value, max_value, threshold) + + def merge_histogram(self, old_histogram, data_arr, new_min, new_max, new_threshold): + + (old_hist, old_hist_edges, old_min, old_max, old_threshold) = old_histogram + + if new_threshold <= old_threshold: + new_hist, _ = np.histogram(data_arr, len(old_hist), range=(-old_threshold, old_threshold)) + return (new_hist + old_hist, old_hist_edges, min(old_min, new_min), max(old_max, new_max), old_threshold) + else: + if old_threshold == 0: + hist, hist_edges = np.histogram(data_arr, new_num_bins, range=(-new_threshold, new_threshold)) + hist[len(hist) // 2] += len(old_hist) + else: + old_num_bins = len(old_hist) + old_stride = 2 * old_threshold / old_num_bins + half_increased_bins = int((new_threshold - old_threshold) // old_stride + 1) + new_num_bins = old_num_bins + 2 * half_increased_bins + new_threshold = half_increased_bins * old_stride + old_threshold + hist, hist_edges = np.histogram(data_arr, new_num_bins, range=(-new_threshold, new_threshold)) + hist[half_increased_bins:new_num_bins-half_increased_bins] += old_hist + return (hist, hist_edges, min(old_min, new_min), max(old_max, new_max), new_threshold) + + def get_optimal_collection_result(self): + histogram_dict = self.histogram_dict + num_quantized_bins = self.num_quantized_bins + + thresholds_dict = {} # per tensor thresholds + + for tensor, histogram in histogram_dict.items(): + optimal_threshold = self.get_optimal_threshold(histogram, num_quantized_bins) + thresholds_dict[tensor] = optimal_threshold + + return thresholds_dict + + def get_optimal_threshold(self, histogram, num_quantized_bins): + from scipy.stats import entropy + import copy + + hist, hist_edges, _, _, _ = histogram + num_bins = hist.size + zero_bin_index = num_bins // 2 + num_half_quantized_bin = num_quantized_bins // 2 + + kl_divergence = np.zeros(zero_bin_index - num_half_quantized_bin + 1) + thresholds = [(0, 0) for i in range(kl_divergence.size)] + + for i in range(num_half_quantized_bin, zero_bin_index + 1, 1): + start_index = zero_bin_index - i + end_index = zero_bin_index + i + 1 if (zero_bin_index + i + 1) <= num_bins else num_bins + + thresholds[i - num_half_quantized_bin] = (float(hist_edges[start_index]), float(hist_edges[end_index])) + + sliced_distribution = copy.deepcopy(hist[start_index:end_index]) + + # reference distribution p + p = sliced_distribution.copy() # a copy of np array + left_outliers_count = sum(hist[:start_index]) + right_outliers_count = sum(hist[end_index:]) + p[0] += left_outliers_count + p[-1] += right_outliers_count + + # nonzeros[i] incidates whether p[i] is non-zero + nonzeros = (p != 0).astype(np.int64) + + # quantize p.size bins into quantized bins (default 128 bins) + quantized_bins = np.zeros(num_quantized_bins, dtype=np.int64) + num_merged_bins = sliced_distribution.size // num_quantized_bins + + # merge bins into quantized bins + for index in range(num_quantized_bins): + start = index * num_merged_bins + end = start + num_merged_bins + quantized_bins[index] = sum(sliced_distribution[start:end]) + quantized_bins[-1] += sum(sliced_distribution[num_quantized_bins * num_merged_bins:]) + + # in order to compare p and q, we need to make length of q equals to length of p + # expand quantized bins into p.size bins + q = np.zeros(p.size, dtype=np.int64) + for index in range(num_quantized_bins): + start = index * num_merged_bins + end = start + num_merged_bins + + norm = sum(nonzeros[start:end]) + if norm != 0: + q[start:end] = float(quantized_bins[index]) / float(norm) + + p = smooth_distribution(p) + q = smooth_distribution(q) + + if isinstance(q, np.ndarray): + kl_divergence[i - num_half_quantized_bin] = entropy(p, q) + else: + kl_divergence[i - num_half_quantized_bin] = float('inf') + + min_kl_divergence_idx = np.argmin(kl_divergence) + optimal_threshold = thresholds[min_kl_divergence_idx] + + return optimal_threshold + def create_calibrator(model, op_types_to_calibrate=[], @@ -233,5 +479,7 @@ def create_calibrator(model, calibrate_method=CalibrationMethod.MinMax): if calibrate_method == CalibrationMethod.MinMax: return MinMaxCalibrater(model, op_types_to_calibrate, augmented_model_path) + elif calibrate_method == CalibrationMethod.Entropy: + return EntropyCalibrater(model, op_types_to_calibrate, augmented_model_path) raise ValueError('Unsupported calibration method {}'.format(calibrate_method)) diff --git a/onnxruntime/python/tools/quantization/quant_utils.py b/onnxruntime/python/tools/quantization/quant_utils.py index 5ddfbd2783..d90504bf8f 100644 --- a/onnxruntime/python/tools/quantization/quant_utils.py +++ b/onnxruntime/python/tools/quantization/quant_utils.py @@ -368,3 +368,29 @@ def write_calibration_table(calibration_cache): s = key + ' ' + str(max(abs(value[0]), abs(value[1]))) file.write(s) file.write('\n') + +def smooth_distribution(p, eps=0.0001): + """Given a discrete distribution (may have not been normalized to 1), + smooth it by replacing zeros with eps multiplied by a scaling factor + and taking the corresponding amount off the non-zero values. + Ref: http://web.engr.illinois.edu/~hanj/cs412/bk3/KL-divergence.pdf + https://github.com//apache/incubator-mxnet/blob/master/python/mxnet/contrib/quantization.py + """ + import numpy as np + + is_zeros = (p == 0).astype(np.float32) + is_nonzeros = (p != 0).astype(np.float32) + n_zeros = is_zeros.sum() + n_nonzeros = p.size - n_zeros + + if not n_nonzeros: + # raise ValueError('The discrete probability distribution is malformed. All entries are 0.') + return -1 + eps1 = eps * float(n_zeros) / float(n_nonzeros) + assert eps1 < 1.0, 'n_zeros=%d, n_nonzeros=%d, eps1=%f' % (n_zeros, n_nonzeros, eps1) + + hist = p.astype(np.float32) + hist += eps * is_zeros + (-eps1) * is_nonzeros + assert (hist <= 0).sum() == 0 + + return hist diff --git a/onnxruntime/python/tools/quantization/quantize.py b/onnxruntime/python/tools/quantization/quantize.py index 5120883328..c671c99af9 100644 --- a/onnxruntime/python/tools/quantization/quantize.py +++ b/onnxruntime/python/tools/quantization/quantize.py @@ -24,7 +24,7 @@ from .registry import QLinearOpsRegistry, IntegerOpsRegistry from .onnx_model import ONNXModel from .onnx_quantizer import ONNXQuantizer from .qdq_quantizer import QDQQuantizer -from .calibrate import CalibrationDataReader, create_calibrator +from .calibrate import CalibrationDataReader, create_calibrator, CalibrationMethod def optimize_model(model_path: Path): @@ -145,7 +145,9 @@ def quantize_static(model_input, nodes_to_quantize=[], nodes_to_exclude=[], optimize_model=True, - use_external_data_format=False): + use_external_data_format=False, + calibrate_method=CalibrationMethod.MinMax): + ''' Given an onnx model and calibration data reader, create a quantized onnx model and save it into a file :param model_input: file path of model to quantize @@ -173,6 +175,9 @@ def quantize_static(model_input, when it is not None. :param optimize_model: optimize model before quantization. :parma use_external_data_format: option used for large size (>2GB) model. Set to False by default. + :param calibrate_method: + Current calibration methods supported are MinMax and Entropy. + Please use CalibrationMethod.MinMax or CalibrationMethod.Entropy as options. ''' if activation_type != QuantType.QUInt8: @@ -185,7 +190,7 @@ def quantize_static(model_input, model = load_model(Path(model_input), optimize_model) - calibrator = create_calibrator(model, op_types_to_quantize) + calibrator = create_calibrator(model, op_types_to_quantize, calibrate_method=calibrate_method) calibrator.collect_data(calibration_data_reader) tensors_range = calibrator.compute_range() From 79b966b01ac1960484f5330fe8fe92d60c881ed5 Mon Sep 17 00:00:00 2001 From: liqunfu Date: Fri, 19 Feb 2021 09:03:58 -0800 Subject: [PATCH 06/37] . (#6751) make ort training pert test green. remove unneeded yaml --- ...raining-linux-gpu-e2e-test-ci-pipeline.yml | 62 ------------------- ...aining-linux-gpu-perf-test-ci-pipeline.yml | 4 ++ 2 files changed, 4 insertions(+), 62 deletions(-) delete mode 100644 tools/ci_build/github/azure-pipelines/orttraining-linux-gpu-e2e-test-ci-pipeline.yml diff --git a/tools/ci_build/github/azure-pipelines/orttraining-linux-gpu-e2e-test-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/orttraining-linux-gpu-e2e-test-ci-pipeline.yml deleted file mode 100644 index cd7ddc221a..0000000000 --- a/tools/ci_build/github/azure-pipelines/orttraining-linux-gpu-e2e-test-ci-pipeline.yml +++ /dev/null @@ -1,62 +0,0 @@ -trigger: none - -jobs: -- job: Onnxruntime_Linux_GPU_Training_E2E_Test - - timeoutInMinutes: 60 - - steps: - - checkout: self - clean: true - submodules: recursive - - # update these if the E2E test data changes - - script: | - orttraining/tools/ci_test/download_azure_blob_archive.py \ - --azure_blob_url https://onnxruntimetestdata.blob.core.windows.net/training/onnxruntime_training_data.zip?snapshot=2020-06-15T23:17:35.8314853Z \ - --target_dir $(Build.BinariesDirectory)/training_e2e_test_data \ - --archive_sha256_digest B01C169B6550D1A0A6F1B4E2F34AE2A8714B52DBB70AC04DA85D371F691BDFF9 - displayName: 'Download onnxruntime_training_data.zip data' - - - template: templates/run-docker-build-steps.yml - parameters: - RunDockerBuildArgs: | - -o ubuntu16.04 -d gpu -r $(Build.BinariesDirectory) \ - -t onnxruntime_e2e_test_image \ - -x " \ - --config RelWithDebInfo \ - --enable_training \ - --update --build \ - " - DisplayName: 'Build' - - - script: | - docker run \ - --gpus all \ - --rm \ - --volume $(Build.SourcesDirectory):/onnxruntime_src \ - --volume $(Build.BinariesDirectory):/build \ - --volume $(Build.BinariesDirectory)/training_e2e_test_data:/training_e2e_test_data:ro \ - onnxruntime_e2e_test_image \ - /onnxruntime_src/orttraining/tools/ci_test/run_batch_size_test.py \ - --binary_dir /build/RelWithDebInfo \ - --model_root /training_e2e_test_data/models - displayName: 'Run batch size test' - condition: succeededOrFailed() # ensure all tests are run - - - script: | - docker run \ - --gpus all \ - --rm \ - --volume $(Build.SourcesDirectory):/onnxruntime_src \ - --volume $(Build.BinariesDirectory):/build \ - --volume $(Build.BinariesDirectory)/training_e2e_test_data:/training_e2e_test_data:ro \ - onnxruntime_e2e_test_image \ - /onnxruntime_src/orttraining/tools/ci_test/run_convergence_test.py \ - --binary_dir /build/RelWithDebInfo \ - --model_root /training_e2e_test_data/models \ - --training_data_root /training_e2e_test_data/data - displayName: 'Run convergence test' - condition: succeededOrFailed() # ensure all tests are run - - - template: templates/clean-agent-build-directory-step.yml diff --git a/tools/ci_build/github/azure-pipelines/orttraining-linux-gpu-perf-test-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/orttraining-linux-gpu-perf-test-ci-pipeline.yml index f84c966546..d3d3a42c0a 100644 --- a/tools/ci_build/github/azure-pipelines/orttraining-linux-gpu-perf-test-ci-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/orttraining-linux-gpu-perf-test-ci-pipeline.yml @@ -83,4 +83,8 @@ jobs: displayName: 'Populate perf metrics' workingDirectory: $(Build.SourcesDirectory)/tools/perf_util + - template: templates/component-governance-component-detection-steps.yml + parameters: + condition: 'succeeded' + - template: templates/clean-agent-build-directory-step.yml From a25c8e52a9b502fca6bc9838e016d55192185277 Mon Sep 17 00:00:00 2001 From: Yulong Wang Date: Fri, 19 Feb 2021 10:56:22 -0800 Subject: [PATCH 07/37] fix link to samples in nodejs README (#6746) --- nodejs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodejs/README.md b/nodejs/README.md index b5f08e6bdc..e0b6ab3c64 100644 --- a/nodejs/README.md +++ b/nodejs/README.md @@ -16,7 +16,7 @@ Install the latest dev version: npm install onnxruntime@dev ``` -Refer to [Node.js samples](../samples/README.md#Nodejs) for samples and tutorials. +Refer to [Node.js samples](../samples/nodejs/README.md) for samples and tutorials. ## Requirements From 20d6613efb00e5648c734b46c0a36ca3e30580b4 Mon Sep 17 00:00:00 2001 From: Faith Xu Date: Fri, 19 Feb 2021 10:56:50 -0800 Subject: [PATCH 08/37] Add direct link to build instructions on readme (#6729) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 15bc4af753..96200f9001 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ Common use cases for ONNX Runtime: * [Training](https://www.onnxruntime.ai/docs/get-started/training.html) * [Documentation](https://www.onnxruntime.ai/docs/) * [Samples and Tutorials](https://www.onnxruntime.ai/docs/tutorials/) +* [Build Instructions](https://www.onnxruntime.ai/docs/how-to/build.html) * [Frequently Asked Questions](./docs/FAQ.md) ## Build Pipeline Status From c170061998e1adfb5a37dfe87d2f845b202cd348 Mon Sep 17 00:00:00 2001 From: "Nat Kershaw (MSFT)" Date: Fri, 19 Feb 2021 11:34:21 -0800 Subject: [PATCH 09/37] Removed BUILD.md from master as source now lives in gh-pages (#6709) --- BUILD.md | 1283 ----------------- CONTRIBUTING.md | 2 +- docs/Android_testing.md | 2 +- docs/ONNX_Runtime_Server_Usage.md | 2 +- docs/Reduced_Operator_Kernel_build.md | 2 +- .../onnxruntime-nuphar-tutorial.ipynb | 2 +- java/README.md | 2 +- nodejs/README.md | 2 +- samples/c_cxx/README.md | 2 +- 9 files changed, 8 insertions(+), 1291 deletions(-) delete mode 100644 BUILD.md diff --git a/BUILD.md b/BUILD.md deleted file mode 100644 index 72a936b6b9..0000000000 --- a/BUILD.md +++ /dev/null @@ -1,1283 +0,0 @@ -# Building ONNX Runtime -*[Dockerfiles](https://github.com/microsoft/onnxruntime/tree/master/tools/ci_build/github/linux/docker) / [Pre-built packages](https://github.com/microsoft/onnxruntime#official-builds)* - -## Content - -**[Inferencing](#inferencing)** -* [Start: Baseline CPU](#start-baseline-cpu) -* [Supported architectures and build environments](#supported-architectures-and-build-environments) -* [Common Build Instructions](#common-build-instructions) -* Additional Build Instructions - complete list: `./build.sh (or .\build.bat) --help` - * [Reduced Operator Kernel Build](#Reduced-Operator-Kernel-Build) - * [ONNX Runtime for Mobile Platforms](#ONNX-Runtime-for-Mobile-Platforms) - * [ONNX Runtime Server (Linux)](#Build-ONNX-Runtime-Server-on-Linux) - * [Execution Provider Shared Libraries](#Execution-Provider-Shared-Libraries) - * Execution Providers - * [NVIDIA CUDA](#CUDA) - * [NVIDIA TensorRT](#TensorRT) - * [NVIDIA Jetson TX1/TX2/Nano/Xavier](#nvidia-jetson-tx1tx2nanoxavier) - * [Intel DNNL/MKL-ML](#DNNL-and-MKLML) - * [Intel OpenVINO](#openvino) - * [Android NNAPI](#Android-NNAPI-Execution-Provider) - * [Nuphar Model Compiler](#Nuphar) - * [DirectML](#DirectML) - * [ARM Compute Library](#ARM-Compute-Library) - * [ArmNN](#ArmNN) - * [Rockchip RKNPU](#RKNPU) - * [Xilinx Vitis-AI](#Vitis-AI) - * [AMD MIGraphX](#AMD-MIGraphX) - * Options - * [OpenMP](#OpenMP) - * [OpenBLAS](#OpenBLAS) - * [DebugNodeInputsOutputs](#DebugNodeInputsOutputs) - * Architectures - * [x86](#x86) - * [ARM](#ARM) - * [Android](#Android) - * [iOS](#iOS) - -**[Training](#Training)** - * [Baseline CPU](#baseline-cpu) - * Traning Enabled Execution Providers - * [NVIDIA CUDA](#cuda-training) - * [ROCM](#ROCM) - * [Intel DNNL/MKL-ML](#dnnl-training) - -# Inferencing -## Start: Baseline CPU - -### Prerequisites -* Checkout the source tree: - ``` - git clone --recursive https://github.com/Microsoft/onnxruntime - cd onnxruntime - ``` -* Install cmake-3.13 or higher from https://cmake.org/download/. - - -### Build Instructions -#### Windows -Open Developer Command Prompt for Visual Studio version you are going to use. This will properly setup the environment including paths to your compiler, linker, utilities and header files. -``` -.\build.bat --config RelWithDebInfo --build_shared_lib --parallel -``` -The default Windows CMake Generator is Visual Studio 2017, but you can also use the newer Visual Studio 2019 by passing `--cmake_generator "Visual Studio 16 2019"` to `.\build.bat` - - -#### Linux -``` -./build.sh --config RelWithDebInfo --build_shared_lib --parallel -``` - - -##### macOS -By default, ORT is configured to be built for a minimum target macOS version of 10.12. -The shared library in the release Nuget(s) and the Python wheel may be installed on macOS versions of 10.12+. - -If you would like to use [Xcode](https://developer.apple.com/xcode/) to build the onnxruntime for x86_64 macOS, please add the --user_xcode argument in the command line - ``` - ./build.sh --config RelWithDebInfo --build_shared_lib --parallel --use_xcode - ``` -While without this flag, the cmake build generator will be Unix makefile by default. -Also, if you want to try cross compiling for Apple Silicon in an Intel-based MacOS machine, please add the argument --osx_arch arm64 with a cmake > 3.19, however the unit tests will be skipped due to the incompatible CPU instruction set. - - -#### Notes - -* Please note that these instructions build the debug build, which may have performance tradeoffs -* To build the version from each release (which include Windows, Linux, and Mac variants), see these .yml files for reference: [CPU](./tools/ci_build/github/azure-pipelines/nuget/cpu-esrp-pipeline.yml), [GPU](./tools/ci_build/github/azure-pipelines/nuget/gpu-esrp-pipeline.yml) -* The build script runs all unit tests by default (for native builds and skips tests by default for cross-compiled builds). -* If you need to install protobuf 3.6.1 from source code (cmake/external/protobuf), please note: - * CMake flag protobuf\_BUILD\_SHARED\_LIBS must be turned OFF. After the installation, you should have the 'protoc' executable in your PATH. It is recommended to run `ldconfig` to make sure protobuf libraries are found. - * If you installed your protobuf in a non standard location it would be helpful to set the following env var:`export CMAKE_ARGS="-DONNX_CUSTOM_PROTOC_EXECUTABLE=full path to protoc"` so the ONNX build can find it. Also run `ldconfig ` so the linker can find protobuf libraries. -* If you'd like to install onnx from source code (cmake/external/onnx), use: - ``` - export ONNX_ML=1 - python3 setup.py bdist_wheel - pip3 install --upgrade dist/*.whl - ``` ---- - -## Supported architectures and build environments - -### Architectures - -| | x86_32 | x86_64 | ARM32v7 | ARM64 | -|-----------|:------------:|:------------:|:------------:|:------------:| -|Windows | YES | YES | YES | YES | -|Linux | YES | YES | YES | YES | -|macOS | NO | YES | NO | NO | - -### Environments - -| OS | Supports CPU | Supports GPU| Notes | -|-------------|:------------:|:------------:|------------------------------------| -|Windows 10 | YES | YES | VS2019 through the latest VS2015 are supported | -|Windows 10
Subsystem for Linux | YES | NO | | -|Ubuntu 16.x | YES | YES | Also supported on ARM32v7 (experimental) | -|macOS | YES | NO | | - -GCC 4.x and below are not supported. - -### OS/Compiler Matrix: - -| OS/Compiler | Supports VC | Supports GCC | Supports Clang | -|-------------|:------------:|:----------------:|:----------------:| -|Windows 10 | YES | Not tested | Not tested | -|Linux | NO | YES(gcc>=4.8) | Not tested | -|macOS | NO | Not tested | YES (Minimum version required not ascertained)| - - ---- -## Common Build Instructions -|Description|Command|Additional details| -|-----------|-----------|-----------| -|**Basic build**|build.bat (Windows)
./build.sh (Linux)|| -|**Release build**|--config Release|Release build. Other valid config values are RelWithDebInfo and Debug.| -|**Use OpenMP**|--use_openmp|OpenMP will parallelize some of the code for potential performance improvements. This is not recommended for running on single threads.| -|**Build using parallel processing**|--parallel|This is strongly recommended to speed up the build.| -|**Build Shared Library**|--build_shared_lib|| -|**Enable Training support**|--enable_training|| - -### APIs and Language Bindings -|API|Command|Additional details| -|-----------|-----------|-----------| -|**Python**|--build_wheel|| -|**C# and C packages**|--build_nuget|Builds C# bindings and creates nuget package. Currently supported on Windows and Linux only. Implies `--build_shared_lib`
Detailed instructions can be found [below](./BUILD.md#build-nuget-packages).| -|**WindowsML**|--use_winml
--use_dml
--build_shared_lib|WindowsML depends on DirectML and the OnnxRuntime shared library| -|**Java**|--build_java|Creates an onnxruntime4j.jar in the build directory, implies `--build_shared_lib`
Compiling the Java API requires [gradle](https://gradle.org) v6.1+ to be installed in addition to the usual requirements.| -|**Node.js**|--build_nodejs|Build Node.js binding. Implies `--build_shared_lib`| - ---- -## Reduced Operator Kernel Build -Reduced Operator Kernel builds allow you to customize the kernels in the build to provide smaller binary sizes - [see instructions](./docs/Reduced_Operator_Kernel_build.md). - -## ONNX Runtime for Mobile Platforms -For builds compatible with mobile platforms, see more details in [ONNX_Runtime_for_Mobile_Platforms.md](./docs/ONNX_Runtime_for_Mobile_Platforms.md). Android and iOS build instructions can be found below on this page - [Android](#Android), [iOS](#iOS) - -## Build ONNX Runtime Server on Linux -Read more about ONNX Runtime Server [here](./docs/ONNX_Runtime_Server_Usage.md). - -Build instructions are [here](./docs/Server.md) - -## Build Nuget packages -Currently only supported on Windows and Linux. -### Prerequisites -* dotnet is required for building csharp bindings and creating managed nuget package. Follow the instructions [here](https://dotnet.microsoft.com/download) to download dotnet. Tested with versions 2.1 and 3.1. -* nuget.exe. Follow the instructions [here](https://docs.microsoft.com/en-us/nuget/install-nuget-client-tools#nugetexe-cli) to download nuget - * On Windows, downloading nuget is straightforward and simply following the instructions above should work. - * On Linux, nuget relies on Mono runtime and therefore this needs to be setup too. Above link has all the information to setup Mono and nuget. The instructions can directly be found [here](https://www.mono-project.com/docs/getting-started/install/). In some cases it is required to run `sudo apt-get install mono-complete` after installing mono. - -### Build Instructions -#### Windows -``` -.\build.bat --build_nuget -``` - -#### Linux -``` -./build.sh --build_nuget -``` -Nuget packages are created under \nuget-artifacts - ---- - -## Execution Provider Shared Libraries -The DNNL, TensorRT, and OpenVINO providers are built as shared libraries vs being statically linked into the main onnxruntime. This enables them to be loaded only when needed, and if the dependent libraries of the provider are not installed onnxruntime will still run fine, it just will not be able to use that provider. For non shared library providers, all dependencies of the provider must exist to load onnxruntime. - -### Built files -On Windows, shared provider libraries will be named 'onnxruntime_providers_\*.dll' (for example onnxruntime_providers_openvino.dll). -On Unix, they will be named 'libonnxruntime_providers_\*.so' -On Mac, they will be named 'libonnxruntime_providers_\*.dylib'. - -There is also a shared library that shared providers depend on called onnxruntime_providers_shared (with the same naming convension applied as above). - -Note: It is not recommended to put these libraries in a system location or added to a library search path (like LD_LIBRARY_PATH on Unix). If multiple versions of onnxruntime are installed on the system this can make them find the wrong libraries and lead to undefined behavior. - -### Loading the shared providers -Shared provider libraries are loaded by the onnxruntime code (do not load or depend on them in your client code). The API for registering shared or non shared providers is identical, the difference is that shared ones will be loaded at runtime when the provider is added to the session options (through a call like OrtSessionOptionsAppendExecutionProvider_OpenVINO or SessionOptionsAppendExecutionProvider_OpenVINO in the C API). -If a shared provider library cannot be loaded (if the file doesn't exist, or its dependencies don't exist or not in the path) then an error will be returned. - -The onnxruntime code will look for the provider shared libraries in the same location as the onnxruntime shared library is (or the executable statically linked to the static library version). - -## Execution Providers - -### CUDA -#### Prerequisites -* Install [CUDA](https://developer.nvidia.com/cuda-toolkit) and [cuDNN](https://developer.nvidia.com/cudnn) - * ONNX Runtime is built and tested with CUDA 10.2 and cuDNN 8.0.3 using Visual Studio 2019 version 16.7. - ONNX Runtime can also be built with CUDA versions from 10.1 up to 11.0, and cuDNN versions from 7.6 up to 8.0. - * The path to the CUDA installation must be provided via the CUDA_PATH environment variable, or the `--cuda_home` parameter - * The path to the cuDNN installation (include the `cuda` folder in the path) must be provided via the cuDNN_PATH environment variable, or `--cudnn_home` parameter. The cuDNN path should contain `bin`, `include` and `lib` directories. - * The path to the cuDNN bin directory must be added to the PATH environment variable so that cudnn64_8.dll is found. - -#### Build Instructions -##### Windows - -``` -.\build.bat --use_cuda --cudnn_home --cuda_home -``` - -##### Linux -``` -./build.sh --use_cuda --cudnn_home --cuda_home -``` - -A Dockerfile is available [here](./dockerfiles#cuda). - - -#### Notes -* Depending on compatibility between the CUDA, cuDNN, and Visual Studio 2017 versions you are using, you may need to explicitly install an earlier version of the MSVC toolset. - * CUDA 10.0 is [known to work](https://devblogs.microsoft.com/cppblog/cuda-10-is-now-available-with-support-for-the-latest-visual-studio-2017-versions/) with toolsets from 14.11 up to 14.16 (Visual Studio 2017 15.9), and should continue to work with future Visual Studio versions - * CUDA 9.2 is known to work with the 14.11 MSVC toolset (Visual Studio 15.3 and 15.4) - * To install the 14.11 MSVC toolset, see [this page](https://blogs.msdn.microsoft.com/vcblog/2017/11/15/side-by-side-minor-version-msvc-toolsets-in-visual-studio-2017). - * To use the 14.11 toolset with a later version of Visual Studio 2017 you have two options: - 1. Setup the Visual Studio environment variables to point to the 14.11 toolset by running vcvarsall.bat, prior to running the build script. e.g. if you have VS2017 Enterprise, an x64 build would use the following command `"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" amd64 -vcvars_ver=14.11` For convenience, .\build.amd64.1411.bat will do this and can be used in the same way as .\build.bat. e.g. ` .\build.amd64.1411.bat --use_cuda` - - 2. Alternatively, if you have CMake 3.13 or later you can specify the toolset version via the `--msvc_toolset` build script parameter. e.g. `.\build.bat --msvc_toolset 14.11` - -* If you have multiple versions of CUDA installed on a Windows machine and are building with Visual Studio, CMake will use the build files for the highest version of CUDA it finds in the BuildCustomization folder. -e.g. C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\BuildCustomizations\. -If you want to build with an earlier version, you must temporarily remove the 'CUDA x.y.*' files for later versions from this directory. - - ---- - -### TensorRT - -See more information on the TensorRT Execution Provider [here](./docs/execution_providers/TensorRT-ExecutionProvider.md). - -#### Prerequisites -* Install [CUDA](https://developer.nvidia.com/cuda-toolkit) and [cuDNN](https://developer.nvidia.com/cudnn) - * The TensorRT execution provider for ONNX Runtime is built and tested with CUDA 11.0 and cuDNN 8.0. - * The path to the CUDA installation must be provided via the CUDA_PATH environment variable, or the `--cuda_home` parameter. The CUDA path should contain `bin`, `include` and `lib` directories. - * The path to the CUDA `bin` directory must be added to the PATH environment variable so that `nvcc` is found. - * The path to the cuDNN installation (path to folder that contains libcudnn.so) must be provided via the cuDNN_PATH environment variable, or `--cudnn_home` parameter. - * Install [TensorRT](https://developer.nvidia.com/nvidia-tensorrt-download) - * The TensorRT execution provider for ONNX Runtime is built on TensorRT 7.1 and is tested with TensorRT 7.1.3.4. - * The path to TensorRT installation must be provided via the `--tensorrt_home` parameter. - -#### Build Instructions -Note that TensorRT is built as a [shared provider library](#Execution-Provider-Shared-Libraries) - -##### Windows -``` -.\build.bat --cudnn_home --cuda_home --use_tensorrt --tensorrt_home -``` - -##### Linux - -``` -./build.sh --cudnn_home --cuda_home --use_tensorrt --tensorrt_home -``` - -Dockerfile instructions are available [here](./dockerfiles#tensorrt) - ---- - -#### NVIDIA Jetson TX1/TX2/Nano/Xavier - -These instructions are for JetPack SDK 4.4. - -1. Clone the ONNX Runtime repo on the Jetson host - - ```bash - git clone --recursive https://github.com/microsoft/onnxruntime - ``` - -2. Specify the CUDA compiler, or add its location to the PATH. - - Cmake can't automatically find the correct nvcc if it's not in the PATH. - - ```bash - export CUDACXX="/usr/local/cuda/bin/nvcc" - - ``` - - or: - - ```bash - export PATH="/usr/local/cuda/bin:${PATH}" - ``` - -3. Install the ONNX Runtime build dependencies on the Jetpack 4.4 host: - - ```bash - sudo apt install -y --no-install-recommends \ - build-essential software-properties-common libopenblas-dev \ - libpython3.6-dev python3-pip python3-dev python3-setuptools python3-wheel - ``` - -4. Cmake is needed to build ONNX Runtime. Because the minimum required version is 3.13, - it is necessary to build CMake from source. Download Unix/Linux sources from https://cmake.org/download/ - and follow https://cmake.org/install/ to build from source. Version 3.17.5 and 3.18.4 have been tested on Jetson. - -5. Build the ONNX Runtime Python wheel: - - ```bash - ./build.sh --config Release --update --build --parallel --build_wheel \ - --use_cuda --cuda_home /usr/local/cuda --cudnn_home /usr/lib/aarch64-linux-gnu - ``` - - Note: You may optionally build with experimental TensorRT support. - ```bash - ./build.sh --config Release --update --build --parallel --build_wheel \ - --use_tensorrt --cuda_home /usr/local/cuda --cudnn_home /usr/lib/aarch64-linux-gnu \ - --tensorrt_home /usr/lib/aarch64-linux-gnu - ``` - ---- - -### DNNL and MKLML -See more information on DNNL and MKL-ML [here](./docs/execution_providers/DNNL-ExecutionProvider.md). - -#### Build Instructions -The DNNL execution provider can be built for Intel CPU or GPU. To build for Intel GPU, install [Intel SDK for OpenCL Applications](https://software.intel.com/content/www/us/en/develop/tools/opencl-sdk.html). Install the latest GPU driver - [Windows graphics driver](https://downloadcenter.intel.com/product/80939/Graphics), [Linux graphics compute runtime and OpenCL driver](https://github.com/intel/compute-runtime/releases). - -Note that DNNL is built as a [shared provider library](#Execution-Provider-Shared-Libraries) - -##### Windows -`.\build.bat --use_dnnl` - -##### Linux -`./build.sh --use_dnnl` - -To build for Intel GPU, replace dnnl_opencl_root with the path of the Intel SDK for OpenCL Applications. - -##### Windows - -`.\build.bat --use_dnnl --dnnl_gpu_runtime ocl --dnnl_opencl_root "c:\program files (x86)\intelswtools\sw_dev_tools\opencl\sdk"` - -##### Linux - -`./build.sh --use_dnnl --dnnl_gpu_runtime ocl --dnnl_opencl_root "/opt/intel/sw_dev_tools/opencl-sdk"` - ---- - -### OpenVINO -See more information on the OpenVINO Execution Provider [here](./docs/execution_providers/OpenVINO-ExecutionProvider.md). - -#### Prerequisites -1. Install the Intel® Distribution of OpenVINOTM Toolkit **Release 2021.2** for the appropriate OS and target hardware : - * [Linux - CPU, GPU, VPU, VAD-M](https://software.intel.com/en-us/openvino-toolkit/choose-download/free-download-linux) - * [Linux - FPGA](https://software.intel.com/en-us/openvino-toolkit/choose-download/free-download-linux-fpga) - * [Windows - CPU, GPU, VPU, VAD-M](https://software.intel.com/en-us/openvino-toolkit/choose-download/free-download-windows). - - Follow [documentation](https://docs.openvinotoolkit.org/2021.2/index.html) for detailed instructions. - - *2021.2 is the recommended OpenVINO version. [OpenVINO 2020.3](https://docs.openvinotoolkit.org/2020.3/index.html) is minimal OpenVINO version requirement.* - *The minimum ubuntu version to support 2021.2 is 18.04.* - -2. Configure the target hardware with specific follow on instructions: - * To configure Intel® Processor Graphics(GPU) please follow these instructions: [Windows](https://docs.openvinotoolkit.org/2021.2/openvino_docs_install_guides_installing_openvino_windows.html#Install-GPU), [Linux](https://docs.openvinotoolkit.org/2021.2/openvino_docs_install_guides_installing_openvino_linux.html#additional-GPU-steps) - * To configure Intel® MovidiusTM USB, please follow this getting started guide: [Linux](https://docs.openvinotoolkit.org/2021.2/openvino_docs_install_guides_installing_openvino_linux.html#additional-NCS-steps) - * To configure Intel® Vision Accelerator Design based on 8 MovidiusTM MyriadX VPUs, please follow this configuration guide: [Windows](https://docs.openvinotoolkit.org/2021.2/openvino_docs_install_guides_installing_openvino_windows.html#hddl-myriad), [Linux](https://docs.openvinotoolkit.org/2021.2/openvino_docs_install_guides_installing_openvino_linux.html#install-VPU). Follow steps 3 and 4 to complete the configuration. - * To configure Intel® Vision Accelerator Design with an Intel® Arria® 10 FPGA, please follow this configuration guide: [Linux](https://docs.openvinotoolkit.org/2021.2/openvino_docs_install_guides_installing_openvino_linux_fpga.html) - -3. Initialize the OpenVINO environment by running the setupvars script as shown below: - * For Linux run: - ``` - $ source /bin/setupvars.sh - ``` - * For Windows run: - ``` - C:\ \bin\setupvars.bat - ``` - -4. Extra configuration step for Intel® Vision Accelerator Design based on 8 MovidiusTM MyriadX VPUs: - * After setting the environment using setupvars script, follow these steps to change the default scheduler of VAD-M to Bypass: - * Edit the hddl_service.config file from $HDDL_INSTALL_DIR/config/hddl_service.config and change the field "bypass_device_number" to 8. - * Restart the hddl daemon for the changes to take effect. - * Note that if OpenVINO was installed with root permissions, this file has to be changed with the same permissions. - - -#### Build Instructions -Note that OpenVINO is built as a [shared provider library](#Execution-Provider-Shared-Libraries) - -##### Windows -``` -.\build.bat --config RelWithDebInfo --use_openvino --build_shared_lib -``` -*Note: The default Windows CMake Generator is Visual Studio 2017, but you can also use the newer Visual Studio 2019 by passing `--cmake_generator "Visual Studio 16 2019"` to `.\build.bat`* - -##### Linux -``` -./build.sh --config RelWithDebInfo --use_openvino --build_shared_lib -``` - - --use_openvino: Builds the OpenVINO Execution Provider in ONNX Runtime. - -* ``: Specifies the default hardware target for building OpenVINO Execution Provider. This can be overriden dynamically at runtime with another option (refer to [OpenVINO-ExecutionProvider.md](./docs/execution_providers/OpenVINO-ExecutionProvider.md) for more details on dynamic device selection). Below are the options for different Intel target devices. - -| Hardware Option | Target Device | -| --------------- | ------------------------| -| CPU_FP32 | Intel® CPUs | -| GPU_FP32 | Intel® Integrated Graphics | -| GPU_FP16 | Intel® Integrated Graphics with FP16 quantization of models | -| MYRIAD_FP16 | Intel® MovidiusTM USB sticks |  -| VAD-M_FP16 | Intel® Vision Accelerator Design based on 8 MovidiusTM MyriadX VPUs | -| VAD-F_FP32 | Intel® Vision Accelerator Design with an Intel® Arria® 10 FPGA | -| HETERO:,,... | All Intel® silicons mentioned above | -| MULTI:,,... | All Intel® silicons mentioned above | - -Specifying Hardware Target for HETERO or Multi-Device Build: - -HETERO:,,... -MULTI:,,... -The can be any of these devices from this list ['CPU','GPU','MYRIAD','FPGA','HDDL'] - -A minimum of two DEVICE_TYPE'S should be specified for a valid HETERO or Multi-Device Build. - -Example: -HETERO:MYRIAD,CPU HETERO:HDDL,GPU,CPU MULTI:MYRIAD,GPU,CPU - -For more information on OpenVINO Execution Provider's ONNX Layer support, Topology support, and Intel hardware enabled, please refer to the document [OpenVINO-ExecutionProvider.md](./docs/execution_providers/OpenVINO-ExecutionProvider.md) in $onnxruntime_root/docs/execution_providers - ---- - -### NUPHAR -See more information on the Nuphar Execution Provider [here](./docs/execution_providers/Nuphar-ExecutionProvider.md). - -#### Prerequisites -* The Nuphar execution provider for ONNX Runtime is built and tested with LLVM 9.0.0. Because of TVM's requirement when building with LLVM, you need to build LLVM from source. To build the debug flavor of ONNX Runtime, you need the debug build of LLVM. - * Windows (Visual Studio 2017): - ``` - REM download llvm source code 9.0.0 and unzip to \llvm\source\path, then install to \llvm\install\path - cd \llvm\source\path - mkdir build - cd build - cmake .. -G "Visual Studio 15 2017 Win64" -DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_ENABLE_DIA_SDK=OFF - msbuild llvm.sln /maxcpucount /p:Configuration=Release /p:Platform=x64 - cmake -DCMAKE_INSTALL_PREFIX=\llvm\install\path -DBUILD_TYPE=Release -P cmake_install.cmake - ``` - -*Note that following LLVM cmake patch is necessary to make the build work on Windows, Linux does not need to apply the patch.* -The patch is to fix the linking warning LNK4199 caused by this [LLVM commit](https://github.com/llvm-mirror/llvm/commit/148f823e4845c9a13faea62e3105abb80b39e4bc) - -``` -diff --git "a/lib\\Support\\CMakeLists.txt" "b/lib\\Support\\CMakeLists.txt" -index 7dfa97c..6d99e71 100644 ---- "a/lib\\Support\\CMakeLists.txt" -+++ "b/lib\\Support\\CMakeLists.txt" -@@ -38,12 +38,6 @@ elseif( CMAKE_HOST_UNIX ) - endif() - endif( MSVC OR MINGW ) - --# Delay load shell32.dll if possible to speed up process startup. --set (delayload_flags) --if (MSVC) -- set (delayload_flags delayimp -delayload:shell32.dll -delayload:ole32.dll) --endif() -- - # Link Z3 if the user wants to build it. - if(LLVM_WITH_Z3) - set(Z3_LINK_FILES ${Z3_LIBRARIES}) -@@ -187,7 +181,7 @@ add_llvm_library(LLVMSupport - ${LLVM_MAIN_INCLUDE_DIR}/llvm/ADT - ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support - ${Backtrace_INCLUDE_DIRS} -- LINK_LIBS ${system_libs} ${delayload_flags} ${Z3_LINK_FILES} -+ LINK_LIBS ${system_libs} ${Z3_LINK_FILES} - ) - - set_property(TARGET LLVMSupport PROPERTY LLVM_SYSTEM_LIBS "${system_libs}") -``` - * Linux - Download llvm source code 9.0.0 and unzip to /llvm/source/path, then install to /llvm/install/path - ``` - cd /llvm/source/path - mkdir build - cd build - cmake .. -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE=Release - make -j$(nproc) - cmake -DCMAKE_INSTALL_PREFIX=/llvm/install/path -DBUILD_TYPE=Release -P cmake_install.cmake - ``` - -#### Build Instructions -##### Windows -``` -.\build.bat --llvm_path=\llvm\install\path\lib\cmake\llvm --use_mklml --use_nuphar --build_shared_lib --build_csharp --enable_pybind --config=Release -``` - -* These instructions build the release flavor. The Debug build of LLVM would be needed to build with the Debug flavor of ONNX Runtime. - -##### Linux: -``` -./build.sh --llvm_path=/llvm/install/path/lib/cmake/llvm --use_mklml --use_nuphar --build_shared_lib --build_csharp --enable_pybind --config=Release -``` - -Dockerfile instructions are available [here](./dockerfiles#nuphar). - - ---- - -### DirectML -See more information on the DirectML execution provider [here](./docs/execution_providers/DirectML-ExecutionProvider.md). -#### Windows -``` -.\build.bat --use_dml -``` -#### Notes -The DirectML execution provider supports building for both x64 and x86 architectures. DirectML is only supported on Windows. - ---- - -### ARM Compute Library -See more information on the ACL Execution Provider [here](./docs/execution_providers/ACL-ExecutionProvider.md). - -#### Prerequisites -* Supported backend: i.MX8QM Armv8 CPUs -* Supported BSP: i.MX8QM BSP - * Install i.MX8QM BSP: `source fsl-imx-xwayland-glibc-x86_64-fsl-image-qt5-aarch64-toolchain-4*.sh` -* Set up the build environment -``` -source /opt/fsl-imx-xwayland/4.*/environment-setup-aarch64-poky-linux -alias cmake="/usr/bin/cmake -DCMAKE_TOOLCHAIN_FILE=$OECORE_NATIVE_SYSROOT/usr/share/cmake/OEToolchainConfig.cmake" -``` -* See [Build ARM](#ARM) below for information on building for ARM devices - -#### Build Instructions - -1. Configure ONNX Runtime with ACL support: -``` -cmake ../onnxruntime-arm-upstream/cmake -DONNX_CUSTOM_PROTOC_EXECUTABLE=/usr/bin/protoc -Donnxruntime_RUN_ONNX_TESTS=OFF -Donnxruntime_GENERATE_TEST_REPORTS=ON -Donnxruntime_DEV_MODE=ON -DPYTHON_EXECUTABLE=/usr/bin/python3 -Donnxruntime_USE_CUDA=OFF -Donnxruntime_USE_NSYNC=OFF -Donnxruntime_CUDNN_HOME= -Donnxruntime_USE_JEMALLOC=OFF -Donnxruntime_ENABLE_PYTHON=OFF -Donnxruntime_BUILD_CSHARP=OFF -Donnxruntime_BUILD_SHARED_LIB=ON -Donnxruntime_USE_EIGEN_FOR_BLAS=ON -Donnxruntime_USE_OPENBLAS=OFF -Donnxruntime_USE_ACL=ON -Donnxruntime_USE_DNNL=OFF -Donnxruntime_USE_MKLML=OFF -Donnxruntime_USE_OPENMP=ON -Donnxruntime_USE_TVM=OFF -Donnxruntime_USE_LLVM=OFF -Donnxruntime_ENABLE_MICROSOFT_INTERNAL=OFF -Donnxruntime_USE_BRAINSLICE=OFF -Donnxruntime_USE_NUPHAR=OFF -Donnxruntime_USE_EIGEN_THREADPOOL=OFF -Donnxruntime_BUILD_UNIT_TESTS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -``` -The ```-Donnxruntime_USE_ACL=ON``` option will use, by default, the 19.05 version of the Arm Compute Library. To set the right version you can use: -```-Donnxruntime_USE_ACL_1902=ON```, ```-Donnxruntime_USE_ACL_1905=ON```, ```-Donnxruntime_USE_ACL_1908=ON``` or ```-Donnxruntime_USE_ACL_2002=ON```; - -To use a library outside the normal environment you can set a custom path by using ```-Donnxruntime_ACL_HOME``` and ```-Donnxruntime_ACL_LIBS``` tags that defines the path to the ComputeLibrary directory and the build directory respectively. - -```-Donnxruntime_ACL_HOME=/path/to/ComputeLibrary```, ```-Donnxruntime_ACL_LIBS=/path/to/build``` - - -2. Build ONNX Runtime library, test and performance application: -``` -make -j 6 -``` - -3. Deploy ONNX runtime on the i.MX 8QM board -``` -libonnxruntime.so.0.5.0 -onnxruntime_perf_test -onnxruntime_test_all -``` - -#### Native Build Instructions (validated on Jetson Nano and Jetson Xavier) - -1. Build ACL Library (skip if already built) -``` -cd ~ -git clone -b v20.02 https://github.com/Arm-software/ComputeLibrary.git -cd ComputeLibrary -sudo apt-get install -y scons g++-arm-linux-gnueabihf -scons -j8 arch=arm64-v8a Werror=1 debug=0 asserts=0 neon=1 opencl=1 examples=1 build=native -``` - -2. Cmake is needed to build ONNX Runtime. Because the minimum required version is 3.13, - it is necessary to build CMake from source. Download Unix/Linux sources from https://cmake.org/download/ - and follow https://cmake.org/install/ to build from source. Version 3.17.5 and 3.18.4 have been tested on Jetson. - -3. Build onnxruntime with --use_acl flag with one of the supported ACL version flags. (ACL_1902 | ACL_1905 | ACL_1908 | ACL_2002) -``` -./build.sh --config RelWithDebInfo --use_acl ACL_2002 --update --build --build_wheel --parallel --acl_home ~/ComputeLibrary --acl_libs ~/ComputeLibrary/build -``` - ---- - -### ArmNN -See more information on the ArmNN Execution Provider [here](./docs/execution_providers/ArmNN-ExecutionProvider.md). - -#### Prerequisites -* Supported backend: i.MX8QM Armv8 CPUs -* Supported BSP: i.MX8QM BSP - * Install i.MX8QM BSP: `source fsl-imx-xwayland-glibc-x86_64-fsl-image-qt5-aarch64-toolchain-4*.sh` -* Set up the build environment -``` -source /opt/fsl-imx-xwayland/4.*/environment-setup-aarch64-poky-linux -alias cmake="/usr/bin/cmake -DCMAKE_TOOLCHAIN_FILE=$OECORE_NATIVE_SYSROOT/usr/share/cmake/OEToolchainConfig.cmake" -``` - -* See [Build ARM](#ARM) below for information on building for ARM devices - -#### Build Instructions -``` -./build.sh --use_armnn - -``` -The Relu operator is set by default to use the CPU execution provider for better performance. To use the ArmNN implementation build with --armnn_relu flag -``` -./build.sh --use_armnn --armnn_relu -``` -The Batch Normalization operator is set by default to use the CPU execution provider. To use the ArmNN implementation build with --armnn_bn flag -``` -./build.sh --use_armnn --armnn_bn -``` - -To use a library outside the normal environment you can set a custom path by providing the --armnn_home and --armnn_libs parameters to define the path to the ArmNN home directory and build directory respectively. -The ARM Compute Library home directory and build directory must also be available, and can be specified if needed using --acl_home and --acl_libs respectively. -``` -./build.sh --use_armnn --armnn_home /path/to/armnn --armnn_libs /path/to/armnn/build --acl_home /path/to/ComputeLibrary --acl_libs /path/to/acl/build -``` - ---- - -### RKNPU -See more information on the RKNPU Execution Provider [here](./docs/execution_providers/RKNPU-ExecutionProvider.md). - -#### Prerequisites - -* Supported platform: RK1808 Linux -* See [Build ARM](#ARM) below for information on building for ARM devices -* Use gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu instead of gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf, and modify CMAKE_CXX_COMPILER & CMAKE_C_COMPILER in tool.cmake: - ``` - set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) - set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) - ``` - -#### Build Instructions -##### Linux -1. Download [rknpu_ddk](#https://github.com/airockchip/rknpu_ddk.git) to any directory. - -2. Build ONNX Runtime library and test: - ``` - ./build.sh --arm --use_rknpu --parallel --build_shared_lib --build_dir build_arm --config MinSizeRel --cmake_extra_defines RKNPU_DDK_PATH= CMAKE_TOOLCHAIN_FILE= ONNX_CUSTOM_PROTOC_EXECUTABLE= - ``` -3. Deploy ONNX runtime and librknpu_ddk.so on the RK1808 board: - ``` - libonnxruntime.so.1.2.0 - onnxruntime_test_all - rknpu_ddk/lib64/librknpu_ddk.so - ``` - ---- - -### Vitis-AI -See more information on the Xilinx Vitis-AI execution provider [here](./docs/execution_providers/Vitis-AI-ExecutionProvider.md). - -For instructions to setup the hardware environment: [Hardware setup](./docs/execution_providers/Vitis-AI-ExecutionProvider.md#Hardware-setup) - -#### Linux - -``` -./build.sh --use_vitisai -``` -#### Notes -The Vitis-AI execution provider is only supported on Linux. - -## Options -### OpenMP -#### Build Instructions -##### Windows -``` -.\build.bat --use_openmp -``` - -##### Linux/macOS -``` -./build.sh --use_openmp - -``` - ---- - -### OpenBLAS -#### Prerequisites -* OpenBLAS - * Windows: See build instructions [here](https://github.com/xianyi/OpenBLAS/wiki/How-to-use-OpenBLAS-in-Microsoft-Visual-Studio#build-openblas-for-universal-windows-platform) - * Linux: Install the libopenblas-dev package `sudo apt-get install libopenblas-dev` - -#### Build Instructions -##### Windows -``` -.\build.bat --use_openblas -``` - -##### Linux -``` -./build.sh --use_openblas -``` - ---- - -### DebugNodeInputsOutputs -OnnxRuntime supports build options for enabling debugging of intermediate tensor shapes and data. - -#### Build Instructions -Set onnxruntime_DEBUG_NODE_INPUTS_OUTPUT to build with this enabled. - -**Linux** -``` -./build.sh --cmake_extra_defines onnxruntime_DEBUG_NODE_INPUTS_OUTPUTS=1 -``` - -**Windows** -``` -.\build.bat --cmake_extra_defines onnxruntime_DEBUG_NODE_INPUTS_OUTPUTS=1 -``` - -#### Configuration -The debug dump behavior can be controlled with several environment variables. -See [onnxruntime/core/framework/debug_node_inputs_outputs_utils.h](./onnxruntime/core/framework/debug_node_inputs_outputs_utils.h) for details. - -##### Examples - -To specify that node output data should be dumped (to stdout by default), set this environment variable: -``` -ORT_DEBUG_NODE_IO_DUMP_OUTPUT_DATA=1 -``` - -To specify that node output data should be dumped to files for nodes with name "Foo" or "Bar", set these environment variables: -``` -ORT_DEBUG_NODE_IO_DUMP_OUTPUT_DATA=1 -ORT_DEBUG_NODE_IO_NAME_FILTER="Foo;Bar" -ORT_DEBUG_NODE_IO_DUMP_DATA_TO_FILES=1 -``` - ---- - -## Architectures -### [64-bit x86](https://en.wikipedia.org/wiki/X86-64) (also known as x86_64 or AMD64) - -This is the default. - -### 32-bit x86 -#### Build Instructions -##### Windows -* add `--x86` argument when launching `.\build.bat` - -##### Linux -(Not officially supported) - ---- - -### ARM -There are a few options for building for ARM. - -* [Cross compiling for ARM with simulation (Linux/Windows)](#Cross-compiling-for-ARM-with-simulation-LinuxWindows) - **Recommended**; Easy, slow -* [Cross compiling on Linux](#Cross-compiling-on-Linux) - Difficult, fast -* [Native compiling on Linux ARM device](#Native-compiling-on-Linux-ARM-device) - Easy, slower -* [Cross compiling on Windows](#Cross-compiling-on-Windows) - - -#### Cross compiling for ARM with simulation (Linux/Windows) -*EASY, SLOW, RECOMMENDED* - -This method rely on qemu user mode emulation. It allows you to compile using a desktop or cloud VM through instruction level simulation. You'll run the build on x86 CPU and translate every ARM instruction to x86. This is much faster than compiling natively on a low-end ARM device and avoids out-of-memory issues that may be encountered. The resulting ONNX Runtime Python wheel (.whl) file is then deployed to an ARM device where it can be invoked in Python 3 scripts. - -Here is [an example for Raspberrypi3 and Raspbian](./dockerfiles/README.md#arm-32v7). Note: this does not work for Raspberrypi 1 or Zero, and if your operating system is different from what the dockerfile uses, it also may not work. - -The build process can take hours. - -#### Cross compiling on Linux -*Difficult, fast* - -This option is very fast and allows the package to be built in minutes, but is challenging to setup. If you have a large code base (e.g. you are adding a new execution provider to onnxruntime), this may be the only feasible method. - -##### 1. Get the corresponding toolchain. -TLDR; Go to https://www.linaro.org/downloads/, get "64-bit Armv8 Cortex-A, little-endian" and "Linux Targeted", not "Bare-Metal Targeted". Extract it to your build machine and add the bin folder to your $PATH env. Then skip this part. - -You can use [GCC](https://gcc.gnu.org/) or [Clang](http://clang.llvm.org/). Both work, but instructions here are based on GCC. - -In GCC terms: -* "build" describes the type of system on which GCC is being configured and compiled -* "host" describes the type of system on which GCC runs. -"target" to describe the type of system for which GCC produce code -When not cross compiling, usually "build" = "host" = "target". When you do cross compile, usually "build" = "host" != "target". For example, you may build GCC on x86_64, then run GCC on x86_64, then generate binaries that target aarch64. In this case,"build" = "host" = x86_64 Linux, target is aarch64 Linux. - -You can either build GCC from source code by yourself, or get a prebuilt one from a vendor like Ubuntu, linaro. Choosing the same compiler version as your target operating system is best. If ths is not possible, choose the latest stable one and statically link to the GCC libs. - -When you get the compiler, run `aarch64-linux-gnu-gcc -v` This should produce an output like below: - -``` -Using built-in specs. -COLLECT_GCC=/usr/bin/aarch64-linux-gnu-gcc -COLLECT_LTO_WRAPPER=/usr/libexec/gcc/aarch64-linux-gnu/9/lto-wrapper -Target: aarch64-linux-gnu -Configured with: ../gcc-9.2.1-20190827/configure --bindir=/usr/bin --build=x86_64-redhat-linux-gnu --datadir=/usr/share --disable-decimal-float --disable-dependency-tracking --disable-gold --disable-libgcj --disable-libgomp --disable-libmpx --disable-libquadmath --disable-libssp --disable-libunwind-exceptions --disable-shared --disable-silent-rules --disable-sjlj-exceptions --disable-threads --with-ld=/usr/bin/aarch64-linux-gnu-ld --enable-__cxa_atexit --enable-checking=release --enable-gnu-unique-object --enable-initfini-array --enable-languages=c,c++ --enable-linker-build-id --enable-lto --enable-nls --enable-obsolete --enable-plugin --enable-targets=all --exec-prefix=/usr --host=x86_64-redhat-linux-gnu --includedir=/usr/include --infodir=/usr/share/info --libexecdir=/usr/libexec --localstatedir=/var --mandir=/usr/share/man --prefix=/usr --program-prefix=aarch64-linux-gnu- --sbindir=/usr/sbin --sharedstatedir=/var/lib --sysconfdir=/etc --target=aarch64-linux-gnu --with-bugurl=http://bugzilla.redhat.com/bugzilla/ --with-gcc-major-version-only --with-isl --with-newlib --with-plugin-ld=/usr/bin/aarch64-linux-gnu-ld --with-sysroot=/usr/aarch64-linux-gnu/sys-root --with-system-libunwind --with-system-zlib --without-headers --enable-gnu-indirect-function --with-linker-hash-style=gnu -Thread model: single -gcc version 9.2.1 20190827 (Red Hat Cross 9.2.1-3) (GCC) -``` - -Check the value of `--build`, `--host`, `--target`, and if it has special args like `--with-arch=armv8-a`, `--with-arch=armv6`, `--with-tune=arm1176jz-s`, `--with-fpu=vfp`, `--with-float=hard`. - -You must also know what kind of flags your target hardware need, which can differ greatly. For example, if you just get the normal ARMv7 compiler and use it for Raspberry Pi V1 directly, it won't work because Raspberry Pi only has ARMv6. Generally every hardware vendor will provide a toolchain; check how that one was built. - -A target env is identifed by: - -* Arch: x86_32, x86_64, armv6,armv7,arvm7l,aarch64,... -* OS: bare-metal or linux. -* Libc: gnu libc/ulibc/musl/... -* ABI: ARM has mutilple ABIs like eabi, eabihf... - -You can get all these information from the previous output, please be sure they are all correct. - -##### 2. Get a pre-compiled protoc: - Get this from https://github.com/protocolbuffers/protobuf/releases/download/v3.11.2/protoc-3.11.2-linux-x86_64.zip and unzip after downloading. - The version must match the one onnxruntime is using. Currently we are using 3.11.2. - -##### 3. (Optional) Setup sysroot to enable python extension. *Skip if not using Python.* - - Dump the root file system of the target operating system to your build machine. We'll call that folder "sysroot" and use it for build onnxruntime python extension. Before doing that, you should install python3 dev package(which contains the C header files) and numpy python package on the target machine first. - - Below are some examples. - - If the target OS is raspbian-buster, please download the RAW image from [their website](https://www.raspberrypi.org/downloads/raspbian/) then run: -```bash -$ fdisk -l 2020-02-13-raspbian-buster.img -``` -Disk 2020-02-13-raspbian-buster.img: 3.54 GiB, 3787456512 bytes, 7397376 sectors -Units: sectors of 1 * 512 = 512 bytes -Sector size (logical/physical): 512 bytes / 512 bytes -I/O size (minimum/optimal): 512 bytes / 512 bytes -Disklabel type: dos -Disk identifier: 0xea7d04d6 - -| Device | Boot | Start | End | Sectors | Size | Id | Type | -|---------------------------------|------|--------|---------|---------|------|----|-----------------| -| 2020-02-13-raspbian-buster.img1 | | 8192 | 532479 | 524288 | 256M | c | W95 FAT32 (LBA) | -| 2020-02-13-raspbian-buster.img2 | | 532480 | 7397375 | 6864896 | 3.3G | 83 | Linux | - -You'll find the the root partition starts at the 532480 sector, which is 532480 \* 512=272629760 bytes from the beginning. - -Then run: -```bash -$ mkdir /mnt/pi -$ mount -r -o loop,offset=272629760 2020-02-13-raspbian-buster.img /mnt/pi -``` - -You'll see all raspbian files at /mnt/pi. However you can't use it yet. Because some of the symlinks are broken, you must fix them first. -In /mnt/pi, run -``` -$ find . -type l -exec realpath {} \; |grep 'No such file' -``` -It will show which are broken. -Then you can fix them by running: -```bash -$ mkdir /mnt/pi2 -$ cd /mnt/pi2 -$ sudo tar -C /mnt/pi -cf - . | sudo tar --transform 'flags=s;s,^/,/mnt/pi2/,' -xf - -``` -Then /mnt/pi2 is the sysroot folder you'll use in the next step. - -If the target OS is Ubuntu, you can get an image from [https://cloud-images.ubuntu.com/](https://cloud-images.ubuntu.com/). But that image is in qcow2 format. Please convert it before run fdisk and mount. -```bash -qemu-img convert -p -O raw ubuntu-18.04-server-cloudimg-arm64.img ubuntu.raw -``` -The remaining part is similar to raspbian. - -If the target OS is manylinux2014, you can get it by: -Install qemu-user-static from apt or dnf. -Then run the docker -Ubuntu: -```bash -docker run -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static -it --rm quay.io/pypa/manylinux2014_aarch64 /bin/bash -``` -The "-v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static" arg is not needed on Fedora. - -Then, inside the docker, run -```bash -cd /opt/python -./cp35-cp35m/bin/python -m pip install numpy==1.16.6 -./cp36-cp36m/bin/python -m pip install numpy==1.16.6 -./cp37-cp37m/bin/python -m pip install numpy==1.16.6 -./cp38-cp38/bin/python -m pip install numpy==1.16.6 -``` - -These commands will take a few hours because numpy doesn't have a prebuilt package yet. When completed, open a second window and run -```bash -docker ps -``` -From the output: -``` -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -5a796e98db05 quay.io/pypa/manylinux2014_aarch64 "/bin/bash" 3 minutes ago Up 3 minutes affectionate_cannon -``` -You'll see the docker instance id is: 5a796e98db05. Use the following command to export the root filesystem as the sysroot for future use. - -```bash -docker export 5a796e98db05 -o manylinux2014_aarch64.tar -``` - -##### 4. Generate CMake toolchain file - Save the following content as tool.cmake - -```cmake - SET(CMAKE_SYSTEM_NAME Linux) - SET(CMAKE_SYSTEM_VERSION 1) - SET(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) - SET(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) - SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) - SET(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) - SET(CMAKE_FIND_ROOT_PATH /mnt/pi) -``` -If you don't have a sysroot, you can delete the last line. - -##### 5. Run CMake and make - Append `-DONNX_CUSTOM_PROTOC_EXECUTABLE=/path/to/protoc -DCMAKE_TOOLCHAIN_FILE=path/to/tool.cmake` to your cmake args, run cmake and make to build it. If you want to build Python package as well, you can use cmake args like: -``` --Donnxruntime_GCC_STATIC_CPP_RUNTIME=ON -DCMAKE_BUILD_TYPE=Release -Dprotobuf_WITH_ZLIB=OFF -DCMAKE_TOOLCHAIN_FILE=path/to/tool.cmake -Donnxruntime_ENABLE_PYTHON=ON -DPYTHON_EXECUTABLE=/mnt/pi/usr/bin/python3 -Donnxruntime_BUILD_SHARED_LIB=OFF -Donnxruntime_DEV_MODE=OFF -DONNX_CUSTOM_PROTOC_EXECUTABLE=/path/to/protoc "-DPYTHON_INCLUDE_DIR=/mnt/pi/usr/include;/mnt/pi/usr/include/python3.7m" -DNUMPY_INCLUDE_DIR=/mnt/pi/folder/to/numpy/headers -``` - -After running cmake, run -``` -$ make -``` - -##### 6. (Optional) Build Python package -Copy the setup.py file from the source folder to the build folder and run -```bash -python3 setup.py bdist_wheel -p linux_aarch64 -``` - -If targeting manylinux, unfortunately their tools do not work in the cross-compiling scenario. Run it in a docker like: - -```bash -docker run -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static -v `pwd`:/tmp/a -w /tmp/a --rm quay.io/pypa/manylinux2014_aarch64 /opt/python/cp37-cp37m/bin/python3 setup.py bdist_wheel -``` -This is not needed if you only want to target a specfic Linux distribution (i.e. Ubuntu). - - -#### Native compiling on Linux ARM device -*Easy, slower* - -Docker build runs on a Raspberry Pi 3B with Raspbian Stretch Lite OS (Desktop version will run out memory when linking the .so file) will take 8-9 hours in total. -```bash -sudo apt-get update -sudo apt-get install -y \ - sudo \ - build-essential \ - curl \ - libcurl4-openssl-dev \ - libssl-dev \ - wget \ - python3 \ - python3-pip \ - python3-dev \ - git \ - tar - -pip3 install --upgrade pip -pip3 install --upgrade setuptools -pip3 install --upgrade wheel -pip3 install numpy - -# Build the latest cmake -mkdir /code -cd /code -wget https://cmake.org/files/v3.13/cmake-3.16.1.tar.gz; -tar zxf cmake-3.16.1.tar.gz - -cd /code/cmake-3.16.1 -./configure --system-curl -make -sudo make install - -# Prepare onnxruntime Repo -cd /code -git clone --recursive https://github.com/Microsoft/onnxruntime - -# Start the basic build -cd /code/onnxruntime -./build.sh --config MinSizeRel --update --build - -# Build Shared Library -./build.sh --config MinSizeRel --build_shared_lib - -# Build Python Bindings and Wheel -./build.sh --config MinSizeRel --enable_pybind --build_wheel - -# Build Output -ls -l /code/onnxruntime/build/Linux/MinSizeRel/*.so -ls -l /code/onnxruntime/build/Linux/MinSizeRel/dist/*.whl -``` - -#### Cross compiling on Windows -**Using Visual C++ compilers** -1. Download and install Visual C++ compilers and libraries for ARM(64). - If you have Visual Studio installed, please use the Visual Studio Installer (look under the section `Individual components` after choosing to `modify` Visual Studio) to download and install the corresponding ARM(64) compilers and libraries. - -2. Use `.\build.bat` and specify `--arm` or `--arm64` as the build option to start building. Preferably use `Developer Command Prompt for VS` or make sure all the installed cross-compilers are findable from the command prompt being used to build using the PATH environmant variable. - ---- - -### Android - -#### Prerequisites - -The SDK and NDK packages can be installed via Android Studio or the sdkmanager command line tool. -Android Studio is more convenient but a larger installation. -The command line tools are smaller and usage can be scripted, but are a little more complicated to setup. They also require a Java runtime environment to be available. - -General Info: - - API levels: https://developer.android.com/guide/topics/manifest/uses-sdk-element.html - - Android ABIs: https://developer.android.com/ndk/guides/abis - - System Images: https://developer.android.com/topic/generic-system-image - -##### Android Studio - -Install Android Studio from https://developer.android.com/studio - -Install any additional SDK Platforms if necessary - - File->Settings->Appearance & Behavior->System Settings->Android SDK to see what is currently installed - - Note that the SDK path you need to use as --android_sdk_path when building ORT is also on this configuration page - - Most likely you don't require additional SDK Platform packages as the latest platform can target earlier API levels. - -Install an NDK version - - File->Settings->Appearance & Behavior->System Settings->Android SDK - - 'SDK Tools' tab - - Select 'Show package details' checkbox at the bottom to see specific versions. - By default the latest will be installed which should be fine. - - The NDK path will be the 'ndk/{version}' subdirectory of the SDK path shown - - e.g. if 21.1.6352462 is installed it will be {SDK path}/ndk/21.1.6352462 - -##### sdkmanager from command line tools - - If necessary install the Java Runtime Environment and set the JAVA_HOME environment variable to point to it - - https://www.java.com/en/download/ - - Windows note: You MUST install the 64-bit version (https://www.java.com/en/download/manual.jsp) otherwise sdkmanager will only list x86 packages - and the latest NDK is x64 only. - - For sdkmanager to work it needs a certain directory structure. - First create the top level directory for the Android infrastructure. - - in our example we'll call that `.../Android/` - - Download the command line tools from the 'Command line tools only' section towards the bottom - of https://developer.android.com/studio - - Create a directory called 'cmdline-tools' under your top level directory - - giving `.../Android/cmdline-tools` - - extract the 'tools' directory from the command line tools zip file into this directory - - giving `.../Android/cmdline-tools/tools` - - Windows note: preferably extract using 7-zip. - If using the built in Windows zip extract tool you will need to fix the directory structure - by moving the jar files from `tools\lib\_` up to `tools\lib` - - See https://stackoverflow.com/questions/27364963/could-not-find-or-load-main-class-com-android-sdkmanager-main - - you should now be able to run Android/cmdline-tools/bin/sdkmanager[.bat] successfully - - if you see an error about it being unable to save settings and the sdkmanager help text, - your directory structure is incorrect. - - see the final steps in this answer to double check: https://stackoverflow.com/a/61176718 - - - Run `.../Android/cmdline-tools/bin/sdkmanager --list` to see the packages available - - - Install the SDK Platform - - Generally installing the latest is fine. You pick an API level when compiling the code and the latest platform will support many recent API levels - - e.g. `sdkmanager --install "platforms;android-29"` - - This will install into the 'platforms' directory of our top level directory - - so the 'Android' directory in our example - - The SDK path to use as --android_sdk_path when building is this top level directory - - - Install the NDK - - Find the available NDK versions by running `sdkmanager --list` - - Install - - you can install a specific version or the latest (called 'ndk-bundle') - - e.g. `sdkmanager --install "ndk;21.1.6352462"` - - NDK path in our example with this install would be `.../Android/ndk/21.1.6352462` - - NOTE: If you install the ndk-bundle package the path will be `.../Android/ndk-bundle` as there's no version number - -#### Android Build Instructions - -##### Cross compiling on Windows - -The [Ninja](https://ninja-build.org/) generator needs to be used to build on Windows as the Visual Studio generator doesn't support Android. - -``` -./build.bat --android --android_sdk_path --android_ndk_path --android_abi --android_api --cmake_generator Ninja -``` - -e.g. using the paths from our example -``` -./build.bat --android --android_sdk_path .../Android --android_ndk_path .../Android/ndk/21.1.6352462 --android_abi arm64-v8a --android_api 27 --cmake_generator Ninja -``` - -##### Cross compiling on Linux and macOS - -``` -./build.sh --android --android_sdk_path --android_ndk_path --android_abi --android_api -``` - -##### Build Android Archive (AAR) - -Android Archive (AAR) files, which can be imported directly in Android Studio, will be generated in your_build_dir/java/build/outputs/aar, by using the above building commands with `--build_java` - -To build on Windows with `--build_java` enabled you must also: - - set JAVA_HOME to the path to your JDK install - - this could be the JDK from Android Studio, or a [standalone JDK install](https://www.oracle.com/java/technologies/javase-downloads.html) - - e.g. Powershell: `$env:JAVA_HOME="C:\Program Files\Java\jdk-15"` - CMD: `set JAVA_HOME=C:\Program Files\Java\jdk-15` - - install [Gradle](https://gradle.org/install/) and add the directory to the PATH - - e.g. Powershell: `$env:PATH="$env:PATH;C:\Gradle\gradle-6.6.1\bin"` - CMD: `set PATH=%PATH%;C:\Gradle\gradle-6.6.1\bin` - - run the build from an admin window - - the Java build needs permissions to create a symlink, which requires an admin window - -#### Android NNAPI Execution Provider - -If you want to use NNAPI Execution Provider on Android, see [NNAPI Execution Provider](/docs/execution_providers/NNAPI-ExecutionProvider.md). - -##### Build Instructions - -Android NNAPI Execution Provider can be built using building commands in [Android Build instructions](#android-build-instructions) with `--use_nnapi` - ---- - -### iOS - -#### Prerequisites -* A Mac computer with latest macOS -* Xcode, https://developer.apple.com/xcode/ -* CMake, https://cmake.org/download/ -* Python 3, https://www.python.org/downloads/mac-osx/ - -#### General Info: -* iOS Platforms - - The following two platforms are supported - * iOS device (iPhone, iPad) with arm64 architecture - * iOS simulator with x86_64 architecture - - armv7, armv7s and i386 architectures are not currently supported. - - tvOS and watchOS platforms are not currently supported. -* apple_deploy_target - - Specify the minimum version of the target platform (iOS) on which the target binaries are to be deployed. -* Code Signing - - If the development team ID which has a valid code signing certificate is specified, Xcode will code sign the onnxruntime library in the building process, otherwise, the onnxruntime will be built without code signing. It may be required or desired to code sign the library for iOS devices. For more information, see [Code Signing](https://developer.apple.com/support/code-signing/). - -#### Build Instructions -Run one of the following build scripts from the ONNX Runtime repository root, -##### Cross build for iOS simulator -``` -./build.sh --config --use_xcode \ - --ios --ios_sysroot iphonesimulator --osx_arch x86_64 --apple_deploy_target -``` -##### Cross build for iOS device -``` -./build.sh --config --use_xcode \ - --ios --ios_sysroot iphoneos --osx_arch arm64 --apple_deploy_target -``` -##### Cross build for iOS device and code sign the library -``` -./build.sh --config --use_xcode \ - --ios --ios_sysroot iphoneos --osx_arch arm64 --apple_deploy_target \ - --xcode_code_signing_team_id -``` ---- - -### AMD MIGraphX - -See more information on the MIGraphX Execution Provider [here](./docs/execution_providers/MIGraphX-ExecutionProvider.md). - -#### Prerequisites -* Install [ROCM](https://rocmdocs.amd.com/en/latest/Installation_Guide/Installation-Guide.html) - * The MIGraphX execution provider for ONNX Runtime is built and tested with ROCM3.3 -* Install [MIGraphX](https://github.com/ROCmSoftwarePlatform/AMDMIGraphX) - * The path to MIGraphX installation must be provided via the `--migraphx_home parameter`. - -#### Build Instructions - -##### Linux - -``` -./build.sh --config --use_migraphx --migraphx_home -``` - -Dockerfile instructions are available [here](./dockerfiles#migraphx) - -*** - -# Training - -## Baseline CPU - -### Build Instructions -To build ORT with training support add `--enable_training` build instruction. - -All other build options are the same for inferencing as they are for training. - -#### Windows -``` -.\build.bat --config RelWithDebInfo --build_shared_lib --parallel --enable_training -``` - -The default Windows CMake Generator is Visual Studio 2017, but you can also use the newer Visual Studio 2019 by passing -`--cmake_generator "Visual Studio 16 2019"` to `.\build.bat` - - -#### Linux/macOS -``` -./build.sh --config RelWithDebInfo --build_shared_lib --parallel --enable_training -``` - -## Training Enabled Execution Providers - -### CUDA -#### Prerequisites - -The default NVIDIA GPU build requires CUDA runtime libraries installed on the system: - -* [CUDA](https://developer.nvidia.com/cuda-toolkit) 10.2 -* [cuDNN](https://developer.nvidia.com/cudnn) 8.0 -* [NCCL](https://developer.nvidia.com/nccl) 2.7 -* [OpenMPI](https://www.open-mpi.org/) 4.0.4 - * See [install_openmpi.sh](./tools/ci_build/github/linux/docker/scripts/install_openmpi.sh) - -These dependency versions should reflect what is in [Dockerfile.training](./dockerfiles/Dockerfile.training). - -#### Build instructions - -1. Checkout this code repo with `git clone https://github.com/microsoft/onnxruntime` - -2. Set the environment variables: *adjust the path for location your build machine* - ``` - export CUDA_HOME= # e.g. /usr/local/cuda - export CUDNN_HOME= # e.g. /usr/local/cuda - export CUDACXX= #e.g. /usr/local/cuda/bin/nvcc - export PATH=:$PATH - export LD_LIBRARY_PATH=:$LD_LIBRARY_PATH - export MPI_CXX_INCLUDE_PATH= - source # e.g. /data/intel/impi/2018.3.222/intel64/bin/mpivars.sh - ``` - -3. Create the ONNX Runtime wheel - - * Change to the ONNX Runtime repo base folder: `cd onnxruntime` - * Run `./build.sh --enable_training --use_cuda --config=RelWithDebInfo --build_wheel` - - This produces the .whl file in `./build/Linux/RelWithDebInfo/dist` for ONNX Runtime Training. - -### ROCM -#### Prerequisites - -The default AMD GPU build requires ROCM software toolkit installed on the system: - -* [ROCM](https://rocmdocs.amd.com/en/latest/) -* [OpenMPI](https://www.open-mpi.org/) 4.0.4 - * See [install_openmpi.sh](./tools/ci_build/github/linux/docker/scripts/install_openmpi.sh) - -These dependency versions should reflect what is in [Dockerfile.training](./dockerfiles/Dockerfile.training). - -### Build instructions - -1. Checkout this code repo with `git clone https://github.com/microsoft/onnxruntime` - -2. Create the ONNX Runtime wheel - - * Change to the ONNX Runtime repo base folder: `cd onnxruntime` - * Run `./build.sh --config RelWithDebInfo --enable_training --build_wheel --use_rocm --rocm_home /opt/rocm --nccl_home /opt/rocm --mpi_home ` - - This produces the .whl file in `./build/Linux/RelWithDebInfo/dist` for ONNX Runtime Training. - -### DNNL and MKLML - -#### Build Instructions -##### Linux - -`./build.sh --enable_training --use_dnnl` - -##### Windows - -`.\build.bat --enable_training --use_dnnl` - -Add `--build_wheel` to build the ONNX Runtime wheel - -This will produce a .whl file in `build/Linux/RelWithDebInfo/dist` for ONNX Runtime Training \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bbc7612867..ab38f47d57 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -38,7 +38,7 @@ For making changes to the Windows Machine Learning WinRT API, please label your * A feature can be implemented by you, the ONNX Runtime team, or other community members. Code contributions are greatly appreciated: feel free to work on any reviewed feature you proposed, or choose one in the backlog and send us a PR. If you are new to the project and want to work on an existing issue, we recommend starting with issues that are tagged with “good first issue”. Please let us know in the issue comments if you are actively working on implementing a feature so we can ensure it's assigned to you. * Unit tests: New code *must* be accompanied by unit tests. * Documentation and sample updates: If the PR affects any of the documentation or samples then include those updates in the same PR. -* Build instructions are [here](BUILD.md). +* Build instructions are [here](https://www.onnxruntime.ai/docs/how-to/build.html). * Checkin Procedure: Once a feature is complete and tested according to the contribution guidelines follow these steps: * Fork the repo * git clone your fork diff --git a/docs/Android_testing.md b/docs/Android_testing.md index 2caffa2a24..f37525cfcc 100644 --- a/docs/Android_testing.md +++ b/docs/Android_testing.md @@ -1,6 +1,6 @@ # Testing Android Changes using the Emulator -See [BUILD.md](../Build.md#Android) for Android build instructions and information on the locations of the various files referred to here. +See [Android build instructions](https://www.onnxruntime.ai/docs/how-to/build.html#android) and information on the locations of the various files referred to here. ## Install the emulator diff --git a/docs/ONNX_Runtime_Server_Usage.md b/docs/ONNX_Runtime_Server_Usage.md index decd40f346..1589301e94 100644 --- a/docs/ONNX_Runtime_Server_Usage.md +++ b/docs/ONNX_Runtime_Server_Usage.md @@ -101,7 +101,7 @@ For easy tracking of requests, we provide the following header fields: ### rsyslog Support -If you prefer using an ONNX Runtime Server with [rsyslog](https://www.rsyslog.com/) support([build instruction](../BUILD.md#build-onnx-runtime-server-on-linux)), you should be able to see the log in `/var/log/syslog` after the ONNX Runtime Server runs. For detail about how to use rsyslog, please reference [here](https://www.rsyslog.com/category/guides-for-rsyslog/). +If you prefer using an ONNX Runtime Server with [rsyslog](https://www.rsyslog.com/) support([build instruction](https://www.onnxruntime.ai/docs/how-to/build.html#build-onnx-runtime-server-on-linux)), you should be able to see the log in `/var/log/syslog` after the ONNX Runtime Server runs. For detail about how to use rsyslog, please reference [here](https://www.rsyslog.com/category/guides-for-rsyslog/). ## Report Issues diff --git a/docs/Reduced_Operator_Kernel_build.md b/docs/Reduced_Operator_Kernel_build.md index c310af2a2b..7c6413284b 100644 --- a/docs/Reduced_Operator_Kernel_build.md +++ b/docs/Reduced_Operator_Kernel_build.md @@ -6,7 +6,7 @@ A configuration file must be created with details of the kernels that are requir Following that, ORT must be manually built, providing the configuration file in the `--include_ops_by_config` parameter. The build process will update the ORT kernel registration source files to exclude the unused kernels. -See the [build instructions](https://github.com/microsoft/onnxruntime/blob/master/BUILD.md#build-instructions) for more details on building ORT. +See the [build instructions](https://www.onnxruntime.ai/docs/how-to/build.html#build-instructions) for more details on building ORT. When building ORT with a reduced set of kernel registrations, `--skip_tests` **MUST** be specified as the kernel reduction will render many of the unit tests invalid. diff --git a/docs/python/notebooks/onnxruntime-nuphar-tutorial.ipynb b/docs/python/notebooks/onnxruntime-nuphar-tutorial.ipynb index fff760062f..1cef01e084 100644 --- a/docs/python/notebooks/onnxruntime-nuphar-tutorial.ipynb +++ b/docs/python/notebooks/onnxruntime-nuphar-tutorial.ipynb @@ -17,7 +17,7 @@ "\n", "This example shows how to accelerate model inference using Nuphar, an execution provider that leverages just-in-time compilation to generate optimized executables.\n", "\n", - "For more background about Nuphar, please check [Nuphar-ExecutionProvider.md](https://github.com/microsoft/onnxruntime/blob/master/docs/execution_providers/Nuphar-ExecutionProvider.md) and its [build instructions](https://github.com/microsoft/onnxruntime/blob/master/BUILD.md#nuphar).\n", + "For more background about Nuphar, please check [Nuphar-ExecutionProvider.md](https://github.com/microsoft/onnxruntime/blob/master/docs/execution_providers/Nuphar-ExecutionProvider.md) and its [build instructions](https://www.onnxruntime.ai/docs/how-to/build.html#nuphar).\n", "\n", "#### Tutorial Roadmap:\n", "1. Prerequistes\n", diff --git a/java/README.md b/java/README.md index cb1a449b85..e46284a7e4 100644 --- a/java/README.md +++ b/java/README.md @@ -10,7 +10,7 @@ For general purpose usage of the publicly distributed API, please see the [gener ### Building -Use the main project's [build instructions](../BUILD.md) with the `--build_java` option. +Use the main project's [build instructions](https://www.onnxruntime.ai/docs/how-to/build.html) with the `--build_java` option. #### Requirements diff --git a/nodejs/README.md b/nodejs/README.md index e0b6ab3c64..2207396d65 100644 --- a/nodejs/README.md +++ b/nodejs/README.md @@ -28,7 +28,7 @@ Following platforms are supported with pre-built binaries: - Linux x64 CPU NAPI_v3 - MacOS x64 CPU NAPI_v3 -To use on platforms without pre-built binaries, you can build Node.js binding from source and consume it by `npm install /nodejs/`. See also [BUILD.MD](../BUILD.md#apis-and-language-bindings) for building ONNX Runtime Node.js binding locally. +To use on platforms without pre-built binaries, you can build Node.js binding from source and consume it by `npm install /nodejs/`. See also [instructions](https://www.onnxruntime.ai/docs/how-to/build.html#apis-and-language-bindings) for building ONNX Runtime Node.js binding locally. ## License diff --git a/samples/c_cxx/README.md b/samples/c_cxx/README.md index b3587c014f..031339be91 100644 --- a/samples/c_cxx/README.md +++ b/samples/c_cxx/README.md @@ -15,7 +15,7 @@ This directory contains a few C/C++ sample applications for demoing onnxruntime You may get a precompiled libpng library from [https://onnxruntimetestdata.blob.core.windows.net/models/libpng.zip](https://onnxruntimetestdata.blob.core.windows.net/models/libpng.zip) ## Install ONNX Runtime -You may either get a prebuit onnxruntime from nuget.org, or build it from source by following the [build instructions](../../BUILD.md). +You may either get a prebuit onnxruntime from nuget.org, or build it from source by following the [build instructions](https://www.onnxruntime.ai/docs/how-to/build.html). If you build it by yourself, you must append the "--build_shared_lib" flag to your build command. Open Developer Command Prompt for Visual Studio version you are going to use. This will setup necessary environment for the compiler and other things to be found. ``` From 47519623cd594b0ed6bf9b9816fb199ce8a757fd Mon Sep 17 00:00:00 2001 From: Guoyu Wang <62914304+gwang-msft@users.noreply.github.com> Date: Fri, 19 Feb 2021 12:19:32 -0800 Subject: [PATCH 10/37] Fix iOS/macOS build warning for inconsistent symbol visibility settings (#6750) * Fix ios/macos build warning * Corrent a typo * Fix test failure * Fix custom op test failure --- cmake/CMakeLists.txt | 16 +++++++++++----- .../providers/coreml/coreml_provider_factory.h | 4 ++-- .../core/providers/cpu/cpu_provider_factory.h | 1 + .../providers/nnapi/nnapi_provider_factory.h | 3 ++- .../onnxruntime/core/session/onnxruntime_c_api.h | 11 ++++++++--- .../custom_op_library/custom_op_library.h | 3 +-- 6 files changed, 25 insertions(+), 13 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index a07893771c..a702e2c5a4 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -240,7 +240,7 @@ if (onnxruntime_MINIMAL_BUILD) if (onnxruntime_MINIMAL_BUILD_CUSTOM_OPS) add_compile_definitions(ORT_MINIMAL_BUILD_CUSTOM_OPS) endif() - + set(onnxruntime_REDUCED_OPS_BUILD ON) if (NOT onnxruntime_ENABLE_PYTHON) @@ -371,6 +371,12 @@ if(onnxruntime_CROSS_COMPILING) endif() endif() +# Mark symbols to be invisible, for macOS/iOS target only +# Due to many dependencies have different symbol visibility settings, set global compile flags here. +if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin|iOS") + string(APPEND CMAKE_CXX_FLAGS " -fvisibility=hidden -fvisibility-inlines-hidden") +endif() + #must after OpenMP settings find_package(Threads) @@ -715,7 +721,7 @@ endif() function(onnxruntime_add_shared_library target_name) add_library(${target_name} SHARED ${ARGN}) - target_link_directories(${target_name} PRIVATE ${onnxruntime_LINK_DIRS}) + target_link_directories(${target_name} PRIVATE ${onnxruntime_LINK_DIRS}) if (MSVC) target_compile_options(${target_name} PRIVATE "$<$:SHELL:--compiler-options /utf-8>" "$<$>:/utf-8>") target_compile_options(${target_name} PRIVATE "$<$:SHELL:--compiler-options /sdl>" "$<$>:/sdl>") @@ -753,9 +759,9 @@ function(onnxruntime_add_shared_library_module target_name) endfunction() #almost the same as the above function, except the first line of the body -function(onnxruntime_add_executable target_name) +function(onnxruntime_add_executable target_name) add_executable(${target_name} ${ARGN}) - target_link_directories(${target_name} PRIVATE ${onnxruntime_LINK_DIRS}) + target_link_directories(${target_name} PRIVATE ${onnxruntime_LINK_DIRS}) if (MSVC) target_compile_options(${target_name} PRIVATE "$<$:SHELL:--compiler-options /utf-8>" "$<$>:/utf-8>") target_compile_options(${target_name} PRIVATE "$<$:SHELL:--compiler-options /sdl>" "$<$>:/sdl>") @@ -979,7 +985,7 @@ if (WIN32) list(APPEND ORT_WARNING_FLAGS "/wd4201") if (onnxruntime_ENABLE_STATIC_ANALYSIS) list(APPEND ORT_WARNING_FLAGS "/analyze:stacksize 131072") - list(APPEND ORT_WARNING_FLAGS "/wd6326") # potential comparison of a constant with another constant + list(APPEND ORT_WARNING_FLAGS "/wd6326") # potential comparison of a constant with another constant if(onnxruntime_USE_OPENMP) list(APPEND ORT_WARNING_FLAGS "/wd6993") # Code analysis ignores OpenMP constructs endif() diff --git a/include/onnxruntime/core/providers/coreml/coreml_provider_factory.h b/include/onnxruntime/core/providers/coreml/coreml_provider_factory.h index 5acedfc12d..451e622473 100644 --- a/include/onnxruntime/core/providers/coreml/coreml_provider_factory.h +++ b/include/onnxruntime/core/providers/coreml/coreml_provider_factory.h @@ -28,8 +28,8 @@ enum COREMLFlags { extern "C" { #endif -ORT_API_STATUS(OrtSessionOptionsAppendExecutionProvider_CoreML, - _In_ OrtSessionOptions* options, uint32_t coreml_flags); +ORT_EXPORT ORT_API_STATUS(OrtSessionOptionsAppendExecutionProvider_CoreML, + _In_ OrtSessionOptions* options, uint32_t coreml_flags); #ifdef __cplusplus } diff --git a/include/onnxruntime/core/providers/cpu/cpu_provider_factory.h b/include/onnxruntime/core/providers/cpu/cpu_provider_factory.h index 66f258922c..292678692b 100644 --- a/include/onnxruntime/core/providers/cpu/cpu_provider_factory.h +++ b/include/onnxruntime/core/providers/cpu/cpu_provider_factory.h @@ -10,6 +10,7 @@ extern "C" { /** * \param use_arena zero: false. non-zero: true. */ +ORT_EXPORT ORT_API_STATUS(OrtSessionOptionsAppendExecutionProvider_CPU, _In_ OrtSessionOptions* options, int use_arena) ORT_ALL_ARGS_NONNULL; diff --git a/include/onnxruntime/core/providers/nnapi/nnapi_provider_factory.h b/include/onnxruntime/core/providers/nnapi/nnapi_provider_factory.h index e8e1ecb1a0..a2d5f03a38 100644 --- a/include/onnxruntime/core/providers/nnapi/nnapi_provider_factory.h +++ b/include/onnxruntime/core/providers/nnapi/nnapi_provider_factory.h @@ -44,7 +44,8 @@ enum NNAPIFlags { extern "C" { #endif -ORT_API_STATUS(OrtSessionOptionsAppendExecutionProvider_Nnapi, _In_ OrtSessionOptions* options, uint32_t nnapi_flags); +ORT_EXPORT ORT_API_STATUS(OrtSessionOptionsAppendExecutionProvider_Nnapi, + _In_ OrtSessionOptions* options, uint32_t nnapi_flags); #ifdef __cplusplus } diff --git a/include/onnxruntime/core/session/onnxruntime_c_api.h b/include/onnxruntime/core/session/onnxruntime_c_api.h index 3a602b195a..7ec87fb363 100644 --- a/include/onnxruntime/core/session/onnxruntime_c_api.h +++ b/include/onnxruntime/core/session/onnxruntime_c_api.h @@ -53,7 +53,12 @@ extern "C" { #define ORT_MUST_USE_RESULT #define ORTCHAR_T wchar_t #else +// To make symbols visible on macOS/iOS +#ifdef __APPLE__ +#define ORT_EXPORT __attribute__((visibility("default"))) +#else #define ORT_EXPORT +#endif #define ORT_API_CALL #define ORT_MUST_USE_RESULT __attribute__((warn_unused_result)) #define ORTCHAR_T char @@ -1131,7 +1136,7 @@ struct OrtApi { ORT_API2_STATUS(SetGlobalDenormalAsZero, _Inout_ OrtThreadingOptions* tp_options); /** - * Use this API to create the configuration of an arena that can eventually be used to define + * Use this API to create the configuration of an arena that can eventually be used to define * an arena based allocator's behavior * \param max_mem - use 0 to allow ORT to choose the default * \param arena_extend_strategy - use -1 to allow ORT to choose the default, 0 = kNextPowerOfTwo, 1 = kSameAsRequested @@ -1151,8 +1156,8 @@ struct OrtApi { * (doc_string field of the GraphProto message within the ModelProto message). * If it doesn't exist, an empty string will be returned. * \param model_metadata - an instance of OrtModelMetadata - * \param allocator - allocator used to allocate the string that will be returned back - * \param value - is set to a null terminated string allocated using 'allocator'. + * \param allocator - allocator used to allocate the string that will be returned back + * \param value - is set to a null terminated string allocated using 'allocator'. The caller is responsible for freeing it. */ ORT_API2_STATUS(ModelMetadataGetGraphDescription, _In_ const OrtModelMetadata* model_metadata, diff --git a/onnxruntime/test/testdata/custom_op_library/custom_op_library.h b/onnxruntime/test/testdata/custom_op_library/custom_op_library.h index c1a21b561c..c4c465eacc 100644 --- a/onnxruntime/test/testdata/custom_op_library/custom_op_library.h +++ b/onnxruntime/test/testdata/custom_op_library/custom_op_library.h @@ -5,8 +5,7 @@ extern "C" { #endif -OrtStatus* ORT_API_CALL RegisterCustomOps(OrtSessionOptions* options, const OrtApiBase* api); - +ORT_EXPORT OrtStatus* ORT_API_CALL RegisterCustomOps(OrtSessionOptions* options, const OrtApiBase* api); #ifdef __cplusplus } From 3bda7f4d36ba11c81b02e82faf363c9ce04f650d Mon Sep 17 00:00:00 2001 From: Tianlei Wu Date: Fri, 19 Feb 2021 21:47:36 -0800 Subject: [PATCH 11/37] Fix longformer parity and perf regression (#6760) * add fast kernel back, update benchmark and conversion scripts --- .../cpu/bert/longformer_attention_base.h | 5 + .../cuda/bert/longformer_attention.cc | 20 +- .../cuda/bert/longformer_attention.h | 3 + .../cuda/bert/longformer_attention_impl.cu | 135 ++-- .../cuda/bert/longformer_attention_impl.h | 8 +- .../cuda/bert/longformer_attention_softmax.cu | 657 ++++++++++++++++++ .../cuda/bert/longformer_attention_softmax.h | 51 ++ .../tools/transformers/benchmark_helper.py | 82 +++ .../tools/transformers/longformer/__init__.py | 6 + .../longformer/benchmark_longformer.py | 317 +++++---- .../longformer/convert_longformer_to_onnx.py | 415 ++++++----- .../longformer/longformer_helper.py | 76 ++ .../python/tools/transformers/onnx_model.py | 5 +- .../longformer_attention_op_test.cc | 79 ++- tools/ci_build/amd_hipify.py | 2 + 15 files changed, 1460 insertions(+), 401 deletions(-) create mode 100644 onnxruntime/contrib_ops/cuda/bert/longformer_attention_softmax.cu create mode 100644 onnxruntime/contrib_ops/cuda/bert/longformer_attention_softmax.h create mode 100644 onnxruntime/python/tools/transformers/longformer/longformer_helper.py diff --git a/onnxruntime/contrib_ops/cpu/bert/longformer_attention_base.h b/onnxruntime/contrib_ops/cpu/bert/longformer_attention_base.h index 182727ab58..00cc451073 100644 --- a/onnxruntime/contrib_ops/cpu/bert/longformer_attention_base.h +++ b/onnxruntime/contrib_ops/cpu/bert/longformer_attention_base.h @@ -25,5 +25,10 @@ class LongformerAttentionBase { int window_; // Attention windows length (W). It is half (one-sided) of total window size. }; +namespace longformer { +// Environment variable to give a hint about choosing kernels for less memory or latency. +constexpr const char* kUseCompactMemory = "ORT_LONGFORMER_COMPACT_MEMORY"; +} // namespace longformer + } // namespace contrib } // namespace onnxruntime diff --git a/onnxruntime/contrib_ops/cuda/bert/longformer_attention.cc b/onnxruntime/contrib_ops/cuda/bert/longformer_attention.cc index 89156634a8..19e838971a 100644 --- a/onnxruntime/contrib_ops/cuda/bert/longformer_attention.cc +++ b/onnxruntime/contrib_ops/cuda/bert/longformer_attention.cc @@ -5,6 +5,7 @@ #include "core/framework/tensorprotoutils.h" #include "core/providers/cuda/cuda_common.h" #include "core/providers/cuda/shared_inc/fpgeneric.h" +#include "core/platform/env_var_utils.h" #include "longformer_global_impl.h" #include "longformer_attention_impl.h" @@ -49,7 +50,9 @@ class AutoDestoryCudaEvent { }; template -LongformerAttention::LongformerAttention(const OpKernelInfo& info) : CudaKernel(info), LongformerAttentionBase(info) {} +LongformerAttention::LongformerAttention(const OpKernelInfo& info) : CudaKernel(info), LongformerAttentionBase(info) { + use_compact_memory_ = ParseEnvironmentVariableWithDefault(longformer::kUseCompactMemory, false); +} template Status LongformerAttention::ComputeInternal(OpKernelContext* context) const { @@ -80,6 +83,7 @@ Status LongformerAttention::ComputeInternal(OpKernelContext* context) const { constexpr size_t element_size = sizeof(T); + // TODO: only calculate once per model. // Build Global Index auto global_index_buffer = GetScratchBuffer(batch_size * sequence_length); auto batch_global_num_buffer = GetScratchBuffer(batch_size); @@ -148,10 +152,11 @@ Status LongformerAttention::ComputeInternal(OpKernelContext* context) const { } } - // Cuda kernel implementation has a limitation of number of global tokens. - if (max_num_global > window_) { - ORT_THROW("LongformerAttention CUDA operator does not support number of global tokens > attention window."); - } + // Force to use fast kernel in two situations: + // (1) global tokens > windows size. In that case, compact memory kernel cannot be used. + // (2) sequence_length == 2 * attention_window. Use fast kernel to walk around parity issue of compact memory kernel. + // In other case, we will choose according to user's environment variable setting (default is fast kernel). + bool use_fast_kernel = (max_num_global > window_ || sequence_length == 2 * window_ || !use_compact_memory_); // Fully connection for global projection. // Note that Q only need handle global query tokens if we split GEMM to global Q/K/V separately. @@ -172,7 +177,7 @@ Status LongformerAttention::ComputeInternal(OpKernelContext* context) const { &one, reinterpret_cast(global_gemm_buffer.get()), n, device_prop)); } - size_t workSpaceSize = GetLongformerAttentionWorkspaceSize(element_size, batch_size, num_heads_, head_size, sequence_length, max_num_global, window_); + size_t workSpaceSize = GetLongformerAttentionWorkspaceSize(element_size, batch_size, num_heads_, head_size, sequence_length, max_num_global, window_, use_fast_kernel); auto workspace_buffer = GetScratchBuffer(workSpaceSize); if (!LaunchLongformerAttentionKernel( device_prop, @@ -193,7 +198,8 @@ Status LongformerAttention::ComputeInternal(OpKernelContext* context) const { head_size, window_, max_num_global, - element_size)) { + element_size, + use_fast_kernel)) { // Get last error to reset it to cudaSuccess. CUDA_CALL(cudaGetLastError()); return Status(common::ONNXRUNTIME, common::FAIL); diff --git a/onnxruntime/contrib_ops/cuda/bert/longformer_attention.h b/onnxruntime/contrib_ops/cuda/bert/longformer_attention.h index 151e542c4e..fa9dfd8c9b 100644 --- a/onnxruntime/contrib_ops/cuda/bert/longformer_attention.h +++ b/onnxruntime/contrib_ops/cuda/bert/longformer_attention.h @@ -18,6 +18,9 @@ class LongformerAttention final : public CudaKernel, public LongformerAttentionB public: LongformerAttention(const OpKernelInfo& info); Status ComputeInternal(OpKernelContext* context) const override; + + private: + bool use_compact_memory_; }; } // namespace cuda diff --git a/onnxruntime/contrib_ops/cuda/bert/longformer_attention_impl.cu b/onnxruntime/contrib_ops/cuda/bert/longformer_attention_impl.cu index d43b524997..4793d37b57 100644 --- a/onnxruntime/contrib_ops/cuda/bert/longformer_attention_impl.cu +++ b/onnxruntime/contrib_ops/cuda/bert/longformer_attention_impl.cu @@ -28,7 +28,7 @@ limitations under the License. #include "core/providers/cuda/cuda_common.h" #include "longformer_attention_impl.h" #include "attention_impl.h" -#include "attention_softmax.h" +#include "longformer_attention_softmax.h" using namespace onnxruntime::cuda; using namespace cub; @@ -53,11 +53,8 @@ namespace cuda { // [SoftmaxSpace: see below] [Q:BxNxSxH] [K:BxNxSxH] [V:BxNxSxH] [Global_Q:BxNxSxH] [Global_K:BxNxSxH] [Global_V:BxNxSxH] // where Global_Q, Global_K and Global_V are optional. They are not allocated when there is no global token. // -// It is feasible to use compact format for Global_Q with shape BxNxGxH to save space. We do not use compact format for now. -// // SoftmaxSpace layout: // [scratch1: (5S-3W)*W*N*B][scratch2: size_t 20] -// // Scratch1 has 5 buffers for local and global attention calculation. // Scratch2 has 5 input pointers, 5 output pointers, 5 buffer sizes and 5 strides related to scratch1. @@ -74,10 +71,17 @@ size_t GetLongformerSoftmaxWorkspaceSize( int batch_size, int num_heads, int sequence_length, - int window) { - size_t scratch1_size = GetScratch1Size(element_size, batch_size, num_heads, sequence_length, window); - size_t scratch2_size = 10 * (sizeof(void*) + sizeof(size_t)); - return scratch1_size + scratch2_size; + int window, + bool use_fast_kernel) { + if (!use_fast_kernel) { + size_t scratch1_size = GetScratch1Size(element_size, batch_size, num_heads, sequence_length, window); + size_t scratch2_size = 10 * (sizeof(void*) + sizeof(size_t)); + return scratch1_size + scratch2_size; + } else { + // Non-compact layout when environment variable ORT_LONGFORMER_COMPACT_MEMORY=0 is set. + // [scratch1: BxNxSxS] [scratch2: BxNxSxS] + return 2 * GetAttentionScratchSize(element_size, batch_size, num_heads, sequence_length, sequence_length); + } } size_t GetLongformerAttentionWorkspaceSize( @@ -87,8 +91,9 @@ size_t GetLongformerAttentionWorkspaceSize( int head_size, int sequence_length, int max_num_global, - int window) { - size_t softmax_size = GetLongformerSoftmaxWorkspaceSize(element_size, batch_size, num_heads, sequence_length, window); + int window, + bool use_fast_kernel) { + size_t softmax_size = GetLongformerSoftmaxWorkspaceSize(element_size, batch_size, num_heads, sequence_length, window, use_fast_kernel); size_t qkv_size = 3 * batch_size * sequence_length * num_heads * head_size * element_size; size_t global_qkv_size = max_num_global > 0 ? qkv_size : 0; return softmax_size + qkv_size + global_qkv_size; @@ -100,6 +105,7 @@ size_t GetPinnedBufferSize(int batch_size) { return sizeof(int) * batch_size + GetScratch2Size(); } +// Softmax kernel for compact format template __launch_bounds__(blockSize) __global__ void LongformerSoftmaxKernel(const int* global_attention, @@ -354,7 +360,6 @@ bool launchSoftmaxKernel( cudaStream_t stream, cublasHandle_t cublas, void* workspace, - size_t softmax_workspace_size, const void* q, // transposed Q with shape (B, N, S, H) const void* k, // transposed K with shape (B, N, S, H) const void* v, // transposed V with shape (B, N, S, H) @@ -373,10 +378,7 @@ bool launchSoftmaxKernel( int num_heads, // number of heads int head_size, // hidden size per head int window, // one sided window size - int max_num_global, // maximum number of global tokens (G) in all batches size_t element_size) { // size of element: 2 for half, and 4 for float - assert(max_num_global <= window); - const int* global_count = reinterpret_cast(pinned_buffer); bool is_fp16 = (element_size == 2); @@ -605,7 +607,10 @@ bool launchSoftmaxKernel( resultType, algo)); - void* global_q_batch = (char*)global_q + (i * elements_per_batch) * element_size; // For compact format: replace elements_per_batch by num_heads * max_num_global * head_size + // It is feasible to use compact format for Global_Q with shape BxNxGxH to save space. + // In that case, elements_per_batch is num_heads * max_num_global * head_size, and stride_per_head is max_num_global * head_size. + + void* global_q_batch = (char*)global_q + (i * elements_per_batch) * element_size; void* global_k_batch = (char*)global_k + (i * elements_per_batch) * element_size; qk_batch = (char*)input_pointers[4] + (i * buffer_sizes[4] * num_heads) * element_size; @@ -625,7 +630,7 @@ bool launchSoftmaxKernel( global_q_batch, // B Btype, // B type head_size, // ldb - stride_per_head, // strideB. For compact format: max_num_global * head_size. + stride_per_head, // strideB. beta_0, // beta qk_batch, // C Ctype, // C type @@ -827,8 +832,9 @@ bool LongformerQkvToContext( const T* global_input, const int* global_attention, const int* global_index, const int* batch_global_num, const int max_num_global, void* pinned_buffer, T* workspace, - T* output) { - size_t softmax_workspace_size = GetLongformerSoftmaxWorkspaceSize(element_size, batch_size, num_heads, sequence_length, window); + T* output, + size_t softmax_workspace_size, + bool use_fast_kernel) { T* qkv = reinterpret_cast((char*)workspace + softmax_workspace_size); // Number of elements in Q, K, V, Global_Q, Global_K or Global_V are same: BxNxSxH @@ -862,33 +868,62 @@ bool LongformerQkvToContext( const float rsqrt_head_size = 1.f / sqrt(static_cast(head_size)); T* temp_output = qkv; // Q will be overwritten - if (!launchSoftmaxKernel( - stream, - cublas, - workspace, - softmax_workspace_size, - q, // Transposed Q with shape B x N x S x H - k, // Transposed K with shape B x N x S x H - v, // Transposed V with shape B x N x S x H - attention_mask, // Attention mask flags with shape B x S - global_q, // Transposed global Q with shape B x N x S x H. - global_k, // Transposed global K with shape B x N x S x H - global_v, // Transposed global V with shape B x N x S x H - global_attention, // Global attention flags with shape B x S - global_index, // Global index with shape B x S - batch_global_num, // Number of global token per batch with shape B x 1 - pinned_buffer, // Pinned Memory Buffer - temp_output, // Output with shape B x N x S x H - rsqrt_head_size, // Scaler - batch_size, // Batch size - sequence_length, // Sequence length - num_heads, // Number of attention heads - head_size, // Hidden size per head - window, // Half (one-sided) window size - max_num_global, // Maximum number of global tokens (G) - element_size)) { - return false; + + if (use_fast_kernel) { + if (!launchSoftmaxFastKernel( + stream, + cublas, + workspace, // softmax space + q, // transposed Q with shape (B, N, S, H) + k, // transposed K with shape (B, N, S, H) + v, // transposed V with shape (B, N, S, H) + attention_mask, // attention mask with shape (B, S), with value 0.0 not masked, and -10000.0 masked. + global_q, // Q for global tokens with shape (B, N, S, H) + global_k, // K for global tokens with shape (B, N, S, H) + global_v, // V for global tokens with shape (B, N, S, H) + global_attention, // global attention with shape (B, S), with value 0 for local attention and 1 for global attention. + global_index, // Global index with shape (B, S) + batch_global_num, // Number of global tokens per batch with shape (B, 1) + pinned_buffer, // Pinned memory in CPU. Number of global tokens per batch with shape (B, 1) + temp_output, // output with shape (B, N, S, H) + rsqrt_head_size, // scalar + batch_size, // batch size + sequence_length, // sequence length + num_heads, // number of heads + head_size, // hidden size per head + window, // Half (one-sided) window size + element_size)) { + return false; + } + } else { + assert(max_num_global <= window); + if (!launchSoftmaxKernel( + stream, + cublas, + workspace, // softmax space + q, // Transposed Q with shape B x N x S x H + k, // Transposed K with shape B x N x S x H + v, // Transposed V with shape B x N x S x H + attention_mask, // Attention mask flags with shape B x S. Value -10000.0 means masked, and 0.0 not mased. + global_q, // Transposed global Q with shape B x N x S x H. + global_k, // Transposed global K with shape B x N x S x H + global_v, // Transposed global V with shape B x N x S x H + global_attention, // Global attention flags with shape B x S + global_index, // Global index with shape B x S + batch_global_num, // Number of global token per batch with shape B x 1 + pinned_buffer, // Pinned Memory Buffer + temp_output, // Output with shape B x N x S x H + rsqrt_head_size, // Scaler + batch_size, // Batch size + sequence_length, // Sequence length + num_heads, // Number of attention heads + head_size, // Hidden size per head + window, // Half (one-sided) window size + element_size)) { + return false; + } } + // The temp_output is BxNxSxH, transpose it to final output BxSxNxH return LaunchTransCtx(stream, sequence_length, batch_size, head_size, num_heads, temp_output, output); @@ -913,8 +948,10 @@ bool LaunchLongformerAttentionKernel( int head_size, int window, int max_num_global, - const size_t element_size) { + const size_t element_size, + bool use_fast_kernel) { CublasMathModeSetter helper(device_prop, cublas, CUBLAS_TENSOR_OP_MATH); + size_t softmax_workspace_size = GetLongformerSoftmaxWorkspaceSize(element_size, batch_size, num_heads, sequence_length, window, use_fast_kernel); if (element_size == 2) { return LongformerQkvToContext(cublas, stream, batch_size, sequence_length, num_heads, head_size, window, element_size, @@ -927,7 +964,9 @@ bool LaunchLongformerAttentionKernel( max_num_global, pinned_buffer, reinterpret_cast(workspace), - reinterpret_cast(output)); + reinterpret_cast(output), + softmax_workspace_size, + use_fast_kernel); } else { return LongformerQkvToContext(cublas, stream, batch_size, sequence_length, num_heads, head_size, window, element_size, @@ -940,7 +979,9 @@ bool LaunchLongformerAttentionKernel( max_num_global, pinned_buffer, reinterpret_cast(workspace), - reinterpret_cast(output)); + reinterpret_cast(output), + softmax_workspace_size, + use_fast_kernel); } } diff --git a/onnxruntime/contrib_ops/cuda/bert/longformer_attention_impl.h b/onnxruntime/contrib_ops/cuda/bert/longformer_attention_impl.h index 1cc0d80313..6530061b83 100644 --- a/onnxruntime/contrib_ops/cuda/bert/longformer_attention_impl.h +++ b/onnxruntime/contrib_ops/cuda/bert/longformer_attention_impl.h @@ -18,9 +18,10 @@ size_t GetLongformerAttentionWorkspaceSize( int head_size, int sequence_length, int max_num_global, - int window); + int window, + bool use_fast_kernel); - bool LaunchLongformerAttentionKernel( +bool LaunchLongformerAttentionKernel( const cudaDeviceProp& device_prop, // Device Properties cublasHandle_t& cublas, // Cublas handle cudaStream_t stream, // CUDA stream @@ -39,7 +40,8 @@ size_t GetLongformerAttentionWorkspaceSize( int head_size, // Hidden layer size per head (H) int window, // One sided attention window (W) int max_num_global, // Maximum number of global tokens (G) - const size_t element_size // Element size of input tensor + const size_t element_size, // Element size of input tensor, + bool use_fast_kernel // Use compact memory ); } // namespace cuda diff --git a/onnxruntime/contrib_ops/cuda/bert/longformer_attention_softmax.cu b/onnxruntime/contrib_ops/cuda/bert/longformer_attention_softmax.cu new file mode 100644 index 0000000000..0f95df570f --- /dev/null +++ b/onnxruntime/contrib_ops/cuda/bert/longformer_attention_softmax.cu @@ -0,0 +1,657 @@ +/* +Copyright (c) NVIDIA Corporation and Microsoft Corporation + +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. +*/ + +// This is fast cuda kernels for longformer attention softmax. +// It uses two temporary matrix of BxNxSxS, and consumes more memory when sequence length is large. + +#include +#include +#include +#include +#include +#include "core/providers/cuda/cu_inc/common.cuh" +#include "core/providers/cuda/cuda_common.h" +#include "longformer_attention_softmax.h" +#include "attention_impl.h" + +using namespace onnxruntime::cuda; +using namespace cub; + +#define CHECK(expr) \ + if (!CUBLAS_CALL(expr)) { \ + return false; \ + } + +namespace onnxruntime { +namespace contrib { +namespace cuda { + +template +__launch_bounds__(blockSize) + __global__ void LongformerSoftmaxFastKernel(const int* global_attention, + const int* global_index, + const int* batch_global_num, + const T* input, + const T* attention_mask, + T* output, + float scaler, + int dim0, + int sequence_length, + int attention_window) { + typedef cub::BlockReduce BlockReduce; + __shared__ typename BlockReduce::TempStorage block_reduce_temp; + __shared__ float max_shared; + __shared__ float sum_shared; + + const T* input_block = input + sequence_length * blockIdx.x; + T* output_block = output + sequence_length * blockIdx.x; + const int batch_index = blockIdx.x / dim0; + const int row_index = blockIdx.x % sequence_length; + const int global_num = batch_global_num[batch_index]; + + // To be consistent with Huggingface Longformer, the row of maksed word are set as zero. + if ((float)attention_mask[batch_index * sequence_length + row_index] < 0.0f) { + for (int i = threadIdx.x; i < sequence_length; i += blockSize) { + output_block[i] = (T)(0); + } + return; + } + + // local attention token + int col_start = 0; + int col_end = sequence_length; + bool is_local_row = (global_attention[batch_index * sequence_length + row_index] == (int)0); + if (is_local_row) { + col_start = row_index - attention_window; + if (col_start < 0) { + col_start = 0; + } + + col_end = row_index + attention_window + 1; + if (col_end > sequence_length) { + col_end = sequence_length; + } + } + + const T* mask_block = attention_mask + sequence_length * batch_index; + int tid = threadIdx.x; + + // calculate max input + float max_input = -CUDART_INF_F; + // #pragma unroll 16 + for (int i = tid + col_start; i < col_end; i += blockSize) { + float x = input_block[i]; + x = x * scaler + (float)mask_block[i]; + if (max_input < x) { + max_input = x; + } + } + + if (is_local_row) { + for (int g = tid; g < global_num; g += blockSize) { + int i = global_index[g]; + if (i < col_start || i > col_end) { + float x = input_block[i]; + x = x * scaler + (float)mask_block[i]; + if (max_input < x) { + max_input = x; + } + } + } + } + + float max_block = BlockReduce(block_reduce_temp).Reduce(max_input, cub::Max()); + if (tid == 0) { + max_shared = max_block; + } + __syncthreads(); + + float sum_input = 0.f; + // #pragma unroll 16 + for (int i = tid + col_start; i < col_end; i += blockSize) { + float x = input_block[i]; + x = expf((x)*scaler + (float)mask_block[i] - max_shared); + sum_input += x; + } + + if (is_local_row) { + for (int g = tid; g < global_num; g += blockSize) { + int i = global_index[g]; + if (i < col_start || i > col_end) { + float x = input_block[i]; + x = expf((x)*scaler + (float)mask_block[i] - max_shared); + sum_input += x; + } + } + } + + float sum_block = BlockReduce(block_reduce_temp).Reduce(sum_input, cub::Sum()); + if (tid == 0) { + sum_shared = sum_block; + } + __syncthreads(); + float recip_sum = 1.f / sum_shared; + + if (is_local_row) { + // We only need to fill in zeros for blocks that will be used in the matrix multiplication + // following the Softmax. + // + // For now zero-out only [row_index - 2*attention_window, row_index + 2*attention_window], + // we can even be more agressive and reduce the zeroing out window size since + // each row has entries in 3 blocks (3*attention_window size instead of 4*attention_window) + int zero_start = row_index - 2 * attention_window; + if (zero_start < 0) { + zero_start = 0; + } + + int zero_end = row_index + 2 * attention_window; + if (zero_end > sequence_length) { + zero_end = sequence_length; + } + + for (int i = tid + zero_start; i < zero_end; i += blockSize) { + output_block[i] = (T)(0.); + } + + for (int g = tid; g < global_num; g += blockSize) { + int i = global_index[g]; + float x = input_block[i]; + x = expf((x)*scaler + (float)mask_block[i] - max_shared); + output_block[i] = (T)(recip_sum * x); + } + } + + // #pragma unroll 16 + for (int i = tid + col_start; i < col_end; i += blockSize) { + float x = input_block[i]; + x = expf((x)*scaler + (float)mask_block[i] - max_shared); + output_block[i] = (T)(recip_sum * x); + } +} + +// Launch the softmax kernel for non compact memory. +bool launchSoftmaxFastKernel( + cudaStream_t stream, + cublasHandle_t cublas, + void* workspace, // softmax space + const void* q, // transposed Q with shape (B, N, S, H) + const void* k, // transposed K with shape (B, N, S, H) + const void* v, // transposed V with shape (B, N, S, H) + const void* attention_mask, // attention mask with shape (B, S), with value 0.0 not masked, and -10000.0 masked. + const void* global_q, // Q for global tokens with shape (B, N, S, H) + const void* global_k, // K for global tokens with shape (B, N, S, H) + const void* global_v, // V for global tokens with shape (B, N, S, H) + const int* global_attention, // global attention with shape (B, S), with value 0 for local attention and 1 for global attention. + const int* global_index, // Global index with shape (B, S) + const int* batch_global_num, // Number of global tokens per batch with shape (B, 1) + void* pinned_buffer, // Pinned memory in CPU. Number of global tokens per batch with shape (B, 1) + void* output, // output with shape (B, N, S, H) + float scaler, // scalar + int batch_size, // batch size + int sequence_length, // sequence length + int num_heads, // number of heads + int head_size, // hidden size per head + int attention_window, // one sided windows size + size_t element_size) { // size of element: 2 for half, and 4 for float + + bool is_fp16 = (element_size == 2); + void* scratch1 = reinterpret_cast(workspace); + void* scratch2 = reinterpret_cast(scratch1) + GetAttentionScratchSize(element_size, batch_size, num_heads, sequence_length, sequence_length); + + // setup shared parameters for two strided batched matrix multiplies + cudaDataType_t Atype; + cudaDataType_t Btype; + cudaDataType_t Ctype; + cudaDataType_t resultType; + cublasGemmAlgo_t algo = CUBLAS_GEMM_DEFAULT; + + __half one_fp16, zero_fp16; + float one_fp32, zero_fp32; + void *alpha, *beta_0, *beta_1; + + if (is_fp16) { + one_fp16 = __float2half(1.f); + zero_fp16 = __float2half(0.f); + alpha = static_cast(&one_fp16); + beta_0 = static_cast(&zero_fp16); + beta_1 = static_cast(&one_fp16); + Atype = CUDA_R_16F; + Btype = CUDA_R_16F; + Ctype = CUDA_R_16F; + resultType = CUDA_R_16F; + algo = CUBLAS_GEMM_DEFAULT_TENSOR_OP; + } else { + one_fp32 = 1.f; + zero_fp32 = 0.f; + alpha = static_cast(&one_fp32); + beta_0 = static_cast(&zero_fp32); + beta_1 = static_cast(&one_fp32); + Atype = CUDA_R_32F; + Btype = CUDA_R_32F; + Ctype = CUDA_R_32F; + resultType = CUDA_R_32F; + } + + // Strided batch matrix multiply + // qk = q * k^T + // Shapes: q and k = B x N x S x H, qk = B x N x S x S + // Convert col-major to row-major by swapping q and k in Gemm + + // Local attention part + // S x S is calculated using sliding block WxW (W is one sided window size) like the following: + // [W][W] + // [W][W][W] + // [W][W][W] + // [W][W] + // The first and last rows have 2 blocks, and the remaining has 3 blocks per row. + // The calculation are splited into 3 parts. Firstly, fill the middle rows, then the first row and finally the last row. + // The results are stored in scratch1. + + int w = attention_window; + int x_offset = num_heads * sequence_length * head_size; + int y_offset = num_heads * sequence_length * sequence_length; + int last_block = (sequence_length / w) - 1; + int strideA = sequence_length * head_size; + int strideB = sequence_length * head_size; + int strideC = sequence_length * sequence_length; + + // When S == 2W, there is no middle rows of blocks: + // [W][W] + // [W][W] + // We can use normal matrix multiplication in this case. + if (sequence_length == 2 * w) { + CHECK(cublasGemmStridedBatchedEx(cublas, + CUBLAS_OP_T, + CUBLAS_OP_N, + sequence_length, + sequence_length, + head_size, + alpha, + k, + Atype, + head_size, + sequence_length * head_size, + q, + Btype, + head_size, + sequence_length * head_size, + beta_0, + scratch1, + Ctype, + sequence_length, + sequence_length * sequence_length, + batch_size * num_heads, + resultType, + algo)); + } else { // sequence_length > 2 * w + for (int i = 0; i < batch_size; ++i) { + for (int j = 0; j < num_heads; ++j) { + void* q_head = (char*)q + (i * x_offset + j * sequence_length * head_size + w * head_size) * element_size; + void* k_head = (char*)k + (i * x_offset + j * sequence_length * head_size) * element_size; + void* qk_head = (char*)scratch1 + (i * y_offset + j * sequence_length * sequence_length + w * sequence_length) * element_size; + int count = (sequence_length - 2 * w) / w; + CHECK(cublasGemmStridedBatchedEx(cublas, + CUBLAS_OP_T, + CUBLAS_OP_N, + 3 * w, // m + w, // n + head_size, // k + alpha, // alpha + k_head, // A + Atype, // A type + head_size, // lda + w * head_size, // strideA + q_head, // B + Btype, // B type + head_size, // ldb + w * head_size, // strideB + beta_0, // beta + qk_head, // C + Ctype, // C type + sequence_length, // ldc + sequence_length * w + w, // strideC + count, // batch count + resultType, + algo)); + } + } + + CHECK(cublasGemmStridedBatchedEx(cublas, + CUBLAS_OP_T, + CUBLAS_OP_N, + 2 * w, // m + w, // n + head_size, // k + alpha, // alpha + k, // A + Atype, // A type + head_size, // lda + strideA, // strideA + q, // B + Btype, // B type + head_size, // ldb + strideB, // strideB + beta_0, // beta + scratch1, // C + Ctype, // C type + sequence_length, // ldc + strideC, // strideC + batch_size * num_heads, // batch count + resultType, + algo)); + + void* q_head = (char*)q + (last_block * w * head_size) * element_size; + void* k_head = (char*)k + ((last_block - 1) * w * head_size) * element_size; + void* qk_head = (char*)scratch1 + (last_block * w * sequence_length + (last_block - 1) * w) * element_size; + CHECK(cublasGemmStridedBatchedEx(cublas, + CUBLAS_OP_T, + CUBLAS_OP_N, + 2 * w, + w, + head_size, + alpha, + k_head, + Atype, + head_size, + strideA, + q_head, + Btype, + head_size, + strideB, + beta_0, + qk_head, + Ctype, + sequence_length, + strideC, + batch_size * num_heads, + resultType, + algo)); + } + + const int* batch_global_count = reinterpret_cast(pinned_buffer); + // Global attention part + for (int i = 0; i < batch_size; ++i) { + if (batch_global_count[i] > 0) { + void* q_batch = (char*)q + (i * x_offset) * element_size; + void* k_batch = (char*)k + (i * x_offset) * element_size; + void* qk_batch = (char*)scratch1 + (i * y_offset) * element_size; + // Local tokens attending global tokens + CHECK(cublasGemmStridedBatchedEx(cublas, + CUBLAS_OP_T, + CUBLAS_OP_N, + batch_global_count[i], + sequence_length, + head_size, + alpha, + k_batch, + Atype, + head_size, + strideA, + q_batch, + Btype, + head_size, + strideB, + beta_0, + qk_batch, + Ctype, + sequence_length, + strideC, + num_heads, + resultType, + algo)); + + void* global_q_batch = (char*)global_q + (i * num_heads * sequence_length * head_size) * element_size; + void* global_k_batch = (char*)global_k + (i * x_offset) * element_size; + int strideB_global = sequence_length * head_size; + + // Global tokens attending everything + // This GEMMs need to be last to make sure all global token entries are re-written. + CHECK(cublasGemmStridedBatchedEx(cublas, + CUBLAS_OP_T, + CUBLAS_OP_N, + sequence_length, + batch_global_count[i], + head_size, + alpha, + global_k_batch, + Atype, + head_size, + strideA, + global_q_batch, + Btype, + head_size, + strideB_global, + beta_0, + qk_batch, + Ctype, + sequence_length, + strideC, + num_heads, + resultType, + algo)); + } + } + + int dim0 = sequence_length * num_heads; + int dim1 = sequence_length; + void* softmax_out = scratch2; + + const int blockSize = 64; + const int gridSize = batch_size * num_heads * sequence_length; + if (is_fp16) { + LongformerSoftmaxFastKernel<__half, blockSize><<>>( + global_attention, + global_index, + batch_global_num, + static_cast(scratch1), + static_cast(attention_mask), + static_cast<__half*>(softmax_out), scaler, dim0, dim1, attention_window); + } else { + LongformerSoftmaxFastKernel<<>>( + global_attention, + global_index, + batch_global_num, + static_cast(scratch1), + static_cast(attention_mask), + static_cast(softmax_out), scaler, dim0, dim1, attention_window); + } + + // Run the matrix multiply: output = softmax_out * v + // softmax_out: B x N x S x S + // v: B x N x S x H + // attn_out: B x N x S x H + // Calculation uses full Gemm (S == 2W) or sliding blocks (S > 2W) in a way similar to local attention part. + + if (sequence_length == 2 * w) { + // convert col-major to row-major by swapping softmax_out and v + CHECK(cublasGemmStridedBatchedEx(cublas, + CUBLAS_OP_N, + CUBLAS_OP_N, + head_size, + sequence_length, + sequence_length, + alpha, + v, + Atype, + head_size, + sequence_length * head_size, + softmax_out, + Btype, + sequence_length, + sequence_length * sequence_length, + beta_0, + output, + Ctype, + head_size, + sequence_length * head_size, + batch_size * num_heads, + resultType, + algo)); + } else { // sequence_length > 2 * w + for (int i = 0; i < batch_size; ++i) { + for (int j = 0; j < num_heads; ++j) { + void* v_head = (char*)v + (i * x_offset + j * head_size * sequence_length) * element_size; + void* prob_head = (char*)softmax_out + (i * y_offset + j * sequence_length * sequence_length + w * sequence_length) * element_size; + void* out_head = (char*)output + (i * x_offset + j * head_size * sequence_length + w * head_size) * element_size; + int count = (sequence_length - 2 * w) / w; + CHECK(cublasGemmStridedBatchedEx(cublas, + CUBLAS_OP_N, + CUBLAS_OP_N, + head_size, + w, + 3 * w, + alpha, + v_head, + Atype, + head_size, + w * head_size, + prob_head, + Btype, + sequence_length, + sequence_length * w + w, + beta_0, + out_head, + Ctype, + head_size, + w * head_size, + count, + resultType, + algo)); + } + } + + CHECK(cublasGemmStridedBatchedEx(cublas, + CUBLAS_OP_N, + CUBLAS_OP_N, + head_size, + w, + 2 * w, + alpha, + v, + Atype, + head_size, + sequence_length * head_size, + softmax_out, + Btype, + sequence_length, + sequence_length * sequence_length, + beta_0, + output, + Ctype, + head_size, + sequence_length * head_size, + batch_size * num_heads, + resultType, + algo)); + + void* v_head = (char*)v + (last_block - 1) * w * head_size * element_size; + void* prob_head = (char*)softmax_out + (sequence_length * last_block * w + (last_block - 1) * w) * element_size; + void* out_head = (char*)output + last_block * w * head_size * element_size; + + CHECK(cublasGemmStridedBatchedEx(cublas, + CUBLAS_OP_N, + CUBLAS_OP_N, + head_size, + w, + 2 * w, + alpha, + v_head, + Atype, + head_size, + sequence_length * head_size, + prob_head, + Btype, + sequence_length, + sequence_length * sequence_length, + beta_0, + out_head, + Ctype, + head_size, + sequence_length * head_size, + batch_size * num_heads, + resultType, + algo)); + } + + for (int i = 0; i < batch_size; ++i) { + if (batch_global_count[i] > 0) { + int glob_longdim_mm = (last_block - 1) * w; + + void* v_head = (char*)v + (i * x_offset) * element_size; + void* prob_head = (char*)softmax_out + (i * y_offset + 2 * w * sequence_length) * element_size; + void* out_head = (char*)output + (i * x_offset + 2 * w * head_size) * element_size; + + CHECK(cublasGemmStridedBatchedEx(cublas, + CUBLAS_OP_N, + CUBLAS_OP_N, + head_size, + glob_longdim_mm, + batch_global_count[i], + alpha, + v_head, + Atype, + head_size, + sequence_length * head_size, + prob_head, + Btype, + sequence_length, + sequence_length * sequence_length, + beta_1, + out_head, + Ctype, + head_size, + sequence_length * head_size, + num_heads, + resultType, + algo)); + + // Global tokens + v_head = (char*)global_v + (i * x_offset) * element_size; + prob_head = (char*)softmax_out + (i * y_offset) * element_size; + out_head = (char*)output + (i * x_offset) * element_size; + + CHECK(cublasGemmStridedBatchedEx(cublas, + CUBLAS_OP_N, + CUBLAS_OP_N, + head_size, + batch_global_count[i], + sequence_length, // Re-write entries completely + alpha, + v_head, + Atype, + head_size, + sequence_length * head_size, + prob_head, + Btype, + sequence_length, + sequence_length * sequence_length, + beta_0, // Use beta=0 to overwrite + out_head, // Here assumes global tokens are at the beginning of sequence. + Ctype, + head_size, + sequence_length * head_size, + num_heads, + resultType, + algo)); + } + } + + return true; +} + +} // namespace cuda +} // namespace contrib +} // namespace onnxruntime diff --git a/onnxruntime/contrib_ops/cuda/bert/longformer_attention_softmax.h b/onnxruntime/contrib_ops/cuda/bert/longformer_attention_softmax.h new file mode 100644 index 0000000000..ade76f556e --- /dev/null +++ b/onnxruntime/contrib_ops/cuda/bert/longformer_attention_softmax.h @@ -0,0 +1,51 @@ +/* +Copyright (c) NVIDIA Corporation and Microsoft Corporation + +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. +*/ + +// This is fast cuda kernels for longformer attention softmax. +// It uses two temporary matrix of BxNxSxS, and consumes more memory when sequence length is large. + +namespace onnxruntime { +namespace contrib { +namespace cuda { + +// Launch the softmax kernel for non compact memory. +bool launchSoftmaxFastKernel( + cudaStream_t stream, + cublasHandle_t cublas, + void* workspace, // softmax space + const void* q, // transposed Q with shape (B, N, S, H) + const void* k, // transposed K with shape (B, N, S, H) + const void* v, // transposed V with shape (B, N, S, H) + const void* attention_mask, // attention mask with shape (B, S), with value 0.0 not masked, and -10000.0 masked. + const void* global_q, // Q for global tokens with shape (B, N, S, H) + const void* global_k, // K for global tokens with shape (B, N, S, H) + const void* global_v, // V for global tokens with shape (B, N, S, H) + const int* global_attention, // global attention with shape (B, S), with value 0 for local attention and 1 for global attention. + const int* global_index, // Global index with shape (B, S) + const int* batch_global_num, // Number of global tokens per batch with shape (B, 1) + void* pinned_buffer, // Pinned memory in CPU. Number of global tokens per batch with shape (B, 1) + void* output, // output with shape (B, N, S, H) + float scaler, // scalar + int batch_size, // batch size + int sequence_length, // sequence length + int num_heads, // number of heads + int head_size, // hidden size per head + int attention_window, // one sided windows size + size_t element_size); + +} // namespace cuda +} // namespace contrib +} // namespace onnxruntime diff --git a/onnxruntime/python/tools/transformers/benchmark_helper.py b/onnxruntime/python/tools/transformers/benchmark_helper.py index 22a2d8fe36..626e7be65b 100644 --- a/onnxruntime/python/tools/transformers/benchmark_helper.py +++ b/onnxruntime/python/tools/transformers/benchmark_helper.py @@ -235,3 +235,85 @@ def allocateOutputBuffers(output_buffers, output_buffer_max_sizes, device): for i in output_buffer_max_sizes: output_buffers.append(torch.empty(i, dtype=torch.float32, device=device)) + + +def set_random_seed(seed=123): + """Set random seed manully to get deterministic results""" + import random + random.seed(seed) + numpy.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed(seed) + torch.cuda.manual_seed_all(seed) + #torch.backends.cudnn.enabled = False + #torch.backends.cudnn.benchmark = False + #torch.backends.cudnn.deterministic = True + + +def measure_memory(is_gpu, func): + import os + import psutil + from time import sleep + + class MemoryMonitor: + def __init__(self, keep_measuring=True): + self.keep_measuring = keep_measuring + + def measure_cpu_usage(self): + max_usage = 0 + while True: + max_usage = max(max_usage, psutil.Process(os.getpid()).memory_info().rss / 1024**2) + sleep(0.005) # 5ms + if not self.keep_measuring: + break + return max_usage + + def measure_gpu_usage(self): + from py3nvml.py3nvml import nvmlInit, nvmlDeviceGetCount, nvmlDeviceGetHandleByIndex, \ + nvmlDeviceGetMemoryInfo, nvmlDeviceGetName, nvmlShutdown, NVMLError + max_gpu_usage = [] + gpu_name = [] + try: + nvmlInit() + deviceCount = nvmlDeviceGetCount() + max_gpu_usage = [0 for i in range(deviceCount)] + gpu_name = [nvmlDeviceGetName(nvmlDeviceGetHandleByIndex(i)) for i in range(deviceCount)] + while True: + for i in range(deviceCount): + info = nvmlDeviceGetMemoryInfo(nvmlDeviceGetHandleByIndex(i)) + max_gpu_usage[i] = max(max_gpu_usage[i], info.used / 1024**2) + sleep(0.005) # 5ms + if not self.keep_measuring: + break + nvmlShutdown() + return [{ + "device_id": i, + "name": gpu_name[i], + "max_used_MB": max_gpu_usage[i] + } for i in range(deviceCount)] + except NVMLError as error: + if not self.silent: + self.logger.error("Error fetching GPU information using nvml: %s", error) + return None + + monitor = MemoryMonitor(False) + if is_gpu: + print(f"GPU memory usage before testing: {monitor.measure_gpu_usage()}") + else: + print(f"Peak CPU memory usage before testing: {monitor.measure_cpu_usage():.2f} MB") + + from concurrent.futures import ThreadPoolExecutor + with ThreadPoolExecutor() as executor: + monitor = MemoryMonitor() + mem_thread = executor.submit(monitor.measure_gpu_usage if is_gpu else monitor.measure_cpu_usage) + try: + fn_thread = executor.submit(func) + result = fn_thread.result() + finally: + monitor.keep_measuring = False + max_usage = mem_thread.result() + if is_gpu: + print(f"Peak GPU memory usage: {max_usage}") + else: + print(f"Peak CPU memory usage: {max_usage:.2f} MB") + return max_usage diff --git a/onnxruntime/python/tools/transformers/longformer/__init__.py b/onnxruntime/python/tools/transformers/longformer/__init__.py index ad5632855c..864a0f3b5b 100644 --- a/onnxruntime/python/tools/transformers/longformer/__init__.py +++ b/onnxruntime/python/tools/transformers/longformer/__init__.py @@ -1,3 +1,9 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + import os import sys diff --git a/onnxruntime/python/tools/transformers/longformer/benchmark_longformer.py b/onnxruntime/python/tools/transformers/longformer/benchmark_longformer.py index 80f9d44a70..30b13d4e8b 100644 --- a/onnxruntime/python/tools/transformers/longformer/benchmark_longformer.py +++ b/onnxruntime/python/tools/transformers/longformer/benchmark_longformer.py @@ -1,11 +1,29 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +# +# This script run benchmark of latency or peak memory usage of Longformer model inference. +# # Please run convert_longformer_to_onnx.py to get onnx model before running this script. -# Tested with python 3.7, onnxruntime-gpu 1.6.0 (or nightly), PyTorch 1.7.0, transformers 4.0, CUDA 10.2, CUDNN 8.0 -# Example step by step command lines for benchmarking longformer base model (without/with optimizer) in Linux: +# Tested with python 3.6, onnxruntime-gpu 1.7.0, PyTorch 1.7.1, transformers 4.3.2, CUDA 10.2. +# +# Example commands for exporting longformer base model in Linux or WSL: +# cd ../torch_extensions # python setup.py install -# python convert_longformer_to_onnx.py -m longformer-base-4096 -# python benchmark_longformer.py -m longformer-base-4096 -# python convert_longformer_to_onnx.py -m longformer-base-4096 -o -# python benchmark_longformer.py -m longformer-base-4096 +# cd ../longformer +# python convert_longformer_to_onnx.py --model longformer-base-4096 --precision fp32 --optimize_onnx +# +# Benchmark the latency (Exported onnx model is in the current directory): +# python benchmark_longformer.py --models longformer-base-4096 --batch_sizes 1 --sequence_lengths 512 1024 2048 4096 --global_lengths 8 --onnx_dir . --validate_onnx -t 100 +# +# Benchmark GPU peak memory: +# export ORT_LONGFORMER_COMPACT_MEMORY=0 +# python benchmark_longformer.py --models longformer-base-4096 --batch_sizes 1 --sequence_lengths 4096 --global_lengths 8 --onnx_dir . --memory -t 10 +# export ORT_LONGFORMER_COMPACT_MEMORY=1 +# python benchmark_longformer.py --models longformer-base-4096 --batch_sizes 1 --sequence_lengths 4096 --global_lengths 8 --onnx_dir . --memory -t 10 +# By default, compact memory kernel is not enabled since it is slower. You need set an environment variable ORT_LONGFORMER_COMPACT_MEMORY=1 to enable it, which uses less memory in this test. import timeit from datetime import datetime @@ -17,57 +35,30 @@ import torch import onnxruntime import numpy as np import pprint +import math -# Mapping from model name to pretrained model name -MODELS = { - "longformer-base-4096": "allenai/longformer-base-4096", - "longformer-random-tiny": "patrickvonplaten/longformer-random-tiny" # A tiny model for debugging -} - -is_debug = False +from longformer_helper import LongformerHelper, PRETRAINED_LONGFORMER_MODELS sys.path.append(os.path.join(os.path.dirname(__file__), '..')) import benchmark_helper -def get_dummy_inputs(batch_size, sequence_length, num_global_tokens, device): - input_ids = torch.randint(low=0, high=100, size=(batch_size, sequence_length), dtype=torch.long, device=device) - attention_mask = torch.ones(input_ids.shape, dtype=torch.long, device=device) - global_attention_mask = torch.zeros(input_ids.shape, dtype=torch.long, device=device) - global_token_index = list(range(num_global_tokens)) - global_attention_mask[:, global_token_index] = 1 - return input_ids, attention_mask, global_attention_mask - - -def diff_outputs(ort_outputs, torch_outputs): - max_diff = [] - # Compare the outputs to find max difference - for i in range(2): - print(f"output {i} shape: ORT={ort_outputs[i].shape}, Torch={torch_outputs[i].shape}") - diff = (torch.from_numpy(ort_outputs[i]) - torch_outputs[i].to('cpu')).abs().max() - max_diff.append(diff) - print(f"max diff for output: {max_diff}") - return max_diff - - -def test_torch(device, model, model_name, batch_sizes, sequence_lengths, global_lengths, test_times, num_threads, - verbose): +def test_torch_latency(device, model, model_name, batch_sizes, sequence_lengths, global_lengths, test_times, + num_threads, verbose): if num_threads > 0: torch.set_num_threads(num_threads) results = [] for batch_size in batch_sizes: - for sequence_length in sequence_lengths: # This is total length of . - for global_length in global_lengths: # This is length of . Short query (8) for search keywords, and longer query (16) for question like + for sequence_length in sequence_lengths: + for global_length in global_lengths: print(f"batch_size={batch_size} sequence_length={sequence_length} global_length={global_length}...") - input_ids, attention_mask, global_attention_mask = get_dummy_inputs(batch_size, sequence_length, - global_length, device) + inputs: LongforerInputs = LongformerHelper.get_dummy_inputs(batch_size, sequence_length, global_length, + device) + input_list = inputs.to_list() - # Run PyTorch - _ = model(input_ids, attention_mask=attention_mask, global_attention_mask=global_attention_mask) - runtimes = timeit.repeat(lambda: model(input_ids, attention_mask, global_attention_mask), - repeat=test_times, - number=1) + _ = model(*input_list) + runtimes = timeit.repeat(lambda: model(*input_list), repeat=test_times, number=1) result = { "engine": "torch", #TODO: test torchscript "version": torch.__version__, @@ -90,7 +81,24 @@ def test_torch(device, model, model_name, batch_sizes, sequence_lengths, global_ return results -def test_onnxruntime(device, +def test_parity(device, model, ort_session, batch_size, sequence_length, global_length, verbose=True): + print( + f"Comparing Torch and ORT outputs for batch_size={batch_size} sequence_length={sequence_length} global_length={global_length}..." + ) + dummy_inputs: LongforerInputs = LongformerHelper.get_dummy_inputs(batch_size, sequence_length, global_length, + device) + ort_inputs = dummy_inputs.get_ort_inputs() + ort_outputs = ort_session.run(None, ort_inputs) + input_list = dummy_inputs.to_list() + torch_outputs = model(*input_list) + max_diff = np.amax(torch_outputs[0].cpu().numpy() - ort_outputs[0]) + print(f"last_state max diff = {max_diff}") + if verbose and (math.isnan(max_diff) or max_diff > 0.001): + print("torch last_state:", torch_outputs[0]) + print("ort last_state:", ort_outputs[0]) + + +def test_ort_latency(device, model, model_name, ort_session, @@ -101,43 +109,30 @@ def test_onnxruntime(device, num_threads, optimizer=False, precision='fp32', + validate_onnx=True, + disable_io_binding=False, verbose=True): results = [] for batch_size in batch_sizes: - for sequence_length in sequence_lengths: # This is total length of . - for global_length in global_lengths: # This is length of . Short query (8) for search keywords, and longer query (16) for question like + for sequence_length in sequence_lengths: + for global_length in global_lengths: + assert global_length <= model.config.attention_window[ + 0], "Limitation of current implementation: number of global token <= attention_window" print( - f"Testing batch_size={batch_size} sequence_length={sequence_length} global_length={global_length} optimizer={optimizer}, precision={precision}..." + f"Testing batch_size={batch_size} sequence_length={sequence_length} global_length={global_length} optimizer={optimizer}, precision={precision} io_binding={not disable_io_binding}..." ) - input_ids, attention_mask, global_attention_mask = get_dummy_inputs(batch_size, sequence_length, - global_length, device) + dummy_inputs: LongforerInputs = LongformerHelper.get_dummy_inputs(batch_size, sequence_length, + global_length, device) # Run OnnxRuntime - ort_inputs = { - "input_ids": input_ids.cpu().numpy(), - "attention_mask": attention_mask.cpu().numpy(), - "global_attention_mask": global_attention_mask.cpu().numpy() - } + ort_inputs = dummy_inputs.get_ort_inputs() if verbose: - pprint.pprint(ort_inputs) + print(ort_inputs) # run one query for warm up ort_outputs = ort_session.run(None, ort_inputs) - if verbose: - # Run PyTorch then compare the results with OnnxRuntime. - torch_outputs = model(input_ids, - attention_mask=attention_mask, - global_attention_mask=global_attention_mask) - - max_diff = diff_outputs(ort_outputs, torch_outputs) - print("max diff for outputs", max_diff) - if max(max_diff) > 0.001: - print("ort_inputs", ort_inputs) - print("ort_outputs", ort_outputs) - - device = input_ids.device result_template = { "model_name": model_name, "inputs": 3, @@ -154,32 +149,59 @@ def test_onnxruntime(device, "datetime": str(datetime.now()), } - max_last_state_size = max(batch_sizes) * max(sequence_lengths) * model.config.hidden_size - max_pooler_size = max(batch_sizes) * max(sequence_lengths) - """ - result = benchmark_helper.inference_ort_with_io_binding( - ort_session, - ort_inputs, - result_template=result_template, - repeat_times=test_times, - ort_output_names=["last_state", "pooler"], - ort_outputs=ort_outputs, - output_buffers=[], - output_buffer_max_sizes=[max_last_state_size, max_pooler_size], - batch_size=batch_size, - device=device) - """ - result = benchmark_helper.inference_ort(ort_session, - ort_inputs, - result_template=result_template, - repeat_times=test_times, - batch_size=batch_size) + if not disable_io_binding: + max_last_state_size = max(batch_sizes) * max(sequence_lengths) * model.config.hidden_size + max_pooler_size = max(batch_sizes) * max(sequence_lengths) + result = benchmark_helper.inference_ort_with_io_binding( + ort_session, + ort_inputs, + result_template=result_template, + repeat_times=test_times, + ort_output_names=["last_state", "pooler"], + ort_outputs=ort_outputs, + output_buffers=[], + output_buffer_max_sizes=[max_last_state_size, max_pooler_size], + batch_size=batch_size, + device=device, + data_type=np.longlong, #input data type + ) + else: + result = benchmark_helper.inference_ort(ort_session, + ort_inputs, + result_template=result_template, + repeat_times=test_times, + batch_size=batch_size) pprint.pprint(result) results.append(result) + + if validate_onnx: + test_parity(device, model, ort_session, batch_size, sequence_length, global_length, verbose) + return results +def test_ort_memory(device, onnx_model_path, batch_size, sequence_length, global_length, test_times, num_threads): + print( + f"Testing memory for model={onnx_model_path}, batch_size={batch_size}, sequence_length={sequence_length}, global_length={global_length}, test_times={test_times}, num_threads={num_threads}" + ) + + def inference(): + session = benchmark_helper.create_onnxruntime_session(onnx_model_path, + use_gpu=True, + enable_all_optimization=True, + num_threads=num_threads) + + dummy_inputs: LongforerInputs = LongformerHelper.get_dummy_inputs(batch_size, sequence_length, global_length, + device) + ort_inputs = dummy_inputs.get_ort_inputs() + for _ in range(test_times): + ort_outputs = session.run(None, ort_inputs) + + benchmark_helper.measure_memory(is_gpu=True, func=inference) + print("Memory test is done") + + def test_all(args): # Currently, the longformer attention operator could only run in GPU (no CPU implementation yet). device = torch.device('cuda:0') @@ -188,17 +210,18 @@ def test_all(args): for model_name in args.models: # Here we run an example input from transformers import LongformerModel - torch_model_name_or_dir = MODELS[model_name] + torch_model_name_or_dir = PRETRAINED_LONGFORMER_MODELS[model_name] model = LongformerModel.from_pretrained(torch_model_name_or_dir) # pretrained model name or directory model.to(device) # Search onnx model in the following order: optimized fp16 model, optimized fp32 model, raw model + # TODO: call convert_longformer_to_onnx to export onnx instead. + import os.path optimized = False precision = 'fp32' - onnx_model_path = model_name + ".onnx" - optimized_fp32_model = model_name + "_fp32.onnx" - optimized_fp16_model = model_name + "_fp16.onnx" - import os.path + onnx_model_path = os.path.join(args.onnx_dir, model_name + ".onnx") + optimized_fp32_model = os.path.join(args.onnx_dir, model_name + "_fp32.onnx") + optimized_fp16_model = os.path.join(args.onnx_dir, model_name + "_fp16.onnx") if os.path.isfile(optimized_fp16_model): onnx_model_path = optimized_fp16_model optimized = True @@ -206,24 +229,33 @@ def test_all(args): elif os.path.isfile(optimized_fp32_model): onnx_model_path = optimized_fp32_model optimized = True + print("ONNX model path:", onnx_model_path) for num_threads in args.num_threads: if "torch" in args.engines: - results += test_torch(device, model, model_name, args.batch_sizes, args.sequence_lengths, - args.global_lengths, args.test_times, num_threads, args.verbose) + results += test_torch_latency(device, model, model_name, args.batch_sizes, args.sequence_lengths, + args.global_lengths, args.test_times, num_threads, args.verbose) if "onnxruntime" in args.engines: - session = benchmark_helper.create_onnxruntime_session(onnx_model_path, - use_gpu=True, - enable_all_optimization=True, - num_threads=num_threads) - results += test_onnxruntime(device, model, model_name, session, args.batch_sizes, args.sequence_lengths, - args.global_lengths, args.test_times, num_threads, optimized, precision, - args.verbose) + if args.memory: + test_ort_memory(device, onnx_model_path, args.batch_sizes[0], args.sequence_lengths[0], + args.global_lengths[0], args.test_times, num_threads) + else: # test latency + session = benchmark_helper.create_onnxruntime_session(onnx_model_path, + use_gpu=True, + enable_all_optimization=True, + num_threads=num_threads) + if session is None: + raise RuntimeError(f"Failed to create ORT sesssion from ONNX file {onnx_model_path}") + + results += test_ort_latency(device, model, model_name, session, args.batch_sizes, + args.sequence_lengths, args.global_lengths, args.test_times, + num_threads, optimized, precision, args.validate_onnx, + args.disable_io_binding, args.verbose) return results -def parse_arguments(): +def parse_arguments(argv=None): parser = argparse.ArgumentParser() parser.add_argument("-m", @@ -231,9 +263,9 @@ def parse_arguments(): required=False, nargs="+", type=str, - default=["longformer-random-tiny"] if is_debug else ["longformer-base-4096"], - choices=list(MODELS.keys()), - help="Pre-trained models in the list: " + ", ".join(MODELS.keys())) + default=["longformer-base-4096"], + help="Checkpoint directory or pre-trained model names in the list: " + + ", ".join(PRETRAINED_LONGFORMER_MODELS.keys())) parser.add_argument("-e", "--engines", @@ -253,21 +285,52 @@ def parse_arguments(): parser.add_argument("-b", "--batch_sizes", nargs="+", type=int, default=[1]) - # If multiple of window size is used during exporting onnx model, there is no padding in ONNX model so you will need padding by yourself before running onnx model. - # In that case, you can only test sequence length that is multiple of window size (4 or 512 for these two models). - parser.add_argument("-s", - "--sequence_lengths", + # If --export_padding is not used in exporting onnx model, there is no padding in ONNX model so you will need padding inputs by yourself before running onnx model. + # In that case, you can only test sequence length that is multiple of attention window size. + parser.add_argument( + "-s", + "--sequence_lengths", + nargs="+", + type=int, + default=[512, 1024, 2048, 4096], + help= + "Sequence lengths. It could have multiple values in latency test. If --export_padding is not used in exporting onnx model, sequence length shall be multiple of window size." + ) + + parser.add_argument("--onnx_dir", + required=False, + type=str, + default=os.path.join('.', 'onnx_models'), + help="Directory to search onnx models.") + + parser.add_argument("-g", + "--global_lengths", nargs="+", type=int, - default=[4] if is_debug else [512, 1024, 2048, 4096]) + default=[0], + help="Number of global tokens. It could have multiple values in latency test.") - parser.add_argument("-g", "--global_lengths", nargs="+", type=int, default=[1] if is_debug else [8]) + parser.add_argument("-n", + "--num_threads", + required=False, + nargs="+", + type=int, + default=[0], + help="Threads to use. It could have multiple values in latency test.") - parser.add_argument("-n", "--num_threads", required=False, nargs="+", type=int, default=[0], help="Threads to use") + parser.add_argument("-v", + "--validate_onnx", + required=False, + action="store_true", + help="Validate that ONNX model generates same output as PyTorch model.") - parser.add_argument("--verbose", required=False, action="store_true", help="Print more information") + parser.add_argument("--disable_io_binding", required=False, action="store_true", help="Do not use IO Binding.") - args = parser.parse_args() + parser.add_argument("--memory", required=False, action="store_true", help="Test memory usage instead of latency.") + + parser.add_argument("--verbose", required=False, action="store_true", help="Print more information.") + + args = parser.parse_args(argv) return args @@ -327,16 +390,27 @@ def output_details(results, csv_filename): print(f"Detail results are saved to csv file: {csv_filename}") -def main(): - args = parse_arguments() - +def main(args): assert len(args.models) == 1, "run only one model at a time" + if args.memory: + if len(args.batch_sizes) > 1: + raise RuntimeError("For memory test, only one batch_size (-b) is allowed.") + if len(args.sequence_lengths) > 1: + raise RuntimeError("For memory test, only one sequence_length (-s) is allowed.") + if len(args.global_lengths) > 1: + raise RuntimeError("For memory test, only one global_length (-g) is allowed.") + if len(args.num_threads) > 1: + raise RuntimeError("For memory test, only one value of --num_threads is allowed.") + if not torch.cuda.is_available(): raise RuntimeError("Please install PyTorch with Cuda, and use a machine with GPU for testing gpu performance.") torch.set_grad_enabled(False) + # set random seed manully to get deterministic results + #benchmark_helper.set_random_seed(123) + all_results = test_all(args) time_stamp = datetime.now().strftime("%Y%m%d-%H%M%S") @@ -348,4 +422,7 @@ def main(): if __name__ == "__main__": - main() + args = parse_arguments() + #args = parse_arguments("-e onnxruntime -t 1 -b 1 -s 4 -g 2 --onnx_dir . -t 1 -m longformer-random-tiny".split(' ')) + + main(args) diff --git a/onnxruntime/python/tools/transformers/longformer/convert_longformer_to_onnx.py b/onnxruntime/python/tools/transformers/longformer/convert_longformer_to_onnx.py index d0cdea4302..b827d05c3a 100644 --- a/onnxruntime/python/tools/transformers/longformer/convert_longformer_to_onnx.py +++ b/onnxruntime/python/tools/transformers/longformer/convert_longformer_to_onnx.py @@ -1,9 +1,19 @@ -# Before running this script, please run "python setup.py install" in ../torch_extensions to build longformer_attention.cpp -# under a python environment with PyTorch installed. Then you can update the path of longformer_attention.cpython-*.so -# and run this script in same environment. -# Tested in Ubuntu 18.04, python 3.6, PyTorch 1.7.1, transformers 4.3.0. -# GPU is not needed for this script. You can run it in CPU. -# For inference of the onnx model, you will need latest onnxruntime-gpu 1.7.0 or above. +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +# This script converts Longformer model from huggingface transformers 4.0 or later to ONNX. +# Unlike normal ONNX model exporting, it will directly translate LongformerSelfAttention to the LongformerAttention operator in ONNX Runtime. +# +# Before running this script, please run "python setup.py install" in ../torch_extensions under Linux with PyTorch installed. +# Then you can update the path of longformer_attention.cpython-*.so and run this script in same environment. +# +# It is tested in Ubuntu 18.04, python 3.6, PyTorch 1.7.1, transformers 4.3.0 or 4.3.2. +# GPU is not needed for this script. You can run it in CPU. For --optimize_onnx, you can use either onnxruntime or onnxruntime-gpu package. +# +# For inference of the onnx model, you will need onnxruntime-gpu 1.7.0 or above. import torch import numpy as np @@ -13,6 +23,8 @@ from torch.onnx import register_custom_op_symbolic from torch.onnx.symbolic_helper import parse_args from packaging import version +from longformer_helper import LongformerHelper, PRETRAINED_LONGFORMER_MODELS + @parse_args('v', 'v', 'v', 'v', 'v', 'v', 'v', 'i', 'i') def my_longformer_attention(g, input, weight, bias, mask, global_weight, global_bias, global_mask, num_heads, window): @@ -31,18 +43,10 @@ def my_longformer_attention(g, input, weight, bias, mask, global_weight, global_ # namespace is onnxruntime which is registered in longformer_attention.cpp register_custom_op_symbolic('onnxruntime::LongformerAttention', my_longformer_attention, 9) -# TODO: update the path according to output of "python setup.py install" when your python version is not 3.6 +# TODO: search the directory to find correct output filename of "python setup.py install" when python version is not 3.6 torch.ops.load_library( r'../torch_extensions/build/lib.linux-x86_64-3.6/longformer_attention.cpython-36m-x86_64-linux-gnu.so') -# mapping from model name to pretrained model name -MODELS = { - "longformer-base-4096": "allenai/longformer-base-4096", - "longformer-random-tiny": "patrickvonplaten/longformer-random-tiny" # A tiny model for debugging -} - -is_debug = False - def parse_arguments(): parser = argparse.ArgumentParser() @@ -51,21 +55,24 @@ def parse_arguments(): "--model", required=False, type=str, - default="longformer-random-tiny" if is_debug else "longformer-base-4096", - choices=list(MODELS.keys()), - help="Pre-trained models in the list: " + ", ".join(MODELS.keys())) + default="longformer-base-4096", + help="Checkpoint directory or pre-trained model names in the list: " + + ", ".join(PRETRAINED_LONGFORMER_MODELS.keys())) - # Sequence length shall choose properly. - # If multiple of windows size is used, there is no padding in ONNX model so you will need padding by yourself before running onnx model. - parser.add_argument("-s", "--sequence_length", type=int, default=4 if is_debug else 512) - - parser.add_argument("-g", "--global_length", type=int, default=1 if is_debug else 8) + parser.add_argument( + '--export_padding', + required=False, + action='store_true', + help= + 'Export padding logic to ONNX graph. If not enabled, user need pad input so that sequence length is multiple of window size.' + ) + parser.set_defaults(export_padding=False) parser.add_argument('-o', '--optimize_onnx', required=False, action='store_true', - help='Use optimizer.py to optimize onnx model') + help='Use optimizer.py to optimize onnx model.') parser.set_defaults(optimize_onnx=False) parser.add_argument("-p", @@ -80,36 +87,77 @@ def parse_arguments(): return args -def get_dummy_inputs(sequence_length, num_global_tokens, device): +# Create a dummy input for ONNX export. +def get_dummy_inputs(config, export_padding, device): + + # When sequence length is multiple of windows size, there is no padding logic in ONNX graph + sequence_length = config.attention_window[0] + 1 if export_padding else config.attention_window[0] + # Create dummy inputs input_ids = torch.arange(sequence_length).unsqueeze(0).to(device) - attention_mask = torch.ones(input_ids.shape, dtype=torch.long, - device=input_ids.device) # TODO: use random word ID. #TODO: simulate masked word - global_attention_mask = torch.zeros(input_ids.shape, dtype=torch.long, device=input_ids.device) - if num_global_tokens > 0: - global_token_index = list(range(num_global_tokens)) - global_attention_mask[:, global_token_index] = 1 - # TODO: support more inputs like token_type_ids, position_ids + + attention_mask = torch.ones(input_ids.shape, dtype=torch.long, device=device) + attention_mask[:, sequence_length - 1] = 0 # last token is masked + + global_attention_mask = torch.zeros(input_ids.shape, dtype=torch.long, device=device) + global_attention_mask[:, 0] = 1 # first token is global token + return input_ids, attention_mask, global_attention_mask -args = parse_arguments() - -model_name = args.model -onnx_model_path = model_name + ".onnx" - -from transformers import LongformerModel -model = LongformerModel.from_pretrained(MODELS[model_name]) # pretrained model name or directory - -input_ids, attention_mask, global_attention_mask = get_dummy_inputs(sequence_length=args.sequence_length, - num_global_tokens=args.global_length, - device=torch.device('cpu')) - -example_outputs = model(input_ids, attention_mask=attention_mask, global_attention_mask=global_attention_mask) - - # A new function to replace LongformerSelfAttention.forward -#For transformer 4.3 +# For transformers 4.0.0 +def my_longformer_self_attention_forward_4(self, + hidden_states, + attention_mask=None, + is_index_masked=None, + is_index_global_attn=None, + is_global_attn=None): + global_mask = is_index_global_attn.int() + # The following check is based on the dummy inputs (only the first token is global). + assert len(global_mask.shape) == 2 and global_mask.shape[0] == 1 and global_mask.count_nonzero().item( + ) == 1 and global_mask.tolist()[0][0] == 1 + + input_mask = is_index_masked.float() + input_mask = input_mask.masked_fill(is_index_masked, -10000.0) + # Yet another way to generate input_mask = torch.masked_fill(attention_mask, is_index_global_attn, 0.0) + + # TODO: add postprocess of ONNX model to calculate based on graph input: input_mask = (attention_mask - 1) * 10000.0 + # TODO: add postprocess of ONNX model to use graph input directly: glboal_mask = global_attention_mask + + # The following check is based on the dummy inputs (only the last token is masked). + assert len(input_mask.shape) == 2 and input_mask.shape[0] == 1 and input_mask.count_nonzero().item( + ) == 1 and input_mask.tolist()[0][-1] == -10000.0 + + weight = torch.stack( + (self.query.weight.transpose(0, 1), \ + self.key.weight.transpose(0, 1), \ + self.value.weight.transpose(0, 1)), dim=1) + weight = weight.reshape(self.embed_dim, 3 * self.embed_dim) + + bias = torch.stack((self.query.bias, self.key.bias, self.value.bias), dim=0) + bias = bias.reshape(3 * self.embed_dim) + + global_weight = torch.stack((self.query_global.weight.transpose(0, 1), \ + self.key_global.weight.transpose(0, 1), \ + self.value_global.weight.transpose(0, 1)), + dim=1) + global_weight = global_weight.reshape(self.embed_dim, 3 * self.embed_dim) + + global_bias = torch.stack((self.query_global.bias, self.key_global.bias, self.value_global.bias), dim=0) + global_bias = global_bias.reshape(3 * self.embed_dim) + + attn_output = torch.ops.onnxruntime.LongformerAttention(hidden_states, weight, bias, input_mask, global_weight, + global_bias, global_mask, self.num_heads, + self.one_sided_attn_window_size) + + assert attn_output.size() == hidden_states.size(), "Unexpected size" + + outputs = (attn_output, ) + return outputs + + +# For transformers 4.3.0 def my_longformer_self_attention_forward_4_3(self, hidden_states, attention_mask=None, @@ -117,190 +165,135 @@ def my_longformer_self_attention_forward_4_3(self, is_index_global_attn=None, is_global_attn=None, output_attentions=False): - # TODO: move mask calculation to LongFormerModel class to avoid calculating it again and again in each layer. - global_mask = is_index_global_attn.int() - torch.masked_fill(attention_mask, is_index_global_attn, 0.0) - - weight = torch.stack( - (self.query.weight.transpose(0, 1), self.key.weight.transpose(0, 1), self.value.weight.transpose(0, 1)), dim=1) - weight = weight.reshape(self.embed_dim, 3 * self.embed_dim) - - bias = torch.stack((self.query.bias, self.key.bias, self.value.bias), dim=0) - bias = bias.reshape(3 * self.embed_dim) - - global_weight = torch.stack((self.query_global.weight.transpose(0, 1), self.key_global.weight.transpose( - 0, 1), self.value_global.weight.transpose(0, 1)), - dim=1) - global_weight = global_weight.reshape(self.embed_dim, 3 * self.embed_dim) - - global_bias = torch.stack((self.query_global.bias, self.key_global.bias, self.value_global.bias), dim=0) - global_bias = global_bias.reshape(3 * self.embed_dim) - - attn_output = torch.ops.onnxruntime.LongformerAttention(hidden_states, weight, bias, attention_mask, global_weight, - global_bias, global_mask, self.num_heads, - self.one_sided_attn_window_size) - - assert attn_output.size() == hidden_states.size(), "Unexpected size" - - outputs = (attn_output, ) - return outputs + assert output_attentions == False + return my_longformer_self_attention_forward_4(self, hidden_states, attention_mask, is_index_masked, + is_index_global_attn, is_global_attn) -#For transformers 4.0 -def my_longformer_self_attention_forward_4(self, - hidden_states, - attention_mask=None, - is_index_masked=None, - is_index_global_attn=None, - is_global_attn=None): - # TODO: move mask calculation to LongFormerModel class to avoid calculating it again and again in each layer. - global_mask = is_index_global_attn.int() - torch.masked_fill(attention_mask, is_index_global_attn, 0.0) - - weight = torch.stack( - (self.query.weight.transpose(0, 1), self.key.weight.transpose(0, 1), self.value.weight.transpose(0, 1)), dim=1) - weight = weight.reshape(self.embed_dim, 3 * self.embed_dim) - - bias = torch.stack((self.query.bias, self.key.bias, self.value.bias), dim=0) - bias = bias.reshape(3 * self.embed_dim) - - global_weight = torch.stack((self.query_global.weight.transpose(0, 1), self.key_global.weight.transpose( - 0, 1), self.value_global.weight.transpose(0, 1)), - dim=1) - global_weight = global_weight.reshape(self.embed_dim, 3 * self.embed_dim) - - global_bias = torch.stack((self.query_global.bias, self.key_global.bias, self.value_global.bias), dim=0) - global_bias = global_bias.reshape(3 * self.embed_dim) - - attn_output = torch.ops.onnxruntime.LongformerAttention(hidden_states, weight, bias, attention_mask, global_weight, - global_bias, global_mask, self.num_heads, - self.one_sided_attn_window_size) - - assert attn_output.size() == hidden_states.size(), "Unexpected size" - - outputs = (attn_output, ) - return outputs +# For transformers 4.3.2 +def my_longformer_self_attention_forward_4_3_2(self, + hidden_states, + attention_mask=None, + layer_head_mask=None, + is_index_masked=None, + is_index_global_attn=None, + is_global_attn=None, + output_attentions=False): + assert output_attentions == False + assert layer_head_mask is None + return my_longformer_self_attention_forward_4(self, hidden_states, attention_mask, is_index_masked, + is_index_global_attn, is_global_attn) -# For transformers 3.0 -def my_longformer_attention_forward_3(self, hidden_states, attention_mask, output_attentions=False): +def export_longformer(model, onnx_model_path, export_padding): + input_ids, attention_mask, global_attention_mask = get_dummy_inputs(model.config, + export_padding, + device=torch.device('cpu')) - assert output_attentions is False + example_outputs = model(input_ids, attention_mask=attention_mask, global_attention_mask=global_attention_mask) - # TODO: attention_mask can directly be passed from inputs of model to avoid these processing. - attention_mask = attention_mask.squeeze(dim=2).squeeze(dim=1) - global_mask = (attention_mask > 0).int() - torch.masked_fill(attention_mask, attention_mask > 0, 0.0) + if version.parse(transformers.__version__) < version.parse("4.0.0"): + raise RuntimeError("This tool requires transformers 4.0.0 or later.") - weight = torch.stack( - (self.query.weight.transpose(0, 1), self.key.weight.transpose(0, 1), self.value.weight.transpose(0, 1)), dim=1) - weight = weight.reshape(self.embed_dim, 3 * self.embed_dim) + # Here we replace LongformerSelfAttention.forward using our implmentation for exporting ONNX model + from transformers import LongformerSelfAttention + import inspect + key = ' '.join(inspect.getfullargspec(LongformerSelfAttention.forward).args) + args_to_func = { + 'self hidden_states attention_mask layer_head_mask is_index_masked is_index_global_attn is_global_attn output_attentions': + my_longformer_self_attention_forward_4_3_2, + 'self hidden_states attention_mask is_index_masked is_index_global_attn is_global_attn output_attentions': + my_longformer_self_attention_forward_4_3, + 'self hidden_states attention_mask is_index_masked is_index_global_attn is_global_attn': + my_longformer_self_attention_forward_4, + } - bias = torch.stack((self.query.bias, self.key.bias, self.value.bias), dim=0) - bias = bias.reshape(3 * self.embed_dim) + if key not in args_to_func: + print("Current arguments", inspect.getfullargspec(LongformerSelfAttention.forward).args) + raise RuntimeError( + "LongformerSelfAttention.forward arguments are different. Please install supported version (like transformers 4.3.0)." + ) - global_weight = torch.stack((self.query_global.weight.transpose(0, 1), self.key_global.weight.transpose( - 0, 1), self.value_global.weight.transpose(0, 1)), - dim=1) - global_weight = global_weight.reshape(self.embed_dim, 3 * self.embed_dim) + # Store for restoring later + original_forward = LongformerSelfAttention.forward - global_bias = torch.stack((self.query_global.bias, self.key_global.bias, self.value_global.bias), dim=0) - global_bias = global_bias.reshape(3 * self.embed_dim) + LongformerSelfAttention.forward = args_to_func[key] - attn_output = torch.ops.onnxruntime.LongformerAttention(hidden_states, weight, bias, attention_mask, global_weight, - global_bias, global_mask, self.num_heads, - self.one_sided_attn_window_size) + example_inputs = (input_ids, attention_mask, global_attention_mask) - assert attn_output.size() == hidden_states.size(), "Unexpected size" + Path(onnx_model_path).parent.mkdir(parents=True, exist_ok=True) - outputs = (attn_output, ) - return outputs - - -# Here we replace LongformerSelfAttention.forward using our implmentation for exporting ONNX model -from transformers.modeling_longformer import LongformerSelfAttention -key = ' '.join(inspect.getfullargspec(LongformerSelfAttention.forward).args) -args_to_func = { - 'self hidden_states attention_mask is_index_masked is_index_global_attn is_global_attn output_attentions': - my_longformer_self_attention_forward_4_3, - 'self hidden_states attention_mask is_index_masked is_index_global_attn is_global_attn': - my_longformer_self_attention_forward_4, - 'self hidden_states attention_mask output_attentions': my_longformer_self_attention_forward_3, -} - -if key not in args_to_func: - raise RuntimeError( - "LongformerSelfAttention.forward arguments are different. Please install supported version (like 4.3.0) of transformers package." - ) - -LongformerSelfAttention.forward = args_to_func[key] -""" -if version.parse(transformers.__version__) < version.parse("4.0.0"): - from transformers.modeling_longformer import LongformerSelfAttention - #original_forward = LongformerSelfAttention.forward - LongformerSelfAttention.forward = my_longformer_attention_forward_3 -else: - from transformers.models.longformer.modeling_longformer import LongformerSelfAttention - #original_forward = LongformerSelfAttention.forward - LongformerSelfAttention.forward = my_longformer_self_attention_forward_4 -""" - -# TODO: support more inputs like (input_ids, attention_mask, global_attention_mask, token_type_ids, position_ids) -example_inputs = (input_ids, attention_mask, global_attention_mask) - -torch.onnx.export(model, - example_inputs, - onnx_model_path, - opset_version=11, - example_outputs=example_outputs, - input_names=["input_ids", "attention_mask", "global_attention_mask"], - output_names=["last_state", "pooler"], - dynamic_axes={ - 'input_ids': { - 0: 'batch_size', - 1: 'sequence_length' + torch.onnx.export(model, + example_inputs, + onnx_model_path, + opset_version=11, + example_outputs=example_outputs, + input_names=["input_ids", "attention_mask", "global_attention_mask"], + output_names=["last_state", "pooler"], + dynamic_axes={ + 'input_ids': { + 0: 'batch_size', + 1: 'sequence_length' + }, + 'attention_mask': { + 0: 'batch_size', + 1: 'sequence_length' + }, + 'global_attention_mask': { + 0: 'batch_size', + 1: 'sequence_length' + }, + 'last_state': { + 0: 'batch_size', + 1: 'sequence_length' + }, + 'pooler': { + 0: 'batch_size', + 1: 'sequence_length' + } }, - 'attention_mask': { - 0: 'batch_size', - 1: 'sequence_length' - }, - 'global_attention_mask': { - 0: 'batch_size', - 1: 'sequence_length' - }, - 'last_state': { - 0: 'batch_size', - 1: 'sequence_length' - }, - 'pooler': { - 0: 'batch_size', - 1: 'sequence_length' - } - }, - custom_opsets={"com.microsoft": 1}) -print(f"ONNX model exported to {onnx_model_path}") + custom_opsets={"com.microsoft": 1}) + print(f"ONNX model exported to {onnx_model_path}") -if args.sequence_length % model.config.attention_window[0] == 0: - print( - f"*Attention*: You need input padding for inference: input sequece length shall be multiple of {model.config.attention_window[0]}. It is because the example input for export ONNX model does not need padding so padding logic is not in onnx model." - ) + # Restore original implementaiton: + LongformerSelfAttention.forward = original_forward -# Restore Huggingface implementaiton like the following: -# LongformerSelfAttention.forward = original_forward -if args.precision != 'fp32' or args.optimize_onnx: +def optimize_longformer(onnx_model_path, fp32_model_path, fp16_model_path=None): from onnx import load_model from onnxruntime.transformers.onnx_model_bert import BertOnnxModel, BertOptimizationOptions model = load_model(onnx_model_path, format=None, load_external_data=True) optimization_options = BertOptimizationOptions('bert') - optimizer = BertOnnxModel(model, num_heads=16, hidden_size=768) + optimizer = BertOnnxModel(model, num_heads=16, + hidden_size=768) # paramters does not matter since attention fusion is not needed. optimizer.optimize(optimization_options) - optimized_model_path = model_name + "_fp32.onnx" - optimizer.save_model_to_file(optimized_model_path) - print(f"optimized fp32 model saved to {optimized_model_path}") - if args.precision == 'fp16': + use_external_data_format = False + if fp32_model_path: + optimizer.save_model_to_file(fp32_model_path, use_external_data_format) + print(f"optimized fp32 model saved to {fp32_model_path}") + + if fp16_model_path: optimizer.convert_model_float32_to_float16(cast_input_output=True) - optimized_model_path = model_name + "_fp16.onnx" - optimizer.save_model_to_file(optimized_model_path) - print(f"optimized fp16 model saved to {optimized_model_path}") + optimizer.save_model_to_file(fp16_model_path, use_external_data_format) + print(f"optimized fp16 model saved to {fp16_model_path}") + + +def main(args): + model_name = args.model + onnx_model_path = model_name + ".onnx" + + from transformers import LongformerModel + model = LongformerModel.from_pretrained(PRETRAINED_LONGFORMER_MODELS[model_name]) + + export_longformer(model, onnx_model_path, args.export_padding) + + if args.optimize_onnx or args.precision != 'fp32': + fp32_model_path = model_name + "_fp32.onnx" + fp16_model_path = model_name + "_fp16.onnx" if args.precision == 'fp16' else None + optimize_longformer(onnx_model_path, fp32_model_path, fp16_model_path) + + +if __name__ == "__main__": + args = parse_arguments() + main(args) diff --git a/onnxruntime/python/tools/transformers/longformer/longformer_helper.py b/onnxruntime/python/tools/transformers/longformer/longformer_helper.py new file mode 100644 index 0000000000..7a7ea17f54 --- /dev/null +++ b/onnxruntime/python/tools/transformers/longformer/longformer_helper.py @@ -0,0 +1,76 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +# This script helps creating dummy inputs for Longformer model. + +import os +import logging +import torch +import onnx +import random +import numpy +import time +import re +from pathlib import Path +from typing import List, Dict, Tuple, Union + +logger = logging.getLogger(__name__) + +PRETRAINED_LONGFORMER_MODELS = { + "longformer-base-4096": "allenai/longformer-base-4096", + "longformer-large-4096": "allenai/longformer-large-4096", + "longformer-random-tiny": "patrickvonplaten/longformer-random-tiny" # A tiny model for debugging +} + + +class LongformerInputs: + def __init__(self, input_ids, attention_mask, global_attention_mask): + self.input_ids: torch.LongTensor = input_ids + self.attention_mask: Union[torch.FloatTensor, torch.HalfTensor] = attention_mask + self.global_attention_mask: Union[torch.FloatTensor, torch.HalfTensor] = global_attention_mask + + def to_list(self) -> List: + return [v for v in [self.input_ids, self.attention_mask, self.global_attention_mask] if v is not None] + + def to_tuple(self) -> Tuple: + return tuple(v for v in self.to_list()) + + def get_ort_inputs(self) -> Dict: + return { + "input_ids": numpy.ascontiguousarray(self.input_ids.cpu().numpy()), + "attention_mask": numpy.ascontiguousarray(self.attention_mask.cpu().numpy()), + "global_attention_mask": numpy.ascontiguousarray(self.global_attention_mask.cpu().numpy()), + } + + +class LongformerHelper: + """ A helper class for Longformer model conversion, inference and verification. + """ + @staticmethod + def get_dummy_inputs(batch_size: int, + sequence_length: int, + num_global_tokens: int, + device: torch.device, + vocab_size: int = 100) -> LongformerInputs: + """ Create random inputs for Longformer model. + Returns torch tensors of input_ids, attention_mask and global_attention_mask tensors. + """ + + input_ids = torch.randint(low=0, + high=vocab_size - 1, + size=(batch_size, sequence_length), + dtype=torch.long, + device=device) + attention_mask = torch.ones(input_ids.shape, dtype=torch.long, device=device) + global_attention_mask = torch.zeros(input_ids.shape, dtype=torch.long, device=device) + global_token_index = list(range(num_global_tokens)) + global_attention_mask[:, global_token_index] = 1 + return LongformerInputs(input_ids, attention_mask, global_attention_mask) + + @staticmethod + def get_output_shapes(batch_size: int, sequence_length: int, hidden_size: int) -> Dict[str, List[int]]: + """ Returns a dictionary with output name as key, and shape as value. + """ + return {"last_state": [batch_size, sequence_length, hidden_size], "pooler": [batch_size, sequence_length]} diff --git a/onnxruntime/python/tools/transformers/onnx_model.py b/onnxruntime/python/tools/transformers/onnx_model.py index 02a953e713..5f821feea1 100644 --- a/onnxruntime/python/tools/transformers/onnx_model.py +++ b/onnxruntime/python/tools/transformers/onnx_model.py @@ -405,7 +405,10 @@ class OnnxModel: self.model.opset_import[0].version = original_opset_version def convert_model_float32_to_float16(self, cast_input_output=True): - """ Convert a graph to FLOAT16 + """Convert a graph to FLOAT16. By default, we will keep data types of inputs and outputs. + For decoder model with past_key_values, it is recommended to set cast_input_output=False for better performance. + Args: + cast_input_output (bool, optional): keep data type of inputs and outputs, and add Cast nodes to convert float32 inputs to float16, and float16 to float32 for outputs. Defaults to True. """ from packaging.version import Version import onnxconverter_common as oc diff --git a/onnxruntime/test/contrib_ops/longformer_attention_op_test.cc b/onnxruntime/test/contrib_ops/longformer_attention_op_test.cc index 8ad0d2f44c..82f97eede0 100644 --- a/onnxruntime/test/contrib_ops/longformer_attention_op_test.cc +++ b/onnxruntime/test/contrib_ops/longformer_attention_op_test.cc @@ -5,6 +5,8 @@ #include "test/common/tensor_op_test_utils.h" #include "test/common/cuda_op_test_utils.h" #include "test/providers/provider_test_utils.h" +#include "test/util/include/scoped_env_vars.h" +#include "contrib_ops/cpu/bert/longformer_attention_base.h" namespace onnxruntime { namespace test { @@ -148,16 +150,33 @@ static void GetTinyLongformerData( static void RunTinyLongformerBatch1( std::vector& mask_data, std::vector& global_data, + std::vector& input_data, std::vector& output_data, - bool use_float16, - bool window_cover_whole_sequence = false) { + bool use_float16) { int batch_size = 1; int one_sided_attention_window_size = 2; int hidden_size = 8; int number_of_heads = 2; + std::vector weight_data; + std::vector bias_data; + std::vector global_weight_data; + std::vector global_bias_data; + GetTinyLongformerData(weight_data, bias_data, global_weight_data, global_bias_data); + + int sequence_length = static_cast(mask_data.size()) / batch_size; + + RunAttentionTest(input_data, weight_data, bias_data, mask_data, global_weight_data, global_bias_data, global_data, output_data, + batch_size, sequence_length, hidden_size, number_of_heads, one_sided_attention_window_size, use_float16); +} + +static void RunTinyLongformerBatch1( + std::vector& mask_data, + std::vector& global_data, + std::vector& output_data, + bool use_float16, + bool window_cover_whole_sequence = false) { // Total windows size 4 will cover the whole sequence length 4 - int sequence_length = window_cover_whole_sequence ? 4 : 8; std::vector input_data; if (window_cover_whole_sequence) { input_data = { @@ -176,15 +195,7 @@ static void RunTinyLongformerBatch1( -1.0536f, -0.0425f, -1.1194f, -0.6423f, 2.1825f, 0.2547f, 0.6015f, -0.1809f, 0.5219f, 0.1777f, 0.7090f, -2.1933f, 0.5258f, -0.0639f, -0.8511f, 1.1738f}; } - - std::vector weight_data; - std::vector bias_data; - std::vector global_weight_data; - std::vector global_bias_data; - GetTinyLongformerData(weight_data, bias_data, global_weight_data, global_bias_data); - - RunAttentionTest(input_data, weight_data, bias_data, mask_data, global_weight_data, global_bias_data, global_data, output_data, - batch_size, sequence_length, hidden_size, number_of_heads, one_sided_attention_window_size, use_float16); + return RunTinyLongformerBatch1(mask_data, global_data, input_data, output_data, use_float16); } TEST(LongformerAttentionTest, LongformerAttention_NoGlobal) { @@ -238,6 +249,50 @@ TEST(LongformerAttentionTest, LongformerAttention_GlobalStart) { RunTinyLongformerBatch1(mask_data, global_data, output_data, false); } +/* +* This following case is generated from the first self-attention of a tiny longformer model like the following: + import torch + from transformers import AutoModel + model = AutoModel.from_pretrained("patrickvonplaten/longformer-random-tiny") + input_ids = torch.LongTensor([[97, 24, 71, 5, 8]])) + attention_mask = torch.ones(input_ids.shape, dtype=torch.long, device=input_ids.device) + global_attention_mask = torch.zeros(input_ids.shape, dtype=torch.long, device=input_ids.device) + global_attention_mask[:, [0, 1,]] = 1 + outputs = model(input_ids, attention_mask=attention_mask, global_attention_mask=global_attention_mask) +*/ +TEST(LongformerAttentionTest, LongformerAttention_UseCompactMemory) { + std::vector mask_data = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f, -10000.0f, -10000.0f}; + + std::vector global_data = {1, 1, 0, 0, 0, 0, 0, 0}; + + std::vector input_data = { + -1.6886f, -0.0712f, 0.7017f, -1.5513f, 0.1059f, 0.8119f, 1.1139f, 0.5776f, + -1.0874f, 0.2870f, -0.3767f, -1.8203f, 0.0116f, 1.4285f, 0.6643f, 0.8931f, + -1.0425f, 1.0148f, -0.6387f, -1.6496f, -0.3027f, 0.3839f, 1.0230f, 1.2119f, + 0.3576f, -1.5848f, 0.1713f, -0.9284f, 1.7172f, -0.8574f, 0.8390f, 0.2855f, + -1.7443f, 0.4251f, 1.6560f, -0.5054f, -0.8734f, 0.4769f, 0.8434f, -0.2781f, + 0.5219f, 0.1777f, 0.7090f, -2.1933f, 0.5258f, -0.0639f, -0.8511f, 1.1738f, + 0.5219f, 0.1777f, 0.7090f, -2.1933f, 0.5258f, -0.0639f, -0.8511f, 1.1738f, + 0.5219f, 0.1777f, 0.7090f, -2.1933f, 0.5258f, -0.0639f, -0.8511f, 1.1738f}; + + std::vector output_data = { + -0.0330f, 0.0517f, -0.0292f, 0.0194f, -0.0154f, 0.0012f, -0.0041f, -0.0518f, + -0.0331f, 0.0517f, -0.0291f, 0.0194f, -0.0154f, 0.0011f, -0.0041f, -0.0517f, + 0.0421f, 0.0627f, 0.0445f, 0.0328f, 0.0196f, -0.0712f, -0.0233f, -0.0875f, + 0.0419f, 0.0626f, 0.0447f, 0.0328f, 0.0196f, -0.0712f, -0.0233f, -0.0875f, + 0.0421f, 0.0627f, 0.0445f, 0.0328f, 0.0196f, -0.0712f, -0.0233f, -0.0875f, + 0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, + 0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, + 0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f, 0.0000f}; + + ScopedEnvironmentVariables scoped_env_vars{ + EnvVarMap{ + {onnxruntime::contrib::longformer::kUseCompactMemory, "1"}, + }}; + + RunTinyLongformerBatch1(mask_data, global_data, input_data, output_data, false); +} + TEST(LongformerAttentionTest, LongformerAttention_Float16) { std::vector mask_data = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -10000.0f}; diff --git a/tools/ci_build/amd_hipify.py b/tools/ci_build/amd_hipify.py index 258297a9e5..4816783f25 100644 --- a/tools/ci_build/amd_hipify.py +++ b/tools/ci_build/amd_hipify.py @@ -26,6 +26,8 @@ contrib_ops_excluded_files = [ 'bert/layer_norm.cuh', 'bert/longformer_attention.cc', 'bert/longformer_attention.h', + 'bert/longformer_attention_softmax.cu', + 'bert/longformer_attention_softmax.h', 'bert/longformer_attention_impl.cu', 'bert/longformer_attention_impl.h', 'bert/longformer_global_impl.cu', From 9f7dffb109a936981ca679accedbf61ccf785379 Mon Sep 17 00:00:00 2001 From: Scott McKay Date: Sat, 20 Feb 2021 20:41:19 +1000 Subject: [PATCH 12/37] Make it easier to fold MakeString usages to reduce binary size. (#6754) * Decay char[n] to char* so that we get better re-use of MakeString invocations. --- include/onnxruntime/core/common/make_string.h | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/include/onnxruntime/core/common/make_string.h b/include/onnxruntime/core/common/make_string.h index a6e421a61e..826898de85 100644 --- a/include/onnxruntime/core/common/make_string.h +++ b/include/onnxruntime/core/common/make_string.h @@ -19,10 +19,12 @@ #include #include +#include namespace onnxruntime { namespace detail { + inline void MakeStringImpl(std::ostringstream& /*ss*/) noexcept { } @@ -36,6 +38,39 @@ inline void MakeStringImpl(std::ostringstream& ss, const T& t, const Args&... ar MakeStringImpl(ss, t); MakeStringImpl(ss, args...); } + +// see MakeString comments for explanation of why this is necessary +template +inline std::string MakeStringImpl(const Args&... args) noexcept { + std::ostringstream ss; + MakeStringImpl(ss, args...); + return ss.str(); +} + +// +// Infrastructure to convert char[n] to char* to reduce binary size +// + +// default is to leave the type as is +template +struct if_char_array_make_ptr { + using type = T; +}; + +// specialization that matches an array reference, which is what the char array from a string literal +// used in a call to MakeString will be. +// if the type is a char[n] array we 'decay' it to a char* so that the usages can be folded. +template +struct if_char_array_make_ptr { + // remove a single extent (T[x] -> T, but T[x][y] -> T[y]) so we only match char[x], + // and get the type name without the 'const' so both 'const char (&)[n]' and 'char (&)[n]' are matched. + using element_type = typename std::remove_const::type>::type; + using type = typename std::conditional::value, T*, T (&)[N]>::type; +}; + +// helper to make usage simpler in MakeString +template +using if_char_array_make_ptr_t = typename if_char_array_make_ptr::type; } // namespace detail /** @@ -44,9 +79,18 @@ inline void MakeStringImpl(std::ostringstream& ss, const T& t, const Args&... ar */ template std::string MakeString(const Args&... args) { - std::ostringstream ss; - detail::MakeStringImpl(ss, args...); - return ss.str(); + // We need to update the types from the MakeString template instantiation to decay any char[n] to char*. + // e.g. MakeString("in", "out") goes from MakeString to MakeStringImpl + // so that MakeString("out", "in") will also match MakeStringImpl instead of requiring + // MakeStringImpl. + // + // We have to do the type processing before any actual work, so this function purely implements the type processing. + // If we do not do it this way we do not get the full binary size reduction. + // + // See https://stackoverflow.com/a/29418212/684911 for overall details of the approach, but note it does not cover + // the need to do the type processing as a separate step. + + return detail::MakeStringImpl(detail::if_char_array_make_ptr_t(args)...); } /** From c91f3142171f6d3dad944d2e107ee3d02e8f39db Mon Sep 17 00:00:00 2001 From: Ivan Stojiljkovic <17503404+ivanst0@users.noreply.github.com> Date: Mon, 22 Feb 2021 00:11:28 +0100 Subject: [PATCH 13/37] Add robust dependency check for Python package (#6436) * Add robust dependency check for Python package * Add version_info.py to .gitignore * Fix Linux build * Fix Windows CPU build * Fix Windows 32-bit build * Minor tweak * Generate version_info.py earlier in onnxruntime_python.cmake * Print a user-friendly message if cuDNN is not found in * Relax version requirements for CUDA 11 - only the major version has to match * Fix PATH environment variable to include CUDA 11 in 'Python packaging pipeline' (Windows/GPU) * Fix the build with cuDNN 7 --- .gitignore | 1 + cmake/onnxruntime_python.cmake | 30 ++++++++++++++ onnxruntime/__init__.py | 11 ----- onnxruntime/python/_pybind_state.py | 64 +++++++++++++++++++++-------- tools/ci_build/build.py | 9 +++- 5 files changed, 85 insertions(+), 30 deletions(-) diff --git a/.gitignore b/.gitignore index 99dc66b819..5f10cfbc16 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,7 @@ java/gradlew.bat java/gradle java/.gradle java/hs_*.log +onnxruntime/python/version_info.py /tools/perf_util/target/classes/com/msft/send_perf_metrics /tools/perf_util/send_perf_metrics.iml /tools/perf_util/target/classes diff --git a/cmake/onnxruntime_python.cmake b/cmake/onnxruntime_python.cmake index 9a3fdba3aa..6f48f60952 100644 --- a/cmake/onnxruntime_python.cmake +++ b/cmake/onnxruntime_python.cmake @@ -153,6 +153,36 @@ else() set_target_properties(onnxruntime_pybind11_state PROPERTIES SUFFIX ".so") endif() +# Generate version_info.py in Windows build. +# Has to be done before onnxruntime_python_srcs is set. +if (WIN32) + set(VERSION_INFO_FILE "${ONNXRUNTIME_ROOT}/python/version_info.py") + + if (onnxruntime_USE_CUDA) + file(WRITE "${VERSION_INFO_FILE}" "use_cuda = True\n") + + file(GLOB CUDNN_DLL_PATH "${onnxruntime_CUDNN_HOME}/bin/cudnn64_*.dll") + if (NOT CUDNN_DLL_PATH) + message(FATAL_ERROR "cuDNN not found in ${onnxruntime_CUDNN_HOME}") + endif() + get_filename_component(CUDNN_DLL_NAME ${CUDNN_DLL_PATH} NAME_WE) + string(REPLACE "cudnn64_" "" CUDNN_VERSION "${CUDNN_DLL_NAME}") + + file(APPEND "${VERSION_INFO_FILE}" + "cuda_version = \"${onnxruntime_CUDA_VERSION}\"\n" + "cudnn_version = \"${CUDNN_VERSION}\"\n" + ) + else() + file(WRITE "${VERSION_INFO_FILE}" "use_cuda = False\n") + endif() + + if ("${MSVC_TOOLSET_VERSION}" STREQUAL "142") + file(APPEND "${VERSION_INFO_FILE}" "vs2019 = True\n") + else() + file(APPEND "${VERSION_INFO_FILE}" "vs2019 = False\n") + endif() +endif() + file(GLOB onnxruntime_backend_srcs CONFIGURE_DEPENDS "${ONNXRUNTIME_ROOT}/python/backend/*.py" ) diff --git a/onnxruntime/__init__.py b/onnxruntime/__init__.py index 8eeca65890..492416e48e 100644 --- a/onnxruntime/__init__.py +++ b/onnxruntime/__init__.py @@ -10,17 +10,6 @@ or the `Github project `_. __version__ = "1.7.0" __author__ = "Microsoft" -import os -import platform -import sys - -# Python 3.8 (and later) on Windows doesn't search system PATH when loading DLLs, -# so CUDA location needs to be specified explicitly. This needs to be done before importing -# onnxruntime.capi._pybind_state -if "CUDA_PATH" in os.environ and platform.system() == "Windows" and sys.version_info >= (3, 8): - cuda_bin_dir = os.path.join(os.environ["CUDA_PATH"], "bin") - os.add_dll_directory(cuda_bin_dir) - from onnxruntime.capi._pybind_state import get_all_providers, get_available_providers, get_device, set_seed, \ RunOptions, SessionOptions, set_default_logger_severity, enable_telemetry_events, disable_telemetry_events, \ NodeArg, ModelMetadata, GraphOptimizationLevel, ExecutionMode, ExecutionOrder, OrtDevice, SessionIOBinding, \ diff --git a/onnxruntime/python/_pybind_state.py b/onnxruntime/python/_pybind_state.py index e4f8ec4e97..c1499ec554 100644 --- a/onnxruntime/python/_pybind_state.py +++ b/onnxruntime/python/_pybind_state.py @@ -2,25 +2,53 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. # -------------------------------------------------------------------------- - +""" +Ensure that dependencies are available and then load the extension module. +""" import os import platform -import warnings -import onnxruntime.capi._ld_preload # noqa: F401 +import sys -try: - from onnxruntime.capi.onnxruntime_pybind11_state import * # noqa -except ImportError as e: - warnings.warn("Cannot load onnxruntime.capi. Error: '{0}'.".format(str(e))) +from . import _ld_preload # noqa: F401 - # If on Windows, check if this import error is caused by the user not installing the 2019 VC Runtime - # The VC Redist installer usually puts the VC Runtime dlls in the System32 folder - # This may not always paint the true picture as anyone building from source using VS 2017 might hit this error - # because the machine might be missing the 2019 VC Runtime but it is not actually needed in that case and the - # import error might actually be due to some other reason. - # TODO: Add a guard against False Positive error message - # As a proxy for checking if the 2019 VC Runtime is installed, - # we look for a specific dll only shipped with the 2019 VC Runtime - if platform.system().lower() == 'windows' and not os.path.isfile('c:\\Windows\\System32\\vcruntime140_1.dll'): - warnings.warn("Unless you have built the wheel using VS 2017, " - "please install the 2019 Visual C++ runtime and then try again") +if platform.system() == "Windows": + from . import version_info + + if version_info.use_cuda: + cuda_version_major, cuda_version_minor = version_info.cuda_version.split(".") + if int(cuda_version_major) < 11: + # Prior to CUDA 11 both major and minor version at build time/runtime have to match. + cuda_env_variable = f"CUDA_PATH_V{cuda_version_major}_{cuda_version_minor}" + if cuda_env_variable not in os.environ: + raise ImportError(f"CUDA Toolkit {version_info.cuda_version} not installed on the machine.") + else: + # With CUDA 11 and newer only the major version at build time/runtime has to match. + # Use the most recent minor version available. + cuda_env_variable = None + for i in range(9, -1, -1): + if f"CUDA_PATH_V{cuda_version_major}_{i}" in os.environ: + cuda_env_variable = f"CUDA_PATH_V{cuda_version_major}_{i}" + break + if not cuda_env_variable: + raise ImportError(f"CUDA Toolkit {cuda_version_major}.x not installed on the machine.") + + cuda_bin_dir = os.path.join(os.environ[cuda_env_variable], "bin") + if not os.path.isfile(os.path.join(cuda_bin_dir, f"cudnn64_{version_info.cudnn_version}.dll")): + raise ImportError(f"cuDNN {version_info.cudnn_version} not installed in {cuda_bin_dir}.") + + if sys.version_info >= (3, 8): + # Python 3.8 (and later) doesn't search system PATH when loading DLLs, so the CUDA location needs to be + # specified explicitly using the new API introduced in Python 3.8. + os.add_dll_directory(cuda_bin_dir) + else: + # Python 3.7 (and earlier) searches directories listed in PATH variable. + # Make sure that the target CUDA version is at the beginning (important if multiple CUDA versions are + # installed on the machine.) + os.environ["PATH"] += cuda_bin_dir + os.pathsep + os.environ["PATH"] + + if version_info.vs2019 and platform.architecture()[0] == "64bit": + if not os.path.isfile("C:\\Windows\\System32\\vcruntime140_1.dll"): + raise ImportError( + "Microsoft Visual C++ Redistributable for Visual Studio 2019 not installed on the machine.") + +from .onnxruntime_pybind11_state import * # noqa diff --git a/tools/ci_build/build.py b/tools/ci_build/build.py index c580ef6649..c70de5329f 100644 --- a/tools/ci_build/build.py +++ b/tools/ci_build/build.py @@ -631,9 +631,10 @@ def generate_build_tree(cmake_path, source_dir, build_dir, cuda_home, cudnn_home "-Donnxruntime_DEV_MODE=" + use_dev_mode(args), "-DPYTHON_EXECUTABLE=" + sys.executable, "-Donnxruntime_USE_CUDA=" + ("ON" if args.use_cuda else "OFF"), + "-Donnxruntime_CUDA_VERSION=" + (args.cuda_version if args.use_cuda else ""), + "-Donnxruntime_CUDA_HOME=" + (cuda_home if args.use_cuda else ""), "-Donnxruntime_CUDNN_HOME=" + (cudnn_home if args.use_cuda else ""), "-Donnxruntime_USE_FEATURIZERS=" + ("ON" if args.use_featurizers else "OFF"), - "-Donnxruntime_CUDA_HOME=" + (cuda_home if args.use_cuda else ""), "-Donnxruntime_USE_MIMALLOC_STL_ALLOCATOR=" + ( "ON" if args.use_mimalloc == "stl" or args.use_mimalloc == "all" else "OFF"), "-Donnxruntime_USE_MIMALLOC_ARENA_ALLOCATOR=" + ( @@ -1903,6 +1904,12 @@ def main(): install_python_deps(args.numpy_version) if args.enable_onnx_tests: setup_test_data(build_dir, configs) + if args.use_cuda and args.cuda_version is None: + if is_windows(): + # cuda_version is used while generating version_info.py on Windows. + raise BuildError("cuda_version must be specified on Windows.") + else: + args.cuda_version = "" generate_build_tree( cmake_path, source_dir, build_dir, cuda_home, cudnn_home, rocm_home, mpi_home, nccl_home, tensorrt_home, migraphx_home, acl_home, acl_libs, armnn_home, armnn_libs, From ee35be012920f7afb6a7eed9728091eca32e0105 Mon Sep 17 00:00:00 2001 From: Edward Chen <18449977+edgchen1@users.noreply.github.com> Date: Mon, 22 Feb 2021 14:05:00 -0800 Subject: [PATCH 14/37] Support specifying globally allowed types from build script (#6677) Add initial support for constraining operator kernel implementations (which support this type-granularity) to a set of allowed types from scripts. --- .../op_kernel_type_control_overrides.inc | 2 +- tools/ci_build/build.py | 31 +- .../ci_build/exclude_unused_ops_and_types.py | 180 ------------ tools/ci_build/op_registration_utils.py | 3 +- tools/ci_build/op_registration_validator.py | 3 +- tools/ci_build/reduce_op_kernels.py | 264 ++++++++++++++++++ tools/python/create_reduced_build_config.py | 2 +- .../util/reduced_build_config_parser.py | 51 +++- 8 files changed, 332 insertions(+), 204 deletions(-) mode change 100644 => 100755 tools/ci_build/build.py delete mode 100644 tools/ci_build/exclude_unused_ops_and_types.py create mode 100755 tools/ci_build/reduce_op_kernels.py diff --git a/onnxruntime/core/providers/op_kernel_type_control_overrides.inc b/onnxruntime/core/providers/op_kernel_type_control_overrides.inc index 9203586db1..6103d78698 100644 --- a/onnxruntime/core/providers/op_kernel_type_control_overrides.inc +++ b/onnxruntime/core/providers/op_kernel_type_control_overrides.inc @@ -47,7 +47,7 @@ namespace op_kernel_type_control { // ORT_SPECIFY_OP_KERNEL_ARG_ALLOWED_TYPES(kOnnxDomain, Cast, Input, 0, float, int64_t); // ORT_SPECIFY_OP_KERNEL_ARG_ALLOWED_TYPES(kOnnxDomain, Cast, Output, 0, float, int64_t); // Specify allowed types globally: -// ORT_SPECIFY_OP_KERNEL_GLOBAL_ALLOWED_TYPES(float, double, int32_t) +// ORT_SPECIFY_OP_KERNEL_GLOBAL_ALLOWED_TYPES(float, double, int32_t); // specify allowed types here diff --git a/tools/ci_build/build.py b/tools/ci_build/build.py old mode 100644 new mode 100755 index c70de5329f..521e83c00b --- a/tools/ci_build/build.py +++ b/tools/ci_build/build.py @@ -448,13 +448,14 @@ def parse_arguments(): "To enable support for custom operators pass 'custom_ops' as a parameter. " "e.g. '--minimal_build custom_ops'. This can be combined with an 'extended' build by passing " "'--minimal_build extended custom_ops'") + parser.add_argument("--include_ops_by_config", type=str, - help="include ops from config file. " - "See /docs/Reduced_Operator_Kernel_build.md for more information.") + help="Include ops from config file. " + "See /docs/Reduced_Operator_Kernel_build.md for more information.") parser.add_argument("--enable_reduced_operator_type_support", action='store_true', - help='If --include_ops_by_config is specified, and the configuration file was created from ORT ' - 'format models with type reduction enabled, limit the types individual operators support ' - 'where possible to further reduce the build size. ' + help='If --include_ops_by_config is specified, and the configuration file has type reduction ' + 'information, limit the types individual operators support where possible to further ' + 'reduce the build size. ' 'See /docs/Reduced_Operator_Kernel_build.md for more information.') parser.add_argument("--disable_contrib_ops", action='store_true', @@ -475,9 +476,14 @@ def parse_arguments(): help="Generate code coverage when targetting Android (only).") parser.add_argument( "--ms_experimental", action='store_true', help="Build microsoft experimental operators.") + return parser.parse_args() +def is_reduced_ops_build(args): + return args.include_ops_by_config is not None + + def resolve_executable_path(command_or_path): """Returns the absolute path of an executable.""" executable_path = shutil.which(command_or_path) @@ -679,7 +685,7 @@ def generate_build_tree(cmake_path, source_dir, build_dir, cuda_home, cudnn_home else "OFF"), "-Donnxruntime_MINIMAL_BUILD_CUSTOM_OPS=" + ("ON" if args.minimal_build and 'custom_ops' in args.minimal_build else "OFF"), - "-Donnxruntime_REDUCED_OPS_BUILD=" + ("ON" if args.include_ops_by_config else "OFF"), + "-Donnxruntime_REDUCED_OPS_BUILD=" + ("ON" if is_reduced_ops_build(args) else "OFF"), "-Donnxruntime_MSVC_STATIC_RUNTIME=" + ("ON" if args.enable_msvc_static_runtime else "OFF"), # enable pyop if it is nightly build "-Donnxruntime_ENABLE_LANGUAGE_INTEROP_OPS=" + ("ON" if args.enable_language_interop_ops else "OFF"), @@ -1354,7 +1360,7 @@ def run_onnxruntime_tests(args, source_dir, ctest_path, build_dir, configs): # Disable python tests in a reduced build as we don't know which ops have been included and which # models can run. - if args.include_ops_by_config or args.minimal_build is not None: + if is_reduced_ops_build(args) or args.minimal_build is not None: return if is_windows(): @@ -1740,11 +1746,12 @@ def main(): if args.skip_tests: args.test = False - if args.include_ops_by_config and args.update: - from exclude_unused_ops_and_types import exclude_unused_ops_and_types - exclude_unused_ops_and_types(args.include_ops_by_config, - args.enable_reduced_operator_type_support, - args.use_cuda) + if is_reduced_ops_build(args) and args.update: + from reduce_op_kernels import reduce_ops + reduce_ops( + config_path=args.include_ops_by_config, + enable_type_reduction=args.enable_reduced_operator_type_support, + use_cuda=args.use_cuda) if args.use_tensorrt: args.use_cuda = True diff --git a/tools/ci_build/exclude_unused_ops_and_types.py b/tools/ci_build/exclude_unused_ops_and_types.py deleted file mode 100644 index dfcd4e0d61..0000000000 --- a/tools/ci_build/exclude_unused_ops_and_types.py +++ /dev/null @@ -1,180 +0,0 @@ -# !/usr/bin/env python3 -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import argparse -import op_registration_utils -import os -import shutil -import sys -import typing - -from logger import get_logger - -# add the path to /tools/python so we can import the config parsing and type reduction processing -script_path = os.path.dirname(os.path.realpath(__file__)) -ort_root = os.path.abspath(os.path.join(script_path, '..', '..', )) -ort_tools_py_path = os.path.abspath(os.path.join(ort_root, 'tools', 'python')) -sys.path.append(ort_tools_py_path) - -from util import parse_config # noqa -from util.ort_format_model.operator_type_usage_processors import OperatorTypeUsageManager # noqa - -log = get_logger("exclude_unused_ops_and_types") - - -class ExcludeOpsAndTypesRegistrationProcessor(op_registration_utils.RegistrationProcessor): - def __init__(self, required_ops, op_type_usage_manager, output_file): - self._required_ops = required_ops - self._op_types_usage_manager = op_type_usage_manager - self._output_file = output_file - - def _should_exclude_op(self, domain, operator, start_version, end_version): - if domain not in self._required_ops: - return True - - for opset in self._required_ops[domain]: - if opset >= start_version and (end_version is None or opset <= end_version): - if operator in self._required_ops[domain][opset]: - return False # found a match, do not exclude - - return True - - def process_registration(self, lines: typing.List[str], constant_for_domain: str, operator: str, - start_version: int, end_version: int = None, type: str = None): - # convert from the ORT constant name to the domain string used in the config - domain = op_registration_utils.map_ort_constant_to_domain(constant_for_domain) - exclude = False - - if domain: - # see if entire op is excluded - exclude = self._should_exclude_op(domain, operator, start_version, end_version) - - # see if a specific typed registration can be excluded - if not exclude and type and self._op_types_usage_manager: - exclude = not self._op_types_usage_manager.is_typed_registration_needed(domain, operator, type) - - if exclude: - log.info('Disabling {}:{}({}){}'.format(constant_for_domain, operator, start_version, - '<{}>'.format(type) if type else '')) - for line in lines: - self._output_file.write('// ' + line) - - # edge case of last entry in table where we still need the terminating }; to not be commented out - if lines[-1].rstrip().endswith('};'): - self._output_file.write('};\n') - else: - for line in lines: - self._output_file.write(line) - - def process_other_line(self, line): - self._output_file.write(line) - - def ok(self): - return True - - -def _exclude_unused_ops_and_types_in_registrations(required_operators, - op_type_usage_manager, - provider_registration_paths): - '''rewrite provider registration file to exclude unused ops''' - - for kernel_registration_file in provider_registration_paths: - if not os.path.isfile(kernel_registration_file): - raise ValueError('Kernel registration file {} does not exist'.format(kernel_registration_file)) - - log.info("Processing {}".format(kernel_registration_file)) - - backup_path = kernel_registration_file + '~' - shutil.move(kernel_registration_file, backup_path) - - # read from backup and overwrite original with commented out lines for any kernels that are not required - with open(kernel_registration_file, 'w') as file_to_write: - processor = ExcludeOpsAndTypesRegistrationProcessor(required_operators, - op_type_usage_manager, - file_to_write) - - op_registration_utils.process_kernel_registration_file(backup_path, processor) - - if not processor.ok(): - # error should have already been logged so just exit - sys.exit(-1) - - -def _generate_required_types_cpp_code(ort_root: str, op_type_usage_manager: OperatorTypeUsageManager): - ''' - Generate and insert the C++ code to specify per operator type requirements. - :param ort_root: Root of the ONNX Runtime repository - :param op_type_usage_manager: OperatorTypeUsageManager that contains the required type info - ''' - # get the C++ code to insert - cpp_lines = op_type_usage_manager.get_cpp_entries() if op_type_usage_manager else None - if not cpp_lines: - return - - target = os.path.join(ort_root, 'onnxruntime', 'core', 'providers', 'op_kernel_type_control_overrides.inc') - if not os.path.exists(target) or not os.path.isfile(target): - log.warning('Could not find {}. Skipping generation of C++ code to reduce the types supported by operators.' - .format(target)) - return - - # copy existing content to use as input - src = target + '.tmp' - shutil.copyfile(target, src) - - # find the insertion block and replace any existing content in it - inserted = False - with open(src, 'r') as input, open(target, 'w') as output: - inside_insertion_block = False - for line in input.readlines(): - if '@@insertion_point_begin(allowed_types)@@' in line: - inside_insertion_block = True - output.write(line) - [output.write('{}\n'.format(code_line)) for code_line in cpp_lines] - inserted = True - continue - elif inside_insertion_block: - if '@@insertion_point_end(allowed_types)@@' in line: - inside_insertion_block = False - else: - # we ignore any old lines within the insertion block - continue - - output.write(line) - - os.remove(src) - - if not inserted: - raise RuntimeError('Insertion point was not found in {}'.format(target)) - - # future: how will any global type limitations be provided by the user - # and added to op_kernel_type_control_overrides.inc? - # should they come from a reduced build configuration file, be specified on a build command-line, - # or manually added to op_kernel_type_control_overrides.inc? - - -def exclude_unused_ops_and_types(config_path, enable_type_reduction=False, use_cuda=True): - required_ops, op_type_usage_manager = parse_config(config_path, enable_type_reduction) - - registration_files = op_registration_utils.get_kernel_registration_files(ort_root, use_cuda) - - _exclude_unused_ops_and_types_in_registrations(required_ops, op_type_usage_manager, registration_files) - - _generate_required_types_cpp_code(ort_root, op_type_usage_manager) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="Script to exclude unused operator kernels by disabling their registration in ONNX Runtime. " - "The types supported by operator kernels may also be reduced if specified in the config file.", - formatter_class=argparse.ArgumentDefaultsHelpFormatter) - - parser.add_argument("config_path", type=str, - help="Path to configuration file. " - "Create with /tools/python/create_reduced_build_config.py and edit if needed. " - "See /docs/ONNX_Runtime_Format_Model_Usage.md for more information.") - - args = parser.parse_args() - config_path = os.path.abspath(args.config_path) - - exclude_unused_ops_and_types(config_path, enable_type_reduction=True, use_cuda=True) diff --git a/tools/ci_build/op_registration_utils.py b/tools/ci_build/op_registration_utils.py index 8e94957bca..7de949340c 100644 --- a/tools/ci_build/op_registration_utils.py +++ b/tools/ci_build/op_registration_utils.py @@ -75,7 +75,8 @@ class RegistrationProcessor: ''' def process_registration(self, lines: typing.List[str], domain: str, operator: str, - start_version: int, end_version: int = None, type: str = None): + start_version: int, end_version: typing.Optional[int] = None, + type: typing.Optional[str] = None): ''' Process lines that contain a kernel registration. :param lines: Array containing the original lines containing the kernel registration. diff --git a/tools/ci_build/op_registration_validator.py b/tools/ci_build/op_registration_validator.py index 84a201274a..f911a9d185 100644 --- a/tools/ci_build/op_registration_validator.py +++ b/tools/ci_build/op_registration_validator.py @@ -33,7 +33,8 @@ class RegistrationValidator(op_registration_utils.RegistrationProcessor): self.failed = False def process_registration(self, lines: typing.List[str], domain: str, operator: str, - start_version: int, end_version: int = None, type: str = None): + start_version: int, end_version: typing.Optional[int] = None, + type: typing.Optional[str] = None): key = domain + ':' + operator prev_start, prev_end = self.last_op_registrations[key] if key in self.last_op_registrations else (None, None) diff --git a/tools/ci_build/reduce_op_kernels.py b/tools/ci_build/reduce_op_kernels.py new file mode 100755 index 0000000000..8387a541b8 --- /dev/null +++ b/tools/ci_build/reduce_op_kernels.py @@ -0,0 +1,264 @@ +# !/usr/bin/env python3 +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import argparse +import op_registration_utils +import os +import re +import shutil +import sys +import typing + +from logger import get_logger + +# add the path to /tools/python so we can import the config parsing and type reduction processing +script_path = os.path.dirname(os.path.realpath(__file__)) +ort_root = os.path.abspath(os.path.join(script_path, '..', '..', )) +ort_tools_py_path = os.path.abspath(os.path.join(ort_root, 'tools', 'python')) +sys.path.append(ort_tools_py_path) + +from util import parse_config # noqa +from util.ort_format_model.operator_type_usage_processors import OperatorTypeUsageManager # noqa + +log = get_logger("reduce_op_kernels") + + +# valid C++ scalar types that can be specified as globally allowed types +_valid_allowed_types = { + "bool", + "uint8_t", "uint16_t", "uint32_t", "uint64_t", + "int8_t", "int16_t", "int32_t", "int64_t", + "MLFloat16", "BFloat16", # in onnxruntime namespace + "float", "double", + "string", # in std namespace +} + + +def _validated_globally_allowed_types(globally_allowed_types: typing.Collection[str]) -> typing.Set[str]: + '''Return a valid set of globally allowed types.''' + # ensure globally_allowed_types is a set + if not isinstance(globally_allowed_types, set): + globally_allowed_types = set(globally_allowed_types) + + if not globally_allowed_types <= _valid_allowed_types: + raise ValueError( + "Globally allowed types must be a subset of valid allowed types. Actual: {}, valid: {}".format( + globally_allowed_types, sorted(_valid_allowed_types))) + + return globally_allowed_types + + +def _type_re_from_globally_allowed_types(globally_allowed_types: typing.Set[str]) -> typing.re.Pattern: + '''Return a regular expression to match type registration strings to a set of globally allowed types.''' + # to keep a registration, the type should match patterns like: + # 1. T0 + # 2. T0_T1_T2 + # where Ti is a member of globally_allowed_types and multiple Ti's are delimited by "_" + # this covers both the common case (1) and special cases like OneHot registration (2) + allowed_type_subpattern = \ + "(?:" + "|".join(re.escape(allowed_type) for allowed_type in sorted(globally_allowed_types)) + ")" + return re.compile("^{0}(?:_{0})*$".format(allowed_type_subpattern)) + + +class _ExcludingRegistrationProcessor(op_registration_utils.RegistrationProcessor): + '''Registration processor that excludes registrations and writes the result to an output file.''' + def __init__(self, required_ops: dict, op_type_usage_manager: typing.Optional[OperatorTypeUsageManager], + globally_allowed_types: typing.Optional[typing.Set[str]], output_file: str): + self._required_ops = required_ops + + if op_type_usage_manager is not None and globally_allowed_types is not None: + raise ValueError("At most one of op_type_usage_manager and globally_allowed_types may be provided.") + + self._op_type_usage_manager = op_type_usage_manager + + self._enable_all_ops = globally_allowed_types is not None and not required_ops + if self._enable_all_ops: + log.info("No required ops were specified but globally allowed types were specified. " + "Globally allowed types will be used to exclude op implementations.") + + self._globally_allowed_types_re = \ + _type_re_from_globally_allowed_types(globally_allowed_types) \ + if globally_allowed_types is not None else None + + self._output_file = output_file + + def _is_op_required(self, domain: str, operator: str, + start_version: int, end_version: typing.Optional[int]) -> typing.Tuple[bool, str]: + '''See if an op should be excluded because it is not required.''' + if self._enable_all_ops: + return True + + if domain not in self._required_ops: + return False + + for opset in self._required_ops[domain]: + if opset >= start_version and (end_version is None or opset <= end_version): + if operator in self._required_ops[domain][opset]: + return True + + return False + + def process_registration(self, lines: typing.List[str], constant_for_domain: str, operator: str, + start_version: int, end_version: typing.Optional[int] = None, + type: typing.Optional[str] = None): + registration_identifier = '{}:{}({}){}'.format(constant_for_domain, operator, start_version, + '<{}>'.format(type) if type else '') + + # convert from the ORT constant name to the domain string used in the config + domain = op_registration_utils.map_ort_constant_to_domain(constant_for_domain) + + exclude = False + reason = "" + + if domain is not None: + if not self._is_op_required(domain, operator, start_version, end_version): + exclude = True + reason = "Entire op is not required." + + if not exclude and type is not None: + if self._op_type_usage_manager is not None: + if not self._op_type_usage_manager.is_typed_registration_needed(domain, operator, type): + exclude = True + reason = "Specific typed registration is not required." + + elif self._globally_allowed_types_re is not None: + if not self._globally_allowed_types_re.match(type): + exclude = True + reason = "Specific typed registration does not contain globally allowed types." + + else: + log.warning('Keeping {} registration from unknown domain: {}' + .format(registration_identifier, constant_for_domain)) + + if exclude: + log.info('Disabling {} registration: {}'.format(registration_identifier, reason)) + for line in lines: + self._output_file.write('// ' + line) + + # edge case of last entry in table where we still need the terminating }; to not be commented out + if lines[-1].rstrip().endswith('};'): + self._output_file.write('};\n') + else: + for line in lines: + self._output_file.write(line) + + def process_other_line(self, line): + self._output_file.write(line) + + def ok(self): + return True + + +def _process_provider_registrations( + ort_root: str, use_cuda: bool, + required_ops: dict, + op_type_usage_manager: typing.Optional[OperatorTypeUsageManager], + globally_allowed_types: typing.Optional[typing.Set[str]]): + '''Rewrite provider registration files.''' + kernel_registration_files = op_registration_utils.get_kernel_registration_files(ort_root, use_cuda) + + for kernel_registration_file in kernel_registration_files: + if not os.path.isfile(kernel_registration_file): + raise ValueError('Kernel registration file {} does not exist'.format(kernel_registration_file)) + + log.info("Processing {}".format(kernel_registration_file)) + + backup_path = kernel_registration_file + '~' + shutil.move(kernel_registration_file, backup_path) + + # read from backup and overwrite original with commented out lines for any kernels that are not required + with open(kernel_registration_file, 'w') as file_to_write: + processor = _ExcludingRegistrationProcessor( + required_ops, op_type_usage_manager, globally_allowed_types, file_to_write) + + op_registration_utils.process_kernel_registration_file(backup_path, processor) + + if not processor.ok(): + # error should have already been logged so just exit + sys.exit(-1) + + +def _insert_type_control_cpp_code(ort_root: str, cpp_lines: typing.Sequence[str]): + ''' + Insert the C++ code to specify operator type requirements. + :param ort_root: Root of the ONNX Runtime repository + :param cpp_lines: The C++ code to insert + ''' + if not cpp_lines: + return + + target = os.path.join(ort_root, 'onnxruntime', 'core', 'providers', 'op_kernel_type_control_overrides.inc') + if not os.path.exists(target) or not os.path.isfile(target): + log.warning('Could not find {}. Skipping generation of C++ code to reduce the types supported by operators.' + .format(target)) + return + + # copy existing content to use as input + src = target + '.tmp' + shutil.copyfile(target, src) + + # find the insertion block and replace any existing content in it + inserted = False + with open(src, 'r') as input, open(target, 'w') as output: + inside_insertion_block = False + for line in input.readlines(): + if '@@insertion_point_begin(allowed_types)@@' in line: + inside_insertion_block = True + output.write(line) + [output.write('{}\n'.format(code_line)) for code_line in cpp_lines] + inserted = True + continue + elif inside_insertion_block: + if '@@insertion_point_end(allowed_types)@@' in line: + inside_insertion_block = False + else: + # we ignore any old lines within the insertion block + continue + + output.write(line) + + os.remove(src) + + if not inserted: + raise RuntimeError('Insertion point was not found in {}'.format(target)) + + +def reduce_ops(config_path: str, enable_type_reduction: bool = False, use_cuda: bool = True): + ''' + Reduce op kernel implementations. + :param config_path: Path to configuration file that specifies the ops to include + :param enable_type_reduction: Whether per operator type reduction is enabled + :param use_cuda: Whether to reduce op kernels for the CUDA provider + ''' + required_ops, op_type_usage_manager, globally_allowed_types = parse_config(config_path, enable_type_reduction) + + if globally_allowed_types is not None: + globally_allowed_types = _validated_globally_allowed_types(globally_allowed_types) + + _process_provider_registrations(ort_root, use_cuda, required_ops, op_type_usage_manager, globally_allowed_types) + + if op_type_usage_manager is not None: + type_control_cpp_code = op_type_usage_manager.get_cpp_entries() + elif globally_allowed_types is not None: + type_control_cpp_code = ["ORT_SPECIFY_OP_KERNEL_GLOBAL_ALLOWED_TYPES({});".format( + ", ".join(sorted(globally_allowed_types)))] + else: + type_control_cpp_code = [] + + _insert_type_control_cpp_code(ort_root, type_control_cpp_code) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Reduces operator kernel implementations in ONNX Runtime. " + "Entire op implementations or op implementations for specific types may be pruned.") + + parser.add_argument("config_path", type=str, + help="Path to configuration file. " + "Create with /tools/python/create_reduced_build_config.py and edit if needed. " + "See /docs/ONNX_Runtime_Format_Model_Usage.md for more information.") + + args = parser.parse_args() + config_path = os.path.abspath(args.config_path) + reduce_ops(config_path, enable_type_reduction=True, use_cuda=True) diff --git a/tools/python/create_reduced_build_config.py b/tools/python/create_reduced_build_config.py index bb2708ddbc..26caf694ef 100644 --- a/tools/python/create_reduced_build_config.py +++ b/tools/python/create_reduced_build_config.py @@ -136,7 +136,7 @@ def main(): # Debug code to validate that the config parsing matches # from util import parse_config - # required_ops, op_type_usage_processor = parse_config(args.config_path) + # required_ops, op_type_usage_processor, _ = parse_config(args.config_path, True) # op_type_usage_processor.debug_dump() diff --git a/tools/python/util/reduced_build_config_parser.py b/tools/python/util/reduced_build_config_parser.py index 5a71b58333..f49ae637b2 100644 --- a/tools/python/util/reduced_build_config_parser.py +++ b/tools/python/util/reduced_build_config_parser.py @@ -14,8 +14,14 @@ except ImportError: def parse_config(config_file: str, enable_type_reduction: bool = False): ''' - Parse the configuration file and return the required operators dictionary, and an OperatorTypeUsageManager. - The basic configuration file format is `domain;opset;op1,op2...` + Parse the configuration file and return the required operators dictionary, and possibly either an + OperatorTypeUsageManager or a globally allowed types list. + + Configuration file lines can do the following: + 1. specify required operators + 2. specify globally allowed types for all operators + + The basic format for specifying required operators (1) is `domain;opset;op1,op2...` e.g. `ai.onnx;11;Add,Cast,Clip,... If the configuration file is generated from ORT format models it may optionally contain JSON for per-operator @@ -38,16 +44,27 @@ def parse_config(config_file: str, enable_type_reduction: bool = False): ai.onnx.OneHot is an example of this, where 3 type names from the inputs are combined into a string. `{"custom": ["float_int64_t_int64_t", "int64_t_string_int64_t"]}` + The format for specifying globally allowed types for all operators (2) is `!globally_allowed_types;T0,T1,...` + Ti should be a C++ scalar type supported by ONNX and ORT. + At most one globally allowed types specification is allowed. + + Specifying per-operator type information and specifying globally allowed types are mutually exclusive - it is an + error to specify both. + :param config_file: Configuration file to parse :param enable_type_reduction: Set to True to use the type information in the config. If False the type information will be ignored. - If the flatbuffers module is unavailable any type information will be ignored - as the usage of the type information is via OperatorTypeUsageManager which has a - dependency on the ORT flatbuffers python schema. - :return: required_ops, op_type_usage_manager: + If the flatbuffers module is unavailable op-specific type information will be ignored + as the per-op usage of the type information is via OperatorTypeUsageManager which has + a dependency on the ORT flatbuffers python schema. + :return: required_ops, op_type_usage_manager, globally_allowed_types: Dictionary of domain:opset:[ops] for required operators OperatorTypeUsageManager manager with operator specific type usage information if available. None if - type reduction was disabled, or the flatbuffers module is not available. + type reduction was disabled, per-op type reduction was not specified, or the flatbuffers module is not + available. + List of globally allowed types. None if type reduction was disabled, or globally allowed types were not + specified. + At most one of the op_type_usage_manager and globally_allowed_types tuple elements will not be None. ''' if not os.path.isfile(config_file): @@ -55,18 +72,29 @@ def parse_config(config_file: str, enable_type_reduction: bool = False): required_ops = {} op_type_usage_manager = OperatorTypeUsageManager() if enable_type_reduction and have_flatbuffers else None + has_op_type_reduction_info = False + globally_allowed_types = None with open(config_file, 'r') as config: for line in [orig_line.strip() for orig_line in config.readlines()]: if not line or line.startswith("#"): # skip empty lines and comments continue + if line.startswith("!globally_allowed_types;"): # handle globally allowed types + if enable_type_reduction: + if globally_allowed_types is not None: + raise RuntimeError("Globally allowed types were already specified.") + globally_allowed_types = [segment.strip() for segment in line.split(';')[1].split(',')] + continue + domain, opset_str, operators_str = [segment.strip() for segment in line.split(';')] opset = int(opset_str) # any type reduction information is serialized json that starts/ends with { and }. # type info is optional for each operator. if '{' in operators_str: + has_op_type_reduction_info = True + # parse the entries in the json dictionary with type info operators = set() cur = 0 @@ -123,4 +151,11 @@ def parse_config(config_file: str, enable_type_reduction: bool = False): else: required_ops[domain][opset].update(operators) - return required_ops, op_type_usage_manager + if enable_type_reduction: + if not has_op_type_reduction_info: + op_type_usage_manager = None + if globally_allowed_types is not None and op_type_usage_manager is not None: + raise RuntimeError( + "Specifying globally allowed types and per-op type reduction info together is unsupported.") + + return required_ops, op_type_usage_manager, globally_allowed_types From f5313cc4ce0e4785aae2339433125748d7c69528 Mon Sep 17 00:00:00 2001 From: Guoyu Wang <62914304+gwang-msft@users.noreply.github.com> Date: Mon, 22 Feb 2021 18:55:27 -0800 Subject: [PATCH 15/37] [CoreML EP] Add options to enable CoreML EP only on hardware with Apple Neural Engine (#6765) --- .../coreml/coreml_provider_factory.h | 7 +++- .../core/providers/coreml/builders/helper.cc | 42 +++++++++++++++++++ .../core/providers/coreml/builders/helper.h | 4 ++ .../coreml/coreml_execution_provider.cc | 7 ++++ 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/include/onnxruntime/core/providers/coreml/coreml_provider_factory.h b/include/onnxruntime/core/providers/coreml/coreml_provider_factory.h index 451e622473..65ab32a10d 100644 --- a/include/onnxruntime/core/providers/coreml/coreml_provider_factory.h +++ b/include/onnxruntime/core/providers/coreml/coreml_provider_factory.h @@ -19,9 +19,14 @@ enum COREMLFlags { // Enable CoreML EP on subgraph COREML_FLAG_ENABLE_ON_SUBGRAPH = 0x002, + // By default CoreML Execution provider will be enabled for all compatible Apple devices + // Enable this option will only enable CoreML EP for Apple devices with ANE (Apple Neural Engine) + // Please note, enable this option does not guarantee the entire model to be executed using ANE only + COREML_FLAG_ONLY_ENABLE_DEVICE_WITH_ANE = 0x004, + // Keep COREML_FLAG_MAX at the end of the enum definition // And assign the last COREMLFlag to it - COREML_FLAG_LAST = COREML_FLAG_ENABLE_ON_SUBGRAPH, + COREML_FLAG_LAST = COREML_FLAG_ONLY_ENABLE_DEVICE_WITH_ANE, }; #ifdef __cplusplus diff --git a/onnxruntime/core/providers/coreml/builders/helper.cc b/onnxruntime/core/providers/coreml/builders/helper.cc index 24f9ba3be9..e94a94c53a 100644 --- a/onnxruntime/core/providers/coreml/builders/helper.cc +++ b/onnxruntime/core/providers/coreml/builders/helper.cc @@ -3,6 +3,11 @@ #include +#ifdef __APPLE__ +#include +#include +#endif + #include "helper.h" #include @@ -122,5 +127,42 @@ std::vector> GetSupportedNodes(const GraphViewer& graph_v return supported_node_vecs; } +bool HasNeuralEngine(const logging::Logger& logger) { + bool has_neural_engine = false; + +#ifdef __APPLE__ + struct utsname system_info; + uname(&system_info); + LOGS(logger, VERBOSE) << "Current Apple hardware info: " << system_info.machine; + +#if TARGET_OS_IPHONE + // utsname.machine has device identifier. For example, identifier for iPhone Xs is "iPhone11,2". + // Since Neural Engine is only available for use on A12 and later, major device version in the + // identifier is checked for these models: + // A12: iPhone XS (11,2), iPad Mini - 5th Gen (11,1) + // A12X: iPad Pro - 3rd Gen (8,1) + // For more information, see https://www.theiphonewiki.com/wiki/Models + size_t str_len = strlen(system_info.machine); + if (str_len > 4 && strncmp("iPad", system_info.machine, 4) == 0) { + const int major_version = atoi(system_info.machine + 4); + has_neural_engine = major_version >= 8; // There are no device between iPad 8 and 11. + } else if (str_len > 6 && strncmp("iPhone", system_info.machine, 6) == 0) { + const int major_version = atoi(system_info.machine + 6); + has_neural_engine = major_version >= 11; + } +#elif TARGET_OS_OSX && TARGET_CPU_ARM64 + // Only Mac with arm64 CPU (Apple Silicon) has ANE. + has_neural_engine = true; +#endif // #if TARGET_OS_IPHONE +#else + // In this case, we are running the EP on non-apple platform, which means we are running the model + // conversion with CoreML EP enabled, for this we always assume the target system has Neural Engine + LOGS(logger, VERBOSE) << "HasNeuralEngine running on non-Apple hardware for model conversion only"; + has_neural_engine = true; +#endif // #ifdef __APPLE__ + + return has_neural_engine; +} + } // namespace coreml } // namespace onnxruntime \ No newline at end of file diff --git a/onnxruntime/core/providers/coreml/builders/helper.h b/onnxruntime/core/providers/coreml/builders/helper.h index 6ed0f60ba1..4d2c01b8e6 100644 --- a/onnxruntime/core/providers/coreml/builders/helper.h +++ b/onnxruntime/core/providers/coreml/builders/helper.h @@ -28,5 +28,9 @@ bool IsInputSupported(const NodeArg& node_arg, const std::string& parent_name, c std::vector> GetSupportedNodes(const GraphViewer& graph_viewer, const logging::Logger& logger); +// CoreML is more efficient running using Apple Neural Engine +// This is to detect if the current system has Apple Neural Engine +bool HasNeuralEngine(const logging::Logger& logger); + } // namespace coreml } // namespace onnxruntime diff --git a/onnxruntime/core/providers/coreml/coreml_execution_provider.cc b/onnxruntime/core/providers/coreml/coreml_execution_provider.cc index 0cd2a114ce..a038f10d81 100644 --- a/onnxruntime/core/providers/coreml/coreml_execution_provider.cc +++ b/onnxruntime/core/providers/coreml/coreml_execution_provider.cc @@ -67,6 +67,13 @@ CoreMLExecutionProvider::GetCapability(const onnxruntime::GraphViewer& graph_vie */ const auto& logger = *GetLogger(); + + bool has_neural_engine = coreml::HasNeuralEngine(logger); + if ((coreml_flags_ & COREML_FLAG_ONLY_ENABLE_DEVICE_WITH_ANE) && !has_neural_engine) { + LOGS(logger, VERBOSE) << "The current system does not have Apple Neural Engine"; + return result; + } + const auto node_groups = coreml::GetSupportedNodes(graph_viewer, logger); if (node_groups.empty()) { From 8a6f6bc38b17febb15d375fc7de22a4f3e798843 Mon Sep 17 00:00:00 2001 From: Tianlei Wu Date: Mon, 22 Feb 2021 22:00:21 -0800 Subject: [PATCH 16/37] add --enable_cuda_line_info to build.py (#6773) --- tools/ci_build/build.py | 3 +++ 1 file changed, 3 insertions(+) mode change 100755 => 100644 tools/ci_build/build.py diff --git a/tools/ci_build/build.py b/tools/ci_build/build.py old mode 100755 new mode 100644 index 521e83c00b..45e1ddef73 --- a/tools/ci_build/build.py +++ b/tools/ci_build/build.py @@ -201,6 +201,8 @@ def parse_arguments(): "--cudnn_home", help="Path to CUDNN home. " "Read from CUDNN_HOME environment variable if --use_cuda is true and " "--cudnn_home is not specified.") + parser.add_argument( + "--enable_cuda_line_info", action='store_true', help="Enable CUDA line info.") # Python bindings parser.add_argument( @@ -715,6 +717,7 @@ def generate_build_tree(cmake_path, source_dir, build_dir, cuda_home, cudnn_home "-DOnnxruntime_GCOV_COVERAGE=" + ("ON" if args.code_coverage else "OFF"), "-Donnxruntime_USE_MPI=" + ("ON" if args.use_mpi else "OFF"), "-Donnxruntime_ENABLE_MEMORY_PROFILE=" + ("ON" if args.enable_memory_profile else "OFF"), + "-Donnxruntime_ENABLE_CUDA_LINE_NUMBER_INFO=" + ("ON" if args.enable_cuda_line_info else "OFF"), ] if acl_home and os.path.exists(acl_home): From 8703e2c778e3fbd3abf7b25e07d57fc5b5a692a1 Mon Sep 17 00:00:00 2001 From: Tianlei Wu Date: Mon, 22 Feb 2021 22:00:59 -0800 Subject: [PATCH 17/37] update benchmark_longformer for default test suite (#6772) --- .../tools/transformers/benchmark_helper.py | 19 +- .../longformer/benchmark_longformer.py | 323 ++++++++++-------- .../longformer/convert_longformer_to_onnx.py | 2 +- 3 files changed, 193 insertions(+), 151 deletions(-) diff --git a/onnxruntime/python/tools/transformers/benchmark_helper.py b/onnxruntime/python/tools/transformers/benchmark_helper.py index 626e7be65b..7fe05df333 100644 --- a/onnxruntime/python/tools/transformers/benchmark_helper.py +++ b/onnxruntime/python/tools/transformers/benchmark_helper.py @@ -297,10 +297,8 @@ def measure_memory(is_gpu, func): return None monitor = MemoryMonitor(False) - if is_gpu: - print(f"GPU memory usage before testing: {monitor.measure_gpu_usage()}") - else: - print(f"Peak CPU memory usage before testing: {monitor.measure_cpu_usage():.2f} MB") + + memory_before_test = monitor.measure_gpu_usage() if is_gpu else monitor.measure_cpu_usage() from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor() as executor: @@ -312,8 +310,15 @@ def measure_memory(is_gpu, func): finally: monitor.keep_measuring = False max_usage = mem_thread.result() + if is_gpu: - print(f"Peak GPU memory usage: {max_usage}") + print(f"GPU memory usage: before={memory_before_test} peak={max_usage}") + if len(memory_before_test) >= 1 and len(max_usage) >= 1: + before = memory_before_test[0]["max_used_MB"] + after = max_usage[0]["max_used_MB"] + return after - before + else: + return None else: - print(f"Peak CPU memory usage: {max_usage:.2f} MB") - return max_usage + print(f"CPU memory usage: before={memory_before_test:.1f} MB, peak={max_usage:.1f} MB") + return max_usage - memory_before_test diff --git a/onnxruntime/python/tools/transformers/longformer/benchmark_longformer.py b/onnxruntime/python/tools/transformers/longformer/benchmark_longformer.py index 30b13d4e8b..e877e55872 100644 --- a/onnxruntime/python/tools/transformers/longformer/benchmark_longformer.py +++ b/onnxruntime/python/tools/transformers/longformer/benchmark_longformer.py @@ -13,17 +13,20 @@ # cd ../torch_extensions # python setup.py install # cd ../longformer -# python convert_longformer_to_onnx.py --model longformer-base-4096 --precision fp32 --optimize_onnx +# python convert_longformer_to_onnx.py --model longformer-base-4096 --precision fp16 --optimize_onnx +# +# When there is no parameter, all avaiable tests (memory & latency) will run on the longformer-base-4096 pretrained model. +# python benchmark_longformer.py # # Benchmark the latency (Exported onnx model is in the current directory): -# python benchmark_longformer.py --models longformer-base-4096 --batch_sizes 1 --sequence_lengths 512 1024 2048 4096 --global_lengths 8 --onnx_dir . --validate_onnx -t 100 +# python benchmark_longformer.py --model longformer-base-4096 --batch_sizes 1 --sequence_lengths 512 1024 2048 4096 --global_lengths 8 --onnx ./longformer-base-4096_fp16.onnx --validate_onnx -t 100 # # Benchmark GPU peak memory: # export ORT_LONGFORMER_COMPACT_MEMORY=0 -# python benchmark_longformer.py --models longformer-base-4096 --batch_sizes 1 --sequence_lengths 4096 --global_lengths 8 --onnx_dir . --memory -t 10 +# python benchmark_longformer.py --model longformer-base-4096 --batch_sizes 1 --sequence_lengths 4096 --global_lengths 8 --onnx_dir . --memory -t 10 # export ORT_LONGFORMER_COMPACT_MEMORY=1 -# python benchmark_longformer.py --models longformer-base-4096 --batch_sizes 1 --sequence_lengths 4096 --global_lengths 8 --onnx_dir . --memory -t 10 -# By default, compact memory kernel is not enabled since it is slower. You need set an environment variable ORT_LONGFORMER_COMPACT_MEMORY=1 to enable it, which uses less memory in this test. +# python benchmark_longformer.py --model longformer-base-4096 --batch_sizes 1 --sequence_lengths 4096 --global_lengths 8 --onnx_dir . --memory -t 10 +# By default, compact memory kernel is not enabled. You need set an environment variable ORT_LONGFORMER_COMPACT_MEMORY=1 to enable it. import timeit from datetime import datetime @@ -34,7 +37,6 @@ import sys import torch import onnxruntime import numpy as np -import pprint import math from longformer_helper import LongformerHelper, PRETRAINED_LONGFORMER_MODELS @@ -67,12 +69,14 @@ def test_torch_latency(device, model, model_name, batch_sizes, sequence_lengths, "precision": "fp32", "io_binding": "", "model_name": model_name, + "description": model_name + "[torch]", "inputs": 3, "threads": num_threads, "batch_size": batch_size, "sequence_length": sequence_length, "global_length": global_length, "datetime": str(datetime.now()), + "memory": "?", } result.update(benchmark_helper.get_latency_result(runtimes, batch_size)) @@ -96,11 +100,13 @@ def test_parity(device, model, ort_session, batch_size, sequence_length, global_ if verbose and (math.isnan(max_diff) or max_diff > 0.001): print("torch last_state:", torch_outputs[0]) print("ort last_state:", ort_outputs[0]) + return max_diff def test_ort_latency(device, model, model_name, + description, ort_session, batch_sizes, sequence_lengths, @@ -135,6 +141,7 @@ def test_ort_latency(device, result_template = { "model_name": model_name, + "description": description, "inputs": 3, "engine": "OnnxRuntime", "version": onnxruntime.__version__, @@ -147,6 +154,7 @@ def test_ort_latency(device, "global_length": global_length, "test_times": test_times, "datetime": str(datetime.now()), + "memory": "", } if not disable_io_binding: @@ -172,12 +180,12 @@ def test_ort_latency(device, repeat_times=test_times, batch_size=batch_size) - pprint.pprint(result) - results.append(result) - if validate_onnx: - test_parity(device, model, ort_session, batch_size, sequence_length, global_length, verbose) + max_diff = test_parity(device, model, ort_session, batch_size, sequence_length, global_length, + verbose) + result["description"] += f"(max_diff={max_diff})" + results.append(result) return results @@ -198,83 +206,120 @@ def test_ort_memory(device, onnx_model_path, batch_size, sequence_length, global for _ in range(test_times): ort_outputs = session.run(None, ort_inputs) - benchmark_helper.measure_memory(is_gpu=True, func=inference) - print("Memory test is done") + memory_used = benchmark_helper.measure_memory(is_gpu=True, func=inference) + + return { + "onnx_model": onnx_model_path, + "batch_size": batch_size, + "sequence_length": sequence_length, + "global_length": global_length, + "test_times": test_times, + "num_threads": num_threads, + "memory": memory_used + } -def test_all(args): - # Currently, the longformer attention operator could only run in GPU (no CPU implementation yet). - device = torch.device('cuda:0') +def load_torch_model(model_name, device): + torch_model_name_or_dir = PRETRAINED_LONGFORMER_MODELS[ + model_name] if model_name in PRETRAINED_LONGFORMER_MODELS else model_name - results = [] - for model_name in args.models: - # Here we run an example input - from transformers import LongformerModel - torch_model_name_or_dir = PRETRAINED_LONGFORMER_MODELS[model_name] - model = LongformerModel.from_pretrained(torch_model_name_or_dir) # pretrained model name or directory - model.to(device) + from transformers import LongformerModel + model = LongformerModel.from_pretrained(torch_model_name_or_dir) + model.to(device) + return model - # Search onnx model in the following order: optimized fp16 model, optimized fp32 model, raw model - # TODO: call convert_longformer_to_onnx to export onnx instead. - import os.path - optimized = False - precision = 'fp32' - onnx_model_path = os.path.join(args.onnx_dir, model_name + ".onnx") - optimized_fp32_model = os.path.join(args.onnx_dir, model_name + "_fp32.onnx") - optimized_fp16_model = os.path.join(args.onnx_dir, model_name + "_fp16.onnx") - if os.path.isfile(optimized_fp16_model): - onnx_model_path = optimized_fp16_model - optimized = True - precision = 'fp16' - elif os.path.isfile(optimized_fp32_model): - onnx_model_path = optimized_fp32_model - optimized = True - print("ONNX model path:", onnx_model_path) - for num_threads in args.num_threads: - if "torch" in args.engines: - results += test_torch_latency(device, model, model_name, args.batch_sizes, args.sequence_lengths, - args.global_lengths, args.test_times, num_threads, args.verbose) +def find_onnx_model(model_name, onnx_dir='.'): + # Search onnx model in the following order: optimized fp16 model, optimized fp32 model, raw model + # TODO: call convert_longformer_to_onnx to export onnx instead. + import os.path + onnx_model_path = os.path.join(onnx_dir, model_name + ".onnx") + optimized_fp32_model = os.path.join(onnx_dir, model_name + "_fp32.onnx") + optimized_fp16_model = os.path.join(onnx_dir, model_name + "_fp16.onnx") + if os.path.isfile(optimized_fp16_model): + onnx_model_path = optimized_fp16_model + elif os.path.isfile(optimized_fp32_model): + onnx_model_path = optimized_fp32_model + return onnx_model_path - if "onnxruntime" in args.engines: - if args.memory: - test_ort_memory(device, onnx_model_path, args.batch_sizes[0], args.sequence_lengths[0], - args.global_lengths[0], args.test_times, num_threads) - else: # test latency - session = benchmark_helper.create_onnxruntime_session(onnx_model_path, - use_gpu=True, - enable_all_optimization=True, - num_threads=num_threads) - if session is None: - raise RuntimeError(f"Failed to create ORT sesssion from ONNX file {onnx_model_path}") - results += test_ort_latency(device, model, model_name, session, args.batch_sizes, - args.sequence_lengths, args.global_lengths, args.test_times, - num_threads, optimized, precision, args.validate_onnx, - args.disable_io_binding, args.verbose) - return results +def test_memory(args, device): + if len(args.batch_sizes) > 1: + raise RuntimeError("For memory test, only one batch_size (-b) is allowed.") + if len(args.sequence_lengths) > 1: + raise RuntimeError("For memory test, only one sequence_length (-s) is allowed.") + if len(args.global_lengths) > 1: + raise RuntimeError("For memory test, only one global_length (-g) is allowed.") + + model_name = args.model + onnx_model_path = find_onnx_model(model_name) if not args.onnx else args.onnx + + torch.cuda.empty_cache() + return test_ort_memory(device, onnx_model_path, args.batch_sizes[0], args.sequence_lengths[0], + args.global_lengths[0], args.test_times, args.num_threads) + + +def test_ort(args, device): + model_name = args.model + + onnx_model_path = find_onnx_model(model_name) if not args.onnx else args.onnx + + optimized = onnx_model_path.endswith("_fp16.onnx") or onnx_model_path.endswith("_fp32.onnx") + precision = 'fp32' if not onnx_model_path.endswith("_fp16.onnx") else 'fp16' + + model = load_torch_model(model_name, device) + + num_threads = args.num_threads + + session = benchmark_helper.create_onnxruntime_session(onnx_model_path, + use_gpu=True, + enable_all_optimization=True, + num_threads=num_threads) + if session is None: + raise RuntimeError(f"Failed to create ORT sesssion from ONNX file {onnx_model_path}") + + description = onnx_model_path + if (os.environ.get('ORT_LONGFORMER_COMPACT_MEMORY', '0') == "1"): + description += "[compact_memory]" + + return test_ort_latency(device, model, model_name, description, session, args.batch_sizes, args.sequence_lengths, + args.global_lengths, args.test_times, num_threads, optimized, precision, args.validate_onnx, + args.disable_io_binding, args.verbose) + + +def test_torch(args, device): + model = load_torch_model(args.model, device) + return test_torch_latency(device, model, args.model, args.batch_sizes, args.sequence_lengths, args.global_lengths, + args.test_times, args.num_threads, args.verbose) + + +def test_latency(args, device): + if "onnxruntime" == args.engine: + return test_ort(args, device) + elif "torch" == args.engine: + return test_torch(args, device) + + raise RuntimeError("unknown engine " + args.engine) def parse_arguments(argv=None): parser = argparse.ArgumentParser() parser.add_argument("-m", - "--models", + "--model", required=False, - nargs="+", type=str, - default=["longformer-base-4096"], + default="longformer-base-4096", help="Checkpoint directory or pre-trained model names in the list: " + ", ".join(PRETRAINED_LONGFORMER_MODELS.keys())) parser.add_argument("-e", - "--engines", + "--engine", required=False, - nargs="+", type=str, - default=['onnxruntime'], + default='onnxruntime', choices=['onnxruntime', 'torch'], - help="Engines to benchmark. For large model, recommend to test only one engine at a time.") + help="Engine to benchmark.") parser.add_argument("-t", "--test_times", @@ -297,11 +342,7 @@ def parse_arguments(argv=None): "Sequence lengths. It could have multiple values in latency test. If --export_padding is not used in exporting onnx model, sequence length shall be multiple of window size." ) - parser.add_argument("--onnx_dir", - required=False, - type=str, - default=os.path.join('.', 'onnx_models'), - help="Directory to search onnx models.") + parser.add_argument("--onnx", required=False, type=str, default=None, help="Onnx model path") parser.add_argument("-g", "--global_lengths", @@ -310,13 +351,7 @@ def parse_arguments(argv=None): default=[0], help="Number of global tokens. It could have multiple values in latency test.") - parser.add_argument("-n", - "--num_threads", - required=False, - nargs="+", - type=int, - default=[0], - help="Threads to use. It could have multiple values in latency test.") + parser.add_argument("-n", "--num_threads", required=False, type=int, default=0, help="Threads to use.") parser.add_argument("-v", "--validate_onnx", @@ -331,78 +366,35 @@ def parse_arguments(argv=None): parser.add_argument("--verbose", required=False, action="store_true", help="Print more information.") args = parser.parse_args(argv) + return args -def output_summary(results, csv_filename, args): - with open(csv_filename, mode="a", newline='') as csv_file: - header_names = [ - "model_name", "inputs", "engine", "version", "device", "precision", "optimizer", "io_binding", "threads" - ] - data_names = [] - for batch_size in args.batch_sizes: - for sequence_length in args.sequence_lengths: - for global_length in args.global_lengths: - data_names.append(f"b{batch_size}_s{sequence_length}_g{global_length}") - - csv_writer = csv.DictWriter(csv_file, fieldnames=header_names + data_names) - csv_writer.writeheader() - for model in args.models: - for input_count in [1, 2, 3]: - for engine_name in args.engines: - for io_binding in [True, False, ""]: - for threads in args.num_threads: - row = {} - for result in results: - if result["model_name"] == model and result["inputs"] == input_count and \ - result["engine"] == engine_name and result["io_binding"] == io_binding and \ - result["threads"] == threads: - headers = {k: v for k, v in result.items() if k in header_names} - if not row: - row.update(headers) - row.update({k: "" for k in data_names}) - else: - for k in header_names: - assert row[k] == headers[k] - b = result["batch_size"] - s = result["sequence_length"] - g = result["global_length"] - row[f"b{b}_s{s}_g{g}"] = result["average_latency_ms"] - if row: - csv_writer.writerow(row) - - print(f"Summary results are saved to csv file: {csv_filename}") - - def output_details(results, csv_filename): + latency_results = [result for result in results if 'average_latency_ms' in result] + if len(latency_results) == 0: + print("No latency results for output.") + return + with open(csv_filename, mode="a", newline='') as csv_file: column_names = [ "engine", "version", "device", "precision", "optimizer", "io_binding", "model_name", "inputs", "threads", - "batch_size", "sequence_length", "global_length", "datetime", "test_times", "QPS", "average_latency_ms", - "latency_variance", "latency_90_percentile", "latency_95_percentile", "latency_99_percentile" + "datetime", "test_times", "description", "batch_size", "sequence_length", "global_length", "memory", "QPS", + "average_latency_ms", "latency_variance", "latency_90_percentile", "latency_95_percentile", + "latency_99_percentile" ] csv_writer = csv.DictWriter(csv_file, fieldnames=column_names) csv_writer.writeheader() - for result in results: + for result in latency_results: + print( + f"b={result['batch_size']}, s={result['sequence_length']}, g={result['global_length']}, latency={result['average_latency_ms']}ms, memory={result['memory']}MB {result['description']}" + ) csv_writer.writerow(result) - print(f"Detail results are saved to csv file: {csv_filename}") -def main(args): - assert len(args.models) == 1, "run only one model at a time" - - if args.memory: - if len(args.batch_sizes) > 1: - raise RuntimeError("For memory test, only one batch_size (-b) is allowed.") - if len(args.sequence_lengths) > 1: - raise RuntimeError("For memory test, only one sequence_length (-s) is allowed.") - if len(args.global_lengths) > 1: - raise RuntimeError("For memory test, only one global_length (-g) is allowed.") - if len(args.num_threads) > 1: - raise RuntimeError("For memory test, only one value of --num_threads is allowed.") - +def run(args): if not torch.cuda.is_available(): raise RuntimeError("Please install PyTorch with Cuda, and use a machine with GPU for testing gpu performance.") @@ -411,18 +403,63 @@ def main(args): # set random seed manully to get deterministic results #benchmark_helper.set_random_seed(123) - all_results = test_all(args) + # Currently, the longformer attention operator could only run in GPU (no CPU implementation yet). + device = torch.device('cuda:0') - time_stamp = datetime.now().strftime("%Y%m%d-%H%M%S") - csv_filename = f"benchmark_detail_{time_stamp}.csv" - output_details(all_results, csv_filename) + if args.memory: + return test_memory(args, device) + else: + return test_latency(args, device) - csv_filename = f"benchmark_summary_{time_stamp}.csv" - output_summary(all_results, csv_filename, args) + +def test_all(): + results = [] + test_times = 100 + sequence_lengths = [512, 1024, 2048, 4096] + for model_name in ['longformer-base-4096']: + for batch_size in [1]: + for sequence_length in sequence_lengths: + for global_length in [8]: + engine_name = 'torch' + args = parse_arguments( + f"-e {engine_name} -t {test_times} -b {batch_size} -s {sequence_length} -g {global_length} -t {test_times} -m {model_name}" + .split(' ')) + results += run(args) + + engine_name = 'onnxruntime' + onnx_paths = [f"{model_name}_fp32.onnx", f"{model_name}_fp16.onnx"] # optimized models + for onnx_path in onnx_paths: + if os.path.exists(onnx_path): + for compact_memory in ["0", "1"]: + os.environ["ORT_LONGFORMER_COMPACT_MEMORY"] = compact_memory + print("ORT_LONGFORMER_COMPACT_MEMORY=", compact_memory) + + args = parse_arguments( + f"--disable_io_binding -e {engine_name} --onnx {onnx_path} -t {test_times} -b {batch_size} -s {sequence_length} -g {global_length} -t 10 -m {model_name} --memory" + .split(' ')) + memory_results = run(args) + print(memory_results) + + args = parse_arguments( + f"--disable_io_binding -e {engine_name} --onnx {onnx_path} -t {test_times} -b {batch_size} -s {sequence_length} -g {global_length} -t {test_times} -m {model_name} --validate_onnx" + .split(' ')) + latency_results = run(args) + if len(latency_results) == 1: + latency_results[0]["memory"] = memory_results["memory"] + + print(latency_results) + + results += latency_results + return results if __name__ == "__main__": - args = parse_arguments() - #args = parse_arguments("-e onnxruntime -t 1 -b 1 -s 4 -g 2 --onnx_dir . -t 1 -m longformer-random-tiny".split(' ')) + if len(sys.argv) > 1: + args = parse_arguments() + results = run(args) + else: + results = test_all() - main(args) + time_stamp = datetime.now().strftime("%Y%m%d-%H%M%S") + csv_filename = f"benchmark_detail_{time_stamp}.csv" + output_details(results, csv_filename) diff --git a/onnxruntime/python/tools/transformers/longformer/convert_longformer_to_onnx.py b/onnxruntime/python/tools/transformers/longformer/convert_longformer_to_onnx.py index b827d05c3a..6eab8e4f21 100644 --- a/onnxruntime/python/tools/transformers/longformer/convert_longformer_to_onnx.py +++ b/onnxruntime/python/tools/transformers/longformer/convert_longformer_to_onnx.py @@ -22,7 +22,7 @@ import transformers from torch.onnx import register_custom_op_symbolic from torch.onnx.symbolic_helper import parse_args from packaging import version - +from pathlib import Path from longformer_helper import LongformerHelper, PRETRAINED_LONGFORMER_MODELS From 5db0c9c64886d2a4372221f848f86be536793074 Mon Sep 17 00:00:00 2001 From: Edward Chen <18449977+edgchen1@users.noreply.github.com> Date: Tue, 23 Feb 2021 10:24:12 -0800 Subject: [PATCH 18/37] Enable CI to cover globally allowed types (#6778) Add test to CI build to cover type reduction with globally allowed types. --- .../linux-cpu-minimal-build-ci-pipeline.yml | 28 +++++++++++++++++++ .../build_minimal_ort_and_run_tests.sh | 17 +++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/tools/ci_build/github/azure-pipelines/linux-cpu-minimal-build-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/linux-cpu-minimal-build-ci-pipeline.yml index 606e62fad9..4e68c051b6 100644 --- a/tools/ci_build/github/azure-pipelines/linux-cpu-minimal-build-ci-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/linux-cpu-minimal-build-ci-pipeline.yml @@ -8,6 +8,9 @@ # test the ort format models generated in step 1. # Exceptions are enabled in this step to help debugging in case of CI failure. # This step builds and tests ORT with and without type reduction enabled. +# 3.1. Build minimal ORT with type reduction from a globally allowed types list. +# This step uses a hard-coded list of types which may not include the types needed by the models +# in /onnxruntime/test/testdata/, so the tests for those models are skipped. # 4. Build baseline minimal ORT for Android arm64-v8a including no kernels and disable exceptions # This step is to report the baseline binary size for Android jobs: @@ -123,6 +126,31 @@ jobs: displayName: Discard local changes to Git repository files workingDirectory: $(Build.SourcesDirectory) + - task: CmdLine@2 + displayName: Build minimal onnxruntime [exceptions ENABLED, type reduction ENABLED (globally allowed types)] and run tests + inputs: + script: | + echo "!globally_allowed_types;bool,float,int8_t,uint8_t" \ + > $(test_data_directory)/globally_allowed_types.config && \ + docker run --rm \ + --volume $(Build.SourcesDirectory):/onnxruntime_src \ + --volume $(Build.BinariesDirectory):/build \ + --volume $(test_data_directory):/home/onnxruntimedev/.test_data \ + -e ALLOW_RELEASED_ONNX_OPSET_ONLY=1 \ + -e NIGHTLY_BUILD \ + -e BUILD_BUILDNUMBER \ + onnxruntimecentoscpubuild \ + /bin/bash /onnxruntime_src/tools/ci_build/github/linux/ort_minimal/build_minimal_ort_and_run_tests.sh \ + --build-directory /build/with_type_reduction_globally_allowed_types \ + --reduced-ops-config /home/onnxruntimedev/.test_data/globally_allowed_types.config \ + --enable-type-reduction \ + --skip-model-tests + workingDirectory: $(Build.SourcesDirectory) + + - script: git checkout -- . + displayName: Discard local changes to Git repository files + workingDirectory: $(Build.SourcesDirectory) + - task: CmdLine@2 displayName: Build onnxruntime minimal baseline for Android arm64-v8a and report binary size inputs: diff --git a/tools/ci_build/github/linux/ort_minimal/build_minimal_ort_and_run_tests.sh b/tools/ci_build/github/linux/ort_minimal/build_minimal_ort_and_run_tests.sh index 7378c39003..11c72752a8 100644 --- a/tools/ci_build/github/linux/ort_minimal/build_minimal_ort_and_run_tests.sh +++ b/tools/ci_build/github/linux/ort_minimal/build_minimal_ort_and_run_tests.sh @@ -14,12 +14,17 @@ USAGE_TEXT="Usage: -c|--reduced-ops-config Specifies the reduced Ops configuration file path. Required. [--enable-type-reduction] - Builds with type reduction enabled." + Builds with type reduction enabled. + [--enable-custom-ops] + Builds with custom op support enabled. + [--skip-model-tests] + Does not run the E2E model tests." BUILD_DIR= REDUCED_OPS_CONFIG_FILE= ENABLE_TYPE_REDUCTION= MINIMAL_BUILD_ARGS= +SKIP_MODEL_TESTS= while [[ $# -gt 0 ]] do @@ -43,6 +48,10 @@ do MINIMAL_BUILD_ARGS="custom_ops" shift ;; + --skip-model-tests) + SKIP_MODEL_TESTS=1 + shift + ;; *) echo "Invalid option: $1" echo "$USAGE_TEXT" @@ -69,8 +78,10 @@ python3 /onnxruntime_src/tools/ci_build/build.py \ --include_ops_by_config ${REDUCED_OPS_CONFIG_FILE} \ ${ENABLE_TYPE_REDUCTION:+"--enable_reduced_operator_type_support"} -# Run the e2e test cases -${BUILD_DIR}/Debug/onnx_test_runner /onnxruntime_src/onnxruntime/test/testdata/ort_minimal_e2e_test_data +if [[ -z "${SKIP_MODEL_TESTS}" ]]; then + # Run the e2e model test cases + ${BUILD_DIR}/Debug/onnx_test_runner /onnxruntime_src/onnxruntime/test/testdata/ort_minimal_e2e_test_data +fi # Print binary size info python3 /onnxruntime_src/tools/ci_build/github/linux/ort_minimal/check_build_binary_size.py \ From 09a5d6a9dcfc3030ee7f526e826d968823373af8 Mon Sep 17 00:00:00 2001 From: Edward Chen <18449977+edgchen1@users.noreply.github.com> Date: Tue, 23 Feb 2021 10:25:23 -0800 Subject: [PATCH 19/37] Update docs/ONNX_Runtime_for_Mobile_Platforms.md with info about op type reduction. (#6747) --- docs/ONNX_Runtime_for_Mobile_Platforms.md | 44 +++++++++++++++-------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/docs/ONNX_Runtime_for_Mobile_Platforms.md b/docs/ONNX_Runtime_for_Mobile_Platforms.md index baad4d75d7..b2ba390bcf 100644 --- a/docs/ONNX_Runtime_for_Mobile_Platforms.md +++ b/docs/ONNX_Runtime_for_Mobile_Platforms.md @@ -2,16 +2,16 @@ ## Overview -Steps to build the reduced binary size. +Steps to build for mobile platforms. ONNX Runtime now supports an internal model format to minimize the build size for usage in mobile and embedded scenarios. An ONNX model can be converted to an internal ONNX Runtime format ('ORT format model') using the below instructions. -The minimal build can be used with any ORT format model, provided that the kernels for the operators used in the model were included in the build. - i.e. the custom build provides a set of kernels, and if that set satisfies a given ORT format model's needs, the model can be loaded and executed. +A minimal build can be used with any ORT format model, provided that the kernels for the operators used in the model were included in the build. +I.e., the custom build provides a set of kernels, and if that set satisfies a given ORT format model's needs, the model can be loaded and executed. ## Steps to create model and minimal build -You will need a script from the the ONNX Runtime repository, and to also perform a custom build, so you will need to clone the repository locally. See [here](https://www.onnxruntime.ai/docs/how-to/build.html#prerequisites) for initial steps. +You will need a script from the ONNX Runtime repository and to also perform a custom build, so you will need to clone the repository locally. See [here](https://www.onnxruntime.ai/docs/how-to/build.html#prerequisites) for initial steps. The directory the ONNX Runtime repository was cloned into is referred to as `` in this documentation. @@ -20,21 +20,36 @@ Once you have cloned the repository, perform the following steps to create a min ### 1. Create ORT format model and configuration file with required operators We will use a helper python script to convert ONNX format models into ORT format models, and to create the configuration file for use with the minimal build. -This will require the standard ONNX Runtime python package to be installed. - - Install the ONNX Runtime python package from https://pypi.org/project/onnxruntime/. Version 1.5.2 or later is required. - - `pip install onnxruntime` - - ensure that any existing ONNX Runtime python package was uninstalled first, or use `-U` with the above command to upgrade an existing package - - Copy all the ONNX models you wish to convert and use with the minimal build into a directory - - Convert the ONNX models to ORT format - - `python /tools/python/convert_onnx_models_to_ort.py ` - - For each ONNX model an ORT format model will be created with '.ort' as the file extension. - - A `required_operators.config` configuration file will also be created. + +The configuration file specifies what operator kernels to include in the build. +This allows unused operator kernels to be pruned in order to decrease the binary size. + +It is also possible (and optional) to further prune the operator kernel implementations based on their input and output type usage detected in the ORT format models. +This pruning is referred to as "operator type reduction" in this documentation. + +- The helper python script requires the standard ONNX Runtime python package to be installed. Install the ONNX Runtime python package from https://pypi.org/project/onnxruntime/. Version 1.5.2 or later is required. + To enable operator type reduction, version 1.7 or later is required. + - `pip install onnxruntime` + - Ensure that any existing ONNX Runtime python package was uninstalled first, or use `-U` with the above command to upgrade an existing package. + +- Additionally, if you want to enable operator type reduction, the Flatbuffers python package should be installed. + - `pip install flatbuffers` + +- Copy all the ONNX models you wish to convert and use with the minimal build into a directory. + +- Convert the ONNX models to ORT format + - `python /tools/python/convert_onnx_models_to_ort.py ` + - To enable operator type reduction, specify the `--enable_type_reduction` option. + - For each ONNX model an ORT format model will be created with '.ort' as the file extension. + - A configuration file will also be created. + If operator type reduction is enabled, the file will be called `required_operators_and_types.config`. + Otherwise, the file will be called `required_operators.config`. Example: Running `'python /tools/python/convert_onnx_models_to_ort.py /models'` where the '/models' directory contains ModelA.onnx and ModelB.onnx - Will create /models/ModelA.ort and /models/ModelB.ort - - Will create /models/required_operators.config/ + - Will create /models/required_operators.config ### 2. Create the minimal build @@ -48,6 +63,7 @@ See [here](https://www.onnxruntime.ai/docs/how-to/build.html#cpu) for the genera The follow options can be used to reduce the build size. Enable all options that your scenario allows. - Reduce build to required operator kernels - Add `--include_ops_by_config --skip_tests` to the build parameters. + - To enable operator type reduction, also add `--enable_reduced_operator_type_support`. - See the documentation on the [Reduced Operator Kernel build](Reduced_Operator_Kernel_build.md) for more information. This step can also be done pre-build if needed. - NOTE: This step will edit some of the ONNX Runtime source files to exclude unused kernels. If you wish to go back to creating a full build, or wish to change the operator kernels included, you should run `git reset --hard` or `git checkout HEAD -- ./onnxruntime/core/providers` to undo these changes. From b8b41e3775aede3b6883c5f4297149615c7acefa Mon Sep 17 00:00:00 2001 From: Ori Levari Date: Tue, 23 Feb 2021 10:52:10 -0800 Subject: [PATCH 20/37] Update DirectML 1.4.1 to 1.4.2 for ORT 1.7 (#6780) Co-authored-by: Ori Levari --- cmake/external/dml.cmake | 2 +- packages.config | 2 +- tools/nuget/generate_nuspec_for_native_nuget.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/external/dml.cmake b/cmake/external/dml.cmake index 7ccb40a21d..c826752074 100644 --- a/cmake/external/dml.cmake +++ b/cmake/external/dml.cmake @@ -20,7 +20,7 @@ if (NOT onnxruntime_USE_CUSTOM_DIRECTML) set(NUGET_CONFIG ${PROJECT_SOURCE_DIR}/../NuGet.config) set(PACKAGES_CONFIG ${PROJECT_SOURCE_DIR}/../packages.config) get_filename_component(PACKAGES_DIR ${CMAKE_CURRENT_BINARY_DIR}/../packages ABSOLUTE) - set(DML_PACKAGE_DIR ${PACKAGES_DIR}/Microsoft.AI.DirectML.1.4.1) + set(DML_PACKAGE_DIR ${PACKAGES_DIR}/Microsoft.AI.DirectML.1.4.2) set(DML_SHARED_LIB DirectML.dll) # Restore nuget packages, which will pull down the DirectML redist package diff --git a/packages.config b/packages.config index 3b971dcf8d..7b9b1339a5 100644 --- a/packages.config +++ b/packages.config @@ -1,6 +1,6 @@  - + diff --git a/tools/nuget/generate_nuspec_for_native_nuget.py b/tools/nuget/generate_nuspec_for_native_nuget.py index 8575f5cab1..846c69ece1 100644 --- a/tools/nuget/generate_nuspec_for_native_nuget.py +++ b/tools/nuget/generate_nuspec_for_native_nuget.py @@ -76,7 +76,7 @@ def generate_repo_url(list, repo_url, commit_id): def generate_dependencies(list, package_name, version): - dml_dependency = '' + dml_dependency = '' if (package_name == 'Microsoft.AI.MachineLearning'): list.append('') From 7aa69a1f2a3de3c576ffbe171cab7014e3a741ee Mon Sep 17 00:00:00 2001 From: Scott McKay Date: Wed, 24 Feb 2021 14:21:57 +1000 Subject: [PATCH 21/37] Support building python bindings when building unit tests is manually disabled. (#6771) * If unit tests are manually excluded via `--cmake_extra_defines onnxruntime_BUILD_UNIT_TESTS=OFF` (e.g. testing changes to binary size where you want to keep the build time as quick as possible) it should still be possible to create the python bindings. Update CMakeLists.txt to decouple the inclusion of onnxruntime_python.cmake from unit tests being enabled. Update onnxruntime_python.cmake so it works when unit tests are disabled. Also skip copying of test py files when unit tests are disabled. --- cmake/CMakeLists.txt | 9 +- cmake/onnxruntime_python.cmake | 153 +++++++++++++++++---------------- 2 files changed, 85 insertions(+), 77 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index a702e2c5a4..5307f4f851 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1503,12 +1503,11 @@ if (onnxruntime_BUILD_NODEJS) include(onnxruntime_nodejs.cmake) endif() -# some of the tests rely on the shared libs to be -# built; hence the ordering +if (onnxruntime_ENABLE_PYTHON) + include(onnxruntime_python.cmake) +endif() + if (onnxruntime_BUILD_UNIT_TESTS) - if (onnxruntime_ENABLE_PYTHON) - include(onnxruntime_python.cmake) - endif() include(onnxruntime_unittests.cmake) endif() diff --git a/cmake/onnxruntime_python.cmake b/cmake/onnxruntime_python.cmake index 6f48f60952..566d9bd45e 100644 --- a/cmake/onnxruntime_python.cmake +++ b/cmake/onnxruntime_python.cmake @@ -220,19 +220,22 @@ else() ) endif() -file(GLOB onnxruntime_python_test_srcs CONFIGURE_DEPENDS - "${ONNXRUNTIME_ROOT}/test/python/*.py" - "${ORTTRAINING_SOURCE_DIR}/test/python/*.py" -) -file(GLOB onnxruntime_python_quantization_test_srcs CONFIGURE_DEPENDS - "${ONNXRUNTIME_ROOT}/test/python/quantization/*.py" -) -file(GLOB onnxruntime_python_checkpoint_test_srcs CONFIGURE_DEPENDS - "${ORTTRAINING_SOURCE_DIR}/test/python/checkpoint/*.py" -) -file(GLOB onnxruntime_python_dhp_parallel_test_srcs CONFIGURE_DEPENDS - "${ORTTRAINING_SOURCE_DIR}/test/python/dhp_parallel/*.py" -) +if (onnxruntime_BUILD_UNIT_TESTS) + file(GLOB onnxruntime_python_test_srcs CONFIGURE_DEPENDS + "${ONNXRUNTIME_ROOT}/test/python/*.py" + "${ORTTRAINING_SOURCE_DIR}/test/python/*.py" + ) + file(GLOB onnxruntime_python_quantization_test_srcs CONFIGURE_DEPENDS + "${ONNXRUNTIME_ROOT}/test/python/quantization/*.py" + ) + file(GLOB onnxruntime_python_checkpoint_test_srcs CONFIGURE_DEPENDS + "${ORTTRAINING_SOURCE_DIR}/test/python/checkpoint/*.py" + ) + file(GLOB onnxruntime_python_dhp_parallel_test_srcs CONFIGURE_DEPENDS + "${ORTTRAINING_SOURCE_DIR}/test/python/dhp_parallel/*.py" + ) +endif() + file(GLOB onnxruntime_python_tools_srcs CONFIGURE_DEPENDS "${ONNXRUNTIME_ROOT}/python/tools/*.py" ) @@ -259,109 +262,115 @@ file(GLOB onnxruntime_python_datasets_data CONFIGURE_DEPENDS "${ONNXRUNTIME_ROOT}/python/datasets/*.onnx" ) -set(test_data_target onnxruntime_test_all) +set(build_output_target onnxruntime_common) add_custom_command( TARGET onnxruntime_pybind11_state POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/backend - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/capi - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/capi/training - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/datasets - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/tools - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/tools/featurizer_ops - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/transformers - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/transformers/longformer - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/quantization - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/quantization/operators - COMMAND ${CMAKE_COMMAND} -E make_directory $/checkpoint - COMMAND ${CMAKE_COMMAND} -E make_directory $/dhp_parallel - COMMAND ${CMAKE_COMMAND} -E make_directory $/quantization + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/backend + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/capi + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/capi/training + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/datasets + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/tools + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/tools/featurizer_ops + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/transformers + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/transformers/longformer + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/quantization + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/quantization/operators + COMMAND ${CMAKE_COMMAND} -E make_directory $/checkpoint + COMMAND ${CMAKE_COMMAND} -E make_directory $/dhp_parallel + COMMAND ${CMAKE_COMMAND} -E make_directory $/quantization COMMAND ${CMAKE_COMMAND} -E copy ${ONNXRUNTIME_ROOT}/__init__.py - $/onnxruntime/ + $/onnxruntime/ COMMAND ${CMAKE_COMMAND} -E copy ${REPO_ROOT}/ThirdPartyNotices.txt - $/onnxruntime/ + $/onnxruntime/ COMMAND ${CMAKE_COMMAND} -E copy ${REPO_ROOT}/docs/Privacy.md - $/onnxruntime/ + $/onnxruntime/ COMMAND ${CMAKE_COMMAND} -E copy ${REPO_ROOT}/LICENSE - $/onnxruntime/ - COMMAND ${CMAKE_COMMAND} -E copy - ${onnxruntime_python_test_srcs} - $ - COMMAND ${CMAKE_COMMAND} -E copy - ${onnxruntime_python_quantization_test_srcs} - $/quantization/ - COMMAND ${CMAKE_COMMAND} -E copy - ${onnxruntime_python_checkpoint_test_srcs} - $/checkpoint/ - COMMAND ${CMAKE_COMMAND} -E copy - ${onnxruntime_python_dhp_parallel_test_srcs} - $/dhp_parallel/ + $/onnxruntime/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_backend_srcs} - $/onnxruntime/backend/ + $/onnxruntime/backend/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_srcs} - $/onnxruntime/capi/ + $/onnxruntime/capi/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_capi_training_srcs} - $/onnxruntime/capi/training/ + $/onnxruntime/capi/training/ COMMAND ${CMAKE_COMMAND} -E copy $ - $/onnxruntime/capi/ + $/onnxruntime/capi/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_datasets_srcs} - $/onnxruntime/datasets/ + $/onnxruntime/datasets/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_datasets_data} - $/onnxruntime/datasets/ + $/onnxruntime/datasets/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_tools_srcs} - $/onnxruntime/tools/ + $/onnxruntime/tools/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_tools_featurizers_src} - $/onnxruntime/tools/featurizer_ops/ + $/onnxruntime/tools/featurizer_ops/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_quantization_src} - $/onnxruntime/quantization/ + $/onnxruntime/quantization/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_quantization_operators_src} - $/onnxruntime/quantization/operators/ + $/onnxruntime/quantization/operators/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_transformers_src} - $/onnxruntime/transformers/ + $/onnxruntime/transformers/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_transformers_longformer_src} - $/onnxruntime/transformers/longformer/ + $/onnxruntime/transformers/longformer/ COMMAND ${CMAKE_COMMAND} -E copy ${REPO_ROOT}/VERSION_NUMBER - $ + $ ) +if (onnxruntime_BUILD_UNIT_TESTS) + add_custom_command( + TARGET onnxruntime_pybind11_state POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${onnxruntime_python_test_srcs} + $ + COMMAND ${CMAKE_COMMAND} -E copy + ${onnxruntime_python_quantization_test_srcs} + $/quantization/ + COMMAND ${CMAKE_COMMAND} -E copy + ${onnxruntime_python_checkpoint_test_srcs} + $/checkpoint/ + COMMAND ${CMAKE_COMMAND} -E copy + ${onnxruntime_python_dhp_parallel_test_srcs} + $/dhp_parallel/ + ) +endif() + if (onnxruntime_ENABLE_TRAINING) add_custom_command( TARGET onnxruntime_pybind11_state POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/training - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/training/amp - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/training/optim + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/training + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/training/amp + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/training/optim COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_capi_training_srcs} - $/onnxruntime/capi/training/ + $/onnxruntime/capi/training/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_root_srcs} - $/onnxruntime/training/ + $/onnxruntime/training/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_amp_srcs} - $/onnxruntime/training/amp/ + $/onnxruntime/training/amp/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_optim_srcs} - $/onnxruntime/training/optim/ + $/onnxruntime/training/optim/ COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_train_tools_srcs} - $/onnxruntime/training/ + $/onnxruntime/training/ ) endif() @@ -371,7 +380,7 @@ if (onnxruntime_USE_DNNL) COMMAND ${CMAKE_COMMAND} -E copy ${DNNL_DLL_PATH} $ $ - $/onnxruntime/capi/ + $/onnxruntime/capi/ ) endif() @@ -381,7 +390,7 @@ if (onnxruntime_USE_TENSORRT) COMMAND ${CMAKE_COMMAND} -E copy $ $ - $/onnxruntime/capi/ + $/onnxruntime/capi/ ) endif() @@ -392,7 +401,7 @@ if (onnxruntime_USE_OPENVINO) COMMAND ${CMAKE_COMMAND} -E copy ${OPENVINO_DLL_PATH} $ $ - $/onnxruntime/capi/ + $/onnxruntime/capi/ ) endif() endif() @@ -402,7 +411,7 @@ if (onnxruntime_USE_TVM) TARGET onnxruntime_pybind11_state POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ $ - $/onnxruntime/capi/ + $/onnxruntime/capi/ ) endif() @@ -412,10 +421,10 @@ if (onnxruntime_USE_NUPHAR) ) add_custom_command( TARGET onnxruntime_pybind11_state POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/nuphar + COMMAND ${CMAKE_COMMAND} -E make_directory $/onnxruntime/nuphar COMMAND ${CMAKE_COMMAND} -E copy ${onnxruntime_python_nuphar_python_srcs} - $/onnxruntime/nuphar/ + $/onnxruntime/nuphar/ ) endif() @@ -424,7 +433,7 @@ if (onnxruntime_USE_DML) TARGET onnxruntime_pybind11_state POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${DML_PACKAGE_DIR}/bin/${onnxruntime_target_platform}-win/${DML_SHARED_LIB} - $/onnxruntime/capi/ + $/onnxruntime/capi/ ) endif() @@ -433,7 +442,7 @@ if (onnxruntime_USE_NNAPI_BUILTIN) TARGET onnxruntime_pybind11_state POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $ - $/onnxruntime/capi/ + $/onnxruntime/capi/ ) endif() From c02ec38f8aee534b29a09d9508d4115c6ee91189 Mon Sep 17 00:00:00 2001 From: jingyanwangms <47403504+jingyanwangms@users.noreply.github.com> Date: Tue, 23 Feb 2021 23:21:06 -0800 Subject: [PATCH 22/37] [Running CI now] Remove duplicate tests to speed up CI (#6768) * remove tests to speed up CI * add back _into_data_parallelism tests to see how long the CI test takes * remove unnecessary save calls * add back data_parallelism_full_precision_bart_path * add data_parallelism_full_precision_path * remove data parallelism tests Co-authored-by: Jingyan Wang --- .../python/orttraining_test_checkpoint.py | 80 ------------------- 1 file changed, 80 deletions(-) diff --git a/orttraining/orttraining/test/python/orttraining_test_checkpoint.py b/orttraining/orttraining/test/python/orttraining_test_checkpoint.py index 6d348a949a..1bbcd41221 100644 --- a/orttraining/orttraining/test/python/orttraining_test_checkpoint.py +++ b/orttraining/orttraining/test/python/orttraining_test_checkpoint.py @@ -59,22 +59,14 @@ backend_api_file = os.path.join('checkpoint', 'orttraining_test_backend_api.py') single_node_full_precision_path = os.path.join(checkpoint_dir, 'single_node', 'full_precision') single_node_mixed_precision_path = os.path.join(checkpoint_dir, 'single_node', 'mixed_precision') -data_parallelism_full_precision_path = os.path.join(checkpoint_dir, 'data_parallelism', 'full_precision') -data_parallelism_mixed_precision_path = os.path.join(checkpoint_dir, 'data_parallelism', 'mixed_precision') -distributed_zero_full_precision_adam_path = os.path.join(checkpoint_dir, 'distributed_zero', 'full_precision', 'adam') -distributed_zero_mixed_precision_adam_path = os.path.join(checkpoint_dir, 'distributed_zero', 'mixed_precision', 'adam') distributed_zero_full_precision_lamb_path = os.path.join(checkpoint_dir, 'distributed_zero', 'full_precision', 'lamb') distributed_zero_mixed_precision_lamb_path = os.path.join(checkpoint_dir, 'distributed_zero', 'mixed_precision', 'lamb') # megatron saving and loading uses a different model single_node_full_precision_bart_path = os.path.join(checkpoint_dir, 'bart', 'single_node', 'full_precision') single_node_mixed_precision_bart_path = os.path.join(checkpoint_dir, 'bart', 'single_node', 'mixed_precision') -data_parallelism_full_precision_bart_path = os.path.join(checkpoint_dir, 'bart', 'data_parallelism', 'full_precision') -data_parallelism_mixed_precision_bart_path = os.path.join(checkpoint_dir, 'bart', 'data_parallelism', 'mixed_precision') distributed_zero_full_precision_lamb_bart_path = os.path.join(checkpoint_dir, 'bart', 'distributed_zero', 'full_precision', 'lamb') distributed_zero_mixed_precision_lamb_bart_path = os.path.join(checkpoint_dir, 'bart', 'distributed_zero', 'mixed_precision', 'lamb') -distributed_megatron_full_precision_adam_path = os.path.join(checkpoint_dir, 'bart', 'distributed_megatron', 'full_precision', 'adam') -distributed_megatron_mixed_precision_adam_path = os.path.join(checkpoint_dir, 'bart', 'distributed_megatron', 'mixed_precision', 'adam') distributed_megatron_full_precision_lamb_path = os.path.join(checkpoint_dir, 'bart', 'distributed_megatron', 'full_precision', 'lamb') distributed_megatron_mixed_precision_lamb_path = os.path.join(checkpoint_dir, 'bart', 'distributed_megatron', 'mixed_precision', 'lamb') distributed_zero_megatron_full_precision_adam_path = os.path.join(checkpoint_dir, 'bart', 'distributed_zero_megatron', 'full_precision', 'adam') @@ -85,26 +77,16 @@ distributed_zero_megatron_mixed_precision_lamb_path = os.path.join(checkpoint_di # save all checkpoint files (pre-checkpoint) _single_run(save_checkpoint_file, 'single_node_full_precision', single_node_full_precision_path) _single_run(save_checkpoint_file, 'single_node_mixed_precision', single_node_mixed_precision_path) -_distributed_run(save_checkpoint_file, 'data_parallelism_full_precision', data_parallelism_full_precision_path) -_distributed_run(save_checkpoint_file, 'data_parallelism_mixed_precision', data_parallelism_mixed_precision_path) -_distributed_run(save_checkpoint_file, 'distributed_zero_full_precision_adam', distributed_zero_full_precision_adam_path) -_distributed_run(save_checkpoint_file, 'distributed_zero_mixed_precision_adam', distributed_zero_mixed_precision_adam_path) _distributed_run(save_checkpoint_file, 'distributed_zero_full_precision_lamb', distributed_zero_full_precision_lamb_path) _distributed_run(save_checkpoint_file, 'distributed_zero_mixed_precision_lamb', distributed_zero_mixed_precision_lamb_path) _single_run(save_checkpoint_file, 'single_node_full_precision_bart', single_node_full_precision_bart_path) _single_run(save_checkpoint_file, 'single_node_mixed_precision_bart', single_node_mixed_precision_bart_path) -_distributed_run(save_checkpoint_file, 'data_parallelism_full_precision_bart', data_parallelism_full_precision_bart_path) -_distributed_run(save_checkpoint_file, 'data_parallelism_mixed_precision_bart', data_parallelism_mixed_precision_bart_path) _distributed_run(save_checkpoint_file, 'distributed_zero_full_precision_lamb_bart', distributed_zero_full_precision_lamb_bart_path) _distributed_run(save_checkpoint_file, 'distributed_zero_mixed_precision_lamb_bart', distributed_zero_mixed_precision_lamb_bart_path) -_distributed_run(save_checkpoint_file, 'distributed_megatron_full_precision_adam', distributed_megatron_full_precision_adam_path) -_distributed_run(save_checkpoint_file, 'distributed_megatron_mixed_precision_adam', distributed_megatron_mixed_precision_adam_path) _distributed_run(save_checkpoint_file, 'distributed_megatron_full_precision_lamb', distributed_megatron_full_precision_lamb_path) _distributed_run(save_checkpoint_file, 'distributed_megatron_mixed_precision_lamb', distributed_megatron_mixed_precision_lamb_path) -_distributed_run(save_checkpoint_file, 'distributed_zero_megatron_full_precision_adam', distributed_zero_megatron_full_precision_adam_path) -_distributed_run(save_checkpoint_file, 'distributed_zero_megatron_mixed_precision_adam', distributed_zero_megatron_mixed_precision_adam_path) _distributed_run(save_checkpoint_file, 'distributed_zero_megatron_full_precision_lamb', distributed_zero_megatron_full_precision_lamb_path) _distributed_run(save_checkpoint_file, 'distributed_zero_megatron_mixed_precision_lamb', distributed_zero_megatron_mixed_precision_lamb_path) @@ -114,10 +96,6 @@ _single_run(load_checkpoint_file, 'test_load_from_single_node_full_precision_int _single_run(load_checkpoint_file, 'test_load_from_single_node_mixed_precision_into_single_node_full_precision', single_node_mixed_precision_path) _single_run(load_checkpoint_file, 'test_load_from_single_node_mixed_precision_into_single_node_mixed_precision', single_node_mixed_precision_path) _single_run(load_checkpoint_file, 'test_load_from_single_node_full_precision_into_single_node_mixed_precision', single_node_full_precision_path) -_single_run(load_checkpoint_file, 'test_load_from_data_parallelism_full_precision_into_single_node_full_precision', data_parallelism_full_precision_path) -_single_run(load_checkpoint_file, 'test_load_from_data_parallelism_mixed_precision_into_single_node_full_precision', data_parallelism_mixed_precision_path) -_single_run(load_checkpoint_file, 'test_load_from_data_parallelism_mixed_precision_into_single_node_mixed_precision', data_parallelism_mixed_precision_path) -_single_run(load_checkpoint_file, 'test_load_from_data_parallelism_full_precision_into_single_node_mixed_precision', data_parallelism_full_precision_path) _single_run(load_checkpoint_file, 'test_load_from_distributed_zero_full_precision_into_single_node_full_precision', distributed_zero_full_precision_lamb_path) _single_run(load_checkpoint_file, 'test_load_from_distributed_zero_mixed_precision_into_single_node_full_precision', distributed_zero_mixed_precision_lamb_path) _single_run(load_checkpoint_file, 'test_load_from_distributed_zero_mixed_precision_into_single_node_mixed_precision', distributed_zero_mixed_precision_lamb_path) @@ -131,37 +109,11 @@ _single_run(load_checkpoint_file, 'test_load_from_distributed_zero_megatron_mixe _single_run(load_checkpoint_file, 'test_load_from_distributed_zero_megatron_mixed_precision_into_single_node_mixed_precision', distributed_zero_megatron_mixed_precision_lamb_path) _single_run(load_checkpoint_file, 'test_load_from_distributed_zero_megatron_full_precision_into_single_node_mixed_precision', distributed_zero_megatron_full_precision_lamb_path) -# going to data parallel trainer -_distributed_run(load_checkpoint_file, 'test_load_from_single_node_full_precision_into_data_parallelism_full_precision', single_node_full_precision_path) -_distributed_run(load_checkpoint_file, 'test_load_from_single_node_mixed_precision_into_data_parallelism_full_precision', single_node_mixed_precision_path) -_distributed_run(load_checkpoint_file, 'test_load_from_single_node_mixed_precision_into_data_parallelism_mixed_precision', single_node_mixed_precision_path) -_distributed_run(load_checkpoint_file, 'test_load_from_single_node_full_precision_into_data_parallelism_mixed_precision', single_node_full_precision_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_full_precision_into_data_parallelism_full_precision', data_parallelism_full_precision_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_mixed_precision_into_data_parallelism_full_precision', data_parallelism_mixed_precision_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_mixed_precision_into_data_parallelism_mixed_precision', data_parallelism_mixed_precision_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_full_precision_into_data_parallelism_mixed_precision', data_parallelism_full_precision_path) -_distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_full_precision_into_data_parallelism_full_precision', distributed_zero_full_precision_lamb_path) -_distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_mixed_precision_into_data_parallelism_full_precision', distributed_zero_mixed_precision_lamb_path) -_distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_mixed_precision_into_data_parallelism_mixed_precision', distributed_zero_mixed_precision_lamb_path) -_distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_full_precision_into_data_parallelism_mixed_precision', distributed_zero_full_precision_lamb_path) -_distributed_run(load_checkpoint_file, 'test_load_from_distributed_megatron_full_precision_into_data_parallelism_full_precision', distributed_megatron_full_precision_lamb_path) -_distributed_run(load_checkpoint_file, 'test_load_from_distributed_megatron_mixed_precision_into_data_parallelism_full_precision', distributed_megatron_mixed_precision_lamb_path) -_distributed_run(load_checkpoint_file, 'test_load_from_distributed_megatron_mixed_precision_into_data_parallelism_mixed_precision', distributed_megatron_mixed_precision_lamb_path) -_distributed_run(load_checkpoint_file, 'test_load_from_distributed_megatron_full_precision_into_data_parallelism_mixed_precision', distributed_megatron_full_precision_lamb_path) -_distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_megatron_full_precision_into_data_parallelism_full_precision', distributed_zero_megatron_full_precision_lamb_path) -_distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_megatron_mixed_precision_into_data_parallelism_full_precision', distributed_zero_megatron_mixed_precision_lamb_path) -_distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_megatron_mixed_precision_into_data_parallelism_mixed_precision', distributed_zero_megatron_mixed_precision_lamb_path) -_distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_megatron_full_precision_into_data_parallelism_mixed_precision', distributed_zero_megatron_full_precision_lamb_path) - # going to distributed zero trainer _distributed_run(load_checkpoint_file, 'test_load_from_single_node_full_precision_into_distributed_zero_full_precision', single_node_full_precision_path) _distributed_run(load_checkpoint_file, 'test_load_from_single_node_mixed_precision_into_distributed_zero_full_precision', single_node_mixed_precision_path) _distributed_run(load_checkpoint_file, 'test_load_from_single_node_mixed_precision_into_distributed_zero_mixed_precision', single_node_mixed_precision_path) _distributed_run(load_checkpoint_file, 'test_load_from_single_node_full_precision_into_distributed_zero_mixed_precision', single_node_full_precision_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_full_precision_into_distributed_zero_full_precision', data_parallelism_full_precision_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_mixed_precision_into_distributed_zero_full_precision', data_parallelism_mixed_precision_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_mixed_precision_into_distributed_zero_mixed_precision', data_parallelism_mixed_precision_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_full_precision_into_distributed_zero_mixed_precision', data_parallelism_full_precision_path) _distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_full_precision_into_distributed_zero_full_precision', distributed_zero_full_precision_lamb_path) _distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_mixed_precision_into_distributed_zero_full_precision', distributed_zero_mixed_precision_lamb_path) _distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_mixed_precision_into_distributed_zero_mixed_precision', distributed_zero_mixed_precision_lamb_path) @@ -180,10 +132,6 @@ _distributed_run(load_checkpoint_file, 'test_load_from_single_node_full_precisio _distributed_run(load_checkpoint_file, 'test_load_from_single_node_mixed_precision_into_distributed_megatron_full_precision', single_node_mixed_precision_bart_path) _distributed_run(load_checkpoint_file, 'test_load_from_single_node_mixed_precision_into_distributed_megatron_mixed_precision', single_node_mixed_precision_bart_path) _distributed_run(load_checkpoint_file, 'test_load_from_single_node_full_precision_into_distributed_megatron_mixed_precision', single_node_full_precision_bart_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_full_precision_into_distributed_megatron_full_precision', data_parallelism_full_precision_bart_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_mixed_precision_into_distributed_megatron_full_precision', data_parallelism_mixed_precision_bart_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_mixed_precision_into_distributed_megatron_mixed_precision', data_parallelism_mixed_precision_bart_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_full_precision_into_distributed_megatron_mixed_precision', data_parallelism_full_precision_bart_path) _distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_full_precision_into_distributed_megatron_full_precision', distributed_zero_full_precision_lamb_bart_path) _distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_mixed_precision_into_distributed_megatron_full_precision', distributed_zero_mixed_precision_lamb_bart_path) _distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_mixed_precision_into_distributed_megatron_mixed_precision', distributed_zero_mixed_precision_lamb_bart_path) @@ -202,10 +150,6 @@ _distributed_run(load_checkpoint_file, 'test_load_from_single_node_full_precisio _distributed_run(load_checkpoint_file, 'test_load_from_single_node_mixed_precision_into_distributed_zero_megatron_full_precision', single_node_mixed_precision_bart_path) _distributed_run(load_checkpoint_file, 'test_load_from_single_node_mixed_precision_into_distributed_zero_megatron_mixed_precision', single_node_mixed_precision_bart_path) _distributed_run(load_checkpoint_file, 'test_load_from_single_node_full_precision_into_distributed_zero_megatron_mixed_precision', single_node_full_precision_bart_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_full_precision_into_distributed_zero_megatron_full_precision', data_parallelism_full_precision_bart_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_mixed_precision_into_distributed_zero_megatron_full_precision', data_parallelism_mixed_precision_bart_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_mixed_precision_into_distributed_zero_megatron_mixed_precision', data_parallelism_mixed_precision_bart_path) -_distributed_run(load_checkpoint_file, 'test_load_from_data_parallelism_full_precision_into_distributed_zero_megatron_mixed_precision', data_parallelism_full_precision_bart_path) _distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_full_precision_into_distributed_zero_megatron_full_precision', distributed_zero_full_precision_lamb_bart_path) _distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_mixed_precision_into_distributed_zero_megatron_full_precision', distributed_zero_mixed_precision_lamb_bart_path) _distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_mixed_precision_into_distributed_zero_megatron_mixed_precision', distributed_zero_mixed_precision_lamb_bart_path) @@ -219,28 +163,4 @@ _distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_megatron _distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_megatron_mixed_precision_into_distributed_zero_megatron_mixed_precision', distributed_zero_megatron_mixed_precision_lamb_path) _distributed_run(load_checkpoint_file, 'test_load_from_distributed_zero_megatron_full_precision_into_distributed_zero_megatron_mixed_precision', distributed_zero_megatron_full_precision_lamb_path) -# checkpoint aggregation tests -_single_run(aggregate_checkpoint_file, 'test_aggregation_from_distributed_zero_full_precision_adam', distributed_zero_full_precision_adam_path) -_single_run(aggregate_checkpoint_file, 'test_aggregation_from_distributed_zero_mixed_precision_adam', distributed_zero_mixed_precision_adam_path) -_single_run(aggregate_checkpoint_file, 'test_aggregation_from_distributed_zero_mixed_precision_lamb', distributed_zero_mixed_precision_lamb_path) -_single_run(aggregate_checkpoint_file, 'test_aggregation_from_distributed_zero_full_precision_lamb', distributed_zero_full_precision_lamb_path) -_single_run(aggregate_checkpoint_file, 'test_aggregation_from_distributed_megatron_full_precision_adam', distributed_megatron_full_precision_adam_path) -_single_run(aggregate_checkpoint_file, 'test_aggregation_from_distributed_megatron_mixed_precision_adam', distributed_megatron_mixed_precision_adam_path) -_single_run(aggregate_checkpoint_file, 'test_aggregation_from_distributed_megatron_mixed_precision_lamb', distributed_megatron_mixed_precision_lamb_path) -_single_run(aggregate_checkpoint_file, 'test_aggregation_from_distributed_megatron_full_precision_lamb', distributed_megatron_full_precision_lamb_path) -_single_run(aggregate_checkpoint_file, 'test_aggregation_from_distributed_zero_megatron_full_precision_adam', distributed_zero_megatron_full_precision_adam_path) -_single_run(aggregate_checkpoint_file, 'test_aggregation_from_distributed_zero_megatron_mixed_precision_adam', distributed_zero_megatron_mixed_precision_adam_path) -_single_run(aggregate_checkpoint_file, 'test_aggregation_from_distributed_zero_megatron_mixed_precision_lamb', distributed_zero_megatron_mixed_precision_lamb_path) -_single_run(aggregate_checkpoint_file, 'test_aggregation_from_distributed_zero_megatron_full_precision_lamb', distributed_zero_megatron_full_precision_lamb_path) - -# optimizer state loading into model-parallel tests -_distributed_run(optim_state_file, 'test_optim_load_to_distributed_zero_full_precision_adam', distributed_zero_full_precision_adam_path) -_distributed_run(optim_state_file, 'test_optim_load_to_distributed_zero_mixed_precision_adam', distributed_zero_mixed_precision_adam_path) -_distributed_run(optim_state_file, 'test_optim_load_to_distributed_zero_mixed_precision_lamb', distributed_zero_mixed_precision_lamb_path) -_distributed_run(optim_state_file, 'test_optim_load_to_distributed_zero_full_precision_lamb', distributed_zero_full_precision_lamb_path) - -# backend api tests -_single_run(backend_api_file, 'test_single_node_full_precision_lamb', single_node_full_precision_path) -_distributed_run(backend_api_file, 'test_distributed_zero_mixed_precision_lamb', distributed_zero_mixed_precision_lamb_path) - shutil.rmtree(checkpoint_dir) From 47c8e9ad28e31c1e6f4e693e42d31857612e10a7 Mon Sep 17 00:00:00 2001 From: Ye Wang <52801275+wangyems@users.noreply.github.com> Date: Wed, 24 Feb 2021 01:15:29 -0800 Subject: [PATCH 23/37] Adding fp16 support for Einsum Cuda kernel (#6775) * checkin einsum fp16 support * remove unnecessary code * add tests * add another test --- .../math/einsum_utils/einsum_auxiliary_ops.cc | 13 ++ .../einsum_typed_compute_processor.cc | 1 + .../core/providers/cuda/math/einsum.cc | 13 +- .../math/einsum_utils/einsum_auxiliary_ops.cc | 13 ++ .../einsum_auxiliary_ops_diagonal.cu | 11 +- .../providers/cuda/reduction/reduction_ops.cc | 9 +- .../test/providers/cpu/math/einsum_test.cc | 176 ++++++++++++++++++ 7 files changed, 232 insertions(+), 4 deletions(-) diff --git a/onnxruntime/core/providers/cpu/math/einsum_utils/einsum_auxiliary_ops.cc b/onnxruntime/core/providers/cpu/math/einsum_utils/einsum_auxiliary_ops.cc index af83133cee..ab9f9e1c35 100644 --- a/onnxruntime/core/providers/cpu/math/einsum_utils/einsum_auxiliary_ops.cc +++ b/onnxruntime/core/providers/cpu/math/einsum_utils/einsum_auxiliary_ops.cc @@ -456,5 +456,18 @@ template std::unique_ptr ReduceSum( const std::vector& reduce_axes, AllocatorPtr allocator, concurrency::ThreadPool* tp, void* einsum_cuda_assets, const DeviceHelpers::ReduceSum& reduce_sum_func); +// MLFloat16 +template std::unique_ptr MatMul( + const Tensor& input_1, const std::vector& input_shape_1_override, + const Tensor& input_2, const std::vector& input_shape_2_override, + AllocatorPtr allocator, concurrency::ThreadPool* tp, void* einsum_cuda_assets, + const DeviceHelpers::MatMul& device_matmul_func); + +template std::unique_ptr ReduceSum( + const Tensor& input, const std::vector& input_shape_override, + const std::vector& reduce_axes, AllocatorPtr allocator, + concurrency::ThreadPool* tp, void* einsum_cuda_assets, + const DeviceHelpers::ReduceSum& device_reduce_sum_func); + } // namespace EinsumOp } // namespace onnxruntime diff --git a/onnxruntime/core/providers/cpu/math/einsum_utils/einsum_typed_compute_processor.cc b/onnxruntime/core/providers/cpu/math/einsum_utils/einsum_typed_compute_processor.cc index 0d6bb37ba3..39b15ce661 100644 --- a/onnxruntime/core/providers/cpu/math/einsum_utils/einsum_typed_compute_processor.cc +++ b/onnxruntime/core/providers/cpu/math/einsum_utils/einsum_typed_compute_processor.cc @@ -367,5 +367,6 @@ template class EinsumTypedComputeProcessor; template class EinsumTypedComputeProcessor; template class EinsumTypedComputeProcessor; template class EinsumTypedComputeProcessor; +template class EinsumTypedComputeProcessor; } // namespace onnxruntime diff --git a/onnxruntime/core/providers/cuda/math/einsum.cc b/onnxruntime/core/providers/cuda/math/einsum.cc index 661b91db63..8333561fac 100644 --- a/onnxruntime/core/providers/cuda/math/einsum.cc +++ b/onnxruntime/core/providers/cuda/math/einsum.cc @@ -15,7 +15,8 @@ ONNX_OPERATOR_KERNEL_EX( KernelDefBuilder().TypeConstraint("T", std::vector{ DataTypeImpl::GetTensorType(), - DataTypeImpl::GetTensorType()}), + DataTypeImpl::GetTensorType(), + DataTypeImpl::GetTensorType()}), Einsum); Status Einsum::Compute(OpKernelContext* context) const { @@ -59,6 +60,16 @@ Status Einsum::DeviceCompute(OpKernelContext* context, const std::vector, EinsumOp::DeviceHelpers::CudaDeviceHelpers::DataCopy); return einsum_compute_processor.Run(); + } else if (inputs[0]->IsDataType()) { + auto einsum_compute_processor = EinsumTypedComputeProcessor(context, allocator, tp, + einsum_compute_preprocessor, + &einsum_cuda_assets); + + einsum_compute_processor.SetDeviceHelpers(EinsumOp::DeviceHelpers::CudaDeviceHelpers::Transpose, + EinsumOp::DeviceHelpers::CudaDeviceHelpers::MatMul, + EinsumOp::DeviceHelpers::CudaDeviceHelpers::ReduceSum, + EinsumOp::DeviceHelpers::CudaDeviceHelpers::DataCopy); + return einsum_compute_processor.Run(); } return ORT_MAKE_STATUS(ONNXRUNTIME, NOT_IMPLEMENTED, diff --git a/onnxruntime/core/providers/cuda/math/einsum_utils/einsum_auxiliary_ops.cc b/onnxruntime/core/providers/cuda/math/einsum_utils/einsum_auxiliary_ops.cc index 4d3fd9d83b..79070a392d 100644 --- a/onnxruntime/core/providers/cuda/math/einsum_utils/einsum_auxiliary_ops.cc +++ b/onnxruntime/core/providers/cuda/math/einsum_utils/einsum_auxiliary_ops.cc @@ -165,6 +165,19 @@ template Tensor DeviceHelpers::CudaDeviceHelpers::ReduceSum( const TensorShape* input_shape_override, concurrency::ThreadPool* tp, void* einsum_cuda_assets); +// MLFloat16 +template Status DeviceHelpers::CudaDeviceHelpers::MatMul( + const MLFloat16* input_1_data, const MLFloat16* input_2_data, MLFloat16* output_data, + size_t left_stride, size_t right_stride, size_t output_stride, + size_t num_batches, size_t M, size_t K, size_t N, concurrency::ThreadPool* tp, + void* einsum_cuda_assets); + +template Tensor DeviceHelpers::CudaDeviceHelpers::ReduceSum( + const Tensor& input, const std::vector& reduce_axes, + bool keep_dims, AllocatorPtr allocator, + const TensorShape* input_shape_override, + concurrency::ThreadPool* tp, void* einsum_cuda_assets); + } // namespace EinsumOp } // namespace onnxruntime diff --git a/onnxruntime/core/providers/cuda/math/einsum_utils/einsum_auxiliary_ops_diagonal.cu b/onnxruntime/core/providers/cuda/math/einsum_utils/einsum_auxiliary_ops_diagonal.cu index d84396cc21..6f31e29091 100644 --- a/onnxruntime/core/providers/cuda/math/einsum_utils/einsum_auxiliary_ops_diagonal.cu +++ b/onnxruntime/core/providers/cuda/math/einsum_utils/einsum_auxiliary_ops_diagonal.cu @@ -30,8 +30,8 @@ __global__ void _DiagonalKernel( if (i == dim_1) { // Process dim_2 as dim_2 needs to have the same dim value as dim_1 // For example: given a tensor of shape [2, 3, 3] and parsing the diagonal along axes `1` and `2` - // we need to parse elements in input[j, i, i] (j -> 0 to 1; and i -> 0 to 2) - // and place them in output[j, i] and by definition of diagonal parsing dim_1 has to be equal to + // we need to parse elements in input[j, i, i] (j -> 0 to 1; and i -> 0 to 2) + // and place them in output[j, i] and by definition of diagonal parsing dim_1 has to be equal to // dim_2 input_idx += input_strides[dim_2] * dim; } @@ -75,6 +75,13 @@ void DiagonalImpl( output_size); break; + case sizeof(int16_t): + _DiagonalKernel<<>>( + reinterpret_cast(input_data), input_rank, dim_1, dim_2, + input_strides, reinterpret_cast(output_data), output_strides, + output_size); + break; + // Should not hit this as we do not register kernel support for types that will run into this default: ORT_THROW("Einsum Op: Diagonal parsing unsupported"); diff --git a/onnxruntime/core/providers/cuda/reduction/reduction_ops.cc b/onnxruntime/core/providers/cuda/reduction/reduction_ops.cc index 214d274baa..827aeca791 100644 --- a/onnxruntime/core/providers/cuda/reduction/reduction_ops.cc +++ b/onnxruntime/core/providers/cuda/reduction/reduction_ops.cc @@ -610,7 +610,7 @@ Status ReduceComputeCore(CUDAExecutionProvider& cuda_ep, const Tensor& input, Pr &zero, output_tensor, reinterpret_cast(output.template MutableData()))); } } - } else { + } else { // For ArgMax & ArgMin ops, use the indicies as the output with int64 type // cudnnReduceTensor has issue if input and output has same size, which will happen if the axis to be reduced has dim value of 1. // the output is zeros of the output size @@ -928,6 +928,13 @@ template Tensor ReduceCompute( bool keep_dims, bool calculate_log, bool calculate_sqt, bool log_sum_exp, bool fast_reduction, const TensorShape* input_shape_override); +template Tensor ReduceCompute( + CUDAExecutionProvider& cuda_ep, cudnnReduceTensorOp_t cudnn_reduce_op, + AllocatorPtr allocator, + const Tensor& input, const std::vector& axes, + bool keep_dims, bool calculate_log, bool calculate_sqt, bool log_sum_exp, + bool fast_reduction, const TensorShape* input_shape_override); + } // namespace ReductionOps #if defined(CUDA_VERSION) && CUDA_VERSION >= 11000 diff --git a/onnxruntime/test/providers/cpu/math/einsum_test.cc b/onnxruntime/test/providers/cpu/math/einsum_test.cc index 0d22ba6f14..c1f4fe79ab 100644 --- a/onnxruntime/test/providers/cpu/math/einsum_test.cc +++ b/onnxruntime/test/providers/cpu/math/einsum_test.cc @@ -3,6 +3,7 @@ #include "gtest/gtest.h" #include "test/providers/provider_test_utils.h" +#include "test/common/cuda_op_test_utils.h" #include "core/framework/data_types.h" #include "core/util/math.h" @@ -519,5 +520,180 @@ TEST(Einsum, ImplicitEinsumAsTensorContraction) { test.Run(); } + +// Test each theme for half support +TEST(Einsum, ExplicitEinsumAsIdentity_1D_input_Half) { + if (!HasCudaEnvironment(600)) { + return; + } + OpTester test("Einsum", 12, onnxruntime::kOnnxDomain); + test.AddAttribute("equation", "i->i"); + std::vector input_x_f = {0.9f, 2.5f, 2.3f, 1.5f, -4.5f}; + std::vector output_f = {0.9f, 2.5f, 2.3f, 1.5f, -4.5f}; + std::vector input_x(5); + std::vector output(5); + ConvertFloatToMLFloat16(input_x_f.data(), input_x.data(), 5); + ConvertFloatToMLFloat16(output_f.data(), output.data(), 5); + test.AddInput("x", {5}, input_x); + test.AddOutput("y", {5}, output); + test.Run(); +} + +TEST(Einsum, ExplicitEinsumAsTransposeOp_2D_input_Half) { + if (!HasCudaEnvironment(600)) { + return; + } + OpTester test("Einsum", 12, onnxruntime::kOnnxDomain); + test.AddAttribute("equation", "ji->ij"); + std::vector input_x_f = {1.f, 2.f, 3.f, 4.f}; + std::vector output_f = {1.f, 3.f, 2.f, 4.f}; + std::vector input_x(4); + std::vector output(4); + ConvertFloatToMLFloat16(input_x_f.data(), input_x.data(), 4); + ConvertFloatToMLFloat16(output_f.data(), output.data(), 4); + test.AddInput("x", {2, 2}, input_x); + test.AddOutput("y", {2, 2}, output); + test.Run(); +} + +TEST(Einsum, ExplicitEinsumAsReduceOp_2D_input_0_Half) { + if (!HasCudaEnvironment(600)) { + return; + } + OpTester test("Einsum", 12, onnxruntime::kOnnxDomain); + test.AddAttribute("equation", "ij->i"); + std::vector input_x_f = {1.f, 2.f, 3.f, 4.f}; + std::vector output_f = {3.f, 7.f}; + std::vector input_x(4); + std::vector output(2); + ConvertFloatToMLFloat16(input_x_f.data(), input_x.data(), 4); + ConvertFloatToMLFloat16(output_f.data(), output.data(), 2); + test.AddInput("x", {2, 2}, input_x); + test.AddOutput("y", {2}, output); + test.Run(); +} + +TEST(Einsum, ExplicitEinsumAsOuterProductOp_2D_input_Half) { + if (!HasCudaEnvironment(600)) { + return; + } + OpTester test("Einsum", 12, onnxruntime::kOnnxDomain); + test.AddAttribute("equation", "i,j->ij"); + std::vector input_x_f = {1.f, 2.f}; + std::vector input_y_f = {3.f, 4.f}; + std::vector output_f = {3.f, 4.f, 6.f, 8.f}; + std::vector input_x(2); + std::vector input_y(2); + std::vector output(4); + ConvertFloatToMLFloat16(input_x_f.data(), input_x.data(), 2); + ConvertFloatToMLFloat16(input_y_f.data(), input_y.data(), 2); + ConvertFloatToMLFloat16(output_f.data(), output.data(), 4); + test.AddInput("x", {2}, input_x); + test.AddInput("y", {2}, input_y); + test.AddOutput("o", {2, 2}, output); + test.Run(); +} + +TEST(Einsum, ExplicitEinsumAsMatmul_Half) { + if (!HasCudaEnvironment(600)) { + return; + } + OpTester test("Einsum", 12, onnxruntime::kOnnxDomain); + test.AddAttribute("equation", "ij,jk->ik"); + std::vector input_x_f = {1.f, 2.f, 3.f, 4.f}; + std::vector input_y_f = {1.f, 2.f, 3.f, 4.f}; + std::vector output_f = {7.f, 10.f, 15.f, 22.f}; + std::vector input_x(4); + std::vector input_y(4); + std::vector output(4); + ConvertFloatToMLFloat16(input_x_f.data(), input_x.data(), 4); + ConvertFloatToMLFloat16(input_y_f.data(), input_y.data(), 4); + ConvertFloatToMLFloat16(output_f.data(), output.data(), 4); + test.AddInput("x", {2, 2}, input_x); + test.AddInput("y", {2, 2}, input_y); + test.AddOutput("o", {2, 2}, output); + test.Run(); +} + +TEST(Einsum, ExplicitEinsumAsBatchedMatmul_Half) { + if (!HasCudaEnvironment(600)) { + return; + } + OpTester test("Einsum", 12, onnxruntime::kOnnxDomain); + test.AddAttribute("equation", "bij,bjk->bik"); + std::vector input_x_f = {1.f, 2.f, 3.f, 4.f, 1.f, 2.f, 3.f, 4.f}; + std::vector input_y_f = {1.f, 2.f, 3.f, 4.f, 1.f, 2.f, 3.f, 4.f}; + std::vector output_f = {7.f, 10.f, 15.f, 22.f, 7.f, 10.f, 15.f, 22.f}; + std::vector input_x(8); + std::vector input_y(8); + std::vector output(8); + ConvertFloatToMLFloat16(input_x_f.data(), input_x.data(), 8); + ConvertFloatToMLFloat16(input_y_f.data(), input_y.data(), 8); + ConvertFloatToMLFloat16(output_f.data(), output.data(), 8); + test.AddInput("x", {2, 2, 2}, input_x); + test.AddInput("y", {2, 2, 2}, input_y); + test.AddOutput("o", {2, 2, 2}, output); + test.Run(); +} + +TEST(Einsum, ExplicitEinsumAsDiagonalOp_Half) { + if (!HasCudaEnvironment(600)) { + return; + } + OpTester test("Einsum", 12, onnxruntime::kOnnxDomain); + test.AddAttribute("equation", "ii->i"); + std::vector input_x_f = {1.f, 2.f, 3.f, 4.f}; + std::vector output_f = {1.f, 4.f}; + std::vector input_x(4); + std::vector output(2); + ConvertFloatToMLFloat16(input_x_f.data(), input_x.data(), 4); + ConvertFloatToMLFloat16(output_f.data(), output.data(), 2); + test.AddInput("x", {2, 2}, input_x); + test.AddOutput("o", {2}, output); + test.Run(); +} + +TEST(Einsum, ExplicitEinsumAsElementwiseMulOpWithOneScalar_Half) { + if (!HasCudaEnvironment(600)) { + return; + } + OpTester test("Einsum", 12, onnxruntime::kOnnxDomain); + test.AddAttribute("equation", ",...i->...i"); + std::vector input_x_f = {10.f}; + std::vector input_y_f = {1.f, 2.f, 3.f, 4.f}; + std::vector output_f = {10.f, 20.f, 30.f, 40.f}; + std::vector input_x(1); + std::vector input_y(4); + std::vector output(4); + ConvertFloatToMLFloat16(input_x_f.data(), input_x.data(), 1); + ConvertFloatToMLFloat16(input_y_f.data(), input_y.data(), 4); + ConvertFloatToMLFloat16(output_f.data(), output.data(), 4); + test.AddInput("x", {}, input_x); + test.AddInput("y", {2, 2}, input_y); + test.AddOutput("o", {2, 2}, output); + test.Run(); +} + +TEST(Einsum, ExplicitEinsumAsTensorContraction_Half) { + if (!HasCudaEnvironment(600)) { + return; + } + OpTester test("Einsum", 12, onnxruntime::kOnnxDomain); + test.AddAttribute("equation", "abcd,ea->bcde"); + std::vector input_x_f = {1.f, 2.f, 1.f, 2.f, 1.f, 2.f, 1.f, 2.f, 1.f, 2.f, 1.f, 2.f, 1.f, 2.f, 1.f, 2.f}; + std::vector input_y_f = {1.f, 2.f, 1.f, 2.f}; + std::vector output_f = {3.f, 3.f, 6.f, 6.f, 3.f, 3.f, 6.f, 6.f, 3.f, 3.f, 6.f, 6.f, 3.f, 3.f, 6.f, 6.f}; + std::vector input_x(16); + std::vector input_y(4); + std::vector output(16); + ConvertFloatToMLFloat16(input_x_f.data(), input_x.data(), 16); + ConvertFloatToMLFloat16(input_y_f.data(), input_y.data(), 4); + ConvertFloatToMLFloat16(output_f.data(), output.data(), 16); + test.AddInput("x", {2, 2, 2, 2}, input_x); + test.AddInput("y", {2, 2}, input_y); + test.AddOutput("o", {2, 2, 2, 2}, output); + test.Run(); +} + } // namespace test } // namespace onnxruntime From 5a473216b7e0143dd2b59a471aec8384afcf5c05 Mon Sep 17 00:00:00 2001 From: Adam Pocock Date: Wed, 24 Feb 2021 13:25:05 -0500 Subject: [PATCH 24/37] [Java] Adds extra providers (#6770) Add providers for CoreML, ROCM, NNAPI, ArmNN Adding the structs for OrtCUDAProviderOptions and OrtOpenVINOProviderOptions Updating NNAPI flags. Adding the new CoreML flag. Adding hooks to the build system to tell Java about the new providers. --- cmake/onnxruntime_java.cmake | 9 +++ .../main/java/ai/onnxruntime/OrtProvider.java | 6 +- .../main/java/ai/onnxruntime/OrtSession.java | 70 ++++++++++++++++++- .../ai/onnxruntime/providers/CoreMLFlags.java | 23 ++++++ .../ai/onnxruntime/providers/NNAPIFlags.java | 23 ++++++ .../ai/onnxruntime/providers/OrtFlags.java | 35 ++++++++++ ...ai_onnxruntime_OrtSession_SessionOptions.c | 52 ++++++++++++++ 7 files changed, 214 insertions(+), 4 deletions(-) create mode 100644 java/src/main/java/ai/onnxruntime/providers/CoreMLFlags.java create mode 100644 java/src/main/java/ai/onnxruntime/providers/NNAPIFlags.java create mode 100644 java/src/main/java/ai/onnxruntime/providers/OrtFlags.java diff --git a/cmake/onnxruntime_java.cmake b/cmake/onnxruntime_java.cmake index 54eb81f833..dfe81df048 100644 --- a/cmake/onnxruntime_java.cmake +++ b/cmake/onnxruntime_java.cmake @@ -85,6 +85,15 @@ endif() if (onnxruntime_USE_DML) target_compile_definitions(onnxruntime4j_jni PRIVATE USE_DIRECTML=1) endif() +if (onnxruntime_USE_ARMNN) + target_compile_definitions(onnxruntime4j_jni PRIVATE USE_ARMNN=1) +endif() +if (onnxruntime_USE_ROCM) + target_compile_definitions(onnxruntime4j_jni PRIVATE USE_ROCM=1) +endif() +if (onnxruntime_USE_COREML) + target_compile_definitions(onnxruntime4j_jni PRIVATE USE_COREML=1) +endif() # depend on java sources. if they change, the JNI should recompile add_dependencies(onnxruntime4j_jni onnxruntime4j) diff --git a/java/src/main/java/ai/onnxruntime/OrtProvider.java b/java/src/main/java/ai/onnxruntime/OrtProvider.java index abcb9594ee..cf5202c432 100644 --- a/java/src/main/java/ai/onnxruntime/OrtProvider.java +++ b/java/src/main/java/ai/onnxruntime/OrtProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved. * Licensed under the MIT License. */ package ai.onnxruntime; @@ -21,7 +21,9 @@ public enum OrtProvider { DIRECT_ML("DmlExecutionProvider"), MI_GRAPH_X("MIGraphXExecutionProvider"), ACL("ACLExecutionProvider"), - ARM_NN("ArmNNExecutionProvider"); + ARM_NN("ArmNNExecutionProvider"), + ROCM("ROCMExecutionProvider"), + CORE_ML("CoreMLExecutionProvider"); private static final Map valueMap = new HashMap<>(values().length); diff --git a/java/src/main/java/ai/onnxruntime/OrtSession.java b/java/src/main/java/ai/onnxruntime/OrtSession.java index dd72dd5dea..286159b207 100644 --- a/java/src/main/java/ai/onnxruntime/OrtSession.java +++ b/java/src/main/java/ai/onnxruntime/OrtSession.java @@ -4,10 +4,14 @@ */ package ai.onnxruntime; +import ai.onnxruntime.providers.CoreMLFlags; +import ai.onnxruntime.providers.NNAPIFlags; +import ai.onnxruntime.providers.OrtFlags; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.EnumSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -809,13 +813,23 @@ public class OrtSession implements AutoCloseable { } /** - * Adds Android's NNAPI as an execution backend. + * Adds Android's NNAPI as an execution backend. Uses the default empty flag. * * @throws OrtException If there was an error in native code. */ public void addNnapi() throws OrtException { + addNnapi(EnumSet.noneOf(NNAPIFlags.class)); + } + + /** + * Adds Android's NNAPI as an execution backend. + * + * @param flags The flags which control the NNAPI configuration. + * @throws OrtException If there was an error in native code. + */ + public void addNnapi(EnumSet flags) throws OrtException { checkClosed(); - addNnapi(OnnxRuntime.ortApiHandle, nativeHandle, 0); + addNnapi(OnnxRuntime.ortApiHandle, nativeHandle, OrtFlags.aggregateToInt(flags)); } /** @@ -852,6 +866,49 @@ public class OrtSession implements AutoCloseable { addACL(OnnxRuntime.ortApiHandle, nativeHandle, useArena ? 1 : 0); } + /** + * Adds the ARM Neural Net library as an execution backend. + * + * @param useArena If true use the arena memory allocator. + * @throws OrtException If there was an error in native code. + */ + public void addArmNN(boolean useArena) throws OrtException { + checkClosed(); + addArmNN(OnnxRuntime.ortApiHandle, nativeHandle, useArena ? 1 : 0); + } + + /** + * Adds ROCM as an execution backend. + * + * @param deviceID The ROCM device ID. + * @param memLimit The maximum amount of memory available. + * @throws OrtException If there was an error in native code. + */ + public void addROCM(int deviceID, long memLimit) throws OrtException { + checkClosed(); + addROCM(OnnxRuntime.ortApiHandle, nativeHandle, deviceID, memLimit); + } + + /** + * Adds Apple's CoreML as an execution backend. Uses the default empty flag. + * + * @throws OrtException If there was an error in native code. + */ + public void addCoreML() throws OrtException { + addCoreML(EnumSet.noneOf(CoreMLFlags.class)); + } + + /** + * Adds Apple's CoreML as an execution backend. + * + * @param flags The flags which control the CoreML configuration. + * @throws OrtException If there was an error in native code. + */ + public void addCoreML(EnumSet flags) throws OrtException { + checkClosed(); + addCoreML(OnnxRuntime.ortApiHandle, nativeHandle, OrtFlags.aggregateToInt(flags)); + } + private native void setExecutionMode(long apiHandle, long nativeHandle, int mode) throws OrtException; @@ -944,6 +1001,15 @@ public class OrtSession implements AutoCloseable { throws OrtException; private native void addACL(long apiHandle, long nativeHandle, int useArena) throws OrtException; + + private native void addArmNN(long apiHandle, long nativeHandle, int useArena) + throws OrtException; + + private native void addROCM(long apiHandle, long nativeHandle, int deviceID, long memLimit) + throws OrtException; + + private native void addCoreML(long apiHandle, long nativeHandle, int coreMLFlags) + throws OrtException; } /** Used to control logging and termination of a call to {@link OrtSession#run}. */ diff --git a/java/src/main/java/ai/onnxruntime/providers/CoreMLFlags.java b/java/src/main/java/ai/onnxruntime/providers/CoreMLFlags.java new file mode 100644 index 0000000000..7a9db43081 --- /dev/null +++ b/java/src/main/java/ai/onnxruntime/providers/CoreMLFlags.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Licensed under the MIT License. + */ +package ai.onnxruntime.providers; + +/** Flags for the CoreML provider. */ +public enum CoreMLFlags implements OrtFlags { + CPU_ONLY(1), // COREML_FLAG_USE_CPU_ONLY(0x001) + ENABLE_ON_SUBGRAPH(2), // COREML_FLAG_ENABLE_ON_SUBGRAPH(0x002) + ONLY_ENABLE_DEVICE_WITH_ANE(4); // COREML_FLAG_ONLY_ENABLE_DEVICE_WITH_ANE(0x004), + + public final int value; + + CoreMLFlags(int value) { + this.value = value; + } + + @Override + public int getValue() { + return value; + } +} diff --git a/java/src/main/java/ai/onnxruntime/providers/NNAPIFlags.java b/java/src/main/java/ai/onnxruntime/providers/NNAPIFlags.java new file mode 100644 index 0000000000..560d15b081 --- /dev/null +++ b/java/src/main/java/ai/onnxruntime/providers/NNAPIFlags.java @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Licensed under the MIT License. + */ +package ai.onnxruntime.providers; + +/** Flags for the NNAPI provider. */ +public enum NNAPIFlags implements OrtFlags { + USE_FP16(1), // NNAPI_FLAG_USE_FP16(0x001) + USE_NCHW(2), // NNAPI_FLAG_USE_NCHW(0x002) + CPU_DISABLED(4); // NNAPI_FLAG_CPU_DISABLED(0x004) + + public final int value; + + NNAPIFlags(int value) { + this.value = value; + } + + @Override + public int getValue() { + return value; + } +} diff --git a/java/src/main/java/ai/onnxruntime/providers/OrtFlags.java b/java/src/main/java/ai/onnxruntime/providers/OrtFlags.java new file mode 100644 index 0000000000..73d3eeae64 --- /dev/null +++ b/java/src/main/java/ai/onnxruntime/providers/OrtFlags.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. + * Licensed under the MIT License. + */ +package ai.onnxruntime.providers; + +import java.util.EnumSet; + +/** An interface for bitset enums that should be aggregated into a single integer. */ +public interface OrtFlags { + + /** + * Gets the underlying flag value. + * + * @return The flag value. + */ + public int getValue(); + + /** + * Converts an EnumSet of flags into the value expected by the C API. + * + * @param set The enum set to aggregate the values from. + * @param The enum type to aggregate. + * @return The aggregated values + */ + public static & OrtFlags> int aggregateToInt(EnumSet set) { + int value = 0; + + for (OrtFlags flag : set) { + value |= flag.getValue(); + } + + return value; + } +} diff --git a/java/src/main/native/ai_onnxruntime_OrtSession_SessionOptions.c b/java/src/main/native/ai_onnxruntime_OrtSession_SessionOptions.c index 21f8af6930..fc5cab8c80 100644 --- a/java/src/main/native/ai_onnxruntime_OrtSession_SessionOptions.c +++ b/java/src/main/native/ai_onnxruntime_OrtSession_SessionOptions.c @@ -23,6 +23,9 @@ #include "onnxruntime/core/providers/tensorrt/tensorrt_provider_factory.h" #include "onnxruntime/core/providers/migraphx/migraphx_provider_factory.h" #include "onnxruntime/core/providers/acl/acl_provider_factory.h" +#include "onnxruntime/core/providers/armnn/armnn_provider_factory.h" +#include "onnxruntime/core/providers/coreml/coreml_provider_factory.h" +#include "onnxruntime/core/providers/rocm/rocm_provider_factory.h" #ifdef USE_DIRECTML #include "onnxruntime/core/providers/dml/dml_provider_factory.h" #endif @@ -502,3 +505,52 @@ JNIEXPORT void JNICALL Java_ai_onnxruntime_OrtSession_00024SessionOptions_addACL throwOrtException(jniEnv,convertErrorCode(ORT_INVALID_ARGUMENT),"This binary was not compiled with ACL support."); #endif } + +/* + * Class: ai_onnxruntime_OrtSession_SessionOptions + * Method: addArmNN + * Signature: (JJI)V + */ +JNIEXPORT void JNICALL Java_ai_onnxruntime_OrtSession_00024SessionOptions_addArmNN + (JNIEnv * jniEnv, jobject jobj, jlong apiHandle, jlong handle, jint useArena) { + (void)jobj; + #ifdef USE_ARMNN + checkOrtStatus(jniEnv,(const OrtApi*)apiHandle,OrtSessionOptionsAppendExecutionProvider_ArmNN((OrtSessionOptions*) handle,useArena)); + #else + (void)apiHandle;(void)handle;(void)useArena; // Parameters used when ARMNN is defined. + throwOrtException(jniEnv,convertErrorCode(ORT_INVALID_ARGUMENT),"This binary was not compiled with ArmNN support."); + #endif +} + +/* + * Class: ai_onnxruntime_OrtSession_SessionOptions + * Method: addCoreML + * Signature: (JJI)V + */ +JNIEXPORT void JNICALL Java_ai_onnxruntime_OrtSession_00024SessionOptions_addCoreML + (JNIEnv * jniEnv, jobject jobj, jlong apiHandle, jlong handle, jint coreMLFlags) { + (void)jobj; + #ifdef USE_CORE_ML + checkOrtStatus(jniEnv,(const OrtApi*)apiHandle,OrtSessionOptionsAppendExecutionProvider_CoreML((OrtSessionOptions*) handle, (uint32_t) coreMLFlags)); + #else + (void)apiHandle;(void)handle;(void)coreMLFlags; // Parameters used when CoreML is defined. + throwOrtException(jniEnv,convertErrorCode(ORT_INVALID_ARGUMENT),"This binary was not compiled with CoreML support."); + #endif +} + +/* + * Class: ai_onnxruntime_OrtSession_SessionOptions + * Method: addROCM + * Signature: (JJI)V + */ +JNIEXPORT void JNICALL Java_ai_onnxruntime_OrtSession_00024SessionOptions_addROCM + (JNIEnv * jniEnv, jobject jobj, jlong apiHandle, jlong handle, jint deviceID, jlong memLimit) { + (void)jobj; + #ifdef USE_ROCM + checkOrtStatus(jniEnv,(const OrtApi*)apiHandle,OrtSessionOptionsAppendExecutionProvider_ROCM((OrtSessionOptions*) handle, deviceID, (size_t) memLimit)); + #else + (void)apiHandle;(void)handle;(void)deviceID;(void)memLimit; // Parameters used when ROCM is defined. + throwOrtException(jniEnv,convertErrorCode(ORT_INVALID_ARGUMENT),"This binary was not compiled with ROCM support."); + #endif +} + From 71a70ecf6e57ae5232d9ead899f9d1cfacd9554b Mon Sep 17 00:00:00 2001 From: fthielke Date: Wed, 24 Feb 2021 20:53:31 +0100 Subject: [PATCH 25/37] Allow 3D ConvTranspose in CUDA execution provider (#6794) Co-authored-by: Felix Thielke --- onnxruntime/core/providers/cuda/nn/conv_transpose.cc | 5 ++--- onnxruntime/test/onnx/main.cc | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/onnxruntime/core/providers/cuda/nn/conv_transpose.cc b/onnxruntime/core/providers/cuda/nn/conv_transpose.cc index 8a795b5d90..c71a9b4453 100644 --- a/onnxruntime/core/providers/cuda/nn/conv_transpose.cc +++ b/onnxruntime/core/providers/cuda/nn/conv_transpose.cc @@ -45,10 +45,9 @@ Status ConvTranspose::DoConvTranspose(OpKernelContext* context, bool dynamic_ auto x_data = reinterpret_cast(X->template Data()); auto x_dimensions = X->Shape().NumDimensions(); - if (x_dimensions != 4 && x_dimensions != 3) { - // This condition is not true for test_convtranspose_3d in ONNX tests series. + if (x_dimensions < 3 || x_dimensions > 5) { // TODO: the error message should tell which operator raises it. - return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT, "Input X must be 3- or 4-dimensional.", + return ORT_MAKE_STATUS(ONNXRUNTIME, INVALID_ARGUMENT, "Input X must be 3-, 4- or 5-dimensional.", " X: ", X->Shape().ToString().c_str()); } const Tensor* W = context->Input(1); diff --git a/onnxruntime/test/onnx/main.cc b/onnxruntime/test/onnx/main.cc index 4456a9af4c..474c5a1a27 100644 --- a/onnxruntime/test/onnx/main.cc +++ b/onnxruntime/test/onnx/main.cc @@ -793,7 +793,6 @@ int real_main(int argc, char* argv[], Ort::Env& env) { broken_tests.insert({"tf_inception_v1", "flaky test"}); //TODO: Investigate cause for flakiness broken_tests.insert({"faster_rcnn", "Linux: faster_rcnn:output=6383:shape mismatch, expect {77} got {57}"}); broken_tests.insert({"split_zero_size_splits", "alloc failed"}); - broken_tests.insert({"convtranspose_3d", "3d convtranspose not supported yet"}); } if (enable_dml) { From f4acdb2ecd254b17b3156baaba723873e2ef8c8a Mon Sep 17 00:00:00 2001 From: Tianlei Wu Date: Wed, 24 Feb 2021 12:52:35 -0800 Subject: [PATCH 26/37] Update transformers benchmark for transformers 4.3.* and ORT 1.7 (#6796) * update benchmark for transformers 4.* and ORT 1.7 * Fix gpt2 onnx conversion for transformers 4.3.*. Add a check of transformer version >= 3.1. * remove code related to openmp * update pretrain model list: keep representitive models only --- .../python/tools/transformers/README.md | 4 +- .../python/tools/transformers/benchmark.py | 3 - .../tools/transformers/benchmark_gpt2.py | 7 +- .../tools/transformers/bert_perf_test.py | 241 +++--------------- .../tools/transformers/bert_test_data.py | 14 +- .../transformers/compare_bert_results.py | 23 +- .../tools/transformers/convert_to_onnx.py | 5 + .../tools/transformers/dev_benchmark.cmd | 16 +- .../python/tools/transformers/gpt2_helper.py | 41 ++- .../tools/transformers/huggingface_models.py | 72 ++---- .../tools/transformers/run_benchmark.sh | 25 +- .../tools/transformers/test/test_gpt2.py | 2 +- 12 files changed, 137 insertions(+), 316 deletions(-) diff --git a/onnxruntime/python/tools/transformers/README.md b/onnxruntime/python/tools/transformers/README.md index a9805fe5a9..99d015751d 100644 --- a/onnxruntime/python/tools/transformers/README.md +++ b/onnxruntime/python/tools/transformers/README.md @@ -210,7 +210,7 @@ For GPU, please append --use_gpu to the command. bert_perf_test.py can be used to check the BERT model inference performance. Below are examples: ```console -python -m onnxruntime.transformers.bert_perf_test --model optimized_model_cpu.onnx --batch_size 1 --sequence_length 128 --samples 100 --test_times 10 --inclusive +python -m onnxruntime.transformers.bert_perf_test --model optimized_model_cpu.onnx --batch_size 1 --sequence_length 128 ``` For GPU, please append --use_gpu to the command. @@ -219,7 +219,7 @@ After test is finished, a file like perf_results_CPU_B1_S128_.txt or ## Profiling -profiler.py can be used to run profiling on a transformer model. It can help figure out the bottleneck of a model, and time spent on a node or subgraph. +profiler.py can be used to run profiling on a transformer model. It can help figure out the bottleneck of a model, and CPU time spent on a node or subgraph. Examples commands: diff --git a/onnxruntime/python/tools/transformers/benchmark.py b/onnxruntime/python/tools/transformers/benchmark.py index 3fed9c88fa..20f7a52113 100644 --- a/onnxruntime/python/tools/transformers/benchmark.py +++ b/onnxruntime/python/tools/transformers/benchmark.py @@ -80,9 +80,6 @@ def run_onnxruntime(use_gpu, model_names, model_class, precision, num_threads, b ) return results - if (not use_gpu) and ('CUDAExecutionProvider' in onnxruntime.get_available_providers()): - logger.warning("Please install onnxruntime package instead of onnxruntime-gpu to get best cpu performance.") - for model_name in model_names: all_input_names = MODELS[model_name][0] for num_inputs in input_counts: diff --git a/onnxruntime/python/tools/transformers/benchmark_gpt2.py b/onnxruntime/python/tools/transformers/benchmark_gpt2.py index 5354db9ed7..ed5d3de6c8 100644 --- a/onnxruntime/python/tools/transformers/benchmark_gpt2.py +++ b/onnxruntime/python/tools/transformers/benchmark_gpt2.py @@ -16,6 +16,7 @@ import argparse import logging import torch import onnx +from packaging import version from transformers import AutoConfig from gpt2_helper import Gpt2Helper, MODEL_CLASSES, DEFAULT_TOLERANCE, PRETRAINED_GPT2_MODELS from quantize_helper import QuantizeHelper @@ -113,6 +114,10 @@ def parse_arguments(argv=None): def main(args): + from transformers import __version__ as transformers_version + if version.parse(transformers_version) < version.parse("3.1.0"): # past_key_values name does not exist in 3.0.2 or older + raise RuntimeError("This tool requires transformers 3.1.0 or later.") + logger.info(f"Arguments:{args}") if args.precision == Precision.FLOAT16: assert args.optimize_onnx and args.use_gpu, "fp16 requires --optimize_onnx --use_gpu" @@ -279,7 +284,7 @@ def main(args): return csv_filename -if __name__ == '__main__': +if __name__ == '__main__': args = parse_arguments() setup_logger(args.verbose) main(args) diff --git a/onnxruntime/python/tools/transformers/bert_perf_test.py b/onnxruntime/python/tools/transformers/bert_perf_test.py index 16d8a04939..ff7738d4a8 100644 --- a/onnxruntime/python/tools/transformers/bert_perf_test.py +++ b/onnxruntime/python/tools/transformers/bert_perf_test.py @@ -35,44 +35,10 @@ class TestSetting: sequence_length: int test_cases: int test_times: int - contiguous: bool use_gpu: bool - warmup: bool - omp_num_threads: int - omp_wait_policy: str intra_op_num_threads: int seed: int verbose: bool - contiguous: bool - inclusive: bool - extra_latency: float = 0 - - def get_setting(self) -> str: - return f"batch_size={self.batch_size},sequence_length={self.sequence_length},test_cases={self.test_cases},test_times={self.test_times},contiguous={self.contiguous},use_gpu={self.use_gpu},warmup={self.warmup}" - - def check(self, intra_op_threads, omp_threads, omp_policy) -> bool: - if intra_op_threads is None: - if self.intra_op_num_threads is not None and self.intra_op_num_threads > 0: - return False - else: - assert intra_op_threads > 0 - if not (self.intra_op_num_threads is None or self.intra_op_num_threads == intra_op_threads): - return False - - if omp_threads is None: - if self.omp_num_threads is not None and self.omp_num_threads > 0: - return False - else: - assert omp_threads > 0 - if not (self.omp_num_threads is None or self.omp_num_threads == omp_threads): - return False - - if self.omp_wait_policy is not None: - if omp_policy != self.omp_wait_policy: - return False - - return True - @dataclass class ModelSetting: @@ -84,22 +50,17 @@ class ModelSetting: def create_session(model_path, use_gpu, intra_op_num_threads, graph_optimization_level=None): - # Import onnxruntime shall be after OpenMP environment variable setting. - # So we put the import in function to delay importing instead of top of this script. import onnxruntime if use_gpu and ('CUDAExecutionProvider' not in onnxruntime.get_available_providers()): print( "Warning: Please install onnxruntime-gpu package instead of onnxruntime, and use a machine with GPU for testing gpu performance." ) - elif (not use_gpu) and ('CUDAExecutionProvider' in onnxruntime.get_available_providers()): - print("Warning: Please install onnxruntime package instead of onnxruntime-gpu to get best cpu performance.") if intra_op_num_threads is None and graph_optimization_level is None: session = onnxruntime.InferenceSession(model_path) else: - execution_providers = ['CPUExecutionProvider' - ] if not use_gpu else ['CUDAExecutionProvider', 'CPUExecutionProvider'] + execution_providers = ['CPUExecutionProvider'] if not use_gpu else ['CUDAExecutionProvider', 'CPUExecutionProvider'] sess_options = onnxruntime.SessionOptions() sess_options.execution_mode = onnxruntime.ExecutionMode.ORT_SEQUENTIAL @@ -127,8 +88,8 @@ def create_session(model_path, use_gpu, intra_op_num_threads, graph_optimization return session -def onnxruntime_inference(session, all_inputs, output_names, warmup=True): - if warmup and len(all_inputs) > 0: +def onnxruntime_inference(session, all_inputs, output_names): + if len(all_inputs) > 0: # Use a random input as warm up. session.run(output_names, random.choice(all_inputs)) @@ -142,57 +103,16 @@ def onnxruntime_inference(session, all_inputs, output_names, warmup=True): latency_list.append(latency) return results, latency_list - -def get_contiguous_inputs(all_inputs): - """ - Convert input to be contiguous. - """ - contiguous_inputs = [] - - start_time = timeit.default_timer() - for test_case_id, inputs in enumerate(all_inputs): - real_inputs = {} - for key, value in inputs.items(): - real_inputs[key] = np.ascontiguousarray(value) - contiguous_inputs.append(real_inputs) - latency = timeit.default_timer() - start_time - - average_latency_ms = latency / len(contiguous_inputs) * 1000 - return contiguous_inputs, average_latency_ms - - def to_string(model_path, session, test_setting): sess_options = session.get_session_options() - option = "model={}".format(os.path.basename(model_path)) - option += ",graph_optimization_level={},intra_op_num_threads={}".format(sess_options.graph_optimization_level, + option = "model={},".format(os.path.basename(model_path)) + option += "graph_optimization_level={},intra_op_num_threads={},".format(sess_options.graph_optimization_level, sess_options.intra_op_num_threads).replace( 'GraphOptimizationLevel.ORT_', '') - option += ",OMP_NUM_THREADS={}".format(os.environ["OMP_NUM_THREADS"] if "OMP_NUM_THREADS" in os.environ else "") - option += ",OMP_WAIT_POLICY={}".format(os.environ["OMP_WAIT_POLICY"] if "OMP_WAIT_POLICY" in os.environ else "") - option += ",{}".format(test_setting.get_setting()) + option += f"batch_size={test_setting.batch_size},sequence_length={test_setting.sequence_length},test_cases={test_setting.test_cases},test_times={test_setting.test_times},use_gpu={test_setting.use_gpu}" return option - -def setup_openmp_environ(omp_num_threads, omp_wait_policy): - if omp_num_threads is None: - if "OMP_NUM_THREADS" in os.environ: - del os.environ["OMP_NUM_THREADS"] - else: - os.environ["OMP_NUM_THREADS"] = str(omp_num_threads) - - if omp_wait_policy is None: - if "OMP_WAIT_POLICY" in os.environ: - del os.environ["OMP_WAIT_POLICY"] - else: - assert omp_wait_policy in ["ACTIVE", "PASSIVE"], f"{omp_wait_policy} is not a valid policy" - os.environ["OMP_WAIT_POLICY"] = omp_wait_policy - - -def run_one_test(model_setting, test_setting, perf_results, all_inputs, intra_op_num_threads, omp_num_threads, - omp_wait_policy): - # Environment variable shall be set before import onnxruntime. - setup_openmp_environ(omp_num_threads, omp_wait_policy) - +def run_one_test(model_setting, test_setting, perf_results, all_inputs, intra_op_num_threads): session = create_session(model_setting.model_path, test_setting.use_gpu, intra_op_num_threads, model_setting.opt_level) output_names = [output.name for output in session.get_outputs()] @@ -206,11 +126,11 @@ def run_one_test(model_setting, test_setting, perf_results, all_inputs, intra_op all_latency_list = [] for i in range(test_setting.test_times): - results, latency_list = onnxruntime_inference(session, all_inputs, output_names, test_setting.warmup) + results, latency_list = onnxruntime_inference(session, all_inputs, output_names) all_latency_list.extend(latency_list) # latency in miliseconds - latency_ms = np.array(all_latency_list) * 1000 + test_setting.extra_latency + latency_ms = np.array(all_latency_list) * 1000 average_latency = statistics.mean(latency_ms) latency_50 = np.percentile(latency_ms, 50) @@ -226,91 +146,31 @@ def run_one_test(model_setting, test_setting, perf_results, all_inputs, intra_op format(throughput, '.2f'))) -def launch_test(model_setting, test_setting, perf_results, all_inputs, intra_op_num_threads, omp_num_threads, - omp_wait_policy): - if not test_setting.check(intra_op_num_threads, omp_num_threads, omp_wait_policy): - return - +def launch_test(model_setting, test_setting, perf_results, all_inputs, intra_op_num_threads): process = multiprocessing.Process(target=run_one_test, - args=(model_setting, test_setting, perf_results, all_inputs, intra_op_num_threads, - omp_num_threads, omp_wait_policy)) + args=(model_setting, test_setting, perf_results, all_inputs, intra_op_num_threads)) process.start() process.join() -def run_perf_tests(model_setting, test_setting, perf_results, test_all, all_inputs): +def run_perf_tests(model_setting, test_setting, perf_results, all_inputs): + if (test_setting.intra_op_num_threads is not None): + launch_test(model_setting, test_setting, perf_results, all_inputs, test_setting.intra_op_num_threads) + return + cpu_count = psutil.cpu_count(logical=False) logical_cores = psutil.cpu_count(logical=True) - candidate_threads = list(set([1, logical_cores, cpu_count])) - - if (test_setting.intra_op_num_threads is not None) or (test_setting.omp_num_threads is not None): - - if test_setting.intra_op_num_threads is not None: - intra_op_threads = [test_setting.intra_op_num_threads] - else: - intra_op_threads = [None] + candidate_threads - - if test_setting.omp_num_threads is not None: - omp_threads = [test_setting.omp_num_threads] - else: - omp_threads = [None] + candidate_threads - - if test_setting.omp_wait_policy is not None: - omp_policies = [test_setting.omp_wait_policy] - else: - omp_policies = [None, 'PASSIVE', 'ACTIVE'] - - for it in intra_op_threads: - for ot in omp_threads: - for op in omp_policies: - launch_test(model_setting, test_setting, perf_results, all_inputs, it, ot, op) - return - - # Test a setting without any setting as baseline 1. - launch_test(model_setting, test_setting, perf_results, all_inputs, None, None, None) - - if not test_setting.use_gpu: - # For CPU: intra_op_num_threads = 1, omp_num_threads=None, omp_wait_policy=None - # Another setting without environment variable as baseline 2. - launch_test(model_setting, test_setting, perf_results, all_inputs, 1, None, None) - else: - # For GPU, we test two more settings by default: - # (1) intra_op_num_threads = 1, omp_num_threads=cpu_count, omp_wait_policy=PASSIVE - # (2) intra_op_num_threads = logical_cores, omp_num_threads=1, omp_wait_policy=ACTIVE - launch_test(model_setting, test_setting, perf_results, all_inputs, 1, cpu_count, 'PASSIVE') - - launch_test(model_setting, test_setting, perf_results, all_inputs, logical_cores, 1, 'ACTIVE') - - # GPU latency is not sensitive to these settings. No need to test many combinations. - # Skip remaining settings for GPU without --all flag. - if test_setting.use_gpu and not test_all: - return + candidate_threads = list(set([logical_cores, cpu_count])) + for i in range(1, min(16, logical_cores)): + if i not in candidate_threads: + candidate_threads.append(i) + candidate_threads.sort(reverse=True) for intra_op_num_threads in candidate_threads: - for omp_num_threads in candidate_threads: - # skip settings that are very slow - if intra_op_num_threads == 1 and omp_num_threads == 1 and logical_cores != 1: - continue - - # When logical and physical cores are not the same, there are many combinations. - # Remove some settings are not good normally. - if logical_cores > cpu_count: - if omp_num_threads == logical_cores and intra_op_num_threads != 1: - continue - if intra_op_num_threads == logical_cores and omp_num_threads != 1: - continue - - if not test_all: - if intra_op_num_threads != 1 and omp_num_threads != 1: - continue - - for omp_wait_policy in ['ACTIVE', 'PASSIVE']: - launch_test(model_setting, test_setting, perf_results, all_inputs, intra_op_num_threads, - omp_num_threads, omp_wait_policy) - - -def run_performance(model_setting, test_setting, perf_results, test_all): + launch_test(model_setting, test_setting, perf_results, all_inputs, intra_op_num_threads) + +def run_performance(model_setting, test_setting, perf_results): input_ids, segment_ids, input_mask = get_bert_inputs(model_setting.model_path, model_setting.input_ids_name, model_setting.segment_ids_name, model_setting.input_mask_name) @@ -327,29 +187,25 @@ def run_performance(model_setting, test_setting, perf_results, test_all): segment_ids, input_mask, random_mask_length=False) - if test_setting.contiguous: - all_inputs, contiguous_latency = get_contiguous_inputs(all_inputs) - print("Extra latency for converting inputs to contiguous: {} ms".format(format(contiguous_latency, '.2f'))) - test_setting.extra_latency = contiguous_latency if test_setting.inclusive else 0 - run_perf_tests(model_setting, test_setting, perf_results, test_all, all_inputs) + run_perf_tests(model_setting, test_setting, perf_results, all_inputs) def parse_arguments(): parser = argparse.ArgumentParser() parser.add_argument('--model', required=True, type=str, help="bert onnx model path") - parser.add_argument('--batch_size', + parser.add_argument('-b', '--batch_size', required=True, type=int, nargs="+", help="batch size of input. Allow one or multiple values in the range of [1, 128].") - parser.add_argument('--sequence_length', required=True, type=int, help="maximum sequence length of input") + parser.add_argument('-s', '--sequence_length', required=True, type=int, help="maximum sequence length of input") parser.add_argument('--samples', required=False, type=int, default=10, help="number of samples to be generated") - parser.add_argument('--test_times', + parser.add_argument('-t', '--test_times', required=False, type=int, default=0, @@ -375,40 +231,12 @@ def parse_arguments(): parser.add_argument('--use_gpu', required=False, action='store_true', help="use GPU") parser.set_defaults(use_gpu=False) - parser.add_argument('--inclusive', - required=False, - action='store_true', - help="include the latency of converting array to contiguous") - parser.set_defaults(inclusive=False) - - parser.add_argument('--all', required=False, action='store_true', help="test all candidate settings") - parser.set_defaults(all=False) - - parser.add_argument('--omp_num_threads', - required=False, - type=int, - default=None, - help=">0, set OMP_NUM_THREADS value. 0, do not set") - - parser.add_argument('--intra_op_num_threads', + parser.add_argument('-n', '--intra_op_num_threads', required=False, type=int, default=None, help=">=0, set intra_op_num_threads") - parser.add_argument('--omp_wait_policy', - required=False, - type=str, - default=None, - choices=['ACTIVE', 'PASSIVE'], - help="OMP_WAIT_POLICY") - - parser.add_argument('--contiguous', required=False, action='store_true', help="contiguous input") - parser.set_defaults(contiguous=False) - - parser.add_argument('--no_warmup', required=False, action='store_true', help="do not use one sample for warm-up.") - parser.set_defaults(no_warmup=False) - parser.add_argument('--input_ids_name', required=False, type=str, default=None, help="input name for input ids") parser.add_argument('--segment_ids_name', required=False, type=str, default=None, help="input name for segment ids") parser.add_argument('--input_mask_name', @@ -443,18 +271,13 @@ def main(): args.sequence_length, args.samples, args.test_times, - None, #contiguous args.use_gpu, - not args.no_warmup, - args.omp_num_threads, - args.omp_wait_policy, args.intra_op_num_threads, args.seed, - args.verbose, - args.contiguous, - args.inclusive) + args.verbose) + print("test setting", test_setting) - run_performance(model_setting, test_setting, perf_results, args.all) + run_performance(model_setting, test_setting, perf_results) # Sort the results so that the first one has smallest latency. sorted_results = sorted(perf_results.items(), reverse=False, key=lambda x: x[1]) diff --git a/onnxruntime/python/tools/transformers/bert_test_data.py b/onnxruntime/python/tools/transformers/bert_test_data.py index c2e4435977..5e008db16c 100644 --- a/onnxruntime/python/tools/transformers/bert_test_data.py +++ b/onnxruntime/python/tools/transformers/bert_test_data.py @@ -140,7 +140,8 @@ def generate_test_data(batch_size, sequence_length, test_cases, seed, verbose, i def get_graph_input_from_embed_node(onnx_model, embed_node, input_index): - assert input_index < len(embed_node.input) + if input_index >= len(embed_node.input): + return None input = embed_node.input[input_index] graph_input = onnx_model.find_graph_input(input) @@ -195,6 +196,15 @@ def find_bert_inputs(onnx_model, input_ids_name=None, segment_ids_name=None, inp input_ids = get_graph_input_from_embed_node(onnx_model, embed_node, 0) segment_ids = get_graph_input_from_embed_node(onnx_model, embed_node, 1) input_mask = get_graph_input_from_embed_node(onnx_model, embed_node, 7) + + if input_mask is None: + for input in graph_inputs: + input_name_lower = input.name.lower() + if "mask" in input_name_lower: + input_mask = input + if input_mask is None: + raise ValueError(f"Failed to find attention mask input") + return input_ids, segment_ids, input_mask # Try guess the inputs based on naming. @@ -231,7 +241,7 @@ def get_bert_inputs(onnx_file, input_ids_name=None, segment_ids_name=None, input model.ParseFromString(f.read()) onnx_model = OnnxModel(model) - find_bert_inputs(onnx_model, input_ids_name, segment_ids_name, input_mask_name) + return find_bert_inputs(onnx_model, input_ids_name, segment_ids_name, input_mask_name) def parse_arguments(): diff --git a/onnxruntime/python/tools/transformers/compare_bert_results.py b/onnxruntime/python/tools/transformers/compare_bert_results.py index c1dec79092..5837581893 100644 --- a/onnxruntime/python/tools/transformers/compare_bert_results.py +++ b/onnxruntime/python/tools/transformers/compare_bert_results.py @@ -21,19 +21,17 @@ from datetime import datetime from onnx import ModelProto, TensorProto, numpy_helper from onnx_model import OnnxModel from bert_test_data import get_bert_inputs, generate_test_data, output_test_data -from bert_perf_test import create_session, onnxruntime_inference, setup_openmp_environ +from bert_perf_test import create_session, onnxruntime_inference -def run_model(model_path, all_inputs, use_gpu, use_openmp, disable_optimization): - # Import onnxruntime shall be after OpenMP environment variable setting. - # So we put import here to delay importing. +def run_model(model_path, all_inputs, use_gpu, disable_optimization): import onnxruntime graph_optimization_level = None if disable_optimization: graph_optimization_level = onnxruntime.GraphOptimizationLevel.ORT_DISABLE_ALL - intra_op_num_threads = 1 if use_openmp else psutil.cpu_count(logical=False) + intra_op_num_threads = psutil.cpu_count(logical=False) session = create_session(model_path, use_gpu, intra_op_num_threads, graph_optimization_level) @@ -78,7 +76,7 @@ def compare(baseline_results, treatment_results, verbose, rtol=1e-3, atol=1e-4): def run_test(baseline_model, optimized_model, output_dir, batch_size, sequence_length, use_gpu, test_cases, seed, - use_openmp, verbose, rtol, atol, input_ids_name, segment_ids_name, input_mask_name): + verbose, rtol, atol, input_ids_name, segment_ids_name, input_mask_name): # Try deduce input names from optimized model. input_ids, segment_ids, input_mask = get_bert_inputs(optimized_model, input_ids_name, segment_ids_name, @@ -95,16 +93,9 @@ def run_test(baseline_model, optimized_model, output_dir, batch_size, sequence_l input_mask, random_mask_length=True) - # OpenMP environment variables must be set before the very first "import onnxruntime" - if use_openmp: - setup_openmp_environ(omp_num_threads=psutil.cpu_count(logical=False), omp_wait_policy='ACTIVE') - else: - setup_openmp_environ(omp_num_threads=1, omp_wait_policy='ACTIVE') - baseline_results, baseline_latency, output_names = run_model(baseline_model, all_inputs, use_gpu, - use_openmp, disable_optimization=True) if verbose: print("baseline average latency (all optimizations disabled): {} ms".format( @@ -117,7 +108,6 @@ def run_test(baseline_model, optimized_model, output_dir, batch_size, sequence_l treatment_results, treatment_latency, treatment_output_names = run_model(optimized_model, all_inputs, use_gpu, - use_openmp, disable_optimization=False) if verbose: print("treatment average latency: {} ms".format(statistics.mean(treatment_latency) * 1000)) @@ -157,9 +147,6 @@ def parse_arguments(): parser.add_argument('--use_gpu', required=False, action='store_true', help="use GPU") parser.set_defaults(use_gpu=False) - parser.add_argument('--openmp', required=False, action='store_true', help="use openmp") - parser.set_defaults(openmp=False) - parser.add_argument('--verbose', required=False, action='store_true', help="print verbose information") parser.set_defaults(verbose=False) @@ -180,7 +167,7 @@ def main(): path.mkdir(parents=True, exist_ok=True) run_test(args.baseline_model, args.optimized_model, args.output_dir, args.batch_size, args.sequence_length, - args.use_gpu, args.samples, args.seed, args.openmp, args.verbose, args.rtol, args.atol, args.input_ids, + args.use_gpu, args.samples, args.seed, args.verbose, args.rtol, args.atol, args.input_ids, args.segment_ids, args.input_mask) diff --git a/onnxruntime/python/tools/transformers/convert_to_onnx.py b/onnxruntime/python/tools/transformers/convert_to_onnx.py index 7b2267905d..e88e4c5dff 100644 --- a/onnxruntime/python/tools/transformers/convert_to_onnx.py +++ b/onnxruntime/python/tools/transformers/convert_to_onnx.py @@ -23,6 +23,7 @@ import torch import numpy import json from pathlib import Path +from packaging import version from transformers import AutoConfig from gpt2_helper import Gpt2Helper, MODEL_CLASSES, DEFAULT_TOLERANCE, PRETRAINED_GPT2_MODELS from gpt2_tester import Gpt2Tester @@ -104,6 +105,10 @@ def parse_arguments(): def main(): + from transformers import __version__ as transformers_version + if version.parse(transformers_version) < version.parse("3.1.0"): # past_key_values name does not exist in 3.0.2 or older + raise RuntimeError("This tool requires transformers 3.1.0 or later.") + args = parse_arguments() setup_logger(args.verbose) diff --git a/onnxruntime/python/tools/transformers/dev_benchmark.cmd b/onnxruntime/python/tools/transformers/dev_benchmark.cmd index 61553d8f2d..3f0b397a14 100644 --- a/onnxruntime/python/tools/transformers/dev_benchmark.cmd +++ b/onnxruntime/python/tools/transformers/dev_benchmark.cmd @@ -7,10 +7,9 @@ REM Please install PyTorch (see https://pytorch.org/) before running this benchm REM GPU: conda install pytorch torchvision cudatoolkit=10.1 -c pytorch REM CPU: conda install pytorch torchvision cpuonly -c pytorch -REM When run_cli=true, this script is self-contained and you need not copy other files to run benchmarks -REM it will use onnxruntime-tools package. -REM If run_cli=false, it depends on other python script (*.py) files in this directory. -set run_cli=false +REM When use_package=true, you need not copy other files to run benchmarks except this sh file. +REM Otherwise, it will use python script (*.py) files in this directory. +set use_package=false REM only need once set run_install=false @@ -72,13 +71,12 @@ if %run_install% == true ( ) pip install --upgrade onnxconverter_common - pip install --upgrade onnxruntime-tools - pip install --upgrade git+https://github.com/huggingface/transformers + pip install --upgrade transformers ) -if %run_cli% == true ( - echo Use onnxruntime_tools.transformers.benchmark - set optimizer_script=-m onnxruntime_tools.transformers.benchmark +if %use_package% == true ( + echo Use onnxruntime.transformers.benchmark + set optimizer_script=-m onnxruntime.transformers.benchmark ) else ( set optimizer_script=benchmark.py ) diff --git a/onnxruntime/python/tools/transformers/gpt2_helper.py b/onnxruntime/python/tools/transformers/gpt2_helper.py index 5490c7267a..8079d6277b 100644 --- a/onnxruntime/python/tools/transformers/gpt2_helper.py +++ b/onnxruntime/python/tools/transformers/gpt2_helper.py @@ -31,7 +31,7 @@ class GPT2ModelNoPastState(GPT2Model): super().__init__(config) def forward(self, input_ids): - return super().forward(input_ids, use_cache=False) + return super().forward(input_ids, use_cache=False, return_dict=False) class MyGPT2Model(GPT2Model): @@ -40,11 +40,26 @@ class MyGPT2Model(GPT2Model): def __init__(self, config): super().__init__(config) + @staticmethod + def post_process(result, num_layer): + if isinstance(result[1][0], tuple) or isinstance(result[1][0], list): + assert len(result[1]) == num_layer and len(result[1][0]) == 2 #and len(result[1][0][0].shape) == 4 and result[1][0][0].shape == result[1][0][1].shape + present = [] + for i in range(num_layer): + # Since transformers v4.*, past key and values are separated outputs. + # Here we concate them into one tensor to be compatible with Attention operator. + present.append(torch.cat((result[1][i][0].unsqueeze(0), result[1][i][1].unsqueeze(0)), dim=0)) + return (result[0], tuple(present)) + + return result + def forward(self, input_ids, position_ids, attention_mask, *past): - return super().forward(input_ids, - position_ids=position_ids, - attention_mask=attention_mask, - past_key_values=past) + result = super().forward(input_ids, + position_ids=position_ids, + attention_mask=attention_mask, + past_key_values=past, + return_dict=False) + return MyGPT2Model.post_process(result, self.config.n_layer) class MyGPT2LMHeadModel(GPT2LMHeadModel): @@ -54,10 +69,13 @@ class MyGPT2LMHeadModel(GPT2LMHeadModel): super().__init__(config) def forward(self, input_ids, position_ids, attention_mask, *past): - return super().forward(input_ids, - position_ids=position_ids, - attention_mask=attention_mask, - past_key_values=past) + result = super().forward(input_ids, + position_ids=position_ids, + attention_mask=attention_mask, + past_key_values=past, + return_dict=False) + + return MyGPT2Model.post_process(result, self.config.n_layer) class MyGPT2LMHeadModel_NoPadding(GPT2LMHeadModel): @@ -216,6 +234,7 @@ class Gpt2Helper: is_all_close = is_close num_layers = len(ort_outputs) - 1 + for layer in range(num_layers): is_close = numpy.allclose(ort_outputs[1 + layer], torch_outputs[1][layer].cpu().numpy(), @@ -288,10 +307,12 @@ class Gpt2Helper: input_names.append('attention_mask') input_names.extend(past_names) + assert len(outputs) == 2 and len(outputs[1]) == num_layer + logger.info( f"Shapes: input_ids={dummy_inputs.input_ids.shape} past={dummy_inputs.past[0].shape} output={outputs[0].shape} present={outputs[1][0].shape}" ) - + Path(onnx_model_path).parent.mkdir(parents=True, exist_ok=True) torch.onnx.export(model, diff --git a/onnxruntime/python/tools/transformers/huggingface_models.py b/onnxruntime/python/tools/transformers/huggingface_models.py index 3668fe0515..1f4a1c9fa2 100644 --- a/onnxruntime/python/tools/transformers/huggingface_models.py +++ b/onnxruntime/python/tools/transformers/huggingface_models.py @@ -26,67 +26,44 @@ MODELS = { "bert-base-uncased": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), "bert-large-uncased": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), "bert-base-cased": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), - "bert-large-cased": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), - "bert-base-multilingual-uncased": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), - "bert-base-multilingual-cased": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), - "bert-base-chinese": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), - "bert-base-german-cased": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), - "bert-large-uncased-whole-word-masking": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), - "bert-large-cased-whole-word-masking": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), "bert-large-uncased-whole-word-masking-finetuned-squad": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), - "bert-large-cased-whole-word-masking-finetuned-squad": (["input_ids", "attention_mask", - "token_type_ids"], 11, False, "bert"), "bert-base-cased-finetuned-mrpc": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), - "bert-base-german-dbmdz-cased": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), - "bert-base-german-dbmdz-uncased": (["input_ids", "attention_mask", "token_type_ids"], 11, False, "bert"), - # todo: more models to add - # GPT - "openai-gpt": (["input_ids"], 11, False, "gpt2"), # no past state inputs - # GPT-2 - "gpt2": (["input_ids"], 11, False, "gpt2"), # no past state inputs & outputs + + # GPT (no past state) + "openai-gpt": (["input_ids"], 11, False, "gpt2"), + # GPT-2 (no past state, use benchmark_gpt2.py for past_key_values) + "gpt2": (["input_ids"], 11, False, "gpt2"), "gpt2-medium": (["input_ids"], 11, False, "gpt2"), - "gpt2-large": - (["input_ids"], 11, True, - "gpt2"), # Model>2GB. Need use_external_data_format=True to export it. No past state inputs for GPT models. + "gpt2-large": (["input_ids"], 11, True, "gpt2"), "gpt2-xl": (["input_ids"], 11, True, "gpt2"), - "distilgpt2": (["input_ids"], 11, False, "gpt2"), # no past state inputs & outputs + "distilgpt2": (["input_ids"], 11, False, "gpt2"), # Transformer-XL #"transfo-xl-wt103": (["input_ids"], 11, False, "bert"), # XLNet - #"xlnet-base-cased": (["input_ids"], 12, False, "bert"), # Models uses Einsum, which need opset version 12 and PyTorch 1.5.0 or above. - #"xlnet-large-cased": (["input_ids"], 12, False, "bert"), # Models uses Einsum, which need opset version 12 and PyTorch 1.5.0 or above. + "xlnet-base-cased": (["input_ids"], 12, False, "bert"), + "xlnet-large-cased": (["input_ids"], 12, False, "bert"), # XLM "xlm-mlm-en-2048": (["input_ids"], 11, True, "bert"), "xlm-mlm-ende-1024": (["input_ids"], 11, False, "bert"), "xlm-mlm-enfr-1024": (["input_ids"], 11, False, "bert"), - "xlm-mlm-enro-1024": (["input_ids"], 11, False, "bert"), - "xlm-mlm-xnli15-1024": (["input_ids"], 11, False, "bert"), - "xlm-mlm-tlm-xnli15-1024": (["input_ids"], 11, False, "bert"), - "xlm-clm-enfr-1024": (["input_ids"], 11, False, "bert"), - "xlm-clm-ende-1024": (["input_ids"], 11, False, "bert"), - "xlm-mlm-17-1280": (["input_ids"], 11, True, "bert"), - "xlm-mlm-100-1280": (["input_ids"], 11, True, "bert"), + # XML Roberta + "xlm-roberta-base": (["input_ids"], 12, False, "bert"), # RoBERTa "roberta-base": (["input_ids", "attention_mask"], 11, False, "bert"), "roberta-large": (["input_ids", "attention_mask"], 11, False, "bert"), "roberta-large-mnli": (["input_ids", "attention_mask"], 11, False, "bert"), + "deepset/roberta-base-squad2": (["input_ids", "attention_mask"], 11, False, "bert"), "distilroberta-base": (["input_ids", "attention_mask"], 11, False, "bert"), - "roberta-base-openai-detector": (["input_ids", "attention_mask"], 11, False, "bert"), - "roberta-large-openai-detector": (["input_ids", "attention_mask"], 11, False, "bert"), + # DistilBERT "distilbert-base-uncased": (["input_ids", "attention_mask"], 11, False, "bert"), "distilbert-base-uncased-distilled-squad": (["input_ids", "attention_mask"], 11, False, "bert"), - "distilbert-base-cased": (["input_ids", "attention_mask"], 11, False, "bert"), - "distilbert-base-cased-distilled-squad": (["input_ids", "attention_mask"], 11, False, "bert"), - "distilbert-base-german-cased": (["input_ids", "attention_mask"], 11, False, "bert"), - "distilbert-base-multilingual-cased": (["input_ids", "attention_mask"], 11, False, "bert"), # CTRL "ctrl": (["input_ids"], 11, True, "bert"), # CamemBERT "camembert-base": (["input_ids"], 11, False, "bert"), # ALBERT - # Models uses Einsum, which need opset version 12 and PyTorch 1.5.0 or above. "albert-base-v1": (["input_ids"], 12, False, "bert"), "albert-large-v1": (["input_ids"], 12, False, "bert"), "albert-xlarge-v1": (["input_ids"], 12, True, "bert"), @@ -95,36 +72,37 @@ MODELS = { "albert-large-v2": (["input_ids"], 12, False, "bert"), "albert-xlarge-v2": (["input_ids"], 12, True, "bert"), #"albert-xxlarge-v2": (["input_ids"], 12, True, "bert"), - # T5 - "t5-small": (["input_ids"], 12, False, "bert"), - "t5-base": (["input_ids"], 12, False, "bert"), - "t5-large": (["input_ids"], 12, True, "bert"), - "t5-3b": (["input_ids"], 12, True, "bert"), - "t5-11b": (["input_ids"], 12, True, "bert"), + # T5 (use benchmark_t5.py instead) + #"t5-small": (["input_ids"], 12, False, "bert"), + #"t5-base": (["input_ids"], 12, False, "bert"), + #"t5-large": (["input_ids"], 12, True, "bert"), + #"t5-3b": (["input_ids"], 12, True, "bert"), + #"t5-11b": (["input_ids"], 12, True, "bert"), + #"valhalla/t5-small-qa-qg-hl": (["input_ids"], 12, True, "bert"), # XLM-RoBERTa "xlm-roberta-base": (["input_ids"], 11, False, "bert"), "xlm-roberta-large": (["input_ids"], 11, True, "bert"), # FlauBERT "flaubert/flaubert_small_cased": (["input_ids"], 11, False, "bert"), - "flaubert/flaubert_base_uncased": (["input_ids"], 11, False, "bert"), + #"flaubert/flaubert_base_uncased": (["input_ids"], 11, False, "bert"), "flaubert/flaubert_base_cased": (["input_ids"], 11, False, "bert"), - "flaubert/flaubert_large_cased": (["input_ids"], 11, False, "bert"), + #"flaubert/flaubert_large_cased": (["input_ids"], 11, False, "bert"), # Bart "facebook/bart-large": (["input_ids"], 11, False, "bert"), "facebook/bart-base": (["input_ids"], 11, False, "bert"), "facebook/bart-large-mnli": (["input_ids"], 11, False, "bert"), "facebook/bart-large-cnn": (["input_ids"], 11, False, "bert"), - #"facebook/mbart-large-en-ro": (["input_ids"], 11, True, "bert"), + # DialoGPT "microsoft/DialoGPT-small": (["input_ids"], 11, False, "gpt2"), "microsoft/DialoGPT-medium": (["input_ids"], 11, False, "gpt2"), - "microsoft/DialoGPT-large": (["input_ids"], 11, True, "gpt2"), + #"microsoft/DialoGPT-large": (["input_ids"], 11, True, "gpt2"), # Reformer #"google/reformer-enwik8": (["input_ids"], 11, False, "bert"), #"google/reformer-crime-and-punishment": (["input_ids"], 11, False, "bert"), # MarianMT #"Helsinki-NLP/opus-mt-ROMANCE-en": (["input_ids"], 12, False, "bert"), - # Longformer + # Longformer (use benchmark_longformer.py instead) #"allenai/longformer-base-4096": (["input_ids"], 12, False, "bert"), #"allenai/longformer-large-4096": (["input_ids"], 12, False, "bert"), } diff --git a/onnxruntime/python/tools/transformers/run_benchmark.sh b/onnxruntime/python/tools/transformers/run_benchmark.sh index 2cbf29d07a..05be3c560e 100644 --- a/onnxruntime/python/tools/transformers/run_benchmark.sh +++ b/onnxruntime/python/tools/transformers/run_benchmark.sh @@ -5,13 +5,12 @@ # -------------------------------------------------------------------------- # This measures the performance of OnnxRuntime, PyTorch and TorchScript on transformer models. # Please install PyTorch (see https://pytorch.org/) before running this benchmark. Like the following: -# GPU: conda install pytorch torchvision cudatoolkit=10.1 -c pytorch +# GPU: conda install pytorch torchvision cudatoolkit=11.0 -c pytorch # CPU: conda install pytorch torchvision cpuonly -c pytorch -# When run_cli=true, this script is self-contained and you need not copy other files to run benchmarks -# it will use onnxruntime-tools package. -# If run_cli=false, it depends on other python script (*.py) files in this directory. -run_cli=true +# When use_package=true, you need not copy other files to run benchmarks except this sh file. +# Otherwise, it will use python script (*.py) files in this directory. +use_package=true # only need once run_install=true @@ -50,7 +49,7 @@ sequence_lengths="8 16 32 64 128 256 512 1024" input_counts=1 # Pretrained transformers models can be a subset of: bert-base-cased roberta-base gpt2 distilgpt2 distilbert-base-uncased -models_to_test="bert-base-cased roberta-base gpt2" +models_to_test="bert-base-cased roberta-base distilbert-base-uncased" # If you have mutliple GPUs, you can choose one GPU for test. Here is an example to use the second GPU: # export CUDA_VISIBLE_DEVICES=1 @@ -81,7 +80,7 @@ fi if [ "$run_install" = true ] ; then - pip uninstall --yes ort_nightly + pip uninstall --yes ort-nightly ort-gpu-nightly pip uninstall --yes onnxruntime pip uninstall --yes onnxruntime-gpu if [ "$run_cpu_fp32" = true ] || [ "$run_cpu_int8" = true ]; then @@ -89,14 +88,12 @@ if [ "$run_install" = true ] ; then else pip install onnxruntime-gpu fi - pip install --upgrade onnxconverter_common - pip install --upgrade onnxruntime-tools - pip install --upgrade transformers + pip install --upgrade onnx coloredlogs packaging psutil py3nvml onnxconverter_common numpy transformers fi -if [ "$run_cli" = true ] ; then - echo "Use onnxruntime_tools.transformers.benchmark" - benchmark_script="-m onnxruntime_tools.transformers.benchmark" +if [ "$use_package" = true ] ; then + echo "Use onnxruntime.transformers.benchmark" + benchmark_script="-m onnxruntime.transformers.benchmark" else benchmark_script="benchmark.py" fi @@ -187,4 +184,4 @@ fi # Remove duplicated lines awk '!x[$0]++' ./result.csv > summary_result.csv awk '!x[$0]++' ./fusion.csv > summary_fusion.csv -awk '!x[$0]++' ./detail.csv > summary_detail.csv \ No newline at end of file +awk '!x[$0]++' ./detail.csv > summary_detail.csv diff --git a/onnxruntime/python/tools/transformers/test/test_gpt2.py b/onnxruntime/python/tools/transformers/test/test_gpt2.py index 4f5ca65363..cb6b680af5 100644 --- a/onnxruntime/python/tools/transformers/test/test_gpt2.py +++ b/onnxruntime/python/tools/transformers/test/test_gpt2.py @@ -26,7 +26,7 @@ class TestGpt2(unittest.TestCase): def test_gpt2_fp16(self): if 'CUDAExecutionProvider' in onnxruntime.get_available_providers(): - self.run_benchmark_gpt2('-m gpt2 --precision fp16 -o -b 1 -s 128') + self.run_benchmark_gpt2('-m gpt2 --precision fp16 -o -b 1 -s 128 --use_gpu') def test_gpt2_int8(self): self.run_benchmark_gpt2('-m gpt2 --precision int8 -o -b 1 -s 128') From 40fa40f3ce7419a093467c70dc8ff8fcfed9335f Mon Sep 17 00:00:00 2001 From: Weixing Zhang Date: Wed, 24 Feb 2021 15:20:50 -0800 Subject: [PATCH 27/37] Enable more unit tests for ROCM EP (#6776) * enable more ops and unit tests for ROCM EP --- .../providers/rocm/rocm_execution_provider.cc | 106 +++++--- .../training_ops/cuda/math/div_grad.cc | 4 +- .../training_ops/rocm/math/div_grad.cc | 244 ++++++++++++++++++ .../rocm/rocm_training_kernels.cc | 6 +- tools/ci_build/amd_hipify.py | 41 --- .../github/pai/pai-excluded-tests.txt | 35 +-- 6 files changed, 317 insertions(+), 119 deletions(-) create mode 100644 orttraining/orttraining/training_ops/rocm/math/div_grad.cc diff --git a/onnxruntime/core/providers/rocm/rocm_execution_provider.cc b/onnxruntime/core/providers/rocm/rocm_execution_provider.cc index e07de1fc34..9f020477eb 100644 --- a/onnxruntime/core/providers/rocm/rocm_execution_provider.cc +++ b/onnxruntime/core/providers/rocm/rocm_execution_provider.cc @@ -674,7 +674,7 @@ class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, MLFloat16, ArgMin); class ONNX_OPERATOR_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, Compress); class ONNX_OPERATOR_VERSIONED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, 12, Concat); -class ONNX_OPERATOR_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, Flatten); +class ONNX_OPERATOR_VERSIONED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, 12, Flatten); class ONNX_OPERATOR_VERSIONED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, 12, Gather); class ONNX_OPERATOR_VERSIONED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, 12, GatherElements); class ONNX_OPERATOR_VERSIONED_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, 12, float, Gemm); @@ -767,7 +767,7 @@ class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 10, uint8_t, QuantizeLinear); class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 10, int8_t, DequantizeLinear); class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 10, uint8_t, DequantizeLinear); -class ONNX_OPERATOR_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, CumSum); +class ONNX_OPERATOR_VERSIONED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, 13, CumSum); class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, int64_t_int64_t_int64_t, OneHot); class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, int64_t_float_int64_t, OneHot); class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, int32_t_float_int32_t, OneHot); @@ -775,7 +775,7 @@ class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 11, int32_t_MLFloat16_int32_t, OneHot); // OpSet 12 -class ONNX_OPERATOR_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 12, Clip); +class ONNX_OPERATOR_VERSIONED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 12, 12, Clip); class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 12, float, MaxPool); class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 12, double, MaxPool); @@ -989,6 +989,19 @@ class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, MLFloat16, ReduceSumSquare); class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, int64_t, GatherND); class ONNX_OPERATOR_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, Dropout); +class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, float, Resize); +class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, double, Resize); +class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, MLFloat16, Resize); +class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, int32_t, Resize); +class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, uint8_t, Resize); +class ONNX_OPERATOR_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, If); +class ONNX_OPERATOR_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, Loop); +class ONNX_OPERATOR_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, Flatten); +class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, float, LRN); +class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, double, LRN); +class ONNX_OPERATOR_TYPED_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, MLFloat16, LRN); +class ONNX_OPERATOR_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, Identity); +class ONNX_OPERATOR_KERNEL_CLASS_NAME(kRocmExecutionProvider, kOnnxDomain, 13, ScatterND); template <> KernelCreateInfo BuildKernelCreateInfo() { @@ -1252,9 +1265,9 @@ static Status RegisterRocmKernels(KernelRegistry& kernel_registry) { BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, @@ -1277,26 +1290,26 @@ static Status RegisterRocmKernels(KernelRegistry& kernel_registry) { BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, @@ -1307,7 +1320,7 @@ static Status RegisterRocmKernels(KernelRegistry& kernel_registry) { BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, @@ -1328,7 +1341,7 @@ static Status RegisterRocmKernels(KernelRegistry& kernel_registry) { // BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, @@ -1338,12 +1351,12 @@ static Status RegisterRocmKernels(KernelRegistry& kernel_registry) { // BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, @@ -1361,9 +1374,9 @@ static Status RegisterRocmKernels(KernelRegistry& kernel_registry) { BuildKernelCreateInfo, // BuildKernelCreateInfo, BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, BuildKernelCreateInfo, // BuildKernelCreateInfo, BuildKernelCreateInfo, @@ -1372,7 +1385,7 @@ static Status RegisterRocmKernels(KernelRegistry& kernel_registry) { // BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, BuildKernelCreateInfo, // BuildKernelCreateInfo, BuildKernelCreateInfo, @@ -1411,7 +1424,7 @@ static Status RegisterRocmKernels(KernelRegistry& kernel_registry) { // BuildKernelCreateInfo, BuildKernelCreateInfo, // BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, @@ -1442,17 +1455,17 @@ static Status RegisterRocmKernels(KernelRegistry& kernel_registry) { // BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, + BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, @@ -1460,7 +1473,7 @@ static Status RegisterRocmKernels(KernelRegistry& kernel_registry) { // BuildKernelCreateInfo, // OpSet 12 - // BuildKernelCreateInfo, + BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, @@ -1674,6 +1687,19 @@ static Status RegisterRocmKernels(KernelRegistry& kernel_registry) { BuildKernelCreateInfo, // BuildKernelCreateInfo, // BuildKernelCreateInfo, + // BuildKernelCreateInfo, + // BuildKernelCreateInfo, + // BuildKernelCreateInfo, + // BuildKernelCreateInfo, + // BuildKernelCreateInfo, + // BuildKernelCreateInfo, + // BuildKernelCreateInfo, + // BuildKernelCreateInfo, + // BuildKernelCreateInfo, + // BuildKernelCreateInfo, + // BuildKernelCreateInfo, + // BuildKernelCreateInfo, + // BuildKernelCreateInfo, }; for (auto& function_table_entry : function_table) { diff --git a/orttraining/orttraining/training_ops/cuda/math/div_grad.cc b/orttraining/orttraining/training_ops/cuda/math/div_grad.cc index 75477dcc93..21b3dd9c8d 100644 --- a/orttraining/orttraining/training_ops/cuda/math/div_grad.cc +++ b/orttraining/orttraining/training_ops/cuda/math/div_grad.cc @@ -1,8 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -#include "div_grad.h" -#include "div_grad_impl.h" +#include "orttraining/training_ops/cuda/math/div_grad.h" +#include "orttraining/training_ops/cuda/math/div_grad_impl.h" #include "core/providers/cuda/math/binary_elementwise_ops.h" using namespace onnxruntime::common; diff --git a/orttraining/orttraining/training_ops/rocm/math/div_grad.cc b/orttraining/orttraining/training_ops/rocm/math/div_grad.cc new file mode 100644 index 0000000000..dae76670b6 --- /dev/null +++ b/orttraining/orttraining/training_ops/rocm/math/div_grad.cc @@ -0,0 +1,244 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "orttraining/training_ops/rocm/math/div_grad.h" +#include "orttraining/training_ops/rocm/math/div_grad_impl.h" +#include "core/providers/rocm/math/binary_elementwise_ops.h" + +using namespace onnxruntime::common; +namespace onnxruntime { +namespace rocm { + +#define DIVGRAD_REGISTER_KERNEL_TYPED(T) \ + ONNX_OPERATOR_TYPED_KERNEL_EX( \ + DivGrad, \ + kMSDomain, \ + 1, \ + T, \ + kRocmExecutionProvider, \ + KernelDefBuilder().TypeConstraint("T", DataTypeImpl::GetTensorType()), \ + DivGrad); + +DIVGRAD_REGISTER_KERNEL_TYPED(MLFloat16) +DIVGRAD_REGISTER_KERNEL_TYPED(float) +// DIVGRAD_REGISTER_KERNEL_TYPED(double) + +std::vector prepended_dimension_1(const TensorShape& shape, size_t total_rank) { + size_t input_rank = shape.NumDimensions(); + if (input_rank == total_rank) + return shape.GetDims(); + + std::vector dims(total_rank, 1); + + // https://github.com/onnx/onnx/blob/master/docs/Broadcasting.md + // for property 3 of Multidirectional Broadcasting, we need to prepended with a dimension of length 1. + if (input_rank > 0) + std::copy(shape.GetDims().begin(), shape.GetDims().end(), &dims[total_rank - input_rank]); + return dims; +} + +template +Status DivGrad::ComputeInternal(OpKernelContext* context) const { + typedef typename ToHipType::MappedType HipT; + + const Tensor* dy_tensor = context->Input(0); + const Tensor* a_tensor = context->Input(1); + const Tensor* b_tensor = context->Input(2); + const TensorShape& a_shape = a_tensor->Shape(); + const TensorShape& b_shape = b_tensor->Shape(); + const TensorShape& dy_shape = dy_tensor->Shape(); + + // output shapes shall match its corresponding inputs + Tensor* da_output_tensor = context->Output(0, a_shape); + Tensor* db_output_tensor = context->Output(1, b_shape); + if (!da_output_tensor && !db_output_tensor) + return Status::OK(); + + BinaryElementwisePreparation prepare; + ORT_RETURN_IF_ERROR(BinaryElementwiseBroadcastPrepare(a_tensor, b_tensor, + // TODO: BinaryElementwiseBroadcastPrepare shall take dy_tensor as const Tensor*. + const_cast(dy_tensor), &prepare)); + const HipT* prepare_a_data = reinterpret_cast(prepare.lhs_tensor->template Data()); + const HipT* prepare_b_data = reinterpret_cast(prepare.rhs_tensor->template Data()); + const HipT* prepare_dy_data = reinterpret_cast(prepare.output_tensor->template Data()); + T* da_data = da_output_tensor ? da_output_tensor->template MutableData() : nullptr; + T* db_data = db_output_tensor ? db_output_tensor->template MutableData() : nullptr; + + switch (prepare.output_rank_or_simple_broadcast) { + case static_cast(SimpleBroadcast::NoBroadcast): + ImplDivGradSimple( + Stream(), + SimpleBroadcast::NoBroadcast, + prepare_a_data, + prepare_b_data, + prepare_dy_data, + dy_shape.Size(), + reinterpret_cast(da_data), + reinterpret_cast(db_data)); + break; + case static_cast(SimpleBroadcast::LeftScalar): { + T* temp_da_data = nullptr; + IAllocatorUniquePtr temp_da_allocator; + if (da_output_tensor) { + temp_da_allocator = GetScratchBuffer(dy_shape.Size()); + temp_da_data = temp_da_allocator.get(); + } + + ImplDivGradSimple( + Stream(), + SimpleBroadcast::LeftScalar, + prepare_a_data, + prepare_b_data, + prepare_dy_data, + dy_shape.Size(), + reinterpret_cast(temp_da_data), + reinterpret_cast(db_data)); + + if (da_output_tensor) { + std::vector a_output_dims = prepended_dimension_1(a_shape, dy_shape.NumDimensions()); + ReduceKernelShared( + temp_da_data, + dy_shape, + da_data, + TensorShape({}), + MIOPEN_REDUCE_TENSOR_ADD, + a_output_dims); + } + break; + } + case static_cast(SimpleBroadcast::RightScalar): { + T* temp_db_data = nullptr; + IAllocatorUniquePtr temp_db_allocator; + if (db_output_tensor) { + temp_db_allocator = GetScratchBuffer(dy_shape.Size()); + temp_db_data = temp_db_allocator.get(); + } + ImplDivGradSimple( + Stream(), + SimpleBroadcast::RightScalar, + prepare_a_data, + prepare_b_data, + prepare_dy_data, + dy_shape.Size(), + reinterpret_cast(da_data), + reinterpret_cast(temp_db_data)); + + if (db_output_tensor) { + std::vector b_output_dims = prepended_dimension_1(b_shape, dy_shape.NumDimensions()); + ReduceKernelShared( + temp_db_data, + dy_shape, + db_data, + TensorShape({}), + MIOPEN_REDUCE_TENSOR_ADD, + b_output_dims); + } + break; + } + case static_cast(SimpleBroadcast::RightPerChannelBatch1): + case static_cast(SimpleBroadcast::RightPerChannelBatchN): { + T* temp_db_data = nullptr; + IAllocatorUniquePtr temp_db_allocator; + if (db_output_tensor) { + temp_db_allocator = GetScratchBuffer(dy_shape.Size()); + temp_db_data = temp_db_allocator.get(); + } + if (prepare.output_rank_or_simple_broadcast == static_cast(SimpleBroadcast::RightPerChannelBatch1)) { + // lhs(1,C,H) and rhs (C,1) + ImplDivGradRhsPerChannelBatch1( + Stream(), + prepare_a_data, + prepare_b_data, + prepare_dy_data, + dy_shape.Size(), + prepare.fdm_H, + reinterpret_cast(da_data), + reinterpret_cast(temp_db_data)); + } else { + // lhs(N,C,H) and rhs (C,1) + ImplDivGradRhsPerChannelBatchN( + Stream(), + prepare_a_data, + prepare_b_data, + prepare_dy_data, + dy_shape.Size(), + prepare.fdm_H, + prepare.fdm_C, + reinterpret_cast(da_data), + reinterpret_cast(temp_db_data)); + } + + if (db_output_tensor) { + std::vector b_output_dims = prepended_dimension_1(b_shape, dy_shape.NumDimensions()); + ReduceKernelShared( + temp_db_data, + dy_shape, + db_data, + b_shape, + MIOPEN_REDUCE_TENSOR_ADD, + b_output_dims); + } + break; + } + default: { + bool need_reduce_da = da_output_tensor && a_shape.Size() != dy_shape.Size(); + bool need_reduce_db = db_output_tensor && b_shape.Size() != dy_shape.Size(); + IAllocatorUniquePtr temp_da_allocator, temp_db_allocator; + T* da_data_ref = nullptr; + if (da_output_tensor) + if (need_reduce_da) { + temp_da_allocator = GetScratchBuffer(dy_shape.Size()); + da_data_ref = temp_da_allocator.get(); + } else { + da_data_ref = da_data; + } + T* db_data_ref = nullptr; + if (db_output_tensor) + if (need_reduce_db) { + temp_db_allocator = GetScratchBuffer(dy_shape.Size()); + db_data_ref = temp_db_allocator.get(); + } else { + db_data_ref = db_data; + } + + ImplDivGrad( + Stream(), + prepare.output_rank_or_simple_broadcast, + &prepare.lhs_padded_strides, + prepare_a_data, + &prepare.rhs_padded_strides, + prepare_b_data, + prepare_dy_data, + dy_shape.Size(), + &prepare.fdm_output_strides, + reinterpret_cast(da_data_ref), + reinterpret_cast(db_data_ref)); + + if (need_reduce_da) { + std::vector a_output_dims = prepended_dimension_1(a_shape, dy_shape.NumDimensions()); + ReduceKernelShared( + da_data_ref, + dy_shape, + da_data, + a_shape, + MIOPEN_REDUCE_TENSOR_ADD, + a_output_dims); + } + + if (need_reduce_db) { + std::vector b_output_dims = prepended_dimension_1(b_shape, dy_shape.NumDimensions()); + ReduceKernelShared( + db_data_ref, + dy_shape, + db_data, + b_shape, + MIOPEN_REDUCE_TENSOR_ADD, + b_output_dims); + } + } + } + return Status::OK(); +} + +} // namespace rocm +} // namespace onnxruntime diff --git a/orttraining/orttraining/training_ops/rocm/rocm_training_kernels.cc b/orttraining/orttraining/training_ops/rocm/rocm_training_kernels.cc index 5497666ada..74788a50ad 100644 --- a/orttraining/orttraining/training_ops/rocm/rocm_training_kernels.cc +++ b/orttraining/orttraining/training_ops/rocm/rocm_training_kernels.cc @@ -197,9 +197,9 @@ Status RegisterRocmTrainingKernels(KernelRegistry& kernel_registry) { // BuildKernelCreateInfo, // BuildKernelCreateInfo, BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, // BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, @@ -234,7 +234,7 @@ Status RegisterRocmTrainingKernels(KernelRegistry& kernel_registry) { BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, - // BuildKernelCreateInfo, + BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, BuildKernelCreateInfo, diff --git a/tools/ci_build/amd_hipify.py b/tools/ci_build/amd_hipify.py index 4816783f25..897f4b6425 100644 --- a/tools/ci_build/amd_hipify.py +++ b/tools/ci_build/amd_hipify.py @@ -79,20 +79,10 @@ provider_excluded_files = [ 'controlflow/scan.cc', 'controlflow/scan.h', 'cu_inc/common.cuh', - 'generator/constant_of_shape.cc', - 'generator/constant_of_shape.h', - 'generator/range.cc', - 'generator/range.h', - 'generator/range_impl.cu', - 'generator/range_impl.h', 'math/einsum_utils/einsum_auxiliary_ops.cc', 'math/einsum_utils/einsum_auxiliary_ops.h', 'math/einsum_utils/einsum_auxiliary_ops_diagonal.cu', 'math/einsum_utils/einsum_auxiliary_ops_diagonal.h', - 'math/cumsum.cc', - 'math/cumsum.h', - 'math/cumsum_impl.cu', - 'math/cumsum_impl.h', 'math/einsum.cc', 'math/einsum.h', 'math/gemm.cc', @@ -123,10 +113,6 @@ provider_excluded_files = [ 'nn/max_pool_with_index.h', 'nn/pool.cc', 'nn/pool.h', - 'nn/shrink.cc', - 'nn/shrink.h', - 'nn/shrink_impl.cu', - 'nn/shrink_impl.h', 'object_detection/non_max_suppression.cc', 'object_detection/non_max_suppression.h', 'object_detection/non_max_suppression_impl.cu', @@ -151,25 +137,7 @@ provider_excluded_files = [ 'shared_inc/fast_divmod.h', 'shared_inc/fpgeneric.h', 'shared_inc/integer_gemm.h', - 'tensor/compress.cc', - 'tensor/compress.h', - 'tensor/compress_impl.cu', - 'tensor/compress_impl.h', - 'tensor/eye_like.cc', - 'tensor/eye_like.h', - 'tensor/eye_like_impl.cu', - 'tensor/eye_like_impl.h', - 'tensor/flatten.cc', - 'tensor/flatten.h', - 'tensor/gather_elements.cc', - 'tensor/gather_elements.h', - 'tensor/gather_elements_impl.cu', - 'tensor/gather_elements_impl.h', 'tensor/gather_nd_impl.cu', - 'tensor/pad.cc', - 'tensor/pad.h', - 'tensor/pad_impl.cu', - 'tensor/pad_impl.h', 'tensor/quantize_linear.cc', 'tensor/quantize_linear.cu', 'tensor/quantize_linear.cuh', @@ -178,10 +146,6 @@ provider_excluded_files = [ 'tensor/resize.h', 'tensor/resize_impl.cu', 'tensor/resize_impl.h', - 'tensor/reverse_sequence.cc', - 'tensor/reverse_sequence.h', - 'tensor/reverse_sequence_impl.cu', - 'tensor/reverse_sequence_impl.h', 'tensor/transpose.cc', 'tensor/transpose.h', 'tensor/upsample.cc', @@ -234,9 +198,6 @@ training_ops_excluded_files = [ 'controlflow/wait.cc', 'controlflow/wait.h', 'math/div_grad.cc', - 'math/div_grad.h', - 'math/div_grad_impl.cu', - 'math/div_grad_impl.h', 'math/softmax_grad_impl.cu', 'math/softmax_grad.cc', 'nn/batch_norm_grad.cc', @@ -246,8 +207,6 @@ training_ops_excluded_files = [ 'optimizer/lamb.cc', 'reduction/reduction_all.cc', 'reduction/reduction_ops.cc', - 'tensor/gather_elements_grad.cc', - 'tensor/gather_elements_grad.h', 'tensor/gather_grad.cc', 'tensor/gather_grad_impl.cu', 'tensor/gather_grad_impl.h', diff --git a/tools/ci_build/github/pai/pai-excluded-tests.txt b/tools/ci_build/github/pai/pai-excluded-tests.txt index 8759def960..4100474341 100644 --- a/tools/ci_build/github/pai/pai-excluded-tests.txt +++ b/tools/ci_build/github/pai/pai-excluded-tests.txt @@ -12,13 +12,9 @@ OptimizerTest.LambOptimizerTestBaselineMixPrecision32_16 OptimizerTest.LambOptimizerTestScalarMixPrecision32_16 OptimizerTest.LambOptimizerTestScalarMixPrecision32_16_NoDefaultMaxNormClipping OptimizerTest.LambOptimizerTestLarge -CudaKernelTest.SoftmaxCrossEntropy_TinySizeTensor -CudaKernelTest.SoftmaxCrossEntropy_SmallSizeTensor -CudaKernelTest.SoftmaxCrossEntropy_MediumSizeTensor -CudaKernelTest.SoftmaxCrossEntropy_LargeSizeTensor CudaKernelTest.SparseSoftmaxCrossEntropy_LargeSizeTensor -CudaKernelTest.NegativeLogLikelihoodLoss_TinySizeTensor -CudaKernelTest.NegativeLogLikelihoodLoss_SmallSizeTensor +CudaKernelTest.NegativeLogLikelihoodLoss_TinySizeTensor +CudaKernelTest.NegativeLogLikelihoodLoss_SmallSizeTensor CudaKernelTest.NegativeLogLikelihoodLoss_MediumSizeTensor ReductionOpTest.ReductionVariationTest ReductionOpTest.ReduceL1_default_axes_keepdims @@ -76,39 +72,12 @@ ReductionOpTest.ReduceInfLogSumExp_double GatherOpTest.Gather_invalid_index_cpu Scatter.InvalidIndex LogSoftmaxOperator.LargeNumber -GatherElementsGrad.WithoutAxis -GatherElementsGrad.WithAxis -GatherElementsGrad.ThreeDimsWithAxis_0 -GatherElementsGrad.ThreeDimsWithAxis_2 -GatherElementsGrad.NegativeAxis -GatherElementsGrad.IndicesUpdatesDontMatch -GatherElementsGrad.ValidAxis -GatherElementsGrad.ValidNegativeIndex -GatherElementsGrad.SameUpdateWithoutAxis -GatherElementsGrad.SameUpdateWithAxis -GatherElementsGrad.SameUpdateWithNegativeAxis -GatherElementsGrad.SameUpdateWithoutAxisMLFloat16 -MathOpTest.Max_8_2inputbroadcast -MathOpTest.Less_broadcastBA -MathOpTest.Less_multidiretional_broadcastAB -MathOpTest.Less_multidiretional_broadcastBA -MathOpTest.Greater_broadcastBA -MathOpTest.Greater_multidiretional_broadcastAB -MathOpTest.Greater_multidiretional_broadcastBA MathOpTest.Pow_int64_float MathOpTest.Pow_int32_float MathOpTest.Pow_int64_double GradientCheckerTest.AddGrad GradientCheckerTest.SubGrad GradientCheckerTest.MulGrad -GradientCheckerTest.MatMulGrad GradientCheckerTest.ReduceMeanGrad GradientCheckerTest.ReduceL2Grad -GradientCheckerTest.SoftmaxCrossEntropyGrad -GradientCheckerTest.ExpandGrad GradientCheckerTest.DivGrad -GradientCheckerTest.GemmGrad -GradientCheckerTest.SplitGrad -GradientCheckerTest.SqueezeGrad -GradientCheckerTest.UnsqueezeGrad -GradientCheckerTest.ClipGrad From ab1713f5ccdd643603b30fb7d526b2cf69db9c45 Mon Sep 17 00:00:00 2001 From: Hariharan Seshadri Date: Wed, 24 Feb 2021 19:10:14 -0800 Subject: [PATCH 28/37] Fix regression in constant folding optimizer (#6795) --- .../core/optimizer/constant_folding.cc | 11 +++++++-- .../test/optimizer/graph_transform_test.cc | 23 ++++++++++++++++++ ...nstant_folding_remove_dangling_inputs.onnx | Bin 0 -> 344 bytes 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 onnxruntime/test/testdata/transform/fusion/constant_folding_remove_dangling_inputs.onnx diff --git a/onnxruntime/core/optimizer/constant_folding.cc b/onnxruntime/core/optimizer/constant_folding.cc index 1c53bba193..047aa6f7c1 100644 --- a/onnxruntime/core/optimizer/constant_folding.cc +++ b/onnxruntime/core/optimizer/constant_folding.cc @@ -182,9 +182,16 @@ Status ConstantFolding::ApplyImpl(Graph& graph, bool& modified, int graph_level, if (converted_to_constant) { // Remove single-output node chain for inputs of the node - for (auto p_ip_node = node->InputNodesBegin(); p_ip_node != node->InputNodesEnd(); ++p_ip_node) { - graph_utils::RemoveNodesWithOneOutputBottomUp(graph, *p_ip_node); + auto p_ip_node = node->InputNodesBegin(); + const auto p_ip_node_end = node->InputNodesEnd(); + while (p_ip_node != p_ip_node_end) { + const auto& input_node = *p_ip_node; + // Update the node iterator before removing the corresponding node because removing + // the node will invalidate the node iterator + ++p_ip_node; + graph_utils::RemoveNodesWithOneOutputBottomUp(graph, input_node); } + // Remove the output edges of the constant node and then remove the node itself. graph_utils::RemoveNodeOutputEdges(graph, *node); graph.RemoveNode(node->Index()); diff --git a/onnxruntime/test/optimizer/graph_transform_test.cc b/onnxruntime/test/optimizer/graph_transform_test.cc index 8befa2ae28..9a01db9ee4 100644 --- a/onnxruntime/test/optimizer/graph_transform_test.cc +++ b/onnxruntime/test/optimizer/graph_transform_test.cc @@ -363,6 +363,29 @@ TEST_F(GraphTransformationTests, ConstantFoldingWithDequantizeLinear) { VerifyConstantFoldingWithDequantizeLinear(1, 1, 1, graph, session_options, *logger_); } +TEST_F(GraphTransformationTests, ConstantFolding_RemoveDanglingInputNodesToConstantFoldedNode) { + auto model_uri = MODEL_FOLDER "fusion/constant_folding_remove_dangling_inputs.onnx"; + std::shared_ptr model; + ASSERT_TRUE(Model::Load(model_uri, model, nullptr, *logger_).IsOK()); + Graph& graph = model->MainGraph(); + std::map op_to_count = CountOpsInGraph(graph); + ASSERT_TRUE(op_to_count["Shape"] == 1); // Shape node that will be constant folded + ASSERT_TRUE(op_to_count["Add"] == 1); // Input node to Shape + ASSERT_TRUE(op_to_count["RandomUniform"] == 1); // Input node to Add + + std::unique_ptr e = + onnxruntime::make_unique(CPUExecutionProviderInfo()); + onnxruntime::GraphTransformerManager graph_transformation_mgr{5}; + graph_transformation_mgr.Register(onnxruntime::make_unique(*e.get(), false /*skip_dequantize_linear*/), TransformerLevel::Level1); + + ASSERT_STATUS_OK(graph_transformation_mgr.ApplyTransformers(graph, TransformerLevel::Level1, *logger_)); + + op_to_count = CountOpsInGraph(graph); + ASSERT_TRUE(op_to_count["Shape"] == 0); + ASSERT_TRUE(op_to_count["Add"] == 0); + ASSERT_TRUE(op_to_count["RandomUniform"] == 0); +} + TEST_F(GraphTransformationTests, ShapeToInitializer) { auto model_uri = MODEL_FOLDER "shape-add.onnx"; std::shared_ptr model; diff --git a/onnxruntime/test/testdata/transform/fusion/constant_folding_remove_dangling_inputs.onnx b/onnxruntime/test/testdata/transform/fusion/constant_folding_remove_dangling_inputs.onnx new file mode 100644 index 0000000000000000000000000000000000000000..9b3d4e5d4f7b0d82d2d5609df6a89dd3057b0b71 GIT binary patch literal 344 zcmZutO-sW-6zto4tKK`na`_9THyKH3yLReKNwFNzm0%W5NywAqqurT&}z75|x= zst3Ub!whfc@a9pU1?vx^>z4(0lJkqpPl96x2|v77)m*P0tMXOXD;bM}KZ__tuUV*d zF(p%H>b4Nz5ki6xGf262HJ{5wIF|4jA!U&9;Gv7lRCqgq8G{kWnXVe6DkC#Ne|0oK z?_Di7Mbr<2TiW}X7F;|-$Ph*h#+=?LvnXmg68^V}_R&?_vKjPRAb5&kd*s}osm92$ za669nkQhCHE@01%5po6-?%i#cG8c{|7VdsAd@Iec*sgVLo=&<_3_}X6kAxBn$HINK L#^gWanuPr?*G@*- literal 0 HcmV?d00001 From 8a148e44fb485bb84be935f0904cc1876b38a8ee Mon Sep 17 00:00:00 2001 From: Suffian Khan Date: Wed, 24 Feb 2021 20:18:03 -0800 Subject: [PATCH 29/37] make ci pipeline also run batch and convergence test (#6798) --- .../orttraining-pai-ci-pipeline.yml | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tools/ci_build/github/azure-pipelines/orttraining-pai-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/orttraining-pai-ci-pipeline.yml index 2699a2e9ad..fe891611b8 100644 --- a/tools/ci_build/github/azure-pipelines/orttraining-pai-ci-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/orttraining-pai-ci-pipeline.yml @@ -15,6 +15,14 @@ steps: echo "Selecting GPU based on HIP_VISIBLE_DEVICES=$HIP_VISIBLE_DEVICES" displayName: 'Initialize environment' +# update these if the E2E test data changes +- script: |- + python orttraining/tools/ci_test/download_azure_blob_archive.py \ + --azure_blob_url https://onnxruntimetestdata.blob.core.windows.net/training/onnxruntime_training_data.zip?snapshot=2020-06-15T23:17:35.8314853Z \ + --target_dir training_e2e_test_data \ + --archive_sha256_digest B01C169B6550D1A0A6F1B4E2F34AE2A8714B52DBB70AC04DA85D371F691BDFF9 + displayName: 'Download onnxruntime_training_data.zip data' + - script: |- python tools/ci_build/build.py \ --config RelWithDebInfo \ @@ -36,3 +44,19 @@ steps: ../../tools/ci_build/github/pai/pai_test_launcher.sh displayName: 'Run unit tests' +- script: |- + python orttraining/tools/ci_test/run_batch_size_test.py \ + --binary_dir build/RelWithDebInfo \ + --model_root training_e2e_test_data/models \ + --gpu_sku MI100_32G + displayName: 'Run batch size test' + condition: succeededOrFailed() # ensure all tests are run + +- script: |- + python orttraining/tools/ci_test/run_convergence_test.py \ + --binary_dir build/RelWithDebInfo \ + --model_root training_e2e_test_data/models \ + --training_data_root training_e2e_test_data/data \ + --gpu_sku MI100_32G + displayName: 'Run convergence test' + condition: succeededOrFailed() # ensure all tests are run From 7465673e3306f5f2e5ed670c5a18468824daf6fa Mon Sep 17 00:00:00 2001 From: Maajid khan Date: Thu, 25 Feb 2021 18:42:57 +0530 Subject: [PATCH 30/37] [OpenVINO-EP] Find package changes (#6801) * Find package changes to cmake * Removing unwanted code from cmake Signed-off-by: MaajidKhan Co-authored-by: suryasidd --- cmake/onnxruntime_providers.cmake | 59 ++----------------- .../linux/docker/Dockerfile.ubuntu_openvino | 3 +- 2 files changed, 7 insertions(+), 55 deletions(-) diff --git a/cmake/onnxruntime_providers.cmake b/cmake/onnxruntime_providers.cmake index 4ce604158c..a4ea17d7b4 100644 --- a/cmake/onnxruntime_providers.cmake +++ b/cmake/onnxruntime_providers.cmake @@ -568,60 +568,13 @@ if (onnxruntime_USE_OPENVINO) ) # Header paths - list(APPEND OPENVINO_INCLUDE_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/include) - list(APPEND OPENVINO_INCLUDE_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/external/tbb/include) - list(APPEND OPENVINO_INCLUDE_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/external/mkltiny_lnx/include) + find_package(InferenceEngine REQUIRED) + find_package(ngraph REQUIRED) - # Library paths - list(APPEND OPENVINO_LIB_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/external/tbb/lib) - list(APPEND OPENVINO_LIB_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/external/tbb/bin) - list(APPEND OPENVINO_LIB_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/external/mkltiny_lnx/lib) - - # Lib names - if (WIN32) - if (CMAKE_BUILD_TYPE STREQUAL "Debug") - list(APPEND OPENVINO_LIB_LIST inference_engined.lib inference_engine_legacyd.lib tbb.lib ${PYTHON_LIBRARIES}) - else() - list(APPEND OPENVINO_LIB_LIST inference_engine.lib inference_engine_legacy.lib tbb.lib ${PYTHON_LIBRARIES}) - endif() + if (OPENVINO_VERSION VERSION_EQUAL "2020.3") + list(APPEND OPENVINO_LIB_LIST ${InferenceEngine_LIBRARIES} ${NGRAPH_LIBRARIES} ${PYTHON_LIBRARIES}) else() - list(APPEND OPENVINO_LIB_LIST -linference_engine -linference_engine_legacy -ltbb ${PYTHON_LIBRARIES}) - endif() - - # Link to nGraph from OpenVINO installation - list(APPEND OPENVINO_INCLUDE_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/ngraph/include) - list(APPEND OPENVINO_INCLUDE_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/ngraph/include/ngraph/frontend) - list(APPEND OPENVINO_LIB_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/ngraph/lib) - if (OPENVINO_VERSION VERSION_EQUAL "2020.4") - if (WIN32) - list(APPEND OPENVINO_LIB_LIST ngraph.lib onnx_importer.lib) - else() - list(APPEND OPENVINO_LIB_LIST -lngraph -lonnx_importer) - endif() - endif() - - if (OPENVINO_VERSION VERSION_GREATER "2020.4") - if (WIN32) - if (CMAKE_BUILD_TYPE STREQUAL "Debug") - list(APPEND OPENVINO_LIB_LIST ngraphd.lib onnx_importerd.lib) - else() - list(APPEND OPENVINO_LIB_LIST ngraph.lib onnx_importer.lib) - endif() - else() - list(APPEND OPENVINO_LIB_LIST -lngraph -lonnx_importer) - endif() - endif() - - if(WIN32) - if (CMAKE_BUILD_TYPE STREQUAL "Debug") - list(APPEND OPENVINO_LIB_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/lib/intel64/Debug) - else() - list(APPEND OPENVINO_LIB_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/lib/intel64/Release) - endif() - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") - list(APPEND OPENVINO_LIB_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/lib/aarch64) - else() - list(APPEND OPENVINO_LIB_DIR_LIST $ENV{INTEL_OPENVINO_DIR}/deployment_tools/inference_engine/lib/intel64) + list(APPEND OPENVINO_LIB_LIST ${InferenceEngine_LIBRARIES} ${NGRAPH_LIBRARIES} ngraph::onnx_importer ${PYTHON_LIBRARIES}) endif() source_group(TREE ${ONNXRUNTIME_ROOT}/core FILES ${onnxruntime_providers_openvino_cc_srcs}) @@ -630,10 +583,8 @@ if (onnxruntime_USE_OPENVINO) install(DIRECTORY ${PROJECT_SOURCE_DIR}/../include/onnxruntime/core/providers/openvino DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/onnxruntime/core/providers) set_target_properties(onnxruntime_providers_openvino PROPERTIES LINKER_LANGUAGE CXX) set_target_properties(onnxruntime_providers_openvino PROPERTIES FOLDER "ONNXRuntime") - target_link_directories(onnxruntime_providers_openvino PRIVATE ${OPENVINO_LIB_DIR_LIST}) add_dependencies(onnxruntime_providers_openvino onnxruntime_providers_shared ${onnxruntime_EXTERNAL_DEPENDENCIES}) target_include_directories(onnxruntime_providers_openvino SYSTEM PUBLIC ${ONNXRUNTIME_ROOT} ${CMAKE_CURRENT_BINARY_DIR} ${eigen_INCLUDE_DIRS} ${OPENVINO_INCLUDE_DIR_LIST} ${PYTHON_INCLUDE_DIRS}) - # ${CMAKE_CURRENT_BINARY_DIR} is so that #include "onnxruntime_config.h" inside tensor_shape.h is found target_link_libraries(onnxruntime_providers_openvino onnxruntime_providers_shared ${OPENVINO_LIB_LIST}) if(MSVC) diff --git a/tools/ci_build/github/linux/docker/Dockerfile.ubuntu_openvino b/tools/ci_build/github/linux/docker/Dockerfile.ubuntu_openvino index 00358c0052..7ece031362 100644 --- a/tools/ci_build/github/linux/docker/Dockerfile.ubuntu_openvino +++ b/tools/ci_build/github/linux/docker/Dockerfile.ubuntu_openvino @@ -15,7 +15,8 @@ WORKDIR /root ENV INTEL_OPENVINO_DIR /opt/intel/openvino_${OPENVINO_VERSION}.200 ENV LD_LIBRARY_PATH $INTEL_OPENVINO_DIR/deployment_tools/inference_engine/lib/intel64:$INTEL_OPENVINO_DIR/deployment_tools/ngraph/lib:$INTEL_OPENVINO_DIR/deployment_tools/inference_engine/external/tbb/lib:/usr/local/openblas/lib:$LD_LIBRARY_PATH - +ENV InferenceEngine_DIR $INTEL_OPENVINO_DIR/deployment_tools/inference_engine/share +ENV ngraph_DIR $INTEL_OPENVINO_DIR/deployment_tools/ngraph/cmake ENV PYTHONPATH $INTEL_OPENVINO_DIR/tools:$PYTHONPATH ENV IE_PLUGINS_PATH $INTEL_OPENVINO_DIR/deployment_tools/inference_engine/lib/intel64 ENV DEBIAN_FRONTEND=noninteractive From d5f292ab7331377c525ec9fdb075b6095296b507 Mon Sep 17 00:00:00 2001 From: stevenlix <38092805+stevenlix@users.noreply.github.com> Date: Thu, 25 Feb 2021 05:41:21 -0800 Subject: [PATCH 31/37] fix issues caused by quantize/calibrate changes (#6802) --- .../trt/resnet50/e2e_tensorrt_resnet_example.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/onnxruntime/python/tools/quantization/E2E_example_model/image_classification/trt/resnet50/e2e_tensorrt_resnet_example.py b/onnxruntime/python/tools/quantization/E2E_example_model/image_classification/trt/resnet50/e2e_tensorrt_resnet_example.py index a66043ea33..9e87a6b9ed 100644 --- a/onnxruntime/python/tools/quantization/E2E_example_model/image_classification/trt/resnet50/e2e_tensorrt_resnet_example.py +++ b/onnxruntime/python/tools/quantization/E2E_example_model/image_classification/trt/resnet50/e2e_tensorrt_resnet_example.py @@ -7,7 +7,7 @@ import logging from PIL import Image import onnx import onnxruntime -from onnxruntime.quantization import CalibrationDataReader, create_calibrater, write_calibration_table +from onnxruntime.quantization import CalibrationDataReader, create_calibrator, write_calibration_table class ImageNetDataReader(CalibrationDataReader): @@ -258,9 +258,13 @@ class ImageClassificationEvaluator: def convert_model_batch_to_dynamic(model_path): model = onnx.load(model_path) - input = model.graph.input - input_name = input[0].name - shape = input[0].type.tensor_type.shape + initializers = [node.name for node in model.graph.initializer] + inputs = [] + for node in model.graph.input: + if node.name not in initializers: + inputs.append(node) + input_name = inputs[0].name + shape = inputs[0].type.tensor_type.shape dim = shape.dim if not dim[0].dim_param: dim[0].dim_param = 'N' @@ -329,6 +333,8 @@ if __name__ == '__main__': # Generate INT8 calibration table if calibration_table_generation_enable: + calibrator = create_calibrator(new_model_path, [], augmented_model_path=augmented_model_path) + calibrator.set_execution_providers(["CUDAExecutionProvider"]) data_reader = ImageNetDataReader(ilsvrc2012_dataset_path, start_index=0, end_index=calibration_dataset_size, @@ -336,9 +342,6 @@ if __name__ == '__main__': batch_size=batch_size, model_path=augmented_model_path, input_name=input_name) - # For TensorRT calibration, augment all FP32 tensors (empty op_types), disable ORT graph optimization and skip quantization parameter calculation - calibrator = create_calibrater(new_model_path) - calibrator.set_execution_providers(["CUDAExecutionProvider"]) calibrator.collect_data(data_reader) write_calibration_table(calibrator.compute_range()) From db05d53b94d8c67817da5c0b08aba935c941a444 Mon Sep 17 00:00:00 2001 From: Olivia Jain Date: Thu, 25 Feb 2021 09:31:03 -0800 Subject: [PATCH 32/37] Setup perf in docker and add features (#6582) * setup scripts to run in docker * percent threshold for accuracy * branch testing --- dockerfiles/Dockerfile.tensorrt | 2 +- .../python/tools/tensorrt/perf/benchmark.py | 206 +++++++----------- .../tools/tensorrt/perf/benchmark_wrapper.py | 43 ++-- .../perf/build/Dockerfile.tensorrt-perf | 4 + .../tools/tensorrt/perf/build/build_images.sh | 14 ++ .../comparison_scripts/compare_latency.py | 46 ++++ .../perf/comparison_scripts/new_failures.py | 22 ++ .../tools/tensorrt/perf/ort_build_latest.py | 14 +- .../python/tools/tensorrt/perf/perf.sh | 58 ++--- .../python/tools/tensorrt/perf/perf_utils.py | 14 +- .../tools/tensorrt/perf/run_perf_docker.sh | 36 +++ .../tools/tensorrt/perf/run_perf_machine.sh | 31 +++ .../perf/setup_scripts/setup_many_models.sh | 5 + .../perf/setup_scripts/setup_onnx_zoo.py | 71 ++++++ .../linux-gpu-tensorrt-ci-perf-pipeline.yml | 28 +-- 15 files changed, 383 insertions(+), 211 deletions(-) create mode 100644 onnxruntime/python/tools/tensorrt/perf/build/Dockerfile.tensorrt-perf create mode 100755 onnxruntime/python/tools/tensorrt/perf/build/build_images.sh create mode 100644 onnxruntime/python/tools/tensorrt/perf/comparison_scripts/compare_latency.py create mode 100644 onnxruntime/python/tools/tensorrt/perf/comparison_scripts/new_failures.py create mode 100755 onnxruntime/python/tools/tensorrt/perf/run_perf_docker.sh create mode 100755 onnxruntime/python/tools/tensorrt/perf/run_perf_machine.sh create mode 100755 onnxruntime/python/tools/tensorrt/perf/setup_scripts/setup_many_models.sh create mode 100644 onnxruntime/python/tools/tensorrt/perf/setup_scripts/setup_onnx_zoo.py diff --git a/dockerfiles/Dockerfile.tensorrt b/dockerfiles/Dockerfile.tensorrt index 4c8d980f93..9df40560c9 100644 --- a/dockerfiles/Dockerfile.tensorrt +++ b/dockerfiles/Dockerfile.tensorrt @@ -26,7 +26,7 @@ RUN git clone --single-branch --branch ${ONNXRUNTIME_BRANCH} --recursive ${ONNXR cp onnxruntime/dockerfiles/LICENSE-IMAGE.txt /code/LICENSE-IMAGE.txt &&\ cp onnxruntime/ThirdPartyNotices.txt /code/ThirdPartyNotices.txt &&\ cd onnxruntime &&\ - /bin/sh ./build.sh --cuda_home /usr/local/cuda --cudnn_home /usr/lib/x86_64-linux-gnu/ --use_tensorrt --tensorrt_home /workspace/tensorrt --config Release --build_wheel --update --build --cmake_extra_defines ONNXRUNTIME_VERSION=$(cat ./VERSION_NUMBER) &&\ + /bin/sh ./build.sh --parallel --cuda_home /usr/local/cuda --cudnn_home /usr/lib/x86_64-linux-gnu/ --use_tensorrt --tensorrt_home /workspace/tensorrt --config Release --build_wheel --update --build --cmake_extra_defines ONNXRUNTIME_VERSION=$(cat ./VERSION_NUMBER) &&\ pip install /code/onnxruntime/build/Linux/Release/dist/*.whl &&\ cd .. &&\ rm -rf onnxruntime cmake-3.14.3-Linux-x86_64 diff --git a/onnxruntime/python/tools/tensorrt/perf/benchmark.py b/onnxruntime/python/tools/tensorrt/perf/benchmark.py index 36bd22fb1e..22a8b847f0 100644 --- a/onnxruntime/python/tools/tensorrt/perf/benchmark.py +++ b/onnxruntime/python/tools/tensorrt/perf/benchmark.py @@ -235,72 +235,6 @@ def get_acl_version(): version = version_match.group(0).split(' ')[0] return version -def get_cuda_version(): - from pathlib import Path - home = str(Path.home()) - - p1 = subprocess.Popen(["find", home+"/.local/lib/", "-name", "onnxruntime_pybind11_state.so"], stdout=subprocess.PIPE) - stdout, sterr = p1.communicate() - stdout = stdout.decode("ascii").strip() - p1 = subprocess.Popen(["ldd", stdout], stdout=subprocess.PIPE) - p2 = subprocess.Popen(["grep", "libcudart.so"], stdin=p1.stdout, stdout=subprocess.PIPE) - stdout, sterr = p2.communicate() - stdout = stdout.decode("ascii").strip() - - return stdout - -def get_trt_version(): - from pathlib import Path - home = str(Path.home()) - - p1 = subprocess.Popen(["find", home+"/.local/lib/", "-name", "onnxruntime_pybind11_state.so"], stdout=subprocess.PIPE) - stdout, sterr = p1.communicate() - stdout = stdout.decode("ascii").strip() - p1 = subprocess.Popen(["ldd", stdout], stdout=subprocess.PIPE) - p2 = subprocess.Popen(["grep", "libnvinfer.so"], stdin=p1.stdout, stdout=subprocess.PIPE) - stdout, sterr = p2.communicate() - stdout = stdout.decode("ascii").strip() - - if stdout == "": - p1 = subprocess.Popen(["find", home+"/.local/lib/", "-name", "libonnxruntime_providers_tensorrt.so"], stdout=subprocess.PIPE) - stdout, sterr = p1.communicate() - stdout = stdout.decode("ascii").strip() - p1 = subprocess.Popen(["ldd", stdout], stdout=subprocess.PIPE) - p2 = subprocess.Popen(["grep", "libnvinfer.so"], stdin=p1.stdout, stdout=subprocess.PIPE) - stdout, sterr = p2.communicate() - stdout = stdout.decode("ascii").strip() - - return stdout - -# not use for this script temporarily -def tmp_get_trt_version(): - p1 = subprocess.Popen(["dpkg", "-l"], stdout=subprocess.PIPE) - p2 = subprocess.Popen(["grep", "TensorRT runtime libraries"], stdin=p1.stdout, stdout=subprocess.PIPE) - stdout, sterr = p2.communicate() - stdout = stdout.decode("ascii").strip() - - if stdout != "": - stdout = re.sub('\s+', ' ', stdout) - return stdout - - if os.path.exists("/usr/lib/x86_64-linux-gnu/libnvinfer.so"): - p1 = subprocess.Popen(["readelf", "-s", "/usr/lib/x86_64-linux-gnu/libnvinfer.so"], stdout=subprocess.PIPE) - p2 = subprocess.Popen(["grep", "version"], stdin=p1.stdout, stdout=subprocess.PIPE) - stdout, sterr = p2.communicate() - stdout = stdout.decode("ascii").strip() - stdout = stdout.split(" ")[-1] - return stdout - - elif os.path.exists("/usr/lib/aarch64-linux-gnu/libnvinfer.so"): - p1 = subprocess.Popen(["readelf", "-s", "/usr/lib/aarch64-linux-gnu/libnvinfer.so"], stdout=subprocess.PIPE) - p2 = subprocess.Popen(["grep", "version"], stdin=p1.stdout, stdout=subprocess.PIPE) - stdout, sterr = p2.communicate() - stdout = stdout.decode("ascii").strip() - stdout = stdout.split(" ")[-1] - return stdout - - return "" - ####################################################################################################################################### # The following two lists will be generated. # @@ -309,7 +243,6 @@ def tmp_get_trt_version(): ####################################################################################################################################### def load_onnx_model_zoo_test_data(path, all_inputs_shape, data_type="fp32"): logger.info("Parsing test data in {} ...".format(path)) - # p1 = subprocess.Popen(["find", path, "-name", "test_data_set*", "-type", "d"], stdout=subprocess.PIPE) p1 = subprocess.Popen(["find", path, "-name", "test_data*", "-type", "d"], stdout=subprocess.PIPE) p2 = subprocess.Popen(["sort"], stdin=p1.stdout, stdout=subprocess.PIPE) stdout, sterr = p2.communicate() @@ -419,7 +352,15 @@ def generate_onnx_model_random_input(test_times, ref_input): return inputs -def validate(all_ref_outputs, all_outputs, rtol=0, atol=1.5): +def percentage_in_allowed_threshold(e, percent_mismatch): + percent_string = re.search(r'\(([^)]+)', str(e)).group(1) + if "%" in percent_string: + percentage_wrong = float(percent_string.replace("%","")) + return percentage_wrong < percent_mismatch + else: + return False # error in output + +def validate(all_ref_outputs, all_outputs, rtol, atol, percent_mismatch): if len(all_ref_outputs) == 0: logger.info("No reference output provided.") return True, None @@ -428,22 +369,25 @@ def validate(all_ref_outputs, all_outputs, rtol=0, atol=1.5): logger.info('Predicted {} results.'.format(len(all_outputs))) logger.info('rtol: {}, atol: {}'.format(rtol, atol)) - try: - for i in range(len(all_outputs)): - ref_outputs = all_ref_outputs[i] - outputs = all_outputs[i] + for i in range(len(all_outputs)): + ref_outputs = all_ref_outputs[i] + outputs = all_outputs[i] - for j in range(len(outputs)): - ref_output = ref_outputs[j] - output = outputs[j] + for j in range(len(outputs)): + ref_output = ref_outputs[j] + output = outputs[j] - # Compare the results with reference outputs - for ref_o, o in zip(ref_output, output): - # abs(desired-actual) < rtol * abs(desired) + atol + # Compare the results with reference outputs + for ref_o, o in zip(ref_output, output): + # abs(desired-actual) < rtol * abs(desired) + atol + try: + logger.info("Output shape{} input shape{}".format(ref_output.shape, output.shape)) np.testing.assert_allclose(ref_o, o, rtol, atol) - except Exception as e: - logger.error(e) - return False, e + except Exception as e: + if percentage_in_allowed_threshold(e, percent_mismatch): + continue + logger.error(e) + return False, e logger.info('ONNX Runtime outputs are similar to reference outputs!') return True, None @@ -482,7 +426,7 @@ def remove_profiling_files(path): for f in files: if "custom_test_data" in f: continue - subprocess.Popen(["rm","-rf", f], stdout=subprocess.PIPE) + subprocess.Popen(["sudo","rm","-rf", f], stdout=subprocess.PIPE) def update_fail_report(fail_results, model, ep, e_type, e): @@ -662,56 +606,59 @@ def write_map_to_file(result, file_name): file.write(json.dumps(existed_result)) # use `json.loads` to do the reverse -def get_system_info(): - info = {} - - info["cuda"] = get_cuda_version() - info["trt"] = get_trt_version() - - p = subprocess.Popen(["cat", "/etc/os-release"], stdout=subprocess.PIPE) - stdout, sterr = p.communicate() - stdout = stdout.decode("ascii").strip() - stdout = stdout.split("\n")[:2] +def get_cuda_version(): + nvidia_strings = get_output(["nvidia-smi"]) + version = re.search(r'CUDA Version: \d\d\.\d', nvidia_strings).group(0) + return version + +def get_trt_version(): + nvidia_strings = get_output(["dpkg", "-l"]) + version = re.search(r'nvinfer.*\d\.\d\.\d\-\d', nvidia_strings).group(0) + return version + +def get_linux_distro(): + linux_strings = get_output(["cat", "/etc/os-release"]) + stdout = linux_strings.split("\n")[:2] infos = [] for row in stdout: row = re.sub('=', ': ', row) row = re.sub('"', '', row) infos.append(row) - info["linux_distro"] = infos + return infos - p = subprocess.Popen(["lscpu"], stdout=subprocess.PIPE) - stdout, sterr = p.communicate() - stdout = stdout.decode("ascii").strip() - stdout = stdout.split("\n") - infos = [] - for row in stdout: - if "mode" in row or "Arch" in row or "name" in row: - # row = row.replace(":\s+", ": ") - row = re.sub(': +', ': ', row) - infos.append(row) - info["cpu_info"] = infos - - p1 = subprocess.Popen(["lspci", "-v"], stdout=subprocess.PIPE) - p2 = subprocess.Popen(["grep", "NVIDIA"], stdin=p1.stdout, stdout=subprocess.PIPE) - stdout, sterr = p2.communicate() - stdout = stdout.decode("ascii").strip() - stdout = stdout.split("\n") - infos = [] - for row in stdout: - row = re.sub('.*:', '', row) - infos.append(row) - info["gpu_info"] = infos - - p = subprocess.Popen(["cat", "/proc/meminfo"], stdout=subprocess.PIPE) - stdout, sterr = p.communicate() - stdout = stdout.decode("ascii").strip() - stdout = stdout.split("\n") +def get_memory_info(): + mem_strings = get_output(["cat", "/proc/meminfo"]) + stdout = mem_strings.split("\n") infos = [] for row in stdout: if "Mem" in row: row = re.sub(': +', ': ', row) infos.append(row) - info["memory"] = infos + return infos + +def get_cpu_info(): + cpu_strings = get_output(["lscpu"]) + stdout = cpu_strings.split("\n") + infos = [] + for row in stdout: + if "mode" in row or "Arch" in row or "name" in row: + row = re.sub(': +', ': ', row) + infos.append(row) + return infos + +def get_gpu_info(): + info = get_output(["lspci", "-v"]) + infos = re.findall('NVIDIA.*', info) + return infos + +def get_system_info(): + info = {} + info["cuda"] = get_cuda_version() + info["trt"] = get_trt_version() + info["linux_distro"] = get_linux_distro() + info["cpu_info"] = get_cpu_info() + info["gpu_info"] = get_gpu_info() + info["memory"] = get_memory_info() return info @@ -772,10 +719,6 @@ def parse_models_info_from_directory(path, models): model_name = model_name + '_' + os.path.split(os.path.split(path)[0])[-1] # get opset version as model_name model_path = find_model_path(path) - if not model_path: - logger.info("Can't find model in " + path) - return - model = {} model["model_name"] = model_name model["model_path"] = model_path @@ -923,10 +866,6 @@ def run_onnxruntime(args, models): os.chdir(path) path = os.getcwd() - # cleanup files before running a new inference - if args.running_mode == "validate": - remove_profiling_files(path) - inputs = [] ref_outputs = [] all_inputs_shape = [] # use for standalone trt @@ -1095,7 +1034,7 @@ def run_onnxruntime(args, models): try: ort_outputs = inference_ort_and_get_prediction(name, sess, inputs) - status = validate(ref_outputs, ort_outputs) + status = validate(ref_outputs, ort_outputs, args.rtol, args.atol, args.percent_mismatch) if not status[0]: update_fail_model_map(model_to_fail_ep, name, ep, 'result accuracy issue', status[1]) continue @@ -1372,6 +1311,8 @@ def output_latency(results, csv_filename): row = [key, + cpu_average, + cpu_90_percentile, cuda_average, cuda_90_percentile, trt_average, @@ -1515,6 +1456,11 @@ def parse_arguments(): parser.add_argument("--trtexec", required=False, default=None, help="trtexec executable path.") + # Validation options + parser.add_argument("--percent_mismatch", required=False, default=20.0, help="Allowed percentage of mismatched elements in validation.") + parser.add_argument("--rtol", required=False, default=0, help="Relative tolerance for validating outputs.") + parser.add_argument("--atol", required=False, default=20, help="Absolute tolerance for validating outputs.") + parser.add_argument("-t", "--test_times", required=False, diff --git a/onnxruntime/python/tools/tensorrt/perf/benchmark_wrapper.py b/onnxruntime/python/tools/tensorrt/perf/benchmark_wrapper.py index c69dee72bf..af123bef30 100644 --- a/onnxruntime/python/tools/tensorrt/perf/benchmark_wrapper.py +++ b/onnxruntime/python/tools/tensorrt/perf/benchmark_wrapper.py @@ -6,7 +6,6 @@ import argparse import copy import json import re -import sys import pprint from benchmark import * from perf_utils import get_latest_commit_hash @@ -33,12 +32,11 @@ def main(): model_to_fail_ep = {} - commit = get_latest_commit_hash() - benchmark_fail_csv = 'fail_' + commit + '.csv' - benchmark_metrics_csv = 'metrics_' + commit + '.csv' - benchmark_success_csv = 'success_' + commit + '.csv' - benchmark_latency_csv = 'latency_' + commit + '.csv' - benchmark_status_csv = 'status_' + commit + '.csv' + benchmark_fail_csv = 'fail.csv' + benchmark_metrics_csv = 'metrics.csv' + benchmark_success_csv = 'success.csv' + benchmark_latency_csv = 'latency.csv' + benchmark_status_csv = 'status.csv' for model, model_info in models.items(): logger.info("\n" + "="*40 + "="*len(model)) @@ -49,8 +47,10 @@ def main(): model_list_file = os.path.join(os.getcwd(), model +'.json') write_model_info_to_file([model_info], model_list_file) - - ep_list = get_ep_list(args.comparison) + if args.ep: + ep_list = [args.ep] + else: + ep_list = get_ep_list(args.comparison) for ep in ep_list: if args.running_mode == "validate": p = subprocess.run(["python3", @@ -91,24 +91,25 @@ def main(): Path(path).mkdir(parents=True, exist_ok=True) if args.running_mode == "validate": - logger.info("\n==========================================================") + logger.info("\n=========================================================") logger.info("========== Failing Models/EPs (accumulated) ==============") logger.info("==========================================================") if os.path.exists(FAIL_MODEL_FILE) or len(model_to_fail_ep) > 1: model_to_fail_ep = read_map_from_file(FAIL_MODEL_FILE) output_fail(model_to_fail_ep, os.path.join(path, benchmark_fail_csv)) - + logger.info("\nSaved model fail results to {}".format(benchmark_fail_csv)) logger.info(model_to_fail_ep) logger.info("\n=========================================") - logger.info("========== Models/EPs metrics ==========") + logger.info("=========== Models/EPs metrics ==========") logger.info("=========================================") if os.path.exists(METRICS_FILE): model_to_metrics = read_map_from_file(METRICS_FILE) output_metrics(model_to_metrics, os.path.join(path, benchmark_metrics_csv)) - + logger.info("\nSaved model metrics results to {}".format(benchmark_metrics_csv)) + elif args.running_mode == "benchmark": logger.info("\n=======================================================") logger.info("=========== Models/EPs Status (accumulated) ===========") @@ -124,28 +125,30 @@ def main(): model_fail = read_map_from_file(FAIL_MODEL_FILE) is_fail = True model_status = build_status(model_status, model_fail, is_fail) + + pretty_print(pp, model_status) - pp.pprint(model_status) output_status(model_status, os.path.join(path, benchmark_status_csv)) logger.info("\nSaved model status results to {}".format(benchmark_status_csv)) - logger.info("\n=======================================================") + logger.info("\n=========================================================") logger.info("=========== Models/EPs latency (accumulated) ===========") - logger.info("=======================================================") + logger.info("=========================================================") if os.path.exists(LATENCY_FILE): model_to_latency = read_map_from_file(LATENCY_FILE) add_improvement_information(model_to_latency) + + pretty_print(pp, model_to_latency) + output_latency(model_to_latency, os.path.join(path, benchmark_latency_csv)) - - pp.pprint(model_to_latency) - + logger.info("\nSaved model status results to {}".format(benchmark_latency_csv)) logger.info("\n===========================================") logger.info("=========== System information ===========") logger.info("===========================================") info = get_system_info() - pp.pprint(info) + pretty_print(pp, info) if __name__ == "__main__": main() diff --git a/onnxruntime/python/tools/tensorrt/perf/build/Dockerfile.tensorrt-perf b/onnxruntime/python/tools/tensorrt/perf/build/Dockerfile.tensorrt-perf new file mode 100644 index 0000000000..d6a64ef197 --- /dev/null +++ b/onnxruntime/python/tools/tensorrt/perf/build/Dockerfile.tensorrt-perf @@ -0,0 +1,4 @@ +FROM onnxruntime-trt +RUN apt-get update &&\ + apt-get -y install libprotobuf-dev protobuf-compiler pciutils &&\ + pip install coloredlogs numpy flake8 onnx Cython onnxmltools sympy packaging diff --git a/onnxruntime/python/tools/tensorrt/perf/build/build_images.sh b/onnxruntime/python/tools/tensorrt/perf/build/build_images.sh new file mode 100755 index 0000000000..f6d933ccf4 --- /dev/null +++ b/onnxruntime/python/tools/tensorrt/perf/build/build_images.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +while getopts o:p:b:i: parameter +do case "${parameter}" +in +o) ORT_DOCKERFILE_PATH=${OPTARG};; +p) PERF_DOCKERFILE_PATH=${OPTARG};; +b) ORT_BRANCH=${OPTARG};; +i) IMAGE_NAME=${OPTARG};; +esac +done + +sudo docker build --no-cache -t onnxruntime-trt --build-arg ONNXRUNTIME_BRANCH=$ORT_BRANCH -f $ORT_DOCKERFILE_PATH .. +sudo docker build --no-cache -t $IMAGE_NAME -f $PERF_DOCKERFILE_PATH .. diff --git a/onnxruntime/python/tools/tensorrt/perf/comparison_scripts/compare_latency.py b/onnxruntime/python/tools/tensorrt/perf/comparison_scripts/compare_latency.py new file mode 100644 index 0000000000..ae7b229590 --- /dev/null +++ b/onnxruntime/python/tools/tensorrt/perf/comparison_scripts/compare_latency.py @@ -0,0 +1,46 @@ +import pandas as pd +import numpy as np +import argparse + +ep_map = {"cpu": "CPU", "cuda":"CUDA","trt": "TRT EP","native": "Standalone TRT"} + +def parse_arguments(): + # create parser + parser = argparse.ArgumentParser() + parser.add_argument("-p", "--prev", required=True, help="previous csv") + parser.add_argument("-c", "--current", required=True, help="current csv") + parser.add_argument("-o", "--output_csv", required=True, help="output different csv") + parser.add_argument("--ep", required=False, default="trt", choices=["cpu", "cuda", "trt", "native"], help="ep to capture regressions on") + parser.add_argument("--tolerance", required=False, default=0, help="allowed tolerance for latency comparison") + args = parser.parse_args() + return args + +def get_table_condition(table, fp, ep, tol): + ep = ep_map[ep] + col1 = ep + " " + fp + " \nmean (ms)_x" + col2 = ep + " " + fp + " \nmean (ms)_y" + condition = table[col1] > (table[col2] + tol) + return condition + +def main(): + args = parse_arguments() + a = pd.read_csv(args.prev) + b = pd.read_csv(args.current) + + common = a.merge(b, on=['Model']) + + condition_fp32 = get_table_condition(common, "fp32", args.ep, args.tolerance) + condition_fp16 = get_table_condition(common, "fp16", args.ep, args.tolerance) + + common['greater'] = np.where((condition_fp32 | condition_fp16), True, False) + greater = common[common['greater'] == True].drop(['greater'], axis=1) + + # arrange columns + keys = list(greater.keys().sort_values()) + keys.insert(0, keys.pop(keys.index('Model'))) + greater = greater[keys] + + greater.to_csv(args.output_csv) + +if __name__=='__main__': + main() diff --git a/onnxruntime/python/tools/tensorrt/perf/comparison_scripts/new_failures.py b/onnxruntime/python/tools/tensorrt/perf/comparison_scripts/new_failures.py new file mode 100644 index 0000000000..e5a81d2dbd --- /dev/null +++ b/onnxruntime/python/tools/tensorrt/perf/comparison_scripts/new_failures.py @@ -0,0 +1,22 @@ +import pandas as pd +import argparse + +def parse_arguments(): + # create parser + parser = argparse.ArgumentParser() + parser.add_argument("-p", "--prev", required=True, help="previous csv") + parser.add_argument("-c", "--current", required=True, help="current csv") + parser.add_argument("-o", "--output_csv", required=True, help="output different csv") + args = parser.parse_args() + return args + +def main(): + args = parse_arguments() + a = pd.read_csv(args.prev) + b = pd.read_csv(args.current) + common = b.merge(a, on=['model','ep','error type','error message']) + diff = b.append(common, ignore_index=True).drop_duplicates(['model', 'ep', 'error type', 'error message'], keep=False).loc[:b.index.max()] + diff.to_csv(args.output_csv) + +if __name__=='__main__': + main() diff --git a/onnxruntime/python/tools/tensorrt/perf/ort_build_latest.py b/onnxruntime/python/tools/tensorrt/perf/ort_build_latest.py index 2081bda335..6ae2bd996a 100755 --- a/onnxruntime/python/tools/tensorrt/perf/ort_build_latest.py +++ b/onnxruntime/python/tools/tensorrt/perf/ort_build_latest.py @@ -1,6 +1,7 @@ import os import subprocess import argparse +import tarfile from perf_utils import get_latest_commit_hash def parse_arguments(): @@ -34,12 +35,13 @@ def install_new_ort_wheel(ort_master_path): def main(): args = parse_arguments() - p1 = subprocess.Popen(["sudo", "wget", "https://cmake.org/files/v3.17/cmake-3.17.4-Linux-x86_64.tar.gz"]) - p1.wait() - - p1 = subprocess.Popen(["tar", "zxvf", "cmake-3.17.4-Linux-x86_64.tar.gz"]) - p1.wait() - + cmake_tar = "cmake-3.17.4-Linux-x86_64.tar.gz" + if not os.path.exists(cmake_tar): + p = subprocess.run(["wget", "-c", "https://cmake.org/files/v3.17/" + cmake_tar], check=True) + tar = tarfile.open(cmake_tar) + tar.extractall() + tar.close() + os.environ["PATH"] = os.path.join(os.path.abspath("cmake-3.17.4-Linux-x86_64"), "bin") + ":" + os.environ["PATH"] os.environ["CUDACXX"] = os.path.join(args.cuda_home, "bin", "nvcc") diff --git a/onnxruntime/python/tools/tensorrt/perf/perf.sh b/onnxruntime/python/tools/tensorrt/perf/perf.sh index abc19c9752..2dcd854168 100755 --- a/onnxruntime/python/tools/tensorrt/perf/perf.sh +++ b/onnxruntime/python/tools/tensorrt/perf/perf.sh @@ -1,9 +1,21 @@ #!/bin/bash + + +while getopts d:o:m: parameter +do case "${parameter}" +in +d) PERF_DIR=${OPTARG};; +o) OPTION=${OPTARG};; +m) MODEL_PATH=${OPTARG};; +esac +done + # metadata FAIL_MODEL_FILE=".fail_model_map" LATENCY_FILE=".latency_map" METRICS_FILE=".metrics_map" +PROFILE="*onnxruntime_profile*" # files to download info SYMBOLIC_SHAPE_INFER="symbolic_shape_infer.py" @@ -17,49 +29,21 @@ cleanup_files() { rm -f $METRICS_FILE rm -f $SYMBOLIC_SHAPE_INFER rm -f $FLOAT_16 + rm -rf result/$OPTION + find -name $PROFILE -delete } download_files() { - sudo wget -c $SYMBOLIC_SHAPE_INFER_LINK - sudo wget -c $FLOAT_16_LINK + wget --no-check-certificate -c $SYMBOLIC_SHAPE_INFER_LINK + wget --no-check-certificate -c $FLOAT_16_LINK } -update_files() { +setup() { + cd $PERF_DIR cleanup_files download_files } -# many models -if [ "$1" == "many-models" ] -then - update_files - python3 benchmark_wrapper.py -r validate -m /home/hcsuser/mount/many-models -o result/"$1" - python3 benchmark_wrapper.py -r benchmark -i random -t 10 -m /home/hcsuser/mount/many-models -o result/"$1" -fi - -# ONNX model zoo -if [ "$1" == "onnx-zoo-models" ] -then - MODEL_LIST="model_list.json" - update_files - python3 benchmark_wrapper.py -r validate -m $MODEL_LIST -o result/"$1" - python3 benchmark_wrapper.py -r benchmark -i random -t 10 -m $MODEL_LIST -o result/"$1" -fi - -# 1P models -if [ "$1" == "partner-models" ] -then - MODEL_LIST="partner_model_list.json" - update_files - python3 benchmark_wrapper.py -r validate -m $MODEL_LIST -o result/"$1" - python3 benchmark_wrapper.py -r benchmark -i random -t 10 -m $MODEL_LIST -o result/"$1" -fi - -# Test models -if [ "$1" == "selected-models" ] -then - MODEL_LIST="selected_models.json" - update_files - python3 benchmark_wrapper.py -r validate -m $MODEL_LIST -o result/"$1" - python3 benchmark_wrapper.py -r benchmark -i random -t 1 -m $MODEL_LIST -o result/"$1" -fi +setup +python3 benchmark_wrapper.py -r validate -m $MODEL_PATH -o result/$OPTION +python3 benchmark_wrapper.py -r benchmark -i random -t 10 -m $MODEL_PATH -o result/$OPTION diff --git a/onnxruntime/python/tools/tensorrt/perf/perf_utils.py b/onnxruntime/python/tools/tensorrt/perf/perf_utils.py index 2767e8e2a9..a76cea2543 100644 --- a/onnxruntime/python/tools/tensorrt/perf/perf_utils.py +++ b/onnxruntime/python/tools/tensorrt/perf/perf_utils.py @@ -4,20 +4,28 @@ import pprint import logging import coloredlogs import re +import sys debug = False debug_verbose = False +def get_output(command): + p = subprocess.run(command, check=True, stdout=subprocess.PIPE) + output = p.stdout.decode("ascii").strip() + return output + def find(regex_string): import glob results = glob.glob(regex_string) results.sort() return results +def pretty_print(pp, json_object): + pp.pprint(json_object) + sys.stdout.flush() + def get_latest_commit_hash(): - p1 = subprocess.Popen(["git", "rev-parse", "--short", "HEAD"], stdout = subprocess.PIPE) - stdout, sterr = p1.communicate() - commit = stdout.decode("utf-8").strip() + commit = get_output(["git", "rev-parse", "--short", "HEAD"]) return commit def parse_single_file(f): diff --git a/onnxruntime/python/tools/tensorrt/perf/run_perf_docker.sh b/onnxruntime/python/tools/tensorrt/perf/run_perf_docker.sh new file mode 100755 index 0000000000..e49731ca08 --- /dev/null +++ b/onnxruntime/python/tools/tensorrt/perf/run_perf_docker.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# Parse Arguments +while getopts d:o:m: parameter +do case "${parameter}" +in +d) DOCKER_IMAGE=${OPTARG};; +o) OPTION=${OPTARG};; +m) MODEL_PATH=${OPTARG};; +esac +done + +# Variables +MACHINE_PERF_DIR=/home/hcsuser/perf/ +DOCKER_PERF_DIR=/usr/share/perf/ +PERF_SCRIPT=$DOCKER_PERF_DIR'perf.sh' +VOLUME=$MACHINE_PERF_DIR:$DOCKER_PERF_DIR + +# Add Remaining Variables +if [ $OPTION == "onnx-zoo-models" ] +then + MODEL_PATH=model.json +fi + +if [ $OPTION == "many-models" ] +then + MODEL_PATH=/usr/share/mount/many-models + VOLUME=$VOLUME' -v /home/hcsuser/mount/test:/usr/share/mount/many-models' +fi + +if [ $OPTION == "partner-models" ] +then + MODEL_PATH=partner_model_list.json +fi + +sudo docker run --gpus all -v $VOLUME $DOCKER_IMAGE /bin/bash $PERF_SCRIPT -d $DOCKER_PERF_DIR -o $OPTION -m $MODEL_PATH diff --git a/onnxruntime/python/tools/tensorrt/perf/run_perf_machine.sh b/onnxruntime/python/tools/tensorrt/perf/run_perf_machine.sh new file mode 100755 index 0000000000..1a9f16945f --- /dev/null +++ b/onnxruntime/python/tools/tensorrt/perf/run_perf_machine.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# Parse Arguments +while getopts d:o:m: parameter +do case "${parameter}" +in +o) OPTION=${OPTARG};; +m) MODEL_PATH=${OPTARG};; +esac +done + +# Variables +PERF_DIR=/home/hcsuser/perf/ + +# Select models to be tested or run selected-models +if [ $OPTION == "onnx-zoo-models" ] +then + MODEL_PATH='model.json' +fi + +if [ $OPTION == "many-models" ] +then + MODEL_PATH=/usr/share/mount/many-models +fi + +if [ $OPTION == "partner-models" ] +then + MODEL_PATH='partner_model_list.json' +fi + +./perf.sh -d $PERF_DIR -o $OPTION -m $MODEL_PATH diff --git a/onnxruntime/python/tools/tensorrt/perf/setup_scripts/setup_many_models.sh b/onnxruntime/python/tools/tensorrt/perf/setup_scripts/setup_many_models.sh new file mode 100755 index 0000000000..9d4de7be17 --- /dev/null +++ b/onnxruntime/python/tools/tensorrt/perf/setup_scripts/setup_many_models.sh @@ -0,0 +1,5 @@ +# !/bin/bash + +while true;do wget -T 15 -c "$1" && break;done +FILE="$(basename -- "$1")" +unzip $FILE.zip diff --git a/onnxruntime/python/tools/tensorrt/perf/setup_scripts/setup_onnx_zoo.py b/onnxruntime/python/tools/tensorrt/perf/setup_scripts/setup_onnx_zoo.py new file mode 100644 index 0000000000..eed793476a --- /dev/null +++ b/onnxruntime/python/tools/tensorrt/perf/setup_scripts/setup_onnx_zoo.py @@ -0,0 +1,71 @@ +import os +import wget +import tarfile +import json + +def get_tar_file(link): + file_name = link.split("/")[-1] + return file_name + +def create_model_folder(model): + os.mkdir(model) + +def extract_and_get_files(file_name): + model_folder = file_name.replace(".tar.gz", "") + '/' + create_model_folder(model_folder) + model_tar = tarfile.open(file_name) + model_tar.extractall(model_folder) + file_list = model_tar.getnames() + file_list.sort() + model_tar.close() + return model_folder, file_list + +def download_model(link): + file_name = get_tar_file(link) + wget.download(link) + model_folder, file_list = extract_and_get_files(file_name) + return model_folder, file_list + +def get_model_path(file_list): + for file_name in file_list: + if ".onnx" in file_name: + return file_name + +def get_test_path(model_path): + model_filename = os.path.basename(model_path) + test_path = model_path.split(model_filename)[0] + return test_path + +def create_model_object(model, folder, model_file_path, test_path): + model_dict = {} + model_dict["model_name"] = model + model_dict["working_directory"] = "./models/" + folder + model_dict["model_path"] = "./" + model_file_path + model_dict["test_data_path"] = "./" + test_path + return model_dict + +def get_model_info(link): + model_folder, file_list = download_model(link) + model = model_folder[:-1] + model_file_path = get_model_path(file_list) + test_path = get_test_path(model_file_path) + model_info = create_model_object(model, model_folder, model_file_path, test_path) + return model_info + +def write_json(models): + model_json = json.dumps(models, indent=4) + with open('model_list.json', 'w') as fp: + fp.write(models_json) + +def main(): + links = [] + with open('links.txt', 'r') as fh: + links = [link.rstrip() for link in fh.readlines()] + + model_list = [] + for link in links: + model_list.append(get_model_info(link)) + write_json(model_list) + +if __name__ == "__main__": + main() diff --git a/tools/ci_build/github/azure-pipelines/linux-gpu-tensorrt-ci-perf-pipeline.yml b/tools/ci_build/github/azure-pipelines/linux-gpu-tensorrt-ci-perf-pipeline.yml index 9f5d4f282b..c3dec967c6 100644 --- a/tools/ci_build/github/azure-pipelines/linux-gpu-tensorrt-ci-perf-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/linux-gpu-tensorrt-ci-perf-pipeline.yml @@ -3,27 +3,27 @@ jobs: pool: Linux-GPU-TensorRT-Perf variables: ALLOW_RELEASED_ONNX_OPSET_ONLY: '1' - timeoutInMinutes: 1200 + image: 'onnxruntime-master-ep-perf' + timeoutInMinutes: 2000 steps: - #- template: templates/set-test-data-variables-step.yml - # - - script: 'python3 ort_build_latest.py -c /usr/local/cuda-11.1/ -t /home/hcsuser/tensorrt/TensorRT-7.2.2/ -o /home/hcsuser/repos/onnxruntime' - displayName: 'Upgrade ORT wheel' - workingDirectory: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/' - - - script: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/perf.sh "onnx-zoo-models"' - displayName: 'Command Line Script 1' + + - script: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/build/build_images.sh -o $(Build.SourcesDirectory)/dockerfiles/Dockerfile.tensorrt -p $(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/build/Dockerfile.tensorrt-perf -b master -i $(image)' + displayName: 'Build latest ORT Images' + workingDirectory: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/build' + + - script: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/run_perf_docker.sh -d $(image) -o "onnx-zoo-models"' + displayName: 'Onnx Zoo Models Perf' workingDirectory: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/' - - script: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/perf.sh "many-models"' - displayName: 'Command Line Script 2' + - script: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/run_perf_docker.sh -d $(image) -o "many-models"' + displayName: 'Many Models Perf' workingDirectory: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/' - - script: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/perf.sh "partner-models"' - displayName: 'Command Line Script 3' + - script: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/run_perf_docker.sh -d $(image) -o "partner-models"' + displayName: 'Partner Models Perf' workingDirectory: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/' - - script: 'mkdir $(Build.SourcesDirectory)/Artifact && cp -r $(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/result/ $(Build.SourcesDirectory)/Artifact' + - script: 'mkdir $(Build.SourcesDirectory)/Artifact && cp -r /home/hcsuser/perf/result/ $(Build.SourcesDirectory)/Artifact' displayName: 'Prepare Artifacts' workingDirectory: '$(Build.SourcesDirectory)/onnxruntime/python/tools/tensorrt/perf/' From 9b3171e95cf767bcf11bd7507cadb092abe295ce Mon Sep 17 00:00:00 2001 From: Chi Lo <54722500+chilo-ms@users.noreply.github.com> Date: Thu, 25 Feb 2021 09:47:59 -0800 Subject: [PATCH 33/37] Make keepdims to its default value when adding ReduceMin/ReduceMax for quantization calibration (#6788) * Make keepdims to its default value when adding ReduceMin/ReduceMax * Fix bug for adding ReduceMin/ReduceMax with keepdims=1 --- .../python/tools/quantization/calibrate.py | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/onnxruntime/python/tools/quantization/calibrate.py b/onnxruntime/python/tools/quantization/calibrate.py index 2b8c9693d5..2c221389c0 100644 --- a/onnxruntime/python/tools/quantization/calibrate.py +++ b/onnxruntime/python/tools/quantization/calibrate.py @@ -10,7 +10,7 @@ import os import numpy as np import onnx import onnxruntime -from onnx import helper, TensorProto, ModelProto +from onnx import helper, TensorProto, ModelProto, shape_inference from onnx import onnx_pb as onnx_proto from six import string_types from enum import Enum @@ -52,6 +52,9 @@ class CalibraterBase: else: raise ValueError('model should be either model path or onnx.ModelProto.') + # Apply shape inference on the model + self.model = onnx.shape_inference.infer_shapes(self.model) + self.op_types_to_calibrate = op_types_to_calibrate self.augmented_model_path = augmented_model_path @@ -160,26 +163,27 @@ class MinMaxCalibrater(CalibraterBase): added_nodes = [] added_outputs = [] - tensors, _ = self.select_tensors_to_calibrate(model) + tensors, value_infos = self.select_tensors_to_calibrate(model) for tensor in tensors: + + # Get tensor's shape + dim = len(value_infos[tensor].type.tensor_type.shape.dim) + shape = (1,) if dim == 1 else list(1 for i in range(dim)) + # Adding ReduceMin nodes reduce_min_name = tensor + '_ReduceMin' - reduce_min_node = onnx.helper.make_node('ReduceMin', [tensor], [tensor + '_ReduceMin'], - reduce_min_name, - keepdims=0) + reduce_min_node = onnx.helper.make_node('ReduceMin', [tensor], [tensor + '_ReduceMin'], reduce_min_name) added_nodes.append(reduce_min_node) - added_outputs.append(helper.make_tensor_value_info(reduce_min_node.output[0], TensorProto.FLOAT, ())) + added_outputs.append(helper.make_tensor_value_info(reduce_min_node.output[0], TensorProto.FLOAT, shape)) # Adding ReduceMax nodes reduce_max_name = tensor + '_ReduceMax' - reduce_max_node = onnx.helper.make_node('ReduceMax', [tensor], [tensor + '_ReduceMax'], - reduce_max_name, - keepdims=0) + reduce_max_node = onnx.helper.make_node('ReduceMax', [tensor], [tensor + '_ReduceMax'], reduce_max_name) added_nodes.append(reduce_max_node) - added_outputs.append(helper.make_tensor_value_info(reduce_max_node.output[0], TensorProto.FLOAT, ())) + added_outputs.append(helper.make_tensor_value_info(reduce_max_node.output[0], TensorProto.FLOAT, shape)) model.graph.node.extend(added_nodes) model.graph.output.extend(added_outputs) From 34261087396f31b74c4874665928efa474651832 Mon Sep 17 00:00:00 2001 From: Surya Siddharth Pemmaraju Date: Fri, 26 Feb 2021 06:34:43 -0800 Subject: [PATCH 34/37] Fixed issue in python cmake to update wheel package (#6384) * Fixed issue in python cmake to update wheel package * Fixes python cmake issue for OV EP Added post build step for libonnxruntime_providers_openvino that copies the updated libonnxruntime_providers_openvino.so file to /onnxruntime/capi directory every time this target is rebuilt. Signed-off-by: MaajidKhan * Removed post_build step from onnxruntime_python.cmake Now that we have added the post build step to copy onnxruntime_providers_openvino.so and providers_shared.so to /onnxruntime/capi directory in onnxruntime_providers.cmake file. so removing the duplication of the same from here. Signed-off-by: MaajidKhan * Fixed python cmake issue for OpenVINO-EP ->Fixed issue for both Linux and windows Signed-off-by: MaajidKhan Co-authored-by: MaajidKhan --- cmake/onnxruntime_python.cmake | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmake/onnxruntime_python.cmake b/cmake/onnxruntime_python.cmake index 566d9bd45e..ce333c3cab 100644 --- a/cmake/onnxruntime_python.cmake +++ b/cmake/onnxruntime_python.cmake @@ -395,15 +395,13 @@ if (onnxruntime_USE_TENSORRT) endif() if (onnxruntime_USE_OPENVINO) - if(NOT WIN32) add_custom_command( TARGET onnxruntime_pybind11_state POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy - ${OPENVINO_DLL_PATH} $ + $ $ $/onnxruntime/capi/ ) - endif() endif() if (onnxruntime_USE_TVM) From d5175795d2b7f2db18b0390f394a49238f814668 Mon Sep 17 00:00:00 2001 From: Pranav Prakash Date: Fri, 26 Feb 2021 10:21:37 -0800 Subject: [PATCH 35/37] Improvements to quantizer: Removed unused qType field, add reshape op (#6179) * Handle case where bias_name is already quantized If bias is shared between multiple nodes and we've already quantized it, just return the quantized name from the map * Remove qType attribute from QuantizedValue and QuantizedInitializer These are unused (and were incorrectly set in the case of int8 quantization) * Add Reshape op to quantizer * Add test for Reshape quant --- .../tools/quantization/onnx_quantizer.py | 11 ++- .../tools/quantization/operators/gavgpool.py | 2 +- .../tools/quantization/operators/pad.py | 4 +- .../tools/quantization/operators/reshape.py | 31 +++++++ .../tools/quantization/qdq_quantizer.py | 2 +- .../python/tools/quantization/quant_utils.py | 29 +++--- .../python/tools/quantization/registry.py | 5 +- .../python/quantization/test_op_reshape.py | 89 +++++++++++++++++++ 8 files changed, 145 insertions(+), 28 deletions(-) create mode 100644 onnxruntime/python/tools/quantization/operators/reshape.py create mode 100644 onnxruntime/test/python/quantization/test_op_reshape.py diff --git a/onnxruntime/python/tools/quantization/onnx_quantizer.py b/onnxruntime/python/tools/quantization/onnx_quantizer.py index aff75a84b8..5d8657e80a 100644 --- a/onnxruntime/python/tools/quantization/onnx_quantizer.py +++ b/onnxruntime/python/tools/quantization/onnx_quantizer.py @@ -531,6 +531,10 @@ class ONNXQuantizer: Quantized the bias. Zero Point == 0 and Scale == Input_Scale * Weight_Scale ''' + # Handle case where bias already in quantizatio map + if bias_name in self.quantized_value_map: + return self.quantized_value_map[bias_name].q_name + # get scale for weight weight_scale_name = self.quantized_value_map[weight_name].scale_name weight_initializer = find_by_name(weight_scale_name, self.model.initializer()) @@ -571,8 +575,7 @@ class ONNXQuantizer: assert (bias_name not in self.quantized_value_map) quantized_value = QuantizedValue(bias_name, quantized_bias_name, quantized_bias_scale_name, "", - QuantizedValueType.Initializer, 0 if bias_scale_data.size > 1 else None, - onnx_proto.TensorProto.INT32) + QuantizedValueType.Initializer, 0 if bias_scale_data.size > 1 else None) self.quantized_value_map[bias_name] = quantized_value return quantized_bias_name @@ -664,7 +667,7 @@ class ONNXQuantizer: # Log entry for this quantized weight quantized_value = QuantizedValue(weight.name, q_weight_name, scale_name, zp_name, - QuantizedValueType.Initializer, None, qType) + QuantizedValueType.Initializer, None) self.quantized_value_map[weight.name] = quantized_value return q_weight_name, zp_name, scale_name @@ -710,7 +713,7 @@ class ONNXQuantizer: scale_name = weight_name + "_scale" quantized_value = QuantizedValue(weight_name, q_weight_name, scale_name, zp_name, - QuantizedValueType.Initializer, None, weight_qType) + QuantizedValueType.Initializer, None) self.quantized_value_map[weight_name] = quantized_value # Update packed weight, zero point, and scale initializers diff --git a/onnxruntime/python/tools/quantization/operators/gavgpool.py b/onnxruntime/python/tools/quantization/operators/gavgpool.py index f3be0d4afd..0dbf9bdada 100644 --- a/onnxruntime/python/tools/quantization/operators/gavgpool.py +++ b/onnxruntime/python/tools/quantization/operators/gavgpool.py @@ -24,7 +24,7 @@ class QGlobalAveragePool(QuantOperatorBase): output_scale_name = output_scale_name_from_parameter if data_found else quantized_input_value.scale_name output_zp_name = output_zp_name_from_parameter if data_found else quantized_input_value.zp_name quantized_output_value = QuantizedValue(node.output[0], node.output[0] + "_quantized", output_scale_name, - output_zp_name, quantized_input_value.qType) + output_zp_name) self.quantizer.quantized_value_map[node.output[0]] = quantized_output_value kwargs = {} diff --git a/onnxruntime/python/tools/quantization/operators/pad.py b/onnxruntime/python/tools/quantization/operators/pad.py index 2fa31c9672..ed3d001a35 100644 --- a/onnxruntime/python/tools/quantization/operators/pad.py +++ b/onnxruntime/python/tools/quantization/operators/pad.py @@ -39,7 +39,7 @@ class QPad(QuantOperatorBase): scale_array = onnx.numpy_helper.to_array(scale_tensor) scale_value = scale_array.item() if scale_array.ndim == 0 else scale_array[0] padding_constant_array = onnx.numpy_helper.to_array(padding_constant_initializer) - quantized_padding_constant_array = quantize_nparray(quantized_input_value.qType, + quantized_padding_constant_array = quantize_nparray(self.quantizer.input_qType, padding_constant_array, scale_value, zp_value) quantized_padding_constant_name = node.input[2] + "_quantized" quantized_padding_constant_initializer = onnx.numpy_helper.from_array( @@ -49,7 +49,7 @@ class QPad(QuantOperatorBase): self.quantizer.model.add_initializer(quantized_padding_constant_initializer) node.input[2] = quantized_padding_constant_name else: - pad_value_qnodes = self.quantizer._get_quantize_input_nodes(node, 2, quantized_input_value.qType, + pad_value_qnodes = self.quantizer._get_quantize_input_nodes(node, 2, self.quantizer.input_qType, quantized_input_value.scale_name, quantized_input_value.zp_name) self.quantizer.new_nodes += [pad_value_qnodes] diff --git a/onnxruntime/python/tools/quantization/operators/reshape.py b/onnxruntime/python/tools/quantization/operators/reshape.py new file mode 100644 index 0000000000..f856cb6837 --- /dev/null +++ b/onnxruntime/python/tools/quantization/operators/reshape.py @@ -0,0 +1,31 @@ +import onnx +from .base_operator import QuantOperatorBase +from ..quant_utils import QuantizedValue, QuantizedValueType +from onnx import onnx_pb as onnx_proto + + +class ReshapeQuant(QuantOperatorBase): + def __init__(self, onnx_quantizer, onnx_node): + super().__init__(onnx_quantizer, onnx_node) + + def quantize(self): + node = self.node + assert (node.op_type == "Reshape") + + # If input to this node is not quantized then keep this node + if node.input[0] not in self.quantizer.quantized_value_map: + self.quantizer.new_nodes += [node] + return + + # Reshape is a no-op in terms of quantization + quantized_input_value = self.quantizer.quantized_value_map[node.input[0]] + quantized_output_value = QuantizedValue(node.output[0], node.output[0] + "_quantized", + quantized_input_value.scale_name, quantized_input_value.zp_name, + QuantizedValueType.Input) + # Create an entry for output quantized value + self.quantizer.quantized_value_map[node.output[0]] = quantized_output_value + + node.input[0] = quantized_input_value.q_name + node.output[0] = quantized_output_value.q_name + self.quantizer.new_nodes += [node] + diff --git a/onnxruntime/python/tools/quantization/qdq_quantizer.py b/onnxruntime/python/tools/quantization/qdq_quantizer.py index a127fcaf46..d9b9532709 100644 --- a/onnxruntime/python/tools/quantization/qdq_quantizer.py +++ b/onnxruntime/python/tools/quantization/qdq_quantizer.py @@ -134,7 +134,7 @@ class QDQQuantizer(ONNXQuantizer): self.model.add_nodes([qlinear_node, dequant_node]) quantized_value = QuantizedValue(tensor_name, tensor_name + "_QuantizeLinear", scale_name, zp_name, - QuantizedValueType.Input, None, self.input_qType) + QuantizedValueType.Input) self.quantized_value_map[tensor_name] = quantized_value def quantize_bias_tensors(self): diff --git a/onnxruntime/python/tools/quantization/quant_utils.py b/onnxruntime/python/tools/quantization/quant_utils.py index d90504bf8f..cc36477b85 100644 --- a/onnxruntime/python/tools/quantization/quant_utils.py +++ b/onnxruntime/python/tools/quantization/quant_utils.py @@ -93,15 +93,15 @@ class QuantFormat(Enum): except KeyError: raise ValueError() - -QUANT_TYPE_TO_NP_TYPE = { - QuantType.QInt8: numpy.dtype('int8'), - QuantType.QUInt8: numpy.dtype('uint8'), +ONNX_TYPE_TO_NP_TYPE = { + onnx_proto.TensorProto.INT8: numpy.dtype('int8'), + onnx_proto.TensorProto.UINT8: numpy.dtype('uint8') } - -def quantize_nparray(qtype, arr, scale, zero_point, low=None, high=None): - dtype = QUANT_TYPE_TO_NP_TYPE[qtype] +def quantize_nparray(qType, arr, scale, zero_point, low=None, high=None): + assert qType in ONNX_TYPE_TO_NP_TYPE, \ + "Unexpected data type {} requested. Only INT8 and UINT8 are supported.".format(qType) + dtype = ONNX_TYPE_TO_NP_TYPE[qType] cliplow = max(0 if dtype == numpy.uint8 else -127, -127 if low is None else low) cliphigh = min(255 if dtype == numpy.uint8 else 127, 255 if high is None else high) arr_fp32 = numpy.asarray((arr.astype(numpy.float32) / scale).round() + zero_point) @@ -144,12 +144,7 @@ def quantize_data(data, quantize_range, qType): rmax = max(max(data), 0) zero_point, scale = compute_scale_zp(rmin, rmax, qType, quantize_range) - if qType == onnx_proto.TensorProto.INT8: - quantized_data = quantize_nparray(QuantType.QInt8, numpy.asarray(data), scale, zero_point) - elif qType == onnx_proto.TensorProto.UINT8: - quantized_data = quantize_nparray(QuantType.QUInt8, numpy.asarray(data), scale, zero_point) - else: - raise ValueError("Unexpected data type {} requested. Only INT8 and UINT8 are supported.".format(qType)) + quantized_data = quantize_nparray(qType, numpy.asarray(data), scale, zero_point) return rmin, rmax, zero_point, scale, quantized_data @@ -181,8 +176,7 @@ class QuantizedInitializer: scales, data=[], quantized_data=[], - axis=None, - qType=QuantType.QUInt8): + axis=None): self.name = name self.initializer = initializer # TensorProto initializer in ONNX graph self.rmins = rmins # List of minimum range for each axis @@ -195,7 +189,6 @@ class QuantizedInitializer: # Scalar to specify which dimension in the initializer to weight pack. self.axis = axis # If empty, single zero point and scales computed from a single rmin and rmax - self.qType = qType # type of quantized data. class QuantizedValue: @@ -208,15 +201,13 @@ class QuantizedValue: scale_name, zero_point_name, quantized_value_type, - axis=None, - qType=QuantType.QUInt8): + axis=None): self.original_name = name self.q_name = new_quantized_name self.scale_name = scale_name self.zp_name = zero_point_name self.value_type = quantized_value_type self.axis = axis - self.qType = qType class BiasToQuantize: diff --git a/onnxruntime/python/tools/quantization/registry.py b/onnxruntime/python/tools/quantization/registry.py index 71c8a6a58b..26c7daf299 100644 --- a/onnxruntime/python/tools/quantization/registry.py +++ b/onnxruntime/python/tools/quantization/registry.py @@ -13,8 +13,11 @@ from .operators.gavgpool import QGlobalAveragePool from .operators.lstm import LSTMQuant from .operators.split import QSplit from .operators.pad import QPad +from .operators.reshape import ReshapeQuant -CommonOpsRegistry = {"Gather": GatherQuant, "EmbedLayerNormalization": EmbedLayerNormalizationQuant} +CommonOpsRegistry = {"Gather": GatherQuant, + "EmbedLayerNormalization": EmbedLayerNormalizationQuant, + "Reshape": ReshapeQuant} IntegerOpsRegistry = { "Conv": ConvInteger, diff --git a/onnxruntime/test/python/quantization/test_op_reshape.py b/onnxruntime/test/python/quantization/test_op_reshape.py new file mode 100644 index 0000000000..db5c49dc49 --- /dev/null +++ b/onnxruntime/test/python/quantization/test_op_reshape.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python +# coding: utf-8 +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +import unittest +import onnx +import numpy as np +from onnx import helper, TensorProto +from onnxruntime.quantization import quantize_static +from op_test_utils import TestDataFeeds, check_model_correctness, check_op_type_count + +class TestOpReshape(unittest.TestCase): + def input_feeds(self, n, name2shape): + input_data_list = [] + for i in range(n): + inputs = {} + for name, shape in name2shape.items(): + inputs.update({name: np.random.randint(-1, 2, shape).astype(np.float32)}) + input_data_list.extend([inputs]) + dr = TestDataFeeds(input_data_list) + return dr + + def construct_model_matmul_reshape(self, output_model_path, input_shape, weight_shape, output_shape): + # (input) + # | + # MatMul + # | + # Reshape + # | + # (output) + input_name = 'input' + output_name = 'output' + initializers = [] + + # make MatMul node + weight_name = 'matmul_weight' + matmul_output_name = 'matmul_output' + matmul_inputs = [input_name, weight_name] + matmul_outputs = [matmul_output_name] + matmul_name = 'matmul_node' + matmul_weight_data = np.random.normal(0, 0.1, weight_shape).astype(np.float32) + initializers.append(onnx.numpy_helper.from_array(matmul_weight_data, name=weight_name)) + + matmul_node = onnx.helper.make_node('MatMul', matmul_inputs, matmul_outputs, name=matmul_name) + + # make Reshape node + reshape_shape = 'reshape_shape' + reshape_inputs = [matmul_output_name, reshape_shape] + reshape_output = [output_name] + reshape_name = 'reshape_node' + initializers.append(onnx.numpy_helper.from_array(np.array(output_shape, dtype=np.int64), name=reshape_shape)) + reshape_node = onnx.helper.make_node('Reshape', reshape_inputs, reshape_output, name=reshape_name) + + + # make graph + input_tensor = helper.make_tensor_value_info(input_name, TensorProto.FLOAT, input_shape) + output_tensor = helper.make_tensor_value_info(output_name, TensorProto.FLOAT, output_shape) + graph_name = 'Reshape_Quant_Test' + graph = helper.make_graph([matmul_node, reshape_node], graph_name, + [input_tensor], [output_tensor], initializer=initializers) + model = helper.make_model(graph, opset_imports=[helper.make_opsetid("", 11)]) + model.ir_version = onnx.IR_VERSION + + onnx.save(model, output_model_path) + + def test_quantize_reshape(self): + np.random.seed(1) + model_fp32_path = 'reshape_fp32.onnx' + model_uint8_path = 'reshape_uint8.onnx' + data_reader = self.input_feeds(1, {'input': [3, 7]}) + self.construct_model_matmul_reshape(model_fp32_path, + [3, 7], + [7, 3], + [1, 9]) + quantize_static(model_fp32_path, + model_uint8_path, + data_reader + ) + data_reader.rewind() + qdq_nodes = {'QLinearMatMul': 1, 'QuantizeLinear': 1, 'DequantizeLinear': 1, 'Reshape': 1} + check_op_type_count(self, model_uint8_path, **qdq_nodes) + check_model_correctness(self, model_fp32_path, model_uint8_path, data_reader.get_next()) + +if __name__ == '__main__': + unittest.main() From b4b87ac7a00585fff27632ac2faf653cdbc95b9f Mon Sep 17 00:00:00 2001 From: Ye Wang <52801275+wangyems@users.noreply.github.com> Date: Fri, 26 Feb 2021 13:58:41 -0800 Subject: [PATCH 36/37] update (#6827) --- .../tools/transformers/huggingface_models.py | 20 +++++++++---------- .../tools/transformers/onnx_exporter.py | 5 +---- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/onnxruntime/python/tools/transformers/huggingface_models.py b/onnxruntime/python/tools/transformers/huggingface_models.py index 1f4a1c9fa2..6cbdf194ea 100644 --- a/onnxruntime/python/tools/transformers/huggingface_models.py +++ b/onnxruntime/python/tools/transformers/huggingface_models.py @@ -9,16 +9,6 @@ MODEL_CLASSES = [ 'AutoModel', 'AutoModelWithLMHead', 'AutoModelForSequenceClassification', 'AutoModelForQuestionAnswering' ] -# List of models that require external data saving for onnx export but do not require it when saving optimized onnx model -# Very few models in the huggingface list require it for both: albert-xxlarge-v1, albert-xxlarge-v2 -# TODO: most of the models in the below exempt list having runtime issues when saving these optimized onnx models -# using external data format. Need to address the issue in the future -EXEMPT_MODELS = [ - "gpt2-large", "gpt2-xl", "xlm-mlm-en-2048", "xlm-mlm-17-1280", "xlm-mlm-100-1280", "ctrl", "albert-xlarge-v1", - "albert-xlarge-v2", "t5-large", "t5-3b", "t5-11b", "xlm-roberta-large", "microsoft/DialoGPT-large", - "facebook/mbart-large-en-ro" -] - # List of pretrained models: https://huggingface.co/transformers/pretrained_models.html # Pretrained model name to a tuple of input names, opset_version, use_external_data_format, optimization model type MODELS = { @@ -105,4 +95,14 @@ MODELS = { # Longformer (use benchmark_longformer.py instead) #"allenai/longformer-base-4096": (["input_ids"], 12, False, "bert"), #"allenai/longformer-large-4096": (["input_ids"], 12, False, "bert"), + # MBart + "facebook/mbart-large-cc25": (["input_ids"], 11, True, "bert"), + "facebook/mbart-large-en-ro": (["input_ids"], 11, True, "bert"), + # Layoutlm + "microsoft/layoutlm-base-uncased": (["input_ids"], 11, False, "bert"), + "microsoft/layoutlm-large-uncased": (["input_ids"], 11, False, "bert"), + # Squeezebert + "squeezebert/squeezebert-uncased": (["input_ids"], 11, False, "bert"), + "squeezebert/squeezebert-mnli": (["input_ids"], 11, False, "bert"), + "squeezebert/squeezebert-mnli-headless": (["input_ids"], 11, False, "bert"), } diff --git a/onnxruntime/python/tools/transformers/onnx_exporter.py b/onnxruntime/python/tools/transformers/onnx_exporter.py index 5ba7a19701..71d08705fd 100644 --- a/onnxruntime/python/tools/transformers/onnx_exporter.py +++ b/onnxruntime/python/tools/transformers/onnx_exporter.py @@ -13,7 +13,7 @@ from transformers import AutoConfig, AutoTokenizer, AutoModel from benchmark_helper import create_onnxruntime_session, Precision from gpt2_helper import GPT2ModelNoPastState, PRETRAINED_GPT2_MODELS from quantize_helper import QuantizeHelper -from huggingface_models import MODEL_CLASSES, EXEMPT_MODELS +from huggingface_models import MODEL_CLASSES logger = logging.getLogger(__name__) @@ -203,9 +203,6 @@ def optimize_onnx_model(model_name, onnx_model_path, optimized_model_path, model if Precision.FLOAT16 == precision: opt_model.convert_model_float32_to_float16() - if model_name in EXEMPT_MODELS: - use_external_data_format = False - opt_model.save_model_to_file(optimized_model_path, use_external_data_format) else: logger.info(f"Skip optimization since model existed: {optimized_model_path}") From cb8d8464bc6ee39a894ecc76e05574095f5eb489 Mon Sep 17 00:00:00 2001 From: "M. Zeeshan Siddiqui" Date: Fri, 26 Feb 2021 20:13:02 -0800 Subject: [PATCH 37/37] Do not create compute stream when external CUDA allocator is used. (#6833) --- onnxruntime/core/providers/cuda/cuda_allocator.h | 2 +- .../core/providers/cuda/cuda_execution_provider.cc | 10 +++++++++- .../providers/cuda/cuda_execution_provider_info.cc | 13 ++++++++----- .../providers/cuda/cuda_execution_provider_info.h | 11 ++++++++--- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/onnxruntime/core/providers/cuda/cuda_allocator.h b/onnxruntime/core/providers/cuda/cuda_allocator.h index 0dd6d1e300..097662e9d5 100644 --- a/onnxruntime/core/providers/cuda/cuda_allocator.h +++ b/onnxruntime/core/providers/cuda/cuda_allocator.h @@ -28,7 +28,7 @@ class CUDAExternalAllocator : public CUDAAllocator { typedef void (*ExternalFree)(void* p); public: - CUDAExternalAllocator(OrtDevice::DeviceId device_id, const char* name, void* alloc, void* free) + CUDAExternalAllocator(OrtDevice::DeviceId device_id, const char* name, const void* alloc, const void* free) : CUDAAllocator(device_id, name) { alloc_ = reinterpret_cast(alloc); free_ = reinterpret_cast(free); diff --git a/onnxruntime/core/providers/cuda/cuda_execution_provider.cc b/onnxruntime/core/providers/cuda/cuda_execution_provider.cc index 0e2e542a48..60e9d9d315 100644 --- a/onnxruntime/core/providers/cuda/cuda_execution_provider.cc +++ b/onnxruntime/core/providers/cuda/cuda_execution_provider.cc @@ -127,11 +127,19 @@ CUDAExecutionProvider::CUDAExecutionProvider(const CUDAExecutionProviderInfo& in // must wait GPU idle, otherwise cudaGetDeviceProperties might fail CUDA_CALL_THROW(cudaDeviceSynchronize()); CUDA_CALL_THROW(cudaGetDeviceProperties(&device_prop_, info_.device_id)); + + // This scenario is not supported. + ORT_ENFORCE(!(info.has_user_compute_stream && info.external_allocator_info.UseExternalAllocator())); + if (info.has_user_compute_stream) { external_stream_ = true; stream_ = static_cast(info.user_compute_stream); } else { - CUDA_CALL_THROW(cudaStreamCreateWithFlags(&stream_, cudaStreamNonBlocking)); + if (info.external_allocator_info.UseExternalAllocator()) { + stream_ = nullptr; + } else { + CUDA_CALL_THROW(cudaStreamCreateWithFlags(&stream_, cudaStreamNonBlocking)); + } } size_t free = 0; diff --git a/onnxruntime/core/providers/cuda/cuda_execution_provider_info.cc b/onnxruntime/core/providers/cuda/cuda_execution_provider_info.cc index 1b94ace424..927e6687fd 100644 --- a/onnxruntime/core/providers/cuda/cuda_execution_provider_info.cc +++ b/onnxruntime/core/providers/cuda/cuda_execution_provider_info.cc @@ -36,7 +36,8 @@ const EnumNameMapping arena_extend_strategy_mapping{ CUDAExecutionProviderInfo CUDAExecutionProviderInfo::FromProviderOptions(const ProviderOptions& options) { CUDAExecutionProviderInfo info{}; - + void* alloc = nullptr; + void* free = nullptr; ORT_THROW_IF_ERROR( ProviderOptionsParser{} .AddValueParser( @@ -55,18 +56,18 @@ CUDAExecutionProviderInfo CUDAExecutionProviderInfo::FromProviderOptions(const P }) .AddValueParser( cuda::provider_option_names::kcudaExternalAlloc, - [&info](const std::string& value_str) -> Status { + [&alloc](const std::string& value_str) -> Status { size_t address; ORT_RETURN_IF_ERROR(ParseStringWithClassicLocale(value_str, address)); - info.external_allocator_info.alloc = reinterpret_cast(address); + alloc = reinterpret_cast(address); return Status::OK(); }) .AddValueParser( cuda::provider_option_names::kcudaExternalFree, - [&info](const std::string& value_str) -> Status { + [&free](const std::string& value_str) -> Status { size_t address; ORT_RETURN_IF_ERROR(ParseStringWithClassicLocale(value_str, address)); - info.external_allocator_info.free = reinterpret_cast(address); + free = reinterpret_cast(address); return Status::OK(); }) .AddAssignmentToReference(cuda::provider_option_names::kMemLimit, info.cuda_mem_limit) @@ -79,6 +80,8 @@ CUDAExecutionProviderInfo CUDAExecutionProviderInfo::FromProviderOptions(const P .AddAssignmentToReference(cuda::provider_option_names::kDoCopyInDefaultStream, info.do_copy_in_default_stream) .Parse(options)); + CUDAExecutionProviderExternalAllocatorInfo alloc_info{alloc, free}; + info.external_allocator_info = alloc_info; return info; } diff --git a/onnxruntime/core/providers/cuda/cuda_execution_provider_info.h b/onnxruntime/core/providers/cuda/cuda_execution_provider_info.h index d398871e5d..d08fee602b 100644 --- a/onnxruntime/core/providers/cuda/cuda_execution_provider_info.h +++ b/onnxruntime/core/providers/cuda/cuda_execution_provider_info.h @@ -13,15 +13,20 @@ namespace onnxruntime { // Information needed to construct CUDA execution providers. struct CUDAExecutionProviderExternalAllocatorInfo { - void* alloc{nullptr}; - void* free{nullptr}; + const void* alloc{nullptr}; + const void* free{nullptr}; CUDAExecutionProviderExternalAllocatorInfo() { alloc = nullptr; free = nullptr; } - bool UseExternalAllocator() { + CUDAExecutionProviderExternalAllocatorInfo(void* a, void* f) { + alloc = a; + free = f; + } + + bool UseExternalAllocator() const { return (alloc != nullptr) && (free != nullptr); } };