From d7ce24429de264a0602357cb28a6561192cea127 Mon Sep 17 00:00:00 2001 From: Jason Dreyzehner Date: Fri, 5 Jan 2024 02:30:33 -0500 Subject: [PATCH] feat: key generation utilities, utf8 normalization, expose script source compilations in ResolvedScript, rename authenticationTemplate -> walletTemplate, upgrade dependencies, improve formatting --- .cspell.json | 36 +- .eslintrc | 33 +- .github/CONTRIBUTING.md | 2 +- .github/workflows/benchmark.yaml | 8 +- .github/workflows/ci.yaml | 5 +- .github/workflows/doc.yaml | 4 +- .gitmodules | 7 +- .pnp.cjs | 18679 ++++++++++++++++ .pnp.loader.mjs | 2090 ++ .prettierignore | 9 +- .vscode/extensions.json | 4 +- .vscode/settings.json | 11 +- .yarn | 2 +- .yarnrc.yml | 8 +- CHANGELOG-v1-to-v2.md | 5 +- README.md | 2 +- config/api-extractor.json | 680 +- config/eslint-config-bitauth | 1 + docs/errors.md | 3 +- package.json | 97 +- src/lib/address/base58-address.spec.ts | 56 +- src/lib/address/base58-address.ts | 12 +- src/lib/address/bech32.spec.ts | 69 +- src/lib/address/bech32.ts | 28 +- src/lib/address/cash-address.spec.ts | 169 +- src/lib/address/cash-address.ts | 69 +- src/lib/address/locking-bytecode.spec.ts | 84 +- src/lib/address/locking-bytecode.ts | 42 +- src/lib/bin/hashes.ts | 24 +- src/lib/bin/secp256k1/secp256k1-wasm-types.ts | 112 +- src/lib/bin/secp256k1/secp256k1-wasm.spec.ts | 126 +- src/lib/bin/secp256k1/secp256k1-wasm.ts | 68 +- .../compiler-bch-operations.spec.ts | 8 +- ...ompiler-bch.e2e.built-in-variables.spec.ts | 110 +- .../compiler-bch.e2e.data-signatures.spec.ts | 32 +- .../compiler-bch.e2e.evaluations.spec.ts | 36 +- .../compiler-bch.e2e.hd-key.spec.ts | 102 +- .../compiler-bch/compiler-bch.e2e.key.spec.ts | 58 +- .../compiler-bch.e2e.langauge.spec.ts | 36 +- .../compiler-bch.e2e.p2sh.spec.ts | 18 +- ...e.signing-serialization-algorithms.spec.ts | 34 +- .../compiler-bch.e2e.spec.helper.ts | 12 +- .../compiler-bch.e2e.variables.spec.ts | 44 +- .../compiler-bch/compiler-bch.spec.ts | 56 +- src/lib/compiler/compiler-bch/compiler-bch.ts | 65 +- src/lib/compiler/compiler-defaults.ts | 16 +- .../compiler-operation-helpers.spec.ts | 4 +- .../compiler/compiler-operation-helpers.ts | 28 +- src/lib/compiler/compiler-operations.ts | 61 +- src/lib/compiler/compiler-types.ts | 134 +- src/lib/compiler/compiler-utils.ts | 112 +- src/lib/compiler/compiler.spec.ts | 40 +- src/lib/compiler/compiler.ts | 2 +- src/lib/compiler/p2pkh-utils.ts | 19 +- src/lib/compiler/scenarios.spec.ts | 310 +- src/lib/compiler/scenarios.ts | 209 +- src/lib/compiler/standard/p2pkh.spec.ts | 37 +- src/lib/compiler/standard/p2pkh.ts | 22 +- src/lib/crypto/combinations.ts | 4 +- src/lib/crypto/hash.bench.helper.ts | 50 +- src/lib/crypto/hash.browser.bench.helper.ts | 42 +- src/lib/crypto/hash.browser.bench.ts | 21 +- src/lib/crypto/hash.spec.helper.ts | 65 +- src/lib/crypto/hmac.spec.ts | 15 +- src/lib/crypto/hmac.ts | 6 +- src/lib/crypto/ripemd160.bench.ts | 2 +- src/lib/crypto/ripemd160.ts | 16 +- src/lib/crypto/secp256k1-types.ts | 114 +- src/lib/crypto/secp256k1.bench.ts | 57 +- src/lib/crypto/secp256k1.spec.ts | 485 +- src/lib/crypto/secp256k1.ts | 82 +- src/lib/crypto/sha1.ts | 16 +- src/lib/crypto/sha256.ts | 16 +- src/lib/crypto/sha512.ts | 16 +- src/lib/engine/engine.ts | 8 + src/lib/engine/types/bcmr-types.ts | 940 + .../types}/template-types.ts | 412 +- src/lib/format/base-convert.spec.ts | 41 +- src/lib/format/base-convert.ts | 34 +- src/lib/format/base64.ts | 14 +- src/lib/format/bin-string.spec.ts | 7 +- src/lib/format/bin-string.ts | 6 +- src/lib/format/error.ts | 6 +- src/lib/format/hex.spec.ts | 11 +- src/lib/format/hex.ts | 14 +- src/lib/format/log.spec.ts | 19 +- src/lib/format/log.ts | 11 +- src/lib/format/number.bench.ts | 3 +- src/lib/format/number.spec.ts | 145 +- src/lib/format/number.ts | 84 +- src/lib/format/read.spec.ts | 20 +- src/lib/format/read.ts | 28 +- src/lib/format/time.spec.ts | 19 +- src/lib/format/time.ts | 4 +- src/lib/format/type-utils.ts | 44 +- src/lib/format/utf8.spec.ts | 7 +- src/lib/format/utf8.ts | 52 + src/lib/key/hd-key.spec.ts | 239 +- src/lib/key/hd-key.ts | 190 +- src/lib/key/key-utils.spec.ts | 39 +- src/lib/key/key-utils.ts | 204 +- src/lib/key/wallet-import-format.spec.ts | 16 +- src/lib/key/wallet-import-format.ts | 10 +- src/lib/language/compile.spec.ts | 304 +- src/lib/language/compile.ts | 6 +- src/lib/language/language-types.ts | 302 +- src/lib/language/language-utils.spec.ts | 90 +- src/lib/language/language-utils.ts | 134 +- src/lib/language/parse.spec.ts | 64 +- src/lib/language/parse.ts | 29 +- src/lib/language/parsimmon.ts | 40 +- src/lib/language/reduce.spec.ts | 6 +- src/lib/language/reduce.ts | 29 +- src/lib/language/resolve.spec.ts | 6 +- src/lib/language/resolve.ts | 81 +- src/lib/lib.ts | 3 +- src/lib/mappings.spec.ts | 8 +- src/lib/message/read-components.ts | 16 +- src/lib/message/transaction-encoding.spec.ts | 38 +- src/lib/message/transaction-encoding.ts | 92 +- src/lib/message/transaction-types.ts | 150 +- src/lib/schema/ajv/ajv-types.d.ts | 16 +- src/lib/schema/ajv/ajv-utils.ts | 24 +- ...ation-template.d.ts => validate-bcmr.d.ts} | 4 +- src/lib/schema/ajv/validate-bcmr.js | 6004 +++++ .../schema/ajv/validate-wallet-template.d.ts | 7 + ...emplate.js => validate-wallet-template.js} | 928 +- src/lib/schema/bcmr.schema.json | 493 + src/lib/schema/bcmr.spec.ts | 14 + src/lib/schema/bcmr.ts | 34 + .../fixtures/bcmr/bcmr.art-collection.json | 72 + .../bcmr/bcmr.decentralized-application.json | 67 + .../fixtures/bcmr/bcmr.fungible-token.json | 53 + .../bcmr/bcmr.payouts-or-dividends.json | 75 + src/lib/schema/schema.ts | 3 +- ...chema.json => wallet-template.schema.json} | 184 +- ...mplate.spec.ts => wallet-template.spec.ts} | 272 +- ...ication-template.ts => wallet-template.ts} | 26 +- src/lib/transaction/estimate-transaction.ts | 7 +- .../generate-templates.spec.helper.ts | 10 +- ...template.2-of-2-recoverable.spec.helper.ts | 6 +- .../fixtures/template.2-of-3.spec.helper.ts | 13 +- ... template.cash-channels-v1.spec.helper.ts} | 57 +- .../template.sig-of-sig.spec.helper.ts | 4 +- .../templates/2-of-2-recoverable.json | 2 +- .../fixtures/templates/2-of-3.json | 2 +- ...sh-channels.json => cash-channels-v1.json} | 17 +- .../transaction/fixtures/templates/p2pkh.json | 4 +- .../transaction/generate-transaction.spec.ts | 18 +- src/lib/transaction/generate-transaction.ts | 83 +- ...transaction-e2e.2-of-2-recoverable.spec.ts | 34 +- .../transaction-e2e.2-of-3.spec.ts | 28 +- .../transaction/transaction-e2e.p2pkh.spec.ts | 20 +- .../transaction-e2e.sig-of-sig.spec.ts | 28 +- .../transaction-e2e.spec.helper.ts | 2 +- .../transaction-e2e.templates.spec.ts | 18 +- .../bch/2022/bch-2022-instruction-set.ts | 68 +- .../bch/2022/bch-2022-types.ts | 8 +- .../bch/2023/bch-2023-consensus.ts | 1 + .../bch/2023/bch-2023-crypto.ts | 76 +- .../bch/2023/bch-2023-instruction-set.ts | 94 +- .../bch/2023/bch-2023-tokens.ts | 74 +- .../bch/chips/bch-chips-crypto.ts | 142 +- .../bch/chips/bch-chips-instruction-set.ts | 94 +- .../bch/chips/bch-chips-loops.ts | 68 +- .../bch/chips/bch-chips-types.ts | 35 +- src/lib/vm/instruction-sets/btc/btc-types.ts | 11 +- .../vm/instruction-sets/common/arithmetic.ts | 146 +- src/lib/vm/instruction-sets/common/bitwise.ts | 26 +- .../vm/instruction-sets/common/combinators.ts | 107 +- .../instruction-sets/common/common-types.ts | 78 +- .../vm/instruction-sets/common/consensus.ts | 1 + src/lib/vm/instruction-sets/common/crypto.ts | 128 +- .../vm/instruction-sets/common/encoding.ts | 22 +- src/lib/vm/instruction-sets/common/errors.ts | 7 +- .../instruction-sets/common/flow-control.ts | 38 +- src/lib/vm/instruction-sets/common/format.ts | 54 +- .../vm/instruction-sets/common/inspection.ts | 102 +- .../common/instruction-sets-types.ts | 40 +- .../common/instruction-sets-utils.spec.ts | 64 +- .../common/instruction-sets-utils.ts | 145 +- src/lib/vm/instruction-sets/common/nop.ts | 6 +- .../vm/instruction-sets/common/push.spec.ts | 16 +- src/lib/vm/instruction-sets/common/push.ts | 74 +- .../common/signing-serialization.spec.ts | 8 +- .../common/signing-serialization.ts | 136 +- src/lib/vm/instruction-sets/common/stack.ts | 74 +- src/lib/vm/instruction-sets/common/time.ts | 32 +- .../vm/instruction-sets/common/types.spec.ts | 24 +- .../satoshi-client/bitcoin-satoshi-utils.ts | 15 +- .../xec/xec-instruction-set.ts | 4 +- .../xec/xec-vm-number-operations.ts | 186 +- .../xec/xec.script-tests.spec.ts | 11 +- src/lib/vm/instruction-sets/xec/xec.spec.ts | 32 +- src/lib/vm/virtual-machine.spec.ts | 48 +- src/lib/vm/virtual-machine.ts | 72 +- src/lib/vm/vm-types.ts | 70 +- src/lib/vmb-tests/bch-vmb-test-mixins.ts | 30 +- src/lib/vmb-tests/bch-vmb-test-utils.spec.ts | 2 +- src/lib/vmb-tests/bch-vmb-test-utils.ts | 44 +- src/lib/vmb-tests/bch-vmb-test.spec.helper.ts | 11 +- .../bch-vmb-tests-invalid.spec.helper.ts | 24 +- src/lib/vmb-tests/bch-vmb-tests.cashtokens.ts | 16 +- .../bch-vmb-tests.live.spec.helper.ts | 26 +- .../bch-vmb-tests.signing-serialization.ts | 4 +- .../vmb-tests/bch-vmb-tests.spec.helper.ts | 6 +- src/lib/vmb-tests/bch-vmb-tests.spec.ts | 42 +- src/lib/vmb-tests/bch-vmb-tests.ts | 16 +- src/types/bcrypto.d.ts | 15 - src/types/bitcore-lib-cash.d.ts | 3 +- src/types/chuhai.d.ts | 14 +- src/types/rollup-plugin-alias.d.ts | 6 +- src/types/secp256k1.d.ts | 3 +- tsconfig.json | 6 +- yarn.lock | 8494 +++---- 215 files changed, 39100 insertions(+), 9910 deletions(-) create mode 100755 .pnp.cjs create mode 100644 .pnp.loader.mjs create mode 160000 config/eslint-config-bitauth create mode 100644 src/lib/engine/engine.ts create mode 100644 src/lib/engine/types/bcmr-types.ts rename src/lib/{compiler => engine/types}/template-types.ts (79%) rename src/lib/schema/ajv/{validate-authentication-template.d.ts => validate-bcmr.d.ts} (51%) create mode 100644 src/lib/schema/ajv/validate-bcmr.js create mode 100644 src/lib/schema/ajv/validate-wallet-template.d.ts rename src/lib/schema/ajv/{validate-authentication-template.js => validate-wallet-template.js} (91%) create mode 100644 src/lib/schema/bcmr.schema.json create mode 100644 src/lib/schema/bcmr.spec.ts create mode 100644 src/lib/schema/bcmr.ts create mode 100644 src/lib/schema/fixtures/bcmr/bcmr.art-collection.json create mode 100644 src/lib/schema/fixtures/bcmr/bcmr.decentralized-application.json create mode 100644 src/lib/schema/fixtures/bcmr/bcmr.fungible-token.json create mode 100644 src/lib/schema/fixtures/bcmr/bcmr.payouts-or-dividends.json rename src/lib/schema/{authentication-template.schema.json => wallet-template.schema.json} (87%) rename src/lib/schema/{authentication-template.spec.ts => wallet-template.spec.ts} (88%) rename src/lib/schema/{authentication-template.ts => wallet-template.ts} (59%) rename src/lib/transaction/fixtures/{template.cash-channels.spec.helper.ts => template.cash-channels-v1.spec.helper.ts} (94%) rename src/lib/transaction/fixtures/templates/{cash-channels.json => cash-channels-v1.json} (97%) delete mode 100644 src/types/bcrypto.d.ts diff --git a/.cspell.json b/.cspell.json index e86e6668..36da9247 100644 --- a/.cspell.json +++ b/.cspell.json @@ -3,18 +3,26 @@ "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/master/cspell.schema.json", "language": "en", "words": [ + "activatable", "ACTIVEBYTECODE", + "airgapped", + "altstack", "Amagi", "ANYONECANPAY", "asmcrypto", "auditability", "auditable", + "authbase", + "authbases", + "authchain", + "authchains", + "authhead", "BCHCHIPs", "bchn", "bchreg", "bchtest", + "bcmr", "bcoin", - "bcrypto", "bech", "benchmarkjs", "bigint", @@ -31,6 +39,7 @@ "camelcase", "cashaddr", "CASHTOKENS", + "Chaingraph", "CHECKDATASIG", "CHECKDATASIGVERIFY", "CHECKLOCKTIMEVERIFY", @@ -39,6 +48,7 @@ "CHECKSEQUENCEVERIFY", "CHECKSIG", "CHECKSIGVERIFY", + "chipnet", "chuhai", "codecov", "codepoint", @@ -47,8 +57,11 @@ "combinator", "combinators", "convertbits", + "corepack", + "counterparties", "cyclomatic", "Datacarrier", + "DDTHH", "deno", "deserialization", "deserialize", @@ -65,15 +78,18 @@ "esnext", "FORKID", "FROMALTSTACK", + "gitter", "GREATERTHAN", "GREATERTHANOREQUAL", "HMAC", "IFDUP", + "IIFE", "INPUTBYTECODE", "INPUTINDEX", "INPUTSEQUENCENUMBER", "Ints", "INVALIDOPCODE", + "ipfs", "LESSTHAN", "LESSTHANOREQUAL", "libauth", @@ -90,8 +106,10 @@ "Merkle", "minification", "MINIMALIF", + "MITM", "monospace", "multisig", + "Nakamoto", "NONFUNGIBLE", "nops", "NOTIF", @@ -121,6 +139,9 @@ "PUBKEYS", "PUSHBYTES", "PUSHDATA", + "rebranded", + "rebranding", + "redenominated", "regtest", "reversebytes", "ripemd", @@ -133,15 +154,18 @@ "seckey", "secp", "secp256k1", + "sidechain", "sigchecks", "sighash", "skippable", "SMALLINTEGER", + "Spedn", "STACKTOP", "standardness", "statelessly", "STATICTOP", "submodule", + "substack", "templating", "testnet", "TOALTSTACK", @@ -171,10 +195,14 @@ "wasm", "wbindgen", "webassembly", + "wechat", + "XAMPL", "xprivkey", "xprv", "xpub", "xpubkey", + "yarnpkg", + "ZDTC", "π’‚Όπ’„„" ], "flagWords": [], @@ -193,9 +221,5 @@ "pattern": "/:[qpzry9x8gf2tvdw0s3jn54khce6mua7l]+/g" } ], - "ignoreRegExpList": [ - "Base64", - "HexValues", - "cash-address-format" - ] + "ignoreRegExpList": ["Base64", "HexValues", "cash-address-format"] } diff --git a/.eslintrc b/.eslintrc index 92ea1352..3e5a2a6e 100644 --- a/.eslintrc +++ b/.eslintrc @@ -3,29 +3,16 @@ "parser": "@typescript-eslint/parser", "parserOptions": { "project": "./tsconfig.json" }, "env": { "es6": true }, - "ignorePatterns": ["node_modules", "build", "coverage"], + "ignorePatterns": [ + "node_modules", + "build", + "coverage", + "src/lib/schema/ajv/*.js" + ], "extends": ["bitauth"], - "globals": { "BigInt": true, "console": true, "WebAssembly": true }, + // "globals": { "BigInt": true, "console": true, "WebAssembly": true }, "rules": { - "@typescript-eslint/prefer-readonly-parameter-types": "off", // TODO: enable when Uint8Array can be made readonly, see `Immutable` type - "@typescript-eslint/no-unused-expressions": "off", // TODO: bug causes crash in eslint 7.2.0 – re-enable later - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "default", - "format": ["camelCase"], - "leadingUnderscore": "allow" - }, - { - "selector": "variable", - "format": ["camelCase", "UPPER_CASE"], - "leadingUnderscore": "allow" - }, - { "selector": "typeLike", "format": ["PascalCase"] }, - { "selector": "enumMember", "format": ["camelCase", "UPPER_CASE"] } // Allow UPPER_CASE for opcodes - ], - "import/no-internal-modules": ["error"], - "import/extensions": ["error", "always"] + "@typescript-eslint/no-unsafe-enum-comparison": "off" }, "overrides": [ /* @@ -47,9 +34,11 @@ ] } ], - "functional/no-expression-statement": "off", "@typescript-eslint/naming-convention": "off", "@typescript-eslint/no-magic-numbers": "off", + "functional/no-expression-statements": "off", + "functional/no-conditional-statements": "off", + "functional/functional-parameters": "off", "functional/immutable-data": "off", "functional/no-return-void": "off" } diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 6181d9d7..fcc9660b 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -24,7 +24,7 @@ This library should provide the primitives needed to hack on bitcoin and bitcoin ## Some Practical Details -- **accept `readonly`, return mutable** - We should always return mutable types to allow consumers the option of mutating results without running afoul of type-checking. For the same reason, when we accept a value, we should always accept it as `readonly` for maximum flexibility. +- **accept immutable, return mutable** - We should always return mutable types to allow consumers the option of mutating results without running afoul of type-checking. For the same reason, when we accept a value, we should generally avoid mutating it. - **use `eslint-disable-next-line` or `eslint-disable-line`** - It's ok to disable eslint; in some cases, rules should be disabled every time they're hit (e.g. `no-bitwise`). By using single-line disables, we clearly mark intentional deviations from our conventions. - **avoid Hungarian notation & name prefixing** – Including the type of a variable in its name is a code smell: a name should clearly describe only one concept, and types are the business of the type system. Likewise, using prefixes to distinguish between an interface and an instance typically indicates the concepts should be simplified. E.g. `IChecker` and `Checker` – this is likely made unnecessarily complex to accommodate an object-oriented style. Consider replacing with a single function (or if instantiation is required, an object containing only stateless functions). - **don't throw things** – instead, return a result that can be either a success or error type. This strategy encourages a more functional approach to problems, and pragmatically, [TypeScript does not yet offer a `throws` clause or otherwise](https://github.com/microsoft/TypeScript/issues/13219), so only this strategy allows errors to be well-typed. A good pattern is `() => string | ResultType`, where ResultType is the desired output, and error messages are returned as a string. Consumers can easily use `typeof result === 'string'` to narrow the resulting type. When errors are more complex or `ResultType` is also a string, use an object with a `success` property, e.g. `() => { success: true, bytecode: Uint8Array } | { success: false, errors: ErrorType[] }`. diff --git a/.github/workflows/benchmark.yaml b/.github/workflows/benchmark.yaml index a5b8205d..8025c47a 100644 --- a/.github/workflows/benchmark.yaml +++ b/.github/workflows/benchmark.yaml @@ -9,7 +9,7 @@ permissions: deployments: write concurrency: - group: "benchmarks" + group: 'benchmarks' cancel-in-progress: true jobs: @@ -19,15 +19,15 @@ jobs: steps: - uses: actions/checkout@v3 with: - submodules: 'true' + submodules: 'true' - name: Setup node uses: actions/setup-node@v3 with: node-version: 16 - name: Run benchmark run: yarn && yarn bench - - # TODO: Libauth-only benchmarks: test for performance regressions in Libauth functionality, format results to work with the below configuration + + # TODO: Libauth-only benchmarks: test for performance regressions in Libauth functionality, format results to work with the below configuration # - name: Push benchmark result to gh-pages # uses: benchmark-action/github-action-benchmark@3d3bca03e83647895ef4f911fa57de3c7a391aaf diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 68f03cbf..18f8a7eb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -2,12 +2,11 @@ name: Lint, Build, and Test Libauth on: [push, pull_request] jobs: - build-and-test: runs-on: ubuntu-latest strategy: matrix: - node: [ 16 ] + node: [18] name: Test Node ${{ matrix.node }} steps: - uses: actions/checkout@v3 @@ -24,7 +23,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node: [ 18 ] + node: [20] name: Test Node ${{ matrix.node }} steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/doc.yaml b/.github/workflows/doc.yaml index f51e5e4d..d9571993 100644 --- a/.github/workflows/doc.yaml +++ b/.github/workflows/doc.yaml @@ -11,7 +11,7 @@ permissions: id-token: write concurrency: - group: "pages" + group: 'pages' cancel-in-progress: true jobs: @@ -21,7 +21,7 @@ jobs: steps: - uses: actions/checkout@v3 with: - submodules: 'true' + submodules: 'true' - name: Setup node uses: actions/setup-node@v3 with: diff --git a/.gitmodules b/.gitmodules index 2ed2e49e..cae41823 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,7 +2,12 @@ path = wasm/secp256k1 url = https://github.com/bitauth/libauth-secp256k1.git branch = libauth + shallow = true [submodule ".yarn"] path = .yarn url = https://github.com/bitauth/libauth-dependencies.git - shallow = true \ No newline at end of file + shallow = true +[submodule "config/eslint-config-bitauth"] + path = config/eslint-config-bitauth + url = https://github.com/bitauth/eslint-config-bitauth/ + shallow = true diff --git a/.pnp.cjs b/.pnp.cjs new file mode 100755 index 00000000..d1306a0b --- /dev/null +++ b/.pnp.cjs @@ -0,0 +1,18679 @@ +#!/usr/bin/env node +/* eslint-disable */ +"use strict"; + +const RAW_RUNTIME_STATE = +'{\ + "__info": [\ + "This file is automatically generated. Do not touch it, or risk",\ + "your modifications being lost."\ + ],\ + "dependencyTreeRoots": [\ + {\ + "name": "@bitauth/libauth",\ + "reference": "workspace:."\ + }\ + ],\ + "enableTopLevelFallback": true,\ + "ignorePatternData": "(^(?:\\\\.yarn\\\\/sdks(?:\\\\/(?!\\\\.{1,2}(?:\\\\/|$))(?:(?:(?!(?:^|\\\\/)\\\\.{1,2}(?:\\\\/|$)).)*?)|$))$)|(^(?:libauth\\\\/(?!\\\\.{1,2}(?:\\\\/|$))(?=.)[^/]*?\\\\/?)$)",\ + "fallbackExclusionList": [\ + ["@bitauth/libauth", ["workspace:."]]\ + ],\ + "fallbackPool": [\ + ],\ + "packageRegistryData": [\ + [null, [\ + [null, {\ + "packageLocation": "./",\ + "packageDependencies": [\ + ["@ava/typescript", "npm:4.1.0"],\ + ["@fast-check/ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:1.2.1"],\ + ["@microsoft/api-documenter", "npm:7.23.16"],\ + ["@microsoft/api-extractor", "npm:7.39.1"],\ + ["@playwright/test", "npm:1.40.1"],\ + ["@rollup/plugin-alias", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.1.0"],\ + ["@rollup/plugin-commonjs", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:25.0.7"],\ + ["@rollup/plugin-node-resolve", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:15.2.3"],\ + ["@types/elliptic", "npm:6.4.18"],\ + ["@types/express", "npm:4.17.21"],\ + ["@types/node", "npm:20.10.6"],\ + ["@typescript-eslint/eslint-plugin", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.18.1"],\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["ajv-cli", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.0.0"],\ + ["asmcrypto.js", "npm:2.3.2"],\ + ["ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.1"],\ + ["bitcore-lib-cash", "npm:10.0.23"],\ + ["c8", "npm:9.0.0"],\ + ["chuhai", "npm:1.2.0"],\ + ["cpy-cli", "npm:5.0.0"],\ + ["cspell", "npm:8.3.2"],\ + ["cz-conventional-changelog", "npm:3.3.0"],\ + ["elliptic", "npm:6.5.4"],\ + ["eslint", "npm:8.56.0"],\ + ["eslint-config-bitauth", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A."],\ + ["eslint-config-prettier", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:9.1.0"],\ + ["eslint-plugin-eslint-comments", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:3.2.0"],\ + ["eslint-plugin-functional", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.0"],\ + ["eslint-plugin-import", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:2.29.1"],\ + ["eslint-plugin-tsdoc", "npm:0.2.17"],\ + ["express", "npm:4.18.2"],\ + ["fast-check", "npm:3.15.0"],\ + ["hash.js", "npm:1.1.7"],\ + ["madge", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.1.0"],\ + ["open-cli", "npm:8.0.0"],\ + ["prettier", "npm:3.1.1"],\ + ["rollup", "npm:4.9.3"],\ + ["secp256k1", "npm:5.0.0"],\ + ["source-map-support", "npm:0.5.21"],\ + ["standard-version", "npm:9.5.0"],\ + ["ts-json-schema-generator", "npm:1.5.0"],\ + ["typedoc", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:0.25.6"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ + ["@aashutoshrathi/word-wrap", [\ + ["npm:1.2.6", {\ + "packageLocation": "./.yarn/cache/@aashutoshrathi-word-wrap-npm-1.2.6-5b1d95e487-6eebd12a5c.zip/node_modules/@aashutoshrathi/word-wrap/",\ + "packageDependencies": [\ + ["@aashutoshrathi/word-wrap", "npm:1.2.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@ava/typescript", [\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/@ava-typescript-npm-4.1.0-f1a5efe95a-85079207b9.zip/node_modules/@ava/typescript/",\ + "packageDependencies": [\ + ["@ava/typescript", "npm:4.1.0"],\ + ["escape-string-regexp", "npm:5.0.0"],\ + ["execa", "npm:7.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/code-frame", [\ + ["npm:7.23.5", {\ + "packageLocation": "./.yarn/cache/@babel-code-frame-npm-7.23.5-cb10d08de6-44e58529c9.zip/node_modules/@babel/code-frame/",\ + "packageDependencies": [\ + ["@babel/code-frame", "npm:7.23.5"],\ + ["@babel/highlight", "npm:7.23.4"],\ + ["chalk", "npm:2.4.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/helper-string-parser", [\ + ["npm:7.23.4", {\ + "packageLocation": "./.yarn/cache/@babel-helper-string-parser-npm-7.23.4-b1f0d030c3-c352082474.zip/node_modules/@babel/helper-string-parser/",\ + "packageDependencies": [\ + ["@babel/helper-string-parser", "npm:7.23.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/helper-validator-identifier", [\ + ["npm:7.22.20", {\ + "packageLocation": "./.yarn/cache/@babel-helper-validator-identifier-npm-7.22.20-18305bb306-df882d2675.zip/node_modules/@babel/helper-validator-identifier/",\ + "packageDependencies": [\ + ["@babel/helper-validator-identifier", "npm:7.22.20"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/highlight", [\ + ["npm:7.23.4", {\ + "packageLocation": "./.yarn/cache/@babel-highlight-npm-7.23.4-2a9f2d2538-62fef9b5bc.zip/node_modules/@babel/highlight/",\ + "packageDependencies": [\ + ["@babel/highlight", "npm:7.23.4"],\ + ["@babel/helper-validator-identifier", "npm:7.22.20"],\ + ["chalk", "npm:2.4.2"],\ + ["js-tokens", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/parser", [\ + ["npm:7.23.6", {\ + "packageLocation": "./.yarn/cache/@babel-parser-npm-7.23.6-2fad283d6e-6be3a63d3c.zip/node_modules/@babel/parser/",\ + "packageDependencies": [\ + ["@babel/parser", "npm:7.23.6"],\ + ["@babel/types", "npm:7.23.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/types", [\ + ["npm:7.23.6", {\ + "packageLocation": "./.yarn/cache/@babel-types-npm-7.23.6-4e68ac9e9b-07e70bb94d.zip/node_modules/@babel/types/",\ + "packageDependencies": [\ + ["@babel/types", "npm:7.23.6"],\ + ["@babel/helper-string-parser", "npm:7.23.4"],\ + ["@babel/helper-validator-identifier", "npm:7.22.20"],\ + ["to-fast-properties", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@bcoe/v8-coverage", [\ + ["npm:0.2.3", {\ + "packageLocation": "./.yarn/cache/@bcoe-v8-coverage-npm-0.2.3-9e27b3c57e-1a1f0e356a.zip/node_modules/@bcoe/v8-coverage/",\ + "packageDependencies": [\ + ["@bcoe/v8-coverage", "npm:0.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@bitauth/libauth", [\ + ["workspace:.", {\ + "packageLocation": "./",\ + "packageDependencies": [\ + ["@bitauth/libauth", "workspace:."],\ + ["@ava/typescript", "npm:4.1.0"],\ + ["@fast-check/ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:1.2.1"],\ + ["@microsoft/api-documenter", "npm:7.23.16"],\ + ["@microsoft/api-extractor", "npm:7.39.1"],\ + ["@playwright/test", "npm:1.40.1"],\ + ["@rollup/plugin-alias", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.1.0"],\ + ["@rollup/plugin-commonjs", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:25.0.7"],\ + ["@rollup/plugin-node-resolve", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:15.2.3"],\ + ["@types/elliptic", "npm:6.4.18"],\ + ["@types/express", "npm:4.17.21"],\ + ["@types/node", "npm:20.10.6"],\ + ["@typescript-eslint/eslint-plugin", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.18.1"],\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["ajv-cli", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.0.0"],\ + ["asmcrypto.js", "npm:2.3.2"],\ + ["ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.1"],\ + ["bitcore-lib-cash", "npm:10.0.23"],\ + ["c8", "npm:9.0.0"],\ + ["chuhai", "npm:1.2.0"],\ + ["cpy-cli", "npm:5.0.0"],\ + ["cspell", "npm:8.3.2"],\ + ["cz-conventional-changelog", "npm:3.3.0"],\ + ["elliptic", "npm:6.5.4"],\ + ["eslint", "npm:8.56.0"],\ + ["eslint-config-bitauth", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A."],\ + ["eslint-config-prettier", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:9.1.0"],\ + ["eslint-plugin-eslint-comments", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:3.2.0"],\ + ["eslint-plugin-functional", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.0"],\ + ["eslint-plugin-import", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:2.29.1"],\ + ["eslint-plugin-tsdoc", "npm:0.2.17"],\ + ["express", "npm:4.18.2"],\ + ["fast-check", "npm:3.15.0"],\ + ["hash.js", "npm:1.1.7"],\ + ["madge", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.1.0"],\ + ["open-cli", "npm:8.0.0"],\ + ["prettier", "npm:3.1.1"],\ + ["rollup", "npm:4.9.3"],\ + ["secp256k1", "npm:5.0.0"],\ + ["source-map-support", "npm:0.5.21"],\ + ["standard-version", "npm:9.5.0"],\ + ["ts-json-schema-generator", "npm:1.5.0"],\ + ["typedoc", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:0.25.6"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ + ["@commitlint/config-validator", [\ + ["npm:18.4.4", {\ + "packageLocation": "./.yarn/cache/@commitlint-config-validator-npm-18.4.4-e903289934-6712b83a12.zip/node_modules/@commitlint/config-validator/",\ + "packageDependencies": [\ + ["@commitlint/config-validator", "npm:18.4.4"],\ + ["@commitlint/types", "npm:18.4.4"],\ + ["ajv", "npm:8.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@commitlint/execute-rule", [\ + ["npm:18.4.4", {\ + "packageLocation": "./.yarn/cache/@commitlint-execute-rule-npm-18.4.4-d9423b5542-f09d966479.zip/node_modules/@commitlint/execute-rule/",\ + "packageDependencies": [\ + ["@commitlint/execute-rule", "npm:18.4.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@commitlint/load", [\ + ["npm:18.4.4", {\ + "packageLocation": "./.yarn/cache/@commitlint-load-npm-18.4.4-f5b98f17ad-2643f6fdd7.zip/node_modules/@commitlint/load/",\ + "packageDependencies": [\ + ["@commitlint/load", "npm:18.4.4"],\ + ["@commitlint/config-validator", "npm:18.4.4"],\ + ["@commitlint/execute-rule", "npm:18.4.4"],\ + ["@commitlint/resolve-extends", "npm:18.4.4"],\ + ["@commitlint/types", "npm:18.4.4"],\ + ["chalk", "npm:4.1.2"],\ + ["cosmiconfig", "virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:8.3.6"],\ + ["cosmiconfig-typescript-loader", "virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:5.0.0"],\ + ["lodash.isplainobject", "npm:4.0.6"],\ + ["lodash.merge", "npm:4.6.2"],\ + ["lodash.uniq", "npm:4.5.0"],\ + ["resolve-from", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@commitlint/resolve-extends", [\ + ["npm:18.4.4", {\ + "packageLocation": "./.yarn/cache/@commitlint-resolve-extends-npm-18.4.4-7834d28c9c-b48946fa43.zip/node_modules/@commitlint/resolve-extends/",\ + "packageDependencies": [\ + ["@commitlint/resolve-extends", "npm:18.4.4"],\ + ["@commitlint/config-validator", "npm:18.4.4"],\ + ["@commitlint/types", "npm:18.4.4"],\ + ["import-fresh", "npm:3.3.0"],\ + ["lodash.mergewith", "npm:4.6.2"],\ + ["resolve-from", "npm:5.0.0"],\ + ["resolve-global", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@commitlint/types", [\ + ["npm:18.4.4", {\ + "packageLocation": "./.yarn/cache/@commitlint-types-npm-18.4.4-c71e2a6ea9-bda09adc5f.zip/node_modules/@commitlint/types/",\ + "packageDependencies": [\ + ["@commitlint/types", "npm:18.4.4"],\ + ["chalk", "npm:4.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/cspell-bundled-dicts", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/@cspell-cspell-bundled-dicts-npm-8.3.2-951aa74adb-e0138b4432.zip/node_modules/@cspell/cspell-bundled-dicts/",\ + "packageDependencies": [\ + ["@cspell/cspell-bundled-dicts", "npm:8.3.2"],\ + ["@cspell/dict-ada", "npm:4.0.2"],\ + ["@cspell/dict-aws", "npm:4.0.1"],\ + ["@cspell/dict-bash", "npm:4.1.3"],\ + ["@cspell/dict-companies", "npm:3.0.29"],\ + ["@cspell/dict-cpp", "npm:5.1.1"],\ + ["@cspell/dict-cryptocurrencies", "npm:5.0.0"],\ + ["@cspell/dict-csharp", "npm:4.0.2"],\ + ["@cspell/dict-css", "npm:4.0.12"],\ + ["@cspell/dict-dart", "npm:2.0.3"],\ + ["@cspell/dict-django", "npm:4.1.0"],\ + ["@cspell/dict-docker", "npm:1.1.7"],\ + ["@cspell/dict-dotnet", "npm:5.0.0"],\ + ["@cspell/dict-elixir", "npm:4.0.3"],\ + ["@cspell/dict-en-common-misspellings", "npm:2.0.0"],\ + ["@cspell/dict-en-gb", "npm:1.1.33"],\ + ["@cspell/dict-en_us", "npm:4.3.13"],\ + ["@cspell/dict-filetypes", "npm:3.0.3"],\ + ["@cspell/dict-fonts", "npm:4.0.0"],\ + ["@cspell/dict-fsharp", "npm:1.0.1"],\ + ["@cspell/dict-fullstack", "npm:3.1.5"],\ + ["@cspell/dict-gaming-terms", "npm:1.0.4"],\ + ["@cspell/dict-git", "npm:3.0.0"],\ + ["@cspell/dict-golang", "npm:6.0.5"],\ + ["@cspell/dict-haskell", "npm:4.0.1"],\ + ["@cspell/dict-html", "npm:4.0.5"],\ + ["@cspell/dict-html-symbol-entities", "npm:4.0.0"],\ + ["@cspell/dict-java", "npm:5.0.6"],\ + ["@cspell/dict-k8s", "npm:1.0.2"],\ + ["@cspell/dict-latex", "npm:4.0.0"],\ + ["@cspell/dict-lorem-ipsum", "npm:4.0.0"],\ + ["@cspell/dict-lua", "npm:4.0.3"],\ + ["@cspell/dict-makefile", "npm:1.0.0"],\ + ["@cspell/dict-node", "npm:4.0.3"],\ + ["@cspell/dict-npm", "npm:5.0.14"],\ + ["@cspell/dict-php", "npm:4.0.5"],\ + ["@cspell/dict-powershell", "npm:5.0.3"],\ + ["@cspell/dict-public-licenses", "npm:2.0.5"],\ + ["@cspell/dict-python", "npm:4.1.11"],\ + ["@cspell/dict-r", "npm:2.0.1"],\ + ["@cspell/dict-ruby", "npm:5.0.2"],\ + ["@cspell/dict-rust", "npm:4.0.1"],\ + ["@cspell/dict-scala", "npm:5.0.0"],\ + ["@cspell/dict-software-terms", "npm:3.3.16"],\ + ["@cspell/dict-sql", "npm:2.1.3"],\ + ["@cspell/dict-svelte", "npm:1.0.2"],\ + ["@cspell/dict-swift", "npm:2.0.1"],\ + ["@cspell/dict-typescript", "npm:3.1.2"],\ + ["@cspell/dict-vue", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/cspell-json-reporter", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/@cspell-cspell-json-reporter-npm-8.3.2-eb5186652c-25926f8cfe.zip/node_modules/@cspell/cspell-json-reporter/",\ + "packageDependencies": [\ + ["@cspell/cspell-json-reporter", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/cspell-pipe", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/@cspell-cspell-pipe-npm-8.3.2-eb5e202997-46dd1cb76c.zip/node_modules/@cspell/cspell-pipe/",\ + "packageDependencies": [\ + ["@cspell/cspell-pipe", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/cspell-resolver", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/@cspell-cspell-resolver-npm-8.3.2-7d4b8a8eda-fe723a1b84.zip/node_modules/@cspell/cspell-resolver/",\ + "packageDependencies": [\ + ["@cspell/cspell-resolver", "npm:8.3.2"],\ + ["global-directory", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/cspell-service-bus", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/@cspell-cspell-service-bus-npm-8.3.2-cc3fbbc9bb-9bec7ddafc.zip/node_modules/@cspell/cspell-service-bus/",\ + "packageDependencies": [\ + ["@cspell/cspell-service-bus", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/cspell-types", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/@cspell-cspell-types-npm-8.3.2-1dd998a100-4ec8d4deea.zip/node_modules/@cspell/cspell-types/",\ + "packageDependencies": [\ + ["@cspell/cspell-types", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-ada", [\ + ["npm:4.0.2", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-ada-npm-4.0.2-c712dc56f7-31b0f0f6b9.zip/node_modules/@cspell/dict-ada/",\ + "packageDependencies": [\ + ["@cspell/dict-ada", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-aws", [\ + ["npm:4.0.1", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-aws-npm-4.0.1-a19848023b-513b7822d0.zip/node_modules/@cspell/dict-aws/",\ + "packageDependencies": [\ + ["@cspell/dict-aws", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-bash", [\ + ["npm:4.1.3", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-bash-npm-4.1.3-0154f2b1c9-4ba66c76c1.zip/node_modules/@cspell/dict-bash/",\ + "packageDependencies": [\ + ["@cspell/dict-bash", "npm:4.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-companies", [\ + ["npm:3.0.29", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-companies-npm-3.0.29-18c02568a0-39cee440f8.zip/node_modules/@cspell/dict-companies/",\ + "packageDependencies": [\ + ["@cspell/dict-companies", "npm:3.0.29"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-cpp", [\ + ["npm:5.1.1", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-cpp-npm-5.1.1-a98d0d1927-5578740853.zip/node_modules/@cspell/dict-cpp/",\ + "packageDependencies": [\ + ["@cspell/dict-cpp", "npm:5.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-cryptocurrencies", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-cryptocurrencies-npm-5.0.0-6b630d72d9-116e7f117b.zip/node_modules/@cspell/dict-cryptocurrencies/",\ + "packageDependencies": [\ + ["@cspell/dict-cryptocurrencies", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-csharp", [\ + ["npm:4.0.2", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-csharp-npm-4.0.2-a32d6e0e56-d2ecb2aada.zip/node_modules/@cspell/dict-csharp/",\ + "packageDependencies": [\ + ["@cspell/dict-csharp", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-css", [\ + ["npm:4.0.12", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-css-npm-4.0.12-37a94c5eaa-da812243c9.zip/node_modules/@cspell/dict-css/",\ + "packageDependencies": [\ + ["@cspell/dict-css", "npm:4.0.12"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-dart", [\ + ["npm:2.0.3", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-dart-npm-2.0.3-6bcbb5e205-66bfcfa029.zip/node_modules/@cspell/dict-dart/",\ + "packageDependencies": [\ + ["@cspell/dict-dart", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-data-science", [\ + ["npm:1.0.11", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-data-science-npm-1.0.11-80d554e26f-513f8f416f.zip/node_modules/@cspell/dict-data-science/",\ + "packageDependencies": [\ + ["@cspell/dict-data-science", "npm:1.0.11"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-django", [\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-django-npm-4.1.0-21815268d5-d64b830ab7.zip/node_modules/@cspell/dict-django/",\ + "packageDependencies": [\ + ["@cspell/dict-django", "npm:4.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-docker", [\ + ["npm:1.1.7", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-docker-npm-1.1.7-47601b3ce1-307f8b5132.zip/node_modules/@cspell/dict-docker/",\ + "packageDependencies": [\ + ["@cspell/dict-docker", "npm:1.1.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-dotnet", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-dotnet-npm-5.0.0-1021ddef52-470e74c268.zip/node_modules/@cspell/dict-dotnet/",\ + "packageDependencies": [\ + ["@cspell/dict-dotnet", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-elixir", [\ + ["npm:4.0.3", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-elixir-npm-4.0.3-eca50587bc-f084449b2d.zip/node_modules/@cspell/dict-elixir/",\ + "packageDependencies": [\ + ["@cspell/dict-elixir", "npm:4.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-en-common-misspellings", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-en-common-misspellings-npm-2.0.0-7ddee0adf4-487dc7a1c7.zip/node_modules/@cspell/dict-en-common-misspellings/",\ + "packageDependencies": [\ + ["@cspell/dict-en-common-misspellings", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-en-gb", [\ + ["npm:1.1.33", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-en-gb-npm-1.1.33-40b98cbc5f-72db891c95.zip/node_modules/@cspell/dict-en-gb/",\ + "packageDependencies": [\ + ["@cspell/dict-en-gb", "npm:1.1.33"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-en_us", [\ + ["npm:4.3.13", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-en_us-npm-4.3.13-b5f78a2dd4-c6eddfa685.zip/node_modules/@cspell/dict-en_us/",\ + "packageDependencies": [\ + ["@cspell/dict-en_us", "npm:4.3.13"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-filetypes", [\ + ["npm:3.0.3", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-filetypes-npm-3.0.3-4b30f7ab3e-22c38a0b2e.zip/node_modules/@cspell/dict-filetypes/",\ + "packageDependencies": [\ + ["@cspell/dict-filetypes", "npm:3.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-fonts", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-fonts-npm-4.0.0-8980b7847b-894a31f3df.zip/node_modules/@cspell/dict-fonts/",\ + "packageDependencies": [\ + ["@cspell/dict-fonts", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-fsharp", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-fsharp-npm-1.0.1-1e14e215b4-ce0df20704.zip/node_modules/@cspell/dict-fsharp/",\ + "packageDependencies": [\ + ["@cspell/dict-fsharp", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-fullstack", [\ + ["npm:3.1.5", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-fullstack-npm-3.1.5-05a9bb03ad-01c98a3408.zip/node_modules/@cspell/dict-fullstack/",\ + "packageDependencies": [\ + ["@cspell/dict-fullstack", "npm:3.1.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-gaming-terms", [\ + ["npm:1.0.4", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-gaming-terms-npm-1.0.4-ed75efc32a-3e57f55677.zip/node_modules/@cspell/dict-gaming-terms/",\ + "packageDependencies": [\ + ["@cspell/dict-gaming-terms", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-git", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-git-npm-3.0.0-eef5fd2377-97b6da58c9.zip/node_modules/@cspell/dict-git/",\ + "packageDependencies": [\ + ["@cspell/dict-git", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-golang", [\ + ["npm:6.0.5", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-golang-npm-6.0.5-d007775efd-d83917190e.zip/node_modules/@cspell/dict-golang/",\ + "packageDependencies": [\ + ["@cspell/dict-golang", "npm:6.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-haskell", [\ + ["npm:4.0.1", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-haskell-npm-4.0.1-16dc237412-cfb51e415b.zip/node_modules/@cspell/dict-haskell/",\ + "packageDependencies": [\ + ["@cspell/dict-haskell", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-html", [\ + ["npm:4.0.5", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-html-npm-4.0.5-ab5ae76ecb-8801b7f779.zip/node_modules/@cspell/dict-html/",\ + "packageDependencies": [\ + ["@cspell/dict-html", "npm:4.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-html-symbol-entities", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-html-symbol-entities-npm-4.0.0-00ba1c0d3f-79f05f9080.zip/node_modules/@cspell/dict-html-symbol-entities/",\ + "packageDependencies": [\ + ["@cspell/dict-html-symbol-entities", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-java", [\ + ["npm:5.0.6", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-java-npm-5.0.6-cb9e3d8c4b-0029545c95.zip/node_modules/@cspell/dict-java/",\ + "packageDependencies": [\ + ["@cspell/dict-java", "npm:5.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-k8s", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-k8s-npm-1.0.2-027232d77f-502910d441.zip/node_modules/@cspell/dict-k8s/",\ + "packageDependencies": [\ + ["@cspell/dict-k8s", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-latex", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-latex-npm-4.0.0-6f15ef0792-7e7a520196.zip/node_modules/@cspell/dict-latex/",\ + "packageDependencies": [\ + ["@cspell/dict-latex", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-lorem-ipsum", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-lorem-ipsum-npm-4.0.0-e811e64680-d3575fb7b9.zip/node_modules/@cspell/dict-lorem-ipsum/",\ + "packageDependencies": [\ + ["@cspell/dict-lorem-ipsum", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-lua", [\ + ["npm:4.0.3", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-lua-npm-4.0.3-fc222ad255-eee20135a4.zip/node_modules/@cspell/dict-lua/",\ + "packageDependencies": [\ + ["@cspell/dict-lua", "npm:4.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-makefile", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-makefile-npm-1.0.0-c2c37c1d77-f0cac4caf3.zip/node_modules/@cspell/dict-makefile/",\ + "packageDependencies": [\ + ["@cspell/dict-makefile", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-node", [\ + ["npm:4.0.3", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-node-npm-4.0.3-47c5cd7b47-ed2884b7da.zip/node_modules/@cspell/dict-node/",\ + "packageDependencies": [\ + ["@cspell/dict-node", "npm:4.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-npm", [\ + ["npm:5.0.14", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-npm-npm-5.0.14-c05011b6a8-8f273d5307.zip/node_modules/@cspell/dict-npm/",\ + "packageDependencies": [\ + ["@cspell/dict-npm", "npm:5.0.14"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-php", [\ + ["npm:4.0.5", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-php-npm-4.0.5-efceb7daa7-f278e0d472.zip/node_modules/@cspell/dict-php/",\ + "packageDependencies": [\ + ["@cspell/dict-php", "npm:4.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-powershell", [\ + ["npm:5.0.3", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-powershell-npm-5.0.3-b60ba78494-18eac3be85.zip/node_modules/@cspell/dict-powershell/",\ + "packageDependencies": [\ + ["@cspell/dict-powershell", "npm:5.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-public-licenses", [\ + ["npm:2.0.5", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-public-licenses-npm-2.0.5-aca88f034c-07e647c24e.zip/node_modules/@cspell/dict-public-licenses/",\ + "packageDependencies": [\ + ["@cspell/dict-public-licenses", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-python", [\ + ["npm:4.1.11", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-python-npm-4.1.11-8d4dacedf6-9d156e146c.zip/node_modules/@cspell/dict-python/",\ + "packageDependencies": [\ + ["@cspell/dict-python", "npm:4.1.11"],\ + ["@cspell/dict-data-science", "npm:1.0.11"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-r", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-r-npm-2.0.1-7236acbd8c-fe85939ad4.zip/node_modules/@cspell/dict-r/",\ + "packageDependencies": [\ + ["@cspell/dict-r", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-ruby", [\ + ["npm:5.0.2", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-ruby-npm-5.0.2-0dec0bb03e-c2006bcc80.zip/node_modules/@cspell/dict-ruby/",\ + "packageDependencies": [\ + ["@cspell/dict-ruby", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-rust", [\ + ["npm:4.0.1", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-rust-npm-4.0.1-79006ee35e-146d3af5d0.zip/node_modules/@cspell/dict-rust/",\ + "packageDependencies": [\ + ["@cspell/dict-rust", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-scala", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-scala-npm-5.0.0-3487b27d62-874312cd63.zip/node_modules/@cspell/dict-scala/",\ + "packageDependencies": [\ + ["@cspell/dict-scala", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-software-terms", [\ + ["npm:3.3.16", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-software-terms-npm-3.3.16-d2e144b9a7-d9e6d1c0b1.zip/node_modules/@cspell/dict-software-terms/",\ + "packageDependencies": [\ + ["@cspell/dict-software-terms", "npm:3.3.16"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-sql", [\ + ["npm:2.1.3", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-sql-npm-2.1.3-efe4b04a44-a435812cc6.zip/node_modules/@cspell/dict-sql/",\ + "packageDependencies": [\ + ["@cspell/dict-sql", "npm:2.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-svelte", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-svelte-npm-1.0.2-6709770ee4-5b42989bc6.zip/node_modules/@cspell/dict-svelte/",\ + "packageDependencies": [\ + ["@cspell/dict-svelte", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-swift", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-swift-npm-2.0.1-efa2a5b9cb-0bbb106266.zip/node_modules/@cspell/dict-swift/",\ + "packageDependencies": [\ + ["@cspell/dict-swift", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-typescript", [\ + ["npm:3.1.2", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-typescript-npm-3.1.2-929df6b99b-b7ad45f704.zip/node_modules/@cspell/dict-typescript/",\ + "packageDependencies": [\ + ["@cspell/dict-typescript", "npm:3.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-vue", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/@cspell-dict-vue-npm-3.0.0-99a5f142a5-4db58b1d6f.zip/node_modules/@cspell/dict-vue/",\ + "packageDependencies": [\ + ["@cspell/dict-vue", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dynamic-import", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/@cspell-dynamic-import-npm-8.3.2-a94afddc43-176a568492.zip/node_modules/@cspell/dynamic-import/",\ + "packageDependencies": [\ + ["@cspell/dynamic-import", "npm:8.3.2"],\ + ["import-meta-resolve", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/strong-weak-map", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/@cspell-strong-weak-map-npm-8.3.2-a9974430bd-0a8bb07ef3.zip/node_modules/@cspell/strong-weak-map/",\ + "packageDependencies": [\ + ["@cspell/strong-weak-map", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@dependents/detective-less", [\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/cache/@dependents-detective-less-npm-3.0.2-eb59b6f173-2c263ab64f.zip/node_modules/@dependents/detective-less/",\ + "packageDependencies": [\ + ["@dependents/detective-less", "npm:3.0.2"],\ + ["gonzales-pe", "npm:4.3.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@eslint-community/eslint-utils", [\ + ["npm:4.4.0", {\ + "packageLocation": "./.yarn/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-8d70bcdcd8.zip/node_modules/@eslint-community/eslint-utils/",\ + "packageDependencies": [\ + ["@eslint-community/eslint-utils", "npm:4.4.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:6eec398a4132b5372ea5ffc0bc36d4c81602b7e444a89685d0d958016d8fd53df5c0c97c6a8bf99951469e2c6c06135dd192e9309f6e39b1a4c85e0faabe1f6b#npm:4.4.0", {\ + "packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-719be7711d/0/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-8d70bcdcd8.zip/node_modules/@eslint-community/eslint-utils/",\ + "packageDependencies": [\ + ["@eslint-community/eslint-utils", "virtual:6eec398a4132b5372ea5ffc0bc36d4c81602b7e444a89685d0d958016d8fd53df5c0c97c6a8bf99951469e2c6c06135dd192e9309f6e39b1a4c85e0faabe1f6b#npm:4.4.0"],\ + ["@types/eslint", null],\ + ["eslint", "npm:8.56.0"],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@eslint-community/regexpp", [\ + ["npm:4.10.0", {\ + "packageLocation": "./.yarn/cache/@eslint-community-regexpp-npm-4.10.0-6bfb984c81-8c36169c81.zip/node_modules/@eslint-community/regexpp/",\ + "packageDependencies": [\ + ["@eslint-community/regexpp", "npm:4.10.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@eslint/eslintrc", [\ + ["npm:2.1.4", {\ + "packageLocation": "./.yarn/cache/@eslint-eslintrc-npm-2.1.4-1ff4b5f908-7a3b14f4b4.zip/node_modules/@eslint/eslintrc/",\ + "packageDependencies": [\ + ["@eslint/eslintrc", "npm:2.1.4"],\ + ["ajv", "npm:6.12.6"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["espree", "npm:9.6.1"],\ + ["globals", "npm:13.24.0"],\ + ["ignore", "npm:5.3.0"],\ + ["import-fresh", "npm:3.3.0"],\ + ["js-yaml", "npm:4.1.0"],\ + ["minimatch", "npm:3.1.2"],\ + ["strip-json-comments", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@eslint/js", [\ + ["npm:8.56.0", {\ + "packageLocation": "./.yarn/cache/@eslint-js-npm-8.56.0-b1de08cbff-97a4b5ccf7.zip/node_modules/@eslint/js/",\ + "packageDependencies": [\ + ["@eslint/js", "npm:8.56.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@fast-check/ava", [\ + ["npm:1.2.1", {\ + "packageLocation": "./.yarn/cache/@fast-check-ava-npm-1.2.1-b39e961243-816ac43e5f.zip/node_modules/@fast-check/ava/",\ + "packageDependencies": [\ + ["@fast-check/ava", "npm:1.2.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:1.2.1", {\ + "packageLocation": "./.yarn/__virtual__/@fast-check-ava-virtual-2647c39898/0/cache/@fast-check-ava-npm-1.2.1-b39e961243-816ac43e5f.zip/node_modules/@fast-check/ava/",\ + "packageDependencies": [\ + ["@fast-check/ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:1.2.1"],\ + ["@types/ava", null],\ + ["ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.1"],\ + ["fast-check", "npm:3.15.0"]\ + ],\ + "packagePeers": [\ + "@types/ava",\ + "ava"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@humanwhocodes/config-array", [\ + ["npm:0.11.13", {\ + "packageLocation": "./.yarn/cache/@humanwhocodes-config-array-npm-0.11.13-12314014f2-9f655e1df7.zip/node_modules/@humanwhocodes/config-array/",\ + "packageDependencies": [\ + ["@humanwhocodes/config-array", "npm:0.11.13"],\ + ["@humanwhocodes/object-schema", "npm:2.0.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["minimatch", "npm:3.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@humanwhocodes/module-importer", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/@humanwhocodes-module-importer-npm-1.0.1-9d07ed2e4a-e993950e34.zip/node_modules/@humanwhocodes/module-importer/",\ + "packageDependencies": [\ + ["@humanwhocodes/module-importer", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@humanwhocodes/object-schema", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/@humanwhocodes-object-schema-npm-2.0.1-c23364bbfc-dbddfd0465.zip/node_modules/@humanwhocodes/object-schema/",\ + "packageDependencies": [\ + ["@humanwhocodes/object-schema", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@hutson/parse-repository-url", [\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/cache/@hutson-parse-repository-url-npm-3.0.2-ae5ef1b671-dae0656f2e.zip/node_modules/@hutson/parse-repository-url/",\ + "packageDependencies": [\ + ["@hutson/parse-repository-url", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@isaacs/cliui", [\ + ["npm:8.0.2", {\ + "packageLocation": "./.yarn/cache/@isaacs-cliui-npm-8.0.2-f4364666d5-e9ed5fd27c.zip/node_modules/@isaacs/cliui/",\ + "packageDependencies": [\ + ["@isaacs/cliui", "npm:8.0.2"],\ + ["string-width", "npm:5.1.2"],\ + ["string-width-cjs", [\ + "string-width",\ + "npm:4.2.3"\ + ]],\ + ["strip-ansi", "npm:7.1.0"],\ + ["strip-ansi-cjs", [\ + "strip-ansi",\ + "npm:6.0.1"\ + ]],\ + ["wrap-ansi", "npm:8.1.0"],\ + ["wrap-ansi-cjs", [\ + "wrap-ansi",\ + "npm:7.0.0"\ + ]]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@istanbuljs/schema", [\ + ["npm:0.1.3", {\ + "packageLocation": "./.yarn/cache/@istanbuljs-schema-npm-0.1.3-466bd3eaaa-a9b1e49acd.zip/node_modules/@istanbuljs/schema/",\ + "packageDependencies": [\ + ["@istanbuljs/schema", "npm:0.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@jridgewell/resolve-uri", [\ + ["npm:3.1.1", {\ + "packageLocation": "./.yarn/cache/@jridgewell-resolve-uri-npm-3.1.1-aa2de3f210-64d59df8ae.zip/node_modules/@jridgewell/resolve-uri/",\ + "packageDependencies": [\ + ["@jridgewell/resolve-uri", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@jridgewell/sourcemap-codec", [\ + ["npm:1.4.15", {\ + "packageLocation": "./.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-89960ac087.zip/node_modules/@jridgewell/sourcemap-codec/",\ + "packageDependencies": [\ + ["@jridgewell/sourcemap-codec", "npm:1.4.15"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@jridgewell/trace-mapping", [\ + ["npm:0.3.20", {\ + "packageLocation": "./.yarn/cache/@jridgewell-trace-mapping-npm-0.3.20-d90f282910-683117e4e6.zip/node_modules/@jridgewell/trace-mapping/",\ + "packageDependencies": [\ + ["@jridgewell/trace-mapping", "npm:0.3.20"],\ + ["@jridgewell/resolve-uri", "npm:3.1.1"],\ + ["@jridgewell/sourcemap-codec", "npm:1.4.15"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@mapbox/node-pre-gyp", [\ + ["npm:1.0.11", {\ + "packageLocation": "./.yarn/cache/@mapbox-node-pre-gyp-npm-1.0.11-5547f15a2b-59529a2444.zip/node_modules/@mapbox/node-pre-gyp/",\ + "packageDependencies": [\ + ["@mapbox/node-pre-gyp", "npm:1.0.11"],\ + ["detect-libc", "npm:2.0.2"],\ + ["https-proxy-agent", "npm:5.0.1"],\ + ["make-dir", "npm:3.1.0"],\ + ["node-fetch", "virtual:5547f15a2bb3d361d141532d43f94523f31e9edfe533f8367b3e26e300194e2978be03f56c09e100afcfee4c02b7fbe13c6ffcf58c613b457a86da522a2979f2#npm:2.7.0"],\ + ["nopt", "npm:5.0.0"],\ + ["npmlog", "npm:5.0.1"],\ + ["rimraf", "npm:3.0.2"],\ + ["semver", "npm:7.5.4"],\ + ["tar", "npm:6.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@microsoft/api-documenter", [\ + ["npm:7.23.16", {\ + "packageLocation": "./.yarn/cache/@microsoft-api-documenter-npm-7.23.16-916b7e529e-382ba19c1c.zip/node_modules/@microsoft/api-documenter/",\ + "packageDependencies": [\ + ["@microsoft/api-documenter", "npm:7.23.16"],\ + ["@microsoft/api-extractor-model", "npm:7.28.4"],\ + ["@microsoft/tsdoc", "npm:0.14.2"],\ + ["@rushstack/node-core-library", "virtual:4e9ad17c85095d4c9331f459fba57fb5b9a6171d5dd1cfdaf8e6813eff93c55eca427b0fc1e867f1d2dc84f40484dd7139d10b41a2fbf8671e8f05335366569d#npm:3.63.0"],\ + ["@rushstack/ts-command-line", "npm:4.17.1"],\ + ["colors", "npm:1.2.5"],\ + ["js-yaml", "npm:3.13.1"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@microsoft/api-extractor", [\ + ["npm:7.39.1", {\ + "packageLocation": "./.yarn/cache/@microsoft-api-extractor-npm-7.39.1-ff49b8ae1b-82b1e62d5e.zip/node_modules/@microsoft/api-extractor/",\ + "packageDependencies": [\ + ["@microsoft/api-extractor", "npm:7.39.1"],\ + ["@microsoft/api-extractor-model", "npm:7.28.4"],\ + ["@microsoft/tsdoc", "npm:0.14.2"],\ + ["@microsoft/tsdoc-config", "npm:0.16.2"],\ + ["@rushstack/node-core-library", "virtual:4e9ad17c85095d4c9331f459fba57fb5b9a6171d5dd1cfdaf8e6813eff93c55eca427b0fc1e867f1d2dc84f40484dd7139d10b41a2fbf8671e8f05335366569d#npm:3.63.0"],\ + ["@rushstack/rig-package", "npm:0.5.1"],\ + ["@rushstack/ts-command-line", "npm:4.17.1"],\ + ["colors", "npm:1.2.5"],\ + ["lodash", "npm:4.17.21"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["semver", "npm:7.5.4"],\ + ["source-map", "npm:0.6.1"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@microsoft/api-extractor-model", [\ + ["npm:7.28.4", {\ + "packageLocation": "./.yarn/cache/@microsoft-api-extractor-model-npm-7.28.4-4e9ad17c85-ecabfab1a8.zip/node_modules/@microsoft/api-extractor-model/",\ + "packageDependencies": [\ + ["@microsoft/api-extractor-model", "npm:7.28.4"],\ + ["@microsoft/tsdoc", "npm:0.14.2"],\ + ["@microsoft/tsdoc-config", "npm:0.16.2"],\ + ["@rushstack/node-core-library", "virtual:4e9ad17c85095d4c9331f459fba57fb5b9a6171d5dd1cfdaf8e6813eff93c55eca427b0fc1e867f1d2dc84f40484dd7139d10b41a2fbf8671e8f05335366569d#npm:3.63.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@microsoft/tsdoc", [\ + ["npm:0.14.2", {\ + "packageLocation": "./.yarn/cache/@microsoft-tsdoc-npm-0.14.2-9988282153-00c3d4fc18.zip/node_modules/@microsoft/tsdoc/",\ + "packageDependencies": [\ + ["@microsoft/tsdoc", "npm:0.14.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@microsoft/tsdoc-config", [\ + ["npm:0.16.2", {\ + "packageLocation": "./.yarn/cache/@microsoft-tsdoc-config-npm-0.16.2-30fd115d09-37fc35d83d.zip/node_modules/@microsoft/tsdoc-config/",\ + "packageDependencies": [\ + ["@microsoft/tsdoc-config", "npm:0.16.2"],\ + ["@microsoft/tsdoc", "npm:0.14.2"],\ + ["ajv", "npm:6.12.6"],\ + ["jju", "npm:1.4.0"],\ + ["resolve", "patch:resolve@npm%3A1.19.0#optional!builtin::version=1.19.0&hash=c3c19d"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@nodelib/fs.scandir", [\ + ["npm:2.1.5", {\ + "packageLocation": "./.yarn/cache/@nodelib-fs.scandir-npm-2.1.5-89c67370dd-6ab2a9b8a1.zip/node_modules/@nodelib/fs.scandir/",\ + "packageDependencies": [\ + ["@nodelib/fs.scandir", "npm:2.1.5"],\ + ["@nodelib/fs.stat", "npm:2.0.5"],\ + ["run-parallel", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@nodelib/fs.stat", [\ + ["npm:2.0.5", {\ + "packageLocation": "./.yarn/cache/@nodelib-fs.stat-npm-2.0.5-01f4dd3030-012480b5ca.zip/node_modules/@nodelib/fs.stat/",\ + "packageDependencies": [\ + ["@nodelib/fs.stat", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@nodelib/fs.walk", [\ + ["npm:1.2.8", {\ + "packageLocation": "./.yarn/cache/@nodelib-fs.walk-npm-1.2.8-b4a89da548-40033e33e9.zip/node_modules/@nodelib/fs.walk/",\ + "packageDependencies": [\ + ["@nodelib/fs.walk", "npm:1.2.8"],\ + ["@nodelib/fs.scandir", "npm:2.1.5"],\ + ["fastq", "npm:1.16.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@npmcli/agent", [\ + ["npm:2.2.0", {\ + "packageLocation": "./.yarn/cache/@npmcli-agent-npm-2.2.0-cf04e8a830-822ea07755.zip/node_modules/@npmcli/agent/",\ + "packageDependencies": [\ + ["@npmcli/agent", "npm:2.2.0"],\ + ["agent-base", "npm:7.1.0"],\ + ["http-proxy-agent", "npm:7.0.0"],\ + ["https-proxy-agent", "npm:7.0.2"],\ + ["lru-cache", "npm:10.1.0"],\ + ["socks-proxy-agent", "npm:8.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@npmcli/fs", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/@npmcli-fs-npm-3.1.0-0844a57978-f3a7ab3a31.zip/node_modules/@npmcli/fs/",\ + "packageDependencies": [\ + ["@npmcli/fs", "npm:3.1.0"],\ + ["semver", "npm:7.5.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@pkgjs/parseargs", [\ + ["npm:0.11.0", {\ + "packageLocation": "./.yarn/cache/@pkgjs-parseargs-npm-0.11.0-cd2a3fe948-115e8ceeec.zip/node_modules/@pkgjs/parseargs/",\ + "packageDependencies": [\ + ["@pkgjs/parseargs", "npm:0.11.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@playwright/test", [\ + ["npm:1.40.1", {\ + "packageLocation": "./.yarn/cache/@playwright-test-npm-1.40.1-174ee2ce77-77bfc3d4a1.zip/node_modules/@playwright/test/",\ + "packageDependencies": [\ + ["@playwright/test", "npm:1.40.1"],\ + ["playwright", "npm:1.40.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/plugin-alias", [\ + ["npm:5.1.0", {\ + "packageLocation": "./.yarn/cache/@rollup-plugin-alias-npm-5.1.0-5f8a6a898f-2749f9563d.zip/node_modules/@rollup/plugin-alias/",\ + "packageDependencies": [\ + ["@rollup/plugin-alias", "npm:5.1.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.1.0", {\ + "packageLocation": "./.yarn/__virtual__/@rollup-plugin-alias-virtual-f879b1736f/0/cache/@rollup-plugin-alias-npm-5.1.0-5f8a6a898f-2749f9563d.zip/node_modules/@rollup/plugin-alias/",\ + "packageDependencies": [\ + ["@rollup/plugin-alias", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.1.0"],\ + ["@types/rollup", null],\ + ["rollup", "npm:4.9.3"],\ + ["slash", "npm:4.0.0"]\ + ],\ + "packagePeers": [\ + "@types/rollup",\ + "rollup"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/plugin-commonjs", [\ + ["npm:25.0.7", {\ + "packageLocation": "./.yarn/cache/@rollup-plugin-commonjs-npm-25.0.7-f5b19139ea-89b108e245.zip/node_modules/@rollup/plugin-commonjs/",\ + "packageDependencies": [\ + ["@rollup/plugin-commonjs", "npm:25.0.7"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:25.0.7", {\ + "packageLocation": "./.yarn/__virtual__/@rollup-plugin-commonjs-virtual-3623c8d78a/0/cache/@rollup-plugin-commonjs-npm-25.0.7-f5b19139ea-89b108e245.zip/node_modules/@rollup/plugin-commonjs/",\ + "packageDependencies": [\ + ["@rollup/plugin-commonjs", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:25.0.7"],\ + ["@rollup/pluginutils", "virtual:3623c8d78a2fc97e56a11d9e7e49cd7ea0f8a01d4711968e51f8cbce2d83f86ae56dda9f9578958ba90c1b1ff01e755a070907323dc00549c03d3524be731e8c#npm:5.1.0"],\ + ["@types/rollup", null],\ + ["commondir", "npm:1.0.1"],\ + ["estree-walker", "npm:2.0.2"],\ + ["glob", "npm:8.1.0"],\ + ["is-reference", "npm:1.2.1"],\ + ["magic-string", "npm:0.30.5"],\ + ["rollup", "npm:4.9.3"]\ + ],\ + "packagePeers": [\ + "@types/rollup",\ + "rollup"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/plugin-node-resolve", [\ + ["npm:15.2.3", {\ + "packageLocation": "./.yarn/cache/@rollup-plugin-node-resolve-npm-15.2.3-f49fe9c656-d36a6792fb.zip/node_modules/@rollup/plugin-node-resolve/",\ + "packageDependencies": [\ + ["@rollup/plugin-node-resolve", "npm:15.2.3"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:15.2.3", {\ + "packageLocation": "./.yarn/__virtual__/@rollup-plugin-node-resolve-virtual-ddb46c60c0/0/cache/@rollup-plugin-node-resolve-npm-15.2.3-f49fe9c656-d36a6792fb.zip/node_modules/@rollup/plugin-node-resolve/",\ + "packageDependencies": [\ + ["@rollup/plugin-node-resolve", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:15.2.3"],\ + ["@rollup/pluginutils", "virtual:3623c8d78a2fc97e56a11d9e7e49cd7ea0f8a01d4711968e51f8cbce2d83f86ae56dda9f9578958ba90c1b1ff01e755a070907323dc00549c03d3524be731e8c#npm:5.1.0"],\ + ["@types/resolve", "npm:1.20.2"],\ + ["@types/rollup", null],\ + ["deepmerge", "npm:4.3.1"],\ + ["is-builtin-module", "npm:3.2.1"],\ + ["is-module", "npm:1.0.0"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["rollup", "npm:4.9.3"]\ + ],\ + "packagePeers": [\ + "@types/rollup",\ + "rollup"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/pluginutils", [\ + ["npm:4.2.1", {\ + "packageLocation": "./.yarn/cache/@rollup-pluginutils-npm-4.2.1-0f52a5eba2-503a6f0a44.zip/node_modules/@rollup/pluginutils/",\ + "packageDependencies": [\ + ["@rollup/pluginutils", "npm:4.2.1"],\ + ["estree-walker", "npm:2.0.2"],\ + ["picomatch", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.1.0", {\ + "packageLocation": "./.yarn/cache/@rollup-pluginutils-npm-5.1.0-6939820ef8-abb15eaec5.zip/node_modules/@rollup/pluginutils/",\ + "packageDependencies": [\ + ["@rollup/pluginutils", "npm:5.1.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:3623c8d78a2fc97e56a11d9e7e49cd7ea0f8a01d4711968e51f8cbce2d83f86ae56dda9f9578958ba90c1b1ff01e755a070907323dc00549c03d3524be731e8c#npm:5.1.0", {\ + "packageLocation": "./.yarn/__virtual__/@rollup-pluginutils-virtual-12cea79c63/0/cache/@rollup-pluginutils-npm-5.1.0-6939820ef8-abb15eaec5.zip/node_modules/@rollup/pluginutils/",\ + "packageDependencies": [\ + ["@rollup/pluginutils", "virtual:3623c8d78a2fc97e56a11d9e7e49cd7ea0f8a01d4711968e51f8cbce2d83f86ae56dda9f9578958ba90c1b1ff01e755a070907323dc00549c03d3524be731e8c#npm:5.1.0"],\ + ["@types/estree", "npm:1.0.5"],\ + ["@types/rollup", null],\ + ["estree-walker", "npm:2.0.2"],\ + ["picomatch", "npm:2.3.1"],\ + ["rollup", "npm:4.9.3"]\ + ],\ + "packagePeers": [\ + "@types/rollup",\ + "rollup"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-android-arm-eabi", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-android-arm-eabi-npm-4.9.3-388790ae16/node_modules/@rollup/rollup-android-arm-eabi/",\ + "packageDependencies": [\ + ["@rollup/rollup-android-arm-eabi", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-android-arm64", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-android-arm64-npm-4.9.3-1bc14afa9a/node_modules/@rollup/rollup-android-arm64/",\ + "packageDependencies": [\ + ["@rollup/rollup-android-arm64", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-darwin-arm64", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-darwin-arm64-npm-4.9.3-efca80b098/node_modules/@rollup/rollup-darwin-arm64/",\ + "packageDependencies": [\ + ["@rollup/rollup-darwin-arm64", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-darwin-x64", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-darwin-x64-npm-4.9.3-6da7490d70/node_modules/@rollup/rollup-darwin-x64/",\ + "packageDependencies": [\ + ["@rollup/rollup-darwin-x64", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-linux-arm-gnueabihf", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm-gnueabihf-npm-4.9.3-16477bd780/node_modules/@rollup/rollup-linux-arm-gnueabihf/",\ + "packageDependencies": [\ + ["@rollup/rollup-linux-arm-gnueabihf", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-linux-arm64-gnu", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm64-gnu-npm-4.9.3-a080278b46/node_modules/@rollup/rollup-linux-arm64-gnu/",\ + "packageDependencies": [\ + ["@rollup/rollup-linux-arm64-gnu", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-linux-arm64-musl", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm64-musl-npm-4.9.3-d8d1e3cf59/node_modules/@rollup/rollup-linux-arm64-musl/",\ + "packageDependencies": [\ + ["@rollup/rollup-linux-arm64-musl", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-linux-riscv64-gnu", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-riscv64-gnu-npm-4.9.3-d59af58936/node_modules/@rollup/rollup-linux-riscv64-gnu/",\ + "packageDependencies": [\ + ["@rollup/rollup-linux-riscv64-gnu", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-linux-x64-gnu", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-x64-gnu-npm-4.9.3-1cf53c0ea3/node_modules/@rollup/rollup-linux-x64-gnu/",\ + "packageDependencies": [\ + ["@rollup/rollup-linux-x64-gnu", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-linux-x64-musl", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-x64-musl-npm-4.9.3-6dfe52c6ae/node_modules/@rollup/rollup-linux-x64-musl/",\ + "packageDependencies": [\ + ["@rollup/rollup-linux-x64-musl", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-win32-arm64-msvc", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-win32-arm64-msvc-npm-4.9.3-479f7c7d96/node_modules/@rollup/rollup-win32-arm64-msvc/",\ + "packageDependencies": [\ + ["@rollup/rollup-win32-arm64-msvc", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-win32-ia32-msvc", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-win32-ia32-msvc-npm-4.9.3-41867a523d/node_modules/@rollup/rollup-win32-ia32-msvc/",\ + "packageDependencies": [\ + ["@rollup/rollup-win32-ia32-msvc", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-win32-x64-msvc", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-win32-x64-msvc-npm-4.9.3-32c6a3b65b/node_modules/@rollup/rollup-win32-x64-msvc/",\ + "packageDependencies": [\ + ["@rollup/rollup-win32-x64-msvc", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rushstack/node-core-library", [\ + ["npm:3.63.0", {\ + "packageLocation": "./.yarn/cache/@rushstack-node-core-library-npm-3.63.0-0b93d6dab8-14e635884b.zip/node_modules/@rushstack/node-core-library/",\ + "packageDependencies": [\ + ["@rushstack/node-core-library", "npm:3.63.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:4e9ad17c85095d4c9331f459fba57fb5b9a6171d5dd1cfdaf8e6813eff93c55eca427b0fc1e867f1d2dc84f40484dd7139d10b41a2fbf8671e8f05335366569d#npm:3.63.0", {\ + "packageLocation": "./.yarn/__virtual__/@rushstack-node-core-library-virtual-59c9c9a071/0/cache/@rushstack-node-core-library-npm-3.63.0-0b93d6dab8-14e635884b.zip/node_modules/@rushstack/node-core-library/",\ + "packageDependencies": [\ + ["@rushstack/node-core-library", "virtual:4e9ad17c85095d4c9331f459fba57fb5b9a6171d5dd1cfdaf8e6813eff93c55eca427b0fc1e867f1d2dc84f40484dd7139d10b41a2fbf8671e8f05335366569d#npm:3.63.0"],\ + ["@types/node", null],\ + ["colors", "npm:1.2.5"],\ + ["fs-extra", "npm:7.0.1"],\ + ["import-lazy", "npm:4.0.0"],\ + ["jju", "npm:1.4.0"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["semver", "npm:7.5.4"],\ + ["z-schema", "npm:5.0.5"]\ + ],\ + "packagePeers": [\ + "@types/node"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rushstack/rig-package", [\ + ["npm:0.5.1", {\ + "packageLocation": "./.yarn/cache/@rushstack-rig-package-npm-0.5.1-48ae3999d4-9e5d425f60.zip/node_modules/@rushstack/rig-package/",\ + "packageDependencies": [\ + ["@rushstack/rig-package", "npm:0.5.1"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["strip-json-comments", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rushstack/ts-command-line", [\ + ["npm:4.17.1", {\ + "packageLocation": "./.yarn/cache/@rushstack-ts-command-line-npm-4.17.1-479335d0b4-75407f6a42.zip/node_modules/@rushstack/ts-command-line/",\ + "packageDependencies": [\ + ["@rushstack/ts-command-line", "npm:4.17.1"],\ + ["@types/argparse", "npm:1.0.38"],\ + ["argparse", "npm:1.0.10"],\ + ["colors", "npm:1.2.5"],\ + ["string-argv", "npm:0.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@sindresorhus/merge-streams", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/@sindresorhus-merge-streams-npm-1.0.0-2ae6684f8f-453c2a2816.zip/node_modules/@sindresorhus/merge-streams/",\ + "packageDependencies": [\ + ["@sindresorhus/merge-streams", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@tokenizer/token", [\ + ["npm:0.3.0", {\ + "packageLocation": "./.yarn/cache/@tokenizer-token-npm-0.3.0-4441352cc5-889c1f1e63.zip/node_modules/@tokenizer/token/",\ + "packageDependencies": [\ + ["@tokenizer/token", "npm:0.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/argparse", [\ + ["npm:1.0.38", {\ + "packageLocation": "./.yarn/cache/@types-argparse-npm-1.0.38-657c15204c-26ed7e3f1e.zip/node_modules/@types/argparse/",\ + "packageDependencies": [\ + ["@types/argparse", "npm:1.0.38"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/bn.js", [\ + ["npm:5.1.5", {\ + "packageLocation": "./.yarn/cache/@types-bn.js-npm-5.1.5-c2195eccd3-9719330c86.zip/node_modules/@types/bn.js/",\ + "packageDependencies": [\ + ["@types/bn.js", "npm:5.1.5"],\ + ["@types/node", "npm:20.10.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/body-parser", [\ + ["npm:1.19.5", {\ + "packageLocation": "./.yarn/cache/@types-body-parser-npm-1.19.5-97fb106976-1e251118c4.zip/node_modules/@types/body-parser/",\ + "packageDependencies": [\ + ["@types/body-parser", "npm:1.19.5"],\ + ["@types/connect", "npm:3.4.38"],\ + ["@types/node", "npm:20.10.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/connect", [\ + ["npm:3.4.38", {\ + "packageLocation": "./.yarn/cache/@types-connect-npm-3.4.38-a8a4c38337-7eb1bc5342.zip/node_modules/@types/connect/",\ + "packageDependencies": [\ + ["@types/connect", "npm:3.4.38"],\ + ["@types/node", "npm:20.10.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/elliptic", [\ + ["npm:6.4.18", {\ + "packageLocation": "./.yarn/cache/@types-elliptic-npm-6.4.18-07db1177bc-06493e1816.zip/node_modules/@types/elliptic/",\ + "packageDependencies": [\ + ["@types/elliptic", "npm:6.4.18"],\ + ["@types/bn.js", "npm:5.1.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/estree", [\ + ["npm:1.0.5", {\ + "packageLocation": "./.yarn/cache/@types-estree-npm-1.0.5-5b7faed3b4-7de6d928dd.zip/node_modules/@types/estree/",\ + "packageDependencies": [\ + ["@types/estree", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/express", [\ + ["npm:4.17.21", {\ + "packageLocation": "./.yarn/cache/@types-express-npm-4.17.21-be92a0245e-7a6d26cf6f.zip/node_modules/@types/express/",\ + "packageDependencies": [\ + ["@types/express", "npm:4.17.21"],\ + ["@types/body-parser", "npm:1.19.5"],\ + ["@types/express-serve-static-core", "npm:4.17.41"],\ + ["@types/qs", "npm:6.9.11"],\ + ["@types/serve-static", "npm:1.15.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/express-serve-static-core", [\ + ["npm:4.17.41", {\ + "packageLocation": "./.yarn/cache/@types-express-serve-static-core-npm-4.17.41-7d196a92fa-7647e19d9c.zip/node_modules/@types/express-serve-static-core/",\ + "packageDependencies": [\ + ["@types/express-serve-static-core", "npm:4.17.41"],\ + ["@types/node", "npm:20.10.6"],\ + ["@types/qs", "npm:6.9.11"],\ + ["@types/range-parser", "npm:1.2.7"],\ + ["@types/send", "npm:0.17.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/http-errors", [\ + ["npm:2.0.4", {\ + "packageLocation": "./.yarn/cache/@types-http-errors-npm-2.0.4-8b39ca5d7c-1f3d7c3b32.zip/node_modules/@types/http-errors/",\ + "packageDependencies": [\ + ["@types/http-errors", "npm:2.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/istanbul-lib-coverage", [\ + ["npm:2.0.6", {\ + "packageLocation": "./.yarn/cache/@types-istanbul-lib-coverage-npm-2.0.6-2ea31fda9c-3feac423fd.zip/node_modules/@types/istanbul-lib-coverage/",\ + "packageDependencies": [\ + ["@types/istanbul-lib-coverage", "npm:2.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/json-schema", [\ + ["npm:7.0.15", {\ + "packageLocation": "./.yarn/cache/@types-json-schema-npm-7.0.15-fd16381786-1a3c3e0623.zip/node_modules/@types/json-schema/",\ + "packageDependencies": [\ + ["@types/json-schema", "npm:7.0.15"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/json5", [\ + ["npm:0.0.29", {\ + "packageLocation": "./.yarn/cache/@types-json5-npm-0.0.29-f63a7916bd-4e5aed58ca.zip/node_modules/@types/json5/",\ + "packageDependencies": [\ + ["@types/json5", "npm:0.0.29"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/mime", [\ + ["npm:1.3.5", {\ + "packageLocation": "./.yarn/cache/@types-mime-npm-1.3.5-48d28990db-e29a5f9c47.zip/node_modules/@types/mime/",\ + "packageDependencies": [\ + ["@types/mime", "npm:1.3.5"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.4", {\ + "packageLocation": "./.yarn/cache/@types-mime-npm-3.0.4-5cb286d662-a6139c8e1f.zip/node_modules/@types/mime/",\ + "packageDependencies": [\ + ["@types/mime", "npm:3.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/minimist", [\ + ["npm:1.2.5", {\ + "packageLocation": "./.yarn/cache/@types-minimist-npm-1.2.5-c85664a9d8-477047b606.zip/node_modules/@types/minimist/",\ + "packageDependencies": [\ + ["@types/minimist", "npm:1.2.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/node", [\ + ["npm:20.10.6", {\ + "packageLocation": "./.yarn/cache/@types-node-npm-20.10.6-59a7d708ba-08471220d3.zip/node_modules/@types/node/",\ + "packageDependencies": [\ + ["@types/node", "npm:20.10.6"],\ + ["undici-types", "npm:5.26.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/normalize-package-data", [\ + ["npm:2.4.4", {\ + "packageLocation": "./.yarn/cache/@types-normalize-package-data-npm-2.4.4-676a8ba353-65dff72b54.zip/node_modules/@types/normalize-package-data/",\ + "packageDependencies": [\ + ["@types/normalize-package-data", "npm:2.4.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/qs", [\ + ["npm:6.9.11", {\ + "packageLocation": "./.yarn/cache/@types-qs-npm-6.9.11-e12802ac61-620ca1628b.zip/node_modules/@types/qs/",\ + "packageDependencies": [\ + ["@types/qs", "npm:6.9.11"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/range-parser", [\ + ["npm:1.2.7", {\ + "packageLocation": "./.yarn/cache/@types-range-parser-npm-1.2.7-a83c0b6429-95640233b6.zip/node_modules/@types/range-parser/",\ + "packageDependencies": [\ + ["@types/range-parser", "npm:1.2.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/resolve", [\ + ["npm:1.20.2", {\ + "packageLocation": "./.yarn/cache/@types-resolve-npm-1.20.2-5fccb2ad46-1bff0d3875.zip/node_modules/@types/resolve/",\ + "packageDependencies": [\ + ["@types/resolve", "npm:1.20.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/semver", [\ + ["npm:7.5.6", {\ + "packageLocation": "./.yarn/cache/@types-semver-npm-7.5.6-9d2637fc95-e77282b17f.zip/node_modules/@types/semver/",\ + "packageDependencies": [\ + ["@types/semver", "npm:7.5.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/send", [\ + ["npm:0.17.4", {\ + "packageLocation": "./.yarn/cache/@types-send-npm-0.17.4-9d7c55577f-28320a2aa1.zip/node_modules/@types/send/",\ + "packageDependencies": [\ + ["@types/send", "npm:0.17.4"],\ + ["@types/mime", "npm:1.3.5"],\ + ["@types/node", "npm:20.10.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/serve-static", [\ + ["npm:1.15.5", {\ + "packageLocation": "./.yarn/cache/@types-serve-static-npm-1.15.5-b911ffc092-49aa21c367.zip/node_modules/@types/serve-static/",\ + "packageDependencies": [\ + ["@types/serve-static", "npm:1.15.5"],\ + ["@types/http-errors", "npm:2.0.4"],\ + ["@types/mime", "npm:3.0.4"],\ + ["@types/node", "npm:20.10.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/eslint-plugin", [\ + ["npm:6.18.1", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-eslint-plugin-npm-6.18.1-afb406fb8f-451abba1f7.zip/node_modules/@typescript-eslint/eslint-plugin/",\ + "packageDependencies": [\ + ["@typescript-eslint/eslint-plugin", "npm:6.18.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-eslint-plugin-virtual-0c80d6cec1/0/cache/@typescript-eslint-eslint-plugin-npm-6.18.1-afb406fb8f-451abba1f7.zip/node_modules/@typescript-eslint/eslint-plugin/",\ + "packageDependencies": [\ + ["@typescript-eslint/eslint-plugin", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.18.1"],\ + ["@eslint-community/regexpp", "npm:4.10.0"],\ + ["@types/eslint", null],\ + ["@types/typescript", null],\ + ["@types/typescript-eslint__parser", null],\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["@typescript-eslint/scope-manager", "npm:6.18.1"],\ + ["@typescript-eslint/type-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["@typescript-eslint/utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["@typescript-eslint/visitor-keys", "npm:6.18.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["eslint", "npm:8.56.0"],\ + ["graphemer", "npm:1.4.0"],\ + ["ignore", "npm:5.3.0"],\ + ["natural-compare", "npm:1.4.0"],\ + ["semver", "npm:7.5.4"],\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript-eslint__parser",\ + "@types/typescript",\ + "@typescript-eslint/parser",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/parser", [\ + ["npm:6.17.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-parser-npm-6.17.0-c7b54d3943-2ed0ed4a5b.zip/node_modules/@typescript-eslint/parser/",\ + "packageDependencies": [\ + ["@typescript-eslint/parser", "npm:6.17.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-parser-virtual-e6e1d7cfd6/0/cache/@typescript-eslint-parser-npm-6.17.0-c7b54d3943-2ed0ed4a5b.zip/node_modules/@typescript-eslint/parser/",\ + "packageDependencies": [\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["@types/eslint", null],\ + ["@types/typescript", null],\ + ["@typescript-eslint/scope-manager", "npm:6.17.0"],\ + ["@typescript-eslint/types", "npm:6.17.0"],\ + ["@typescript-eslint/typescript-estree", "virtual:e6e1d7cfd66980172234de35984619ab306c6b237672f3c3b662d184847f85a7635e1cec60ef078ae89a87fc8d8bf40dbfb8ad96ba2bd24f3569008504bd3397#npm:6.17.0"],\ + ["@typescript-eslint/visitor-keys", "npm:6.17.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["eslint", "npm:8.56.0"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/scope-manager", [\ + ["npm:6.17.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-scope-manager-npm-6.17.0-487c8a3d96-fe09c62855.zip/node_modules/@typescript-eslint/scope-manager/",\ + "packageDependencies": [\ + ["@typescript-eslint/scope-manager", "npm:6.17.0"],\ + ["@typescript-eslint/types", "npm:6.17.0"],\ + ["@typescript-eslint/visitor-keys", "npm:6.17.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.18.1", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-scope-manager-npm-6.18.1-3f533b51d7-ab75663cda.zip/node_modules/@typescript-eslint/scope-manager/",\ + "packageDependencies": [\ + ["@typescript-eslint/scope-manager", "npm:6.18.1"],\ + ["@typescript-eslint/types", "npm:6.18.1"],\ + ["@typescript-eslint/visitor-keys", "npm:6.18.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/type-utils", [\ + ["npm:6.18.1", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-type-utils-npm-6.18.1-40d38d6f53-f775011c35.zip/node_modules/@typescript-eslint/type-utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/type-utils", "npm:6.18.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-type-utils-virtual-be6bfb49b5/0/cache/@typescript-eslint-type-utils-npm-6.18.1-40d38d6f53-f775011c35.zip/node_modules/@typescript-eslint/type-utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/type-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["@types/eslint", null],\ + ["@types/typescript", null],\ + ["@typescript-eslint/typescript-estree", "virtual:be6bfb49b5428d9c72a0cb13203452e77c9d44fe11a32d7b8023ffbd53cee614b089863c69283f68d64972fd9edd4465c802c37983c7e0e629bb20ff780d0fa6#npm:6.18.1"],\ + ["@typescript-eslint/utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["eslint", "npm:8.56.0"],\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/types", [\ + ["npm:4.33.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-types-npm-4.33.0-9e9b956afa-c7ec55e6ae.zip/node_modules/@typescript-eslint/types/",\ + "packageDependencies": [\ + ["@typescript-eslint/types", "npm:4.33.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.62.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-types-npm-5.62.0-5c2e0aab15-24e8443177.zip/node_modules/@typescript-eslint/types/",\ + "packageDependencies": [\ + ["@typescript-eslint/types", "npm:5.62.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.17.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-types-npm-6.17.0-96c56c0a75-87ab1b5a32.zip/node_modules/@typescript-eslint/types/",\ + "packageDependencies": [\ + ["@typescript-eslint/types", "npm:6.17.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.18.1", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-types-npm-6.18.1-a106ef5c16-e304620953.zip/node_modules/@typescript-eslint/types/",\ + "packageDependencies": [\ + ["@typescript-eslint/types", "npm:6.18.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/typescript-estree", [\ + ["npm:4.33.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-typescript-estree-npm-4.33.0-b6b79c10d0-e9409ec992.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "npm:4.33.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["npm:5.62.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-typescript-estree-npm-5.62.0-5d1ea132a9-06c975eb5f.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "npm:5.62.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["npm:6.17.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-typescript-estree-npm-6.17.0-c77ebc49a9-1671b0d2f2.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "npm:6.17.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["npm:6.18.1", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-typescript-estree-npm-6.18.1-8c1bf6eb4a-33307bc87c.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "npm:6.18.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:7acec9484f01c68f8aa5f9931e6ffc696653513b41af7f3d08663c42ada1d00ee091c13e0780af9dcf735ec8a6e052660a87dc109342f3525583cf5ed4b2167b#npm:5.62.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-d25122643b/0/cache/@typescript-eslint-typescript-estree-npm-5.62.0-5d1ea132a9-06c975eb5f.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "virtual:7acec9484f01c68f8aa5f9931e6ffc696653513b41af7f3d08663c42ada1d00ee091c13e0780af9dcf735ec8a6e052660a87dc109342f3525583cf5ed4b2167b#npm:5.62.0"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/types", "npm:5.62.0"],\ + ["@typescript-eslint/visitor-keys", "npm:5.62.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["globby", "npm:11.1.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["semver", "npm:7.5.4"],\ + ["tsutils", "virtual:d25122643b329d297f1158bdbbeb452d30b524ea62c42db7395547701b59d0cea14496f7d76f91f55bbcf1d1440cf89bd89ae4b0cd0a6ebd7928883f9bf0dba3#npm:3.21.0"],\ + ["typescript", "patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:8e35e61358256be2b5d90a559e3a3772257ad03ed9eac447b59935c934deb801b60b5640e0d64c4d3d6d217d8ee32f9d0f8b6df724cdfa9f0a254f75b7b6a4c5#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-45f7b3e074/0/cache/@typescript-eslint-typescript-estree-npm-6.18.1-8c1bf6eb4a-33307bc87c.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "virtual:8e35e61358256be2b5d90a559e3a3772257ad03ed9eac447b59935c934deb801b60b5640e0d64c4d3d6d217d8ee32f9d0f8b6df724cdfa9f0a254f75b7b6a4c5#npm:6.18.1"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/types", "npm:6.18.1"],\ + ["@typescript-eslint/visitor-keys", "npm:6.18.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["globby", "npm:11.1.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["minimatch", "npm:9.0.3"],\ + ["semver", "npm:7.5.4"],\ + ["ts-api-utils", "virtual:45f7b3e074718861e9d412f1461999483dee0f73f35f1e6f12ded75c3c5b62cd2bcff5f531367f4b6732c1e89724ee8d5efc7a3515fd1f1d59d8f1ab11edf9ed#npm:1.0.3"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:aa734fe5910ab2043ff5b76d2c49e3a3aff381cfe805800a92c03671e0b66da8ec7f2fc8ded6c6952cec7a57f0f439fa45d51213f03f478f98eb208ccfd5b76b#npm:4.33.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-40b7528656/0/cache/@typescript-eslint-typescript-estree-npm-4.33.0-b6b79c10d0-e9409ec992.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "virtual:aa734fe5910ab2043ff5b76d2c49e3a3aff381cfe805800a92c03671e0b66da8ec7f2fc8ded6c6952cec7a57f0f439fa45d51213f03f478f98eb208ccfd5b76b#npm:4.33.0"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/types", "npm:4.33.0"],\ + ["@typescript-eslint/visitor-keys", "npm:4.33.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["globby", "npm:11.1.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["semver", "npm:7.5.4"],\ + ["tsutils", "virtual:40b7528656205285b7eb6c8a2b798d03c881f5fc5f312b0ac13d2de58079f2f1fefdc278b4177d7b19c2e1c30a289310b9c005566bdd606e08fd4846ffc54362#npm:3.21.0"],\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:be6bfb49b5428d9c72a0cb13203452e77c9d44fe11a32d7b8023ffbd53cee614b089863c69283f68d64972fd9edd4465c802c37983c7e0e629bb20ff780d0fa6#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-861dd30074/0/cache/@typescript-eslint-typescript-estree-npm-6.18.1-8c1bf6eb4a-33307bc87c.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "virtual:be6bfb49b5428d9c72a0cb13203452e77c9d44fe11a32d7b8023ffbd53cee614b089863c69283f68d64972fd9edd4465c802c37983c7e0e629bb20ff780d0fa6#npm:6.18.1"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/types", "npm:6.18.1"],\ + ["@typescript-eslint/visitor-keys", "npm:6.18.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["globby", "npm:11.1.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["minimatch", "npm:9.0.3"],\ + ["semver", "npm:7.5.4"],\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:e6e1d7cfd66980172234de35984619ab306c6b237672f3c3b662d184847f85a7635e1cec60ef078ae89a87fc8d8bf40dbfb8ad96ba2bd24f3569008504bd3397#npm:6.17.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-aa6a582123/0/cache/@typescript-eslint-typescript-estree-npm-6.17.0-c77ebc49a9-1671b0d2f2.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "virtual:e6e1d7cfd66980172234de35984619ab306c6b237672f3c3b662d184847f85a7635e1cec60ef078ae89a87fc8d8bf40dbfb8ad96ba2bd24f3569008504bd3397#npm:6.17.0"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/types", "npm:6.17.0"],\ + ["@typescript-eslint/visitor-keys", "npm:6.17.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["globby", "npm:11.1.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["minimatch", "npm:9.0.3"],\ + ["semver", "npm:7.5.4"],\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/utils", [\ + ["npm:6.18.1", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-utils-npm-6.18.1-6a422bc632-967728f062.zip/node_modules/@typescript-eslint/utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/utils", "npm:6.18.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-utils-virtual-8e35e61358/0/cache/@typescript-eslint-utils-npm-6.18.1-6a422bc632-967728f062.zip/node_modules/@typescript-eslint/utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["@eslint-community/eslint-utils", "virtual:6eec398a4132b5372ea5ffc0bc36d4c81602b7e444a89685d0d958016d8fd53df5c0c97c6a8bf99951469e2c6c06135dd192e9309f6e39b1a4c85e0faabe1f6b#npm:4.4.0"],\ + ["@types/eslint", null],\ + ["@types/json-schema", "npm:7.0.15"],\ + ["@types/semver", "npm:7.5.6"],\ + ["@typescript-eslint/scope-manager", "npm:6.18.1"],\ + ["@typescript-eslint/types", "npm:6.18.1"],\ + ["@typescript-eslint/typescript-estree", "virtual:8e35e61358256be2b5d90a559e3a3772257ad03ed9eac447b59935c934deb801b60b5640e0d64c4d3d6d217d8ee32f9d0f8b6df724cdfa9f0a254f75b7b6a4c5#npm:6.18.1"],\ + ["eslint", "npm:8.56.0"],\ + ["semver", "npm:7.5.4"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/visitor-keys", [\ + ["npm:4.33.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-visitor-keys-npm-4.33.0-8b7e72a3c9-b28cd3f2c5.zip/node_modules/@typescript-eslint/visitor-keys/",\ + "packageDependencies": [\ + ["@typescript-eslint/visitor-keys", "npm:4.33.0"],\ + ["@typescript-eslint/types", "npm:4.33.0"],\ + ["eslint-visitor-keys", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.62.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-visitor-keys-npm-5.62.0-da1af55f83-dc613ab756.zip/node_modules/@typescript-eslint/visitor-keys/",\ + "packageDependencies": [\ + ["@typescript-eslint/visitor-keys", "npm:5.62.0"],\ + ["@typescript-eslint/types", "npm:5.62.0"],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.17.0", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-visitor-keys-npm-6.17.0-fe9f80b87e-a2aed0e143.zip/node_modules/@typescript-eslint/visitor-keys/",\ + "packageDependencies": [\ + ["@typescript-eslint/visitor-keys", "npm:6.17.0"],\ + ["@typescript-eslint/types", "npm:6.17.0"],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.18.1", {\ + "packageLocation": "./.yarn/cache/@typescript-eslint-visitor-keys-npm-6.18.1-1fdb3bad24-2d6c5ffa52.zip/node_modules/@typescript-eslint/visitor-keys/",\ + "packageDependencies": [\ + ["@typescript-eslint/visitor-keys", "npm:6.18.1"],\ + ["@typescript-eslint/types", "npm:6.18.1"],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@ungap/structured-clone", [\ + ["npm:1.2.0", {\ + "packageLocation": "./.yarn/cache/@ungap-structured-clone-npm-1.2.0-648f0b82e0-c6fe89a505.zip/node_modules/@ungap/structured-clone/",\ + "packageDependencies": [\ + ["@ungap/structured-clone", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@vercel/nft", [\ + ["npm:0.24.4", {\ + "packageLocation": "./.yarn/cache/@vercel-nft-npm-0.24.4-80d5529913-e6614ff918.zip/node_modules/@vercel/nft/",\ + "packageDependencies": [\ + ["@vercel/nft", "npm:0.24.4"],\ + ["@mapbox/node-pre-gyp", "npm:1.0.11"],\ + ["@rollup/pluginutils", "npm:4.2.1"],\ + ["acorn", "npm:8.11.3"],\ + ["async-sema", "npm:3.1.1"],\ + ["bindings", "npm:1.5.0"],\ + ["estree-walker", "npm:2.0.2"],\ + ["glob", "npm:7.2.3"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["micromatch", "npm:4.0.5"],\ + ["node-gyp-build", "npm:4.7.1"],\ + ["resolve-from", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["JSONStream", [\ + ["npm:1.3.5", {\ + "packageLocation": "./.yarn/cache/JSONStream-npm-1.3.5-1987f2e6dd-e30daf7b9b.zip/node_modules/JSONStream/",\ + "packageDependencies": [\ + ["JSONStream", "npm:1.3.5"],\ + ["jsonparse", "npm:1.3.1"],\ + ["through", "npm:2.3.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["abbrev", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/abbrev-npm-1.1.1-3659247eab-2d88294118.zip/node_modules/abbrev/",\ + "packageDependencies": [\ + ["abbrev", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/abbrev-npm-2.0.0-0eb38a17e5-ca0a54e35b.zip/node_modules/abbrev/",\ + "packageDependencies": [\ + ["abbrev", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["accepts", [\ + ["npm:1.3.8", {\ + "packageLocation": "./.yarn/cache/accepts-npm-1.3.8-9a812371c9-67eaaa90e2.zip/node_modules/accepts/",\ + "packageDependencies": [\ + ["accepts", "npm:1.3.8"],\ + ["mime-types", "npm:2.1.35"],\ + ["negotiator", "npm:0.6.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["acorn", [\ + ["npm:8.11.3", {\ + "packageLocation": "./.yarn/cache/acorn-npm-8.11.3-0d7ab48b38-b688e7e3c6.zip/node_modules/acorn/",\ + "packageDependencies": [\ + ["acorn", "npm:8.11.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["acorn-jsx", [\ + ["npm:5.3.2", {\ + "packageLocation": "./.yarn/cache/acorn-jsx-npm-5.3.2-d7594599ea-d4371eaef7.zip/node_modules/acorn-jsx/",\ + "packageDependencies": [\ + ["acorn-jsx", "npm:5.3.2"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2", {\ + "packageLocation": "./.yarn/__virtual__/acorn-jsx-virtual-834321b202/0/cache/acorn-jsx-npm-5.3.2-d7594599ea-d4371eaef7.zip/node_modules/acorn-jsx/",\ + "packageDependencies": [\ + ["acorn-jsx", "virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2"],\ + ["@types/acorn", null],\ + ["acorn", "npm:8.11.3"]\ + ],\ + "packagePeers": [\ + "@types/acorn",\ + "acorn"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["acorn-walk", [\ + ["npm:8.3.1", {\ + "packageLocation": "./.yarn/cache/acorn-walk-npm-8.3.1-2a7e2dbd77-64187f1377.zip/node_modules/acorn-walk/",\ + "packageDependencies": [\ + ["acorn-walk", "npm:8.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["add-stream", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/add-stream-npm-1.0.0-a5a0c0498c-3e9e8b0b8f.zip/node_modules/add-stream/",\ + "packageDependencies": [\ + ["add-stream", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["agent-base", [\ + ["npm:6.0.2", {\ + "packageLocation": "./.yarn/cache/agent-base-npm-6.0.2-428f325a93-21fb903e09.zip/node_modules/agent-base/",\ + "packageDependencies": [\ + ["agent-base", "npm:6.0.2"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.1.0", {\ + "packageLocation": "./.yarn/cache/agent-base-npm-7.1.0-4b12ba5111-f7828f9914.zip/node_modules/agent-base/",\ + "packageDependencies": [\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["aggregate-error", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/aggregate-error-npm-3.1.0-415a406f4e-1101a33f21.zip/node_modules/aggregate-error/",\ + "packageDependencies": [\ + ["aggregate-error", "npm:3.1.0"],\ + ["clean-stack", "npm:2.2.0"],\ + ["indent-string", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.1", {\ + "packageLocation": "./.yarn/cache/aggregate-error-npm-4.0.1-12d0501fb7-bb3ffdfd13.zip/node_modules/aggregate-error/",\ + "packageDependencies": [\ + ["aggregate-error", "npm:4.0.1"],\ + ["clean-stack", "npm:4.2.0"],\ + ["indent-string", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ajv", [\ + ["npm:6.12.6", {\ + "packageLocation": "./.yarn/cache/ajv-npm-6.12.6-4b5105e2b2-48d6ad2113.zip/node_modules/ajv/",\ + "packageDependencies": [\ + ["ajv", "npm:6.12.6"],\ + ["fast-deep-equal", "npm:3.1.3"],\ + ["fast-json-stable-stringify", "npm:2.1.0"],\ + ["json-schema-traverse", "npm:0.4.1"],\ + ["uri-js", "npm:4.4.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.12.0", {\ + "packageLocation": "./.yarn/cache/ajv-npm-8.12.0-3bf6e30741-b406f3b79b.zip/node_modules/ajv/",\ + "packageDependencies": [\ + ["ajv", "npm:8.12.0"],\ + ["fast-deep-equal", "npm:3.1.3"],\ + ["json-schema-traverse", "npm:1.0.0"],\ + ["require-from-string", "npm:2.0.2"],\ + ["uri-js", "npm:4.4.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ajv-cli", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/ajv-cli-npm-5.0.0-e12d6f3c52-bd755f7f34.zip/node_modules/ajv-cli/",\ + "packageDependencies": [\ + ["ajv-cli", "npm:5.0.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.0.0", {\ + "packageLocation": "./.yarn/__virtual__/ajv-cli-virtual-d5efd73224/0/cache/ajv-cli-npm-5.0.0-e12d6f3c52-bd755f7f34.zip/node_modules/ajv-cli/",\ + "packageDependencies": [\ + ["ajv-cli", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.0.0"],\ + ["@types/ts-node", null],\ + ["ajv", "npm:8.12.0"],\ + ["fast-json-patch", "npm:2.2.1"],\ + ["glob", "npm:7.2.3"],\ + ["js-yaml", "npm:3.14.1"],\ + ["json-schema-migrate", "npm:2.0.0"],\ + ["json5", "npm:2.2.3"],\ + ["minimist", "npm:1.2.8"],\ + ["ts-node", null]\ + ],\ + "packagePeers": [\ + "@types/ts-node",\ + "ts-node"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ansi-escapes", [\ + ["npm:4.3.2", {\ + "packageLocation": "./.yarn/cache/ansi-escapes-npm-4.3.2-3ad173702f-8661034456.zip/node_modules/ansi-escapes/",\ + "packageDependencies": [\ + ["ansi-escapes", "npm:4.3.2"],\ + ["type-fest", "npm:0.21.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ansi-regex", [\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip/node_modules/ansi-regex/",\ + "packageDependencies": [\ + ["ansi-regex", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.1", {\ + "packageLocation": "./.yarn/cache/ansi-regex-npm-6.0.1-8d663a607d-1ff8b7667c.zip/node_modules/ansi-regex/",\ + "packageDependencies": [\ + ["ansi-regex", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ansi-sequence-parser", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/ansi-sequence-parser-npm-1.1.1-4cfd5b85e2-9ce30f257b.zip/node_modules/ansi-sequence-parser/",\ + "packageDependencies": [\ + ["ansi-sequence-parser", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ansi-styles", [\ + ["npm:3.2.1", {\ + "packageLocation": "./.yarn/cache/ansi-styles-npm-3.2.1-8cb8107983-d85ade01c1.zip/node_modules/ansi-styles/",\ + "packageDependencies": [\ + ["ansi-styles", "npm:3.2.1"],\ + ["color-convert", "npm:1.9.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.3.0", {\ + "packageLocation": "./.yarn/cache/ansi-styles-npm-4.3.0-245c7d42c7-b4494dfbfc.zip/node_modules/ansi-styles/",\ + "packageDependencies": [\ + ["ansi-styles", "npm:4.3.0"],\ + ["color-convert", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.2.1", {\ + "packageLocation": "./.yarn/cache/ansi-styles-npm-6.2.1-d43647018c-70fdf883b7.zip/node_modules/ansi-styles/",\ + "packageDependencies": [\ + ["ansi-styles", "npm:6.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["any-promise", [\ + ["npm:1.3.0", {\ + "packageLocation": "./.yarn/cache/any-promise-npm-1.3.0-f34eeaa7e7-6737469ba3.zip/node_modules/any-promise/",\ + "packageDependencies": [\ + ["any-promise", "npm:1.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["app-module-path", [\ + ["npm:2.2.0", {\ + "packageLocation": "./.yarn/cache/app-module-path-npm-2.2.0-71fdc42bce-9ed8c6ce62.zip/node_modules/app-module-path/",\ + "packageDependencies": [\ + ["app-module-path", "npm:2.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["aproba", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/aproba-npm-2.0.0-8716bcfde6-c2b9a63129.zip/node_modules/aproba/",\ + "packageDependencies": [\ + ["aproba", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["are-we-there-yet", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/are-we-there-yet-npm-2.0.0-7d2f5201ce-ea6f47d14f.zip/node_modules/are-we-there-yet/",\ + "packageDependencies": [\ + ["are-we-there-yet", "npm:2.0.0"],\ + ["delegates", "npm:1.0.0"],\ + ["readable-stream", "npm:3.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["argparse", [\ + ["npm:1.0.10", {\ + "packageLocation": "./.yarn/cache/argparse-npm-1.0.10-528934e59d-c6a621343a.zip/node_modules/argparse/",\ + "packageDependencies": [\ + ["argparse", "npm:1.0.10"],\ + ["sprintf-js", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/argparse-npm-2.0.1-faff7999e6-18640244e6.zip/node_modules/argparse/",\ + "packageDependencies": [\ + ["argparse", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-buffer-byte-length", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/array-buffer-byte-length-npm-1.0.0-331671f28a-044e101ce1.zip/node_modules/array-buffer-byte-length/",\ + "packageDependencies": [\ + ["array-buffer-byte-length", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.5"],\ + ["is-array-buffer", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-find-index", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/array-find-index-npm-1.0.2-a7d5fbff35-aac128bf36.zip/node_modules/array-find-index/",\ + "packageDependencies": [\ + ["array-find-index", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-flatten", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/array-flatten-npm-1.1.1-9d94ad5f1d-e13c9d2472.zip/node_modules/array-flatten/",\ + "packageDependencies": [\ + ["array-flatten", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-ify", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/array-ify-npm-1.0.0-e09a371977-c0502015b3.zip/node_modules/array-ify/",\ + "packageDependencies": [\ + ["array-ify", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-includes", [\ + ["npm:3.1.7", {\ + "packageLocation": "./.yarn/cache/array-includes-npm-3.1.7-d32a5ee179-856a8be5d1.zip/node_modules/array-includes/",\ + "packageDependencies": [\ + ["array-includes", "npm:3.1.7"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["is-string", "npm:1.0.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-timsort", [\ + ["npm:1.0.3", {\ + "packageLocation": "./.yarn/cache/array-timsort-npm-1.0.3-50b9e6724f-f417f073b3.zip/node_modules/array-timsort/",\ + "packageDependencies": [\ + ["array-timsort", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-union", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/array-union-npm-2.1.0-4e4852b221-5bee12395c.zip/node_modules/array-union/",\ + "packageDependencies": [\ + ["array-union", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array.prototype.findlastindex", [\ + ["npm:1.2.3", {\ + "packageLocation": "./.yarn/cache/array.prototype.findlastindex-npm-1.2.3-2a36f4417b-063cbab8ee.zip/node_modules/array.prototype.findlastindex/",\ + "packageDependencies": [\ + ["array.prototype.findlastindex", "npm:1.2.3"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["es-shim-unscopables", "npm:1.0.2"],\ + ["get-intrinsic", "npm:1.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array.prototype.flat", [\ + ["npm:1.3.2", {\ + "packageLocation": "./.yarn/cache/array.prototype.flat-npm-1.3.2-350729f7f4-d9d2f6f275.zip/node_modules/array.prototype.flat/",\ + "packageDependencies": [\ + ["array.prototype.flat", "npm:1.3.2"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["es-shim-unscopables", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array.prototype.flatmap", [\ + ["npm:1.3.2", {\ + "packageLocation": "./.yarn/cache/array.prototype.flatmap-npm-1.3.2-5c6a4af226-33f2000668.zip/node_modules/array.prototype.flatmap/",\ + "packageDependencies": [\ + ["array.prototype.flatmap", "npm:1.3.2"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["es-shim-unscopables", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["arraybuffer.prototype.slice", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/arraybuffer.prototype.slice-npm-1.0.2-4eda52ad8c-c200faf437.zip/node_modules/arraybuffer.prototype.slice/",\ + "packageDependencies": [\ + ["arraybuffer.prototype.slice", "npm:1.0.2"],\ + ["array-buffer-byte-length", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["is-array-buffer", "npm:3.0.2"],\ + ["is-shared-array-buffer", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["arrgv", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/arrgv-npm-1.0.2-2f5078bb50-470bbb406e.zip/node_modules/arrgv/",\ + "packageDependencies": [\ + ["arrgv", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["arrify", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/arrify-npm-1.0.1-affafba9fe-745075dd4a.zip/node_modules/arrify/",\ + "packageDependencies": [\ + ["arrify", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/arrify-npm-3.0.0-84cf7a301c-d6c6f3dad9.zip/node_modules/arrify/",\ + "packageDependencies": [\ + ["arrify", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["asmcrypto.js", [\ + ["npm:2.3.2", {\ + "packageLocation": "./.yarn/cache/asmcrypto.js-npm-2.3.2-7e6e6cafba-94b1e33cfd.zip/node_modules/asmcrypto.js/",\ + "packageDependencies": [\ + ["asmcrypto.js", "npm:2.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ast-module-types", [\ + ["npm:2.7.1", {\ + "packageLocation": "./.yarn/cache/ast-module-types-npm-2.7.1-1833572dd9-f5ff6a8aec.zip/node_modules/ast-module-types/",\ + "packageDependencies": [\ + ["ast-module-types", "npm:2.7.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/ast-module-types-npm-3.0.0-2f08e895f4-9cf2e1c566.zip/node_modules/ast-module-types/",\ + "packageDependencies": [\ + ["ast-module-types", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/ast-module-types-npm-4.0.0-1d93ec3f90-06cf93519e.zip/node_modules/ast-module-types/",\ + "packageDependencies": [\ + ["ast-module-types", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["async-sema", [\ + ["npm:3.1.1", {\ + "packageLocation": "./.yarn/cache/async-sema-npm-3.1.1-a5453a4d6a-ee0225c2e7.zip/node_modules/async-sema/",\ + "packageDependencies": [\ + ["async-sema", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["at-least-node", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/at-least-node-npm-1.0.0-2b36e661fa-463e2f8e43.zip/node_modules/at-least-node/",\ + "packageDependencies": [\ + ["at-least-node", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ava", [\ + ["npm:6.0.1", {\ + "packageLocation": "./.yarn/cache/ava-npm-6.0.1-dbddac242f-0b7e71b047.zip/node_modules/ava/",\ + "packageDependencies": [\ + ["ava", "npm:6.0.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.1", {\ + "packageLocation": "./.yarn/__virtual__/ava-virtual-20275f09c0/0/cache/ava-npm-6.0.1-dbddac242f-0b7e71b047.zip/node_modules/ava/",\ + "packageDependencies": [\ + ["ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.1"],\ + ["@ava/typescript", "npm:4.1.0"],\ + ["@types/ava__typescript", null],\ + ["@vercel/nft", "npm:0.24.4"],\ + ["acorn", "npm:8.11.3"],\ + ["acorn-walk", "npm:8.3.1"],\ + ["ansi-styles", "npm:6.2.1"],\ + ["arrgv", "npm:1.0.2"],\ + ["arrify", "npm:3.0.0"],\ + ["callsites", "npm:4.1.0"],\ + ["cbor", "npm:9.0.1"],\ + ["chalk", "npm:5.3.0"],\ + ["chunkd", "npm:2.0.1"],\ + ["ci-info", "npm:4.0.0"],\ + ["ci-parallel-vars", "npm:1.0.1"],\ + ["cli-truncate", "npm:4.0.0"],\ + ["code-excerpt", "npm:4.0.0"],\ + ["common-path-prefix", "npm:3.0.0"],\ + ["concordance", "npm:5.0.4"],\ + ["currently-unhandled", "npm:0.4.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["emittery", "npm:1.0.1"],\ + ["figures", "npm:6.0.1"],\ + ["globby", "npm:14.0.0"],\ + ["ignore-by-default", "npm:2.1.0"],\ + ["indent-string", "npm:5.0.0"],\ + ["is-plain-object", "npm:5.0.0"],\ + ["is-promise", "npm:4.0.0"],\ + ["matcher", "npm:5.0.0"],\ + ["memoize", "npm:10.0.0"],\ + ["ms", "npm:2.1.3"],\ + ["p-map", "npm:6.0.0"],\ + ["package-config", "npm:5.0.0"],\ + ["picomatch", "npm:3.0.1"],\ + ["plur", "npm:5.1.0"],\ + ["pretty-ms", "npm:8.0.0"],\ + ["resolve-cwd", "npm:3.0.0"],\ + ["stack-utils", "npm:2.0.6"],\ + ["strip-ansi", "npm:7.1.0"],\ + ["supertap", "npm:3.0.1"],\ + ["temp-dir", "npm:3.0.0"],\ + ["write-file-atomic", "npm:5.0.1"],\ + ["yargs", "npm:17.7.2"]\ + ],\ + "packagePeers": [\ + "@ava/typescript",\ + "@types/ava__typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["available-typed-arrays", [\ + ["npm:1.0.5", {\ + "packageLocation": "./.yarn/cache/available-typed-arrays-npm-1.0.5-88f321e4d3-4d4d5e86ea.zip/node_modules/available-typed-arrays/",\ + "packageDependencies": [\ + ["available-typed-arrays", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["balanced-match", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip/node_modules/balanced-match/",\ + "packageDependencies": [\ + ["balanced-match", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["base-x", [\ + ["npm:3.0.9", {\ + "packageLocation": "./.yarn/cache/base-x-npm-3.0.9-7b2588e106-957101d6fd.zip/node_modules/base-x/",\ + "packageDependencies": [\ + ["base-x", "npm:3.0.9"],\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["base64-js", [\ + ["npm:1.5.1", {\ + "packageLocation": "./.yarn/cache/base64-js-npm-1.5.1-b2f7275641-669632eb37.zip/node_modules/base64-js/",\ + "packageDependencies": [\ + ["base64-js", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bech32", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/bech32-npm-2.0.0-ad98b7dd79-fa15acb270.zip/node_modules/bech32/",\ + "packageDependencies": [\ + ["bech32", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["benchmark", [\ + ["npm:2.1.4", {\ + "packageLocation": "./.yarn/cache/benchmark-npm-2.1.4-3d024a205e-0f42f865ae.zip/node_modules/benchmark/",\ + "packageDependencies": [\ + ["benchmark", "npm:2.1.4"],\ + ["lodash", "npm:4.17.21"],\ + ["platform", "npm:1.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bigi", [\ + ["npm:1.4.2", {\ + "packageLocation": "./.yarn/cache/bigi-npm-1.4.2-e1940a4956-e8165beb2a.zip/node_modules/bigi/",\ + "packageDependencies": [\ + ["bigi", "npm:1.4.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bindings", [\ + ["npm:1.5.0", {\ + "packageLocation": "./.yarn/cache/bindings-npm-1.5.0-77ce1d213c-593d5ae975.zip/node_modules/bindings/",\ + "packageDependencies": [\ + ["bindings", "npm:1.5.0"],\ + ["file-uri-to-path", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bip-schnorr", [\ + ["npm:0.6.4", {\ + "packageLocation": "./.yarn/cache/bip-schnorr-npm-0.6.4-9f0fad8f4b-913859c572.zip/node_modules/bip-schnorr/",\ + "packageDependencies": [\ + ["bip-schnorr", "npm:0.6.4"],\ + ["bigi", "npm:1.4.2"],\ + ["ecurve", "npm:1.0.6"],\ + ["js-sha256", "npm:0.9.0"],\ + ["randombytes", "npm:2.1.0"],\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bitcore-lib", [\ + ["npm:10.0.23", {\ + "packageLocation": "./.yarn/cache/bitcore-lib-npm-10.0.23-75b1927db3-d10c120aa7.zip/node_modules/bitcore-lib/",\ + "packageDependencies": [\ + ["bitcore-lib", "npm:10.0.23"],\ + ["bech32", "npm:2.0.0"],\ + ["bip-schnorr", "npm:0.6.4"],\ + ["bn.js", "npm:4.11.8"],\ + ["bs58", "npm:4.0.1"],\ + ["buffer-compare", "npm:1.1.1"],\ + ["elliptic", "npm:6.5.4"],\ + ["inherits", "npm:2.0.1"],\ + ["lodash", "npm:4.17.21"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bitcore-lib-cash", [\ + ["npm:10.0.23", {\ + "packageLocation": "./.yarn/cache/bitcore-lib-cash-npm-10.0.23-880f1384b2-03b9b0a518.zip/node_modules/bitcore-lib-cash/",\ + "packageDependencies": [\ + ["bitcore-lib-cash", "npm:10.0.23"],\ + ["bitcore-lib", "npm:10.0.23"],\ + ["bn.js", "npm:4.11.8"],\ + ["bs58", "npm:4.0.1"],\ + ["buffer-compare", "npm:1.1.1"],\ + ["elliptic", "npm:6.5.4"],\ + ["inherits", "npm:2.0.1"],\ + ["lodash", "npm:4.17.21"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bl", [\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/bl-npm-4.1.0-7f94cdcf3f-b7904e66ed.zip/node_modules/bl/",\ + "packageDependencies": [\ + ["bl", "npm:4.1.0"],\ + ["buffer", "npm:5.7.1"],\ + ["inherits", "npm:2.0.4"],\ + ["readable-stream", "npm:3.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bluebird", [\ + ["npm:3.7.2", {\ + "packageLocation": "./.yarn/cache/bluebird-npm-3.7.2-6a54136ee3-007c7bad22.zip/node_modules/bluebird/",\ + "packageDependencies": [\ + ["bluebird", "npm:3.7.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["blueimp-md5", [\ + ["npm:2.19.0", {\ + "packageLocation": "./.yarn/cache/blueimp-md5-npm-2.19.0-0a19585c8c-84dc5f86e0.zip/node_modules/blueimp-md5/",\ + "packageDependencies": [\ + ["blueimp-md5", "npm:2.19.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bn.js", [\ + ["npm:4.11.8", {\ + "packageLocation": "./.yarn/cache/bn.js-npm-4.11.8-296affce9a-b498be9c09.zip/node_modules/bn.js/",\ + "packageDependencies": [\ + ["bn.js", "npm:4.11.8"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.12.0", {\ + "packageLocation": "./.yarn/cache/bn.js-npm-4.12.0-3ec6c884f6-10f8db196d.zip/node_modules/bn.js/",\ + "packageDependencies": [\ + ["bn.js", "npm:4.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["body-parser", [\ + ["npm:1.20.1", {\ + "packageLocation": "./.yarn/cache/body-parser-npm-1.20.1-759fd14db9-5f8d128022.zip/node_modules/body-parser/",\ + "packageDependencies": [\ + ["body-parser", "npm:1.20.1"],\ + ["bytes", "npm:3.1.2"],\ + ["content-type", "npm:1.0.5"],\ + ["debug", "virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9"],\ + ["depd", "npm:2.0.0"],\ + ["destroy", "npm:1.2.0"],\ + ["http-errors", "npm:2.0.0"],\ + ["iconv-lite", "npm:0.4.24"],\ + ["on-finished", "npm:2.4.1"],\ + ["qs", "npm:6.11.0"],\ + ["raw-body", "npm:2.5.1"],\ + ["type-is", "npm:1.6.18"],\ + ["unpipe", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["brace-expansion", [\ + ["npm:1.1.11", {\ + "packageLocation": "./.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip/node_modules/brace-expansion/",\ + "packageDependencies": [\ + ["brace-expansion", "npm:1.1.11"],\ + ["balanced-match", "npm:1.0.2"],\ + ["concat-map", "npm:0.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip/node_modules/brace-expansion/",\ + "packageDependencies": [\ + ["brace-expansion", "npm:2.0.1"],\ + ["balanced-match", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["braces", [\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/cache/braces-npm-3.0.2-782240b28a-966b1fb48d.zip/node_modules/braces/",\ + "packageDependencies": [\ + ["braces", "npm:3.0.2"],\ + ["fill-range", "npm:7.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["brorand", [\ + ["npm:1.1.0", {\ + "packageLocation": "./.yarn/cache/brorand-npm-1.1.0-ea86634c4b-8a05c9f3c4.zip/node_modules/brorand/",\ + "packageDependencies": [\ + ["brorand", "npm:1.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bs58", [\ + ["npm:4.0.1", {\ + "packageLocation": "./.yarn/cache/bs58-npm-4.0.1-8d2a7822b1-b3c5365bb9.zip/node_modules/bs58/",\ + "packageDependencies": [\ + ["bs58", "npm:4.0.1"],\ + ["base-x", "npm:3.0.9"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["buffer", [\ + ["npm:5.7.1", {\ + "packageLocation": "./.yarn/cache/buffer-npm-5.7.1-513ef8259e-997434d3c6.zip/node_modules/buffer/",\ + "packageDependencies": [\ + ["buffer", "npm:5.7.1"],\ + ["base64-js", "npm:1.5.1"],\ + ["ieee754", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["buffer-compare", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/buffer-compare-npm-1.1.1-4ea57f3a1d-dc5adc7406.zip/node_modules/buffer-compare/",\ + "packageDependencies": [\ + ["buffer-compare", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["buffer-from", [\ + ["npm:1.1.2", {\ + "packageLocation": "./.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip/node_modules/buffer-from/",\ + "packageDependencies": [\ + ["buffer-from", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["builtin-modules", [\ + ["npm:3.3.0", {\ + "packageLocation": "./.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-62e063ab40.zip/node_modules/builtin-modules/",\ + "packageDependencies": [\ + ["builtin-modules", "npm:3.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bundle-name", [\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/bundle-name-npm-4.1.0-4688335533-1d966c8d2d.zip/node_modules/bundle-name/",\ + "packageDependencies": [\ + ["bundle-name", "npm:4.1.0"],\ + ["run-applescript", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bytes", [\ + ["npm:3.1.2", {\ + "packageLocation": "./.yarn/cache/bytes-npm-3.1.2-28b8643004-a10abf2ba7.zip/node_modules/bytes/",\ + "packageDependencies": [\ + ["bytes", "npm:3.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["c8", [\ + ["npm:9.0.0", {\ + "packageLocation": "./.yarn/cache/c8-npm-9.0.0-a08ede145f-71ccdf112e.zip/node_modules/c8/",\ + "packageDependencies": [\ + ["c8", "npm:9.0.0"],\ + ["@bcoe/v8-coverage", "npm:0.2.3"],\ + ["@istanbuljs/schema", "npm:0.1.3"],\ + ["find-up", "npm:5.0.0"],\ + ["foreground-child", "npm:3.1.1"],\ + ["istanbul-lib-coverage", "npm:3.2.2"],\ + ["istanbul-lib-report", "npm:3.0.1"],\ + ["istanbul-reports", "npm:3.1.6"],\ + ["test-exclude", "npm:6.0.0"],\ + ["v8-to-istanbul", "npm:9.2.0"],\ + ["yargs", "npm:17.7.2"],\ + ["yargs-parser", "npm:21.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cacache", [\ + ["npm:18.0.2", {\ + "packageLocation": "./.yarn/cache/cacache-npm-18.0.2-d6329a1b9d-5ca58464f7.zip/node_modules/cacache/",\ + "packageDependencies": [\ + ["cacache", "npm:18.0.2"],\ + ["@npmcli/fs", "npm:3.1.0"],\ + ["fs-minipass", "npm:3.0.3"],\ + ["glob", "npm:10.3.10"],\ + ["lru-cache", "npm:10.1.0"],\ + ["minipass", "npm:7.0.4"],\ + ["minipass-collect", "npm:2.0.1"],\ + ["minipass-flush", "npm:1.0.5"],\ + ["minipass-pipeline", "npm:1.2.4"],\ + ["p-map", "npm:4.0.0"],\ + ["ssri", "npm:10.0.5"],\ + ["tar", "npm:6.2.0"],\ + ["unique-filename", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cachedir", [\ + ["npm:2.3.0", {\ + "packageLocation": "./.yarn/cache/cachedir-npm-2.3.0-640dc16bbb-ec90cb0f2e.zip/node_modules/cachedir/",\ + "packageDependencies": [\ + ["cachedir", "npm:2.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["call-bind", [\ + ["npm:1.0.5", {\ + "packageLocation": "./.yarn/cache/call-bind-npm-1.0.5-65600fae47-246d44db6e.zip/node_modules/call-bind/",\ + "packageDependencies": [\ + ["call-bind", "npm:1.0.5"],\ + ["function-bind", "npm:1.1.2"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["set-function-length", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["callsites", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/callsites-npm-3.1.0-268f989910-072d17b6ab.zip/node_modules/callsites/",\ + "packageDependencies": [\ + ["callsites", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/callsites-npm-4.1.0-4af8da43e9-4ad31de7b7.zip/node_modules/callsites/",\ + "packageDependencies": [\ + ["callsites", "npm:4.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["camelcase", [\ + ["npm:5.3.1", {\ + "packageLocation": "./.yarn/cache/camelcase-npm-5.3.1-5db8af62c5-e6effce26b.zip/node_modules/camelcase/",\ + "packageDependencies": [\ + ["camelcase", "npm:5.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["camelcase-keys", [\ + ["npm:6.2.2", {\ + "packageLocation": "./.yarn/cache/camelcase-keys-npm-6.2.2-d13777ec12-c1999f5b6d.zip/node_modules/camelcase-keys/",\ + "packageDependencies": [\ + ["camelcase-keys", "npm:6.2.2"],\ + ["camelcase", "npm:5.3.1"],\ + ["map-obj", "npm:4.3.0"],\ + ["quick-lru", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cbor", [\ + ["npm:9.0.1", {\ + "packageLocation": "./.yarn/cache/cbor-npm-9.0.1-3a5a6b7751-fa1bdf233b.zip/node_modules/cbor/",\ + "packageDependencies": [\ + ["cbor", "npm:9.0.1"],\ + ["nofilter", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["chalk", [\ + ["npm:2.4.2", {\ + "packageLocation": "./.yarn/cache/chalk-npm-2.4.2-3ea16dd91e-3d1d103433.zip/node_modules/chalk/",\ + "packageDependencies": [\ + ["chalk", "npm:2.4.2"],\ + ["ansi-styles", "npm:3.2.1"],\ + ["escape-string-regexp", "npm:1.0.5"],\ + ["supports-color", "npm:5.5.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.2", {\ + "packageLocation": "./.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-cb3f3e5949.zip/node_modules/chalk/",\ + "packageDependencies": [\ + ["chalk", "npm:4.1.2"],\ + ["ansi-styles", "npm:4.3.0"],\ + ["supports-color", "npm:7.2.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.3.0", {\ + "packageLocation": "./.yarn/cache/chalk-npm-5.3.0-d181999efb-6373caaab2.zip/node_modules/chalk/",\ + "packageDependencies": [\ + ["chalk", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["chalk-template", [\ + ["npm:1.1.0", {\ + "packageLocation": "./.yarn/cache/chalk-template-npm-1.1.0-2310bf686b-868aae8d4e.zip/node_modules/chalk-template/",\ + "packageDependencies": [\ + ["chalk-template", "npm:1.1.0"],\ + ["chalk", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["chardet", [\ + ["npm:0.7.0", {\ + "packageLocation": "./.yarn/cache/chardet-npm-0.7.0-27933dd6c7-b0ec668fba.zip/node_modules/chardet/",\ + "packageDependencies": [\ + ["chardet", "npm:0.7.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["chownr", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip/node_modules/chownr/",\ + "packageDependencies": [\ + ["chownr", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["chuhai", [\ + ["npm:1.2.0", {\ + "packageLocation": "./.yarn/cache/chuhai-npm-1.2.0-3840e91415-fa2da111da.zip/node_modules/chuhai/",\ + "packageDependencies": [\ + ["chuhai", "npm:1.2.0"],\ + ["benchmark", "npm:2.1.4"],\ + ["bluebird", "npm:3.7.2"],\ + ["debug", "virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9"],\ + ["fn-name", "npm:2.0.1"],\ + ["lodash", "npm:4.17.21"],\ + ["stack-utils", "npm:0.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["chunkd", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/chunkd-npm-2.0.1-2a1d1afad0-bab8cc08c7.zip/node_modules/chunkd/",\ + "packageDependencies": [\ + ["chunkd", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ci-info", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/ci-info-npm-4.0.0-90a0683096-c983bb7ff1.zip/node_modules/ci-info/",\ + "packageDependencies": [\ + ["ci-info", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ci-parallel-vars", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/ci-parallel-vars-npm-1.0.1-27c813d568-ae859831f7.zip/node_modules/ci-parallel-vars/",\ + "packageDependencies": [\ + ["ci-parallel-vars", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["clean-stack", [\ + ["npm:2.2.0", {\ + "packageLocation": "./.yarn/cache/clean-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip/node_modules/clean-stack/",\ + "packageDependencies": [\ + ["clean-stack", "npm:2.2.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.2.0", {\ + "packageLocation": "./.yarn/cache/clean-stack-npm-4.2.0-bb0dff47b2-373f656a31.zip/node_modules/clean-stack/",\ + "packageDependencies": [\ + ["clean-stack", "npm:4.2.0"],\ + ["escape-string-regexp", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["clear-module", [\ + ["npm:4.1.2", {\ + "packageLocation": "./.yarn/cache/clear-module-npm-4.1.2-8178e7e490-4931f0c461.zip/node_modules/clear-module/",\ + "packageDependencies": [\ + ["clear-module", "npm:4.1.2"],\ + ["parent-module", "npm:2.0.0"],\ + ["resolve-from", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cli-cursor", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/cli-cursor-npm-3.1.0-fee1e46b5e-2692784c6c.zip/node_modules/cli-cursor/",\ + "packageDependencies": [\ + ["cli-cursor", "npm:3.1.0"],\ + ["restore-cursor", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cli-spinners", [\ + ["npm:2.9.2", {\ + "packageLocation": "./.yarn/cache/cli-spinners-npm-2.9.2-be9c08efee-a0a863f442.zip/node_modules/cli-spinners/",\ + "packageDependencies": [\ + ["cli-spinners", "npm:2.9.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cli-truncate", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/cli-truncate-npm-4.0.0-3113917cdb-d5149175fd.zip/node_modules/cli-truncate/",\ + "packageDependencies": [\ + ["cli-truncate", "npm:4.0.0"],\ + ["slice-ansi", "npm:5.0.0"],\ + ["string-width", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cli-width", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/cli-width-npm-3.0.0-387b3f68f9-8730848b04.zip/node_modules/cli-width/",\ + "packageDependencies": [\ + ["cli-width", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cliui", [\ + ["npm:7.0.4", {\ + "packageLocation": "./.yarn/cache/cliui-npm-7.0.4-d6b8a9edb6-db858c49af.zip/node_modules/cliui/",\ + "packageDependencies": [\ + ["cliui", "npm:7.0.4"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["wrap-ansi", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.0.1", {\ + "packageLocation": "./.yarn/cache/cliui-npm-8.0.1-3b029092cf-eaa5561aeb.zip/node_modules/cliui/",\ + "packageDependencies": [\ + ["cliui", "npm:8.0.1"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["wrap-ansi", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["clone", [\ + ["npm:1.0.4", {\ + "packageLocation": "./.yarn/cache/clone-npm-1.0.4-a610fcbcf9-d06418b733.zip/node_modules/clone/",\ + "packageDependencies": [\ + ["clone", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["code-excerpt", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/code-excerpt-npm-4.0.0-f453325e6e-d57137d8f4.zip/node_modules/code-excerpt/",\ + "packageDependencies": [\ + ["code-excerpt", "npm:4.0.0"],\ + ["convert-to-spaces", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["color-convert", [\ + ["npm:1.9.3", {\ + "packageLocation": "./.yarn/cache/color-convert-npm-1.9.3-1fe690075e-ffa3190250.zip/node_modules/color-convert/",\ + "packageDependencies": [\ + ["color-convert", "npm:1.9.3"],\ + ["color-name", "npm:1.1.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/color-convert-npm-2.0.1-79730e935b-fa00c91b43.zip/node_modules/color-convert/",\ + "packageDependencies": [\ + ["color-convert", "npm:2.0.1"],\ + ["color-name", "npm:1.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["color-name", [\ + ["npm:1.1.3", {\ + "packageLocation": "./.yarn/cache/color-name-npm-1.1.3-728b7b5d39-09c5d3e33d.zip/node_modules/color-name/",\ + "packageDependencies": [\ + ["color-name", "npm:1.1.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:1.1.4", {\ + "packageLocation": "./.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip/node_modules/color-name/",\ + "packageDependencies": [\ + ["color-name", "npm:1.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["color-support", [\ + ["npm:1.1.3", {\ + "packageLocation": "./.yarn/cache/color-support-npm-1.1.3-3be5c53455-4bcfe30eea.zip/node_modules/color-support/",\ + "packageDependencies": [\ + ["color-support", "npm:1.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["colors", [\ + ["npm:1.2.5", {\ + "packageLocation": "./.yarn/cache/colors-npm-1.2.5-891bb7682f-fe30007df0.zip/node_modules/colors/",\ + "packageDependencies": [\ + ["colors", "npm:1.2.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["commander", [\ + ["npm:11.1.0", {\ + "packageLocation": "./.yarn/cache/commander-npm-11.1.0-56e979613c-66bd2d8a05.zip/node_modules/commander/",\ + "packageDependencies": [\ + ["commander", "npm:11.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.20.3", {\ + "packageLocation": "./.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-90c5b68986.zip/node_modules/commander/",\ + "packageDependencies": [\ + ["commander", "npm:2.20.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.2.0", {\ + "packageLocation": "./.yarn/cache/commander-npm-7.2.0-19178180f8-9973af1072.zip/node_modules/commander/",\ + "packageDependencies": [\ + ["commander", "npm:7.2.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:9.5.0", {\ + "packageLocation": "./.yarn/cache/commander-npm-9.5.0-993b3f2434-41c49b3d0f.zip/node_modules/commander/",\ + "packageDependencies": [\ + ["commander", "npm:9.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["comment-json", [\ + ["npm:4.2.3", {\ + "packageLocation": "./.yarn/cache/comment-json-npm-4.2.3-5f699ecc8d-97eb6ff823.zip/node_modules/comment-json/",\ + "packageDependencies": [\ + ["comment-json", "npm:4.2.3"],\ + ["array-timsort", "npm:1.0.3"],\ + ["core-util-is", "npm:1.0.3"],\ + ["esprima", "npm:4.0.1"],\ + ["has-own-prop", "npm:2.0.0"],\ + ["repeat-string", "npm:1.6.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["commitizen", [\ + ["npm:4.3.0", {\ + "packageLocation": "./.yarn/cache/commitizen-npm-4.3.0-3695cdaf66-45a82b7fde.zip/node_modules/commitizen/",\ + "packageDependencies": [\ + ["commitizen", "npm:4.3.0"],\ + ["cachedir", "npm:2.3.0"],\ + ["cz-conventional-changelog", "npm:3.3.0"],\ + ["dedent", "npm:0.7.0"],\ + ["detect-indent", "npm:6.1.0"],\ + ["find-node-modules", "npm:2.1.3"],\ + ["find-root", "npm:1.1.0"],\ + ["fs-extra", "npm:9.1.0"],\ + ["glob", "npm:7.2.3"],\ + ["inquirer", "npm:8.2.5"],\ + ["is-utf8", "npm:0.2.1"],\ + ["lodash", "npm:4.17.21"],\ + ["minimist", "npm:1.2.7"],\ + ["strip-bom", "npm:4.0.0"],\ + ["strip-json-comments", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["common-path-prefix", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/common-path-prefix-npm-3.0.0-68b78785c1-09c180e8d8.zip/node_modules/common-path-prefix/",\ + "packageDependencies": [\ + ["common-path-prefix", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["commondir", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/commondir-npm-1.0.1-291b790340-4620bc4936.zip/node_modules/commondir/",\ + "packageDependencies": [\ + ["commondir", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["compare-func", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/compare-func-npm-2.0.0-9cd7852f23-fb71d70632.zip/node_modules/compare-func/",\ + "packageDependencies": [\ + ["compare-func", "npm:2.0.0"],\ + ["array-ify", "npm:1.0.0"],\ + ["dot-prop", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["concat-map", [\ + ["npm:0.0.1", {\ + "packageLocation": "./.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-9680699c8e.zip/node_modules/concat-map/",\ + "packageDependencies": [\ + ["concat-map", "npm:0.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["concat-stream", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/concat-stream-npm-2.0.0-8bb2ad5aa0-250e576d06.zip/node_modules/concat-stream/",\ + "packageDependencies": [\ + ["concat-stream", "npm:2.0.0"],\ + ["buffer-from", "npm:1.1.2"],\ + ["inherits", "npm:2.0.4"],\ + ["readable-stream", "npm:3.6.2"],\ + ["typedarray", "npm:0.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["concordance", [\ + ["npm:5.0.4", {\ + "packageLocation": "./.yarn/cache/concordance-npm-5.0.4-e641405dd9-156bb78674.zip/node_modules/concordance/",\ + "packageDependencies": [\ + ["concordance", "npm:5.0.4"],\ + ["date-time", "npm:3.1.0"],\ + ["esutils", "npm:2.0.3"],\ + ["fast-diff", "npm:1.3.0"],\ + ["js-string-escape", "npm:1.0.1"],\ + ["lodash", "npm:4.17.21"],\ + ["md5-hex", "npm:3.0.1"],\ + ["semver", "npm:7.5.4"],\ + ["well-known-symbols", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["configstore", [\ + ["npm:6.0.0", {\ + "packageLocation": "./.yarn/cache/configstore-npm-6.0.0-410b4e0bf5-81995351c1.zip/node_modules/configstore/",\ + "packageDependencies": [\ + ["configstore", "npm:6.0.0"],\ + ["dot-prop", "npm:6.0.1"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["unique-string", "npm:3.0.0"],\ + ["write-file-atomic", "npm:3.0.3"],\ + ["xdg-basedir", "npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["console-control-strings", [\ + ["npm:1.1.0", {\ + "packageLocation": "./.yarn/cache/console-control-strings-npm-1.1.0-e3160e5275-27b5fa302b.zip/node_modules/console-control-strings/",\ + "packageDependencies": [\ + ["console-control-strings", "npm:1.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["content-disposition", [\ + ["npm:0.5.4", {\ + "packageLocation": "./.yarn/cache/content-disposition-npm-0.5.4-2d93678616-b7f4ce176e.zip/node_modules/content-disposition/",\ + "packageDependencies": [\ + ["content-disposition", "npm:0.5.4"],\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["content-type", [\ + ["npm:1.0.5", {\ + "packageLocation": "./.yarn/cache/content-type-npm-1.0.5-3e037bf9ab-585847d98d.zip/node_modules/content-type/",\ + "packageDependencies": [\ + ["content-type", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog", [\ + ["npm:3.1.25", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-npm-3.1.25-dfc69e696b-27f4651ec7.zip/node_modules/conventional-changelog/",\ + "packageDependencies": [\ + ["conventional-changelog", "npm:3.1.25"],\ + ["conventional-changelog-angular", "npm:5.0.13"],\ + ["conventional-changelog-atom", "npm:2.0.8"],\ + ["conventional-changelog-codemirror", "npm:2.0.8"],\ + ["conventional-changelog-conventionalcommits", "npm:4.6.3"],\ + ["conventional-changelog-core", "npm:4.2.4"],\ + ["conventional-changelog-ember", "npm:2.0.9"],\ + ["conventional-changelog-eslint", "npm:3.0.9"],\ + ["conventional-changelog-express", "npm:2.0.6"],\ + ["conventional-changelog-jquery", "npm:3.0.11"],\ + ["conventional-changelog-jshint", "npm:2.0.9"],\ + ["conventional-changelog-preset-loader", "npm:2.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-angular", [\ + ["npm:5.0.13", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-angular-npm-5.0.13-50e4a302c4-e7ee31ac70.zip/node_modules/conventional-changelog-angular/",\ + "packageDependencies": [\ + ["conventional-changelog-angular", "npm:5.0.13"],\ + ["compare-func", "npm:2.0.0"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-atom", [\ + ["npm:2.0.8", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-atom-npm-2.0.8-ab61571c15-53ae65ef33.zip/node_modules/conventional-changelog-atom/",\ + "packageDependencies": [\ + ["conventional-changelog-atom", "npm:2.0.8"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-codemirror", [\ + ["npm:2.0.8", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-codemirror-npm-2.0.8-342d72f6a3-45183dcb16.zip/node_modules/conventional-changelog-codemirror/",\ + "packageDependencies": [\ + ["conventional-changelog-codemirror", "npm:2.0.8"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-config-spec", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-config-spec-npm-2.1.0-267a163a1a-90b76c6393.zip/node_modules/conventional-changelog-config-spec/",\ + "packageDependencies": [\ + ["conventional-changelog-config-spec", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-conventionalcommits", [\ + ["npm:4.6.3", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-conventionalcommits-npm-4.6.3-8a4923dc62-70b9ba65a7.zip/node_modules/conventional-changelog-conventionalcommits/",\ + "packageDependencies": [\ + ["conventional-changelog-conventionalcommits", "npm:4.6.3"],\ + ["compare-func", "npm:2.0.0"],\ + ["lodash", "npm:4.17.21"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-core", [\ + ["npm:4.2.4", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-core-npm-4.2.4-3507358941-c810498672.zip/node_modules/conventional-changelog-core/",\ + "packageDependencies": [\ + ["conventional-changelog-core", "npm:4.2.4"],\ + ["add-stream", "npm:1.0.0"],\ + ["conventional-changelog-writer", "npm:5.0.1"],\ + ["conventional-commits-parser", "npm:3.2.4"],\ + ["dateformat", "npm:3.0.3"],\ + ["get-pkg-repo", "npm:4.2.1"],\ + ["git-raw-commits", "npm:2.0.11"],\ + ["git-remote-origin-url", "npm:2.0.0"],\ + ["git-semver-tags", "npm:4.1.1"],\ + ["lodash", "npm:4.17.21"],\ + ["normalize-package-data", "npm:3.0.3"],\ + ["q", "npm:1.5.1"],\ + ["read-pkg", "npm:3.0.0"],\ + ["read-pkg-up", "npm:3.0.0"],\ + ["through2", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-ember", [\ + ["npm:2.0.9", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-ember-npm-2.0.9-2276834930-87faf42230.zip/node_modules/conventional-changelog-ember/",\ + "packageDependencies": [\ + ["conventional-changelog-ember", "npm:2.0.9"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-eslint", [\ + ["npm:3.0.9", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-eslint-npm-3.0.9-62c523a901-f12f82adae.zip/node_modules/conventional-changelog-eslint/",\ + "packageDependencies": [\ + ["conventional-changelog-eslint", "npm:3.0.9"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-express", [\ + ["npm:2.0.6", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-express-npm-2.0.6-8a37ff0369-08db048159.zip/node_modules/conventional-changelog-express/",\ + "packageDependencies": [\ + ["conventional-changelog-express", "npm:2.0.6"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-jquery", [\ + ["npm:3.0.11", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-jquery-npm-3.0.11-d4ff10c6e2-18720ee267.zip/node_modules/conventional-changelog-jquery/",\ + "packageDependencies": [\ + ["conventional-changelog-jquery", "npm:3.0.11"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-jshint", [\ + ["npm:2.0.9", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-jshint-npm-2.0.9-ef6b791bee-42e16d0e41.zip/node_modules/conventional-changelog-jshint/",\ + "packageDependencies": [\ + ["conventional-changelog-jshint", "npm:2.0.9"],\ + ["compare-func", "npm:2.0.0"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-preset-loader", [\ + ["npm:2.3.4", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-preset-loader-npm-2.3.4-a907f2e49a-23a889b7fc.zip/node_modules/conventional-changelog-preset-loader/",\ + "packageDependencies": [\ + ["conventional-changelog-preset-loader", "npm:2.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-writer", [\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/conventional-changelog-writer-npm-5.0.1-c7d8f4132f-09703c3fce.zip/node_modules/conventional-changelog-writer/",\ + "packageDependencies": [\ + ["conventional-changelog-writer", "npm:5.0.1"],\ + ["conventional-commits-filter", "npm:2.0.7"],\ + ["dateformat", "npm:3.0.3"],\ + ["handlebars", "npm:4.7.8"],\ + ["json-stringify-safe", "npm:5.0.1"],\ + ["lodash", "npm:4.17.21"],\ + ["meow", "npm:8.1.2"],\ + ["semver", "npm:6.3.1"],\ + ["split", "npm:1.0.1"],\ + ["through2", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-commit-types", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/conventional-commit-types-npm-3.0.0-e12e37c124-1c6d9b9693.zip/node_modules/conventional-commit-types/",\ + "packageDependencies": [\ + ["conventional-commit-types", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-commits-filter", [\ + ["npm:2.0.7", {\ + "packageLocation": "./.yarn/cache/conventional-commits-filter-npm-2.0.7-8762ee3bfa-c7e25df941.zip/node_modules/conventional-commits-filter/",\ + "packageDependencies": [\ + ["conventional-commits-filter", "npm:2.0.7"],\ + ["lodash.ismatch", "npm:4.4.0"],\ + ["modify-values", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-commits-parser", [\ + ["npm:3.2.4", {\ + "packageLocation": "./.yarn/cache/conventional-commits-parser-npm-3.2.4-d1ebb48cf6-2f9d31bade.zip/node_modules/conventional-commits-parser/",\ + "packageDependencies": [\ + ["conventional-commits-parser", "npm:3.2.4"],\ + ["JSONStream", "npm:1.3.5"],\ + ["is-text-path", "npm:1.0.1"],\ + ["lodash", "npm:4.17.21"],\ + ["meow", "npm:8.1.2"],\ + ["split2", "npm:3.2.2"],\ + ["through2", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-recommended-bump", [\ + ["npm:6.1.0", {\ + "packageLocation": "./.yarn/cache/conventional-recommended-bump-npm-6.1.0-18a6db0ce9-5561a4163e.zip/node_modules/conventional-recommended-bump/",\ + "packageDependencies": [\ + ["conventional-recommended-bump", "npm:6.1.0"],\ + ["concat-stream", "npm:2.0.0"],\ + ["conventional-changelog-preset-loader", "npm:2.3.4"],\ + ["conventional-commits-filter", "npm:2.0.7"],\ + ["conventional-commits-parser", "npm:3.2.4"],\ + ["git-raw-commits", "npm:2.0.11"],\ + ["git-semver-tags", "npm:4.1.1"],\ + ["meow", "npm:8.1.2"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["convert-source-map", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/convert-source-map-npm-2.0.0-7ab664dc4e-c987be3ec0.zip/node_modules/convert-source-map/",\ + "packageDependencies": [\ + ["convert-source-map", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["convert-to-spaces", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/convert-to-spaces-npm-2.0.1-c08fae1ac6-bbb324e591.zip/node_modules/convert-to-spaces/",\ + "packageDependencies": [\ + ["convert-to-spaces", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cookie", [\ + ["npm:0.5.0", {\ + "packageLocation": "./.yarn/cache/cookie-npm-0.5.0-e2d58a161a-aae7911ddc.zip/node_modules/cookie/",\ + "packageDependencies": [\ + ["cookie", "npm:0.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cookie-signature", [\ + ["npm:1.0.6", {\ + "packageLocation": "./.yarn/cache/cookie-signature-npm-1.0.6-93f325f7f0-f4e1b0a98a.zip/node_modules/cookie-signature/",\ + "packageDependencies": [\ + ["cookie-signature", "npm:1.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["core-util-is", [\ + ["npm:1.0.3", {\ + "packageLocation": "./.yarn/cache/core-util-is-npm-1.0.3-ca74b76c90-9de8597363.zip/node_modules/core-util-is/",\ + "packageDependencies": [\ + ["core-util-is", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cosmiconfig", [\ + ["npm:8.3.6", {\ + "packageLocation": "./.yarn/cache/cosmiconfig-npm-8.3.6-a5566e2779-91d082baca.zip/node_modules/cosmiconfig/",\ + "packageDependencies": [\ + ["cosmiconfig", "npm:8.3.6"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:8.3.6", {\ + "packageLocation": "./.yarn/__virtual__/cosmiconfig-virtual-3ff344a29a/0/cache/cosmiconfig-npm-8.3.6-a5566e2779-91d082baca.zip/node_modules/cosmiconfig/",\ + "packageDependencies": [\ + ["cosmiconfig", "virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:8.3.6"],\ + ["@types/typescript", null],\ + ["import-fresh", "npm:3.3.0"],\ + ["js-yaml", "npm:4.1.0"],\ + ["parse-json", "npm:5.2.0"],\ + ["path-type", "npm:4.0.0"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cosmiconfig-typescript-loader", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/cosmiconfig-typescript-loader-npm-5.0.0-6462903b70-ccbb367fe9.zip/node_modules/cosmiconfig-typescript-loader/",\ + "packageDependencies": [\ + ["cosmiconfig-typescript-loader", "npm:5.0.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:5.0.0", {\ + "packageLocation": "./.yarn/__virtual__/cosmiconfig-typescript-loader-virtual-99d7da4445/0/cache/cosmiconfig-typescript-loader-npm-5.0.0-6462903b70-ccbb367fe9.zip/node_modules/cosmiconfig-typescript-loader/",\ + "packageDependencies": [\ + ["cosmiconfig-typescript-loader", "virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:5.0.0"],\ + ["@types/cosmiconfig", null],\ + ["@types/node", null],\ + ["@types/typescript", null],\ + ["cosmiconfig", "virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:8.3.6"],\ + ["jiti", "npm:1.21.0"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/cosmiconfig",\ + "@types/node",\ + "@types/typescript",\ + "cosmiconfig",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cp-file", [\ + ["npm:10.0.0", {\ + "packageLocation": "./.yarn/cache/cp-file-npm-10.0.0-2641285fb1-9b2432e35f.zip/node_modules/cp-file/",\ + "packageDependencies": [\ + ["cp-file", "npm:10.0.0"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["nested-error-stacks", "npm:2.1.1"],\ + ["p-event", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cpy", [\ + ["npm:10.1.0", {\ + "packageLocation": "./.yarn/cache/cpy-npm-10.1.0-4e4f5d40c2-39da11b58b.zip/node_modules/cpy/",\ + "packageDependencies": [\ + ["cpy", "npm:10.1.0"],\ + ["arrify", "npm:3.0.0"],\ + ["cp-file", "npm:10.0.0"],\ + ["globby", "npm:13.2.2"],\ + ["junk", "npm:4.0.1"],\ + ["micromatch", "npm:4.0.5"],\ + ["nested-error-stacks", "npm:2.1.1"],\ + ["p-filter", "npm:3.0.0"],\ + ["p-map", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cpy-cli", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/cpy-cli-npm-5.0.0-58ca287fe2-f575e8e802.zip/node_modules/cpy-cli/",\ + "packageDependencies": [\ + ["cpy-cli", "npm:5.0.0"],\ + ["cpy", "npm:10.1.0"],\ + ["meow", "npm:12.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cross-spawn", [\ + ["npm:7.0.3", {\ + "packageLocation": "./.yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-e1a13869d2.zip/node_modules/cross-spawn/",\ + "packageDependencies": [\ + ["cross-spawn", "npm:7.0.3"],\ + ["path-key", "npm:3.1.1"],\ + ["shebang-command", "npm:2.0.0"],\ + ["which", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["crypto-random-string", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/crypto-random-string-npm-4.0.0-b9f0f76168-cd5d7ae138.zip/node_modules/crypto-random-string/",\ + "packageDependencies": [\ + ["crypto-random-string", "npm:4.0.0"],\ + ["type-fest", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/cspell-npm-8.3.2-d3d68133fb-fc5e243ff4.zip/node_modules/cspell/",\ + "packageDependencies": [\ + ["cspell", "npm:8.3.2"],\ + ["@cspell/cspell-json-reporter", "npm:8.3.2"],\ + ["@cspell/cspell-pipe", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"],\ + ["@cspell/dynamic-import", "npm:8.3.2"],\ + ["chalk", "npm:5.3.0"],\ + ["chalk-template", "npm:1.1.0"],\ + ["commander", "npm:11.1.0"],\ + ["cspell-gitignore", "npm:8.3.2"],\ + ["cspell-glob", "npm:8.3.2"],\ + ["cspell-io", "npm:8.3.2"],\ + ["cspell-lib", "npm:8.3.2"],\ + ["fast-glob", "npm:3.3.2"],\ + ["fast-json-stable-stringify", "npm:2.1.0"],\ + ["file-entry-cache", "npm:8.0.0"],\ + ["get-stdin", "npm:9.0.0"],\ + ["semver", "npm:7.5.4"],\ + ["strip-ansi", "npm:7.1.0"],\ + ["vscode-uri", "npm:3.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-config-lib", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/cspell-config-lib-npm-8.3.2-23aa0ed7a8-7d5563c2a4.zip/node_modules/cspell-config-lib/",\ + "packageDependencies": [\ + ["cspell-config-lib", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"],\ + ["comment-json", "npm:4.2.3"],\ + ["yaml", "npm:2.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-dictionary", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/cspell-dictionary-npm-8.3.2-dcbcc7f44d-a1135e5245.zip/node_modules/cspell-dictionary/",\ + "packageDependencies": [\ + ["cspell-dictionary", "npm:8.3.2"],\ + ["@cspell/cspell-pipe", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"],\ + ["cspell-trie-lib", "npm:8.3.2"],\ + ["fast-equals", "npm:5.0.1"],\ + ["gensequence", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-gitignore", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/cspell-gitignore-npm-8.3.2-fac35a0208-bc9eed57f9.zip/node_modules/cspell-gitignore/",\ + "packageDependencies": [\ + ["cspell-gitignore", "npm:8.3.2"],\ + ["cspell-glob", "npm:8.3.2"],\ + ["find-up-simple", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-glob", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/cspell-glob-npm-8.3.2-c098bc7796-99e666f232.zip/node_modules/cspell-glob/",\ + "packageDependencies": [\ + ["cspell-glob", "npm:8.3.2"],\ + ["micromatch", "npm:4.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-grammar", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/cspell-grammar-npm-8.3.2-ab7ffca829-296f72bad3.zip/node_modules/cspell-grammar/",\ + "packageDependencies": [\ + ["cspell-grammar", "npm:8.3.2"],\ + ["@cspell/cspell-pipe", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-io", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/cspell-io-npm-8.3.2-ede9d006d1-08310b96e7.zip/node_modules/cspell-io/",\ + "packageDependencies": [\ + ["cspell-io", "npm:8.3.2"],\ + ["@cspell/cspell-service-bus", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-lib", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/cspell-lib-npm-8.3.2-bd9a169a49-24b938911b.zip/node_modules/cspell-lib/",\ + "packageDependencies": [\ + ["cspell-lib", "npm:8.3.2"],\ + ["@cspell/cspell-bundled-dicts", "npm:8.3.2"],\ + ["@cspell/cspell-pipe", "npm:8.3.2"],\ + ["@cspell/cspell-resolver", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"],\ + ["@cspell/dynamic-import", "npm:8.3.2"],\ + ["@cspell/strong-weak-map", "npm:8.3.2"],\ + ["clear-module", "npm:4.1.2"],\ + ["comment-json", "npm:4.2.3"],\ + ["configstore", "npm:6.0.0"],\ + ["cspell-config-lib", "npm:8.3.2"],\ + ["cspell-dictionary", "npm:8.3.2"],\ + ["cspell-glob", "npm:8.3.2"],\ + ["cspell-grammar", "npm:8.3.2"],\ + ["cspell-io", "npm:8.3.2"],\ + ["cspell-trie-lib", "npm:8.3.2"],\ + ["fast-equals", "npm:5.0.1"],\ + ["gensequence", "npm:6.0.0"],\ + ["import-fresh", "npm:3.3.0"],\ + ["resolve-from", "npm:5.0.0"],\ + ["vscode-languageserver-textdocument", "npm:1.0.11"],\ + ["vscode-uri", "npm:3.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-trie-lib", [\ + ["npm:8.3.2", {\ + "packageLocation": "./.yarn/cache/cspell-trie-lib-npm-8.3.2-960ea676e2-5653183024.zip/node_modules/cspell-trie-lib/",\ + "packageDependencies": [\ + ["cspell-trie-lib", "npm:8.3.2"],\ + ["@cspell/cspell-pipe", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"],\ + ["gensequence", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["currently-unhandled", [\ + ["npm:0.4.1", {\ + "packageLocation": "./.yarn/cache/currently-unhandled-npm-0.4.1-38eddab665-53fb803e58.zip/node_modules/currently-unhandled/",\ + "packageDependencies": [\ + ["currently-unhandled", "npm:0.4.1"],\ + ["array-find-index", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cz-conventional-changelog", [\ + ["npm:3.3.0", {\ + "packageLocation": "./.yarn/cache/cz-conventional-changelog-npm-3.3.0-46c1d2629a-790c201a7f.zip/node_modules/cz-conventional-changelog/",\ + "packageDependencies": [\ + ["cz-conventional-changelog", "npm:3.3.0"],\ + ["@commitlint/load", "npm:18.4.4"],\ + ["chalk", "npm:2.4.2"],\ + ["commitizen", "npm:4.3.0"],\ + ["conventional-commit-types", "npm:3.0.0"],\ + ["lodash.map", "npm:4.6.0"],\ + ["longest", "npm:2.0.1"],\ + ["word-wrap", "npm:1.2.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dargs", [\ + ["npm:7.0.0", {\ + "packageLocation": "./.yarn/cache/dargs-npm-7.0.0-62701e0c7a-b8f1e3cba5.zip/node_modules/dargs/",\ + "packageDependencies": [\ + ["dargs", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["date-time", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/date-time-npm-3.1.0-50f6af7aef-f9cfcd1b15.zip/node_modules/date-time/",\ + "packageDependencies": [\ + ["date-time", "npm:3.1.0"],\ + ["time-zone", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dateformat", [\ + ["npm:3.0.3", {\ + "packageLocation": "./.yarn/cache/dateformat-npm-3.0.3-ed02e5ddbd-0504baf50c.zip/node_modules/dateformat/",\ + "packageDependencies": [\ + ["dateformat", "npm:3.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["debug", [\ + ["npm:2.6.9", {\ + "packageLocation": "./.yarn/cache/debug-npm-2.6.9-7d4cb597dc-e07005f2b4.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "npm:2.6.9"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["npm:3.2.7", {\ + "packageLocation": "./.yarn/cache/debug-npm-3.2.7-754e818c7a-d86fd7be2b.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "npm:3.2.7"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["npm:4.3.4", {\ + "packageLocation": "./.yarn/cache/debug-npm-4.3.4-4513954577-0073c3bcbd.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "npm:4.3.4"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7", {\ + "packageLocation": "./.yarn/__virtual__/debug-virtual-d2345003b7/0/cache/debug-npm-3.2.7-754e818c7a-d86fd7be2b.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7"],\ + ["@types/supports-color", null],\ + ["ms", "npm:2.1.3"],\ + ["supports-color", null]\ + ],\ + "packagePeers": [\ + "@types/supports-color",\ + "supports-color"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9", {\ + "packageLocation": "./.yarn/__virtual__/debug-virtual-73072f5d24/0/cache/debug-npm-2.6.9-7d4cb597dc-e07005f2b4.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9"],\ + ["@types/supports-color", null],\ + ["ms", "npm:2.0.0"],\ + ["supports-color", null]\ + ],\ + "packagePeers": [\ + "@types/supports-color",\ + "supports-color"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4", {\ + "packageLocation": "./.yarn/__virtual__/debug-virtual-ede24543b9/0/cache/debug-npm-4.3.4-4513954577-0073c3bcbd.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["@types/supports-color", null],\ + ["ms", "npm:2.1.2"],\ + ["supports-color", null]\ + ],\ + "packagePeers": [\ + "@types/supports-color",\ + "supports-color"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["decamelize", [\ + ["npm:1.2.0", {\ + "packageLocation": "./.yarn/cache/decamelize-npm-1.2.0-c5a2fdc622-ad8c51a7e7.zip/node_modules/decamelize/",\ + "packageDependencies": [\ + ["decamelize", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["decamelize-keys", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/decamelize-keys-npm-1.1.1-4cfa36ed4b-71d5898174.zip/node_modules/decamelize-keys/",\ + "packageDependencies": [\ + ["decamelize-keys", "npm:1.1.1"],\ + ["decamelize", "npm:1.2.0"],\ + ["map-obj", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dedent", [\ + ["npm:0.7.0", {\ + "packageLocation": "./.yarn/cache/dedent-npm-0.7.0-2dbb45a4c5-87de191050.zip/node_modules/dedent/",\ + "packageDependencies": [\ + ["dedent", "npm:0.7.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["deep-extend", [\ + ["npm:0.6.0", {\ + "packageLocation": "./.yarn/cache/deep-extend-npm-0.6.0-e182924219-7be7e5a8d4.zip/node_modules/deep-extend/",\ + "packageDependencies": [\ + ["deep-extend", "npm:0.6.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["deep-is", [\ + ["npm:0.1.4", {\ + "packageLocation": "./.yarn/cache/deep-is-npm-0.1.4-88938b5a67-ec12d074ae.zip/node_modules/deep-is/",\ + "packageDependencies": [\ + ["deep-is", "npm:0.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["deepmerge", [\ + ["npm:4.3.1", {\ + "packageLocation": "./.yarn/cache/deepmerge-npm-4.3.1-4f751a0844-058d9e1b0f.zip/node_modules/deepmerge/",\ + "packageDependencies": [\ + ["deepmerge", "npm:4.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["deepmerge-ts", [\ + ["npm:5.1.0", {\ + "packageLocation": "./.yarn/cache/deepmerge-ts-npm-5.1.0-f2ee394fd9-0f615ccfb2.zip/node_modules/deepmerge-ts/",\ + "packageDependencies": [\ + ["deepmerge-ts", "npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["default-browser", [\ + ["npm:5.2.1", {\ + "packageLocation": "./.yarn/cache/default-browser-npm-5.2.1-e2f8bca718-afab7eff7b.zip/node_modules/default-browser/",\ + "packageDependencies": [\ + ["default-browser", "npm:5.2.1"],\ + ["bundle-name", "npm:4.1.0"],\ + ["default-browser-id", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["default-browser-id", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/default-browser-id-npm-5.0.0-41fa64d5bb-185bfaecec.zip/node_modules/default-browser-id/",\ + "packageDependencies": [\ + ["default-browser-id", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["defaults", [\ + ["npm:1.0.4", {\ + "packageLocation": "./.yarn/cache/defaults-npm-1.0.4-f3fbaf2528-3a88b7a587.zip/node_modules/defaults/",\ + "packageDependencies": [\ + ["defaults", "npm:1.0.4"],\ + ["clone", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["define-data-property", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/define-data-property-npm-1.1.1-2b5156d112-5573c8df96.zip/node_modules/define-data-property/",\ + "packageDependencies": [\ + ["define-data-property", "npm:1.1.1"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["gopd", "npm:1.0.1"],\ + ["has-property-descriptors", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["define-lazy-prop", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/define-lazy-prop-npm-3.0.0-6bb0fc1510-f28421cf9e.zip/node_modules/define-lazy-prop/",\ + "packageDependencies": [\ + ["define-lazy-prop", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["define-properties", [\ + ["npm:1.2.1", {\ + "packageLocation": "./.yarn/cache/define-properties-npm-1.2.1-8a4d42413b-b4ccd00597.zip/node_modules/define-properties/",\ + "packageDependencies": [\ + ["define-properties", "npm:1.2.1"],\ + ["define-data-property", "npm:1.1.1"],\ + ["has-property-descriptors", "npm:1.0.1"],\ + ["object-keys", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["delegates", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/delegates-npm-1.0.0-9b1942d75f-a51744d9b5.zip/node_modules/delegates/",\ + "packageDependencies": [\ + ["delegates", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["depd", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/depd-npm-2.0.0-b6c51a4b43-c0c8ff3607.zip/node_modules/depd/",\ + "packageDependencies": [\ + ["depd", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dependency-tree", [\ + ["npm:9.0.0", {\ + "packageLocation": "./.yarn/cache/dependency-tree-npm-9.0.0-adb20d5fab-7ffc6009bf.zip/node_modules/dependency-tree/",\ + "packageDependencies": [\ + ["dependency-tree", "npm:9.0.0"],\ + ["commander", "npm:2.20.3"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["filing-cabinet", "npm:3.3.1"],\ + ["precinct", "npm:9.2.1"],\ + ["typescript", "patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["destroy", [\ + ["npm:1.2.0", {\ + "packageLocation": "./.yarn/cache/destroy-npm-1.2.0-6a511802e2-0acb300b74.zip/node_modules/destroy/",\ + "packageDependencies": [\ + ["destroy", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detect-file", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/detect-file-npm-1.0.0-a22ca7c5b6-1861e41461.zip/node_modules/detect-file/",\ + "packageDependencies": [\ + ["detect-file", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detect-indent", [\ + ["npm:6.1.0", {\ + "packageLocation": "./.yarn/cache/detect-indent-npm-6.1.0-d8c441ff7a-ab953a73c7.zip/node_modules/detect-indent/",\ + "packageDependencies": [\ + ["detect-indent", "npm:6.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detect-libc", [\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/detect-libc-npm-2.0.2-03afa59137-6118f30c0c.zip/node_modules/detect-libc/",\ + "packageDependencies": [\ + ["detect-libc", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detect-newline", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/detect-newline-npm-3.1.0-6d33fa8d37-ae6cd429c4.zip/node_modules/detect-newline/",\ + "packageDependencies": [\ + ["detect-newline", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-amd", [\ + ["npm:3.1.2", {\ + "packageLocation": "./.yarn/cache/detective-amd-npm-3.1.2-e4c385792e-0b71555eda.zip/node_modules/detective-amd/",\ + "packageDependencies": [\ + ["detective-amd", "npm:3.1.2"],\ + ["ast-module-types", "npm:3.0.0"],\ + ["escodegen", "npm:2.1.0"],\ + ["get-amd-module-type", "npm:3.0.2"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.2.0", {\ + "packageLocation": "./.yarn/cache/detective-amd-npm-4.2.0-ab3ac7d60a-c1e829a320.zip/node_modules/detective-amd/",\ + "packageDependencies": [\ + ["detective-amd", "npm:4.2.0"],\ + ["ast-module-types", "npm:4.0.0"],\ + ["escodegen", "npm:2.1.0"],\ + ["get-amd-module-type", "npm:4.1.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-cjs", [\ + ["npm:3.1.3", {\ + "packageLocation": "./.yarn/cache/detective-cjs-npm-3.1.3-61080007aa-a691cb4afb.zip/node_modules/detective-cjs/",\ + "packageDependencies": [\ + ["detective-cjs", "npm:3.1.3"],\ + ["ast-module-types", "npm:3.0.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/detective-cjs-npm-4.1.0-0d445263e2-17e4018395.zip/node_modules/detective-cjs/",\ + "packageDependencies": [\ + ["detective-cjs", "npm:4.1.0"],\ + ["ast-module-types", "npm:4.0.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-es6", [\ + ["npm:2.2.2", {\ + "packageLocation": "./.yarn/cache/detective-es6-npm-2.2.2-99504d5c48-9ee9909c08.zip/node_modules/detective-es6/",\ + "packageDependencies": [\ + ["detective-es6", "npm:2.2.2"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/detective-es6-npm-3.0.1-23dcfc7269-881a0c16b4.zip/node_modules/detective-es6/",\ + "packageDependencies": [\ + ["detective-es6", "npm:3.0.1"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-less", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/detective-less-npm-1.0.2-51713fb487-858936fbad.zip/node_modules/detective-less/",\ + "packageDependencies": [\ + ["detective-less", "npm:1.0.2"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["gonzales-pe", "npm:4.3.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-postcss", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/detective-postcss-npm-4.0.0-3898e15a71-9bd5d35554.zip/node_modules/detective-postcss/",\ + "packageDependencies": [\ + ["detective-postcss", "npm:4.0.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["is-url", "npm:1.2.4"],\ + ["postcss", "npm:8.4.33"],\ + ["postcss-values-parser", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.1.3", {\ + "packageLocation": "./.yarn/cache/detective-postcss-npm-6.1.3-23a358a5ec-ee6e07fed2.zip/node_modules/detective-postcss/",\ + "packageDependencies": [\ + ["detective-postcss", "npm:6.1.3"],\ + ["is-url", "npm:1.2.4"],\ + ["postcss", "npm:8.4.33"],\ + ["postcss-values-parser", "virtual:23a358a5ecd6ab3181f7fc99cb0bf6fd4a0734b6e0a2eae05968d1aee7473261ac87704c1b5ed9c912b3faaebe60dd7819a21b2732f3649be486506b370c4c7e#npm:6.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-sass", [\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/cache/detective-sass-npm-3.0.2-6ad220e065-7489e5ae7d.zip/node_modules/detective-sass/",\ + "packageDependencies": [\ + ["detective-sass", "npm:3.0.2"],\ + ["gonzales-pe", "npm:4.3.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.3", {\ + "packageLocation": "./.yarn/cache/detective-sass-npm-4.1.3-395275827c-91681e9003.zip/node_modules/detective-sass/",\ + "packageDependencies": [\ + ["detective-sass", "npm:4.1.3"],\ + ["gonzales-pe", "npm:4.3.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-scss", [\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/detective-scss-npm-2.0.2-ec5d066304-515ff1b894.zip/node_modules/detective-scss/",\ + "packageDependencies": [\ + ["detective-scss", "npm:2.0.2"],\ + ["gonzales-pe", "npm:4.3.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.1.1", {\ + "packageLocation": "./.yarn/cache/detective-scss-npm-3.1.1-52275ee032-3d9c046821.zip/node_modules/detective-scss/",\ + "packageDependencies": [\ + ["detective-scss", "npm:3.1.1"],\ + ["gonzales-pe", "npm:4.3.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-stylus", [\ + ["npm:1.0.3", {\ + "packageLocation": "./.yarn/cache/detective-stylus-npm-1.0.3-e1fc341ca5-2723da9354.zip/node_modules/detective-stylus/",\ + "packageDependencies": [\ + ["detective-stylus", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/detective-stylus-npm-2.0.1-6700998788-c701ba6df3.zip/node_modules/detective-stylus/",\ + "packageDependencies": [\ + ["detective-stylus", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/detective-stylus-npm-3.0.0-7d99db3d7a-e82eda4904.zip/node_modules/detective-stylus/",\ + "packageDependencies": [\ + ["detective-stylus", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-typescript", [\ + ["npm:7.0.2", {\ + "packageLocation": "./.yarn/cache/detective-typescript-npm-7.0.2-aa734fe591-77703410ba.zip/node_modules/detective-typescript/",\ + "packageDependencies": [\ + ["detective-typescript", "npm:7.0.2"],\ + ["@typescript-eslint/typescript-estree", "virtual:aa734fe5910ab2043ff5b76d2c49e3a3aff381cfe805800a92c03671e0b66da8ec7f2fc8ded6c6952cec7a57f0f439fa45d51213f03f478f98eb208ccfd5b76b#npm:4.33.0"],\ + ["ast-module-types", "npm:2.7.1"],\ + ["node-source-walk", "npm:4.3.0"],\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:9.1.1", {\ + "packageLocation": "./.yarn/cache/detective-typescript-npm-9.1.1-7acec9484f-5f50801f62.zip/node_modules/detective-typescript/",\ + "packageDependencies": [\ + ["detective-typescript", "npm:9.1.1"],\ + ["@typescript-eslint/typescript-estree", "virtual:7acec9484f01c68f8aa5f9931e6ffc696653513b41af7f3d08663c42ada1d00ee091c13e0780af9dcf735ec8a6e052660a87dc109342f3525583cf5ed4b2167b#npm:5.62.0"],\ + ["ast-module-types", "npm:4.0.0"],\ + ["node-source-walk", "npm:5.0.2"],\ + ["typescript", "patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dir-glob", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/dir-glob-npm-3.0.1-1aea628b1b-fa05e18324.zip/node_modules/dir-glob/",\ + "packageDependencies": [\ + ["dir-glob", "npm:3.0.1"],\ + ["path-type", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["doctrine", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/doctrine-npm-2.1.0-ac15d049b7-555684f77e.zip/node_modules/doctrine/",\ + "packageDependencies": [\ + ["doctrine", "npm:2.1.0"],\ + ["esutils", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/doctrine-npm-3.0.0-c6f1615f04-b4b28f1df5.zip/node_modules/doctrine/",\ + "packageDependencies": [\ + ["doctrine", "npm:3.0.0"],\ + ["esutils", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dot-prop", [\ + ["npm:5.3.0", {\ + "packageLocation": "./.yarn/cache/dot-prop-npm-5.3.0-7bf6ee1eb8-33b2561617.zip/node_modules/dot-prop/",\ + "packageDependencies": [\ + ["dot-prop", "npm:5.3.0"],\ + ["is-obj", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.1", {\ + "packageLocation": "./.yarn/cache/dot-prop-npm-6.0.1-de66211710-1200a4f6f8.zip/node_modules/dot-prop/",\ + "packageDependencies": [\ + ["dot-prop", "npm:6.0.1"],\ + ["is-obj", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dotgitignore", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/dotgitignore-npm-2.1.0-fe0dd60e0e-84b00ad4d3.zip/node_modules/dotgitignore/",\ + "packageDependencies": [\ + ["dotgitignore", "npm:2.1.0"],\ + ["find-up", "npm:3.0.0"],\ + ["minimatch", "npm:3.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eastasianwidth", [\ + ["npm:0.2.0", {\ + "packageLocation": "./.yarn/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-9b1d3e1bae.zip/node_modules/eastasianwidth/",\ + "packageDependencies": [\ + ["eastasianwidth", "npm:0.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ecurve", [\ + ["npm:1.0.6", {\ + "packageLocation": "./.yarn/cache/ecurve-npm-1.0.6-002f57f49a-5f738e564a.zip/node_modules/ecurve/",\ + "packageDependencies": [\ + ["ecurve", "npm:1.0.6"],\ + ["bigi", "npm:1.4.2"],\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ee-first", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/ee-first-npm-1.1.1-33f8535b39-1b4cac778d.zip/node_modules/ee-first/",\ + "packageDependencies": [\ + ["ee-first", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["elliptic", [\ + ["npm:6.5.4", {\ + "packageLocation": "./.yarn/cache/elliptic-npm-6.5.4-0ca8204a86-2cd7ff4b69.zip/node_modules/elliptic/",\ + "packageDependencies": [\ + ["elliptic", "npm:6.5.4"],\ + ["bn.js", "npm:4.12.0"],\ + ["brorand", "npm:1.1.0"],\ + ["hash.js", "npm:1.1.7"],\ + ["hmac-drbg", "npm:1.0.1"],\ + ["inherits", "npm:2.0.4"],\ + ["minimalistic-assert", "npm:1.0.1"],\ + ["minimalistic-crypto-utils", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["emittery", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/emittery-npm-1.0.1-3e4e6ba9b5-65dacfa022.zip/node_modules/emittery/",\ + "packageDependencies": [\ + ["emittery", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["emoji-regex", [\ + ["npm:10.3.0", {\ + "packageLocation": "./.yarn/cache/emoji-regex-npm-10.3.0-0c9fc2ef7f-b9b084ebe9.zip/node_modules/emoji-regex/",\ + "packageDependencies": [\ + ["emoji-regex", "npm:10.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.0.0", {\ + "packageLocation": "./.yarn/cache/emoji-regex-npm-8.0.0-213764015c-c72d67a682.zip/node_modules/emoji-regex/",\ + "packageDependencies": [\ + ["emoji-regex", "npm:8.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:9.2.2", {\ + "packageLocation": "./.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-915acf859c.zip/node_modules/emoji-regex/",\ + "packageDependencies": [\ + ["emoji-regex", "npm:9.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["encodeurl", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/encodeurl-npm-1.0.2-f8c8454c41-e50e3d508c.zip/node_modules/encodeurl/",\ + "packageDependencies": [\ + ["encodeurl", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["encoding", [\ + ["npm:0.1.13", {\ + "packageLocation": "./.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip/node_modules/encoding/",\ + "packageDependencies": [\ + ["encoding", "npm:0.1.13"],\ + ["iconv-lite", "npm:0.6.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["enhanced-resolve", [\ + ["npm:5.15.0", {\ + "packageLocation": "./.yarn/cache/enhanced-resolve-npm-5.15.0-16eb7ddef9-180c3f2706.zip/node_modules/enhanced-resolve/",\ + "packageDependencies": [\ + ["enhanced-resolve", "npm:5.15.0"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["tapable", "npm:2.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["env-paths", [\ + ["npm:2.2.1", {\ + "packageLocation": "./.yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip/node_modules/env-paths/",\ + "packageDependencies": [\ + ["env-paths", "npm:2.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["err-code", [\ + ["npm:2.0.3", {\ + "packageLocation": "./.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-1d20d825cd.zip/node_modules/err-code/",\ + "packageDependencies": [\ + ["err-code", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["error-ex", [\ + ["npm:1.3.2", {\ + "packageLocation": "./.yarn/cache/error-ex-npm-1.3.2-5654f80c0f-d547740aa2.zip/node_modules/error-ex/",\ + "packageDependencies": [\ + ["error-ex", "npm:1.3.2"],\ + ["is-arrayish", "npm:0.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["es-abstract", [\ + ["npm:1.22.3", {\ + "packageLocation": "./.yarn/cache/es-abstract-npm-1.22.3-15a58832e5-e1ea9738ec.zip/node_modules/es-abstract/",\ + "packageDependencies": [\ + ["es-abstract", "npm:1.22.3"],\ + ["array-buffer-byte-length", "npm:1.0.0"],\ + ["arraybuffer.prototype.slice", "npm:1.0.2"],\ + ["available-typed-arrays", "npm:1.0.5"],\ + ["call-bind", "npm:1.0.5"],\ + ["es-set-tostringtag", "npm:2.0.2"],\ + ["es-to-primitive", "npm:1.2.1"],\ + ["function.prototype.name", "npm:1.1.6"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["get-symbol-description", "npm:1.0.0"],\ + ["globalthis", "npm:1.0.3"],\ + ["gopd", "npm:1.0.1"],\ + ["has-property-descriptors", "npm:1.0.1"],\ + ["has-proto", "npm:1.0.1"],\ + ["has-symbols", "npm:1.0.3"],\ + ["hasown", "npm:2.0.0"],\ + ["internal-slot", "npm:1.0.6"],\ + ["is-array-buffer", "npm:3.0.2"],\ + ["is-callable", "npm:1.2.7"],\ + ["is-negative-zero", "npm:2.0.2"],\ + ["is-regex", "npm:1.1.4"],\ + ["is-shared-array-buffer", "npm:1.0.2"],\ + ["is-string", "npm:1.0.7"],\ + ["is-typed-array", "npm:1.1.12"],\ + ["is-weakref", "npm:1.0.2"],\ + ["object-inspect", "npm:1.13.1"],\ + ["object-keys", "npm:1.1.1"],\ + ["object.assign", "npm:4.1.5"],\ + ["regexp.prototype.flags", "npm:1.5.1"],\ + ["safe-array-concat", "npm:1.0.1"],\ + ["safe-regex-test", "npm:1.0.1"],\ + ["string.prototype.trim", "npm:1.2.8"],\ + ["string.prototype.trimend", "npm:1.0.7"],\ + ["string.prototype.trimstart", "npm:1.0.7"],\ + ["typed-array-buffer", "npm:1.0.0"],\ + ["typed-array-byte-length", "npm:1.0.0"],\ + ["typed-array-byte-offset", "npm:1.0.0"],\ + ["typed-array-length", "npm:1.0.4"],\ + ["unbox-primitive", "npm:1.0.2"],\ + ["which-typed-array", "npm:1.1.13"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["es-set-tostringtag", [\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/es-set-tostringtag-npm-2.0.2-dae5ec6c58-afcec3a4c9.zip/node_modules/es-set-tostringtag/",\ + "packageDependencies": [\ + ["es-set-tostringtag", "npm:2.0.2"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["has-tostringtag", "npm:1.0.0"],\ + ["hasown", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["es-shim-unscopables", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/es-shim-unscopables-npm-1.0.2-a3056a4c0d-6d3bf91f65.zip/node_modules/es-shim-unscopables/",\ + "packageDependencies": [\ + ["es-shim-unscopables", "npm:1.0.2"],\ + ["hasown", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["es-to-primitive", [\ + ["npm:1.2.1", {\ + "packageLocation": "./.yarn/cache/es-to-primitive-npm-1.2.1-b7a7eac6c5-74aeeefe27.zip/node_modules/es-to-primitive/",\ + "packageDependencies": [\ + ["es-to-primitive", "npm:1.2.1"],\ + ["is-callable", "npm:1.2.7"],\ + ["is-date-object", "npm:1.0.5"],\ + ["is-symbol", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["escalade", [\ + ["npm:3.1.1", {\ + "packageLocation": "./.yarn/cache/escalade-npm-3.1.1-e02da076aa-afa618e733.zip/node_modules/escalade/",\ + "packageDependencies": [\ + ["escalade", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["escape-html", [\ + ["npm:1.0.3", {\ + "packageLocation": "./.yarn/cache/escape-html-npm-1.0.3-376c22ee74-6213ca9ae0.zip/node_modules/escape-html/",\ + "packageDependencies": [\ + ["escape-html", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["escape-string-regexp", [\ + ["npm:1.0.5", {\ + "packageLocation": "./.yarn/cache/escape-string-regexp-npm-1.0.5-3284de402f-6092fda75c.zip/node_modules/escape-string-regexp/",\ + "packageDependencies": [\ + ["escape-string-regexp", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/escape-string-regexp-npm-2.0.0-aef69d2a25-9f8a2d5743.zip/node_modules/escape-string-regexp/",\ + "packageDependencies": [\ + ["escape-string-regexp", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/escape-string-regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip/node_modules/escape-string-regexp/",\ + "packageDependencies": [\ + ["escape-string-regexp", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/escape-string-regexp-npm-5.0.0-a663e825ce-20daabe197.zip/node_modules/escape-string-regexp/",\ + "packageDependencies": [\ + ["escape-string-regexp", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["escodegen", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/escodegen-npm-2.1.0-e0bf940745-47719a65b2.zip/node_modules/escodegen/",\ + "packageDependencies": [\ + ["escodegen", "npm:2.1.0"],\ + ["esprima", "npm:4.0.1"],\ + ["estraverse", "npm:5.3.0"],\ + ["esutils", "npm:2.0.3"],\ + ["source-map", "npm:0.6.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint", [\ + ["npm:8.56.0", {\ + "packageLocation": "./.yarn/cache/eslint-npm-8.56.0-6eec398a41-ef6193c6e4.zip/node_modules/eslint/",\ + "packageDependencies": [\ + ["eslint", "npm:8.56.0"],\ + ["@eslint-community/eslint-utils", "virtual:6eec398a4132b5372ea5ffc0bc36d4c81602b7e444a89685d0d958016d8fd53df5c0c97c6a8bf99951469e2c6c06135dd192e9309f6e39b1a4c85e0faabe1f6b#npm:4.4.0"],\ + ["@eslint-community/regexpp", "npm:4.10.0"],\ + ["@eslint/eslintrc", "npm:2.1.4"],\ + ["@eslint/js", "npm:8.56.0"],\ + ["@humanwhocodes/config-array", "npm:0.11.13"],\ + ["@humanwhocodes/module-importer", "npm:1.0.1"],\ + ["@nodelib/fs.walk", "npm:1.2.8"],\ + ["@ungap/structured-clone", "npm:1.2.0"],\ + ["ajv", "npm:6.12.6"],\ + ["chalk", "npm:4.1.2"],\ + ["cross-spawn", "npm:7.0.3"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["doctrine", "npm:3.0.0"],\ + ["escape-string-regexp", "npm:4.0.0"],\ + ["eslint-scope", "npm:7.2.2"],\ + ["eslint-visitor-keys", "npm:3.4.3"],\ + ["espree", "npm:9.6.1"],\ + ["esquery", "npm:1.5.0"],\ + ["esutils", "npm:2.0.3"],\ + ["fast-deep-equal", "npm:3.1.3"],\ + ["file-entry-cache", "npm:6.0.1"],\ + ["find-up", "npm:5.0.0"],\ + ["glob-parent", "npm:6.0.2"],\ + ["globals", "npm:13.24.0"],\ + ["graphemer", "npm:1.4.0"],\ + ["ignore", "npm:5.3.0"],\ + ["imurmurhash", "npm:0.1.4"],\ + ["is-glob", "npm:4.0.3"],\ + ["is-path-inside", "npm:3.0.3"],\ + ["js-yaml", "npm:4.1.0"],\ + ["json-stable-stringify-without-jsonify", "npm:1.0.1"],\ + ["levn", "npm:0.4.1"],\ + ["lodash.merge", "npm:4.6.2"],\ + ["minimatch", "npm:3.1.2"],\ + ["natural-compare", "npm:1.4.0"],\ + ["optionator", "npm:0.9.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["text-table", "npm:0.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-config-bitauth", [\ + ["portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A.", {\ + "packageLocation": "./config/eslint-config-bitauth/",\ + "packageDependencies": [\ + ["eslint-config-bitauth", "portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A."]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A.", {\ + "packageLocation": "./.yarn/__virtual__/eslint-config-bitauth-virtual-7c7cb0727b/1/config/eslint-config-bitauth/",\ + "packageDependencies": [\ + ["eslint-config-bitauth", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A."],\ + ["@types/eslint", null],\ + ["@types/eslint-config-prettier", null],\ + ["@types/eslint-plugin-eslint-comments", null],\ + ["@types/eslint-plugin-functional", null],\ + ["@types/eslint-plugin-import", null],\ + ["@types/eslint-plugin-tsdoc", null],\ + ["@types/typescript", null],\ + ["@types/typescript-eslint__eslint-plugin", null],\ + ["@types/typescript-eslint__parser", null],\ + ["@typescript-eslint/eslint-plugin", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.18.1"],\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["eslint", "npm:8.56.0"],\ + ["eslint-config-prettier", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:9.1.0"],\ + ["eslint-plugin-eslint-comments", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:3.2.0"],\ + ["eslint-plugin-functional", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.0"],\ + ["eslint-plugin-import", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:2.29.1"],\ + ["eslint-plugin-tsdoc", "npm:0.2.17"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/eslint-config-prettier",\ + "@types/eslint-plugin-eslint-comments",\ + "@types/eslint-plugin-functional",\ + "@types/eslint-plugin-import",\ + "@types/eslint-plugin-tsdoc",\ + "@types/eslint",\ + "@types/typescript-eslint__eslint-plugin",\ + "@types/typescript-eslint__parser",\ + "@types/typescript",\ + "@typescript-eslint/eslint-plugin",\ + "@typescript-eslint/parser",\ + "eslint-config-prettier",\ + "eslint-plugin-eslint-comments",\ + "eslint-plugin-functional",\ + "eslint-plugin-import",\ + "eslint-plugin-tsdoc",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ + ["eslint-config-prettier", [\ + ["npm:9.1.0", {\ + "packageLocation": "./.yarn/cache/eslint-config-prettier-npm-9.1.0-0e1fd42d7d-411e3b3b1c.zip/node_modules/eslint-config-prettier/",\ + "packageDependencies": [\ + ["eslint-config-prettier", "npm:9.1.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:9.1.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-config-prettier-virtual-bb000c0ba3/0/cache/eslint-config-prettier-npm-9.1.0-0e1fd42d7d-411e3b3b1c.zip/node_modules/eslint-config-prettier/",\ + "packageDependencies": [\ + ["eslint-config-prettier", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:9.1.0"],\ + ["@types/eslint", null],\ + ["eslint", "npm:8.56.0"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-import-resolver-node", [\ + ["npm:0.3.9", {\ + "packageLocation": "./.yarn/cache/eslint-import-resolver-node-npm-0.3.9-2a426afc4b-d52e08e1d9.zip/node_modules/eslint-import-resolver-node/",\ + "packageDependencies": [\ + ["eslint-import-resolver-node", "npm:0.3.9"],\ + ["debug", "virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7"],\ + ["is-core-module", "npm:2.13.1"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-module-utils", [\ + ["npm:2.8.0", {\ + "packageLocation": "./.yarn/cache/eslint-module-utils-npm-2.8.0-05e42bcab0-a9a7ed93eb.zip/node_modules/eslint-module-utils/",\ + "packageDependencies": [\ + ["eslint-module-utils", "npm:2.8.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:43aa4530715e727e25bba2c4996fd38e8d8ce2d8f6a1d9ee913eb73a1faac7177a5db105bc491396bc6a0d1c246eb19ecc3e90ca0412b3bc3f604ea2ada09079#npm:2.8.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-module-utils-virtual-a41ab9732a/0/cache/eslint-module-utils-npm-2.8.0-05e42bcab0-a9a7ed93eb.zip/node_modules/eslint-module-utils/",\ + "packageDependencies": [\ + ["eslint-module-utils", "virtual:43aa4530715e727e25bba2c4996fd38e8d8ce2d8f6a1d9ee913eb73a1faac7177a5db105bc491396bc6a0d1c246eb19ecc3e90ca0412b3bc3f604ea2ada09079#npm:2.8.0"],\ + ["@types/eslint", null],\ + ["@types/eslint-import-resolver-node", null],\ + ["@types/eslint-import-resolver-typescript", null],\ + ["@types/eslint-import-resolver-webpack", null],\ + ["@types/typescript-eslint__parser", null],\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["debug", "virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7"],\ + ["eslint", "npm:8.56.0"],\ + ["eslint-import-resolver-node", "npm:0.3.9"],\ + ["eslint-import-resolver-typescript", null],\ + ["eslint-import-resolver-webpack", null]\ + ],\ + "packagePeers": [\ + "@types/eslint-import-resolver-node",\ + "@types/eslint-import-resolver-typescript",\ + "@types/eslint-import-resolver-webpack",\ + "@types/eslint",\ + "@types/typescript-eslint__parser",\ + "@typescript-eslint/parser",\ + "eslint-import-resolver-node",\ + "eslint-import-resolver-typescript",\ + "eslint-import-resolver-webpack",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-plugin-eslint-comments", [\ + ["npm:3.2.0", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-eslint-comments-npm-3.2.0-b1dc85dfb2-4aa0d31a78.zip/node_modules/eslint-plugin-eslint-comments/",\ + "packageDependencies": [\ + ["eslint-plugin-eslint-comments", "npm:3.2.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:3.2.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-eslint-comments-virtual-f1ea3fd137/0/cache/eslint-plugin-eslint-comments-npm-3.2.0-b1dc85dfb2-4aa0d31a78.zip/node_modules/eslint-plugin-eslint-comments/",\ + "packageDependencies": [\ + ["eslint-plugin-eslint-comments", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:3.2.0"],\ + ["@types/eslint", null],\ + ["escape-string-regexp", "npm:1.0.5"],\ + ["eslint", "npm:8.56.0"],\ + ["ignore", "npm:5.3.0"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-plugin-functional", [\ + ["npm:6.0.0", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-functional-npm-6.0.0-67c232f937-96e665083a.zip/node_modules/eslint-plugin-functional/",\ + "packageDependencies": [\ + ["eslint-plugin-functional", "npm:6.0.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-functional-virtual-45ee868a16/0/cache/eslint-plugin-functional-npm-6.0.0-67c232f937-96e665083a.zip/node_modules/eslint-plugin-functional/",\ + "packageDependencies": [\ + ["eslint-plugin-functional", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.0"],\ + ["@types/eslint", null],\ + ["@types/typescript", null],\ + ["@typescript-eslint/utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["deepmerge-ts", "npm:5.1.0"],\ + ["escape-string-regexp", "npm:4.0.0"],\ + ["eslint", "npm:8.56.0"],\ + ["is-immutable-type", "virtual:45ee868a16e5e16301bd5a061375b37c4ddadfda3dbc29a60eb33cc602493cb2833fdb5058487addec4d7d2fad1c6defdae2c5ae0c70fd6e7e1433365f3b484b#npm:2.0.1"],\ + ["semver", "npm:7.5.4"],\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-plugin-import", [\ + ["npm:2.29.1", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-import-npm-2.29.1-b94305f7dc-5865f05c38.zip/node_modules/eslint-plugin-import/",\ + "packageDependencies": [\ + ["eslint-plugin-import", "npm:2.29.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:2.29.1", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-import-virtual-43aa453071/0/cache/eslint-plugin-import-npm-2.29.1-b94305f7dc-5865f05c38.zip/node_modules/eslint-plugin-import/",\ + "packageDependencies": [\ + ["eslint-plugin-import", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:2.29.1"],\ + ["@types/eslint", null],\ + ["@types/typescript-eslint__parser", null],\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["array-includes", "npm:3.1.7"],\ + ["array.prototype.findlastindex", "npm:1.2.3"],\ + ["array.prototype.flat", "npm:1.3.2"],\ + ["array.prototype.flatmap", "npm:1.3.2"],\ + ["debug", "virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7"],\ + ["doctrine", "npm:2.1.0"],\ + ["eslint", "npm:8.56.0"],\ + ["eslint-import-resolver-node", "npm:0.3.9"],\ + ["eslint-module-utils", "virtual:43aa4530715e727e25bba2c4996fd38e8d8ce2d8f6a1d9ee913eb73a1faac7177a5db105bc491396bc6a0d1c246eb19ecc3e90ca0412b3bc3f604ea2ada09079#npm:2.8.0"],\ + ["hasown", "npm:2.0.0"],\ + ["is-core-module", "npm:2.13.1"],\ + ["is-glob", "npm:4.0.3"],\ + ["minimatch", "npm:3.1.2"],\ + ["object.fromentries", "npm:2.0.7"],\ + ["object.groupby", "npm:1.0.1"],\ + ["object.values", "npm:1.1.7"],\ + ["semver", "npm:6.3.1"],\ + ["tsconfig-paths", "npm:3.15.0"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript-eslint__parser",\ + "@typescript-eslint/parser",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-plugin-tsdoc", [\ + ["npm:0.2.17", {\ + "packageLocation": "./.yarn/cache/eslint-plugin-tsdoc-npm-0.2.17-a48e3f007d-b2b3a1517a.zip/node_modules/eslint-plugin-tsdoc/",\ + "packageDependencies": [\ + ["eslint-plugin-tsdoc", "npm:0.2.17"],\ + ["@microsoft/tsdoc", "npm:0.14.2"],\ + ["@microsoft/tsdoc-config", "npm:0.16.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-scope", [\ + ["npm:7.2.2", {\ + "packageLocation": "./.yarn/cache/eslint-scope-npm-7.2.2-53cb0df8e8-5c660fb905.zip/node_modules/eslint-scope/",\ + "packageDependencies": [\ + ["eslint-scope", "npm:7.2.2"],\ + ["esrecurse", "npm:4.3.0"],\ + ["estraverse", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-visitor-keys", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-2.1.0-c31806b6b9-db4547eef5.zip/node_modules/eslint-visitor-keys/",\ + "packageDependencies": [\ + ["eslint-visitor-keys", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.4.3", {\ + "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-3.4.3-a356ac7e46-3f357c554a.zip/node_modules/eslint-visitor-keys/",\ + "packageDependencies": [\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["espree", [\ + ["npm:9.6.1", {\ + "packageLocation": "./.yarn/cache/espree-npm-9.6.1-a50722a5a9-255ab260f0.zip/node_modules/espree/",\ + "packageDependencies": [\ + ["espree", "npm:9.6.1"],\ + ["acorn", "npm:8.11.3"],\ + ["acorn-jsx", "virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2"],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["esprima", [\ + ["npm:4.0.1", {\ + "packageLocation": "./.yarn/cache/esprima-npm-4.0.1-1084e98778-f1d3c622ad.zip/node_modules/esprima/",\ + "packageDependencies": [\ + ["esprima", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["esquery", [\ + ["npm:1.5.0", {\ + "packageLocation": "./.yarn/cache/esquery-npm-1.5.0-d8f8a06879-e65fcdfc1e.zip/node_modules/esquery/",\ + "packageDependencies": [\ + ["esquery", "npm:1.5.0"],\ + ["estraverse", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["esrecurse", [\ + ["npm:4.3.0", {\ + "packageLocation": "./.yarn/cache/esrecurse-npm-4.3.0-10b86a887a-44ffcd89e7.zip/node_modules/esrecurse/",\ + "packageDependencies": [\ + ["esrecurse", "npm:4.3.0"],\ + ["estraverse", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["estraverse", [\ + ["npm:5.3.0", {\ + "packageLocation": "./.yarn/cache/estraverse-npm-5.3.0-03284f8f63-37cbe6e9a6.zip/node_modules/estraverse/",\ + "packageDependencies": [\ + ["estraverse", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["estree-walker", [\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/estree-walker-npm-2.0.2-dfab42f65c-b02109c5d4.zip/node_modules/estree-walker/",\ + "packageDependencies": [\ + ["estree-walker", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["esutils", [\ + ["npm:2.0.3", {\ + "packageLocation": "./.yarn/cache/esutils-npm-2.0.3-f865beafd5-b23acd2479.zip/node_modules/esutils/",\ + "packageDependencies": [\ + ["esutils", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["etag", [\ + ["npm:1.8.1", {\ + "packageLocation": "./.yarn/cache/etag-npm-1.8.1-54a3b989d9-571aeb3dbe.zip/node_modules/etag/",\ + "packageDependencies": [\ + ["etag", "npm:1.8.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["execa", [\ + ["npm:7.2.0", {\ + "packageLocation": "./.yarn/cache/execa-npm-7.2.0-7797cafb24-473feff60f.zip/node_modules/execa/",\ + "packageDependencies": [\ + ["execa", "npm:7.2.0"],\ + ["cross-spawn", "npm:7.0.3"],\ + ["get-stream", "npm:6.0.1"],\ + ["human-signals", "npm:4.3.1"],\ + ["is-stream", "npm:3.0.0"],\ + ["merge-stream", "npm:2.0.0"],\ + ["npm-run-path", "npm:5.2.0"],\ + ["onetime", "npm:6.0.0"],\ + ["signal-exit", "npm:3.0.7"],\ + ["strip-final-newline", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["expand-tilde", [\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/expand-tilde-npm-2.0.2-a4020a62f5-2efe6ed407.zip/node_modules/expand-tilde/",\ + "packageDependencies": [\ + ["expand-tilde", "npm:2.0.2"],\ + ["homedir-polyfill", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["exponential-backoff", [\ + ["npm:3.1.1", {\ + "packageLocation": "./.yarn/cache/exponential-backoff-npm-3.1.1-04df458b30-2d9bbb6473.zip/node_modules/exponential-backoff/",\ + "packageDependencies": [\ + ["exponential-backoff", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["express", [\ + ["npm:4.18.2", {\ + "packageLocation": "./.yarn/cache/express-npm-4.18.2-bb15ff679a-869ae89ed6.zip/node_modules/express/",\ + "packageDependencies": [\ + ["express", "npm:4.18.2"],\ + ["accepts", "npm:1.3.8"],\ + ["array-flatten", "npm:1.1.1"],\ + ["body-parser", "npm:1.20.1"],\ + ["content-disposition", "npm:0.5.4"],\ + ["content-type", "npm:1.0.5"],\ + ["cookie", "npm:0.5.0"],\ + ["cookie-signature", "npm:1.0.6"],\ + ["debug", "virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9"],\ + ["depd", "npm:2.0.0"],\ + ["encodeurl", "npm:1.0.2"],\ + ["escape-html", "npm:1.0.3"],\ + ["etag", "npm:1.8.1"],\ + ["finalhandler", "npm:1.2.0"],\ + ["fresh", "npm:0.5.2"],\ + ["http-errors", "npm:2.0.0"],\ + ["merge-descriptors", "npm:1.0.1"],\ + ["methods", "npm:1.1.2"],\ + ["on-finished", "npm:2.4.1"],\ + ["parseurl", "npm:1.3.3"],\ + ["path-to-regexp", "npm:0.1.7"],\ + ["proxy-addr", "npm:2.0.7"],\ + ["qs", "npm:6.11.0"],\ + ["range-parser", "npm:1.2.1"],\ + ["safe-buffer", "npm:5.2.1"],\ + ["send", "npm:0.18.0"],\ + ["serve-static", "npm:1.15.0"],\ + ["setprototypeof", "npm:1.2.0"],\ + ["statuses", "npm:2.0.1"],\ + ["type-is", "npm:1.6.18"],\ + ["utils-merge", "npm:1.0.1"],\ + ["vary", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["external-editor", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/external-editor-npm-3.1.0-878e7807af-776dff1d64.zip/node_modules/external-editor/",\ + "packageDependencies": [\ + ["external-editor", "npm:3.1.0"],\ + ["chardet", "npm:0.7.0"],\ + ["iconv-lite", "npm:0.4.24"],\ + ["tmp", "npm:0.0.33"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-check", [\ + ["npm:3.15.0", {\ + "packageLocation": "./.yarn/cache/fast-check-npm-3.15.0-5e1d76e115-4e4542bea0.zip/node_modules/fast-check/",\ + "packageDependencies": [\ + ["fast-check", "npm:3.15.0"],\ + ["pure-rand", "npm:6.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-deep-equal", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/fast-deep-equal-npm-2.0.1-9c01e08a62-b701835a87.zip/node_modules/fast-deep-equal/",\ + "packageDependencies": [\ + ["fast-deep-equal", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.1.3", {\ + "packageLocation": "./.yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip/node_modules/fast-deep-equal/",\ + "packageDependencies": [\ + ["fast-deep-equal", "npm:3.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-diff", [\ + ["npm:1.3.0", {\ + "packageLocation": "./.yarn/cache/fast-diff-npm-1.3.0-9f19e3b743-9e57415bc6.zip/node_modules/fast-diff/",\ + "packageDependencies": [\ + ["fast-diff", "npm:1.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-equals", [\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/fast-equals-npm-5.0.1-bbae54ff7b-9dc1ef7679.zip/node_modules/fast-equals/",\ + "packageDependencies": [\ + ["fast-equals", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-glob", [\ + ["npm:3.3.2", {\ + "packageLocation": "./.yarn/cache/fast-glob-npm-3.3.2-0a8cb4f2ca-222512e931.zip/node_modules/fast-glob/",\ + "packageDependencies": [\ + ["fast-glob", "npm:3.3.2"],\ + ["@nodelib/fs.stat", "npm:2.0.5"],\ + ["@nodelib/fs.walk", "npm:1.2.8"],\ + ["glob-parent", "npm:5.1.2"],\ + ["merge2", "npm:1.4.1"],\ + ["micromatch", "npm:4.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-json-patch", [\ + ["npm:2.2.1", {\ + "packageLocation": "./.yarn/cache/fast-json-patch-npm-2.2.1-63b021bb37-802924e8f6.zip/node_modules/fast-json-patch/",\ + "packageDependencies": [\ + ["fast-json-patch", "npm:2.2.1"],\ + ["fast-deep-equal", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-json-stable-stringify", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/fast-json-stable-stringify-npm-2.1.0-02e8905fda-2c20055c1f.zip/node_modules/fast-json-stable-stringify/",\ + "packageDependencies": [\ + ["fast-json-stable-stringify", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-levenshtein", [\ + ["npm:2.0.6", {\ + "packageLocation": "./.yarn/cache/fast-levenshtein-npm-2.0.6-fcd74b8df5-eb7e220ecf.zip/node_modules/fast-levenshtein/",\ + "packageDependencies": [\ + ["fast-levenshtein", "npm:2.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fastq", [\ + ["npm:1.16.0", {\ + "packageLocation": "./.yarn/cache/fastq-npm-1.16.0-88070bb399-de151543aa.zip/node_modules/fastq/",\ + "packageDependencies": [\ + ["fastq", "npm:1.16.0"],\ + ["reusify", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["figures", [\ + ["npm:3.2.0", {\ + "packageLocation": "./.yarn/cache/figures-npm-3.2.0-85d357e955-a3bf94e001.zip/node_modules/figures/",\ + "packageDependencies": [\ + ["figures", "npm:3.2.0"],\ + ["escape-string-regexp", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.1", {\ + "packageLocation": "./.yarn/cache/figures-npm-6.0.1-2993bb3561-2fb988f01b.zip/node_modules/figures/",\ + "packageDependencies": [\ + ["figures", "npm:6.0.1"],\ + ["is-unicode-supported", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["file-entry-cache", [\ + ["npm:6.0.1", {\ + "packageLocation": "./.yarn/cache/file-entry-cache-npm-6.0.1-31965cf0af-099bb9d4ab.zip/node_modules/file-entry-cache/",\ + "packageDependencies": [\ + ["file-entry-cache", "npm:6.0.1"],\ + ["flat-cache", "npm:3.2.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.0.0", {\ + "packageLocation": "./.yarn/cache/file-entry-cache-npm-8.0.0-5b09d19a83-afe55c4de4.zip/node_modules/file-entry-cache/",\ + "packageDependencies": [\ + ["file-entry-cache", "npm:8.0.0"],\ + ["flat-cache", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["file-type", [\ + ["npm:18.7.0", {\ + "packageLocation": "./.yarn/cache/file-type-npm-18.7.0-b585ca87df-95b70313d6.zip/node_modules/file-type/",\ + "packageDependencies": [\ + ["file-type", "npm:18.7.0"],\ + ["readable-web-to-node-stream", "npm:3.0.2"],\ + ["strtok3", "npm:7.0.0"],\ + ["token-types", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["file-uri-to-path", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/file-uri-to-path-npm-1.0.0-1043ac6206-b648580bdd.zip/node_modules/file-uri-to-path/",\ + "packageDependencies": [\ + ["file-uri-to-path", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["filing-cabinet", [\ + ["npm:3.3.1", {\ + "packageLocation": "./.yarn/cache/filing-cabinet-npm-3.3.1-dc82007732-c4e71efffa.zip/node_modules/filing-cabinet/",\ + "packageDependencies": [\ + ["filing-cabinet", "npm:3.3.1"],\ + ["app-module-path", "npm:2.2.0"],\ + ["commander", "npm:2.20.3"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["enhanced-resolve", "npm:5.15.0"],\ + ["is-relative-path", "npm:1.0.2"],\ + ["module-definition", "npm:3.4.0"],\ + ["module-lookup-amd", "npm:7.0.1"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["resolve-dependency-path", "npm:2.0.0"],\ + ["sass-lookup", "npm:3.0.0"],\ + ["stylus-lookup", "npm:3.0.2"],\ + ["tsconfig-paths", "npm:3.15.0"],\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fill-range", [\ + ["npm:7.0.1", {\ + "packageLocation": "./.yarn/cache/fill-range-npm-7.0.1-b8b1817caa-e260f7592f.zip/node_modules/fill-range/",\ + "packageDependencies": [\ + ["fill-range", "npm:7.0.1"],\ + ["to-regex-range", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["finalhandler", [\ + ["npm:1.2.0", {\ + "packageLocation": "./.yarn/cache/finalhandler-npm-1.2.0-593d001463-635718cb20.zip/node_modules/finalhandler/",\ + "packageDependencies": [\ + ["finalhandler", "npm:1.2.0"],\ + ["debug", "virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9"],\ + ["encodeurl", "npm:1.0.2"],\ + ["escape-html", "npm:1.0.3"],\ + ["on-finished", "npm:2.4.1"],\ + ["parseurl", "npm:1.3.3"],\ + ["statuses", "npm:2.0.1"],\ + ["unpipe", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["find-node-modules", [\ + ["npm:2.1.3", {\ + "packageLocation": "./.yarn/cache/find-node-modules-npm-2.1.3-431b2c5604-4b8a194ffd.zip/node_modules/find-node-modules/",\ + "packageDependencies": [\ + ["find-node-modules", "npm:2.1.3"],\ + ["findup-sync", "npm:4.0.0"],\ + ["merge", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["find-root", [\ + ["npm:1.1.0", {\ + "packageLocation": "./.yarn/cache/find-root-npm-1.1.0-a16a94005f-caa799c976.zip/node_modules/find-root/",\ + "packageDependencies": [\ + ["find-root", "npm:1.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["find-up", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/find-up-npm-2.1.0-9f6cb1765c-43284fe4da.zip/node_modules/find-up/",\ + "packageDependencies": [\ + ["find-up", "npm:2.1.0"],\ + ["locate-path", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/find-up-npm-3.0.0-a2d4b1b317-38eba3fe7a.zip/node_modules/find-up/",\ + "packageDependencies": [\ + ["find-up", "npm:3.0.0"],\ + ["locate-path", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/find-up-npm-4.1.0-c3ccf8d855-4c172680e8.zip/node_modules/find-up/",\ + "packageDependencies": [\ + ["find-up", "npm:4.1.0"],\ + ["locate-path", "npm:5.0.0"],\ + ["path-exists", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/find-up-npm-5.0.0-e03e9b796d-07955e3573.zip/node_modules/find-up/",\ + "packageDependencies": [\ + ["find-up", "npm:5.0.0"],\ + ["locate-path", "npm:6.0.0"],\ + ["path-exists", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["find-up-simple", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/find-up-simple-npm-1.0.0-81eb875be8-91c3d51c11.zip/node_modules/find-up-simple/",\ + "packageDependencies": [\ + ["find-up-simple", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["findup-sync", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/findup-sync-npm-4.0.0-3884c677a0-94131e1107.zip/node_modules/findup-sync/",\ + "packageDependencies": [\ + ["findup-sync", "npm:4.0.0"],\ + ["detect-file", "npm:1.0.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["micromatch", "npm:4.0.5"],\ + ["resolve-dir", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["flat-cache", [\ + ["npm:3.2.0", {\ + "packageLocation": "./.yarn/cache/flat-cache-npm-3.2.0-9a887f084e-02381c6ece.zip/node_modules/flat-cache/",\ + "packageDependencies": [\ + ["flat-cache", "npm:3.2.0"],\ + ["flatted", "npm:3.2.9"],\ + ["keyv", "npm:4.5.4"],\ + ["rimraf", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/flat-cache-npm-4.0.0-af74b9d632-344c60d397.zip/node_modules/flat-cache/",\ + "packageDependencies": [\ + ["flat-cache", "npm:4.0.0"],\ + ["flatted", "npm:3.2.9"],\ + ["keyv", "npm:4.5.4"],\ + ["rimraf", "npm:5.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["flatted", [\ + ["npm:3.2.9", {\ + "packageLocation": "./.yarn/cache/flatted-npm-3.2.9-0462256d3c-dc2b89e46a.zip/node_modules/flatted/",\ + "packageDependencies": [\ + ["flatted", "npm:3.2.9"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["flatten", [\ + ["npm:1.0.3", {\ + "packageLocation": "./.yarn/cache/flatten-npm-1.0.3-87bf6559dd-5c57379816.zip/node_modules/flatten/",\ + "packageDependencies": [\ + ["flatten", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fn-name", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/fn-name-npm-2.0.1-955ccc097e-ea06f4a99b.zip/node_modules/fn-name/",\ + "packageDependencies": [\ + ["fn-name", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["for-each", [\ + ["npm:0.3.3", {\ + "packageLocation": "./.yarn/cache/for-each-npm-0.3.3-0010ca8cdd-fdac0cde1b.zip/node_modules/for-each/",\ + "packageDependencies": [\ + ["for-each", "npm:0.3.3"],\ + ["is-callable", "npm:1.2.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["foreground-child", [\ + ["npm:3.1.1", {\ + "packageLocation": "./.yarn/cache/foreground-child-npm-3.1.1-77e78ed774-087edd4485.zip/node_modules/foreground-child/",\ + "packageDependencies": [\ + ["foreground-child", "npm:3.1.1"],\ + ["cross-spawn", "npm:7.0.3"],\ + ["signal-exit", "npm:4.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["forwarded", [\ + ["npm:0.2.0", {\ + "packageLocation": "./.yarn/cache/forwarded-npm-0.2.0-6473dabe35-29ba9fd347.zip/node_modules/forwarded/",\ + "packageDependencies": [\ + ["forwarded", "npm:0.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fresh", [\ + ["npm:0.5.2", {\ + "packageLocation": "./.yarn/cache/fresh-npm-0.5.2-ad2bb4c0a2-64c88e489b.zip/node_modules/fresh/",\ + "packageDependencies": [\ + ["fresh", "npm:0.5.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fs-extra", [\ + ["npm:7.0.1", {\ + "packageLocation": "./.yarn/cache/fs-extra-npm-7.0.1-b33a5e53e9-3fc6e56ba2.zip/node_modules/fs-extra/",\ + "packageDependencies": [\ + ["fs-extra", "npm:7.0.1"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["jsonfile", "npm:4.0.0"],\ + ["universalify", "npm:0.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:9.1.0", {\ + "packageLocation": "./.yarn/cache/fs-extra-npm-9.1.0-983c2ddb4c-08600da1b4.zip/node_modules/fs-extra/",\ + "packageDependencies": [\ + ["fs-extra", "npm:9.1.0"],\ + ["at-least-node", "npm:1.0.0"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["jsonfile", "npm:6.1.0"],\ + ["universalify", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fs-minipass", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/fs-minipass-npm-2.1.0-501ef87306-03191781e9.zip/node_modules/fs-minipass/",\ + "packageDependencies": [\ + ["fs-minipass", "npm:2.1.0"],\ + ["minipass", "npm:3.3.6"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.3", {\ + "packageLocation": "./.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-af143246cf.zip/node_modules/fs-minipass/",\ + "packageDependencies": [\ + ["fs-minipass", "npm:3.0.3"],\ + ["minipass", "npm:7.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fs.realpath", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-e703107c28.zip/node_modules/fs.realpath/",\ + "packageDependencies": [\ + ["fs.realpath", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fsevents", [\ + ["patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1", {\ + "packageLocation": "./.yarn/unplugged/fsevents-patch-19706e7e35/node_modules/fsevents/",\ + "packageDependencies": [\ + ["fsevents", "patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1"],\ + ["node-gyp", "npm:10.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1", {\ + "packageLocation": "./.yarn/unplugged/fsevents-patch-6b67494872/node_modules/fsevents/",\ + "packageDependencies": [\ + ["fsevents", "patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1"],\ + ["node-gyp", "npm:10.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["function-bind", [\ + ["npm:1.1.2", {\ + "packageLocation": "./.yarn/cache/function-bind-npm-1.1.2-7a55be9b03-185e20d20f.zip/node_modules/function-bind/",\ + "packageDependencies": [\ + ["function-bind", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["function.prototype.name", [\ + ["npm:1.1.6", {\ + "packageLocation": "./.yarn/cache/function.prototype.name-npm-1.1.6-fd3a6a5cdd-4d40be44d4.zip/node_modules/function.prototype.name/",\ + "packageDependencies": [\ + ["function.prototype.name", "npm:1.1.6"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["functions-have-names", "npm:1.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["functions-have-names", [\ + ["npm:1.2.3", {\ + "packageLocation": "./.yarn/cache/functions-have-names-npm-1.2.3-e5cf1e2208-0ddfd3ed10.zip/node_modules/functions-have-names/",\ + "packageDependencies": [\ + ["functions-have-names", "npm:1.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["gauge", [\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/cache/gauge-npm-3.0.2-9e22f7af9e-46df086451.zip/node_modules/gauge/",\ + "packageDependencies": [\ + ["gauge", "npm:3.0.2"],\ + ["aproba", "npm:2.0.0"],\ + ["color-support", "npm:1.1.3"],\ + ["console-control-strings", "npm:1.1.0"],\ + ["has-unicode", "npm:2.0.1"],\ + ["object-assign", "npm:4.1.1"],\ + ["signal-exit", "npm:3.0.7"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["wide-align", "npm:1.1.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["gensequence", [\ + ["npm:6.0.0", {\ + "packageLocation": "./.yarn/cache/gensequence-npm-6.0.0-6c97e84d9a-95bc7233ee.zip/node_modules/gensequence/",\ + "packageDependencies": [\ + ["gensequence", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-amd-module-type", [\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/cache/get-amd-module-type-npm-3.0.2-466fbb8aa0-dd41d3d966.zip/node_modules/get-amd-module-type/",\ + "packageDependencies": [\ + ["get-amd-module-type", "npm:3.0.2"],\ + ["ast-module-types", "npm:3.0.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/get-amd-module-type-npm-4.1.0-b7d3afdf8c-b12fe94eee.zip/node_modules/get-amd-module-type/",\ + "packageDependencies": [\ + ["get-amd-module-type", "npm:4.1.0"],\ + ["ast-module-types", "npm:4.0.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-caller-file", [\ + ["npm:2.0.5", {\ + "packageLocation": "./.yarn/cache/get-caller-file-npm-2.0.5-80e8a86305-b9769a836d.zip/node_modules/get-caller-file/",\ + "packageDependencies": [\ + ["get-caller-file", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-east-asian-width", [\ + ["npm:1.2.0", {\ + "packageLocation": "./.yarn/cache/get-east-asian-width-npm-1.2.0-6cd8491dbe-c9b280e7c7.zip/node_modules/get-east-asian-width/",\ + "packageDependencies": [\ + ["get-east-asian-width", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-intrinsic", [\ + ["npm:1.2.2", {\ + "packageLocation": "./.yarn/cache/get-intrinsic-npm-1.2.2-3f446d8847-aa96db4f80.zip/node_modules/get-intrinsic/",\ + "packageDependencies": [\ + ["get-intrinsic", "npm:1.2.2"],\ + ["function-bind", "npm:1.1.2"],\ + ["has-proto", "npm:1.0.1"],\ + ["has-symbols", "npm:1.0.3"],\ + ["hasown", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-own-enumerable-property-symbols", [\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/cache/get-own-enumerable-property-symbols-npm-3.0.2-f143f9e8d3-8f0331f141.zip/node_modules/get-own-enumerable-property-symbols/",\ + "packageDependencies": [\ + ["get-own-enumerable-property-symbols", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-pkg-repo", [\ + ["npm:4.2.1", {\ + "packageLocation": "./.yarn/cache/get-pkg-repo-npm-4.2.1-b1cd052cb4-033225cf7c.zip/node_modules/get-pkg-repo/",\ + "packageDependencies": [\ + ["get-pkg-repo", "npm:4.2.1"],\ + ["@hutson/parse-repository-url", "npm:3.0.2"],\ + ["hosted-git-info", "npm:4.1.0"],\ + ["through2", "npm:2.0.5"],\ + ["yargs", "npm:16.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-stdin", [\ + ["npm:9.0.0", {\ + "packageLocation": "./.yarn/cache/get-stdin-npm-9.0.0-4221477153-5972bc34d0.zip/node_modules/get-stdin/",\ + "packageDependencies": [\ + ["get-stdin", "npm:9.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-stream", [\ + ["npm:6.0.1", {\ + "packageLocation": "./.yarn/cache/get-stream-npm-6.0.1-83e51a4642-781266d297.zip/node_modules/get-stream/",\ + "packageDependencies": [\ + ["get-stream", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-symbol-description", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/get-symbol-description-npm-1.0.0-9c95a4bc1f-7e5f298afe.zip/node_modules/get-symbol-description/",\ + "packageDependencies": [\ + ["get-symbol-description", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["git-raw-commits", [\ + ["npm:2.0.11", {\ + "packageLocation": "./.yarn/cache/git-raw-commits-npm-2.0.11-b090f2f684-04e02b3da7.zip/node_modules/git-raw-commits/",\ + "packageDependencies": [\ + ["git-raw-commits", "npm:2.0.11"],\ + ["dargs", "npm:7.0.0"],\ + ["lodash", "npm:4.17.21"],\ + ["meow", "npm:8.1.2"],\ + ["split2", "npm:3.2.2"],\ + ["through2", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["git-remote-origin-url", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/git-remote-origin-url-npm-2.0.0-319debe0d1-85263a09c0.zip/node_modules/git-remote-origin-url/",\ + "packageDependencies": [\ + ["git-remote-origin-url", "npm:2.0.0"],\ + ["gitconfiglocal", "npm:1.0.0"],\ + ["pify", "npm:2.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["git-semver-tags", [\ + ["npm:4.1.1", {\ + "packageLocation": "./.yarn/cache/git-semver-tags-npm-4.1.1-93b9747811-ab2ad6c7c8.zip/node_modules/git-semver-tags/",\ + "packageDependencies": [\ + ["git-semver-tags", "npm:4.1.1"],\ + ["meow", "npm:8.1.2"],\ + ["semver", "npm:6.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["gitconfiglocal", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/gitconfiglocal-npm-1.0.0-905970379d-e6d2764c15.zip/node_modules/gitconfiglocal/",\ + "packageDependencies": [\ + ["gitconfiglocal", "npm:1.0.0"],\ + ["ini", "npm:1.3.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["glob", [\ + ["npm:10.3.10", {\ + "packageLocation": "./.yarn/cache/glob-npm-10.3.10-da1ef8b112-38bdb2c9ce.zip/node_modules/glob/",\ + "packageDependencies": [\ + ["glob", "npm:10.3.10"],\ + ["foreground-child", "npm:3.1.1"],\ + ["jackspeak", "npm:2.3.6"],\ + ["minimatch", "npm:9.0.3"],\ + ["minipass", "npm:7.0.4"],\ + ["path-scurry", "npm:1.10.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.2.3", {\ + "packageLocation": "./.yarn/cache/glob-npm-7.2.3-2d866d17a5-59452a9202.zip/node_modules/glob/",\ + "packageDependencies": [\ + ["glob", "npm:7.2.3"],\ + ["fs.realpath", "npm:1.0.0"],\ + ["inflight", "npm:1.0.6"],\ + ["inherits", "npm:2.0.4"],\ + ["minimatch", "npm:3.1.2"],\ + ["once", "npm:1.4.0"],\ + ["path-is-absolute", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.1.0", {\ + "packageLocation": "./.yarn/cache/glob-npm-8.1.0-65f64af8b1-9aab1c75eb.zip/node_modules/glob/",\ + "packageDependencies": [\ + ["glob", "npm:8.1.0"],\ + ["fs.realpath", "npm:1.0.0"],\ + ["inflight", "npm:1.0.6"],\ + ["inherits", "npm:2.0.4"],\ + ["minimatch", "npm:5.1.6"],\ + ["once", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["glob-parent", [\ + ["npm:5.1.2", {\ + "packageLocation": "./.yarn/cache/glob-parent-npm-5.1.2-021ab32634-32cd106ce8.zip/node_modules/glob-parent/",\ + "packageDependencies": [\ + ["glob-parent", "npm:5.1.2"],\ + ["is-glob", "npm:4.0.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.2", {\ + "packageLocation": "./.yarn/cache/glob-parent-npm-6.0.2-2cbef12738-c13ee97978.zip/node_modules/glob-parent/",\ + "packageDependencies": [\ + ["glob-parent", "npm:6.0.2"],\ + ["is-glob", "npm:4.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["global-directory", [\ + ["npm:4.0.1", {\ + "packageLocation": "./.yarn/cache/global-directory-npm-4.0.1-1de95382fd-5b4df24438.zip/node_modules/global-directory/",\ + "packageDependencies": [\ + ["global-directory", "npm:4.0.1"],\ + ["ini", "npm:4.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["global-dirs", [\ + ["npm:0.1.1", {\ + "packageLocation": "./.yarn/cache/global-dirs-npm-0.1.1-87c167e806-10624f5a8d.zip/node_modules/global-dirs/",\ + "packageDependencies": [\ + ["global-dirs", "npm:0.1.1"],\ + ["ini", "npm:1.3.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["global-modules", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/global-modules-npm-1.0.0-70c522e57a-e4031a01c0.zip/node_modules/global-modules/",\ + "packageDependencies": [\ + ["global-modules", "npm:1.0.0"],\ + ["global-prefix", "npm:1.0.2"],\ + ["is-windows", "npm:1.0.2"],\ + ["resolve-dir", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["global-prefix", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/global-prefix-npm-1.0.2-a96996834b-68cf78f81c.zip/node_modules/global-prefix/",\ + "packageDependencies": [\ + ["global-prefix", "npm:1.0.2"],\ + ["expand-tilde", "npm:2.0.2"],\ + ["homedir-polyfill", "npm:1.0.3"],\ + ["ini", "npm:1.3.8"],\ + ["is-windows", "npm:1.0.2"],\ + ["which", "npm:1.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["globals", [\ + ["npm:13.24.0", {\ + "packageLocation": "./.yarn/cache/globals-npm-13.24.0-cc7713139c-62c5b1997d.zip/node_modules/globals/",\ + "packageDependencies": [\ + ["globals", "npm:13.24.0"],\ + ["type-fest", "npm:0.20.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["globalthis", [\ + ["npm:1.0.3", {\ + "packageLocation": "./.yarn/cache/globalthis-npm-1.0.3-96cd56020d-45ae2f3b40.zip/node_modules/globalthis/",\ + "packageDependencies": [\ + ["globalthis", "npm:1.0.3"],\ + ["define-properties", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["globby", [\ + ["npm:11.1.0", {\ + "packageLocation": "./.yarn/cache/globby-npm-11.1.0-bdcdf20c71-288e95e310.zip/node_modules/globby/",\ + "packageDependencies": [\ + ["globby", "npm:11.1.0"],\ + ["array-union", "npm:2.1.0"],\ + ["dir-glob", "npm:3.0.1"],\ + ["fast-glob", "npm:3.3.2"],\ + ["ignore", "npm:5.3.0"],\ + ["merge2", "npm:1.4.1"],\ + ["slash", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:13.2.2", {\ + "packageLocation": "./.yarn/cache/globby-npm-13.2.2-47efcd4a86-4494a9d216.zip/node_modules/globby/",\ + "packageDependencies": [\ + ["globby", "npm:13.2.2"],\ + ["dir-glob", "npm:3.0.1"],\ + ["fast-glob", "npm:3.3.2"],\ + ["ignore", "npm:5.3.0"],\ + ["merge2", "npm:1.4.1"],\ + ["slash", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:14.0.0", {\ + "packageLocation": "./.yarn/cache/globby-npm-14.0.0-3bccdd5188-6e7d84bbc6.zip/node_modules/globby/",\ + "packageDependencies": [\ + ["globby", "npm:14.0.0"],\ + ["@sindresorhus/merge-streams", "npm:1.0.0"],\ + ["fast-glob", "npm:3.3.2"],\ + ["ignore", "npm:5.3.0"],\ + ["path-type", "npm:5.0.0"],\ + ["slash", "npm:5.1.0"],\ + ["unicorn-magic", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["gonzales-pe", [\ + ["npm:4.3.0", {\ + "packageLocation": "./.yarn/cache/gonzales-pe-npm-4.3.0-82921c6976-d1676546bc.zip/node_modules/gonzales-pe/",\ + "packageDependencies": [\ + ["gonzales-pe", "npm:4.3.0"],\ + ["minimist", "npm:1.2.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["gopd", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/gopd-npm-1.0.1-10c1d0b534-5fbc7ad57b.zip/node_modules/gopd/",\ + "packageDependencies": [\ + ["gopd", "npm:1.0.1"],\ + ["get-intrinsic", "npm:1.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["graceful-fs", [\ + ["npm:4.2.11", {\ + "packageLocation": "./.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-bf152d0ed1.zip/node_modules/graceful-fs/",\ + "packageDependencies": [\ + ["graceful-fs", "npm:4.2.11"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["graphemer", [\ + ["npm:1.4.0", {\ + "packageLocation": "./.yarn/cache/graphemer-npm-1.4.0-0627732d35-6dd60dba97.zip/node_modules/graphemer/",\ + "packageDependencies": [\ + ["graphemer", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["handlebars", [\ + ["npm:4.7.8", {\ + "packageLocation": "./.yarn/cache/handlebars-npm-4.7.8-25244c2c82-bd528f4dd1.zip/node_modules/handlebars/",\ + "packageDependencies": [\ + ["handlebars", "npm:4.7.8"],\ + ["minimist", "npm:1.2.8"],\ + ["neo-async", "npm:2.6.2"],\ + ["source-map", "npm:0.6.1"],\ + ["uglify-js", "npm:3.17.4"],\ + ["wordwrap", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["hard-rejection", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/hard-rejection-npm-2.1.0-a80f2a977d-7baaf80a0c.zip/node_modules/hard-rejection/",\ + "packageDependencies": [\ + ["hard-rejection", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-bigints", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/has-bigints-npm-1.0.2-52732e614d-4e0426c900.zip/node_modules/has-bigints/",\ + "packageDependencies": [\ + ["has-bigints", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-flag", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/has-flag-npm-3.0.0-16ac11fe05-4a15638b45.zip/node_modules/has-flag/",\ + "packageDependencies": [\ + ["has-flag", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip/node_modules/has-flag/",\ + "packageDependencies": [\ + ["has-flag", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-own-prop", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/has-own-prop-npm-2.0.0-d895adfe8c-ca6336e85e.zip/node_modules/has-own-prop/",\ + "packageDependencies": [\ + ["has-own-prop", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-property-descriptors", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/has-property-descriptors-npm-1.0.1-61cd62fce3-21a47bb080.zip/node_modules/has-property-descriptors/",\ + "packageDependencies": [\ + ["has-property-descriptors", "npm:1.0.1"],\ + ["get-intrinsic", "npm:1.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-proto", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/has-proto-npm-1.0.1-631ea9d820-eab2ab0ed1.zip/node_modules/has-proto/",\ + "packageDependencies": [\ + ["has-proto", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-symbols", [\ + ["npm:1.0.3", {\ + "packageLocation": "./.yarn/cache/has-symbols-npm-1.0.3-1986bff2c4-464f97a820.zip/node_modules/has-symbols/",\ + "packageDependencies": [\ + ["has-symbols", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-tostringtag", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/has-tostringtag-npm-1.0.0-b1fcf3ab55-95546e7132.zip/node_modules/has-tostringtag/",\ + "packageDependencies": [\ + ["has-tostringtag", "npm:1.0.0"],\ + ["has-symbols", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-unicode", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/has-unicode-npm-2.0.1-893adb4747-041b4293ad.zip/node_modules/has-unicode/",\ + "packageDependencies": [\ + ["has-unicode", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["hash.js", [\ + ["npm:1.1.7", {\ + "packageLocation": "./.yarn/cache/hash.js-npm-1.1.7-f1ad187358-0c89ee4006.zip/node_modules/hash.js/",\ + "packageDependencies": [\ + ["hash.js", "npm:1.1.7"],\ + ["inherits", "npm:2.0.4"],\ + ["minimalistic-assert", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["hasown", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/hasown-npm-2.0.0-78b794ceef-c330f8d93f.zip/node_modules/hasown/",\ + "packageDependencies": [\ + ["hasown", "npm:2.0.0"],\ + ["function-bind", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["hmac-drbg", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/hmac-drbg-npm-1.0.1-3499ad31cd-0298a1445b.zip/node_modules/hmac-drbg/",\ + "packageDependencies": [\ + ["hmac-drbg", "npm:1.0.1"],\ + ["hash.js", "npm:1.1.7"],\ + ["minimalistic-assert", "npm:1.0.1"],\ + ["minimalistic-crypto-utils", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["homedir-polyfill", [\ + ["npm:1.0.3", {\ + "packageLocation": "./.yarn/cache/homedir-polyfill-npm-1.0.3-da1a29ce00-18dd4db870.zip/node_modules/homedir-polyfill/",\ + "packageDependencies": [\ + ["homedir-polyfill", "npm:1.0.3"],\ + ["parse-passwd", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["hosted-git-info", [\ + ["npm:2.8.9", {\ + "packageLocation": "./.yarn/cache/hosted-git-info-npm-2.8.9-62c44fa93f-96da7d4123.zip/node_modules/hosted-git-info/",\ + "packageDependencies": [\ + ["hosted-git-info", "npm:2.8.9"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/hosted-git-info-npm-4.1.0-4efcdf8fd3-4dc67022b7.zip/node_modules/hosted-git-info/",\ + "packageDependencies": [\ + ["hosted-git-info", "npm:4.1.0"],\ + ["lru-cache", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["html-escaper", [\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/html-escaper-npm-2.0.2-38e51ef294-034d74029d.zip/node_modules/html-escaper/",\ + "packageDependencies": [\ + ["html-escaper", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["http-cache-semantics", [\ + ["npm:4.1.1", {\ + "packageLocation": "./.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-362d5ed66b.zip/node_modules/http-cache-semantics/",\ + "packageDependencies": [\ + ["http-cache-semantics", "npm:4.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["http-errors", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/http-errors-npm-2.0.0-3f1c503428-0e7f76ee8f.zip/node_modules/http-errors/",\ + "packageDependencies": [\ + ["http-errors", "npm:2.0.0"],\ + ["depd", "npm:2.0.0"],\ + ["inherits", "npm:2.0.4"],\ + ["setprototypeof", "npm:1.2.0"],\ + ["statuses", "npm:2.0.1"],\ + ["toidentifier", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["http-proxy-agent", [\ + ["npm:7.0.0", {\ + "packageLocation": "./.yarn/cache/http-proxy-agent-npm-7.0.0-106a57cc8c-dbaaf3d9f3.zip/node_modules/http-proxy-agent/",\ + "packageDependencies": [\ + ["http-proxy-agent", "npm:7.0.0"],\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["https-proxy-agent", [\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/https-proxy-agent-npm-5.0.1-42d65f358e-f0dce7bdca.zip/node_modules/https-proxy-agent/",\ + "packageDependencies": [\ + ["https-proxy-agent", "npm:5.0.1"],\ + ["agent-base", "npm:6.0.2"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.0.2", {\ + "packageLocation": "./.yarn/cache/https-proxy-agent-npm-7.0.2-83ea6a5d42-9ec844f78f.zip/node_modules/https-proxy-agent/",\ + "packageDependencies": [\ + ["https-proxy-agent", "npm:7.0.2"],\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["human-signals", [\ + ["npm:4.3.1", {\ + "packageLocation": "./.yarn/cache/human-signals-npm-4.3.1-d723001512-fa59894c35.zip/node_modules/human-signals/",\ + "packageDependencies": [\ + ["human-signals", "npm:4.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["iconv-lite", [\ + ["npm:0.4.24", {\ + "packageLocation": "./.yarn/cache/iconv-lite-npm-0.4.24-c5c4ac6695-6d3a2dac6e.zip/node_modules/iconv-lite/",\ + "packageDependencies": [\ + ["iconv-lite", "npm:0.4.24"],\ + ["safer-buffer", "npm:2.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:0.6.3", {\ + "packageLocation": "./.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-24e3292dd3.zip/node_modules/iconv-lite/",\ + "packageDependencies": [\ + ["iconv-lite", "npm:0.6.3"],\ + ["safer-buffer", "npm:2.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ieee754", [\ + ["npm:1.2.1", {\ + "packageLocation": "./.yarn/cache/ieee754-npm-1.2.1-fb63b3caeb-d9f2557a59.zip/node_modules/ieee754/",\ + "packageDependencies": [\ + ["ieee754", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ignore", [\ + ["npm:5.3.0", {\ + "packageLocation": "./.yarn/cache/ignore-npm-5.3.0-fb0f5fa062-51594355ce.zip/node_modules/ignore/",\ + "packageDependencies": [\ + ["ignore", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ignore-by-default", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/ignore-by-default-npm-2.1.0-996694cc00-2b2df4622b.zip/node_modules/ignore-by-default/",\ + "packageDependencies": [\ + ["ignore-by-default", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["import-fresh", [\ + ["npm:3.3.0", {\ + "packageLocation": "./.yarn/cache/import-fresh-npm-3.3.0-3e34265ca9-2cacfad06e.zip/node_modules/import-fresh/",\ + "packageDependencies": [\ + ["import-fresh", "npm:3.3.0"],\ + ["parent-module", "npm:1.0.1"],\ + ["resolve-from", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["import-lazy", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/import-lazy-npm-4.0.0-3215653869-943309cc8e.zip/node_modules/import-lazy/",\ + "packageDependencies": [\ + ["import-lazy", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["import-meta-resolve", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/import-meta-resolve-npm-4.0.0-13a6ef4fd3-73f0f1d68f.zip/node_modules/import-meta-resolve/",\ + "packageDependencies": [\ + ["import-meta-resolve", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["imurmurhash", [\ + ["npm:0.1.4", {\ + "packageLocation": "./.yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-2d30b157a9.zip/node_modules/imurmurhash/",\ + "packageDependencies": [\ + ["imurmurhash", "npm:0.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["indent-string", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/indent-string-npm-4.0.0-7b717435b2-cd3f5cbc9c.zip/node_modules/indent-string/",\ + "packageDependencies": [\ + ["indent-string", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/indent-string-npm-5.0.0-35eaa3b052-e466c27b63.zip/node_modules/indent-string/",\ + "packageDependencies": [\ + ["indent-string", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["indexes-of", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/indexes-of-npm-1.0.1-5ce8500941-4f9799b173.zip/node_modules/indexes-of/",\ + "packageDependencies": [\ + ["indexes-of", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["inflight", [\ + ["npm:1.0.6", {\ + "packageLocation": "./.yarn/cache/inflight-npm-1.0.6-ccedb4b908-d2ebd65441.zip/node_modules/inflight/",\ + "packageDependencies": [\ + ["inflight", "npm:1.0.6"],\ + ["once", "npm:1.4.0"],\ + ["wrappy", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["inherits", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/inherits-npm-2.0.1-0011554c03-37165f42e5.zip/node_modules/inherits/",\ + "packageDependencies": [\ + ["inherits", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.4", {\ + "packageLocation": "./.yarn/cache/inherits-npm-2.0.4-c66b3957a0-cd45e923be.zip/node_modules/inherits/",\ + "packageDependencies": [\ + ["inherits", "npm:2.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ini", [\ + ["npm:1.3.8", {\ + "packageLocation": "./.yarn/cache/ini-npm-1.3.8-fb5040b4c0-314ae176e8.zip/node_modules/ini/",\ + "packageDependencies": [\ + ["ini", "npm:1.3.8"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.1", {\ + "packageLocation": "./.yarn/cache/ini-npm-4.1.1-01c2cbda7b-64c7102301.zip/node_modules/ini/",\ + "packageDependencies": [\ + ["ini", "npm:4.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["inquirer", [\ + ["npm:8.2.5", {\ + "packageLocation": "./.yarn/cache/inquirer-npm-8.2.5-ffce7548f9-50a240dfea.zip/node_modules/inquirer/",\ + "packageDependencies": [\ + ["inquirer", "npm:8.2.5"],\ + ["ansi-escapes", "npm:4.3.2"],\ + ["chalk", "npm:4.1.2"],\ + ["cli-cursor", "npm:3.1.0"],\ + ["cli-width", "npm:3.0.0"],\ + ["external-editor", "npm:3.1.0"],\ + ["figures", "npm:3.2.0"],\ + ["lodash", "npm:4.17.21"],\ + ["mute-stream", "npm:0.0.8"],\ + ["ora", "npm:5.4.1"],\ + ["run-async", "npm:2.4.1"],\ + ["rxjs", "npm:7.8.1"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["through", "npm:2.3.8"],\ + ["wrap-ansi", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["internal-slot", [\ + ["npm:1.0.6", {\ + "packageLocation": "./.yarn/cache/internal-slot-npm-1.0.6-1ed833e09a-bc2022eb1f.zip/node_modules/internal-slot/",\ + "packageDependencies": [\ + ["internal-slot", "npm:1.0.6"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["hasown", "npm:2.0.0"],\ + ["side-channel", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ip", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/ip-npm-2.0.0-204facb3cc-1270b11e53.zip/node_modules/ip/",\ + "packageDependencies": [\ + ["ip", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ipaddr.js", [\ + ["npm:1.9.1", {\ + "packageLocation": "./.yarn/cache/ipaddr.js-npm-1.9.1-19ae7878b4-864d0cced0.zip/node_modules/ipaddr.js/",\ + "packageDependencies": [\ + ["ipaddr.js", "npm:1.9.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["irregular-plurals", [\ + ["npm:3.5.0", {\ + "packageLocation": "./.yarn/cache/irregular-plurals-npm-3.5.0-2415613615-27f04e6640.zip/node_modules/irregular-plurals/",\ + "packageDependencies": [\ + ["irregular-plurals", "npm:3.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-array-buffer", [\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/cache/is-array-buffer-npm-3.0.2-0dec897785-dcac9dda66.zip/node_modules/is-array-buffer/",\ + "packageDependencies": [\ + ["is-array-buffer", "npm:3.0.2"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["is-typed-array", "npm:1.1.12"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-arrayish", [\ + ["npm:0.2.1", {\ + "packageLocation": "./.yarn/cache/is-arrayish-npm-0.2.1-23927dfb15-73ced84fa3.zip/node_modules/is-arrayish/",\ + "packageDependencies": [\ + ["is-arrayish", "npm:0.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-bigint", [\ + ["npm:1.0.4", {\ + "packageLocation": "./.yarn/cache/is-bigint-npm-1.0.4-31c2eecbc9-cc981cf056.zip/node_modules/is-bigint/",\ + "packageDependencies": [\ + ["is-bigint", "npm:1.0.4"],\ + ["has-bigints", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-boolean-object", [\ + ["npm:1.1.2", {\ + "packageLocation": "./.yarn/cache/is-boolean-object-npm-1.1.2-ecbd575e6a-ba794223b5.zip/node_modules/is-boolean-object/",\ + "packageDependencies": [\ + ["is-boolean-object", "npm:1.1.2"],\ + ["call-bind", "npm:1.0.5"],\ + ["has-tostringtag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-builtin-module", [\ + ["npm:3.2.1", {\ + "packageLocation": "./.yarn/cache/is-builtin-module-npm-3.2.1-2f92a5d353-e8f0ffc19a.zip/node_modules/is-builtin-module/",\ + "packageDependencies": [\ + ["is-builtin-module", "npm:3.2.1"],\ + ["builtin-modules", "npm:3.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-callable", [\ + ["npm:1.2.7", {\ + "packageLocation": "./.yarn/cache/is-callable-npm-1.2.7-808a303e61-48a9297fb9.zip/node_modules/is-callable/",\ + "packageDependencies": [\ + ["is-callable", "npm:1.2.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-core-module", [\ + ["npm:2.13.1", {\ + "packageLocation": "./.yarn/cache/is-core-module-npm-2.13.1-36e17434f9-d53bd0cc24.zip/node_modules/is-core-module/",\ + "packageDependencies": [\ + ["is-core-module", "npm:2.13.1"],\ + ["hasown", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-date-object", [\ + ["npm:1.0.5", {\ + "packageLocation": "./.yarn/cache/is-date-object-npm-1.0.5-88f3d08b5e-cc80b3a4b4.zip/node_modules/is-date-object/",\ + "packageDependencies": [\ + ["is-date-object", "npm:1.0.5"],\ + ["has-tostringtag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-docker", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/is-docker-npm-3.0.0-1570e32177-b698118f04.zip/node_modules/is-docker/",\ + "packageDependencies": [\ + ["is-docker", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-extglob", [\ + ["npm:2.1.1", {\ + "packageLocation": "./.yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip/node_modules/is-extglob/",\ + "packageDependencies": [\ + ["is-extglob", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-fullwidth-code-point", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip/node_modules/is-fullwidth-code-point/",\ + "packageDependencies": [\ + ["is-fullwidth-code-point", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/is-fullwidth-code-point-npm-4.0.0-848488b60d-8ae89bf505.zip/node_modules/is-fullwidth-code-point/",\ + "packageDependencies": [\ + ["is-fullwidth-code-point", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-glob", [\ + ["npm:4.0.3", {\ + "packageLocation": "./.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-3ed74f2b0c.zip/node_modules/is-glob/",\ + "packageDependencies": [\ + ["is-glob", "npm:4.0.3"],\ + ["is-extglob", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-immutable-type", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/is-immutable-type-npm-2.0.1-a1c8e237b4-12eacd7739.zip/node_modules/is-immutable-type/",\ + "packageDependencies": [\ + ["is-immutable-type", "npm:2.0.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:45ee868a16e5e16301bd5a061375b37c4ddadfda3dbc29a60eb33cc602493cb2833fdb5058487addec4d7d2fad1c6defdae2c5ae0c70fd6e7e1433365f3b484b#npm:2.0.1", {\ + "packageLocation": "./.yarn/__virtual__/is-immutable-type-virtual-a47524ebd3/0/cache/is-immutable-type-npm-2.0.1-a1c8e237b4-12eacd7739.zip/node_modules/is-immutable-type/",\ + "packageDependencies": [\ + ["is-immutable-type", "virtual:45ee868a16e5e16301bd5a061375b37c4ddadfda3dbc29a60eb33cc602493cb2833fdb5058487addec4d7d2fad1c6defdae2c5ae0c70fd6e7e1433365f3b484b#npm:2.0.1"],\ + ["@types/eslint", null],\ + ["@types/typescript", null],\ + ["@typescript-eslint/type-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["eslint", "npm:8.56.0"],\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-inside-container", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/is-inside-container-npm-1.0.0-f2c9e9bb96-c50b75a2ab.zip/node_modules/is-inside-container/",\ + "packageDependencies": [\ + ["is-inside-container", "npm:1.0.0"],\ + ["is-docker", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-interactive", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/is-interactive-npm-1.0.0-7ff7c6e04a-824808776e.zip/node_modules/is-interactive/",\ + "packageDependencies": [\ + ["is-interactive", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-lambda", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip/node_modules/is-lambda/",\ + "packageDependencies": [\ + ["is-lambda", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-module", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/is-module-npm-1.0.0-79ba918283-8cd5390730.zip/node_modules/is-module/",\ + "packageDependencies": [\ + ["is-module", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-negative-zero", [\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/is-negative-zero-npm-2.0.2-0adac91f15-edbec1a9e6.zip/node_modules/is-negative-zero/",\ + "packageDependencies": [\ + ["is-negative-zero", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-number", [\ + ["npm:7.0.0", {\ + "packageLocation": "./.yarn/cache/is-number-npm-7.0.0-060086935c-6a6c3383f6.zip/node_modules/is-number/",\ + "packageDependencies": [\ + ["is-number", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-number-object", [\ + ["npm:1.0.7", {\ + "packageLocation": "./.yarn/cache/is-number-object-npm-1.0.7-539d0e274d-8700dcf7f6.zip/node_modules/is-number-object/",\ + "packageDependencies": [\ + ["is-number-object", "npm:1.0.7"],\ + ["has-tostringtag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-obj", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/is-obj-npm-1.0.1-7d391539d7-3ccf0efdea.zip/node_modules/is-obj/",\ + "packageDependencies": [\ + ["is-obj", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/is-obj-npm-2.0.0-3d95e053f4-c9916ac8f4.zip/node_modules/is-obj/",\ + "packageDependencies": [\ + ["is-obj", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-path-inside", [\ + ["npm:3.0.3", {\ + "packageLocation": "./.yarn/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip/node_modules/is-path-inside/",\ + "packageDependencies": [\ + ["is-path-inside", "npm:3.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-plain-obj", [\ + ["npm:1.1.0", {\ + "packageLocation": "./.yarn/cache/is-plain-obj-npm-1.1.0-1046f64c0b-0ee0480779.zip/node_modules/is-plain-obj/",\ + "packageDependencies": [\ + ["is-plain-obj", "npm:1.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-plain-object", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/is-plain-object-npm-5.0.0-285b70faa3-e32d27061e.zip/node_modules/is-plain-object/",\ + "packageDependencies": [\ + ["is-plain-object", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-promise", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/is-promise-npm-4.0.0-1e3c05420c-0b46517ad4.zip/node_modules/is-promise/",\ + "packageDependencies": [\ + ["is-promise", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-reference", [\ + ["npm:1.2.1", {\ + "packageLocation": "./.yarn/cache/is-reference-npm-1.2.1-87ca1743c8-e7b48149f8.zip/node_modules/is-reference/",\ + "packageDependencies": [\ + ["is-reference", "npm:1.2.1"],\ + ["@types/estree", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-regex", [\ + ["npm:1.1.4", {\ + "packageLocation": "./.yarn/cache/is-regex-npm-1.1.4-cca193ef11-36d9174d16.zip/node_modules/is-regex/",\ + "packageDependencies": [\ + ["is-regex", "npm:1.1.4"],\ + ["call-bind", "npm:1.0.5"],\ + ["has-tostringtag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-regexp", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/is-regexp-npm-1.0.0-8f95f51a0c-be692828e2.zip/node_modules/is-regexp/",\ + "packageDependencies": [\ + ["is-regexp", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-relative-path", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/is-relative-path-npm-1.0.2-920be97603-6c2ccffd3c.zip/node_modules/is-relative-path/",\ + "packageDependencies": [\ + ["is-relative-path", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-shared-array-buffer", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/is-shared-array-buffer-npm-1.0.2-32e4181fcd-23d82259d6.zip/node_modules/is-shared-array-buffer/",\ + "packageDependencies": [\ + ["is-shared-array-buffer", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-stream", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/is-stream-npm-3.0.0-a77ac9a62e-172093fe99.zip/node_modules/is-stream/",\ + "packageDependencies": [\ + ["is-stream", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-string", [\ + ["npm:1.0.7", {\ + "packageLocation": "./.yarn/cache/is-string-npm-1.0.7-9f7066daed-2bc292fe92.zip/node_modules/is-string/",\ + "packageDependencies": [\ + ["is-string", "npm:1.0.7"],\ + ["has-tostringtag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-symbol", [\ + ["npm:1.0.4", {\ + "packageLocation": "./.yarn/cache/is-symbol-npm-1.0.4-eb9baac703-a47dd899a8.zip/node_modules/is-symbol/",\ + "packageDependencies": [\ + ["is-symbol", "npm:1.0.4"],\ + ["has-symbols", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-text-path", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/is-text-path-npm-1.0.1-92c78fe58d-fb5d78752c.zip/node_modules/is-text-path/",\ + "packageDependencies": [\ + ["is-text-path", "npm:1.0.1"],\ + ["text-extensions", "npm:1.9.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-typed-array", [\ + ["npm:1.1.12", {\ + "packageLocation": "./.yarn/cache/is-typed-array-npm-1.1.12-6135c91b1a-d953adfd3c.zip/node_modules/is-typed-array/",\ + "packageDependencies": [\ + ["is-typed-array", "npm:1.1.12"],\ + ["which-typed-array", "npm:1.1.13"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-typedarray", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/is-typedarray-npm-1.0.0-bbd99de5b6-4b433bfb0f.zip/node_modules/is-typedarray/",\ + "packageDependencies": [\ + ["is-typedarray", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-unicode-supported", [\ + ["npm:0.1.0", {\ + "packageLocation": "./.yarn/cache/is-unicode-supported-npm-0.1.0-0833e1bbfb-a2aab86ee7.zip/node_modules/is-unicode-supported/",\ + "packageDependencies": [\ + ["is-unicode-supported", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/is-unicode-supported-npm-2.0.0-7daaafc111-000b80639d.zip/node_modules/is-unicode-supported/",\ + "packageDependencies": [\ + ["is-unicode-supported", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-url", [\ + ["npm:1.2.4", {\ + "packageLocation": "./.yarn/cache/is-url-npm-1.2.4-0a28aeb560-100e74b3b1.zip/node_modules/is-url/",\ + "packageDependencies": [\ + ["is-url", "npm:1.2.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-url-superb", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/is-url-superb-npm-4.0.0-71f6df9bc1-fd55e91c96.zip/node_modules/is-url-superb/",\ + "packageDependencies": [\ + ["is-url-superb", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-utf8", [\ + ["npm:0.2.1", {\ + "packageLocation": "./.yarn/cache/is-utf8-npm-0.2.1-46ab364e2f-167ccd2be8.zip/node_modules/is-utf8/",\ + "packageDependencies": [\ + ["is-utf8", "npm:0.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-weakref", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/is-weakref-npm-1.0.2-ff80e8c314-0023fd0e4b.zip/node_modules/is-weakref/",\ + "packageDependencies": [\ + ["is-weakref", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-windows", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/is-windows-npm-1.0.2-898cd6f3d7-438b7e5265.zip/node_modules/is-windows/",\ + "packageDependencies": [\ + ["is-windows", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-wsl", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/is-wsl-npm-3.1.0-311c6d2265-f9734c81f2.zip/node_modules/is-wsl/",\ + "packageDependencies": [\ + ["is-wsl", "npm:3.1.0"],\ + ["is-inside-container", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["isarray", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/isarray-npm-1.0.0-db4f547720-f032df8e02.zip/node_modules/isarray/",\ + "packageDependencies": [\ + ["isarray", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.5", {\ + "packageLocation": "./.yarn/cache/isarray-npm-2.0.5-4ba522212d-1d8bc7911e.zip/node_modules/isarray/",\ + "packageDependencies": [\ + ["isarray", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["isexe", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/isexe-npm-2.0.0-b58870bd2e-7c9f715c03.zip/node_modules/isexe/",\ + "packageDependencies": [\ + ["isexe", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.1.1", {\ + "packageLocation": "./.yarn/cache/isexe-npm-3.1.1-9c0061eead-7fe1931ee4.zip/node_modules/isexe/",\ + "packageDependencies": [\ + ["isexe", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["istanbul-lib-coverage", [\ + ["npm:3.2.2", {\ + "packageLocation": "./.yarn/cache/istanbul-lib-coverage-npm-3.2.2-5c0526e059-40bbdd1e93.zip/node_modules/istanbul-lib-coverage/",\ + "packageDependencies": [\ + ["istanbul-lib-coverage", "npm:3.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["istanbul-lib-report", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/istanbul-lib-report-npm-3.0.1-b17446ab24-86a83421ca.zip/node_modules/istanbul-lib-report/",\ + "packageDependencies": [\ + ["istanbul-lib-report", "npm:3.0.1"],\ + ["istanbul-lib-coverage", "npm:3.2.2"],\ + ["make-dir", "npm:4.0.0"],\ + ["supports-color", "npm:7.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["istanbul-reports", [\ + ["npm:3.1.6", {\ + "packageLocation": "./.yarn/cache/istanbul-reports-npm-3.1.6-66918eb97f-135c178e50.zip/node_modules/istanbul-reports/",\ + "packageDependencies": [\ + ["istanbul-reports", "npm:3.1.6"],\ + ["html-escaper", "npm:2.0.2"],\ + ["istanbul-lib-report", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["jackspeak", [\ + ["npm:2.3.6", {\ + "packageLocation": "./.yarn/cache/jackspeak-npm-2.3.6-42e1233172-6e6490d676.zip/node_modules/jackspeak/",\ + "packageDependencies": [\ + ["jackspeak", "npm:2.3.6"],\ + ["@isaacs/cliui", "npm:8.0.2"],\ + ["@pkgjs/parseargs", "npm:0.11.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["jiti", [\ + ["npm:1.21.0", {\ + "packageLocation": "./.yarn/cache/jiti-npm-1.21.0-baebd5985a-005a0239e5.zip/node_modules/jiti/",\ + "packageDependencies": [\ + ["jiti", "npm:1.21.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["jju", [\ + ["npm:1.4.0", {\ + "packageLocation": "./.yarn/cache/jju-npm-1.4.0-670678eaa3-1067ff8ce0.zip/node_modules/jju/",\ + "packageDependencies": [\ + ["jju", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["js-sha256", [\ + ["npm:0.9.0", {\ + "packageLocation": "./.yarn/cache/js-sha256-npm-0.9.0-1aa718efaf-4dc16be74b.zip/node_modules/js-sha256/",\ + "packageDependencies": [\ + ["js-sha256", "npm:0.9.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["js-string-escape", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/js-string-escape-npm-1.0.1-8b8d76add3-f11e0991bf.zip/node_modules/js-string-escape/",\ + "packageDependencies": [\ + ["js-string-escape", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["js-tokens", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/js-tokens-npm-4.0.0-0ac852e9e2-af37d0d913.zip/node_modules/js-tokens/",\ + "packageDependencies": [\ + ["js-tokens", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["js-yaml", [\ + ["npm:3.13.1", {\ + "packageLocation": "./.yarn/cache/js-yaml-npm-3.13.1-3a28ff3b75-cec89175b0.zip/node_modules/js-yaml/",\ + "packageDependencies": [\ + ["js-yaml", "npm:3.13.1"],\ + ["argparse", "npm:1.0.10"],\ + ["esprima", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.14.1", {\ + "packageLocation": "./.yarn/cache/js-yaml-npm-3.14.1-b968c6095e-9e22d80b4d.zip/node_modules/js-yaml/",\ + "packageDependencies": [\ + ["js-yaml", "npm:3.14.1"],\ + ["argparse", "npm:1.0.10"],\ + ["esprima", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/js-yaml-npm-4.1.0-3606f32312-c138a34a3f.zip/node_modules/js-yaml/",\ + "packageDependencies": [\ + ["js-yaml", "npm:4.1.0"],\ + ["argparse", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-buffer", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/json-buffer-npm-3.0.1-f8f6d20603-8287615452.zip/node_modules/json-buffer/",\ + "packageDependencies": [\ + ["json-buffer", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-parse-better-errors", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/json-parse-better-errors-npm-1.0.2-7f37637d19-5553232045.zip/node_modules/json-parse-better-errors/",\ + "packageDependencies": [\ + ["json-parse-better-errors", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-parse-even-better-errors", [\ + ["npm:2.3.1", {\ + "packageLocation": "./.yarn/cache/json-parse-even-better-errors-npm-2.3.1-144d62256e-5f3a99009e.zip/node_modules/json-parse-even-better-errors/",\ + "packageDependencies": [\ + ["json-parse-even-better-errors", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-schema-migrate", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/json-schema-migrate-npm-2.0.0-87745c8332-bb32718273.zip/node_modules/json-schema-migrate/",\ + "packageDependencies": [\ + ["json-schema-migrate", "npm:2.0.0"],\ + ["ajv", "npm:8.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-schema-traverse", [\ + ["npm:0.4.1", {\ + "packageLocation": "./.yarn/cache/json-schema-traverse-npm-0.4.1-4759091693-7486074d3b.zip/node_modules/json-schema-traverse/",\ + "packageDependencies": [\ + ["json-schema-traverse", "npm:0.4.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/json-schema-traverse-npm-1.0.0-fb3684f4f0-02f2f466cd.zip/node_modules/json-schema-traverse/",\ + "packageDependencies": [\ + ["json-schema-traverse", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-stable-stringify-without-jsonify", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/json-stable-stringify-without-jsonify-npm-1.0.1-b65772b28b-12786c2e2f.zip/node_modules/json-stable-stringify-without-jsonify/",\ + "packageDependencies": [\ + ["json-stable-stringify-without-jsonify", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-stringify-safe", [\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-59169a081e.zip/node_modules/json-stringify-safe/",\ + "packageDependencies": [\ + ["json-stringify-safe", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json5", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/json5-npm-1.0.2-9607f93e30-a78d812dbb.zip/node_modules/json5/",\ + "packageDependencies": [\ + ["json5", "npm:1.0.2"],\ + ["minimist", "npm:1.2.8"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.2.3", {\ + "packageLocation": "./.yarn/cache/json5-npm-2.2.3-9962c55073-1db67b853f.zip/node_modules/json5/",\ + "packageDependencies": [\ + ["json5", "npm:2.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["jsonc-parser", [\ + ["npm:3.2.0", {\ + "packageLocation": "./.yarn/cache/jsonc-parser-npm-3.2.0-1896ece3b7-bd68b902e5.zip/node_modules/jsonc-parser/",\ + "packageDependencies": [\ + ["jsonc-parser", "npm:3.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["jsonfile", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/jsonfile-npm-4.0.0-10ce3aea15-17796f0ab1.zip/node_modules/jsonfile/",\ + "packageDependencies": [\ + ["jsonfile", "npm:4.0.0"],\ + ["graceful-fs", "npm:4.2.11"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.1.0", {\ + "packageLocation": "./.yarn/cache/jsonfile-npm-6.1.0-20a4796cee-03014769e7.zip/node_modules/jsonfile/",\ + "packageDependencies": [\ + ["jsonfile", "npm:6.1.0"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["universalify", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["jsonparse", [\ + ["npm:1.3.1", {\ + "packageLocation": "./.yarn/cache/jsonparse-npm-1.3.1-b6fde74828-24531e956f.zip/node_modules/jsonparse/",\ + "packageDependencies": [\ + ["jsonparse", "npm:1.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["junk", [\ + ["npm:4.0.1", {\ + "packageLocation": "./.yarn/cache/junk-npm-4.0.1-989df0f7ae-4f0c94c0b2.zip/node_modules/junk/",\ + "packageDependencies": [\ + ["junk", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["keyv", [\ + ["npm:4.5.4", {\ + "packageLocation": "./.yarn/cache/keyv-npm-4.5.4-4c8e2cf7f7-167eb6ef64.zip/node_modules/keyv/",\ + "packageDependencies": [\ + ["keyv", "npm:4.5.4"],\ + ["json-buffer", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["kind-of", [\ + ["npm:6.0.3", {\ + "packageLocation": "./.yarn/cache/kind-of-npm-6.0.3-ab15f36220-5873d303fb.zip/node_modules/kind-of/",\ + "packageDependencies": [\ + ["kind-of", "npm:6.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["levn", [\ + ["npm:0.4.1", {\ + "packageLocation": "./.yarn/cache/levn-npm-0.4.1-d183b2d7bb-2e4720ff79.zip/node_modules/levn/",\ + "packageDependencies": [\ + ["levn", "npm:0.4.1"],\ + ["prelude-ls", "npm:1.2.1"],\ + ["type-check", "npm:0.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lines-and-columns", [\ + ["npm:1.2.4", {\ + "packageLocation": "./.yarn/cache/lines-and-columns-npm-1.2.4-d6c7cc5799-0c37f9f7fa.zip/node_modules/lines-and-columns/",\ + "packageDependencies": [\ + ["lines-and-columns", "npm:1.2.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["load-json-file", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/load-json-file-npm-4.0.0-c9f09d85eb-8f5d6d93ba.zip/node_modules/load-json-file/",\ + "packageDependencies": [\ + ["load-json-file", "npm:4.0.0"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["parse-json", "npm:4.0.0"],\ + ["pify", "npm:3.0.0"],\ + ["strip-bom", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.0.1", {\ + "packageLocation": "./.yarn/cache/load-json-file-npm-7.0.1-1d6057f4c4-a560288da6.zip/node_modules/load-json-file/",\ + "packageDependencies": [\ + ["load-json-file", "npm:7.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["locate-path", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/locate-path-npm-2.0.0-673d28b0ea-02d581edbb.zip/node_modules/locate-path/",\ + "packageDependencies": [\ + ["locate-path", "npm:2.0.0"],\ + ["p-locate", "npm:2.0.0"],\ + ["path-exists", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/locate-path-npm-3.0.0-991671ae9f-53db399667.zip/node_modules/locate-path/",\ + "packageDependencies": [\ + ["locate-path", "npm:3.0.0"],\ + ["p-locate", "npm:3.0.0"],\ + ["path-exists", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/locate-path-npm-5.0.0-46580c43e4-83e51725e6.zip/node_modules/locate-path/",\ + "packageDependencies": [\ + ["locate-path", "npm:5.0.0"],\ + ["p-locate", "npm:4.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.0", {\ + "packageLocation": "./.yarn/cache/locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip/node_modules/locate-path/",\ + "packageDependencies": [\ + ["locate-path", "npm:6.0.0"],\ + ["p-locate", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash", [\ + ["npm:4.17.21", {\ + "packageLocation": "./.yarn/cache/lodash-npm-4.17.21-6382451519-c08619c038.zip/node_modules/lodash/",\ + "packageDependencies": [\ + ["lodash", "npm:4.17.21"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.get", [\ + ["npm:4.4.2", {\ + "packageLocation": "./.yarn/cache/lodash.get-npm-4.4.2-7bda64ed87-2a4925f6e8.zip/node_modules/lodash.get/",\ + "packageDependencies": [\ + ["lodash.get", "npm:4.4.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.isequal", [\ + ["npm:4.5.0", {\ + "packageLocation": "./.yarn/cache/lodash.isequal-npm-4.5.0-f8b0f64d63-82fc58a83a.zip/node_modules/lodash.isequal/",\ + "packageDependencies": [\ + ["lodash.isequal", "npm:4.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.ismatch", [\ + ["npm:4.4.0", {\ + "packageLocation": "./.yarn/cache/lodash.ismatch-npm-4.4.0-e538fd6c3d-946a7176cd.zip/node_modules/lodash.ismatch/",\ + "packageDependencies": [\ + ["lodash.ismatch", "npm:4.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.isplainobject", [\ + ["npm:4.0.6", {\ + "packageLocation": "./.yarn/cache/lodash.isplainobject-npm-4.0.6-d73937742f-29c6351f28.zip/node_modules/lodash.isplainobject/",\ + "packageDependencies": [\ + ["lodash.isplainobject", "npm:4.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.map", [\ + ["npm:4.6.0", {\ + "packageLocation": "./.yarn/cache/lodash.map-npm-4.6.0-8013e2ad18-f1e69def35.zip/node_modules/lodash.map/",\ + "packageDependencies": [\ + ["lodash.map", "npm:4.6.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.merge", [\ + ["npm:4.6.2", {\ + "packageLocation": "./.yarn/cache/lodash.merge-npm-4.6.2-77cb4416bf-d0ea2dd009.zip/node_modules/lodash.merge/",\ + "packageDependencies": [\ + ["lodash.merge", "npm:4.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.mergewith", [\ + ["npm:4.6.2", {\ + "packageLocation": "./.yarn/cache/lodash.mergewith-npm-4.6.2-7d2d4201ec-aea75a4492.zip/node_modules/lodash.mergewith/",\ + "packageDependencies": [\ + ["lodash.mergewith", "npm:4.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.uniq", [\ + ["npm:4.5.0", {\ + "packageLocation": "./.yarn/cache/lodash.uniq-npm-4.5.0-7c270dca85-86246ca64a.zip/node_modules/lodash.uniq/",\ + "packageDependencies": [\ + ["lodash.uniq", "npm:4.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["log-symbols", [\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/log-symbols-npm-4.1.0-0a13492d8b-fce1497b31.zip/node_modules/log-symbols/",\ + "packageDependencies": [\ + ["log-symbols", "npm:4.1.0"],\ + ["chalk", "npm:4.1.2"],\ + ["is-unicode-supported", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["longest", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/longest-npm-2.0.1-4579de9937-9587c15391.zip/node_modules/longest/",\ + "packageDependencies": [\ + ["longest", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lru-cache", [\ + ["npm:10.1.0", {\ + "packageLocation": "./.yarn/cache/lru-cache-npm-10.1.0-f3d3a0f0ab-207278d6fa.zip/node_modules/lru-cache/",\ + "packageDependencies": [\ + ["lru-cache", "npm:10.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.0", {\ + "packageLocation": "./.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-fc1fe2ee20.zip/node_modules/lru-cache/",\ + "packageDependencies": [\ + ["lru-cache", "npm:6.0.0"],\ + ["yallist", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lunr", [\ + ["npm:2.3.9", {\ + "packageLocation": "./.yarn/cache/lunr-npm-2.3.9-fa3aa9c2d6-f2f6db34c0.zip/node_modules/lunr/",\ + "packageDependencies": [\ + ["lunr", "npm:2.3.9"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["madge", [\ + ["npm:6.1.0", {\ + "packageLocation": "./.yarn/cache/madge-npm-6.1.0-6e84c1d8df-80d3d54913.zip/node_modules/madge/",\ + "packageDependencies": [\ + ["madge", "npm:6.1.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.1.0", {\ + "packageLocation": "./.yarn/__virtual__/madge-virtual-c21c430715/0/cache/madge-npm-6.1.0-6e84c1d8df-80d3d54913.zip/node_modules/madge/",\ + "packageDependencies": [\ + ["madge", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.1.0"],\ + ["@types/typescript", null],\ + ["chalk", "npm:4.1.2"],\ + ["commander", "npm:7.2.0"],\ + ["commondir", "npm:1.0.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["dependency-tree", "npm:9.0.0"],\ + ["detective-amd", "npm:4.2.0"],\ + ["detective-cjs", "npm:4.1.0"],\ + ["detective-es6", "npm:3.0.1"],\ + ["detective-less", "npm:1.0.2"],\ + ["detective-postcss", "npm:6.1.3"],\ + ["detective-sass", "npm:4.1.3"],\ + ["detective-scss", "npm:3.1.1"],\ + ["detective-stylus", "npm:2.0.1"],\ + ["detective-typescript", "npm:9.1.1"],\ + ["ora", "npm:5.4.1"],\ + ["pluralize", "npm:8.0.0"],\ + ["precinct", "npm:8.3.1"],\ + ["pretty-ms", "npm:7.0.1"],\ + ["rc", "npm:1.2.8"],\ + ["stream-to-array", "npm:2.3.0"],\ + ["ts-graphviz", "npm:1.8.1"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"],\ + ["walkdir", "npm:0.4.1"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["magic-string", [\ + ["npm:0.30.5", {\ + "packageLocation": "./.yarn/cache/magic-string-npm-0.30.5-dffb7e6a73-c8a6b25f81.zip/node_modules/magic-string/",\ + "packageDependencies": [\ + ["magic-string", "npm:0.30.5"],\ + ["@jridgewell/sourcemap-codec", "npm:1.4.15"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["make-dir", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/make-dir-npm-3.1.0-d1d7505142-484200020a.zip/node_modules/make-dir/",\ + "packageDependencies": [\ + ["make-dir", "npm:3.1.0"],\ + ["semver", "npm:6.3.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/make-dir-npm-4.0.0-ec3cd921cc-bf0731a2dd.zip/node_modules/make-dir/",\ + "packageDependencies": [\ + ["make-dir", "npm:4.0.0"],\ + ["semver", "npm:7.5.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["make-fetch-happen", [\ + ["npm:13.0.0", {\ + "packageLocation": "./.yarn/cache/make-fetch-happen-npm-13.0.0-f87a92bb87-ded5a91a02.zip/node_modules/make-fetch-happen/",\ + "packageDependencies": [\ + ["make-fetch-happen", "npm:13.0.0"],\ + ["@npmcli/agent", "npm:2.2.0"],\ + ["cacache", "npm:18.0.2"],\ + ["http-cache-semantics", "npm:4.1.1"],\ + ["is-lambda", "npm:1.0.1"],\ + ["minipass", "npm:7.0.4"],\ + ["minipass-fetch", "npm:3.0.4"],\ + ["minipass-flush", "npm:1.0.5"],\ + ["minipass-pipeline", "npm:1.2.4"],\ + ["negotiator", "npm:0.6.3"],\ + ["promise-retry", "npm:2.0.1"],\ + ["ssri", "npm:10.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["map-obj", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/map-obj-npm-1.0.1-fa55100fac-f8e6fc7f61.zip/node_modules/map-obj/",\ + "packageDependencies": [\ + ["map-obj", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.3.0", {\ + "packageLocation": "./.yarn/cache/map-obj-npm-4.3.0-d53e32935d-fbc554934d.zip/node_modules/map-obj/",\ + "packageDependencies": [\ + ["map-obj", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["marked", [\ + ["npm:4.3.0", {\ + "packageLocation": "./.yarn/cache/marked-npm-4.3.0-e7ef9e874f-c830bb4cb3.zip/node_modules/marked/",\ + "packageDependencies": [\ + ["marked", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["matcher", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/matcher-npm-5.0.0-426d06a4f6-28f191c2d2.zip/node_modules/matcher/",\ + "packageDependencies": [\ + ["matcher", "npm:5.0.0"],\ + ["escape-string-regexp", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["md5-hex", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/md5-hex-npm-3.0.1-d9f5f267ed-4af5252998.zip/node_modules/md5-hex/",\ + "packageDependencies": [\ + ["md5-hex", "npm:3.0.1"],\ + ["blueimp-md5", "npm:2.19.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["media-typer", [\ + ["npm:0.3.0", {\ + "packageLocation": "./.yarn/cache/media-typer-npm-0.3.0-8674f8f0f5-38e0984db3.zip/node_modules/media-typer/",\ + "packageDependencies": [\ + ["media-typer", "npm:0.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["memoize", [\ + ["npm:10.0.0", {\ + "packageLocation": "./.yarn/cache/memoize-npm-10.0.0-953b145644-2239451cc0.zip/node_modules/memoize/",\ + "packageDependencies": [\ + ["memoize", "npm:10.0.0"],\ + ["mimic-function", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["meow", [\ + ["npm:12.1.1", {\ + "packageLocation": "./.yarn/cache/meow-npm-12.1.1-bd7858d088-8594c319f4.zip/node_modules/meow/",\ + "packageDependencies": [\ + ["meow", "npm:12.1.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.1.2", {\ + "packageLocation": "./.yarn/cache/meow-npm-8.1.2-bcfe48d4f3-d4770f9013.zip/node_modules/meow/",\ + "packageDependencies": [\ + ["meow", "npm:8.1.2"],\ + ["@types/minimist", "npm:1.2.5"],\ + ["camelcase-keys", "npm:6.2.2"],\ + ["decamelize-keys", "npm:1.1.1"],\ + ["hard-rejection", "npm:2.1.0"],\ + ["minimist-options", "npm:4.1.0"],\ + ["normalize-package-data", "npm:3.0.3"],\ + ["read-pkg-up", "npm:7.0.1"],\ + ["redent", "npm:3.0.0"],\ + ["trim-newlines", "npm:3.0.1"],\ + ["type-fest", "npm:0.18.1"],\ + ["yargs-parser", "npm:20.2.9"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["merge", [\ + ["npm:2.1.1", {\ + "packageLocation": "./.yarn/cache/merge-npm-2.1.1-90e7307c49-1875521a8e.zip/node_modules/merge/",\ + "packageDependencies": [\ + ["merge", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["merge-descriptors", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/merge-descriptors-npm-1.0.1-615287aaa8-5abc259d2a.zip/node_modules/merge-descriptors/",\ + "packageDependencies": [\ + ["merge-descriptors", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["merge-stream", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/merge-stream-npm-2.0.0-2ac83efea5-6fa4dcc8d8.zip/node_modules/merge-stream/",\ + "packageDependencies": [\ + ["merge-stream", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["merge2", [\ + ["npm:1.4.1", {\ + "packageLocation": "./.yarn/cache/merge2-npm-1.4.1-a2507bd06c-7268db63ed.zip/node_modules/merge2/",\ + "packageDependencies": [\ + ["merge2", "npm:1.4.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["methods", [\ + ["npm:1.1.2", {\ + "packageLocation": "./.yarn/cache/methods-npm-1.1.2-92f6fdb39b-a385dd974f.zip/node_modules/methods/",\ + "packageDependencies": [\ + ["methods", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["micromatch", [\ + ["npm:4.0.5", {\ + "packageLocation": "./.yarn/cache/micromatch-npm-4.0.5-cfab5d7669-a749888789.zip/node_modules/micromatch/",\ + "packageDependencies": [\ + ["micromatch", "npm:4.0.5"],\ + ["braces", "npm:3.0.2"],\ + ["picomatch", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mime", [\ + ["npm:1.6.0", {\ + "packageLocation": "./.yarn/cache/mime-npm-1.6.0-60ae95038a-b7d98bb1e0.zip/node_modules/mime/",\ + "packageDependencies": [\ + ["mime", "npm:1.6.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mime-db", [\ + ["npm:1.52.0", {\ + "packageLocation": "./.yarn/cache/mime-db-npm-1.52.0-b5371d6fd2-54bb60bf39.zip/node_modules/mime-db/",\ + "packageDependencies": [\ + ["mime-db", "npm:1.52.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mime-types", [\ + ["npm:2.1.35", {\ + "packageLocation": "./.yarn/cache/mime-types-npm-2.1.35-dd9ea9f3e2-89aa9651b6.zip/node_modules/mime-types/",\ + "packageDependencies": [\ + ["mime-types", "npm:2.1.35"],\ + ["mime-db", "npm:1.52.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mimic-fn", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/mimic-fn-npm-2.1.0-4fbeb3abb4-d2421a3444.zip/node_modules/mimic-fn/",\ + "packageDependencies": [\ + ["mimic-fn", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/mimic-fn-npm-4.0.0-feaeda79f7-995dcece15.zip/node_modules/mimic-fn/",\ + "packageDependencies": [\ + ["mimic-fn", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mimic-function", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/mimic-function-npm-5.0.0-b0334c4f46-1cb53bc250.zip/node_modules/mimic-function/",\ + "packageDependencies": [\ + ["mimic-function", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["min-indent", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/min-indent-npm-1.0.1-77031f50e1-bfc6dd03c5.zip/node_modules/min-indent/",\ + "packageDependencies": [\ + ["min-indent", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minimalistic-assert", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/minimalistic-assert-npm-1.0.1-dc8bb23d29-cc7974a926.zip/node_modules/minimalistic-assert/",\ + "packageDependencies": [\ + ["minimalistic-assert", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minimalistic-crypto-utils", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/minimalistic-crypto-utils-npm-1.0.1-e66b10822e-6e8a0422b3.zip/node_modules/minimalistic-crypto-utils/",\ + "packageDependencies": [\ + ["minimalistic-crypto-utils", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minimatch", [\ + ["npm:3.1.2", {\ + "packageLocation": "./.yarn/cache/minimatch-npm-3.1.2-9405269906-e0b25b04cd.zip/node_modules/minimatch/",\ + "packageDependencies": [\ + ["minimatch", "npm:3.1.2"],\ + ["brace-expansion", "npm:1.1.11"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.1.6", {\ + "packageLocation": "./.yarn/cache/minimatch-npm-5.1.6-1e71429f4c-126b36485b.zip/node_modules/minimatch/",\ + "packageDependencies": [\ + ["minimatch", "npm:5.1.6"],\ + ["brace-expansion", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:9.0.3", {\ + "packageLocation": "./.yarn/cache/minimatch-npm-9.0.3-69d7d6fad5-c81b47d281.zip/node_modules/minimatch/",\ + "packageDependencies": [\ + ["minimatch", "npm:9.0.3"],\ + ["brace-expansion", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minimist", [\ + ["npm:1.2.7", {\ + "packageLocation": "./.yarn/cache/minimist-npm-1.2.7-51d33b1371-0202378a8e.zip/node_modules/minimist/",\ + "packageDependencies": [\ + ["minimist", "npm:1.2.7"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:1.2.8", {\ + "packageLocation": "./.yarn/cache/minimist-npm-1.2.8-d7af7b1dce-908491b6cc.zip/node_modules/minimist/",\ + "packageDependencies": [\ + ["minimist", "npm:1.2.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minimist-options", [\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/minimist-options-npm-4.1.0-64ca250fc1-8c040b3068.zip/node_modules/minimist-options/",\ + "packageDependencies": [\ + ["minimist-options", "npm:4.1.0"],\ + ["arrify", "npm:1.0.1"],\ + ["is-plain-obj", "npm:1.1.0"],\ + ["kind-of", "npm:6.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minipass", [\ + ["npm:3.3.6", {\ + "packageLocation": "./.yarn/cache/minipass-npm-3.3.6-b8d93a945b-a5c6ef069f.zip/node_modules/minipass/",\ + "packageDependencies": [\ + ["minipass", "npm:3.3.6"],\ + ["yallist", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/minipass-npm-5.0.0-c64fb63c92-61682162d2.zip/node_modules/minipass/",\ + "packageDependencies": [\ + ["minipass", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.0.4", {\ + "packageLocation": "./.yarn/cache/minipass-npm-7.0.4-eacb4e042e-e864bd02ce.zip/node_modules/minipass/",\ + "packageDependencies": [\ + ["minipass", "npm:7.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minipass-collect", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/minipass-collect-npm-2.0.1-73d3907e40-b251bceea6.zip/node_modules/minipass-collect/",\ + "packageDependencies": [\ + ["minipass-collect", "npm:2.0.1"],\ + ["minipass", "npm:7.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minipass-fetch", [\ + ["npm:3.0.4", {\ + "packageLocation": "./.yarn/cache/minipass-fetch-npm-3.0.4-200ac7c66d-3edf72b900.zip/node_modules/minipass-fetch/",\ + "packageDependencies": [\ + ["minipass-fetch", "npm:3.0.4"],\ + ["encoding", "npm:0.1.13"],\ + ["minipass", "npm:7.0.4"],\ + ["minipass-sized", "npm:1.0.3"],\ + ["minizlib", "npm:2.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minipass-flush", [\ + ["npm:1.0.5", {\ + "packageLocation": "./.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip/node_modules/minipass-flush/",\ + "packageDependencies": [\ + ["minipass-flush", "npm:1.0.5"],\ + ["minipass", "npm:3.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minipass-pipeline", [\ + ["npm:1.2.4", {\ + "packageLocation": "./.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip/node_modules/minipass-pipeline/",\ + "packageDependencies": [\ + ["minipass-pipeline", "npm:1.2.4"],\ + ["minipass", "npm:3.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minipass-sized", [\ + ["npm:1.0.3", {\ + "packageLocation": "./.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-40982d8d83.zip/node_modules/minipass-sized/",\ + "packageDependencies": [\ + ["minipass-sized", "npm:1.0.3"],\ + ["minipass", "npm:3.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minizlib", [\ + ["npm:2.1.2", {\ + "packageLocation": "./.yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-ae0f45436f.zip/node_modules/minizlib/",\ + "packageDependencies": [\ + ["minizlib", "npm:2.1.2"],\ + ["minipass", "npm:3.3.6"],\ + ["yallist", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mkdirp", [\ + ["npm:1.0.4", {\ + "packageLocation": "./.yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-d71b8dcd4b.zip/node_modules/mkdirp/",\ + "packageDependencies": [\ + ["mkdirp", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["modify-values", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/modify-values-npm-1.0.1-9b2377e166-16fa93f7dd.zip/node_modules/modify-values/",\ + "packageDependencies": [\ + ["modify-values", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["module-definition", [\ + ["npm:3.4.0", {\ + "packageLocation": "./.yarn/cache/module-definition-npm-3.4.0-2eb7522283-5cbfd38aab.zip/node_modules/module-definition/",\ + "packageDependencies": [\ + ["module-definition", "npm:3.4.0"],\ + ["ast-module-types", "npm:3.0.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/module-definition-npm-4.1.0-d712dfff19-d9b6397c9b.zip/node_modules/module-definition/",\ + "packageDependencies": [\ + ["module-definition", "npm:4.1.0"],\ + ["ast-module-types", "npm:4.0.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["module-lookup-amd", [\ + ["npm:7.0.1", {\ + "packageLocation": "./.yarn/cache/module-lookup-amd-npm-7.0.1-83d0a3e93f-dadf8c602d.zip/node_modules/module-lookup-amd/",\ + "packageDependencies": [\ + ["module-lookup-amd", "npm:7.0.1"],\ + ["commander", "npm:2.20.3"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["glob", "npm:7.2.3"],\ + ["requirejs", "npm:2.3.6"],\ + ["requirejs-config-file", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ms", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/ms-npm-2.0.0-9e1101a471-0e6a22b8b7.zip/node_modules/ms/",\ + "packageDependencies": [\ + ["ms", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.1.2", {\ + "packageLocation": "./.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip/node_modules/ms/",\ + "packageDependencies": [\ + ["ms", "npm:2.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.1.3", {\ + "packageLocation": "./.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip/node_modules/ms/",\ + "packageDependencies": [\ + ["ms", "npm:2.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mute-stream", [\ + ["npm:0.0.8", {\ + "packageLocation": "./.yarn/cache/mute-stream-npm-0.0.8-489a7d6c2b-a2d2e79dde.zip/node_modules/mute-stream/",\ + "packageDependencies": [\ + ["mute-stream", "npm:0.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["nanoid", [\ + ["npm:3.3.7", {\ + "packageLocation": "./.yarn/cache/nanoid-npm-3.3.7-98824ba130-ac1eb60f61.zip/node_modules/nanoid/",\ + "packageDependencies": [\ + ["nanoid", "npm:3.3.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["natural-compare", [\ + ["npm:1.4.0", {\ + "packageLocation": "./.yarn/cache/natural-compare-npm-1.4.0-97b75b362d-23ad088b08.zip/node_modules/natural-compare/",\ + "packageDependencies": [\ + ["natural-compare", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["negotiator", [\ + ["npm:0.6.3", {\ + "packageLocation": "./.yarn/cache/negotiator-npm-0.6.3-9d50e36171-2723fb822a.zip/node_modules/negotiator/",\ + "packageDependencies": [\ + ["negotiator", "npm:0.6.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["neo-async", [\ + ["npm:2.6.2", {\ + "packageLocation": "./.yarn/cache/neo-async-npm-2.6.2-75d6902586-1a7948fea8.zip/node_modules/neo-async/",\ + "packageDependencies": [\ + ["neo-async", "npm:2.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["nested-error-stacks", [\ + ["npm:2.1.1", {\ + "packageLocation": "./.yarn/cache/nested-error-stacks-npm-2.1.1-0b1da05af0-5f452fad75.zip/node_modules/nested-error-stacks/",\ + "packageDependencies": [\ + ["nested-error-stacks", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["node-addon-api", [\ + ["npm:5.1.0", {\ + "packageLocation": "./.yarn/unplugged/node-addon-api-npm-5.1.0-b50d00f739/node_modules/node-addon-api/",\ + "packageDependencies": [\ + ["node-addon-api", "npm:5.1.0"],\ + ["node-gyp", "npm:10.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["node-fetch", [\ + ["npm:2.7.0", {\ + "packageLocation": "./.yarn/cache/node-fetch-npm-2.7.0-587d57004e-b24f8a3dc9.zip/node_modules/node-fetch/",\ + "packageDependencies": [\ + ["node-fetch", "npm:2.7.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5547f15a2bb3d361d141532d43f94523f31e9edfe533f8367b3e26e300194e2978be03f56c09e100afcfee4c02b7fbe13c6ffcf58c613b457a86da522a2979f2#npm:2.7.0", {\ + "packageLocation": "./.yarn/__virtual__/node-fetch-virtual-64b33d0816/0/cache/node-fetch-npm-2.7.0-587d57004e-b24f8a3dc9.zip/node_modules/node-fetch/",\ + "packageDependencies": [\ + ["node-fetch", "virtual:5547f15a2bb3d361d141532d43f94523f31e9edfe533f8367b3e26e300194e2978be03f56c09e100afcfee4c02b7fbe13c6ffcf58c613b457a86da522a2979f2#npm:2.7.0"],\ + ["@types/encoding", null],\ + ["encoding", null],\ + ["whatwg-url", "npm:5.0.0"]\ + ],\ + "packagePeers": [\ + "@types/encoding",\ + "encoding"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["node-gyp", [\ + ["npm:10.0.1", {\ + "packageLocation": "./.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/",\ + "packageDependencies": [\ + ["node-gyp", "npm:10.0.1"],\ + ["env-paths", "npm:2.2.1"],\ + ["exponential-backoff", "npm:3.1.1"],\ + ["glob", "npm:10.3.10"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["make-fetch-happen", "npm:13.0.0"],\ + ["nopt", "npm:7.2.0"],\ + ["proc-log", "npm:3.0.0"],\ + ["semver", "npm:7.5.4"],\ + ["tar", "npm:6.2.0"],\ + ["which", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["node-gyp-build", [\ + ["npm:4.7.1", {\ + "packageLocation": "./.yarn/cache/node-gyp-build-npm-4.7.1-8824d23d05-3f6780a24d.zip/node_modules/node-gyp-build/",\ + "packageDependencies": [\ + ["node-gyp-build", "npm:4.7.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["node-source-walk", [\ + ["npm:4.3.0", {\ + "packageLocation": "./.yarn/cache/node-source-walk-npm-4.3.0-16523f4a14-3145f4b907.zip/node_modules/node-source-walk/",\ + "packageDependencies": [\ + ["node-source-walk", "npm:4.3.0"],\ + ["@babel/parser", "npm:7.23.6"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.2", {\ + "packageLocation": "./.yarn/cache/node-source-walk-npm-5.0.2-c417ba875a-cbb474a80a.zip/node_modules/node-source-walk/",\ + "packageDependencies": [\ + ["node-source-walk", "npm:5.0.2"],\ + ["@babel/parser", "npm:7.23.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["nofilter", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/nofilter-npm-3.1.0-3c5ba47d92-f63d87231d.zip/node_modules/nofilter/",\ + "packageDependencies": [\ + ["nofilter", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["nopt", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/nopt-npm-5.0.0-304b40fbfe-00f9bb2d16.zip/node_modules/nopt/",\ + "packageDependencies": [\ + ["nopt", "npm:5.0.0"],\ + ["abbrev", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.2.0", {\ + "packageLocation": "./.yarn/cache/nopt-npm-7.2.0-dd734b678d-1e7489f17c.zip/node_modules/nopt/",\ + "packageDependencies": [\ + ["nopt", "npm:7.2.0"],\ + ["abbrev", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["normalize-package-data", [\ + ["npm:2.5.0", {\ + "packageLocation": "./.yarn/cache/normalize-package-data-npm-2.5.0-af0345deed-644f830a8b.zip/node_modules/normalize-package-data/",\ + "packageDependencies": [\ + ["normalize-package-data", "npm:2.5.0"],\ + ["hosted-git-info", "npm:2.8.9"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["semver", "npm:5.7.2"],\ + ["validate-npm-package-license", "npm:3.0.4"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.3", {\ + "packageLocation": "./.yarn/cache/normalize-package-data-npm-3.0.3-1a49056685-3cd3b438c9.zip/node_modules/normalize-package-data/",\ + "packageDependencies": [\ + ["normalize-package-data", "npm:3.0.3"],\ + ["hosted-git-info", "npm:4.1.0"],\ + ["is-core-module", "npm:2.13.1"],\ + ["semver", "npm:7.5.4"],\ + ["validate-npm-package-license", "npm:3.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["normalize-path", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip/node_modules/normalize-path/",\ + "packageDependencies": [\ + ["normalize-path", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["npm-run-path", [\ + ["npm:5.2.0", {\ + "packageLocation": "./.yarn/cache/npm-run-path-npm-5.2.0-f449a9c258-c5325e0160.zip/node_modules/npm-run-path/",\ + "packageDependencies": [\ + ["npm-run-path", "npm:5.2.0"],\ + ["path-key", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["npmlog", [\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/npmlog-npm-5.0.1-366cab64a2-f42c7b9584.zip/node_modules/npmlog/",\ + "packageDependencies": [\ + ["npmlog", "npm:5.0.1"],\ + ["are-we-there-yet", "npm:2.0.0"],\ + ["console-control-strings", "npm:1.1.0"],\ + ["gauge", "npm:3.0.2"],\ + ["set-blocking", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object-assign", [\ + ["npm:4.1.1", {\ + "packageLocation": "./.yarn/cache/object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip/node_modules/object-assign/",\ + "packageDependencies": [\ + ["object-assign", "npm:4.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object-inspect", [\ + ["npm:1.13.1", {\ + "packageLocation": "./.yarn/cache/object-inspect-npm-1.13.1-fd038a2f0a-92f4989ed8.zip/node_modules/object-inspect/",\ + "packageDependencies": [\ + ["object-inspect", "npm:1.13.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object-keys", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/object-keys-npm-1.1.1-1bf2f1be93-3d81d02674.zip/node_modules/object-keys/",\ + "packageDependencies": [\ + ["object-keys", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object.assign", [\ + ["npm:4.1.5", {\ + "packageLocation": "./.yarn/cache/object.assign-npm-4.1.5-aa3b2260ba-dbb22da4cd.zip/node_modules/object.assign/",\ + "packageDependencies": [\ + ["object.assign", "npm:4.1.5"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["has-symbols", "npm:1.0.3"],\ + ["object-keys", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object.fromentries", [\ + ["npm:2.0.7", {\ + "packageLocation": "./.yarn/cache/object.fromentries-npm-2.0.7-2e38392540-1bfbe42a51.zip/node_modules/object.fromentries/",\ + "packageDependencies": [\ + ["object.fromentries", "npm:2.0.7"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object.groupby", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/object.groupby-npm-1.0.1-fc268391fe-b7123d9140.zip/node_modules/object.groupby/",\ + "packageDependencies": [\ + ["object.groupby", "npm:1.0.1"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["get-intrinsic", "npm:1.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object.values", [\ + ["npm:1.1.7", {\ + "packageLocation": "./.yarn/cache/object.values-npm-1.1.7-deae619f88-20ab42c0bb.zip/node_modules/object.values/",\ + "packageDependencies": [\ + ["object.values", "npm:1.1.7"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["on-finished", [\ + ["npm:2.4.1", {\ + "packageLocation": "./.yarn/cache/on-finished-npm-2.4.1-907af70f88-8e81472c50.zip/node_modules/on-finished/",\ + "packageDependencies": [\ + ["on-finished", "npm:2.4.1"],\ + ["ee-first", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["once", [\ + ["npm:1.4.0", {\ + "packageLocation": "./.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip/node_modules/once/",\ + "packageDependencies": [\ + ["once", "npm:1.4.0"],\ + ["wrappy", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["onetime", [\ + ["npm:5.1.2", {\ + "packageLocation": "./.yarn/cache/onetime-npm-5.1.2-3ed148fa42-e9fd0695a0.zip/node_modules/onetime/",\ + "packageDependencies": [\ + ["onetime", "npm:5.1.2"],\ + ["mimic-fn", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.0", {\ + "packageLocation": "./.yarn/cache/onetime-npm-6.0.0-4f3684e29a-0846ce78e4.zip/node_modules/onetime/",\ + "packageDependencies": [\ + ["onetime", "npm:6.0.0"],\ + ["mimic-fn", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["open", [\ + ["npm:10.0.2", {\ + "packageLocation": "./.yarn/unplugged/open-npm-10.0.2-f2872865de/node_modules/open/",\ + "packageDependencies": [\ + ["open", "npm:10.0.2"],\ + ["default-browser", "npm:5.2.1"],\ + ["define-lazy-prop", "npm:3.0.0"],\ + ["is-inside-container", "npm:1.0.0"],\ + ["is-wsl", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["open-cli", [\ + ["npm:8.0.0", {\ + "packageLocation": "./.yarn/cache/open-cli-npm-8.0.0-5153900672-2206724f05.zip/node_modules/open-cli/",\ + "packageDependencies": [\ + ["open-cli", "npm:8.0.0"],\ + ["file-type", "npm:18.7.0"],\ + ["get-stdin", "npm:9.0.0"],\ + ["meow", "npm:12.1.1"],\ + ["open", "npm:10.0.2"],\ + ["tempy", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["optionator", [\ + ["npm:0.9.3", {\ + "packageLocation": "./.yarn/cache/optionator-npm-0.9.3-56c3a4bf80-fa28d30163.zip/node_modules/optionator/",\ + "packageDependencies": [\ + ["optionator", "npm:0.9.3"],\ + ["@aashutoshrathi/word-wrap", "npm:1.2.6"],\ + ["deep-is", "npm:0.1.4"],\ + ["fast-levenshtein", "npm:2.0.6"],\ + ["levn", "npm:0.4.1"],\ + ["prelude-ls", "npm:1.2.1"],\ + ["type-check", "npm:0.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ora", [\ + ["npm:5.4.1", {\ + "packageLocation": "./.yarn/cache/ora-npm-5.4.1-4f0343adb7-8d071828f4.zip/node_modules/ora/",\ + "packageDependencies": [\ + ["ora", "npm:5.4.1"],\ + ["bl", "npm:4.1.0"],\ + ["chalk", "npm:4.1.2"],\ + ["cli-cursor", "npm:3.1.0"],\ + ["cli-spinners", "npm:2.9.2"],\ + ["is-interactive", "npm:1.0.0"],\ + ["is-unicode-supported", "npm:0.1.0"],\ + ["log-symbols", "npm:4.1.0"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["wcwidth", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["os-tmpdir", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/os-tmpdir-npm-1.0.2-e305b0689b-5666560f7b.zip/node_modules/os-tmpdir/",\ + "packageDependencies": [\ + ["os-tmpdir", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-event", [\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/p-event-npm-5.0.1-1f7dfbcfb3-755a737e3d.zip/node_modules/p-event/",\ + "packageDependencies": [\ + ["p-event", "npm:5.0.1"],\ + ["p-timeout", "npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-filter", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/p-filter-npm-3.0.0-6c8ee98212-aacc36820f.zip/node_modules/p-filter/",\ + "packageDependencies": [\ + ["p-filter", "npm:3.0.0"],\ + ["p-map", "npm:5.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-limit", [\ + ["npm:1.3.0", {\ + "packageLocation": "./.yarn/cache/p-limit-npm-1.3.0-fdb471d864-eb9d9bc378.zip/node_modules/p-limit/",\ + "packageDependencies": [\ + ["p-limit", "npm:1.3.0"],\ + ["p-try", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.3.0", {\ + "packageLocation": "./.yarn/cache/p-limit-npm-2.3.0-94a0310039-84ff17f1a3.zip/node_modules/p-limit/",\ + "packageDependencies": [\ + ["p-limit", "npm:2.3.0"],\ + ["p-try", "npm:2.2.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/p-limit-npm-3.1.0-05d2ede37f-7c3690c4db.zip/node_modules/p-limit/",\ + "packageDependencies": [\ + ["p-limit", "npm:3.1.0"],\ + ["yocto-queue", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-locate", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/p-locate-npm-2.0.0-3a2ee263dd-e2dceb9b49.zip/node_modules/p-locate/",\ + "packageDependencies": [\ + ["p-locate", "npm:2.0.0"],\ + ["p-limit", "npm:1.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/p-locate-npm-3.0.0-74de74f952-83991734a9.zip/node_modules/p-locate/",\ + "packageDependencies": [\ + ["p-locate", "npm:3.0.0"],\ + ["p-limit", "npm:2.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/p-locate-npm-4.1.0-eec6872537-513bd14a45.zip/node_modules/p-locate/",\ + "packageDependencies": [\ + ["p-locate", "npm:4.1.0"],\ + ["p-limit", "npm:2.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/p-locate-npm-5.0.0-92cc7c7a3e-1623088f36.zip/node_modules/p-locate/",\ + "packageDependencies": [\ + ["p-locate", "npm:5.0.0"],\ + ["p-limit", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-map", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/p-map-npm-4.0.0-4677ae07c7-7ba4a2b1e2.zip/node_modules/p-map/",\ + "packageDependencies": [\ + ["p-map", "npm:4.0.0"],\ + ["aggregate-error", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.5.0", {\ + "packageLocation": "./.yarn/cache/p-map-npm-5.5.0-9758eb14ee-089a709d25.zip/node_modules/p-map/",\ + "packageDependencies": [\ + ["p-map", "npm:5.5.0"],\ + ["aggregate-error", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.0", {\ + "packageLocation": "./.yarn/cache/p-map-npm-6.0.0-9994e631f1-1fd59257b3.zip/node_modules/p-map/",\ + "packageDependencies": [\ + ["p-map", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-timeout", [\ + ["npm:5.1.0", {\ + "packageLocation": "./.yarn/cache/p-timeout-npm-5.1.0-11ca554b60-f5cd4e1730.zip/node_modules/p-timeout/",\ + "packageDependencies": [\ + ["p-timeout", "npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-try", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/p-try-npm-1.0.0-7373139e40-20d9735f57.zip/node_modules/p-try/",\ + "packageDependencies": [\ + ["p-try", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.2.0", {\ + "packageLocation": "./.yarn/cache/p-try-npm-2.2.0-e0390dbaf8-f8a8e9a769.zip/node_modules/p-try/",\ + "packageDependencies": [\ + ["p-try", "npm:2.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["package-config", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/package-config-npm-5.0.0-55054b7db9-dfff5264c5.zip/node_modules/package-config/",\ + "packageDependencies": [\ + ["package-config", "npm:5.0.0"],\ + ["find-up-simple", "npm:1.0.0"],\ + ["load-json-file", "npm:7.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["parent-module", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/parent-module-npm-1.0.1-1fae11b095-6ba8b25514.zip/node_modules/parent-module/",\ + "packageDependencies": [\ + ["parent-module", "npm:1.0.1"],\ + ["callsites", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/parent-module-npm-2.0.0-8434b3cd79-f131f13d68.zip/node_modules/parent-module/",\ + "packageDependencies": [\ + ["parent-module", "npm:2.0.0"],\ + ["callsites", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["parse-json", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/parse-json-npm-4.0.0-a6f7771010-0fe227d410.zip/node_modules/parse-json/",\ + "packageDependencies": [\ + ["parse-json", "npm:4.0.0"],\ + ["error-ex", "npm:1.3.2"],\ + ["json-parse-better-errors", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.2.0", {\ + "packageLocation": "./.yarn/cache/parse-json-npm-5.2.0-00a63b1199-62085b17d6.zip/node_modules/parse-json/",\ + "packageDependencies": [\ + ["parse-json", "npm:5.2.0"],\ + ["@babel/code-frame", "npm:7.23.5"],\ + ["error-ex", "npm:1.3.2"],\ + ["json-parse-even-better-errors", "npm:2.3.1"],\ + ["lines-and-columns", "npm:1.2.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["parse-ms", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/parse-ms-npm-2.1.0-de852c39bb-517eab80cd.zip/node_modules/parse-ms/",\ + "packageDependencies": [\ + ["parse-ms", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/parse-ms-npm-3.0.0-3acf02c3f3-fc602bba09.zip/node_modules/parse-ms/",\ + "packageDependencies": [\ + ["parse-ms", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["parse-passwd", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/parse-passwd-npm-1.0.0-ace6effa1d-4e55e0231d.zip/node_modules/parse-passwd/",\ + "packageDependencies": [\ + ["parse-passwd", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["parseurl", [\ + ["npm:1.3.3", {\ + "packageLocation": "./.yarn/cache/parseurl-npm-1.3.3-1542397e00-407cee8e0a.zip/node_modules/parseurl/",\ + "packageDependencies": [\ + ["parseurl", "npm:1.3.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-exists", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/path-exists-npm-3.0.0-e80371aa68-96e92643aa.zip/node_modules/path-exists/",\ + "packageDependencies": [\ + ["path-exists", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip/node_modules/path-exists/",\ + "packageDependencies": [\ + ["path-exists", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-is-absolute", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip/node_modules/path-is-absolute/",\ + "packageDependencies": [\ + ["path-is-absolute", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-key", [\ + ["npm:3.1.1", {\ + "packageLocation": "./.yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip/node_modules/path-key/",\ + "packageDependencies": [\ + ["path-key", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/path-key-npm-4.0.0-2bce99f089-8e6c314ae6.zip/node_modules/path-key/",\ + "packageDependencies": [\ + ["path-key", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-parse", [\ + ["npm:1.0.7", {\ + "packageLocation": "./.yarn/cache/path-parse-npm-1.0.7-09564527b7-49abf3d811.zip/node_modules/path-parse/",\ + "packageDependencies": [\ + ["path-parse", "npm:1.0.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-scurry", [\ + ["npm:1.10.1", {\ + "packageLocation": "./.yarn/cache/path-scurry-npm-1.10.1-52bd946f2e-eebfb8304f.zip/node_modules/path-scurry/",\ + "packageDependencies": [\ + ["path-scurry", "npm:1.10.1"],\ + ["lru-cache", "npm:10.1.0"],\ + ["minipass", "npm:7.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-to-regexp", [\ + ["npm:0.1.7", {\ + "packageLocation": "./.yarn/cache/path-to-regexp-npm-0.1.7-2605347373-701c99e1f0.zip/node_modules/path-to-regexp/",\ + "packageDependencies": [\ + ["path-to-regexp", "npm:0.1.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-type", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/path-type-npm-3.0.0-252361a0eb-735b35e256.zip/node_modules/path-type/",\ + "packageDependencies": [\ + ["path-type", "npm:3.0.0"],\ + ["pify", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/path-type-npm-4.0.0-10d47fc86a-5b1e2daa24.zip/node_modules/path-type/",\ + "packageDependencies": [\ + ["path-type", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/path-type-npm-5.0.0-205dd6bae0-15ec24050e.zip/node_modules/path-type/",\ + "packageDependencies": [\ + ["path-type", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["peek-readable", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/peek-readable-npm-5.0.0-c469f805e3-d342f02dd0.zip/node_modules/peek-readable/",\ + "packageDependencies": [\ + ["peek-readable", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["picocolors", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/picocolors-npm-1.0.0-d81e0b1927-a2e8092dd8.zip/node_modules/picocolors/",\ + "packageDependencies": [\ + ["picocolors", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["picomatch", [\ + ["npm:2.3.1", {\ + "packageLocation": "./.yarn/cache/picomatch-npm-2.3.1-c782cfd986-60c2595003.zip/node_modules/picomatch/",\ + "packageDependencies": [\ + ["picomatch", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/picomatch-npm-3.0.1-89bec5c025-65ac837fed.zip/node_modules/picomatch/",\ + "packageDependencies": [\ + ["picomatch", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["pify", [\ + ["npm:2.3.0", {\ + "packageLocation": "./.yarn/cache/pify-npm-2.3.0-8b63310934-9503aaeaf4.zip/node_modules/pify/",\ + "packageDependencies": [\ + ["pify", "npm:2.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/pify-npm-3.0.0-679ee405c8-668c1dc8d9.zip/node_modules/pify/",\ + "packageDependencies": [\ + ["pify", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["platform", [\ + ["npm:1.3.6", {\ + "packageLocation": "./.yarn/cache/platform-npm-1.3.6-8c3cef9352-1f2d8333e2.zip/node_modules/platform/",\ + "packageDependencies": [\ + ["platform", "npm:1.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["playwright", [\ + ["npm:1.40.1", {\ + "packageLocation": "./.yarn/cache/playwright-npm-1.40.1-68ec3f34c0-95cf79f157.zip/node_modules/playwright/",\ + "packageDependencies": [\ + ["playwright", "npm:1.40.1"],\ + ["fsevents", "patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1"],\ + ["playwright-core", "npm:1.40.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["playwright-core", [\ + ["npm:1.40.1", {\ + "packageLocation": "./.yarn/unplugged/playwright-core-npm-1.40.1-d5a17fae9e/node_modules/playwright-core/",\ + "packageDependencies": [\ + ["playwright-core", "npm:1.40.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["plur", [\ + ["npm:5.1.0", {\ + "packageLocation": "./.yarn/cache/plur-npm-5.1.0-a8abe6df1b-57e400dc4b.zip/node_modules/plur/",\ + "packageDependencies": [\ + ["plur", "npm:5.1.0"],\ + ["irregular-plurals", "npm:3.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["pluralize", [\ + ["npm:8.0.0", {\ + "packageLocation": "./.yarn/cache/pluralize-npm-8.0.0-f5f044ed52-17877fdfdb.zip/node_modules/pluralize/",\ + "packageDependencies": [\ + ["pluralize", "npm:8.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["postcss", [\ + ["npm:8.4.33", {\ + "packageLocation": "./.yarn/cache/postcss-npm-8.4.33-6ba8157009-e22a4594c2.zip/node_modules/postcss/",\ + "packageDependencies": [\ + ["postcss", "npm:8.4.33"],\ + ["nanoid", "npm:3.3.7"],\ + ["picocolors", "npm:1.0.0"],\ + ["source-map-js", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["postcss-values-parser", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/postcss-values-parser-npm-2.0.1-b7d7dda30d-f69211656b.zip/node_modules/postcss-values-parser/",\ + "packageDependencies": [\ + ["postcss-values-parser", "npm:2.0.1"],\ + ["flatten", "npm:1.0.3"],\ + ["indexes-of", "npm:1.0.1"],\ + ["uniq", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.2", {\ + "packageLocation": "./.yarn/cache/postcss-values-parser-npm-6.0.2-2b25ce0808-ff2fa09689.zip/node_modules/postcss-values-parser/",\ + "packageDependencies": [\ + ["postcss-values-parser", "npm:6.0.2"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:23a358a5ecd6ab3181f7fc99cb0bf6fd4a0734b6e0a2eae05968d1aee7473261ac87704c1b5ed9c912b3faaebe60dd7819a21b2732f3649be486506b370c4c7e#npm:6.0.2", {\ + "packageLocation": "./.yarn/__virtual__/postcss-values-parser-virtual-4b360ec254/0/cache/postcss-values-parser-npm-6.0.2-2b25ce0808-ff2fa09689.zip/node_modules/postcss-values-parser/",\ + "packageDependencies": [\ + ["postcss-values-parser", "virtual:23a358a5ecd6ab3181f7fc99cb0bf6fd4a0734b6e0a2eae05968d1aee7473261ac87704c1b5ed9c912b3faaebe60dd7819a21b2732f3649be486506b370c4c7e#npm:6.0.2"],\ + ["@types/postcss", null],\ + ["color-name", "npm:1.1.4"],\ + ["is-url-superb", "npm:4.0.0"],\ + ["postcss", "npm:8.4.33"],\ + ["quote-unquote", "npm:1.0.0"]\ + ],\ + "packagePeers": [\ + "@types/postcss",\ + "postcss"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["precinct", [\ + ["npm:8.3.1", {\ + "packageLocation": "./.yarn/cache/precinct-npm-8.3.1-ee2c818667-46ec2cd2e8.zip/node_modules/precinct/",\ + "packageDependencies": [\ + ["precinct", "npm:8.3.1"],\ + ["commander", "npm:2.20.3"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["detective-amd", "npm:3.1.2"],\ + ["detective-cjs", "npm:3.1.3"],\ + ["detective-es6", "npm:2.2.2"],\ + ["detective-less", "npm:1.0.2"],\ + ["detective-postcss", "npm:4.0.0"],\ + ["detective-sass", "npm:3.0.2"],\ + ["detective-scss", "npm:2.0.2"],\ + ["detective-stylus", "npm:1.0.3"],\ + ["detective-typescript", "npm:7.0.2"],\ + ["module-definition", "npm:3.4.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:9.2.1", {\ + "packageLocation": "./.yarn/cache/precinct-npm-9.2.1-5348463d4e-f208d2e3c5.zip/node_modules/precinct/",\ + "packageDependencies": [\ + ["precinct", "npm:9.2.1"],\ + ["@dependents/detective-less", "npm:3.0.2"],\ + ["commander", "npm:9.5.0"],\ + ["detective-amd", "npm:4.2.0"],\ + ["detective-cjs", "npm:4.1.0"],\ + ["detective-es6", "npm:3.0.1"],\ + ["detective-postcss", "npm:6.1.3"],\ + ["detective-sass", "npm:4.1.3"],\ + ["detective-scss", "npm:3.1.1"],\ + ["detective-stylus", "npm:3.0.0"],\ + ["detective-typescript", "npm:9.1.1"],\ + ["module-definition", "npm:4.1.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["prelude-ls", [\ + ["npm:1.2.1", {\ + "packageLocation": "./.yarn/cache/prelude-ls-npm-1.2.1-3e4d272a55-0b9d2c7680.zip/node_modules/prelude-ls/",\ + "packageDependencies": [\ + ["prelude-ls", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["prettier", [\ + ["npm:3.1.1", {\ + "packageLocation": "./.yarn/unplugged/prettier-npm-3.1.1-072c31ec21/node_modules/prettier/",\ + "packageDependencies": [\ + ["prettier", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["pretty-ms", [\ + ["npm:7.0.1", {\ + "packageLocation": "./.yarn/cache/pretty-ms-npm-7.0.1-d748cac064-a39aac23cc.zip/node_modules/pretty-ms/",\ + "packageDependencies": [\ + ["pretty-ms", "npm:7.0.1"],\ + ["parse-ms", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.0.0", {\ + "packageLocation": "./.yarn/cache/pretty-ms-npm-8.0.0-7a40e0b54a-07c78d9522.zip/node_modules/pretty-ms/",\ + "packageDependencies": [\ + ["pretty-ms", "npm:8.0.0"],\ + ["parse-ms", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["proc-log", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/proc-log-npm-3.0.0-a8c21c2f0f-02b64e1b39.zip/node_modules/proc-log/",\ + "packageDependencies": [\ + ["proc-log", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["process-nextick-args", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/process-nextick-args-npm-2.0.1-b8d7971609-1d38588e52.zip/node_modules/process-nextick-args/",\ + "packageDependencies": [\ + ["process-nextick-args", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["promise-retry", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-96e1a82453.zip/node_modules/promise-retry/",\ + "packageDependencies": [\ + ["promise-retry", "npm:2.0.1"],\ + ["err-code", "npm:2.0.3"],\ + ["retry", "npm:0.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["proxy-addr", [\ + ["npm:2.0.7", {\ + "packageLocation": "./.yarn/cache/proxy-addr-npm-2.0.7-dae6552872-f24a0c80af.zip/node_modules/proxy-addr/",\ + "packageDependencies": [\ + ["proxy-addr", "npm:2.0.7"],\ + ["forwarded", "npm:0.2.0"],\ + ["ipaddr.js", "npm:1.9.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["punycode", [\ + ["npm:2.3.1", {\ + "packageLocation": "./.yarn/cache/punycode-npm-2.3.1-97543c420d-febdc4362b.zip/node_modules/punycode/",\ + "packageDependencies": [\ + ["punycode", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["pure-rand", [\ + ["npm:6.0.4", {\ + "packageLocation": "./.yarn/cache/pure-rand-npm-6.0.4-0821a97867-34fed0abe9.zip/node_modules/pure-rand/",\ + "packageDependencies": [\ + ["pure-rand", "npm:6.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["q", [\ + ["npm:1.5.1", {\ + "packageLocation": "./.yarn/cache/q-npm-1.5.1-a28b3cfeaf-70c4a30b30.zip/node_modules/q/",\ + "packageDependencies": [\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["qs", [\ + ["npm:6.11.0", {\ + "packageLocation": "./.yarn/cache/qs-npm-6.11.0-caf1bc9dea-5a3bfea3e2.zip/node_modules/qs/",\ + "packageDependencies": [\ + ["qs", "npm:6.11.0"],\ + ["side-channel", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["queue-microtask", [\ + ["npm:1.2.3", {\ + "packageLocation": "./.yarn/cache/queue-microtask-npm-1.2.3-fcc98e4e2d-72900df061.zip/node_modules/queue-microtask/",\ + "packageDependencies": [\ + ["queue-microtask", "npm:1.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["quick-lru", [\ + ["npm:4.0.1", {\ + "packageLocation": "./.yarn/cache/quick-lru-npm-4.0.1-ef8aa17c9c-5c7c75f1c6.zip/node_modules/quick-lru/",\ + "packageDependencies": [\ + ["quick-lru", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["quote-unquote", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/quote-unquote-npm-1.0.0-5aa1091ab3-955a2ead53.zip/node_modules/quote-unquote/",\ + "packageDependencies": [\ + ["quote-unquote", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["randombytes", [\ + ["npm:2.1.0", {\ + "packageLocation": "./.yarn/cache/randombytes-npm-2.1.0-e3da76bccf-4efd1ad3d8.zip/node_modules/randombytes/",\ + "packageDependencies": [\ + ["randombytes", "npm:2.1.0"],\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["range-parser", [\ + ["npm:1.2.1", {\ + "packageLocation": "./.yarn/cache/range-parser-npm-1.2.1-1a470fa390-ce21ef2a2d.zip/node_modules/range-parser/",\ + "packageDependencies": [\ + ["range-parser", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["raw-body", [\ + ["npm:2.5.1", {\ + "packageLocation": "./.yarn/cache/raw-body-npm-2.5.1-9dd1d9fff9-280bedc12d.zip/node_modules/raw-body/",\ + "packageDependencies": [\ + ["raw-body", "npm:2.5.1"],\ + ["bytes", "npm:3.1.2"],\ + ["http-errors", "npm:2.0.0"],\ + ["iconv-lite", "npm:0.4.24"],\ + ["unpipe", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["rc", [\ + ["npm:1.2.8", {\ + "packageLocation": "./.yarn/cache/rc-npm-1.2.8-d6768ac936-5c4d72ae7e.zip/node_modules/rc/",\ + "packageDependencies": [\ + ["rc", "npm:1.2.8"],\ + ["deep-extend", "npm:0.6.0"],\ + ["ini", "npm:1.3.8"],\ + ["minimist", "npm:1.2.8"],\ + ["strip-json-comments", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["read-pkg", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/read-pkg-npm-3.0.0-41471436cb-398903ebae.zip/node_modules/read-pkg/",\ + "packageDependencies": [\ + ["read-pkg", "npm:3.0.0"],\ + ["load-json-file", "npm:4.0.0"],\ + ["normalize-package-data", "npm:2.5.0"],\ + ["path-type", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.2.0", {\ + "packageLocation": "./.yarn/cache/read-pkg-npm-5.2.0-50426bd8dc-eb696e6052.zip/node_modules/read-pkg/",\ + "packageDependencies": [\ + ["read-pkg", "npm:5.2.0"],\ + ["@types/normalize-package-data", "npm:2.4.4"],\ + ["normalize-package-data", "npm:2.5.0"],\ + ["parse-json", "npm:5.2.0"],\ + ["type-fest", "npm:0.6.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["read-pkg-up", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/read-pkg-up-npm-3.0.0-3d7faf047f-16175573f2.zip/node_modules/read-pkg-up/",\ + "packageDependencies": [\ + ["read-pkg-up", "npm:3.0.0"],\ + ["find-up", "npm:2.1.0"],\ + ["read-pkg", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.0.1", {\ + "packageLocation": "./.yarn/cache/read-pkg-up-npm-7.0.1-11895bed9a-e4e93ce70e.zip/node_modules/read-pkg-up/",\ + "packageDependencies": [\ + ["read-pkg-up", "npm:7.0.1"],\ + ["find-up", "npm:4.1.0"],\ + ["read-pkg", "npm:5.2.0"],\ + ["type-fest", "npm:0.8.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["readable-stream", [\ + ["npm:2.3.8", {\ + "packageLocation": "./.yarn/cache/readable-stream-npm-2.3.8-67a94c2cb1-8500dd3a90.zip/node_modules/readable-stream/",\ + "packageDependencies": [\ + ["readable-stream", "npm:2.3.8"],\ + ["core-util-is", "npm:1.0.3"],\ + ["inherits", "npm:2.0.4"],\ + ["isarray", "npm:1.0.0"],\ + ["process-nextick-args", "npm:2.0.1"],\ + ["safe-buffer", "npm:5.1.2"],\ + ["string_decoder", "npm:1.1.1"],\ + ["util-deprecate", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.6.2", {\ + "packageLocation": "./.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-d9e3e53193.zip/node_modules/readable-stream/",\ + "packageDependencies": [\ + ["readable-stream", "npm:3.6.2"],\ + ["inherits", "npm:2.0.4"],\ + ["string_decoder", "npm:1.3.0"],\ + ["util-deprecate", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["readable-web-to-node-stream", [\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/cache/readable-web-to-node-stream-npm-3.0.2-682f5de297-d3a5bf9d70.zip/node_modules/readable-web-to-node-stream/",\ + "packageDependencies": [\ + ["readable-web-to-node-stream", "npm:3.0.2"],\ + ["readable-stream", "npm:3.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["redent", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/redent-npm-3.0.0-31892f4906-fa1ef20404.zip/node_modules/redent/",\ + "packageDependencies": [\ + ["redent", "npm:3.0.0"],\ + ["indent-string", "npm:4.0.0"],\ + ["strip-indent", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["regexp.prototype.flags", [\ + ["npm:1.5.1", {\ + "packageLocation": "./.yarn/cache/regexp.prototype.flags-npm-1.5.1-b8faeee306-3fa5610b8e.zip/node_modules/regexp.prototype.flags/",\ + "packageDependencies": [\ + ["regexp.prototype.flags", "npm:1.5.1"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["set-function-name", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["repeat-string", [\ + ["npm:1.6.1", {\ + "packageLocation": "./.yarn/cache/repeat-string-npm-1.6.1-bc8e388655-1b809fc6db.zip/node_modules/repeat-string/",\ + "packageDependencies": [\ + ["repeat-string", "npm:1.6.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["require-directory", [\ + ["npm:2.1.1", {\ + "packageLocation": "./.yarn/cache/require-directory-npm-2.1.1-8608aee50b-a72468e258.zip/node_modules/require-directory/",\ + "packageDependencies": [\ + ["require-directory", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["require-from-string", [\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/require-from-string-npm-2.0.2-8557e0db12-839a3a8901.zip/node_modules/require-from-string/",\ + "packageDependencies": [\ + ["require-from-string", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["requirejs", [\ + ["npm:2.3.6", {\ + "packageLocation": "./.yarn/cache/requirejs-npm-2.3.6-cda05b5f88-808540b0a2.zip/node_modules/requirejs/",\ + "packageDependencies": [\ + ["requirejs", "npm:2.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["requirejs-config-file", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/requirejs-config-file-npm-4.0.0-e89c26c364-9fc55813ca.zip/node_modules/requirejs-config-file/",\ + "packageDependencies": [\ + ["requirejs-config-file", "npm:4.0.0"],\ + ["esprima", "npm:4.0.1"],\ + ["stringify-object", "npm:3.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["resolve", [\ + ["patch:resolve@npm%3A1.19.0#optional!builtin::version=1.19.0&hash=c3c19d", {\ + "packageLocation": "./.yarn/cache/resolve-patch-0e96ddcab0-eb8853b1b7.zip/node_modules/resolve/",\ + "packageDependencies": [\ + ["resolve", "patch:resolve@npm%3A1.19.0#optional!builtin::version=1.19.0&hash=c3c19d"],\ + ["is-core-module", "npm:2.13.1"],\ + ["path-parse", "npm:1.0.7"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d", {\ + "packageLocation": "./.yarn/cache/resolve-patch-4254c24959-f345cd37f5.zip/node_modules/resolve/",\ + "packageDependencies": [\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["is-core-module", "npm:2.13.1"],\ + ["path-parse", "npm:1.0.7"],\ + ["supports-preserve-symlinks-flag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["resolve-cwd", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/resolve-cwd-npm-3.0.0-e6f4e296bf-546e081601.zip/node_modules/resolve-cwd/",\ + "packageDependencies": [\ + ["resolve-cwd", "npm:3.0.0"],\ + ["resolve-from", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["resolve-dependency-path", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/resolve-dependency-path-npm-2.0.0-81572580e9-f751141254.zip/node_modules/resolve-dependency-path/",\ + "packageDependencies": [\ + ["resolve-dependency-path", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["resolve-dir", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/resolve-dir-npm-1.0.1-0a95903c18-ef736b8ed6.zip/node_modules/resolve-dir/",\ + "packageDependencies": [\ + ["resolve-dir", "npm:1.0.1"],\ + ["expand-tilde", "npm:2.0.2"],\ + ["global-modules", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["resolve-from", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/resolve-from-npm-4.0.0-f758ec21bf-91eb76ce83.zip/node_modules/resolve-from/",\ + "packageDependencies": [\ + ["resolve-from", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/resolve-from-npm-5.0.0-15c9db4d33-be18a5e4d7.zip/node_modules/resolve-from/",\ + "packageDependencies": [\ + ["resolve-from", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["resolve-global", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/resolve-global-npm-1.0.0-9097e8a466-c4e11d33e8.zip/node_modules/resolve-global/",\ + "packageDependencies": [\ + ["resolve-global", "npm:1.0.0"],\ + ["global-dirs", "npm:0.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["restore-cursor", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/restore-cursor-npm-3.1.0-52c5a4c98f-f877dd8741.zip/node_modules/restore-cursor/",\ + "packageDependencies": [\ + ["restore-cursor", "npm:3.1.0"],\ + ["onetime", "npm:5.1.2"],\ + ["signal-exit", "npm:3.0.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["retry", [\ + ["npm:0.12.0", {\ + "packageLocation": "./.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-1f914879f9.zip/node_modules/retry/",\ + "packageDependencies": [\ + ["retry", "npm:0.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["reusify", [\ + ["npm:1.0.4", {\ + "packageLocation": "./.yarn/cache/reusify-npm-1.0.4-95ac4aec11-14222c9e1d.zip/node_modules/reusify/",\ + "packageDependencies": [\ + ["reusify", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["rimraf", [\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/cache/rimraf-npm-3.0.2-2cb7dac69a-063ffaccaa.zip/node_modules/rimraf/",\ + "packageDependencies": [\ + ["rimraf", "npm:3.0.2"],\ + ["glob", "npm:7.2.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.5", {\ + "packageLocation": "./.yarn/cache/rimraf-npm-5.0.5-19228633fd-a612c7184f.zip/node_modules/rimraf/",\ + "packageDependencies": [\ + ["rimraf", "npm:5.0.5"],\ + ["glob", "npm:10.3.10"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["rollup", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/cache/rollup-npm-4.9.3-5cdf0ffefa-8916c72dd1.zip/node_modules/rollup/",\ + "packageDependencies": [\ + ["rollup", "npm:4.9.3"],\ + ["@rollup/rollup-android-arm-eabi", "npm:4.9.3"],\ + ["@rollup/rollup-android-arm64", "npm:4.9.3"],\ + ["@rollup/rollup-darwin-arm64", "npm:4.9.3"],\ + ["@rollup/rollup-darwin-x64", "npm:4.9.3"],\ + ["@rollup/rollup-linux-arm-gnueabihf", "npm:4.9.3"],\ + ["@rollup/rollup-linux-arm64-gnu", "npm:4.9.3"],\ + ["@rollup/rollup-linux-arm64-musl", "npm:4.9.3"],\ + ["@rollup/rollup-linux-riscv64-gnu", "npm:4.9.3"],\ + ["@rollup/rollup-linux-x64-gnu", "npm:4.9.3"],\ + ["@rollup/rollup-linux-x64-musl", "npm:4.9.3"],\ + ["@rollup/rollup-win32-arm64-msvc", "npm:4.9.3"],\ + ["@rollup/rollup-win32-ia32-msvc", "npm:4.9.3"],\ + ["@rollup/rollup-win32-x64-msvc", "npm:4.9.3"],\ + ["@types/estree", "npm:1.0.5"],\ + ["fsevents", "patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["run-applescript", [\ + ["npm:7.0.0", {\ + "packageLocation": "./.yarn/cache/run-applescript-npm-7.0.0-b061c2c4fa-b02462454d.zip/node_modules/run-applescript/",\ + "packageDependencies": [\ + ["run-applescript", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["run-async", [\ + ["npm:2.4.1", {\ + "packageLocation": "./.yarn/cache/run-async-npm-2.4.1-a94bb90861-c79551224d.zip/node_modules/run-async/",\ + "packageDependencies": [\ + ["run-async", "npm:2.4.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["run-parallel", [\ + ["npm:1.2.0", {\ + "packageLocation": "./.yarn/cache/run-parallel-npm-1.2.0-3f47ff2034-cb4f97ad25.zip/node_modules/run-parallel/",\ + "packageDependencies": [\ + ["run-parallel", "npm:1.2.0"],\ + ["queue-microtask", "npm:1.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["rxjs", [\ + ["npm:7.8.1", {\ + "packageLocation": "./.yarn/cache/rxjs-npm-7.8.1-41c443a75b-b10cac1a52.zip/node_modules/rxjs/",\ + "packageDependencies": [\ + ["rxjs", "npm:7.8.1"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["safe-array-concat", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/safe-array-concat-npm-1.0.1-8a42907bbf-44f073d85c.zip/node_modules/safe-array-concat/",\ + "packageDependencies": [\ + ["safe-array-concat", "npm:1.0.1"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["has-symbols", "npm:1.0.3"],\ + ["isarray", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["safe-buffer", [\ + ["npm:5.1.2", {\ + "packageLocation": "./.yarn/cache/safe-buffer-npm-5.1.2-c27fedf6c4-7eb5b48f2e.zip/node_modules/safe-buffer/",\ + "packageDependencies": [\ + ["safe-buffer", "npm:5.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.2.1", {\ + "packageLocation": "./.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-32872cd0ff.zip/node_modules/safe-buffer/",\ + "packageDependencies": [\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["safe-regex-test", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/safe-regex-test-npm-1.0.1-61b42bb704-f9e2af64e4.zip/node_modules/safe-regex-test/",\ + "packageDependencies": [\ + ["safe-regex-test", "npm:1.0.1"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["is-regex", "npm:1.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["safe-stable-stringify", [\ + ["npm:2.4.3", {\ + "packageLocation": "./.yarn/cache/safe-stable-stringify-npm-2.4.3-d895741b40-a6c192bbef.zip/node_modules/safe-stable-stringify/",\ + "packageDependencies": [\ + ["safe-stable-stringify", "npm:2.4.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["safer-buffer", [\ + ["npm:2.1.2", {\ + "packageLocation": "./.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-7eaf7a0cf3.zip/node_modules/safer-buffer/",\ + "packageDependencies": [\ + ["safer-buffer", "npm:2.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["sass-lookup", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/sass-lookup-npm-3.0.0-c756430816-010b6ae2ee.zip/node_modules/sass-lookup/",\ + "packageDependencies": [\ + ["sass-lookup", "npm:3.0.0"],\ + ["commander", "npm:2.20.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["secp256k1", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/unplugged/secp256k1-npm-5.0.0-cbca9dfca0/node_modules/secp256k1/",\ + "packageDependencies": [\ + ["secp256k1", "npm:5.0.0"],\ + ["elliptic", "npm:6.5.4"],\ + ["node-addon-api", "npm:5.1.0"],\ + ["node-gyp", "npm:10.0.1"],\ + ["node-gyp-build", "npm:4.7.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["semver", [\ + ["npm:5.7.2", {\ + "packageLocation": "./.yarn/cache/semver-npm-5.7.2-938ee91eaa-fca14418a1.zip/node_modules/semver/",\ + "packageDependencies": [\ + ["semver", "npm:5.7.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.3.1", {\ + "packageLocation": "./.yarn/cache/semver-npm-6.3.1-bcba31fdbe-1ef3a85bd0.zip/node_modules/semver/",\ + "packageDependencies": [\ + ["semver", "npm:6.3.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.5.4", {\ + "packageLocation": "./.yarn/cache/semver-npm-7.5.4-c4ad957fcd-985dec0d37.zip/node_modules/semver/",\ + "packageDependencies": [\ + ["semver", "npm:7.5.4"],\ + ["lru-cache", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["send", [\ + ["npm:0.18.0", {\ + "packageLocation": "./.yarn/cache/send-npm-0.18.0-faadf6353f-ec66c0ad10.zip/node_modules/send/",\ + "packageDependencies": [\ + ["send", "npm:0.18.0"],\ + ["debug", "virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9"],\ + ["depd", "npm:2.0.0"],\ + ["destroy", "npm:1.2.0"],\ + ["encodeurl", "npm:1.0.2"],\ + ["escape-html", "npm:1.0.3"],\ + ["etag", "npm:1.8.1"],\ + ["fresh", "npm:0.5.2"],\ + ["http-errors", "npm:2.0.0"],\ + ["mime", "npm:1.6.0"],\ + ["ms", "npm:2.1.3"],\ + ["on-finished", "npm:2.4.1"],\ + ["range-parser", "npm:1.2.1"],\ + ["statuses", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["serialize-error", [\ + ["npm:7.0.1", {\ + "packageLocation": "./.yarn/cache/serialize-error-npm-7.0.1-c0b3f881a0-e0aba4dca2.zip/node_modules/serialize-error/",\ + "packageDependencies": [\ + ["serialize-error", "npm:7.0.1"],\ + ["type-fest", "npm:0.13.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["serve-static", [\ + ["npm:1.15.0", {\ + "packageLocation": "./.yarn/cache/serve-static-npm-1.15.0-86c81879f5-699b2d4c29.zip/node_modules/serve-static/",\ + "packageDependencies": [\ + ["serve-static", "npm:1.15.0"],\ + ["encodeurl", "npm:1.0.2"],\ + ["escape-html", "npm:1.0.3"],\ + ["parseurl", "npm:1.3.3"],\ + ["send", "npm:0.18.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["set-blocking", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/set-blocking-npm-2.0.0-49e2cffa24-8980ebf7ae.zip/node_modules/set-blocking/",\ + "packageDependencies": [\ + ["set-blocking", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["set-function-length", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/set-function-length-npm-1.1.1-d362bf8221-745ed1d7dc.zip/node_modules/set-function-length/",\ + "packageDependencies": [\ + ["set-function-length", "npm:1.1.1"],\ + ["define-data-property", "npm:1.1.1"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["gopd", "npm:1.0.1"],\ + ["has-property-descriptors", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["set-function-name", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/set-function-name-npm-2.0.1-a9f970eea0-4975d17d90.zip/node_modules/set-function-name/",\ + "packageDependencies": [\ + ["set-function-name", "npm:2.0.1"],\ + ["define-data-property", "npm:1.1.1"],\ + ["functions-have-names", "npm:1.2.3"],\ + ["has-property-descriptors", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["setprototypeof", [\ + ["npm:1.2.0", {\ + "packageLocation": "./.yarn/cache/setprototypeof-npm-1.2.0-0fedbdcd3a-fde1630422.zip/node_modules/setprototypeof/",\ + "packageDependencies": [\ + ["setprototypeof", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["shebang-command", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip/node_modules/shebang-command/",\ + "packageDependencies": [\ + ["shebang-command", "npm:2.0.0"],\ + ["shebang-regex", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["shebang-regex", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip/node_modules/shebang-regex/",\ + "packageDependencies": [\ + ["shebang-regex", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["shiki", [\ + ["npm:0.14.7", {\ + "packageLocation": "./.yarn/cache/shiki-npm-0.14.7-a8806632f6-be3f2444c6.zip/node_modules/shiki/",\ + "packageDependencies": [\ + ["shiki", "npm:0.14.7"],\ + ["ansi-sequence-parser", "npm:1.1.1"],\ + ["jsonc-parser", "npm:3.2.0"],\ + ["vscode-oniguruma", "npm:1.7.0"],\ + ["vscode-textmate", "npm:8.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["side-channel", [\ + ["npm:1.0.4", {\ + "packageLocation": "./.yarn/cache/side-channel-npm-1.0.4-e1f38b9e06-c4998d9fc5.zip/node_modules/side-channel/",\ + "packageDependencies": [\ + ["side-channel", "npm:1.0.4"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["object-inspect", "npm:1.13.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["signal-exit", [\ + ["npm:3.0.7", {\ + "packageLocation": "./.yarn/cache/signal-exit-npm-3.0.7-bd270458a3-a2f098f247.zip/node_modules/signal-exit/",\ + "packageDependencies": [\ + ["signal-exit", "npm:3.0.7"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "./.yarn/cache/signal-exit-npm-4.1.0-61fb957687-c9fa63bbbd.zip/node_modules/signal-exit/",\ + "packageDependencies": [\ + ["signal-exit", "npm:4.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["slash", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/slash-npm-3.0.0-b87de2279a-94a93fff61.zip/node_modules/slash/",\ + "packageDependencies": [\ + ["slash", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/slash-npm-4.0.0-ce4bbc4a80-da8e4af737.zip/node_modules/slash/",\ + "packageDependencies": [\ + ["slash", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.1.0", {\ + "packageLocation": "./.yarn/cache/slash-npm-5.1.0-718a84282e-2c41ec6fb1.zip/node_modules/slash/",\ + "packageDependencies": [\ + ["slash", "npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["slice-ansi", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/slice-ansi-npm-5.0.0-8cd4f226df-7e600a2a55.zip/node_modules/slice-ansi/",\ + "packageDependencies": [\ + ["slice-ansi", "npm:5.0.0"],\ + ["ansi-styles", "npm:6.2.1"],\ + ["is-fullwidth-code-point", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["smart-buffer", [\ + ["npm:4.2.0", {\ + "packageLocation": "./.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-927484aa0b.zip/node_modules/smart-buffer/",\ + "packageDependencies": [\ + ["smart-buffer", "npm:4.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["socks", [\ + ["npm:2.7.1", {\ + "packageLocation": "./.yarn/cache/socks-npm-2.7.1-17f2b53052-5074f7d6a1.zip/node_modules/socks/",\ + "packageDependencies": [\ + ["socks", "npm:2.7.1"],\ + ["ip", "npm:2.0.0"],\ + ["smart-buffer", "npm:4.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["socks-proxy-agent", [\ + ["npm:8.0.2", {\ + "packageLocation": "./.yarn/cache/socks-proxy-agent-npm-8.0.2-df165543cf-ea727734bd.zip/node_modules/socks-proxy-agent/",\ + "packageDependencies": [\ + ["socks-proxy-agent", "npm:8.0.2"],\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["socks", "npm:2.7.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["source-map", [\ + ["npm:0.6.1", {\ + "packageLocation": "./.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ef7462f1.zip/node_modules/source-map/",\ + "packageDependencies": [\ + ["source-map", "npm:0.6.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["source-map-js", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/source-map-js-npm-1.0.2-ee4f9f9b30-38e2d2dd18.zip/node_modules/source-map-js/",\ + "packageDependencies": [\ + ["source-map-js", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["source-map-support", [\ + ["npm:0.5.21", {\ + "packageLocation": "./.yarn/cache/source-map-support-npm-0.5.21-09ca99e250-8317e12d84.zip/node_modules/source-map-support/",\ + "packageDependencies": [\ + ["source-map-support", "npm:0.5.21"],\ + ["buffer-from", "npm:1.1.2"],\ + ["source-map", "npm:0.6.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["spdx-correct", [\ + ["npm:3.2.0", {\ + "packageLocation": "./.yarn/cache/spdx-correct-npm-3.2.0-ffae008484-cc2e4dbef8.zip/node_modules/spdx-correct/",\ + "packageDependencies": [\ + ["spdx-correct", "npm:3.2.0"],\ + ["spdx-expression-parse", "npm:3.0.1"],\ + ["spdx-license-ids", "npm:3.0.16"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["spdx-exceptions", [\ + ["npm:2.3.0", {\ + "packageLocation": "./.yarn/cache/spdx-exceptions-npm-2.3.0-2b68dad75a-cb69a26fa3.zip/node_modules/spdx-exceptions/",\ + "packageDependencies": [\ + ["spdx-exceptions", "npm:2.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["spdx-expression-parse", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/spdx-expression-parse-npm-3.0.1-b718cbb35a-a1c6e104a2.zip/node_modules/spdx-expression-parse/",\ + "packageDependencies": [\ + ["spdx-expression-parse", "npm:3.0.1"],\ + ["spdx-exceptions", "npm:2.3.0"],\ + ["spdx-license-ids", "npm:3.0.16"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["spdx-license-ids", [\ + ["npm:3.0.16", {\ + "packageLocation": "./.yarn/cache/spdx-license-ids-npm-3.0.16-354ed86dd0-6425c54132.zip/node_modules/spdx-license-ids/",\ + "packageDependencies": [\ + ["spdx-license-ids", "npm:3.0.16"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["split", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/split-npm-1.0.1-88871d88a2-12f4554a57.zip/node_modules/split/",\ + "packageDependencies": [\ + ["split", "npm:1.0.1"],\ + ["through", "npm:2.3.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["split2", [\ + ["npm:3.2.2", {\ + "packageLocation": "./.yarn/cache/split2-npm-3.2.2-4ccd21b4f7-a426e1e671.zip/node_modules/split2/",\ + "packageDependencies": [\ + ["split2", "npm:3.2.2"],\ + ["readable-stream", "npm:3.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["sprintf-js", [\ + ["npm:1.0.3", {\ + "packageLocation": "./.yarn/cache/sprintf-js-npm-1.0.3-73f0a322fa-c34828732a.zip/node_modules/sprintf-js/",\ + "packageDependencies": [\ + ["sprintf-js", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ssri", [\ + ["npm:10.0.5", {\ + "packageLocation": "./.yarn/cache/ssri-npm-10.0.5-1a7557d04d-453f9a1c24.zip/node_modules/ssri/",\ + "packageDependencies": [\ + ["ssri", "npm:10.0.5"],\ + ["minipass", "npm:7.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["stack-utils", [\ + ["npm:0.4.0", {\ + "packageLocation": "./.yarn/cache/stack-utils-npm-0.4.0-99cc707eb9-3436f7db19.zip/node_modules/stack-utils/",\ + "packageDependencies": [\ + ["stack-utils", "npm:0.4.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.6", {\ + "packageLocation": "./.yarn/cache/stack-utils-npm-2.0.6-2be1099696-cdc988acbc.zip/node_modules/stack-utils/",\ + "packageDependencies": [\ + ["stack-utils", "npm:2.0.6"],\ + ["escape-string-regexp", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["standard-version", [\ + ["npm:9.5.0", {\ + "packageLocation": "./.yarn/cache/standard-version-npm-9.5.0-5662d02730-a59fc3a304.zip/node_modules/standard-version/",\ + "packageDependencies": [\ + ["standard-version", "npm:9.5.0"],\ + ["chalk", "npm:2.4.2"],\ + ["conventional-changelog", "npm:3.1.25"],\ + ["conventional-changelog-config-spec", "npm:2.1.0"],\ + ["conventional-changelog-conventionalcommits", "npm:4.6.3"],\ + ["conventional-recommended-bump", "npm:6.1.0"],\ + ["detect-indent", "npm:6.1.0"],\ + ["detect-newline", "npm:3.1.0"],\ + ["dotgitignore", "npm:2.1.0"],\ + ["figures", "npm:3.2.0"],\ + ["find-up", "npm:5.0.0"],\ + ["git-semver-tags", "npm:4.1.1"],\ + ["semver", "npm:7.5.4"],\ + ["stringify-package", "npm:1.0.1"],\ + ["yargs", "npm:16.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["statuses", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/statuses-npm-2.0.1-81d2b97fee-18c7623fdb.zip/node_modules/statuses/",\ + "packageDependencies": [\ + ["statuses", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["stream-to-array", [\ + ["npm:2.3.0", {\ + "packageLocation": "./.yarn/cache/stream-to-array-npm-2.3.0-eaa32c31d8-7feaf63b38.zip/node_modules/stream-to-array/",\ + "packageDependencies": [\ + ["stream-to-array", "npm:2.3.0"],\ + ["any-promise", "npm:1.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string-argv", [\ + ["npm:0.3.2", {\ + "packageLocation": "./.yarn/cache/string-argv-npm-0.3.2-6e057a88f1-f9d3addf88.zip/node_modules/string-argv/",\ + "packageDependencies": [\ + ["string-argv", "npm:0.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string-width", [\ + ["npm:4.2.3", {\ + "packageLocation": "./.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip/node_modules/string-width/",\ + "packageDependencies": [\ + ["string-width", "npm:4.2.3"],\ + ["emoji-regex", "npm:8.0.0"],\ + ["is-fullwidth-code-point", "npm:3.0.0"],\ + ["strip-ansi", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.1.2", {\ + "packageLocation": "./.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip/node_modules/string-width/",\ + "packageDependencies": [\ + ["string-width", "npm:5.1.2"],\ + ["eastasianwidth", "npm:0.2.0"],\ + ["emoji-regex", "npm:9.2.2"],\ + ["strip-ansi", "npm:7.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.0.0", {\ + "packageLocation": "./.yarn/cache/string-width-npm-7.0.0-1bcc0b3bce-bc0de5700a.zip/node_modules/string-width/",\ + "packageDependencies": [\ + ["string-width", "npm:7.0.0"],\ + ["emoji-regex", "npm:10.3.0"],\ + ["get-east-asian-width", "npm:1.2.0"],\ + ["strip-ansi", "npm:7.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string.prototype.trim", [\ + ["npm:1.2.8", {\ + "packageLocation": "./.yarn/cache/string.prototype.trim-npm-1.2.8-7ed4517ce8-9301f6cb2b.zip/node_modules/string.prototype.trim/",\ + "packageDependencies": [\ + ["string.prototype.trim", "npm:1.2.8"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string.prototype.trimend", [\ + ["npm:1.0.7", {\ + "packageLocation": "./.yarn/cache/string.prototype.trimend-npm-1.0.7-159b9dcfbc-3f0d3397ab.zip/node_modules/string.prototype.trimend/",\ + "packageDependencies": [\ + ["string.prototype.trimend", "npm:1.0.7"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string.prototype.trimstart", [\ + ["npm:1.0.7", {\ + "packageLocation": "./.yarn/cache/string.prototype.trimstart-npm-1.0.7-ae2f803b78-6e594d3a61.zip/node_modules/string.prototype.trimstart/",\ + "packageDependencies": [\ + ["string.prototype.trimstart", "npm:1.0.7"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string_decoder", [\ + ["npm:1.1.1", {\ + "packageLocation": "./.yarn/cache/string_decoder-npm-1.1.1-e46a6c1353-7c41c17ed4.zip/node_modules/string_decoder/",\ + "packageDependencies": [\ + ["string_decoder", "npm:1.1.1"],\ + ["safe-buffer", "npm:5.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:1.3.0", {\ + "packageLocation": "./.yarn/cache/string_decoder-npm-1.3.0-2422117fd0-54d23f4a6a.zip/node_modules/string_decoder/",\ + "packageDependencies": [\ + ["string_decoder", "npm:1.3.0"],\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["stringify-object", [\ + ["npm:3.3.0", {\ + "packageLocation": "./.yarn/cache/stringify-object-npm-3.3.0-3e6784f7df-973782f09a.zip/node_modules/stringify-object/",\ + "packageDependencies": [\ + ["stringify-object", "npm:3.3.0"],\ + ["get-own-enumerable-property-symbols", "npm:3.0.2"],\ + ["is-obj", "npm:1.0.1"],\ + ["is-regexp", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["stringify-package", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/stringify-package-npm-1.0.1-dfc7255692-462036085a.zip/node_modules/stringify-package/",\ + "packageDependencies": [\ + ["stringify-package", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["strip-ansi", [\ + ["npm:6.0.1", {\ + "packageLocation": "./.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-ae3b5436d3.zip/node_modules/strip-ansi/",\ + "packageDependencies": [\ + ["strip-ansi", "npm:6.0.1"],\ + ["ansi-regex", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.1.0", {\ + "packageLocation": "./.yarn/cache/strip-ansi-npm-7.1.0-7453b80b79-475f53e9c4.zip/node_modules/strip-ansi/",\ + "packageDependencies": [\ + ["strip-ansi", "npm:7.1.0"],\ + ["ansi-regex", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["strip-bom", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/strip-bom-npm-3.0.0-71e8f81ff9-8d50ff27b7.zip/node_modules/strip-bom/",\ + "packageDependencies": [\ + ["strip-bom", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/strip-bom-npm-4.0.0-97d367a64d-9dbcfbaf50.zip/node_modules/strip-bom/",\ + "packageDependencies": [\ + ["strip-bom", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["strip-final-newline", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/strip-final-newline-npm-3.0.0-7972cbec8b-23ee263adf.zip/node_modules/strip-final-newline/",\ + "packageDependencies": [\ + ["strip-final-newline", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["strip-indent", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/strip-indent-npm-3.0.0-519e75a28d-18f045d57d.zip/node_modules/strip-indent/",\ + "packageDependencies": [\ + ["strip-indent", "npm:3.0.0"],\ + ["min-indent", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["strip-json-comments", [\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/strip-json-comments-npm-2.0.1-e7883b2d04-1074ccb632.zip/node_modules/strip-json-comments/",\ + "packageDependencies": [\ + ["strip-json-comments", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.1.1", {\ + "packageLocation": "./.yarn/cache/strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip/node_modules/strip-json-comments/",\ + "packageDependencies": [\ + ["strip-json-comments", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["strtok3", [\ + ["npm:7.0.0", {\ + "packageLocation": "./.yarn/cache/strtok3-npm-7.0.0-bb1edd9ba5-4f2269679f.zip/node_modules/strtok3/",\ + "packageDependencies": [\ + ["strtok3", "npm:7.0.0"],\ + ["@tokenizer/token", "npm:0.3.0"],\ + ["peek-readable", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["stylus-lookup", [\ + ["npm:3.0.2", {\ + "packageLocation": "./.yarn/cache/stylus-lookup-npm-3.0.2-fed0f86b51-94da8b81ef.zip/node_modules/stylus-lookup/",\ + "packageDependencies": [\ + ["stylus-lookup", "npm:3.0.2"],\ + ["commander", "npm:2.20.3"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["supertap", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/supertap-npm-3.0.1-d7c04bcbf0-2074334f79.zip/node_modules/supertap/",\ + "packageDependencies": [\ + ["supertap", "npm:3.0.1"],\ + ["indent-string", "npm:5.0.0"],\ + ["js-yaml", "npm:3.14.1"],\ + ["serialize-error", "npm:7.0.1"],\ + ["strip-ansi", "npm:7.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["supports-color", [\ + ["npm:5.5.0", {\ + "packageLocation": "./.yarn/cache/supports-color-npm-5.5.0-183ac537bc-5f505c6fa3.zip/node_modules/supports-color/",\ + "packageDependencies": [\ + ["supports-color", "npm:5.5.0"],\ + ["has-flag", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.2.0", {\ + "packageLocation": "./.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-c8bb7afd56.zip/node_modules/supports-color/",\ + "packageDependencies": [\ + ["supports-color", "npm:7.2.0"],\ + ["has-flag", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["supports-preserve-symlinks-flag", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/supports-preserve-symlinks-flag-npm-1.0.0-f17c4d0028-a9dc19ae22.zip/node_modules/supports-preserve-symlinks-flag/",\ + "packageDependencies": [\ + ["supports-preserve-symlinks-flag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tapable", [\ + ["npm:2.2.1", {\ + "packageLocation": "./.yarn/cache/tapable-npm-2.2.1-8cf5ff3039-1769336dd2.zip/node_modules/tapable/",\ + "packageDependencies": [\ + ["tapable", "npm:2.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tar", [\ + ["npm:6.2.0", {\ + "packageLocation": "./.yarn/cache/tar-npm-6.2.0-3eb25205a7-2042bbb148.zip/node_modules/tar/",\ + "packageDependencies": [\ + ["tar", "npm:6.2.0"],\ + ["chownr", "npm:2.0.0"],\ + ["fs-minipass", "npm:2.1.0"],\ + ["minipass", "npm:5.0.0"],\ + ["minizlib", "npm:2.1.2"],\ + ["mkdirp", "npm:1.0.4"],\ + ["yallist", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["temp-dir", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/temp-dir-npm-3.0.0-70414c7a63-577211e995.zip/node_modules/temp-dir/",\ + "packageDependencies": [\ + ["temp-dir", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tempy", [\ + ["npm:3.1.0", {\ + "packageLocation": "./.yarn/cache/tempy-npm-3.1.0-53fa9712c8-f5540bc24d.zip/node_modules/tempy/",\ + "packageDependencies": [\ + ["tempy", "npm:3.1.0"],\ + ["is-stream", "npm:3.0.0"],\ + ["temp-dir", "npm:3.0.0"],\ + ["type-fest", "npm:2.19.0"],\ + ["unique-string", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["test-exclude", [\ + ["npm:6.0.0", {\ + "packageLocation": "./.yarn/cache/test-exclude-npm-6.0.0-3fb03d69df-8fccb2cb6c.zip/node_modules/test-exclude/",\ + "packageDependencies": [\ + ["test-exclude", "npm:6.0.0"],\ + ["@istanbuljs/schema", "npm:0.1.3"],\ + ["glob", "npm:7.2.3"],\ + ["minimatch", "npm:3.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["text-extensions", [\ + ["npm:1.9.0", {\ + "packageLocation": "./.yarn/cache/text-extensions-npm-1.9.0-87655d768f-56a9962c1b.zip/node_modules/text-extensions/",\ + "packageDependencies": [\ + ["text-extensions", "npm:1.9.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["text-table", [\ + ["npm:0.2.0", {\ + "packageLocation": "./.yarn/cache/text-table-npm-0.2.0-d92a778b59-4383b5baae.zip/node_modules/text-table/",\ + "packageDependencies": [\ + ["text-table", "npm:0.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["through", [\ + ["npm:2.3.8", {\ + "packageLocation": "./.yarn/cache/through-npm-2.3.8-df5f72a16e-5da78346f7.zip/node_modules/through/",\ + "packageDependencies": [\ + ["through", "npm:2.3.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["through2", [\ + ["npm:2.0.5", {\ + "packageLocation": "./.yarn/cache/through2-npm-2.0.5-77d90f13cd-cd71f7dcdc.zip/node_modules/through2/",\ + "packageDependencies": [\ + ["through2", "npm:2.0.5"],\ + ["readable-stream", "npm:2.3.8"],\ + ["xtend", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.2", {\ + "packageLocation": "./.yarn/cache/through2-npm-4.0.2-da7b2da443-72c246233d.zip/node_modules/through2/",\ + "packageDependencies": [\ + ["through2", "npm:4.0.2"],\ + ["readable-stream", "npm:3.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["time-zone", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/time-zone-npm-1.0.0-0522e3467f-e46f5a69b8.zip/node_modules/time-zone/",\ + "packageDependencies": [\ + ["time-zone", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tmp", [\ + ["npm:0.0.33", {\ + "packageLocation": "./.yarn/cache/tmp-npm-0.0.33-bcbf65df2a-09c0abfd16.zip/node_modules/tmp/",\ + "packageDependencies": [\ + ["tmp", "npm:0.0.33"],\ + ["os-tmpdir", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["to-fast-properties", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/to-fast-properties-npm-2.0.0-0dc60cc481-be2de62fe5.zip/node_modules/to-fast-properties/",\ + "packageDependencies": [\ + ["to-fast-properties", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["to-regex-range", [\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/to-regex-range-npm-5.0.1-f1e8263b00-10dda13571.zip/node_modules/to-regex-range/",\ + "packageDependencies": [\ + ["to-regex-range", "npm:5.0.1"],\ + ["is-number", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["toidentifier", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/toidentifier-npm-1.0.1-f759712599-952c29e2a8.zip/node_modules/toidentifier/",\ + "packageDependencies": [\ + ["toidentifier", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["token-types", [\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/token-types-npm-5.0.1-a86fdb8b12-0985369bbe.zip/node_modules/token-types/",\ + "packageDependencies": [\ + ["token-types", "npm:5.0.1"],\ + ["@tokenizer/token", "npm:0.3.0"],\ + ["ieee754", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tr46", [\ + ["npm:0.0.3", {\ + "packageLocation": "./.yarn/cache/tr46-npm-0.0.3-de53018915-8f1f5aa6cb.zip/node_modules/tr46/",\ + "packageDependencies": [\ + ["tr46", "npm:0.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["trim-newlines", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/trim-newlines-npm-3.0.1-22f1f216de-b530f3fadf.zip/node_modules/trim-newlines/",\ + "packageDependencies": [\ + ["trim-newlines", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ts-api-utils", [\ + ["npm:1.0.3", {\ + "packageLocation": "./.yarn/cache/ts-api-utils-npm-1.0.3-992f360d9b-1350a5110e.zip/node_modules/ts-api-utils/",\ + "packageDependencies": [\ + ["ts-api-utils", "npm:1.0.3"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3", {\ + "packageLocation": "./.yarn/__virtual__/ts-api-utils-virtual-041da0d5de/0/cache/ts-api-utils-npm-1.0.3-992f360d9b-1350a5110e.zip/node_modules/ts-api-utils/",\ + "packageDependencies": [\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["@types/typescript", null],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:45f7b3e074718861e9d412f1461999483dee0f73f35f1e6f12ded75c3c5b62cd2bcff5f531367f4b6732c1e89724ee8d5efc7a3515fd1f1d59d8f1ab11edf9ed#npm:1.0.3", {\ + "packageLocation": "./.yarn/__virtual__/ts-api-utils-virtual-4242d16f1c/0/cache/ts-api-utils-npm-1.0.3-992f360d9b-1350a5110e.zip/node_modules/ts-api-utils/",\ + "packageDependencies": [\ + ["ts-api-utils", "virtual:45f7b3e074718861e9d412f1461999483dee0f73f35f1e6f12ded75c3c5b62cd2bcff5f531367f4b6732c1e89724ee8d5efc7a3515fd1f1d59d8f1ab11edf9ed#npm:1.0.3"],\ + ["@types/typescript", null],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ts-graphviz", [\ + ["npm:1.8.1", {\ + "packageLocation": "./.yarn/cache/ts-graphviz-npm-1.8.1-5af04a2735-4936292e2b.zip/node_modules/ts-graphviz/",\ + "packageDependencies": [\ + ["ts-graphviz", "npm:1.8.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ts-json-schema-generator", [\ + ["npm:1.5.0", {\ + "packageLocation": "./.yarn/cache/ts-json-schema-generator-npm-1.5.0-6a03d41094-da0798384e.zip/node_modules/ts-json-schema-generator/",\ + "packageDependencies": [\ + ["ts-json-schema-generator", "npm:1.5.0"],\ + ["@types/json-schema", "npm:7.0.15"],\ + ["commander", "npm:11.1.0"],\ + ["glob", "npm:8.1.0"],\ + ["json5", "npm:2.2.3"],\ + ["normalize-path", "npm:3.0.0"],\ + ["safe-stable-stringify", "npm:2.4.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tsconfig-paths", [\ + ["npm:3.15.0", {\ + "packageLocation": "./.yarn/cache/tsconfig-paths-npm-3.15.0-ff68930e0e-2041beaedc.zip/node_modules/tsconfig-paths/",\ + "packageDependencies": [\ + ["tsconfig-paths", "npm:3.15.0"],\ + ["@types/json5", "npm:0.0.29"],\ + ["json5", "npm:1.0.2"],\ + ["minimist", "npm:1.2.8"],\ + ["strip-bom", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tslib", [\ + ["npm:1.14.1", {\ + "packageLocation": "./.yarn/cache/tslib-npm-1.14.1-102499115e-7dbf34e6f5.zip/node_modules/tslib/",\ + "packageDependencies": [\ + ["tslib", "npm:1.14.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.6.2", {\ + "packageLocation": "./.yarn/cache/tslib-npm-2.6.2-4fc8c068d9-bd26c22d36.zip/node_modules/tslib/",\ + "packageDependencies": [\ + ["tslib", "npm:2.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tsutils", [\ + ["npm:3.21.0", {\ + "packageLocation": "./.yarn/cache/tsutils-npm-3.21.0-347e6636c5-ea036bec1d.zip/node_modules/tsutils/",\ + "packageDependencies": [\ + ["tsutils", "npm:3.21.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:40b7528656205285b7eb6c8a2b798d03c881f5fc5f312b0ac13d2de58079f2f1fefdc278b4177d7b19c2e1c30a289310b9c005566bdd606e08fd4846ffc54362#npm:3.21.0", {\ + "packageLocation": "./.yarn/__virtual__/tsutils-virtual-16a67883a9/0/cache/tsutils-npm-3.21.0-347e6636c5-ea036bec1d.zip/node_modules/tsutils/",\ + "packageDependencies": [\ + ["tsutils", "virtual:40b7528656205285b7eb6c8a2b798d03c881f5fc5f312b0ac13d2de58079f2f1fefdc278b4177d7b19c2e1c30a289310b9c005566bdd606e08fd4846ffc54362#npm:3.21.0"],\ + ["@types/typescript", null],\ + ["tslib", "npm:1.14.1"],\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:d25122643b329d297f1158bdbbeb452d30b524ea62c42db7395547701b59d0cea14496f7d76f91f55bbcf1d1440cf89bd89ae4b0cd0a6ebd7928883f9bf0dba3#npm:3.21.0", {\ + "packageLocation": "./.yarn/__virtual__/tsutils-virtual-8ac2d3a52a/0/cache/tsutils-npm-3.21.0-347e6636c5-ea036bec1d.zip/node_modules/tsutils/",\ + "packageDependencies": [\ + ["tsutils", "virtual:d25122643b329d297f1158bdbbeb452d30b524ea62c42db7395547701b59d0cea14496f7d76f91f55bbcf1d1440cf89bd89ae4b0cd0a6ebd7928883f9bf0dba3#npm:3.21.0"],\ + ["@types/typescript", null],\ + ["tslib", "npm:1.14.1"],\ + ["typescript", "patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["type-check", [\ + ["npm:0.4.0", {\ + "packageLocation": "./.yarn/cache/type-check-npm-0.4.0-60565800ce-1468777647.zip/node_modules/type-check/",\ + "packageDependencies": [\ + ["type-check", "npm:0.4.0"],\ + ["prelude-ls", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["type-fest", [\ + ["npm:0.13.1", {\ + "packageLocation": "./.yarn/cache/type-fest-npm-0.13.1-7f4486b973-11e9476dc8.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:0.13.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:0.18.1", {\ + "packageLocation": "./.yarn/cache/type-fest-npm-0.18.1-47b079775d-0884437705.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:0.18.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:0.20.2", {\ + "packageLocation": "./.yarn/cache/type-fest-npm-0.20.2-b36432617f-8907e16284.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:0.20.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:0.21.3", {\ + "packageLocation": "./.yarn/cache/type-fest-npm-0.21.3-5ff2a9c6fd-f4254070d9.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:0.21.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:0.6.0", {\ + "packageLocation": "./.yarn/cache/type-fest-npm-0.6.0-76b229965b-9ecbf4ba27.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:0.6.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:0.8.1", {\ + "packageLocation": "./.yarn/cache/type-fest-npm-0.8.1-351ad028fe-fd4a91bfb7.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:0.8.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:1.4.0", {\ + "packageLocation": "./.yarn/cache/type-fest-npm-1.4.0-7dd848962a-89875c2475.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.19.0", {\ + "packageLocation": "./.yarn/cache/type-fest-npm-2.19.0-918b953248-7bf9e8fdf3.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:2.19.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["type-is", [\ + ["npm:1.6.18", {\ + "packageLocation": "./.yarn/cache/type-is-npm-1.6.18-6dee4d4961-0bd9eeae5e.zip/node_modules/type-is/",\ + "packageDependencies": [\ + ["type-is", "npm:1.6.18"],\ + ["media-typer", "npm:0.3.0"],\ + ["mime-types", "npm:2.1.35"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typed-array-buffer", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/typed-array-buffer-npm-1.0.0-95cb610310-3e0281c79b.zip/node_modules/typed-array-buffer/",\ + "packageDependencies": [\ + ["typed-array-buffer", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["is-typed-array", "npm:1.1.12"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typed-array-byte-length", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/typed-array-byte-length-npm-1.0.0-94d79975ca-6f376bf5d9.zip/node_modules/typed-array-byte-length/",\ + "packageDependencies": [\ + ["typed-array-byte-length", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.5"],\ + ["for-each", "npm:0.3.3"],\ + ["has-proto", "npm:1.0.1"],\ + ["is-typed-array", "npm:1.1.12"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typed-array-byte-offset", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/typed-array-byte-offset-npm-1.0.0-8cbb911cf5-2d81747faa.zip/node_modules/typed-array-byte-offset/",\ + "packageDependencies": [\ + ["typed-array-byte-offset", "npm:1.0.0"],\ + ["available-typed-arrays", "npm:1.0.5"],\ + ["call-bind", "npm:1.0.5"],\ + ["for-each", "npm:0.3.3"],\ + ["has-proto", "npm:1.0.1"],\ + ["is-typed-array", "npm:1.1.12"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typed-array-length", [\ + ["npm:1.0.4", {\ + "packageLocation": "./.yarn/cache/typed-array-length-npm-1.0.4-92771b81fc-0444658acc.zip/node_modules/typed-array-length/",\ + "packageDependencies": [\ + ["typed-array-length", "npm:1.0.4"],\ + ["call-bind", "npm:1.0.5"],\ + ["for-each", "npm:0.3.3"],\ + ["is-typed-array", "npm:1.1.12"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typedarray", [\ + ["npm:0.0.6", {\ + "packageLocation": "./.yarn/cache/typedarray-npm-0.0.6-37638b2241-2cc1bcf7d8.zip/node_modules/typedarray/",\ + "packageDependencies": [\ + ["typedarray", "npm:0.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typedarray-to-buffer", [\ + ["npm:3.1.5", {\ + "packageLocation": "./.yarn/cache/typedarray-to-buffer-npm-3.1.5-aadc11995e-7c850c3433.zip/node_modules/typedarray-to-buffer/",\ + "packageDependencies": [\ + ["typedarray-to-buffer", "npm:3.1.5"],\ + ["is-typedarray", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typedoc", [\ + ["npm:0.25.6", {\ + "packageLocation": "./.yarn/cache/typedoc-npm-0.25.6-cdbe1ae961-4d38581528.zip/node_modules/typedoc/",\ + "packageDependencies": [\ + ["typedoc", "npm:0.25.6"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:0.25.6", {\ + "packageLocation": "./.yarn/__virtual__/typedoc-virtual-554c11995a/0/cache/typedoc-npm-0.25.6-cdbe1ae961-4d38581528.zip/node_modules/typedoc/",\ + "packageDependencies": [\ + ["typedoc", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:0.25.6"],\ + ["@types/typescript", null],\ + ["lunr", "npm:2.3.9"],\ + ["marked", "npm:4.3.0"],\ + ["minimatch", "npm:9.0.3"],\ + ["shiki", "npm:0.14.7"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typescript", [\ + ["patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3", {\ + "packageLocation": "./.yarn/cache/typescript-patch-24818892bd-77024c200e.zip/node_modules/typescript/",\ + "packageDependencies": [\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587", {\ + "packageLocation": "./.yarn/cache/typescript-patch-32ada147aa-5659316360.zip/node_modules/typescript/",\ + "packageDependencies": [\ + ["typescript", "patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7", {\ + "packageLocation": "./.yarn/cache/typescript-patch-4778c7998b-c93786fcc9.zip/node_modules/typescript/",\ + "packageDependencies": [\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["uglify-js", [\ + ["npm:3.17.4", {\ + "packageLocation": "./.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-4c0b800e0f.zip/node_modules/uglify-js/",\ + "packageDependencies": [\ + ["uglify-js", "npm:3.17.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["unbox-primitive", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/unbox-primitive-npm-1.0.2-cb56a05066-06e1ee41c1.zip/node_modules/unbox-primitive/",\ + "packageDependencies": [\ + ["unbox-primitive", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ + ["has-bigints", "npm:1.0.2"],\ + ["has-symbols", "npm:1.0.3"],\ + ["which-boxed-primitive", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["undici-types", [\ + ["npm:5.26.5", {\ + "packageLocation": "./.yarn/cache/undici-types-npm-5.26.5-de4f7c7bb9-0097779d94.zip/node_modules/undici-types/",\ + "packageDependencies": [\ + ["undici-types", "npm:5.26.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["unicorn-magic", [\ + ["npm:0.1.0", {\ + "packageLocation": "./.yarn/cache/unicorn-magic-npm-0.1.0-12d4f6ff8b-9b4d0e9809.zip/node_modules/unicorn-magic/",\ + "packageDependencies": [\ + ["unicorn-magic", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["uniq", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/uniq-npm-1.0.1-5cab2dd0f3-8206535f83.zip/node_modules/uniq/",\ + "packageDependencies": [\ + ["uniq", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["unique-filename", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/unique-filename-npm-3.0.0-77d68e0a45-8e2f59b356.zip/node_modules/unique-filename/",\ + "packageDependencies": [\ + ["unique-filename", "npm:3.0.0"],\ + ["unique-slug", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["unique-slug", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/unique-slug-npm-4.0.0-e6b08f28aa-40912a8963.zip/node_modules/unique-slug/",\ + "packageDependencies": [\ + ["unique-slug", "npm:4.0.0"],\ + ["imurmurhash", "npm:0.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["unique-string", [\ + ["npm:3.0.0", {\ + "packageLocation": "./.yarn/cache/unique-string-npm-3.0.0-1a556e406a-1a1e2e7d02.zip/node_modules/unique-string/",\ + "packageDependencies": [\ + ["unique-string", "npm:3.0.0"],\ + ["crypto-random-string", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["universalify", [\ + ["npm:0.1.2", {\ + "packageLocation": "./.yarn/cache/universalify-npm-0.1.2-9b22d31d2d-40cdc60f6e.zip/node_modules/universalify/",\ + "packageDependencies": [\ + ["universalify", "npm:0.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.1", {\ + "packageLocation": "./.yarn/cache/universalify-npm-2.0.1-040ba5a21e-ecd8469fe0.zip/node_modules/universalify/",\ + "packageDependencies": [\ + ["universalify", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["unpipe", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/unpipe-npm-1.0.0-2ed2a3c2bf-4fa18d8d8d.zip/node_modules/unpipe/",\ + "packageDependencies": [\ + ["unpipe", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["uri-js", [\ + ["npm:4.4.1", {\ + "packageLocation": "./.yarn/cache/uri-js-npm-4.4.1-66d11cbcaf-b271ca7e3d.zip/node_modules/uri-js/",\ + "packageDependencies": [\ + ["uri-js", "npm:4.4.1"],\ + ["punycode", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["util-deprecate", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip/node_modules/util-deprecate/",\ + "packageDependencies": [\ + ["util-deprecate", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["utils-merge", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/utils-merge-npm-1.0.1-363bbdfbca-5d6949693d.zip/node_modules/utils-merge/",\ + "packageDependencies": [\ + ["utils-merge", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["v8-to-istanbul", [\ + ["npm:9.2.0", {\ + "packageLocation": "./.yarn/cache/v8-to-istanbul-npm-9.2.0-fb333cc45f-18dd8cebfb.zip/node_modules/v8-to-istanbul/",\ + "packageDependencies": [\ + ["v8-to-istanbul", "npm:9.2.0"],\ + ["@jridgewell/trace-mapping", "npm:0.3.20"],\ + ["@types/istanbul-lib-coverage", "npm:2.0.6"],\ + ["convert-source-map", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["validate-npm-package-license", [\ + ["npm:3.0.4", {\ + "packageLocation": "./.yarn/cache/validate-npm-package-license-npm-3.0.4-7af8adc7a8-86242519b2.zip/node_modules/validate-npm-package-license/",\ + "packageDependencies": [\ + ["validate-npm-package-license", "npm:3.0.4"],\ + ["spdx-correct", "npm:3.2.0"],\ + ["spdx-expression-parse", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["validator", [\ + ["npm:13.11.0", {\ + "packageLocation": "./.yarn/cache/validator-npm-13.11.0-f0143e2784-4bf094641e.zip/node_modules/validator/",\ + "packageDependencies": [\ + ["validator", "npm:13.11.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vary", [\ + ["npm:1.1.2", {\ + "packageLocation": "./.yarn/cache/vary-npm-1.1.2-b49f70ae63-31389debef.zip/node_modules/vary/",\ + "packageDependencies": [\ + ["vary", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-languageserver-textdocument", [\ + ["npm:1.0.11", {\ + "packageLocation": "./.yarn/cache/vscode-languageserver-textdocument-npm-1.0.11-6fc94d2b7b-6096d2a855.zip/node_modules/vscode-languageserver-textdocument/",\ + "packageDependencies": [\ + ["vscode-languageserver-textdocument", "npm:1.0.11"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-oniguruma", [\ + ["npm:1.7.0", {\ + "packageLocation": "./.yarn/cache/vscode-oniguruma-npm-1.7.0-07cc55fbcc-7da9d21459.zip/node_modules/vscode-oniguruma/",\ + "packageDependencies": [\ + ["vscode-oniguruma", "npm:1.7.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-textmate", [\ + ["npm:8.0.0", {\ + "packageLocation": "./.yarn/cache/vscode-textmate-npm-8.0.0-2deb0cc7cf-9fa7d66d60.zip/node_modules/vscode-textmate/",\ + "packageDependencies": [\ + ["vscode-textmate", "npm:8.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-uri", [\ + ["npm:3.0.8", {\ + "packageLocation": "./.yarn/cache/vscode-uri-npm-3.0.8-56f46b9d24-e882d6b679.zip/node_modules/vscode-uri/",\ + "packageDependencies": [\ + ["vscode-uri", "npm:3.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["walkdir", [\ + ["npm:0.4.1", {\ + "packageLocation": "./.yarn/cache/walkdir-npm-0.4.1-de0c3aebeb-54cbe7afc5.zip/node_modules/walkdir/",\ + "packageDependencies": [\ + ["walkdir", "npm:0.4.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["wcwidth", [\ + ["npm:1.0.1", {\ + "packageLocation": "./.yarn/cache/wcwidth-npm-1.0.1-05fa596453-182ebac8ca.zip/node_modules/wcwidth/",\ + "packageDependencies": [\ + ["wcwidth", "npm:1.0.1"],\ + ["defaults", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["webidl-conversions", [\ + ["npm:3.0.1", {\ + "packageLocation": "./.yarn/cache/webidl-conversions-npm-3.0.1-60310f6a2b-b65b9f8d68.zip/node_modules/webidl-conversions/",\ + "packageDependencies": [\ + ["webidl-conversions", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["well-known-symbols", [\ + ["npm:2.0.0", {\ + "packageLocation": "./.yarn/cache/well-known-symbols-npm-2.0.0-16fb8dedc6-4f54bbc301.zip/node_modules/well-known-symbols/",\ + "packageDependencies": [\ + ["well-known-symbols", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["whatwg-url", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/cache/whatwg-url-npm-5.0.0-374fb45e60-f95adbc1e8.zip/node_modules/whatwg-url/",\ + "packageDependencies": [\ + ["whatwg-url", "npm:5.0.0"],\ + ["tr46", "npm:0.0.3"],\ + ["webidl-conversions", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["which", [\ + ["npm:1.3.1", {\ + "packageLocation": "./.yarn/cache/which-npm-1.3.1-f0ebb8bdd8-549dcf1752.zip/node_modules/which/",\ + "packageDependencies": [\ + ["which", "npm:1.3.1"],\ + ["isexe", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.2", {\ + "packageLocation": "./.yarn/cache/which-npm-2.0.2-320ddf72f7-4782f8a1d6.zip/node_modules/which/",\ + "packageDependencies": [\ + ["which", "npm:2.0.2"],\ + ["isexe", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/which-npm-4.0.0-dd31cd4928-f17e84c042.zip/node_modules/which/",\ + "packageDependencies": [\ + ["which", "npm:4.0.0"],\ + ["isexe", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["which-boxed-primitive", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/which-boxed-primitive-npm-1.0.2-e214f9ae5a-9c7ca78552.zip/node_modules/which-boxed-primitive/",\ + "packageDependencies": [\ + ["which-boxed-primitive", "npm:1.0.2"],\ + ["is-bigint", "npm:1.0.4"],\ + ["is-boolean-object", "npm:1.1.2"],\ + ["is-number-object", "npm:1.0.7"],\ + ["is-string", "npm:1.0.7"],\ + ["is-symbol", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["which-typed-array", [\ + ["npm:1.1.13", {\ + "packageLocation": "./.yarn/cache/which-typed-array-npm-1.1.13-92c18b4878-605e3e10b7.zip/node_modules/which-typed-array/",\ + "packageDependencies": [\ + ["which-typed-array", "npm:1.1.13"],\ + ["available-typed-arrays", "npm:1.0.5"],\ + ["call-bind", "npm:1.0.5"],\ + ["for-each", "npm:0.3.3"],\ + ["gopd", "npm:1.0.1"],\ + ["has-tostringtag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["wide-align", [\ + ["npm:1.1.5", {\ + "packageLocation": "./.yarn/cache/wide-align-npm-1.1.5-889d77e592-d5f8027b9a.zip/node_modules/wide-align/",\ + "packageDependencies": [\ + ["wide-align", "npm:1.1.5"],\ + ["string-width", "npm:4.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["word-wrap", [\ + ["npm:1.2.5", {\ + "packageLocation": "./.yarn/cache/word-wrap-npm-1.2.5-42d00c4b09-1ec6f6089f.zip/node_modules/word-wrap/",\ + "packageDependencies": [\ + ["word-wrap", "npm:1.2.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["wordwrap", [\ + ["npm:1.0.0", {\ + "packageLocation": "./.yarn/cache/wordwrap-npm-1.0.0-ae57a645e8-497d40beb2.zip/node_modules/wordwrap/",\ + "packageDependencies": [\ + ["wordwrap", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["wrap-ansi", [\ + ["npm:7.0.0", {\ + "packageLocation": "./.yarn/cache/wrap-ansi-npm-7.0.0-ad6e1a0554-cebdaeca3a.zip/node_modules/wrap-ansi/",\ + "packageDependencies": [\ + ["wrap-ansi", "npm:7.0.0"],\ + ["ansi-styles", "npm:4.3.0"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.1.0", {\ + "packageLocation": "./.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-7b1e4b35e9.zip/node_modules/wrap-ansi/",\ + "packageDependencies": [\ + ["wrap-ansi", "npm:8.1.0"],\ + ["ansi-styles", "npm:6.2.1"],\ + ["string-width", "npm:5.1.2"],\ + ["strip-ansi", "npm:7.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["wrappy", [\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip/node_modules/wrappy/",\ + "packageDependencies": [\ + ["wrappy", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["write-file-atomic", [\ + ["npm:3.0.3", {\ + "packageLocation": "./.yarn/cache/write-file-atomic-npm-3.0.3-d948a237da-0955ab9430.zip/node_modules/write-file-atomic/",\ + "packageDependencies": [\ + ["write-file-atomic", "npm:3.0.3"],\ + ["imurmurhash", "npm:0.1.4"],\ + ["is-typedarray", "npm:1.0.0"],\ + ["signal-exit", "npm:3.0.7"],\ + ["typedarray-to-buffer", "npm:3.1.5"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.1", {\ + "packageLocation": "./.yarn/cache/write-file-atomic-npm-5.0.1-52283db6ee-648efddba5.zip/node_modules/write-file-atomic/",\ + "packageDependencies": [\ + ["write-file-atomic", "npm:5.0.1"],\ + ["imurmurhash", "npm:0.1.4"],\ + ["signal-exit", "npm:4.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["xdg-basedir", [\ + ["npm:5.1.0", {\ + "packageLocation": "./.yarn/cache/xdg-basedir-npm-5.1.0-589d73b54c-b60e8a2c66.zip/node_modules/xdg-basedir/",\ + "packageDependencies": [\ + ["xdg-basedir", "npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["xtend", [\ + ["npm:4.0.2", {\ + "packageLocation": "./.yarn/cache/xtend-npm-4.0.2-7f2375736e-ac5dfa738b.zip/node_modules/xtend/",\ + "packageDependencies": [\ + ["xtend", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["y18n", [\ + ["npm:5.0.8", {\ + "packageLocation": "./.yarn/cache/y18n-npm-5.0.8-5f3a0a7e62-5f1b5f95e3.zip/node_modules/y18n/",\ + "packageDependencies": [\ + ["y18n", "npm:5.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["yallist", [\ + ["npm:4.0.0", {\ + "packageLocation": "./.yarn/cache/yallist-npm-4.0.0-b493d9e907-4cb02b42b8.zip/node_modules/yallist/",\ + "packageDependencies": [\ + ["yallist", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["yaml", [\ + ["npm:2.3.4", {\ + "packageLocation": "./.yarn/cache/yaml-npm-2.3.4-8bb6dc2c0d-f8207ce430.zip/node_modules/yaml/",\ + "packageDependencies": [\ + ["yaml", "npm:2.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["yargs", [\ + ["npm:16.2.0", {\ + "packageLocation": "./.yarn/cache/yargs-npm-16.2.0-547873d425-807fa21211.zip/node_modules/yargs/",\ + "packageDependencies": [\ + ["yargs", "npm:16.2.0"],\ + ["cliui", "npm:7.0.4"],\ + ["escalade", "npm:3.1.1"],\ + ["get-caller-file", "npm:2.0.5"],\ + ["require-directory", "npm:2.1.1"],\ + ["string-width", "npm:4.2.3"],\ + ["y18n", "npm:5.0.8"],\ + ["yargs-parser", "npm:20.2.9"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:17.7.2", {\ + "packageLocation": "./.yarn/cache/yargs-npm-17.7.2-80b62638e1-abb3e37678.zip/node_modules/yargs/",\ + "packageDependencies": [\ + ["yargs", "npm:17.7.2"],\ + ["cliui", "npm:8.0.1"],\ + ["escalade", "npm:3.1.1"],\ + ["get-caller-file", "npm:2.0.5"],\ + ["require-directory", "npm:2.1.1"],\ + ["string-width", "npm:4.2.3"],\ + ["y18n", "npm:5.0.8"],\ + ["yargs-parser", "npm:21.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["yargs-parser", [\ + ["npm:20.2.9", {\ + "packageLocation": "./.yarn/cache/yargs-parser-npm-20.2.9-a1d19e598d-0188f430a0.zip/node_modules/yargs-parser/",\ + "packageDependencies": [\ + ["yargs-parser", "npm:20.2.9"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:21.1.1", {\ + "packageLocation": "./.yarn/cache/yargs-parser-npm-21.1.1-8fdc003314-9dc2c217ea.zip/node_modules/yargs-parser/",\ + "packageDependencies": [\ + ["yargs-parser", "npm:21.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["yocto-queue", [\ + ["npm:0.1.0", {\ + "packageLocation": "./.yarn/cache/yocto-queue-npm-0.1.0-c6c9a7db29-f77b3d8d00.zip/node_modules/yocto-queue/",\ + "packageDependencies": [\ + ["yocto-queue", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["z-schema", [\ + ["npm:5.0.5", {\ + "packageLocation": "./.yarn/cache/z-schema-npm-5.0.5-94fb0e21a9-8ac2fa445f.zip/node_modules/z-schema/",\ + "packageDependencies": [\ + ["z-schema", "npm:5.0.5"],\ + ["commander", "npm:9.5.0"],\ + ["lodash.get", "npm:4.4.2"],\ + ["lodash.isequal", "npm:4.5.0"],\ + ["validator", "npm:13.11.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]]\ + ]\ +}'; + +function $$SETUP_STATE(hydrateRuntimeState, basePath) { + return hydrateRuntimeState(JSON.parse(RAW_RUNTIME_STATE), {basePath: basePath || __dirname}); +} + +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); +const os = require('os'); +const events = require('events'); +const nodeUtils = require('util'); +const stream = require('stream'); +const zlib = require('zlib'); +const require$$0 = require('module'); +const StringDecoder = require('string_decoder'); +const url = require('url'); +const buffer = require('buffer'); +const readline = require('readline'); +const assert = require('assert'); + +const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e }; + +function _interopNamespace(e) { + if (e && e.__esModule) return e; + const n = Object.create(null); + if (e) { + for (const k in e) { + if (k !== 'default') { + const d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } + n.default = e; + return Object.freeze(n); +} + +const fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); +const path__default = /*#__PURE__*/_interopDefaultLegacy(path); +const nodeUtils__namespace = /*#__PURE__*/_interopNamespace(nodeUtils); +const zlib__default = /*#__PURE__*/_interopDefaultLegacy(zlib); +const require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0); +const StringDecoder__default = /*#__PURE__*/_interopDefaultLegacy(StringDecoder); +const buffer__default = /*#__PURE__*/_interopDefaultLegacy(buffer); +const assert__default = /*#__PURE__*/_interopDefaultLegacy(assert); + +const S_IFMT = 61440; +const S_IFDIR = 16384; +const S_IFREG = 32768; +const S_IFLNK = 40960; +const SAFE_TIME = 456789e3; + +function makeError$1(code, message) { + return Object.assign(new Error(`${code}: ${message}`), { code }); +} +function EBUSY(message) { + return makeError$1(`EBUSY`, message); +} +function ENOSYS(message, reason) { + return makeError$1(`ENOSYS`, `${message}, ${reason}`); +} +function EINVAL(reason) { + return makeError$1(`EINVAL`, `invalid argument, ${reason}`); +} +function EBADF(reason) { + return makeError$1(`EBADF`, `bad file descriptor, ${reason}`); +} +function ENOENT(reason) { + return makeError$1(`ENOENT`, `no such file or directory, ${reason}`); +} +function ENOTDIR(reason) { + return makeError$1(`ENOTDIR`, `not a directory, ${reason}`); +} +function EISDIR(reason) { + return makeError$1(`EISDIR`, `illegal operation on a directory, ${reason}`); +} +function EEXIST(reason) { + return makeError$1(`EEXIST`, `file already exists, ${reason}`); +} +function EROFS(reason) { + return makeError$1(`EROFS`, `read-only filesystem, ${reason}`); +} +function ENOTEMPTY(reason) { + return makeError$1(`ENOTEMPTY`, `directory not empty, ${reason}`); +} +function EOPNOTSUPP(reason) { + return makeError$1(`EOPNOTSUPP`, `operation not supported, ${reason}`); +} +function ERR_DIR_CLOSED() { + return makeError$1(`ERR_DIR_CLOSED`, `Directory handle was closed`); +} + +const DEFAULT_MODE = S_IFREG | 420; +class StatEntry { + constructor() { + this.uid = 0; + this.gid = 0; + this.size = 0; + this.blksize = 0; + this.atimeMs = 0; + this.mtimeMs = 0; + this.ctimeMs = 0; + this.birthtimeMs = 0; + this.atime = new Date(0); + this.mtime = new Date(0); + this.ctime = new Date(0); + this.birthtime = new Date(0); + this.dev = 0; + this.ino = 0; + this.mode = DEFAULT_MODE; + this.nlink = 1; + this.rdev = 0; + this.blocks = 1; + } + isBlockDevice() { + return false; + } + isCharacterDevice() { + return false; + } + isDirectory() { + return (this.mode & S_IFMT) === S_IFDIR; + } + isFIFO() { + return false; + } + isFile() { + return (this.mode & S_IFMT) === S_IFREG; + } + isSocket() { + return false; + } + isSymbolicLink() { + return (this.mode & S_IFMT) === S_IFLNK; + } +} +class BigIntStatsEntry { + constructor() { + this.uid = BigInt(0); + this.gid = BigInt(0); + this.size = BigInt(0); + this.blksize = BigInt(0); + this.atimeMs = BigInt(0); + this.mtimeMs = BigInt(0); + this.ctimeMs = BigInt(0); + this.birthtimeMs = BigInt(0); + this.atimeNs = BigInt(0); + this.mtimeNs = BigInt(0); + this.ctimeNs = BigInt(0); + this.birthtimeNs = BigInt(0); + this.atime = new Date(0); + this.mtime = new Date(0); + this.ctime = new Date(0); + this.birthtime = new Date(0); + this.dev = BigInt(0); + this.ino = BigInt(0); + this.mode = BigInt(DEFAULT_MODE); + this.nlink = BigInt(1); + this.rdev = BigInt(0); + this.blocks = BigInt(1); + } + isBlockDevice() { + return false; + } + isCharacterDevice() { + return false; + } + isDirectory() { + return (this.mode & BigInt(S_IFMT)) === BigInt(S_IFDIR); + } + isFIFO() { + return false; + } + isFile() { + return (this.mode & BigInt(S_IFMT)) === BigInt(S_IFREG); + } + isSocket() { + return false; + } + isSymbolicLink() { + return (this.mode & BigInt(S_IFMT)) === BigInt(S_IFLNK); + } +} +function makeDefaultStats() { + return new StatEntry(); +} +function clearStats(stats) { + for (const key in stats) { + if (Object.hasOwn(stats, key)) { + const element = stats[key]; + if (typeof element === `number`) { + stats[key] = 0; + } else if (typeof element === `bigint`) { + stats[key] = BigInt(0); + } else if (nodeUtils__namespace.types.isDate(element)) { + stats[key] = new Date(0); + } + } + } + return stats; +} +function convertToBigIntStats(stats) { + const bigintStats = new BigIntStatsEntry(); + for (const key in stats) { + if (Object.hasOwn(stats, key)) { + const element = stats[key]; + if (typeof element === `number`) { + bigintStats[key] = BigInt(element); + } else if (nodeUtils__namespace.types.isDate(element)) { + bigintStats[key] = new Date(element); + } + } + } + bigintStats.atimeNs = bigintStats.atimeMs * BigInt(1e6); + bigintStats.mtimeNs = bigintStats.mtimeMs * BigInt(1e6); + bigintStats.ctimeNs = bigintStats.ctimeMs * BigInt(1e6); + bigintStats.birthtimeNs = bigintStats.birthtimeMs * BigInt(1e6); + return bigintStats; +} +function areStatsEqual(a, b) { + if (a.atimeMs !== b.atimeMs) + return false; + if (a.birthtimeMs !== b.birthtimeMs) + return false; + if (a.blksize !== b.blksize) + return false; + if (a.blocks !== b.blocks) + return false; + if (a.ctimeMs !== b.ctimeMs) + return false; + if (a.dev !== b.dev) + return false; + if (a.gid !== b.gid) + return false; + if (a.ino !== b.ino) + return false; + if (a.isBlockDevice() !== b.isBlockDevice()) + return false; + if (a.isCharacterDevice() !== b.isCharacterDevice()) + return false; + if (a.isDirectory() !== b.isDirectory()) + return false; + if (a.isFIFO() !== b.isFIFO()) + return false; + if (a.isFile() !== b.isFile()) + return false; + if (a.isSocket() !== b.isSocket()) + return false; + if (a.isSymbolicLink() !== b.isSymbolicLink()) + return false; + if (a.mode !== b.mode) + return false; + if (a.mtimeMs !== b.mtimeMs) + return false; + if (a.nlink !== b.nlink) + return false; + if (a.rdev !== b.rdev) + return false; + if (a.size !== b.size) + return false; + if (a.uid !== b.uid) + return false; + const aN = a; + const bN = b; + if (aN.atimeNs !== bN.atimeNs) + return false; + if (aN.mtimeNs !== bN.mtimeNs) + return false; + if (aN.ctimeNs !== bN.ctimeNs) + return false; + if (aN.birthtimeNs !== bN.birthtimeNs) + return false; + return true; +} + +const PortablePath = { + root: `/`, + dot: `.`, + parent: `..` +}; +const Filename = { + home: `~`, + nodeModules: `node_modules`, + manifest: `package.json`, + lockfile: `yarn.lock`, + virtual: `__virtual__`, + pnpJs: `.pnp.js`, + pnpCjs: `.pnp.cjs`, + pnpData: `.pnp.data.json`, + pnpEsmLoader: `.pnp.loader.mjs`, + rc: `.yarnrc.yml`, + env: `.env` +}; +const npath = Object.create(path__default.default); +const ppath = Object.create(path__default.default.posix); +npath.cwd = () => process.cwd(); +ppath.cwd = process.platform === `win32` ? () => toPortablePath(process.cwd()) : process.cwd; +if (process.platform === `win32`) { + ppath.resolve = (...segments) => { + if (segments.length > 0 && ppath.isAbsolute(segments[0])) { + return path__default.default.posix.resolve(...segments); + } else { + return path__default.default.posix.resolve(ppath.cwd(), ...segments); + } + }; +} +const contains = function(pathUtils, from, to) { + from = pathUtils.normalize(from); + to = pathUtils.normalize(to); + if (from === to) + return `.`; + if (!from.endsWith(pathUtils.sep)) + from = from + pathUtils.sep; + if (to.startsWith(from)) { + return to.slice(from.length); + } else { + return null; + } +}; +npath.contains = (from, to) => contains(npath, from, to); +ppath.contains = (from, to) => contains(ppath, from, to); +const WINDOWS_PATH_REGEXP = /^([a-zA-Z]:.*)$/; +const UNC_WINDOWS_PATH_REGEXP = /^\/\/(\.\/)?(.*)$/; +const PORTABLE_PATH_REGEXP = /^\/([a-zA-Z]:.*)$/; +const UNC_PORTABLE_PATH_REGEXP = /^\/unc\/(\.dot\/)?(.*)$/; +function fromPortablePathWin32(p) { + let portablePathMatch, uncPortablePathMatch; + if (portablePathMatch = p.match(PORTABLE_PATH_REGEXP)) + p = portablePathMatch[1]; + else if (uncPortablePathMatch = p.match(UNC_PORTABLE_PATH_REGEXP)) + p = `\\\\${uncPortablePathMatch[1] ? `.\\` : ``}${uncPortablePathMatch[2]}`; + else + return p; + return p.replace(/\//g, `\\`); +} +function toPortablePathWin32(p) { + p = p.replace(/\\/g, `/`); + let windowsPathMatch, uncWindowsPathMatch; + if (windowsPathMatch = p.match(WINDOWS_PATH_REGEXP)) + p = `/${windowsPathMatch[1]}`; + else if (uncWindowsPathMatch = p.match(UNC_WINDOWS_PATH_REGEXP)) + p = `/unc/${uncWindowsPathMatch[1] ? `.dot/` : ``}${uncWindowsPathMatch[2]}`; + return p; +} +const toPortablePath = process.platform === `win32` ? toPortablePathWin32 : (p) => p; +const fromPortablePath = process.platform === `win32` ? fromPortablePathWin32 : (p) => p; +npath.fromPortablePath = fromPortablePath; +npath.toPortablePath = toPortablePath; +function convertPath(targetPathUtils, sourcePath) { + return targetPathUtils === npath ? fromPortablePath(sourcePath) : toPortablePath(sourcePath); +} + +const defaultTime = new Date(SAFE_TIME * 1e3); +const defaultTimeMs = defaultTime.getTime(); +async function copyPromise(destinationFs, destination, sourceFs, source, opts) { + const normalizedDestination = destinationFs.pathUtils.normalize(destination); + const normalizedSource = sourceFs.pathUtils.normalize(source); + const prelayout = []; + const postlayout = []; + const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : await sourceFs.lstatPromise(normalizedSource); + await destinationFs.mkdirpPromise(destinationFs.pathUtils.dirname(destination), { utimes: [atime, mtime] }); + await copyImpl(prelayout, postlayout, destinationFs, normalizedDestination, sourceFs, normalizedSource, { ...opts, didParentExist: true }); + for (const operation of prelayout) + await operation(); + await Promise.all(postlayout.map((operation) => { + return operation(); + })); +} +async function copyImpl(prelayout, postlayout, destinationFs, destination, sourceFs, source, opts) { + const destinationStat = opts.didParentExist ? await maybeLStat(destinationFs, destination) : null; + const sourceStat = await sourceFs.lstatPromise(source); + const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : sourceStat; + let updated; + switch (true) { + case sourceStat.isDirectory(): + { + updated = await copyFolder(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } + break; + case sourceStat.isFile(): + { + updated = await copyFile(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } + break; + case sourceStat.isSymbolicLink(): + { + updated = await copySymlink(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } + break; + default: + { + throw new Error(`Unsupported file type (${sourceStat.mode})`); + } + } + if (opts.linkStrategy?.type !== `HardlinkFromIndex` || !sourceStat.isFile()) { + if (updated || destinationStat?.mtime?.getTime() !== mtime.getTime() || destinationStat?.atime?.getTime() !== atime.getTime()) { + postlayout.push(() => destinationFs.lutimesPromise(destination, atime, mtime)); + updated = true; + } + if (destinationStat === null || (destinationStat.mode & 511) !== (sourceStat.mode & 511)) { + postlayout.push(() => destinationFs.chmodPromise(destination, sourceStat.mode & 511)); + updated = true; + } + } + return updated; +} +async function maybeLStat(baseFs, p) { + try { + return await baseFs.lstatPromise(p); + } catch (e) { + return null; + } +} +async function copyFolder(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (destinationStat !== null && !destinationStat.isDirectory()) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + let updated = false; + if (destinationStat === null) { + prelayout.push(async () => { + try { + await destinationFs.mkdirPromise(destination, { mode: sourceStat.mode }); + } catch (err) { + if (err.code !== `EEXIST`) { + throw err; + } + } + }); + updated = true; + } + const entries = await sourceFs.readdirPromise(source); + const nextOpts = opts.didParentExist && !destinationStat ? { ...opts, didParentExist: false } : opts; + if (opts.stableSort) { + for (const entry of entries.sort()) { + if (await copyImpl(prelayout, postlayout, destinationFs, destinationFs.pathUtils.join(destination, entry), sourceFs, sourceFs.pathUtils.join(source, entry), nextOpts)) { + updated = true; + } + } + } else { + const entriesUpdateStatus = await Promise.all(entries.map(async (entry) => { + await copyImpl(prelayout, postlayout, destinationFs, destinationFs.pathUtils.join(destination, entry), sourceFs, sourceFs.pathUtils.join(source, entry), nextOpts); + })); + if (entriesUpdateStatus.some((status) => status)) { + updated = true; + } + } + return updated; +} +async function copyFileViaIndex(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts, linkStrategy) { + const sourceHash = await sourceFs.checksumFilePromise(source, { algorithm: `sha1` }); + const indexPath = destinationFs.pathUtils.join(linkStrategy.indexPath, sourceHash.slice(0, 2), `${sourceHash}.dat`); + let AtomicBehavior; + ((AtomicBehavior2) => { + AtomicBehavior2[AtomicBehavior2["Lock"] = 0] = "Lock"; + AtomicBehavior2[AtomicBehavior2["Rename"] = 1] = "Rename"; + })(AtomicBehavior || (AtomicBehavior = {})); + let atomicBehavior = 1 /* Rename */; + let indexStat = await maybeLStat(destinationFs, indexPath); + if (destinationStat) { + const isDestinationHardlinkedFromIndex = indexStat && destinationStat.dev === indexStat.dev && destinationStat.ino === indexStat.ino; + const isIndexModified = indexStat?.mtimeMs !== defaultTimeMs; + if (isDestinationHardlinkedFromIndex) { + if (isIndexModified && linkStrategy.autoRepair) { + atomicBehavior = 0 /* Lock */; + indexStat = null; + } + } + if (!isDestinationHardlinkedFromIndex) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + } + const tempPath = !indexStat && atomicBehavior === 1 /* Rename */ ? `${indexPath}.${Math.floor(Math.random() * 4294967296).toString(16).padStart(8, `0`)}` : null; + let tempPathCleaned = false; + prelayout.push(async () => { + if (!indexStat) { + if (atomicBehavior === 0 /* Lock */) { + await destinationFs.lockPromise(indexPath, async () => { + const content = await sourceFs.readFilePromise(source); + await destinationFs.writeFilePromise(indexPath, content); + }); + } + if (atomicBehavior === 1 /* Rename */ && tempPath) { + const content = await sourceFs.readFilePromise(source); + await destinationFs.writeFilePromise(tempPath, content); + try { + await destinationFs.linkPromise(tempPath, indexPath); + } catch (err) { + if (err.code === `EEXIST`) { + tempPathCleaned = true; + await destinationFs.unlinkPromise(tempPath); + } else { + throw err; + } + } + } + } + if (!destinationStat) { + await destinationFs.linkPromise(indexPath, destination); + } + }); + postlayout.push(async () => { + if (!indexStat) + await destinationFs.lutimesPromise(indexPath, defaultTime, defaultTime); + if (tempPath && !tempPathCleaned) { + await destinationFs.unlinkPromise(tempPath); + } + }); + return false; +} +async function copyFileDirect(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (destinationStat !== null) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + prelayout.push(async () => { + const content = await sourceFs.readFilePromise(source); + await destinationFs.writeFilePromise(destination, content); + }); + return true; +} +async function copyFile(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (opts.linkStrategy?.type === `HardlinkFromIndex`) { + return copyFileViaIndex(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts, opts.linkStrategy); + } else { + return copyFileDirect(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } +} +async function copySymlink(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (destinationStat !== null) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + prelayout.push(async () => { + await destinationFs.symlinkPromise(convertPath(destinationFs.pathUtils, await sourceFs.readlinkPromise(source)), destination); + }); + return true; +} + +class CustomDir { + constructor(path, nextDirent, opts = {}) { + this.path = path; + this.nextDirent = nextDirent; + this.opts = opts; + this.closed = false; + } + throwIfClosed() { + if (this.closed) { + throw ERR_DIR_CLOSED(); + } + } + async *[Symbol.asyncIterator]() { + try { + let dirent; + while ((dirent = await this.read()) !== null) { + yield dirent; + } + } finally { + await this.close(); + } + } + read(cb) { + const dirent = this.readSync(); + if (typeof cb !== `undefined`) + return cb(null, dirent); + return Promise.resolve(dirent); + } + readSync() { + this.throwIfClosed(); + return this.nextDirent(); + } + close(cb) { + this.closeSync(); + if (typeof cb !== `undefined`) + return cb(null); + return Promise.resolve(); + } + closeSync() { + this.throwIfClosed(); + this.opts.onClose?.(); + this.closed = true; + } +} +function opendir(fakeFs, path, entries, opts) { + const nextDirent = () => { + const filename = entries.shift(); + if (typeof filename === `undefined`) + return null; + const entryPath = fakeFs.pathUtils.join(path, filename); + return Object.assign(fakeFs.statSync(entryPath), { + name: filename, + path: void 0 + }); + }; + return new CustomDir(path, nextDirent, opts); +} + +function assertStatus(current, expected) { + if (current !== expected) { + throw new Error(`Invalid StatWatcher status: expected '${expected}', got '${current}'`); + } +} +class CustomStatWatcher extends events.EventEmitter { + constructor(fakeFs, path, { bigint = false } = {}) { + super(); + this.status = "ready" /* Ready */; + this.changeListeners = /* @__PURE__ */ new Map(); + this.startTimeout = null; + this.fakeFs = fakeFs; + this.path = path; + this.bigint = bigint; + this.lastStats = this.stat(); + } + static create(fakeFs, path, opts) { + const statWatcher = new CustomStatWatcher(fakeFs, path, opts); + statWatcher.start(); + return statWatcher; + } + start() { + assertStatus(this.status, "ready" /* Ready */); + this.status = "running" /* Running */; + this.startTimeout = setTimeout(() => { + this.startTimeout = null; + if (!this.fakeFs.existsSync(this.path)) { + this.emit("change" /* Change */, this.lastStats, this.lastStats); + } + }, 3); + } + stop() { + assertStatus(this.status, "running" /* Running */); + this.status = "stopped" /* Stopped */; + if (this.startTimeout !== null) { + clearTimeout(this.startTimeout); + this.startTimeout = null; + } + this.emit("stop" /* Stop */); + } + stat() { + try { + return this.fakeFs.statSync(this.path, { bigint: this.bigint }); + } catch (error) { + const statInstance = this.bigint ? new BigIntStatsEntry() : new StatEntry(); + return clearStats(statInstance); + } + } + makeInterval(opts) { + const interval = setInterval(() => { + const currentStats = this.stat(); + const previousStats = this.lastStats; + if (areStatsEqual(currentStats, previousStats)) + return; + this.lastStats = currentStats; + this.emit("change" /* Change */, currentStats, previousStats); + }, opts.interval); + return opts.persistent ? interval : interval.unref(); + } + registerChangeListener(listener, opts) { + this.addListener("change" /* Change */, listener); + this.changeListeners.set(listener, this.makeInterval(opts)); + } + unregisterChangeListener(listener) { + this.removeListener("change" /* Change */, listener); + const interval = this.changeListeners.get(listener); + if (typeof interval !== `undefined`) + clearInterval(interval); + this.changeListeners.delete(listener); + } + unregisterAllChangeListeners() { + for (const listener of this.changeListeners.keys()) { + this.unregisterChangeListener(listener); + } + } + hasChangeListeners() { + return this.changeListeners.size > 0; + } + ref() { + for (const interval of this.changeListeners.values()) + interval.ref(); + return this; + } + unref() { + for (const interval of this.changeListeners.values()) + interval.unref(); + return this; + } +} + +const statWatchersByFakeFS = /* @__PURE__ */ new WeakMap(); +function watchFile(fakeFs, path, a, b) { + let bigint; + let persistent; + let interval; + let listener; + switch (typeof a) { + case `function`: + { + bigint = false; + persistent = true; + interval = 5007; + listener = a; + } + break; + default: + { + ({ + bigint = false, + persistent = true, + interval = 5007 + } = a); + listener = b; + } + break; + } + let statWatchers = statWatchersByFakeFS.get(fakeFs); + if (typeof statWatchers === `undefined`) + statWatchersByFakeFS.set(fakeFs, statWatchers = /* @__PURE__ */ new Map()); + let statWatcher = statWatchers.get(path); + if (typeof statWatcher === `undefined`) { + statWatcher = CustomStatWatcher.create(fakeFs, path, { bigint }); + statWatchers.set(path, statWatcher); + } + statWatcher.registerChangeListener(listener, { persistent, interval }); + return statWatcher; +} +function unwatchFile(fakeFs, path, cb) { + const statWatchers = statWatchersByFakeFS.get(fakeFs); + if (typeof statWatchers === `undefined`) + return; + const statWatcher = statWatchers.get(path); + if (typeof statWatcher === `undefined`) + return; + if (typeof cb === `undefined`) + statWatcher.unregisterAllChangeListeners(); + else + statWatcher.unregisterChangeListener(cb); + if (!statWatcher.hasChangeListeners()) { + statWatcher.stop(); + statWatchers.delete(path); + } +} +function unwatchAllFiles(fakeFs) { + const statWatchers = statWatchersByFakeFS.get(fakeFs); + if (typeof statWatchers === `undefined`) + return; + for (const path of statWatchers.keys()) { + unwatchFile(fakeFs, path); + } +} + +class FakeFS { + constructor(pathUtils) { + this.pathUtils = pathUtils; + } + async *genTraversePromise(init, { stableSort = false } = {}) { + const stack = [init]; + while (stack.length > 0) { + const p = stack.shift(); + const entry = await this.lstatPromise(p); + if (entry.isDirectory()) { + const entries = await this.readdirPromise(p); + if (stableSort) { + for (const entry2 of entries.sort()) { + stack.push(this.pathUtils.join(p, entry2)); + } + } else { + throw new Error(`Not supported`); + } + } else { + yield p; + } + } + } + async checksumFilePromise(path, { algorithm = `sha512` } = {}) { + const fd = await this.openPromise(path, `r`); + try { + const CHUNK_SIZE = 65536; + const chunk = Buffer.allocUnsafeSlow(CHUNK_SIZE); + const hash = crypto.createHash(algorithm); + let bytesRead = 0; + while ((bytesRead = await this.readPromise(fd, chunk, 0, CHUNK_SIZE)) !== 0) + hash.update(bytesRead === CHUNK_SIZE ? chunk : chunk.slice(0, bytesRead)); + return hash.digest(`hex`); + } finally { + await this.closePromise(fd); + } + } + async removePromise(p, { recursive = true, maxRetries = 5 } = {}) { + let stat; + try { + stat = await this.lstatPromise(p); + } catch (error) { + if (error.code === `ENOENT`) { + return; + } else { + throw error; + } + } + if (stat.isDirectory()) { + if (recursive) { + const entries = await this.readdirPromise(p); + await Promise.all(entries.map((entry) => { + return this.removePromise(this.pathUtils.resolve(p, entry)); + })); + } + for (let t = 0; t <= maxRetries; t++) { + try { + await this.rmdirPromise(p); + break; + } catch (error) { + if (error.code !== `EBUSY` && error.code !== `ENOTEMPTY`) { + throw error; + } else if (t < maxRetries) { + await new Promise((resolve) => setTimeout(resolve, t * 100)); + } + } + } + } else { + await this.unlinkPromise(p); + } + } + removeSync(p, { recursive = true } = {}) { + let stat; + try { + stat = this.lstatSync(p); + } catch (error) { + if (error.code === `ENOENT`) { + return; + } else { + throw error; + } + } + if (stat.isDirectory()) { + if (recursive) + for (const entry of this.readdirSync(p)) + this.removeSync(this.pathUtils.resolve(p, entry)); + this.rmdirSync(p); + } else { + this.unlinkSync(p); + } + } + async mkdirpPromise(p, { chmod, utimes } = {}) { + p = this.resolve(p); + if (p === this.pathUtils.dirname(p)) + return void 0; + const parts = p.split(this.pathUtils.sep); + let createdDirectory; + for (let u = 2; u <= parts.length; ++u) { + const subPath = parts.slice(0, u).join(this.pathUtils.sep); + if (!this.existsSync(subPath)) { + try { + await this.mkdirPromise(subPath); + } catch (error) { + if (error.code === `EEXIST`) { + continue; + } else { + throw error; + } + } + createdDirectory ??= subPath; + if (chmod != null) + await this.chmodPromise(subPath, chmod); + if (utimes != null) { + await this.utimesPromise(subPath, utimes[0], utimes[1]); + } else { + const parentStat = await this.statPromise(this.pathUtils.dirname(subPath)); + await this.utimesPromise(subPath, parentStat.atime, parentStat.mtime); + } + } + } + return createdDirectory; + } + mkdirpSync(p, { chmod, utimes } = {}) { + p = this.resolve(p); + if (p === this.pathUtils.dirname(p)) + return void 0; + const parts = p.split(this.pathUtils.sep); + let createdDirectory; + for (let u = 2; u <= parts.length; ++u) { + const subPath = parts.slice(0, u).join(this.pathUtils.sep); + if (!this.existsSync(subPath)) { + try { + this.mkdirSync(subPath); + } catch (error) { + if (error.code === `EEXIST`) { + continue; + } else { + throw error; + } + } + createdDirectory ??= subPath; + if (chmod != null) + this.chmodSync(subPath, chmod); + if (utimes != null) { + this.utimesSync(subPath, utimes[0], utimes[1]); + } else { + const parentStat = this.statSync(this.pathUtils.dirname(subPath)); + this.utimesSync(subPath, parentStat.atime, parentStat.mtime); + } + } + } + return createdDirectory; + } + async copyPromise(destination, source, { baseFs = this, overwrite = true, stableSort = false, stableTime = false, linkStrategy = null } = {}) { + return await copyPromise(this, destination, baseFs, source, { overwrite, stableSort, stableTime, linkStrategy }); + } + copySync(destination, source, { baseFs = this, overwrite = true } = {}) { + const stat = baseFs.lstatSync(source); + const exists = this.existsSync(destination); + if (stat.isDirectory()) { + this.mkdirpSync(destination); + const directoryListing = baseFs.readdirSync(source); + for (const entry of directoryListing) { + this.copySync(this.pathUtils.join(destination, entry), baseFs.pathUtils.join(source, entry), { baseFs, overwrite }); + } + } else if (stat.isFile()) { + if (!exists || overwrite) { + if (exists) + this.removeSync(destination); + const content = baseFs.readFileSync(source); + this.writeFileSync(destination, content); + } + } else if (stat.isSymbolicLink()) { + if (!exists || overwrite) { + if (exists) + this.removeSync(destination); + const target = baseFs.readlinkSync(source); + this.symlinkSync(convertPath(this.pathUtils, target), destination); + } + } else { + throw new Error(`Unsupported file type (file: ${source}, mode: 0o${stat.mode.toString(8).padStart(6, `0`)})`); + } + const mode = stat.mode & 511; + this.chmodSync(destination, mode); + } + async changeFilePromise(p, content, opts = {}) { + if (Buffer.isBuffer(content)) { + return this.changeFileBufferPromise(p, content, opts); + } else { + return this.changeFileTextPromise(p, content, opts); + } + } + async changeFileBufferPromise(p, content, { mode } = {}) { + let current = Buffer.alloc(0); + try { + current = await this.readFilePromise(p); + } catch (error) { + } + if (Buffer.compare(current, content) === 0) + return; + await this.writeFilePromise(p, content, { mode }); + } + async changeFileTextPromise(p, content, { automaticNewlines, mode } = {}) { + let current = ``; + try { + current = await this.readFilePromise(p, `utf8`); + } catch (error) { + } + const normalizedContent = automaticNewlines ? normalizeLineEndings(current, content) : content; + if (current === normalizedContent) + return; + await this.writeFilePromise(p, normalizedContent, { mode }); + } + changeFileSync(p, content, opts = {}) { + if (Buffer.isBuffer(content)) { + return this.changeFileBufferSync(p, content, opts); + } else { + return this.changeFileTextSync(p, content, opts); + } + } + changeFileBufferSync(p, content, { mode } = {}) { + let current = Buffer.alloc(0); + try { + current = this.readFileSync(p); + } catch (error) { + } + if (Buffer.compare(current, content) === 0) + return; + this.writeFileSync(p, content, { mode }); + } + changeFileTextSync(p, content, { automaticNewlines = false, mode } = {}) { + let current = ``; + try { + current = this.readFileSync(p, `utf8`); + } catch (error) { + } + const normalizedContent = automaticNewlines ? normalizeLineEndings(current, content) : content; + if (current === normalizedContent) + return; + this.writeFileSync(p, normalizedContent, { mode }); + } + async movePromise(fromP, toP) { + try { + await this.renamePromise(fromP, toP); + } catch (error) { + if (error.code === `EXDEV`) { + await this.copyPromise(toP, fromP); + await this.removePromise(fromP); + } else { + throw error; + } + } + } + moveSync(fromP, toP) { + try { + this.renameSync(fromP, toP); + } catch (error) { + if (error.code === `EXDEV`) { + this.copySync(toP, fromP); + this.removeSync(fromP); + } else { + throw error; + } + } + } + async lockPromise(affectedPath, callback) { + const lockPath = `${affectedPath}.flock`; + const interval = 1e3 / 60; + const startTime = Date.now(); + let fd = null; + const isAlive = async () => { + let pid; + try { + [pid] = await this.readJsonPromise(lockPath); + } catch (error) { + return Date.now() - startTime < 500; + } + try { + process.kill(pid, 0); + return true; + } catch (error) { + return false; + } + }; + while (fd === null) { + try { + fd = await this.openPromise(lockPath, `wx`); + } catch (error) { + if (error.code === `EEXIST`) { + if (!await isAlive()) { + try { + await this.unlinkPromise(lockPath); + continue; + } catch (error2) { + } + } + if (Date.now() - startTime < 60 * 1e3) { + await new Promise((resolve) => setTimeout(resolve, interval)); + } else { + throw new Error(`Couldn't acquire a lock in a reasonable time (via ${lockPath})`); + } + } else { + throw error; + } + } + } + await this.writePromise(fd, JSON.stringify([process.pid])); + try { + return await callback(); + } finally { + try { + await this.closePromise(fd); + await this.unlinkPromise(lockPath); + } catch (error) { + } + } + } + async readJsonPromise(p) { + const content = await this.readFilePromise(p, `utf8`); + try { + return JSON.parse(content); + } catch (error) { + error.message += ` (in ${p})`; + throw error; + } + } + readJsonSync(p) { + const content = this.readFileSync(p, `utf8`); + try { + return JSON.parse(content); + } catch (error) { + error.message += ` (in ${p})`; + throw error; + } + } + async writeJsonPromise(p, data, { compact = false } = {}) { + const space = compact ? 0 : 2; + return await this.writeFilePromise(p, `${JSON.stringify(data, null, space)} +`); + } + writeJsonSync(p, data, { compact = false } = {}) { + const space = compact ? 0 : 2; + return this.writeFileSync(p, `${JSON.stringify(data, null, space)} +`); + } + async preserveTimePromise(p, cb) { + const stat = await this.lstatPromise(p); + const result = await cb(); + if (typeof result !== `undefined`) + p = result; + await this.lutimesPromise(p, stat.atime, stat.mtime); + } + async preserveTimeSync(p, cb) { + const stat = this.lstatSync(p); + const result = cb(); + if (typeof result !== `undefined`) + p = result; + this.lutimesSync(p, stat.atime, stat.mtime); + } +} +class BasePortableFakeFS extends FakeFS { + constructor() { + super(ppath); + } +} +function getEndOfLine(content) { + const matches = content.match(/\r?\n/g); + if (matches === null) + return os.EOL; + const crlf = matches.filter((nl) => nl === `\r +`).length; + const lf = matches.length - crlf; + return crlf > lf ? `\r +` : ` +`; +} +function normalizeLineEndings(originalContent, newContent) { + return newContent.replace(/\r?\n/g, getEndOfLine(originalContent)); +} + +class ProxiedFS extends FakeFS { + getExtractHint(hints) { + return this.baseFs.getExtractHint(hints); + } + resolve(path) { + return this.mapFromBase(this.baseFs.resolve(this.mapToBase(path))); + } + getRealPath() { + return this.mapFromBase(this.baseFs.getRealPath()); + } + async openPromise(p, flags, mode) { + return this.baseFs.openPromise(this.mapToBase(p), flags, mode); + } + openSync(p, flags, mode) { + return this.baseFs.openSync(this.mapToBase(p), flags, mode); + } + async opendirPromise(p, opts) { + return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(p), opts), { path: p }); + } + opendirSync(p, opts) { + return Object.assign(this.baseFs.opendirSync(this.mapToBase(p), opts), { path: p }); + } + async readPromise(fd, buffer, offset, length, position) { + return await this.baseFs.readPromise(fd, buffer, offset, length, position); + } + readSync(fd, buffer, offset, length, position) { + return this.baseFs.readSync(fd, buffer, offset, length, position); + } + async writePromise(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return await this.baseFs.writePromise(fd, buffer, offset); + } else { + return await this.baseFs.writePromise(fd, buffer, offset, length, position); + } + } + writeSync(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return this.baseFs.writeSync(fd, buffer, offset); + } else { + return this.baseFs.writeSync(fd, buffer, offset, length, position); + } + } + async closePromise(fd) { + return this.baseFs.closePromise(fd); + } + closeSync(fd) { + this.baseFs.closeSync(fd); + } + createReadStream(p, opts) { + return this.baseFs.createReadStream(p !== null ? this.mapToBase(p) : p, opts); + } + createWriteStream(p, opts) { + return this.baseFs.createWriteStream(p !== null ? this.mapToBase(p) : p, opts); + } + async realpathPromise(p) { + return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(p))); + } + realpathSync(p) { + return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(p))); + } + async existsPromise(p) { + return this.baseFs.existsPromise(this.mapToBase(p)); + } + existsSync(p) { + return this.baseFs.existsSync(this.mapToBase(p)); + } + accessSync(p, mode) { + return this.baseFs.accessSync(this.mapToBase(p), mode); + } + async accessPromise(p, mode) { + return this.baseFs.accessPromise(this.mapToBase(p), mode); + } + async statPromise(p, opts) { + return this.baseFs.statPromise(this.mapToBase(p), opts); + } + statSync(p, opts) { + return this.baseFs.statSync(this.mapToBase(p), opts); + } + async fstatPromise(fd, opts) { + return this.baseFs.fstatPromise(fd, opts); + } + fstatSync(fd, opts) { + return this.baseFs.fstatSync(fd, opts); + } + lstatPromise(p, opts) { + return this.baseFs.lstatPromise(this.mapToBase(p), opts); + } + lstatSync(p, opts) { + return this.baseFs.lstatSync(this.mapToBase(p), opts); + } + async fchmodPromise(fd, mask) { + return this.baseFs.fchmodPromise(fd, mask); + } + fchmodSync(fd, mask) { + return this.baseFs.fchmodSync(fd, mask); + } + async chmodPromise(p, mask) { + return this.baseFs.chmodPromise(this.mapToBase(p), mask); + } + chmodSync(p, mask) { + return this.baseFs.chmodSync(this.mapToBase(p), mask); + } + async fchownPromise(fd, uid, gid) { + return this.baseFs.fchownPromise(fd, uid, gid); + } + fchownSync(fd, uid, gid) { + return this.baseFs.fchownSync(fd, uid, gid); + } + async chownPromise(p, uid, gid) { + return this.baseFs.chownPromise(this.mapToBase(p), uid, gid); + } + chownSync(p, uid, gid) { + return this.baseFs.chownSync(this.mapToBase(p), uid, gid); + } + async renamePromise(oldP, newP) { + return this.baseFs.renamePromise(this.mapToBase(oldP), this.mapToBase(newP)); + } + renameSync(oldP, newP) { + return this.baseFs.renameSync(this.mapToBase(oldP), this.mapToBase(newP)); + } + async copyFilePromise(sourceP, destP, flags = 0) { + return this.baseFs.copyFilePromise(this.mapToBase(sourceP), this.mapToBase(destP), flags); + } + copyFileSync(sourceP, destP, flags = 0) { + return this.baseFs.copyFileSync(this.mapToBase(sourceP), this.mapToBase(destP), flags); + } + async appendFilePromise(p, content, opts) { + return this.baseFs.appendFilePromise(this.fsMapToBase(p), content, opts); + } + appendFileSync(p, content, opts) { + return this.baseFs.appendFileSync(this.fsMapToBase(p), content, opts); + } + async writeFilePromise(p, content, opts) { + return this.baseFs.writeFilePromise(this.fsMapToBase(p), content, opts); + } + writeFileSync(p, content, opts) { + return this.baseFs.writeFileSync(this.fsMapToBase(p), content, opts); + } + async unlinkPromise(p) { + return this.baseFs.unlinkPromise(this.mapToBase(p)); + } + unlinkSync(p) { + return this.baseFs.unlinkSync(this.mapToBase(p)); + } + async utimesPromise(p, atime, mtime) { + return this.baseFs.utimesPromise(this.mapToBase(p), atime, mtime); + } + utimesSync(p, atime, mtime) { + return this.baseFs.utimesSync(this.mapToBase(p), atime, mtime); + } + async lutimesPromise(p, atime, mtime) { + return this.baseFs.lutimesPromise(this.mapToBase(p), atime, mtime); + } + lutimesSync(p, atime, mtime) { + return this.baseFs.lutimesSync(this.mapToBase(p), atime, mtime); + } + async mkdirPromise(p, opts) { + return this.baseFs.mkdirPromise(this.mapToBase(p), opts); + } + mkdirSync(p, opts) { + return this.baseFs.mkdirSync(this.mapToBase(p), opts); + } + async rmdirPromise(p, opts) { + return this.baseFs.rmdirPromise(this.mapToBase(p), opts); + } + rmdirSync(p, opts) { + return this.baseFs.rmdirSync(this.mapToBase(p), opts); + } + async linkPromise(existingP, newP) { + return this.baseFs.linkPromise(this.mapToBase(existingP), this.mapToBase(newP)); + } + linkSync(existingP, newP) { + return this.baseFs.linkSync(this.mapToBase(existingP), this.mapToBase(newP)); + } + async symlinkPromise(target, p, type) { + const mappedP = this.mapToBase(p); + if (this.pathUtils.isAbsolute(target)) + return this.baseFs.symlinkPromise(this.mapToBase(target), mappedP, type); + const mappedAbsoluteTarget = this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(p), target)); + const mappedTarget = this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(mappedP), mappedAbsoluteTarget); + return this.baseFs.symlinkPromise(mappedTarget, mappedP, type); + } + symlinkSync(target, p, type) { + const mappedP = this.mapToBase(p); + if (this.pathUtils.isAbsolute(target)) + return this.baseFs.symlinkSync(this.mapToBase(target), mappedP, type); + const mappedAbsoluteTarget = this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(p), target)); + const mappedTarget = this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(mappedP), mappedAbsoluteTarget); + return this.baseFs.symlinkSync(mappedTarget, mappedP, type); + } + async readFilePromise(p, encoding) { + return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding); + } + readFileSync(p, encoding) { + return this.baseFs.readFileSync(this.fsMapToBase(p), encoding); + } + readdirPromise(p, opts) { + return this.baseFs.readdirPromise(this.mapToBase(p), opts); + } + readdirSync(p, opts) { + return this.baseFs.readdirSync(this.mapToBase(p), opts); + } + async readlinkPromise(p) { + return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(p))); + } + readlinkSync(p) { + return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(p))); + } + async truncatePromise(p, len) { + return this.baseFs.truncatePromise(this.mapToBase(p), len); + } + truncateSync(p, len) { + return this.baseFs.truncateSync(this.mapToBase(p), len); + } + async ftruncatePromise(fd, len) { + return this.baseFs.ftruncatePromise(fd, len); + } + ftruncateSync(fd, len) { + return this.baseFs.ftruncateSync(fd, len); + } + watch(p, a, b) { + return this.baseFs.watch( + this.mapToBase(p), + a, + b + ); + } + watchFile(p, a, b) { + return this.baseFs.watchFile( + this.mapToBase(p), + a, + b + ); + } + unwatchFile(p, cb) { + return this.baseFs.unwatchFile(this.mapToBase(p), cb); + } + fsMapToBase(p) { + if (typeof p === `number`) { + return p; + } else { + return this.mapToBase(p); + } + } +} + +function direntToPortable(dirent) { + const portableDirent = dirent; + if (typeof dirent.path === `string`) + portableDirent.path = npath.toPortablePath(dirent.path); + return portableDirent; +} +class NodeFS extends BasePortableFakeFS { + constructor(realFs = fs__default.default) { + super(); + this.realFs = realFs; + } + getExtractHint() { + return false; + } + getRealPath() { + return PortablePath.root; + } + resolve(p) { + return ppath.resolve(p); + } + async openPromise(p, flags, mode) { + return await new Promise((resolve, reject) => { + this.realFs.open(npath.fromPortablePath(p), flags, mode, this.makeCallback(resolve, reject)); + }); + } + openSync(p, flags, mode) { + return this.realFs.openSync(npath.fromPortablePath(p), flags, mode); + } + async opendirPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (typeof opts !== `undefined`) { + this.realFs.opendir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.opendir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }).then((dir) => { + const dirWithFixedPath = dir; + Object.defineProperty(dirWithFixedPath, `path`, { + value: p, + configurable: true, + writable: true + }); + return dirWithFixedPath; + }); + } + opendirSync(p, opts) { + const dir = typeof opts !== `undefined` ? this.realFs.opendirSync(npath.fromPortablePath(p), opts) : this.realFs.opendirSync(npath.fromPortablePath(p)); + const dirWithFixedPath = dir; + Object.defineProperty(dirWithFixedPath, `path`, { + value: p, + configurable: true, + writable: true + }); + return dirWithFixedPath; + } + async readPromise(fd, buffer, offset = 0, length = 0, position = -1) { + return await new Promise((resolve, reject) => { + this.realFs.read(fd, buffer, offset, length, position, (error, bytesRead) => { + if (error) { + reject(error); + } else { + resolve(bytesRead); + } + }); + }); + } + readSync(fd, buffer, offset, length, position) { + return this.realFs.readSync(fd, buffer, offset, length, position); + } + async writePromise(fd, buffer, offset, length, position) { + return await new Promise((resolve, reject) => { + if (typeof buffer === `string`) { + return this.realFs.write(fd, buffer, offset, this.makeCallback(resolve, reject)); + } else { + return this.realFs.write(fd, buffer, offset, length, position, this.makeCallback(resolve, reject)); + } + }); + } + writeSync(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return this.realFs.writeSync(fd, buffer, offset); + } else { + return this.realFs.writeSync(fd, buffer, offset, length, position); + } + } + async closePromise(fd) { + await new Promise((resolve, reject) => { + this.realFs.close(fd, this.makeCallback(resolve, reject)); + }); + } + closeSync(fd) { + this.realFs.closeSync(fd); + } + createReadStream(p, opts) { + const realPath = p !== null ? npath.fromPortablePath(p) : p; + return this.realFs.createReadStream(realPath, opts); + } + createWriteStream(p, opts) { + const realPath = p !== null ? npath.fromPortablePath(p) : p; + return this.realFs.createWriteStream(realPath, opts); + } + async realpathPromise(p) { + return await new Promise((resolve, reject) => { + this.realFs.realpath(npath.fromPortablePath(p), {}, this.makeCallback(resolve, reject)); + }).then((path) => { + return npath.toPortablePath(path); + }); + } + realpathSync(p) { + return npath.toPortablePath(this.realFs.realpathSync(npath.fromPortablePath(p), {})); + } + async existsPromise(p) { + return await new Promise((resolve) => { + this.realFs.exists(npath.fromPortablePath(p), resolve); + }); + } + accessSync(p, mode) { + return this.realFs.accessSync(npath.fromPortablePath(p), mode); + } + async accessPromise(p, mode) { + return await new Promise((resolve, reject) => { + this.realFs.access(npath.fromPortablePath(p), mode, this.makeCallback(resolve, reject)); + }); + } + existsSync(p) { + return this.realFs.existsSync(npath.fromPortablePath(p)); + } + async statPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.stat(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.stat(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + statSync(p, opts) { + if (opts) { + return this.realFs.statSync(npath.fromPortablePath(p), opts); + } else { + return this.realFs.statSync(npath.fromPortablePath(p)); + } + } + async fstatPromise(fd, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.fstat(fd, opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.fstat(fd, this.makeCallback(resolve, reject)); + } + }); + } + fstatSync(fd, opts) { + if (opts) { + return this.realFs.fstatSync(fd, opts); + } else { + return this.realFs.fstatSync(fd); + } + } + async lstatPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.lstat(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.lstat(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + lstatSync(p, opts) { + if (opts) { + return this.realFs.lstatSync(npath.fromPortablePath(p), opts); + } else { + return this.realFs.lstatSync(npath.fromPortablePath(p)); + } + } + async fchmodPromise(fd, mask) { + return await new Promise((resolve, reject) => { + this.realFs.fchmod(fd, mask, this.makeCallback(resolve, reject)); + }); + } + fchmodSync(fd, mask) { + return this.realFs.fchmodSync(fd, mask); + } + async chmodPromise(p, mask) { + return await new Promise((resolve, reject) => { + this.realFs.chmod(npath.fromPortablePath(p), mask, this.makeCallback(resolve, reject)); + }); + } + chmodSync(p, mask) { + return this.realFs.chmodSync(npath.fromPortablePath(p), mask); + } + async fchownPromise(fd, uid, gid) { + return await new Promise((resolve, reject) => { + this.realFs.fchown(fd, uid, gid, this.makeCallback(resolve, reject)); + }); + } + fchownSync(fd, uid, gid) { + return this.realFs.fchownSync(fd, uid, gid); + } + async chownPromise(p, uid, gid) { + return await new Promise((resolve, reject) => { + this.realFs.chown(npath.fromPortablePath(p), uid, gid, this.makeCallback(resolve, reject)); + }); + } + chownSync(p, uid, gid) { + return this.realFs.chownSync(npath.fromPortablePath(p), uid, gid); + } + async renamePromise(oldP, newP) { + return await new Promise((resolve, reject) => { + this.realFs.rename(npath.fromPortablePath(oldP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); + }); + } + renameSync(oldP, newP) { + return this.realFs.renameSync(npath.fromPortablePath(oldP), npath.fromPortablePath(newP)); + } + async copyFilePromise(sourceP, destP, flags = 0) { + return await new Promise((resolve, reject) => { + this.realFs.copyFile(npath.fromPortablePath(sourceP), npath.fromPortablePath(destP), flags, this.makeCallback(resolve, reject)); + }); + } + copyFileSync(sourceP, destP, flags = 0) { + return this.realFs.copyFileSync(npath.fromPortablePath(sourceP), npath.fromPortablePath(destP), flags); + } + async appendFilePromise(p, content, opts) { + return await new Promise((resolve, reject) => { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.appendFile(fsNativePath, content, opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.appendFile(fsNativePath, content, this.makeCallback(resolve, reject)); + } + }); + } + appendFileSync(p, content, opts) { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.appendFileSync(fsNativePath, content, opts); + } else { + this.realFs.appendFileSync(fsNativePath, content); + } + } + async writeFilePromise(p, content, opts) { + return await new Promise((resolve, reject) => { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.writeFile(fsNativePath, content, opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.writeFile(fsNativePath, content, this.makeCallback(resolve, reject)); + } + }); + } + writeFileSync(p, content, opts) { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.writeFileSync(fsNativePath, content, opts); + } else { + this.realFs.writeFileSync(fsNativePath, content); + } + } + async unlinkPromise(p) { + return await new Promise((resolve, reject) => { + this.realFs.unlink(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + }); + } + unlinkSync(p) { + return this.realFs.unlinkSync(npath.fromPortablePath(p)); + } + async utimesPromise(p, atime, mtime) { + return await new Promise((resolve, reject) => { + this.realFs.utimes(npath.fromPortablePath(p), atime, mtime, this.makeCallback(resolve, reject)); + }); + } + utimesSync(p, atime, mtime) { + this.realFs.utimesSync(npath.fromPortablePath(p), atime, mtime); + } + async lutimesPromise(p, atime, mtime) { + return await new Promise((resolve, reject) => { + this.realFs.lutimes(npath.fromPortablePath(p), atime, mtime, this.makeCallback(resolve, reject)); + }); + } + lutimesSync(p, atime, mtime) { + this.realFs.lutimesSync(npath.fromPortablePath(p), atime, mtime); + } + async mkdirPromise(p, opts) { + return await new Promise((resolve, reject) => { + this.realFs.mkdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + }); + } + mkdirSync(p, opts) { + return this.realFs.mkdirSync(npath.fromPortablePath(p), opts); + } + async rmdirPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.rmdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.rmdir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + rmdirSync(p, opts) { + return this.realFs.rmdirSync(npath.fromPortablePath(p), opts); + } + async linkPromise(existingP, newP) { + return await new Promise((resolve, reject) => { + this.realFs.link(npath.fromPortablePath(existingP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); + }); + } + linkSync(existingP, newP) { + return this.realFs.linkSync(npath.fromPortablePath(existingP), npath.fromPortablePath(newP)); + } + async symlinkPromise(target, p, type) { + return await new Promise((resolve, reject) => { + this.realFs.symlink(npath.fromPortablePath(target.replace(/\/+$/, ``)), npath.fromPortablePath(p), type, this.makeCallback(resolve, reject)); + }); + } + symlinkSync(target, p, type) { + return this.realFs.symlinkSync(npath.fromPortablePath(target.replace(/\/+$/, ``)), npath.fromPortablePath(p), type); + } + async readFilePromise(p, encoding) { + return await new Promise((resolve, reject) => { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + this.realFs.readFile(fsNativePath, encoding, this.makeCallback(resolve, reject)); + }); + } + readFileSync(p, encoding) { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + return this.realFs.readFileSync(fsNativePath, encoding); + } + async readdirPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + if (opts.recursive && process.platform === `win32`) { + if (opts.withFileTypes) { + this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback((results) => resolve(results.map(direntToPortable)), reject)); + } else { + this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback((results) => resolve(results.map(npath.toPortablePath)), reject)); + } + } else { + this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } + } else { + this.realFs.readdir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + readdirSync(p, opts) { + if (opts) { + if (opts.recursive && process.platform === `win32`) { + if (opts.withFileTypes) { + return this.realFs.readdirSync(npath.fromPortablePath(p), opts).map(direntToPortable); + } else { + return this.realFs.readdirSync(npath.fromPortablePath(p), opts).map(npath.toPortablePath); + } + } else { + return this.realFs.readdirSync(npath.fromPortablePath(p), opts); + } + } else { + return this.realFs.readdirSync(npath.fromPortablePath(p)); + } + } + async readlinkPromise(p) { + return await new Promise((resolve, reject) => { + this.realFs.readlink(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + }).then((path) => { + return npath.toPortablePath(path); + }); + } + readlinkSync(p) { + return npath.toPortablePath(this.realFs.readlinkSync(npath.fromPortablePath(p))); + } + async truncatePromise(p, len) { + return await new Promise((resolve, reject) => { + this.realFs.truncate(npath.fromPortablePath(p), len, this.makeCallback(resolve, reject)); + }); + } + truncateSync(p, len) { + return this.realFs.truncateSync(npath.fromPortablePath(p), len); + } + async ftruncatePromise(fd, len) { + return await new Promise((resolve, reject) => { + this.realFs.ftruncate(fd, len, this.makeCallback(resolve, reject)); + }); + } + ftruncateSync(fd, len) { + return this.realFs.ftruncateSync(fd, len); + } + watch(p, a, b) { + return this.realFs.watch( + npath.fromPortablePath(p), + a, + b + ); + } + watchFile(p, a, b) { + return this.realFs.watchFile( + npath.fromPortablePath(p), + a, + b + ); + } + unwatchFile(p, cb) { + return this.realFs.unwatchFile(npath.fromPortablePath(p), cb); + } + makeCallback(resolve, reject) { + return (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }; + } +} + +const MOUNT_MASK = 4278190080; +class MountFS extends BasePortableFakeFS { + constructor({ baseFs = new NodeFS(), filter = null, magicByte = 42, maxOpenFiles = Infinity, useCache = true, maxAge = 5e3, typeCheck = fs.constants.S_IFREG, getMountPoint, factoryPromise, factorySync }) { + if (Math.floor(magicByte) !== magicByte || !(magicByte > 1 && magicByte <= 127)) + throw new Error(`The magic byte must be set to a round value between 1 and 127 included`); + super(); + this.fdMap = /* @__PURE__ */ new Map(); + this.nextFd = 3; + this.isMount = /* @__PURE__ */ new Set(); + this.notMount = /* @__PURE__ */ new Set(); + this.realPaths = /* @__PURE__ */ new Map(); + this.limitOpenFilesTimeout = null; + this.baseFs = baseFs; + this.mountInstances = useCache ? /* @__PURE__ */ new Map() : null; + this.factoryPromise = factoryPromise; + this.factorySync = factorySync; + this.filter = filter; + this.getMountPoint = getMountPoint; + this.magic = magicByte << 24; + this.maxAge = maxAge; + this.maxOpenFiles = maxOpenFiles; + this.typeCheck = typeCheck; + } + getExtractHint(hints) { + return this.baseFs.getExtractHint(hints); + } + getRealPath() { + return this.baseFs.getRealPath(); + } + saveAndClose() { + unwatchAllFiles(this); + if (this.mountInstances) { + for (const [path, { childFs }] of this.mountInstances.entries()) { + childFs.saveAndClose?.(); + this.mountInstances.delete(path); + } + } + } + discardAndClose() { + unwatchAllFiles(this); + if (this.mountInstances) { + for (const [path, { childFs }] of this.mountInstances.entries()) { + childFs.discardAndClose?.(); + this.mountInstances.delete(path); + } + } + } + resolve(p) { + return this.baseFs.resolve(p); + } + remapFd(mountFs, fd) { + const remappedFd = this.nextFd++ | this.magic; + this.fdMap.set(remappedFd, [mountFs, fd]); + return remappedFd; + } + async openPromise(p, flags, mode) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.openPromise(p, flags, mode); + }, async (mountFs, { subPath }) => { + return this.remapFd(mountFs, await mountFs.openPromise(subPath, flags, mode)); + }); + } + openSync(p, flags, mode) { + return this.makeCallSync(p, () => { + return this.baseFs.openSync(p, flags, mode); + }, (mountFs, { subPath }) => { + return this.remapFd(mountFs, mountFs.openSync(subPath, flags, mode)); + }); + } + async opendirPromise(p, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.opendirPromise(p, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.opendirPromise(subPath, opts); + }, { + requireSubpath: false + }); + } + opendirSync(p, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.opendirSync(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.opendirSync(subPath, opts); + }, { + requireSubpath: false + }); + } + async readPromise(fd, buffer, offset, length, position) { + if ((fd & MOUNT_MASK) !== this.magic) + return await this.baseFs.readPromise(fd, buffer, offset, length, position); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`read`); + const [mountFs, realFd] = entry; + return await mountFs.readPromise(realFd, buffer, offset, length, position); + } + readSync(fd, buffer, offset, length, position) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.readSync(fd, buffer, offset, length, position); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`readSync`); + const [mountFs, realFd] = entry; + return mountFs.readSync(realFd, buffer, offset, length, position); + } + async writePromise(fd, buffer, offset, length, position) { + if ((fd & MOUNT_MASK) !== this.magic) { + if (typeof buffer === `string`) { + return await this.baseFs.writePromise(fd, buffer, offset); + } else { + return await this.baseFs.writePromise(fd, buffer, offset, length, position); + } + } + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`write`); + const [mountFs, realFd] = entry; + if (typeof buffer === `string`) { + return await mountFs.writePromise(realFd, buffer, offset); + } else { + return await mountFs.writePromise(realFd, buffer, offset, length, position); + } + } + writeSync(fd, buffer, offset, length, position) { + if ((fd & MOUNT_MASK) !== this.magic) { + if (typeof buffer === `string`) { + return this.baseFs.writeSync(fd, buffer, offset); + } else { + return this.baseFs.writeSync(fd, buffer, offset, length, position); + } + } + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`writeSync`); + const [mountFs, realFd] = entry; + if (typeof buffer === `string`) { + return mountFs.writeSync(realFd, buffer, offset); + } else { + return mountFs.writeSync(realFd, buffer, offset, length, position); + } + } + async closePromise(fd) { + if ((fd & MOUNT_MASK) !== this.magic) + return await this.baseFs.closePromise(fd); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`close`); + this.fdMap.delete(fd); + const [mountFs, realFd] = entry; + return await mountFs.closePromise(realFd); + } + closeSync(fd) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.closeSync(fd); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`closeSync`); + this.fdMap.delete(fd); + const [mountFs, realFd] = entry; + return mountFs.closeSync(realFd); + } + createReadStream(p, opts) { + if (p === null) + return this.baseFs.createReadStream(p, opts); + return this.makeCallSync(p, () => { + return this.baseFs.createReadStream(p, opts); + }, (mountFs, { archivePath, subPath }) => { + const stream = mountFs.createReadStream(subPath, opts); + stream.path = npath.fromPortablePath(this.pathUtils.join(archivePath, subPath)); + return stream; + }); + } + createWriteStream(p, opts) { + if (p === null) + return this.baseFs.createWriteStream(p, opts); + return this.makeCallSync(p, () => { + return this.baseFs.createWriteStream(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.createWriteStream(subPath, opts); + }); + } + async realpathPromise(p) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.realpathPromise(p); + }, async (mountFs, { archivePath, subPath }) => { + let realArchivePath = this.realPaths.get(archivePath); + if (typeof realArchivePath === `undefined`) { + realArchivePath = await this.baseFs.realpathPromise(archivePath); + this.realPaths.set(archivePath, realArchivePath); + } + return this.pathUtils.join(realArchivePath, this.pathUtils.relative(PortablePath.root, await mountFs.realpathPromise(subPath))); + }); + } + realpathSync(p) { + return this.makeCallSync(p, () => { + return this.baseFs.realpathSync(p); + }, (mountFs, { archivePath, subPath }) => { + let realArchivePath = this.realPaths.get(archivePath); + if (typeof realArchivePath === `undefined`) { + realArchivePath = this.baseFs.realpathSync(archivePath); + this.realPaths.set(archivePath, realArchivePath); + } + return this.pathUtils.join(realArchivePath, this.pathUtils.relative(PortablePath.root, mountFs.realpathSync(subPath))); + }); + } + async existsPromise(p) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.existsPromise(p); + }, async (mountFs, { subPath }) => { + return await mountFs.existsPromise(subPath); + }); + } + existsSync(p) { + return this.makeCallSync(p, () => { + return this.baseFs.existsSync(p); + }, (mountFs, { subPath }) => { + return mountFs.existsSync(subPath); + }); + } + async accessPromise(p, mode) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.accessPromise(p, mode); + }, async (mountFs, { subPath }) => { + return await mountFs.accessPromise(subPath, mode); + }); + } + accessSync(p, mode) { + return this.makeCallSync(p, () => { + return this.baseFs.accessSync(p, mode); + }, (mountFs, { subPath }) => { + return mountFs.accessSync(subPath, mode); + }); + } + async statPromise(p, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.statPromise(p, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.statPromise(subPath, opts); + }); + } + statSync(p, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.statSync(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.statSync(subPath, opts); + }); + } + async fstatPromise(fd, opts) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.fstatPromise(fd, opts); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fstat`); + const [mountFs, realFd] = entry; + return mountFs.fstatPromise(realFd, opts); + } + fstatSync(fd, opts) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.fstatSync(fd, opts); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fstatSync`); + const [mountFs, realFd] = entry; + return mountFs.fstatSync(realFd, opts); + } + async lstatPromise(p, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.lstatPromise(p, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.lstatPromise(subPath, opts); + }); + } + lstatSync(p, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.lstatSync(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.lstatSync(subPath, opts); + }); + } + async fchmodPromise(fd, mask) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.fchmodPromise(fd, mask); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fchmod`); + const [mountFs, realFd] = entry; + return mountFs.fchmodPromise(realFd, mask); + } + fchmodSync(fd, mask) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.fchmodSync(fd, mask); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fchmodSync`); + const [mountFs, realFd] = entry; + return mountFs.fchmodSync(realFd, mask); + } + async chmodPromise(p, mask) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.chmodPromise(p, mask); + }, async (mountFs, { subPath }) => { + return await mountFs.chmodPromise(subPath, mask); + }); + } + chmodSync(p, mask) { + return this.makeCallSync(p, () => { + return this.baseFs.chmodSync(p, mask); + }, (mountFs, { subPath }) => { + return mountFs.chmodSync(subPath, mask); + }); + } + async fchownPromise(fd, uid, gid) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.fchownPromise(fd, uid, gid); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fchown`); + const [zipFs, realFd] = entry; + return zipFs.fchownPromise(realFd, uid, gid); + } + fchownSync(fd, uid, gid) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.fchownSync(fd, uid, gid); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fchownSync`); + const [zipFs, realFd] = entry; + return zipFs.fchownSync(realFd, uid, gid); + } + async chownPromise(p, uid, gid) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.chownPromise(p, uid, gid); + }, async (mountFs, { subPath }) => { + return await mountFs.chownPromise(subPath, uid, gid); + }); + } + chownSync(p, uid, gid) { + return this.makeCallSync(p, () => { + return this.baseFs.chownSync(p, uid, gid); + }, (mountFs, { subPath }) => { + return mountFs.chownSync(subPath, uid, gid); + }); + } + async renamePromise(oldP, newP) { + return await this.makeCallPromise(oldP, async () => { + return await this.makeCallPromise(newP, async () => { + return await this.baseFs.renamePromise(oldP, newP); + }, async () => { + throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); + }); + }, async (mountFsO, { subPath: subPathO }) => { + return await this.makeCallPromise(newP, async () => { + throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); + }, async (mountFsN, { subPath: subPathN }) => { + if (mountFsO !== mountFsN) { + throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); + } else { + return await mountFsO.renamePromise(subPathO, subPathN); + } + }); + }); + } + renameSync(oldP, newP) { + return this.makeCallSync(oldP, () => { + return this.makeCallSync(newP, () => { + return this.baseFs.renameSync(oldP, newP); + }, () => { + throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); + }); + }, (mountFsO, { subPath: subPathO }) => { + return this.makeCallSync(newP, () => { + throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); + }, (mountFsN, { subPath: subPathN }) => { + if (mountFsO !== mountFsN) { + throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); + } else { + return mountFsO.renameSync(subPathO, subPathN); + } + }); + }); + } + async copyFilePromise(sourceP, destP, flags = 0) { + const fallback = async (sourceFs, sourceP2, destFs, destP2) => { + if ((flags & fs.constants.COPYFILE_FICLONE_FORCE) !== 0) + throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${sourceP2}' -> ${destP2}'`), { code: `EXDEV` }); + if (flags & fs.constants.COPYFILE_EXCL && await this.existsPromise(sourceP2)) + throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${sourceP2}' -> '${destP2}'`), { code: `EEXIST` }); + let content; + try { + content = await sourceFs.readFilePromise(sourceP2); + } catch (error) { + throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${sourceP2}' -> '${destP2}'`), { code: `EINVAL` }); + } + await destFs.writeFilePromise(destP2, content); + }; + return await this.makeCallPromise(sourceP, async () => { + return await this.makeCallPromise(destP, async () => { + return await this.baseFs.copyFilePromise(sourceP, destP, flags); + }, async (mountFsD, { subPath: subPathD }) => { + return await fallback(this.baseFs, sourceP, mountFsD, subPathD); + }); + }, async (mountFsS, { subPath: subPathS }) => { + return await this.makeCallPromise(destP, async () => { + return await fallback(mountFsS, subPathS, this.baseFs, destP); + }, async (mountFsD, { subPath: subPathD }) => { + if (mountFsS !== mountFsD) { + return await fallback(mountFsS, subPathS, mountFsD, subPathD); + } else { + return await mountFsS.copyFilePromise(subPathS, subPathD, flags); + } + }); + }); + } + copyFileSync(sourceP, destP, flags = 0) { + const fallback = (sourceFs, sourceP2, destFs, destP2) => { + if ((flags & fs.constants.COPYFILE_FICLONE_FORCE) !== 0) + throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${sourceP2}' -> ${destP2}'`), { code: `EXDEV` }); + if (flags & fs.constants.COPYFILE_EXCL && this.existsSync(sourceP2)) + throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${sourceP2}' -> '${destP2}'`), { code: `EEXIST` }); + let content; + try { + content = sourceFs.readFileSync(sourceP2); + } catch (error) { + throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${sourceP2}' -> '${destP2}'`), { code: `EINVAL` }); + } + destFs.writeFileSync(destP2, content); + }; + return this.makeCallSync(sourceP, () => { + return this.makeCallSync(destP, () => { + return this.baseFs.copyFileSync(sourceP, destP, flags); + }, (mountFsD, { subPath: subPathD }) => { + return fallback(this.baseFs, sourceP, mountFsD, subPathD); + }); + }, (mountFsS, { subPath: subPathS }) => { + return this.makeCallSync(destP, () => { + return fallback(mountFsS, subPathS, this.baseFs, destP); + }, (mountFsD, { subPath: subPathD }) => { + if (mountFsS !== mountFsD) { + return fallback(mountFsS, subPathS, mountFsD, subPathD); + } else { + return mountFsS.copyFileSync(subPathS, subPathD, flags); + } + }); + }); + } + async appendFilePromise(p, content, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.appendFilePromise(p, content, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.appendFilePromise(subPath, content, opts); + }); + } + appendFileSync(p, content, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.appendFileSync(p, content, opts); + }, (mountFs, { subPath }) => { + return mountFs.appendFileSync(subPath, content, opts); + }); + } + async writeFilePromise(p, content, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.writeFilePromise(p, content, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.writeFilePromise(subPath, content, opts); + }); + } + writeFileSync(p, content, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.writeFileSync(p, content, opts); + }, (mountFs, { subPath }) => { + return mountFs.writeFileSync(subPath, content, opts); + }); + } + async unlinkPromise(p) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.unlinkPromise(p); + }, async (mountFs, { subPath }) => { + return await mountFs.unlinkPromise(subPath); + }); + } + unlinkSync(p) { + return this.makeCallSync(p, () => { + return this.baseFs.unlinkSync(p); + }, (mountFs, { subPath }) => { + return mountFs.unlinkSync(subPath); + }); + } + async utimesPromise(p, atime, mtime) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.utimesPromise(p, atime, mtime); + }, async (mountFs, { subPath }) => { + return await mountFs.utimesPromise(subPath, atime, mtime); + }); + } + utimesSync(p, atime, mtime) { + return this.makeCallSync(p, () => { + return this.baseFs.utimesSync(p, atime, mtime); + }, (mountFs, { subPath }) => { + return mountFs.utimesSync(subPath, atime, mtime); + }); + } + async lutimesPromise(p, atime, mtime) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.lutimesPromise(p, atime, mtime); + }, async (mountFs, { subPath }) => { + return await mountFs.lutimesPromise(subPath, atime, mtime); + }); + } + lutimesSync(p, atime, mtime) { + return this.makeCallSync(p, () => { + return this.baseFs.lutimesSync(p, atime, mtime); + }, (mountFs, { subPath }) => { + return mountFs.lutimesSync(subPath, atime, mtime); + }); + } + async mkdirPromise(p, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.mkdirPromise(p, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.mkdirPromise(subPath, opts); + }); + } + mkdirSync(p, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.mkdirSync(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.mkdirSync(subPath, opts); + }); + } + async rmdirPromise(p, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.rmdirPromise(p, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.rmdirPromise(subPath, opts); + }); + } + rmdirSync(p, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.rmdirSync(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.rmdirSync(subPath, opts); + }); + } + async linkPromise(existingP, newP) { + return await this.makeCallPromise(newP, async () => { + return await this.baseFs.linkPromise(existingP, newP); + }, async (mountFs, { subPath }) => { + return await mountFs.linkPromise(existingP, subPath); + }); + } + linkSync(existingP, newP) { + return this.makeCallSync(newP, () => { + return this.baseFs.linkSync(existingP, newP); + }, (mountFs, { subPath }) => { + return mountFs.linkSync(existingP, subPath); + }); + } + async symlinkPromise(target, p, type) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.symlinkPromise(target, p, type); + }, async (mountFs, { subPath }) => { + return await mountFs.symlinkPromise(target, subPath); + }); + } + symlinkSync(target, p, type) { + return this.makeCallSync(p, () => { + return this.baseFs.symlinkSync(target, p, type); + }, (mountFs, { subPath }) => { + return mountFs.symlinkSync(target, subPath); + }); + } + async readFilePromise(p, encoding) { + return this.makeCallPromise(p, async () => { + return await this.baseFs.readFilePromise(p, encoding); + }, async (mountFs, { subPath }) => { + return await mountFs.readFilePromise(subPath, encoding); + }); + } + readFileSync(p, encoding) { + return this.makeCallSync(p, () => { + return this.baseFs.readFileSync(p, encoding); + }, (mountFs, { subPath }) => { + return mountFs.readFileSync(subPath, encoding); + }); + } + async readdirPromise(p, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.readdirPromise(p, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.readdirPromise(subPath, opts); + }, { + requireSubpath: false + }); + } + readdirSync(p, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.readdirSync(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.readdirSync(subPath, opts); + }, { + requireSubpath: false + }); + } + async readlinkPromise(p) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.readlinkPromise(p); + }, async (mountFs, { subPath }) => { + return await mountFs.readlinkPromise(subPath); + }); + } + readlinkSync(p) { + return this.makeCallSync(p, () => { + return this.baseFs.readlinkSync(p); + }, (mountFs, { subPath }) => { + return mountFs.readlinkSync(subPath); + }); + } + async truncatePromise(p, len) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.truncatePromise(p, len); + }, async (mountFs, { subPath }) => { + return await mountFs.truncatePromise(subPath, len); + }); + } + truncateSync(p, len) { + return this.makeCallSync(p, () => { + return this.baseFs.truncateSync(p, len); + }, (mountFs, { subPath }) => { + return mountFs.truncateSync(subPath, len); + }); + } + async ftruncatePromise(fd, len) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.ftruncatePromise(fd, len); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`ftruncate`); + const [mountFs, realFd] = entry; + return mountFs.ftruncatePromise(realFd, len); + } + ftruncateSync(fd, len) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.ftruncateSync(fd, len); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`ftruncateSync`); + const [mountFs, realFd] = entry; + return mountFs.ftruncateSync(realFd, len); + } + watch(p, a, b) { + return this.makeCallSync(p, () => { + return this.baseFs.watch( + p, + a, + b + ); + }, (mountFs, { subPath }) => { + return mountFs.watch( + subPath, + a, + b + ); + }); + } + watchFile(p, a, b) { + return this.makeCallSync(p, () => { + return this.baseFs.watchFile( + p, + a, + b + ); + }, () => { + return watchFile(this, p, a, b); + }); + } + unwatchFile(p, cb) { + return this.makeCallSync(p, () => { + return this.baseFs.unwatchFile(p, cb); + }, () => { + return unwatchFile(this, p, cb); + }); + } + async makeCallPromise(p, discard, accept, { requireSubpath = true } = {}) { + if (typeof p !== `string`) + return await discard(); + const normalizedP = this.resolve(p); + const mountInfo = this.findMount(normalizedP); + if (!mountInfo) + return await discard(); + if (requireSubpath && mountInfo.subPath === `/`) + return await discard(); + return await this.getMountPromise(mountInfo.archivePath, async (mountFs) => await accept(mountFs, mountInfo)); + } + makeCallSync(p, discard, accept, { requireSubpath = true } = {}) { + if (typeof p !== `string`) + return discard(); + const normalizedP = this.resolve(p); + const mountInfo = this.findMount(normalizedP); + if (!mountInfo) + return discard(); + if (requireSubpath && mountInfo.subPath === `/`) + return discard(); + return this.getMountSync(mountInfo.archivePath, (mountFs) => accept(mountFs, mountInfo)); + } + findMount(p) { + if (this.filter && !this.filter.test(p)) + return null; + let filePath = ``; + while (true) { + const pathPartWithArchive = p.substring(filePath.length); + const mountPoint = this.getMountPoint(pathPartWithArchive, filePath); + if (!mountPoint) + return null; + filePath = this.pathUtils.join(filePath, mountPoint); + if (!this.isMount.has(filePath)) { + if (this.notMount.has(filePath)) + continue; + try { + if (this.typeCheck !== null && (this.baseFs.lstatSync(filePath).mode & fs.constants.S_IFMT) !== this.typeCheck) { + this.notMount.add(filePath); + continue; + } + } catch { + return null; + } + this.isMount.add(filePath); + } + return { + archivePath: filePath, + subPath: this.pathUtils.join(PortablePath.root, p.substring(filePath.length)) + }; + } + } + limitOpenFiles(max) { + if (this.mountInstances === null) + return; + const now = Date.now(); + let nextExpiresAt = now + this.maxAge; + let closeCount = max === null ? 0 : this.mountInstances.size - max; + for (const [path, { childFs, expiresAt, refCount }] of this.mountInstances.entries()) { + if (refCount !== 0 || childFs.hasOpenFileHandles?.()) { + continue; + } else if (now >= expiresAt) { + childFs.saveAndClose?.(); + this.mountInstances.delete(path); + closeCount -= 1; + continue; + } else if (max === null || closeCount <= 0) { + nextExpiresAt = expiresAt; + break; + } + childFs.saveAndClose?.(); + this.mountInstances.delete(path); + closeCount -= 1; + } + if (this.limitOpenFilesTimeout === null && (max === null && this.mountInstances.size > 0 || max !== null) && isFinite(nextExpiresAt)) { + this.limitOpenFilesTimeout = setTimeout(() => { + this.limitOpenFilesTimeout = null; + this.limitOpenFiles(null); + }, nextExpiresAt - now).unref(); + } + } + async getMountPromise(p, accept) { + if (this.mountInstances) { + let cachedMountFs = this.mountInstances.get(p); + if (!cachedMountFs) { + const createFsInstance = await this.factoryPromise(this.baseFs, p); + cachedMountFs = this.mountInstances.get(p); + if (!cachedMountFs) { + cachedMountFs = { + childFs: createFsInstance(), + expiresAt: 0, + refCount: 0 + }; + } + } + this.mountInstances.delete(p); + this.limitOpenFiles(this.maxOpenFiles - 1); + this.mountInstances.set(p, cachedMountFs); + cachedMountFs.expiresAt = Date.now() + this.maxAge; + cachedMountFs.refCount += 1; + try { + return await accept(cachedMountFs.childFs); + } finally { + cachedMountFs.refCount -= 1; + } + } else { + const mountFs = (await this.factoryPromise(this.baseFs, p))(); + try { + return await accept(mountFs); + } finally { + mountFs.saveAndClose?.(); + } + } + } + getMountSync(p, accept) { + if (this.mountInstances) { + let cachedMountFs = this.mountInstances.get(p); + if (!cachedMountFs) { + cachedMountFs = { + childFs: this.factorySync(this.baseFs, p), + expiresAt: 0, + refCount: 0 + }; + } + this.mountInstances.delete(p); + this.limitOpenFiles(this.maxOpenFiles - 1); + this.mountInstances.set(p, cachedMountFs); + cachedMountFs.expiresAt = Date.now() + this.maxAge; + return accept(cachedMountFs.childFs); + } else { + const childFs = this.factorySync(this.baseFs, p); + try { + return accept(childFs); + } finally { + childFs.saveAndClose?.(); + } + } + } +} + +class PosixFS extends ProxiedFS { + constructor(baseFs) { + super(npath); + this.baseFs = baseFs; + } + mapFromBase(path) { + return npath.fromPortablePath(path); + } + mapToBase(path) { + return npath.toPortablePath(path); + } +} + +const NUMBER_REGEXP = /^[0-9]+$/; +const VIRTUAL_REGEXP = /^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/; +const VALID_COMPONENT = /^([^/]+-)?[a-f0-9]+$/; +class VirtualFS extends ProxiedFS { + constructor({ baseFs = new NodeFS() } = {}) { + super(ppath); + this.baseFs = baseFs; + } + static makeVirtualPath(base, component, to) { + if (ppath.basename(base) !== `__virtual__`) + throw new Error(`Assertion failed: Virtual folders must be named "__virtual__"`); + if (!ppath.basename(component).match(VALID_COMPONENT)) + throw new Error(`Assertion failed: Virtual components must be ended by an hexadecimal hash`); + const target = ppath.relative(ppath.dirname(base), to); + const segments = target.split(`/`); + let depth = 0; + while (depth < segments.length && segments[depth] === `..`) + depth += 1; + const finalSegments = segments.slice(depth); + const fullVirtualPath = ppath.join(base, component, String(depth), ...finalSegments); + return fullVirtualPath; + } + static resolveVirtual(p) { + const match = p.match(VIRTUAL_REGEXP); + if (!match || !match[3] && match[5]) + return p; + const target = ppath.dirname(match[1]); + if (!match[3] || !match[4]) + return target; + const isnum = NUMBER_REGEXP.test(match[4]); + if (!isnum) + return p; + const depth = Number(match[4]); + const backstep = `../`.repeat(depth); + const subpath = match[5] || `.`; + return VirtualFS.resolveVirtual(ppath.join(target, backstep, subpath)); + } + getExtractHint(hints) { + return this.baseFs.getExtractHint(hints); + } + getRealPath() { + return this.baseFs.getRealPath(); + } + realpathSync(p) { + const match = p.match(VIRTUAL_REGEXP); + if (!match) + return this.baseFs.realpathSync(p); + if (!match[5]) + return p; + const realpath = this.baseFs.realpathSync(this.mapToBase(p)); + return VirtualFS.makeVirtualPath(match[1], match[3], realpath); + } + async realpathPromise(p) { + const match = p.match(VIRTUAL_REGEXP); + if (!match) + return await this.baseFs.realpathPromise(p); + if (!match[5]) + return p; + const realpath = await this.baseFs.realpathPromise(this.mapToBase(p)); + return VirtualFS.makeVirtualPath(match[1], match[3], realpath); + } + mapToBase(p) { + if (p === ``) + return p; + if (this.pathUtils.isAbsolute(p)) + return VirtualFS.resolveVirtual(p); + const resolvedRoot = VirtualFS.resolveVirtual(this.baseFs.resolve(PortablePath.dot)); + const resolvedP = VirtualFS.resolveVirtual(this.baseFs.resolve(p)); + return ppath.relative(resolvedRoot, resolvedP) || PortablePath.dot; + } + mapFromBase(p) { + return p; + } +} + +class NodePathFS extends ProxiedFS { + constructor(baseFs) { + super(npath); + this.baseFs = baseFs; + } + mapFromBase(path) { + return path; + } + mapToBase(path) { + if (typeof path === `string`) + return path; + if (path instanceof url.URL) + return url.fileURLToPath(path); + if (Buffer.isBuffer(path)) { + const str = path.toString(); + if (!isUtf8(path, str)) + throw new Error(`Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942`); + return str; + } + throw new Error(`Unsupported path type: ${nodeUtils.inspect(path)}`); + } +} +function isUtf8(buf, str) { + if (typeof buffer__default.default.isUtf8 !== `undefined`) + return buffer__default.default.isUtf8(buf); + return Buffer.byteLength(str) === buf.byteLength; +} + +var _a, _b, _c, _d; +const kBaseFs = Symbol(`kBaseFs`); +const kFd = Symbol(`kFd`); +const kClosePromise = Symbol(`kClosePromise`); +const kCloseResolve = Symbol(`kCloseResolve`); +const kCloseReject = Symbol(`kCloseReject`); +const kRefs = Symbol(`kRefs`); +const kRef = Symbol(`kRef`); +const kUnref = Symbol(`kUnref`); +class FileHandle { + constructor(fd, baseFs) { + this[_a] = 1; + this[_b] = void 0; + this[_c] = void 0; + this[_d] = void 0; + this[kBaseFs] = baseFs; + this[kFd] = fd; + } + get fd() { + return this[kFd]; + } + async appendFile(data, options) { + try { + this[kRef](this.appendFile); + const encoding = (typeof options === `string` ? options : options?.encoding) ?? void 0; + return await this[kBaseFs].appendFilePromise(this.fd, data, encoding ? { encoding } : void 0); + } finally { + this[kUnref](); + } + } + async chown(uid, gid) { + try { + this[kRef](this.chown); + return await this[kBaseFs].fchownPromise(this.fd, uid, gid); + } finally { + this[kUnref](); + } + } + async chmod(mode) { + try { + this[kRef](this.chmod); + return await this[kBaseFs].fchmodPromise(this.fd, mode); + } finally { + this[kUnref](); + } + } + createReadStream(options) { + return this[kBaseFs].createReadStream(null, { ...options, fd: this.fd }); + } + createWriteStream(options) { + return this[kBaseFs].createWriteStream(null, { ...options, fd: this.fd }); + } + datasync() { + throw new Error(`Method not implemented.`); + } + sync() { + throw new Error(`Method not implemented.`); + } + async read(bufferOrOptions, offset, length, position) { + try { + this[kRef](this.read); + let buffer; + if (!Buffer.isBuffer(bufferOrOptions)) { + bufferOrOptions ??= {}; + buffer = bufferOrOptions.buffer ?? Buffer.alloc(16384); + offset = bufferOrOptions.offset || 0; + length = bufferOrOptions.length ?? buffer.byteLength; + position = bufferOrOptions.position ?? null; + } else { + buffer = bufferOrOptions; + } + offset ??= 0; + length ??= 0; + if (length === 0) { + return { + bytesRead: length, + buffer + }; + } + const bytesRead = await this[kBaseFs].readPromise(this.fd, buffer, offset, length, position); + return { + bytesRead, + buffer + }; + } finally { + this[kUnref](); + } + } + async readFile(options) { + try { + this[kRef](this.readFile); + const encoding = (typeof options === `string` ? options : options?.encoding) ?? void 0; + return await this[kBaseFs].readFilePromise(this.fd, encoding); + } finally { + this[kUnref](); + } + } + readLines(options) { + return readline.createInterface({ + input: this.createReadStream(options), + crlfDelay: Infinity + }); + } + async stat(opts) { + try { + this[kRef](this.stat); + return await this[kBaseFs].fstatPromise(this.fd, opts); + } finally { + this[kUnref](); + } + } + async truncate(len) { + try { + this[kRef](this.truncate); + return await this[kBaseFs].ftruncatePromise(this.fd, len); + } finally { + this[kUnref](); + } + } + utimes(atime, mtime) { + throw new Error(`Method not implemented.`); + } + async writeFile(data, options) { + try { + this[kRef](this.writeFile); + const encoding = (typeof options === `string` ? options : options?.encoding) ?? void 0; + await this[kBaseFs].writeFilePromise(this.fd, data, encoding); + } finally { + this[kUnref](); + } + } + async write(...args) { + try { + this[kRef](this.write); + if (ArrayBuffer.isView(args[0])) { + const [buffer, offset, length, position] = args; + const bytesWritten = await this[kBaseFs].writePromise(this.fd, buffer, offset ?? void 0, length ?? void 0, position ?? void 0); + return { bytesWritten, buffer }; + } else { + const [data, position, encoding] = args; + const bytesWritten = await this[kBaseFs].writePromise(this.fd, data, position, encoding); + return { bytesWritten, buffer: data }; + } + } finally { + this[kUnref](); + } + } + async writev(buffers, position) { + try { + this[kRef](this.writev); + let bytesWritten = 0; + if (typeof position !== `undefined`) { + for (const buffer of buffers) { + const writeResult = await this.write(buffer, void 0, void 0, position); + bytesWritten += writeResult.bytesWritten; + position += writeResult.bytesWritten; + } + } else { + for (const buffer of buffers) { + const writeResult = await this.write(buffer); + bytesWritten += writeResult.bytesWritten; + } + } + return { + buffers, + bytesWritten + }; + } finally { + this[kUnref](); + } + } + readv(buffers, position) { + throw new Error(`Method not implemented.`); + } + close() { + if (this[kFd] === -1) + return Promise.resolve(); + if (this[kClosePromise]) + return this[kClosePromise]; + this[kRefs]--; + if (this[kRefs] === 0) { + const fd = this[kFd]; + this[kFd] = -1; + this[kClosePromise] = this[kBaseFs].closePromise(fd).finally(() => { + this[kClosePromise] = void 0; + }); + } else { + this[kClosePromise] = new Promise((resolve, reject) => { + this[kCloseResolve] = resolve; + this[kCloseReject] = reject; + }).finally(() => { + this[kClosePromise] = void 0; + this[kCloseReject] = void 0; + this[kCloseResolve] = void 0; + }); + } + return this[kClosePromise]; + } + [(_a = kRefs, _b = kClosePromise, _c = kCloseResolve, _d = kCloseReject, kRef)](caller) { + if (this[kFd] === -1) { + const err = new Error(`file closed`); + err.code = `EBADF`; + err.syscall = caller.name; + throw err; + } + this[kRefs]++; + } + [kUnref]() { + this[kRefs]--; + if (this[kRefs] === 0) { + const fd = this[kFd]; + this[kFd] = -1; + this[kBaseFs].closePromise(fd).then(this[kCloseResolve], this[kCloseReject]); + } + } +} + +const SYNC_IMPLEMENTATIONS = /* @__PURE__ */ new Set([ + `accessSync`, + `appendFileSync`, + `createReadStream`, + `createWriteStream`, + `chmodSync`, + `fchmodSync`, + `chownSync`, + `fchownSync`, + `closeSync`, + `copyFileSync`, + `linkSync`, + `lstatSync`, + `fstatSync`, + `lutimesSync`, + `mkdirSync`, + `openSync`, + `opendirSync`, + `readlinkSync`, + `readFileSync`, + `readdirSync`, + `readlinkSync`, + `realpathSync`, + `renameSync`, + `rmdirSync`, + `statSync`, + `symlinkSync`, + `truncateSync`, + `ftruncateSync`, + `unlinkSync`, + `unwatchFile`, + `utimesSync`, + `watch`, + `watchFile`, + `writeFileSync`, + `writeSync` +]); +const ASYNC_IMPLEMENTATIONS = /* @__PURE__ */ new Set([ + `accessPromise`, + `appendFilePromise`, + `fchmodPromise`, + `chmodPromise`, + `fchownPromise`, + `chownPromise`, + `closePromise`, + `copyFilePromise`, + `linkPromise`, + `fstatPromise`, + `lstatPromise`, + `lutimesPromise`, + `mkdirPromise`, + `openPromise`, + `opendirPromise`, + `readdirPromise`, + `realpathPromise`, + `readFilePromise`, + `readdirPromise`, + `readlinkPromise`, + `renamePromise`, + `rmdirPromise`, + `statPromise`, + `symlinkPromise`, + `truncatePromise`, + `ftruncatePromise`, + `unlinkPromise`, + `utimesPromise`, + `writeFilePromise`, + `writeSync` +]); +function patchFs(patchedFs, fakeFs) { + fakeFs = new NodePathFS(fakeFs); + const setupFn = (target, name, replacement) => { + const orig = target[name]; + target[name] = replacement; + if (typeof orig?.[nodeUtils.promisify.custom] !== `undefined`) { + replacement[nodeUtils.promisify.custom] = orig[nodeUtils.promisify.custom]; + } + }; + { + setupFn(patchedFs, `exists`, (p, ...args) => { + const hasCallback = typeof args[args.length - 1] === `function`; + const callback = hasCallback ? args.pop() : () => { + }; + process.nextTick(() => { + fakeFs.existsPromise(p).then((exists) => { + callback(exists); + }, () => { + callback(false); + }); + }); + }); + setupFn(patchedFs, `read`, (...args) => { + let [fd, buffer, offset, length, position, callback] = args; + if (args.length <= 3) { + let options = {}; + if (args.length < 3) { + callback = args[1]; + } else { + options = args[1]; + callback = args[2]; + } + ({ + buffer = Buffer.alloc(16384), + offset = 0, + length = buffer.byteLength, + position + } = options); + } + if (offset == null) + offset = 0; + length |= 0; + if (length === 0) { + process.nextTick(() => { + callback(null, 0, buffer); + }); + return; + } + if (position == null) + position = -1; + process.nextTick(() => { + fakeFs.readPromise(fd, buffer, offset, length, position).then((bytesRead) => { + callback(null, bytesRead, buffer); + }, (error) => { + callback(error, 0, buffer); + }); + }); + }); + for (const fnName of ASYNC_IMPLEMENTATIONS) { + const origName = fnName.replace(/Promise$/, ``); + if (typeof patchedFs[origName] === `undefined`) + continue; + const fakeImpl = fakeFs[fnName]; + if (typeof fakeImpl === `undefined`) + continue; + const wrapper = (...args) => { + const hasCallback = typeof args[args.length - 1] === `function`; + const callback = hasCallback ? args.pop() : () => { + }; + process.nextTick(() => { + fakeImpl.apply(fakeFs, args).then((result) => { + callback(null, result); + }, (error) => { + callback(error); + }); + }); + }; + setupFn(patchedFs, origName, wrapper); + } + patchedFs.realpath.native = patchedFs.realpath; + } + { + setupFn(patchedFs, `existsSync`, (p) => { + try { + return fakeFs.existsSync(p); + } catch (error) { + return false; + } + }); + setupFn(patchedFs, `readSync`, (...args) => { + let [fd, buffer, offset, length, position] = args; + if (args.length <= 3) { + const options = args[2] || {}; + ({ offset = 0, length = buffer.byteLength, position } = options); + } + if (offset == null) + offset = 0; + length |= 0; + if (length === 0) + return 0; + if (position == null) + position = -1; + return fakeFs.readSync(fd, buffer, offset, length, position); + }); + for (const fnName of SYNC_IMPLEMENTATIONS) { + const origName = fnName; + if (typeof patchedFs[origName] === `undefined`) + continue; + const fakeImpl = fakeFs[fnName]; + if (typeof fakeImpl === `undefined`) + continue; + setupFn(patchedFs, origName, fakeImpl.bind(fakeFs)); + } + patchedFs.realpathSync.native = patchedFs.realpathSync; + } + { + const patchedFsPromises = patchedFs.promises; + for (const fnName of ASYNC_IMPLEMENTATIONS) { + const origName = fnName.replace(/Promise$/, ``); + if (typeof patchedFsPromises[origName] === `undefined`) + continue; + const fakeImpl = fakeFs[fnName]; + if (typeof fakeImpl === `undefined`) + continue; + if (fnName === `open`) + continue; + setupFn(patchedFsPromises, origName, (pathLike, ...args) => { + if (pathLike instanceof FileHandle) { + return pathLike[origName].apply(pathLike, args); + } else { + return fakeImpl.call(fakeFs, pathLike, ...args); + } + }); + } + setupFn(patchedFsPromises, `open`, async (...args) => { + const fd = await fakeFs.openPromise(...args); + return new FileHandle(fd, fakeFs); + }); + } + { + patchedFs.read[nodeUtils.promisify.custom] = async (fd, buffer, ...args) => { + const res = fakeFs.readPromise(fd, buffer, ...args); + return { bytesRead: await res, buffer }; + }; + patchedFs.write[nodeUtils.promisify.custom] = async (fd, buffer, ...args) => { + const res = fakeFs.writePromise(fd, buffer, ...args); + return { bytesWritten: await res, buffer }; + }; + } +} + +let cachedInstance; +let registeredFactory = () => { + throw new Error(`Assertion failed: No libzip instance is available, and no factory was configured`); +}; +function setFactory(factory) { + registeredFactory = factory; +} +function getInstance() { + if (typeof cachedInstance === `undefined`) + cachedInstance = registeredFactory(); + return cachedInstance; +} + +var libzipSync = {exports: {}}; + +(function (module, exports) { +var frozenFs = Object.assign({}, fs__default.default); +var createModule = function() { + var _scriptDir = void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(createModule2) { + createModule2 = createModule2 || {}; + var Module = typeof createModule2 !== "undefined" ? createModule2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readBinary; + var nodeFS; + var nodePath; + { + { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + var ret = tryParseAsDataURI(filename); + if (ret) { + return binary ? ret : ret.toString(); + } + if (!nodeFS) + nodeFS = frozenFs; + if (!nodePath) + nodePath = path__default.default; + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + process["argv"][1].replace(/\\/g, "/"); + } + process["argv"].slice(2); + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + } + Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + ; + if (Module["thisProgram"]) + ; + if (Module["quit"]) + ; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + function getValue(ptr, type, noSafe) { + type = type || "i8"; + if (type.charAt(type.length - 1) === "*") + type = "i32"; + switch (type) { + case "i1": + return HEAP8[ptr >> 0]; + case "i8": + return HEAP8[ptr >> 0]; + case "i16": + return LE_HEAP_LOAD_I16((ptr >> 1) * 2); + case "i32": + return LE_HEAP_LOAD_I32((ptr >> 2) * 4); + case "i64": + return LE_HEAP_LOAD_I32((ptr >> 2) * 4); + case "float": + return LE_HEAP_LOAD_F32((ptr >> 2) * 4); + case "double": + return LE_HEAP_LOAD_F64((ptr >> 3) * 8); + default: + abort("invalid type for getValue: " + type); + } + return null; + } + var wasmMemory; + var ABORT = false; + function assert(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func = Module["_" + ident]; + assert( + func, + "Cannot call unknown function " + ident + ", make sure it is exported" + ); + return func; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = { + string: function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, + array: function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + } + }; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) + stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack !== 0) + stackRestore(stack); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments); + }; + } + var UTF8Decoder = new TextDecoder("utf8"); + function UTF8ToString(ptr, maxBytesToRead) { + if (!ptr) + return ""; + var maxPtr = ptr + maxBytesToRead; + for (var end = ptr; !(end >= maxPtr) && HEAPU8[end]; ) + ++end; + return UTF8Decoder.decode(HEAPU8.subarray(ptr, end)); + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + } + function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) + u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; + if (u <= 127) + ++len; + else if (u <= 2047) + len += 2; + else if (u <= 65535) + len += 3; + else + len += 4; + } + return len; + } + function allocateUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) + stringToUTF8Array(str, HEAP8, ret, size); + return ret; + } + function writeArrayToMemory(array, buffer2) { + HEAP8.set(array, buffer2); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer, HEAP8, HEAPU8; + var HEAP_DATA_VIEW; + function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module["HEAP_DATA_VIEW"] = HEAP_DATA_VIEW = new DataView(buf); + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = new Int16Array(buf); + Module["HEAP32"] = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = new Uint16Array(buf); + Module["HEAPU32"] = new Uint32Array(buf); + Module["HEAPF32"] = new Float32Array(buf); + Module["HEAPF64"] = new Float64Array(buf); + } + Module["INITIAL_MEMORY"] || 16777216; + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATPOSTRUN__ = []; + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + callRuntimeCallbacks(__ATINIT__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + what += ""; + err(what); + ABORT = true; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return filename.startsWith(dataURIPrefix); + } + var wasmBinaryFile = "data:application/octet-stream;base64,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QCAAKAJIIgEgASADaiADEAcaAkAgAyAAKAJsIgFNBEAgACABIANrNgJsDAELIABCADcCbAsgACAAKAJoIANrIgE2AmggACAAKAJYIANrNgJYIAEgACgChC5JBEAgACABNgKELgsgAEH8gAEoAgARAwAgAiADaiECCwJAIAAoAgAiASgCBCIERQ0AIAAoAjwhBSAAIAIgBCACIARJGyICBH8gACgCSCAAKAJoaiAFaiEFIAEgBCACazYCBAJAAkACQAJAIAEoAhwiBCgCFEEBaw4CAQACCyAEQaABaiAFIAEoAgAgAkHcgAEoAgARCAAMAgsgASABKAIwIAUgASgCACACQcSAASgCABEEADYCMAwBCyAFIAEoAgAgAhAHGgsgASABKAIAIAJqNgIAIAEgASgCCCACajYCCCAAKAI8BSAFCyACaiICNgI8AkAgACgChC4iASACakEDSQ0AIAAoAmggAWshAQJAIAAoAnRBgQhPBEAgACAAIAAoAkggAWoiAi0AACACLQABIAAoAnwRAAA2AlQMAQsgAUUNACAAIAFBAWsgACgChAERAgAaCyAAKAKELiAAKAI8IgJBAUZrIgRFDQAgACABIAQgACgCgAERBQAgACAAKAKELiAEazYChC4gACgCPCECCyACQYUCSw0AIAAoAgAoAgRFDQAgACgCMCEBDAELCwJAIAAoAkQiAiAAKAJAIgNNDQAgAAJ/IAAoAjwgACgCaGoiASADSwRAIAAoAkggAWpBACACIAFrIgNBggIgA0GCAkkbIgMQGSABIANqDAELIAFBggJqIgEgA00NASAAKAJIIANqQQAgAiADayICIAEgA2siAyACIANJGyIDEBkgACgCQCADags2AkALC50CAQF/AkAgAAJ/IAAoAqAuIgFBwABGBEAgACgCBCAAKAIQaiAAKQOYLjcAACAAQgA3A5guIAAgACgCEEEIajYCEEEADAELIAFBIE4EQCAAKAIEIAAoAhBqIAApA5guPgAAIAAgAEGcLmo1AgA3A5guIAAgACgCEEEEajYCECAAIAAoAqAuQSBrIgE2AqAuCyABQRBOBEAgACgCBCAAKAIQaiAAKQOYLj0AACAAIAAoAhBBAmo2AhAgACAAKQOYLkIQiDcDmC4gACAAKAKgLkEQayIBNgKgLgsgAUEISA0BIAAgACgCECIBQQFqNgIQ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KAJUIgEEfyABQQAgARAiEBkgACgCVAVBAAsQBiAAQQA2AlQLC9wMAgl/AX4jAEFAaiIGJAACQAJAAkACQAJAIAEoAjBBABAjIgVBAkZBACABKAI4QQAQIyIEQQFGGw0AIAVBAUZBACAEQQJGGw0AIAVBAkciAw0BIARBAkcNAQsgASABLwEMQYAQcjsBDEEAIQMMAQsgASABLwEMQf/vA3E7AQxBACEFIANFBEBB9eABIAEoAjAgAEEIahBpIgVFDQILIAJBgAJxBEAgBSEDDAELIARBAkcEQCAFIQMMAQtB9cYBIAEoAjggAEEIahBpIgNFBEAgBRAcDAILIAMgBTYCAAsgASABLwEMQf7/A3EgAS8BUiIFQQBHcjsBDAJAAkACQAJAAn8CQAJAIAEpAyhC/v///w9WDQAgASkDIEL+////D1YNACACQYAEcUUNASABKQNIQv////8PVA0BCyAFQYECa0H//wNxQQNJIQdBAQwBCyAFQYECa0H//wNxIQQgAkGACnFBgApHDQEgBEEDSSEHQQALIQkgBkIcEBciBEUEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIACyADEBwMBQsgAkGACHEhBQJAAkAgAkGAAnEEQAJAIAUNACABKQMgQv////8PVg0AIAEpAyhCgICAgBBUDQMLIAQgASkDKBAYIAEpAyAhDAwBCwJAAkACQCAFDQAgASkDIEL/////D1YNACABKQMoIgxC/////w9WDQEgASkDSEKAgICAEFQNBAsgASkDKCIMQv////8PVA0BCyAEIAwQGAsgASkDICIMQv////8PWgRAIAQgDBAYCyABKQNIIgxC/////w9UDQELIAQgDBAYCyAELQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAQQCCADEBwMBQtBASEKQQEgBC0AAAR+IAQpAxAFQgALp0H//wNxIAYQRyEFIAQQCCAFIAM2AgAgBw0BDAILIAMhBSAEQQJLDQELIAZCBxAXIgRFBEAgAEEIaiIABEAgAEEANgIEIABBDjYCAAsgBRAcDAMLIARBAhANIARBhxJBAhAsIAQgAS0AUhBwIAQgAS8BEBANIAQtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAsgBBAIDAILQYGyAkEHIAYQRyEDIAQQCCADIAU2AgBBASEL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NgIEIABB7A42AhggGiEdDAMLIARB/wFxIgJBwABxRQRAIAggDSADLwECQQJ0aiAdp0F/IAJ0QX9zcUECdGoiAy0AASICayEIIB0gAq2IIR0gAy0AACIERQ0HDAELCyAEQSBxBEAgB0G//gA2AgQgASECDAgLIAdB0f4ANgIEIABB0A42AhggASECDAcLIB1BfyAGdEF/c62DIBt8IhunIQUgCCAEQQ9xIgNrIQggGiAErUIPg4ghHSABIBdrIgYgAjMBAiAaQX8gA3RBf3Otg3ynIgRPDQIgBCAGayIGIBlNDQEgBygCjEdFDQEgB0HR/gA2AgQgAEG5DDYCGAsgASECIAshBQwFCwJAIA5FBEAgDCARIAZraiEDDAELIAYgDk0EQCAMIA4gBmtqIQMMAQsgDCARIAYgDmsiBmtqIQMgBSAGTQ0AIAUgBmshBQJAAkAgASADTSABIA8gAWusIhogBq0iGyAaIBtUGyIapyIGaiICIANLcQ0AIAMgBmogAUsgASADT3ENACABIAMgBhAHGiACIQEMAQsgASADIAMgAWsiASABQR91IgFqIAFzIgIQByACaiEBIBogAq0iHn0iHFANACACIANqIQIDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgASACKQAANwAAIAEgAikAGDcAGCABIAIpABA3ABAgASACKQAINwAIIBpCIH0hGiACQSBqIQIgAUEgaiEBIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAEgAikAADcAACABIAIpABg3ABggASACKQAQNwAQIAEgAikACDcACCABIAIpADg3ADggASACKQAwNwAwIAEgAikAKDcAKCABIAIpACA3ACAgASACKQBYNwBYIAEgAikAUDcAUCABIAIpAEg3AEggASACKQBANwBAIAEgAikAYDcAYCABIAIpAGg3AGggASACKQBwNwBwIAEgAikAeDcAeCACQYABaiECIAFBgAFqIQEgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAEgAikAADcAACABIAIpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCABIAIpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCABIAIoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCABIAIvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCABIAItAAA6AAAgAkEBaiECIAFBAWohAQsgHEIAUg0ACwsgDiEGIAwhAwsgBSAGSwRAAkACQCABIANNIAEgDyABa6wiGiAGrSIbIBogG1QbIhqnIglqIgIgA0txDQAgAyAJaiABSyABIANPcQ0AIAEgAyAJEAcaDAELIAEgAyADIAFrIgEgAUEfdSIBaiABcyIBEAcgAWohAiAaIAGtIh59IhxQDQAgASADaiEBA0ACQCAcIB4gHCAeVBsiG0IgVARAIBshGgwBCyAbIhpCIH0iIEIFiEIBfEIDgyIfUEUEQANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCAaQiB9IRogAUEgaiEBIAJBIGohAiAfQgF9Ih9CAFINAAsLICBC4ABUDQADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggAiABKQA4NwA4IAIgASkAMDcAMCACIAEpACg3ACggAiABKQAgNwAgIAIgASkAWDcAWCACIAEpAFA3AFAgAiABKQBINwBIIAIgASkAQDcAQCACIAEpAGA3AGAgAiABKQBoNwBoIAIgASkAcDcAcCACIAEpAHg3AHggAUGAAWohASACQYABaiECIBpCgAF9IhpCH1YNAAsLIBpCEFoEQCACIAEpAAA3AAAgAiABKQAINwAIIBpCEH0hGiACQRBqIQIgAUEQaiEBCyAaQghaBEAgAiABKQAANwAAIBpCCH0hGiACQQhqIQIgAUEIaiEBCyAaQgRaBEAgAiABKAAANgAAIBpCBH0hGiACQQRqIQIgAUEEaiEBCyAaQgJaBEAgAiABLwAAOwAAIBpCAn0hGiACQQJqIQIgAUECaiEBCyAcIBt9IRwgGlBFBEAgAiABLQAAOgAAIAJBAWohAiABQQFqIQELIBxCAFINAAsLIAUgBmshAUEAIARrIQUCQCAEQQdLBEAgBCEDDAELIAEgBE0EQCAEIQMMAQsgAiAEayEFA0ACQCACIAUpAAA3AAAgBEEBdCEDIAEgBGshASACIARqIQIgBEEDSw0AIAMhBCABIANLDQELC0EAIANrIQULIAIgBWohBAJAIAUgDyACa6wiGiABrSIbIBogG1QbIhqnIgFIIAVBf0pxDQAgBUEBSCABIARqIAJLcQ0AIAIgBCABEAcgAWohAgwDCyACIAQgAyADQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANAiABIARqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAILAkAgASADTSABIA8gAWusIhogBa0iGyAaIBtUGyIapyIEaiICIANLcQ0AIAMgBGogAUsgASADT3ENACABIAMgBBAHGgwCCyABIAMgAyABayIBIAFBH3UiAWogAXMiARAHIAFqIQIgGiABrSIefSIcUA0BIAEgA2ohAQNAAkAgHCAeIBwgHlQbIhtCIFQEQCAbIRoMAQsgGyIaQiB9IiBCBYhCAXxCA4MiH1BFBEADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggGkIgfSEaIAFBIGohASACQSBqIQIgH0IBfSIfQgBSDQALCyAgQuAAVA0AA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIAIgASkAODcAOCACIAEpADA3ADAgAiABKQAoNwAoIAIgASkAIDcAICACIAEpAFg3AFggAiABKQBQNwBQIAIgASkASDcASCACIAEpAEA3AEAgAiABKQBgNwBgIAIgASkAaDcAaCACIAEpAHA3AHAgAiABKQB4NwB4IAFBgAFqIQEgAkGAAWohAiAaQoABfSIaQh9WDQALCyAaQhBaBEAgAiABKQAANwAAIAIgASkACDcACCAaQhB9IRogAkEQaiECIAFBEGohAQsgGkIIWgRAIAIgASkAADcAACAaQgh9IRogAkEIaiECIAFBCGohAQsgGkIEWgRAIAIgASgAADYAACAaQgR9IRogAkEEaiECIAFBBGohAQsgGkICWgRAIAIgAS8AADsAACAaQgJ9IRogAkECaiECIAFBAmohAQsgHCAbfSEcIBpQRQRAIAIgAS0AADoAACACQQFqIQIgAUEBaiEBCyAcUEUNAAsMAQsCQAJAIBYEQAJAIAQgBUkEQCAHKAKYRyAESw0BCyABIARrIQMCQEEAIARrIgVBf0ogDyABa6wiGiAbIBogG1QbIhqnIgIgBUpxDQAgBUEBSCACIANqIAFLcQ0AIAEgAyACEAcgAmohAgwFCyABIAMgBCAEQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANBCABIANqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAQLIBAgAWsiCUEBaiIGIAUgBSAGSxshAyABIARrIQIgAUEHcUUNAiADRQ0CIAEgAi0AADoAACACQQFqIQIgAUEBaiIGQQdxQQAgA0EBayIFGw0BIAYhASAFIQMgCSEGDAILAkAgBCAFSQRAIAcoAphHIARLDQELIAEgASAEayIGKQAANwAAIAEgBUEBa0EHcUEBaiIDaiECIAUgA2siBEUNAyADIAZqIQEDQCACIAEpAAA3AAAgAUEIaiEBIAJBCGohAiAEQQhrIgQNAAsMAwsgASAEIAUQPyECDAILIAEgAi0AADoAASAJQQFrIQYgA0ECayEFIAJBAWohAgJAIAFBAmoiCkEHcUUNACAFRQ0AIAEgAi0AADoAAiAJQQJrIQYgA0EDayEFIAJBAWohAgJAIAFBA2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAAyAJQQNrIQYgA0EEayEFIAJBAWohAgJAIAFBBGoiCkEHcUUNACAFRQ0AIAEgAi0AADoABCAJQQRrIQYgA0EFayEFIAJBAWohAgJAIAFBBWoiCkEHcUUNACAFRQ0AIAEgAi0AADoABSAJQQVrIQYgA0EGayEFIAJBAWohAgJAIAFBBmoiCkEHcUUNACAFRQ0AIAEgAi0AADoABiAJQQZrIQYgA0EHayEFIAJBAWohAgJAIAFBB2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAByAJQQdrIQYgA0EIayEDIAFBCGohASACQQFqIQIMBgsgCiEBIAUhAwwFCyAKIQEgBSEDDAQLIAohASAFIQMMAwsgCiEBIAUhAwwCCyAKIQEgBSEDDAELIAohASAFIQMLAkACQCAGQRdNBEAgA0UNASADQQFrIQUgA0EHcSIEBEADQCABIAItAAA6AAAgA0EBayEDIAFBAWohASACQQFqIQIgBEEBayIEDQALCyAFQQdJDQEDQCABIAItAAA6AAAgASACLQABOgABIAEgAi0AAjoAAiABIAItAAM6AAMgASACLQAEOgAEIAEgAi0ABToABSABIAItAAY6AAYgASACLQAHOgAHIAFBCGohASACQQhqIQIgA0EIayIDDQALDAELIAMNAQsgASECDAELIAEgBCADED8hAgsgCyEFDAELIAEgAy0AAjoAACABQQFqIQILIAUgFE8NACACIBNJDQELCyAAIAI2AgwgACAFIAhBA3ZrIgE2AgAgACATIAJrQYMCajYCECAAIBQgAWtBDmo2AgQgByAIQQdxIgA2AogBIAcgHUJ/IACthkJ/hYM+AoQBC+cFAQR/IAMgAiACIANLGyEEIAAgAWshAgJAIABBB3FFDQAgBEUNACAAIAItAAA6AAAgA0EBayEGIAJBAWohAiAAQQFqIgdBB3FBACAEQQFrIgUbRQRAIAchACAFIQQgBiEDDAELIAAgAi0AADoAASADQQJrIQYgBEECayEFIAJBAWohAgJAIABBAmoiB0EHcUUNACAFRQ0AIAAgAi0AADoAAiADQQNrIQYgBEEDayEFIAJBAWohAgJAIABBA2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAAyADQQRrIQYgBEEEayEFIAJBAWohAgJAIABBBGoiB0EHcUUNACAFRQ0AIAAgAi0AADoABCADQQVrIQYgBEEFayEFIAJBAWohAgJAIABBBWoiB0EHcUUNACAFRQ0AIAAgAi0AADoABSADQQZrIQYgBEEGayEFIAJBAWohAgJAIABBBmoiB0EHcUUNACAFRQ0AIAAgAi0AADoABiADQQdrIQYgBEEHayEFIAJBAWohAgJAIABBB2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAByADQQhrIQMgBEEIayEEIABBCGohACACQQFqIQIMBgsgByEAIAUhBCAGIQMMBQsgByEAIAUhBCAGIQMMBAsgByEAIAUhBCAGIQMMAwsgByEAIAUhBCAGIQMMAgsgByEAIAUhBCAGIQMMAQsgByEAIAUhBCAGIQMLAkAgA0EXTQRAIARFDQEgBEEBayEBIARBB3EiAwRAA0AgACACLQAAOgAAIARBAWshBCAAQQFqIQAgAkEBaiECIANBAWsi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CyAAIAMtAAAEfiADKQMQBUIAC6dB//8DcSADKAIEEEcLIQUgAxAICyAEQRBqJAAgBQvgAQICfwF+QTAQCSICRQRAIAEEQCABQQA2AgQgAUEONgIAC0EADwsgAkIANwMIIAJBADYCACACQgA3AxAgAkIANwMYIAJCADcDICACQgA3ACUgAFAEQCACDwsCQCAAQv////8AVg0AIACnQQR0EAkiA0UNACACIAM2AgBBACEBQgEhBANAIAMgAUEEdGoiAUIANwIAIAFCADcABSAAIARSBEAgBKchASAEQgF8IQQMAQsLIAIgADcDCCACIAA3AxAgAg8LIAEEQCABQQA2AgQgAUEONgIAC0EAEBAgAhAGQQAL7gECA38BfiMAQRBrIgQkAAJAIARBDGpCBBAXIgNFBEBBfyECDAELAkAgAQRAIAJBgAZxIQUDQAJAIAUgASgCBHFFDQACQCADKQMIQgBUBEAgA0EAOgAADAELIANCADcDECADQQE6AAALIAMgAS8BCBANIAMgAS8BChANIAMtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAtBfyECDAQLQX8hAiAAIARBDGpCBBAbQQBIDQMgATMBCiIGUA0AIAAgASgCDCAGEBtBAEgNAwsgASgCACIBDQALC0EAIQILIAMQCAsgBEEQaiQAIAILPAEBfyAABEAgAUGABnEhAQNAIAEgACgCBHEEQCACIAAvAQpqQQRqIQILIAAoAgAiAA0ACwsgAkH//wNxC5wBAQN/IABFBEBBAA8LIAAhAwNAAn8CQAJAIAAvAQgiAUH04AFNBEAgAUEBRg0BIAFB9cYBRg0BDAILIAFBgbICRg0AIAFB9eABRw0BCyAAKAIAIQEgAEEANgIAIAAoAgwQBiAAEAYgASADIAAgA0YbIQMCQCACRQRAQQAhAgwBCyACIAE2AgALIAEMAQsgACICKAIACyIADQALIAMLsgQCBX8BfgJAAkACQCAAIAGtEBciAQRAIAEtAAANAUEAIQAMAgsgBARAIARBADYCBCAEQQ42AgALQQAPC0EAIQADQCABLQAABH4gASkDCCABKQMQfQVCAAtCBFQNASABEAwhByABIAEQDCIGrRATIghFBEBBACECIAQEQCAEQQA2AgQgBEEVNgIACyABEAggAEUNAwNAIAAoAgAhASAAKAIMEAYg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DCAAQRg2AggLDAMLIAAgBiAFLwFqQQAgBCABEQYAIQEgBhALIAFFDQILAkAgDUUEQCABIQMMAQsgACABIAUvAWgQgQEhAyABEAsgA0UNAQsCQCAJRSAMckUEQCADIQEMAQsgACADQQEQgAEhASADEAsgAUUNAQsgASEDDAELQQAhAwsgBUHwAGokACADC4UBAQF/IAFFBEAgAEEIaiIABEAgAEEANgIEIABBEjYCAAtBAA8LQTgQCSIDRQRAIABBCGoiAARAIABBADYCBCAAQQ42AgALQQAPCyADQQA2AhAgA0IANwIIIANCADcDKCADQQA2AgQgAyACNgIAIANCADcDGCADQQA2AjAgACABQTsgAxBCCw8AIAAgASACQQBBABCCAQusAgECfyABRQRAIABBCGoiAARAIABBADYCBCAAQRI2AgALQQAPCwJAIAJBfUsNACACQf//A3FBCEYNACAAQQhqIgAEQCAAQQA2AgQgAEEQNgIAC0EADwsCQEGwwAAQCSIFBEAgBUEANgIIIAVCADcCACAFQYiBAUGogQEgAxs2AqhAIAUgAjYCFCAFIAM6ABAgBUEAOgAPIAVBADsBDCAFIAMgAkF9SyIGcToADiAFQQggAiAGG0H//wNxIAQgBUGIgQFBqIEBIAMbKAIAEQAAIgI2AqxAIAINASAFEDEgBRAGCyAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0EADwsgACABQTogBRBCIgAEfyAABSAFKAKsQCAFKAKoQCgCBBEDACAFEDEgBRAGQQALC6ABAQF/IAIgACgCBCIDIAIgA0kbIgIEQCAAIAMgAms2AgQCQAJAAkACQCAAKAIcIgMoAhRBAWsOAgEAAgsgA0GgAWogASAAKAIAIAJB3IABKAIAEQgADAILIAAgACgCMCABIAAoAgAgAkHEgAEoAgARBAA2AjAMAQsgASAAKAIAIAIQBxoLIAAgACgCACACajYCACAAIAAoAgggAmo2AggLC7cCAQR/QX4hAgJAIABFDQAgACgCIEUNACAAKAIkIgRFDQAgACgCHCIBRQ0AIAEoAgAgAEcNAAJAAkAgASgCICIDQTlrDjkBAgICAgICAgICAgIBAgICAQICAgICAgICAgICAgICAgICAQICAgICAgICAgICAQICAgICAgICAgEACyADQZoFRg0AIANBKkcNAQsCfwJ/An8gASgCBCICBEAgBCAAKAIoIAIQHiAAKAIcIQELIAEoAlAiAgsEQCAAKAIkIAAoAiggAhAeIAAoAhwhAQsgASgCTCICCwRAIAAoAiQgACgCKCACEB4gACgCHCEBCyABKAJIIgILBEAgACgCJCAAKAIoIAIQHiAAKAIcIQELIAAoAiQgACgCKCABEB4gAEEANgIcQX1BACADQfEARhshAgsgAgvrCQEIfyAAKAIwIgMgACgCDEEFayICIAIgA0sbIQggACgCACIEKAIEIQkgAUEERiEHAkADQCAEKAIQIgMgACgCoC5BKmpBA3UiAkkEQEEBIQYMAgsgCCADIAJrIgMgACgCaCAAKAJYayICIAQoAgRqIgVB//8DIAVB//8DSRsiBiADIAZJGyIDSwRAQQEhBiADQQBHIAdyRQ0CIAFFDQIgAyAFRw0CCyAAQQBBACAHIAMgBUZxIgUQOSAAIAAoAhBBBGsiBDYCECAAKAIEIARqIAM7AAAgACAAKAIQQQJqIgQ2AhAgACgCBCAEaiADQX9zOwAAIAAgACgCEEECajYCECAAKAIAEAoCfyACBEAgACgCACgCDCAAKAJIIAAoAlhqIAMgAiACIANLGyICEAcaIAAoAgAiBCAEKAIMIAJqNgIMIAQgBCgCECACazYCECAEIAQoAhQgAmo2AhQgACAAKAJYIAJqNgJYIAMgAmshAwsgAwsEQCAAKAIAIgIgAigCDCADEIMBIAAoAgAiAiACKAIMIANqNgIMIAIgAigCECADazYCECACIAIoAhQgA2o2AhQLIAAoAgAhBCAFRQ0AC0EAIQYLAkAgCSAEKAIEayICRQRAIAAoAmghAwwBCwJAIAAoAjAiAyACTQRAIABBAjYCgC4gACgCSCAEKAIAIANrIAMQBxogACAAKAIwIgM2AoQuIAAgAzYCaAwBCyACIAAoAkQgACgCaCIFa08EQCAAIAUgA2siBDYCaCAAKAJIIgUgAyAFaiAEEAcaIAAoAoAuIgNBAU0EQCAAIANBAWo2AoAuCyAAIAAoAmgiBSAAKAKELiIDIAMgBUsbNgKELiAAKAIAIQQLIAAoAkggBWogBCgCACACayACEAcaIAAgACgCaCACaiIDNgJoIAAgACgCMCAAKAKELiIEayIFIAIgAiAFSxsgBGo2AoQuCyAAIAM2AlgLIAAgAyAAKAJAIgIgAiADSRs2AkBBAyECAkAgBkUNACAAKAIAIgUoAgQhAgJAAkAgAUF7cUUNACACDQBBASECIAMgACgCWEYNAiAAKAJEIANrIQRBACECDAELIAIgACgCRCADayIETQ0AIAAoAlgiByAAKAIwIgZIDQAgACADIAZrIgM2AmggACAHIAZrNgJYIAAoAkgiAiACIAZqIAMQBxogACgCgC4iA0EBTQRAIAAgA0EBajYCgC4LIAAgACgCaCIDIAAoAoQuIgIgAiADSxs2AoQuIAAoAjAgBGohBCAAKAIAIgUoAgQhAgsCQCACIAQgAiAESRsiAkUEQCAAKAIwIQUMAQsgBSAAKAJIIANqIAIQgwEgACAAKAJoIAJqIgM2AmggACAAKAIwIgUgACgChC4iBGsiBiACIAIgBksbIARqNgKELgsgACADIAAoAkAiAiACIANJGzYCQCADIAAoAlgiBmsiAyAFIAAoAgwgACgCoC5BKmpBA3VrIgJB//8DIAJB//8DSRsiBCAEIAVLG0kEQEEAIQIgAUEERiADQQBHckUNASABRQ0BIAAoAgAoAgQNASADIARLDQELQQAhAiABQQRGBEAgACgCACgCBEUgAyAETXEhAgsgACAAKAJIIAZqIAQgAyADIARLGyIBIAIQOSAAIAAoAlggAWo2AlggACgCABAKQQJBACACGw8LIAIL/woCCn8DfiAAKQOYLiENIAAoAqAuIQQgAkEATgRAQQRBAyABLwECIggbIQlBB0GKASAIGyEFQX8hCgNAIAghByABIAsiDEEBaiILQQJ0ai8BAiEIAkACQCAGQQFqIgMgBU4NACAHIAhHDQAgAyEGDAELAkAgAyAJSARAIAAgB0ECdGoiBkHOFWohCSAGQcwVaiEKA0AgCjMBACEPAn8gBCAJLwEAIgZqIgVBP00EQCAPIASthiANhCENIAUMAQsgBEHAAEYEQCAAKAIEIAAoAhBqIA03AAAgACAAKAIQQQhqNgIQIA8hDSAGDAELIAAoAgQgACgCEGogDyAErYYgDYQ3AAAgACAAKAIQQQhqNgIQIA9BwAAgBGutiCENIAVBQGoLIQQgA0EBayIDDQALDAELIAcEQAJAIAcgCkYEQCANIQ8gBCEFIAMhBgwBCyAAIAdBAnRqIgNBzBVqMwEAIQ8gBCADQc4Vai8BACIDaiIFQT9NBEAgDyAErYYgDYQhDwwBCyAEQcAARgRAIAAoAgQgACgCEGogDTcAACAAIAAoAhBBCGo2AhAgAyEFDAELIAAoAgQgACgCEGogDyAErYYgDYQ3AAAgACAAKAIQQQhqNgIQIAVBQGohBSAPQcAAIARrrYghDwsgADMBjBYhDgJAIAUgAC8BjhYiBGoiA0E/TQRAIA4gBa2GIA+EIQ4MAQsgBUHAAEYEQCAAKAIEIAAoAhBqIA83AAAgACAAKAIQQQhqNgIQIAQhAwwBCyAAKAIEIAAoAhBqIA4gBa2GIA+ENwAAIAAgACgCEEEIajYCECADQUBqIQMgDkHAACAFa62IIQ4LIAasQgN9IQ0gA0E9TQRAIANBAmohBCANIAOthiAOhCENDAILIANBwABGBEAgACgCBCAAKAIQaiAONwAAIAAgACgCEEEIajYCEEECIQQMAgsgACgCBCAAKAIQaiANIAOthiAOhDcAACAAIAAoAhBBCGo2AhAgA0E+ayEEIA1BwAAgA2utiCENDAELIAZBCUwEQCAAMwGQFiEOAkAgBCAALwGSFiIFaiIDQT9NBEAgDiAErYYgDYQhDgwBCyAEQcAARgRAIAAoAgQgACgCEGogDTcAACAAIAAoAhBBCGo2AhAgBSEDDAELIAAoAgQgACgCEGogDiAErYYgDYQ3AAAgACAAKAIQQQhqNgIQIANBQGohAyAOQcAAIARrrYghDgsgBqxCAn0hDSADQTxNBEAgA0EDaiEEIA0gA62GIA6EIQ0MAgsgA0HAAEYEQCAAKAIEIAAoAhBqIA43AAAgACAAKAIQQQhqNgIQQQMhBAwCCyAAKAIEIAAoAhBqIA0gA62GIA6ENwAAIAAgACgCEEEIajYCECADQT1rIQQgDUHAACADa62IIQ0MAQsgADMBlBYhDgJAIAQgAC8BlhYiBWoiA0E/TQRAIA4gBK2GIA2EIQ4MAQsgBEHAAEYEQCAAKAIEIAAoAhBqIA03AAAgACAAKAIQQQhqNgIQIAUhAwwBCyAAKAIEIAAoAhBqIA4gBK2GIA2ENwAAIAAgACgCEEEIajYCECADQUBqIQMgDkHAACAEa62IIQ4LIAatQgp9IQ0gA0E4TQRAIANBB2ohBCANIAOthiAOhCENDAELIANBwABGBEAgACgCBCAAKAIQaiAONwAAIAAgACgCEEEIajYCEEEHIQQMAQsgACgCBCAAKAIQaiANIAOthiAOhDcAACAAIAAoAhBBCGo2AhAgA0E5ayEEIA1BwAAgA2utiCENC0EAIQYCfyAIRQRAQYoBIQVBAwwBC0EGQQcgByAIRiIDGyEFQQNBBCADGwshCSAHIQoLIAIgDEcNAAsLIAAgBDYCoC4gACANNwOYLgv5BQIIfwJ+AkAgACgC8C1FBEAgACkDmC4hCyAAKAKgLiEDDAELA0AgCSIDQQNqIQkgAyAAKALsLWoiAy0AAiEFIAApA5guIQwgACgCoC4hBAJAIAMvAAAiB0UEQCABIAVBAnRqIgMzAQAhCyAEIAMvAQIiBWoiA0E/TQRAIAsgBK2GIAyEIQsMAgsgBEHAAEYEQCAAKAIEIAAoAhBqIAw3AAAgACAAKAIQQQhqNgIQIAUhAwwCCyAAKAIEIAAoAhBqIAsgBK2GIAyENwAAIAAgACgCEEEIajYCECADQUBqIQMgC0HAACAEa62IIQsMAQsgBUGAzwBqLQAAIghBAnQiBiABaiIDQYQIajMBACELIANBhghqLwEAIQMgCEEIa0ETTQRAIAUgBkGA0QBqKAIAa60gA62GIAuEIQsgBkHA0wBqKAIAIANqIQMLIAMgAiAHQQFrIgcgB0EHdkGAAmogB0GAAkkbQYDLAGotAAAiBUECdCIIaiIKLwECaiEGIAozAQAgA62GIAuEIQsgBCAFQQRJBH8gBgUgByAIQYDSAGooAgBrrSAGrYYgC4QhCyAIQcDUAGooAgAgBmoLIgVqIgNBP00EQCALIASthiAMhCELDAELIARBwABGBEAgACgCBCAAKAIQaiAMNwAAIAAgACgCEEEIajYCECAFIQMMAQsgACgCBCAAKAIQaiALIASthiAMhDcAACAAIAAoAhBBCGo2AhAgA0FAaiEDIAtBwAAgBGutiCELCyAAIAs3A5guIAAgAzYCoC4gCSAAKALwLUkNAAsLIAFBgAhqMwEAIQwCQCADIAFBgghqLwEAIgJqIgFBP00EQCAMIAOthiALhCEMDAELIANBwABGBEAgACgCBCAAKAIQaiALNwAAIAAgACgCEEEIajYCECACIQEMAQsgACgCBCAAKAIQaiAMIAOthiALhDcAACAAIAAoAhBBCGo2AhAgAUFAaiEBIAxBwAAgA2utiCEMCyAAIAw3A5guIAAgATYCoC4L8AQBA38gAEHkAWohAgNAIAIgAUECdCIDakEAOwEAIAIgA0EEcmpBADsBACABQQJqIgFBngJHDQALIABBADsBzBUgAEEAOwHYEyAAQZQWakEAOwEAIABBkBZqQQA7AQAgAEGMFmpBADsBACAAQYgWakEAOwEAIABBhBZqQQA7AQAgAEGAFmpBADsBACAAQfwVakEAOwEAIABB+BVqQQA7AQAgAEH0FWpBADsBACAAQfAVakEAOwEAIABB7BVqQQA7AQAgAEHoFWpBADsBACAAQeQVakEAOwEAIABB4BVqQQA7AQAgAEHcFWpBADsBACAAQdgVakEAOwEAIABB1BVqQQA7AQAgAEHQFWpBADsBACAAQcwUakEAOwEAIABByBRqQQA7AQAgAEHEFGpBADsBACAAQcAUakEAOwEAIABBvBRqQQA7AQAgAEG4FGpBADsBACAAQbQUakEAOwEAIABBsBRqQQA7AQAgAEGsFGpBADsBACAAQagUakEAOwEAIABBpBRqQQA7AQAgAEGgFGpBADsBACAAQZwUakEAOwEAIABBmBRqQQA7AQAgAEGUFGpBADsBACAAQZAUakEAOwEAIABBjBRqQQA7AQAgAEGIFGpBADsBACAAQYQUakEAOwEAIABBgBRqQQA7AQAgAEH8E2pBADsBACAAQfgTakEAOwEAIABB9BNqQQA7AQAgAEHwE2pBADsBACAAQewTakEAOwEAIABB6BNqQQA7AQAgAEHkE2pBADsBACAAQeATakEAOwEAIABB3BNqQQA7AQAgAEIANwL8LSAAQeQJakEBOwEAIABBADYC+C0gAEEANgLwLQuKAwIGfwR+QcgAEAkiBEUEQEEADwsgBEIANwMAIARCADcDMCAEQQA2AiggBEIANwMgIARCADcDGCAEQgA3AxAgBEIANwMIIARCADcDOCABUARAIARBCBAJIgA2AgQgAEUEQCAEEAYgAwRAIANBADYCBCADQQ42AgALQQAPCyAAQgA3AwAgBA8LAkAgAaciBUEEdBAJIgZFDQAgBCAGNgIAIAVBA3RBCGoQCSIFRQ0AIAQgATcDECAEIAU2AgQDQCAAIAynIghBBHRqIgcpAwgiDVBFBEAgBygCACIHRQRAIAMEQCADQQA2AgQgA0ESNgIACyAGEAYgBRAGIAQQBkEADwsgBiAKp0EEdGoiCSANNwMIIAkgBzYCACAFIAhBA3RqIAs3AwAgCyANfCELIApCAXwhCgsgDEIBfCIMIAFSDQALIAQgCjcDCCAEQgAgCiACGzcDGCAFIAqnQQN0aiALNwMAIAQgCzcDMCAEDwsgAwRAIANBADYCBCADQQ42AgALIAYQBiAEEAZBAAvlAQIDfwF+QX8hBQJAIAAgASACQQAQJiIERQ0AIAAgASACEIsBIgZFDQACfgJAIAJBCHENACAAKAJAIAGnQQR0aigCCCICRQ0AIAIgAxAhQQBOBEAgAykDAAwCCyAAQQhqIgAEQCAAQQA2AgQgAEEPNgIAC0F/DwsgAxAqIAMgBCgCGDYCLCADIAQpAyg3AxggAyAEKAIUNgIoIAMgBCkDIDcDICADIAQoAhA7ATAgAyAELwFSOwEyQvwBQtwBIAQtAAYbCyEHIAMgBjYCCCADIAE3AxAgAyAHQgOENwMAQQAhBQsgBQspAQF/IAAgASACIABBCGoiABAmIgNFBEBBAA8LIAMoAjBBACACIAAQJQuAAwEGfwJ/An9BMCABQYB/Sw0BGgJ/IAFBgH9PBEBBhIQBQTA2AgBBAAwBC0EAQRAgAUELakF4cSABQQtJGyIFQcwAahAJIgFFDQAaIAFBCGshAgJAIAFBP3FFBEAgAiEBDAELIAFBBGsiBigCACIHQXhxIAFBP2pBQHFBCGsiASABQUBrIAEgAmtBD0sbIgEgAmsiA2shBCAHQQNxRQRAIAIoAgAhAiABIAQ2AgQgASACIANqNgIADAELIAEgBCABKAIEQQFxckECcjYCBCABIARqIgQgBCgCBEEBcjYCBCAGIAMgBigCAEEBcXJBAnI2AgAgAiADaiIEIAQoAgRBAXI2AgQgAiADEDsLAkAgASgCBCICQQNxRQ0AIAJBeHEiAyAFQRBqTQ0AIAEgBSACQQFxckECcjYCBCABIAVqIgIgAyAFayIFQQNyNgIEIAEgA2oiAyADKAIEQQFyNgIEIAIgBRA7CyABQQhqCyIBRQsEQEEwDwsgACABNgIAQQALCwoAIABBiIQBEAQL6AIBBX8gACgCUCEBIAAvATAhBEEEIQUDQCABQQAgAS8BACICIARrIgMgAiADSRs7AQAgAUEAIAEvAQIiAiAEayIDIAIgA0kbOwECIAFBACABLwEEIgIgBGsiAyACIANJGzsBBCABQQAgAS8BBiICIARrIgMgAiADSRs7AQYgBUGAgARGRQRAIAFBCGohASAFQQRqIQUMAQsLAkAgBEUNACAEQQNxIQUgACgCTCEBIARBAWtBA08EQCAEIAVrIQADQCABQQAgAS8BACICIARrIgMgAiADSRs7AQAgAUEAIAEvAQIiAiAEayIDIAIgA0kbOwECIAFBACABLwEEIgIgBGsiAyACIANJGzsBBCABQQAgAS8BBiICIARrIgMgAiADSRs7AQYgAUEIaiEBIABBBGsiAA0ACwsgBUUNAANAIAFBACABLwEAIgAgBGsiAiAAIAJJGzsBACABQQJqIQEgBUEBayIFDQALCwuDAQEEfyACQQFOBEAgAiAAKAJIIAFqIgJqIQMgACgCUCEEA0AgBCACKAAAQbHz3fF5bEEPdkH+/wdxaiIFLwEAIgYgAUH//wNxRwRAIAAoAkwgASAAKAI4cUH//wNxQQF0aiAGOwEAIAUgATsBAAsgAUEBaiEBIAJBAWoiAiADSQ0ACwsLUAECfyABIAAoAlAgACgCSCABaigAAEGx893xeWxBD3ZB/v8HcWoiAy8BACICRwRAIAAoAkwgACgCOCABcUEBdGogAjsBACADIAE7AQALIAILugEBAX8jAEEQayICJAAgAkEAOgAIQYCBAUECNgIAQfyAAUEDNgIAQfiAAUEENgIAQfSAAUEFNgIAQfCAAUEGNgIAQeyAAUEHNgIAQeiAAUEINgIAQeSAAUEJNgIAQeCAAUEKNgIAQdyAAUELNgIAQdiAAUEMNgIAQdSAAUENNgIAQdCAAUEONgIAQcyAAUEPNgIAQciAAUEQNgIAQcSAAUERNgIAQcCAAUESNgIAIAAgARBYIAJBEGokAAu9AQEBfyMAQRBrIgEkACABQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgAEEANgJAIAFBEGokAEEAC70BAQF/IwBBEGsiASQAIAFBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAKAJAIQAgAUEQaiQAIAALvgEBAX8jAEEQayIEJAAgBEEAOgAIQYCBAUECNgIAQfyAAUEDNgIAQfiAAUEENgIAQfSAAUEFNgIAQfCAAUEGNgIAQeyAAUEHNgIAQeiAAUEINgIAQeSAAUEJNgIAQeCAAUEKNgIAQdyAAUELNgIAQdiAAUEMNgIAQdSAAUENNgIAQdCAAUEONgIAQcyAAUEPNgIAQciAAUEQNgIAQcSAAUERNgIAQcCAAUESNgIAIAAgASACIAMQVyAEQRBqJAALygEAIwBBEGsiAyQAIANBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAIAAoAkAgASACQdSAASgCABEAADYCQCADQRBqJAALwAEBAX8jAEEQayIDJAAgA0EAOgAIQYCBAUECNgIAQfyAAUEDNgIAQfiAAUEENgIAQfSAAUEFNgIAQfCAAUEGNgIAQeyAAUEHNgIAQeiAAUEINgIAQeSAAUEJNgIAQeCAAUEKNgIAQdyAAUELNgIAQdiAAUEMNgIAQdSAAUENNgIAQdCAAUEONgIAQcyAAUEPNgIAQciAAUEQNgIAQcSAAUERNgIAQcCAAUESNgIAIAAgASACEF0hACADQRBqJAAgAAu+AQEBfyMAQRBrIgIkACACQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgACABEFwhACACQRBqJAAgAAu2AQEBfyMAQRBrIgAkACAAQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgAEEQaiQAQQgLwgEBAX8jAEEQayIEJAAgBEEAOgAIQYCBAUECNgIAQfyAAUEDNgIAQfiAAUEENgIAQfSAAUEFNgIAQfCAAUEGNgIAQeyAAUEHNgIAQeiAAUEINgIAQeSAAUEJNgIAQeCAAUEKNgIAQdyAAUELNgIAQdiAAUEMNgIAQdSAAUENNgIAQdCAAUEONgIAQcyAAUEPNgIAQciAAUEQNgIAQcSAAUERNgIAQcCAAUESNgIAIAAgASACIAMQWSEAIARBEGokACAAC8IBAQF/IwBBEGsiBCQAIARBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAIAEgAiADEFYhACAEQRBqJAAgAAsHACAALwEwC8ABAQF/IwBBEGsiAyQAIANBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAIAEgAhBVIQAgA0EQaiQAIAALBwAgACgCQAsaACAAIAAoAkAgASACQdSAASgCABEAADYCQAsLACAAQQA2AkBBAAsHACAAKAIgCwQAQQgLzgUCA34BfyMAQYBAaiIIJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEDhECAwwFAAEECAkJCQkJCQcJBgkLIANCCFoEfiACIAEoAmQ2AgAgAiABKAJoNgIEQggFQn8LIQYMCwsgARAGDAoLIAEoAhAiAgRAIAIgASkDGCABQeQAaiICEEEiA1ANCCABKQMIIgVCf4UgA1QEQCACBEAgAkEANgIEIAJBFTYCAAsMCQsgAUEANgIQIAEgAyAFfDcDCCABIAEpAwAgA3w3AwALIAEtAHgEQCABKQMAIQUMCQtCACEDIAEpAwAiBVAEQCABQgA3AyAMCgsDQCAAIAggBSADfSIFQoDAACAFQoDAAFQbEBEiB0J/VwRAIAFB5ABqIgEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwJCyAHUEUEQCABKQMAIgUgAyAHfCIDWA0KDAELCyABQeQAagRAIAFBADYCaCABQRE2AmQLDAcLIAEpAwggASkDICIFfSIHIAMgAyAHVhsiA1ANCAJAIAEtAHhFDQAgACAFQQAQFEF/Sg0AIAFB5ABqIgEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwHCyAAIAIgAxARIgZCf1cEQCABQeQAagRAIAFBADYCaCABQRE2AmQLDAcLIAEgASkDICAGfCIDNwMgIAZCAFINCEIAIQYgAyABKQMIWg0IIAFB5ABqBEAgAUEANgJoIAFBETYCZAsMBgsgASkDICABKQMAIgV9IAEpAwggBX0gAiADIAFB5ABqEEQiA0IAUw0FIAEgASkDACADfDcDIAwHCyACIAFBKGoQYEEfdawhBgwGCyABMABgIQYMBQsgASkDcCEGDAQLIAEpAyAgASkDAH0hBgwDCyABQeQAagRAIAFBADYCaCABQRw2AmQLC0J/IQYMAQsgASAFNwMgCyAIQYBAayQAIAYLBwAgACgCAAsPACAAIAAoAjBBAWo2AjALGABB+IMBQgA3AgBBgIQBQQA2AgBB+IMBCwcAIABBDGoLBwAgACgCLAsHACAAKAIoCwcAIAAoAhgLFQAgACABrSACrUIghoQgAyAEEIoBCxMBAX4gABAzIgFCIIinEAAgAacLbwEBfiABrSACrUIghoQhBSMAQRBrIgEkAAJ/IABFBEAgBVBFBEAgBARAIARBADYCBCAEQRI2AgALQQAMAgtBAEIAIAMgBBA6DAELIAEgBTcDCCABIAA2AgAgAUIBIAMgBBA6CyEAIAFBEGokACAACxQAIAAgASACrSADrUIghoQgBBBSC9oCAgJ/AX4CfyABrSACrUIghoQiByAAKQMwVEEAIARBCkkbRQRAIABBCGoEQCAAQQA2AgwgAEESNgIIC0F/DAELIAAtABhBAnEEQCAAQQhqBEAgAEEANgIMIABBGTYCCAtBfwwBCyADBH8gA0H//wNxQQhGIANBfUtyBUEBC0UEQCAAQQhqBEAgAEEANgIMIABBEDYCCAtBfwwBCyAAKAJAIgEgB6ciBUEEdGooAgAiAgR/IAIoAhAgA0YFIANBf0YLIQYgASAFQQR0aiIBIQUgASgCBCEBAkAgBgRAIAFFDQEgAUEAOwFQIAEgASgCAEF+cSIANgIAIAANASABECAgBUEANgIEQQAMAgsCQCABDQAgBSACECsiATYCBCABDQAgAEEIagRAIABBADYCDCAAQQ42AggLQX8MAgsgASAEOwFQIAEgAzYCECABIAEoAgBBAXI2AgALQQALCxwBAX4gACABIAIgAEEIahBMIgNCIIinEAAgA6cLHwEBfiAAIAEgAq0gA61CIIaEEBEiBEIgiKcQACAEpwteAQF+An5CfyAARQ0AGiAAKQMwIgIgAUEIcUUNABpCACACUA0AGiAAKAJAIQADQCACIAKnQQR0IABqQRBrKAIADQEaIAJCAX0iAkIAUg0AC0IACyICQiCIpxAAIAKnCxMAIAAgAa0gAq1CIIaEIAMQiwELnwEBAn4CfiACrSADrUIghoQhBUJ/IQQCQCAARQ0AIAAoAgQNACAAQQRqIQIgBUJ/VwRAIAIEQCACQQA2AgQgAkESNgIAC0J/DAILQgAhBCAALQAQDQAgBVANACAAKAIUIAEgBRARIgRCf1UNACAAKAIUIQAgAgRAIAIgACgCDDYCACACIAAoAhA2AgQLQn8hBAsgBAsiBEIgiKcQACAEpwueAQEBfwJ/IAAgACABrSACrUIghoQgAyAAKAIcEH8iAQRAIAEQMkF/TARAIABBCGoEQCAAIAEoAgw2AgggACABKAIQNgIMCyABEAtBAAwCC0EYEAkiBEUEQCAAQQhqBEAgAEEANgIMIABBDjYCCAsgARALQQAMAgsgBCAANgIAIARBADYCDCAEQgA3AgQgBCABNgIUIARBADoAEAsgBAsLsQICAX8BfgJ/QX8hBAJAIAAgAa0gAq1CIIaEIgZBAEEAECZFDQAgAC0AGEECcQRAIABBCGoEQCAAQQA2AgwgAEEZNgIIC0F/DAILIAAoAkAiASAGpyICQQR0aiIEKAIIIgUEQEEAIQQgBSADEHFBf0oNASAAQQhqBEAgAEEANgIMIABBDzYCCAtBfwwCCwJAIAQoAgAiBQRAIAUoAhQgA0YNAQsCQCABIAJBBHRqIgEoAgQiBA0AIAEgBRArIgQ2AgQgBA0AIABBCGoEQCAAQQA2AgwgAEEONgIIC0F/DAMLIAQgAzYCFCAEIAQoAgBBIHI2AgBBAAwCC0EAIQQgASACQQR0aiIBKAIEIgBFDQAgACAAKAIAQV9xIgI2AgAgAg0AIAAQICABQQA2AgQLIAQLCxQAIAAgAa0gAq1CIIaEIAQgBRBzCxIAIAAgAa0gAq1CIIaEIAMQFAtBAQF+An4gAUEAIAIbRQRAIABBCGoEQCAAQQA2AgwgAEESNgIIC0J/DAELIAAgASACIAMQdAsiBEIgiKcQACAEpwvGAwIFfwF+An4CQAJAIAAiBC0AGEECcQRAIARBCGoEQCAEQQA2AgwgBEEZNgIICwwBCyABRQRAIARBCGoEQCAEQQA2AgwgBEESNgIICwwBCyABECIiByABakEBay0AAEEvRwRAIAdBAmoQCSIARQRAIARBCGoEQCAEQQA2AgwgBEEONgIICwwCCwJAAkAgACIGIAEiBXNBA3ENACAFQQNxBEADQCAGIAUtAAAiAzoAACADRQ0DIAZBAWohBiAFQQFqIgVBA3ENAAsLIAUoAgAiA0F/cyADQYGChAhrcUGAgYKEeHENAANAIAYgAzYCACAFKAIEIQMgBkEEaiEGIAVBBGohBSADQYGChAhrIANBf3NxQYCBgoR4cUUNAAsLIAYgBS0AACIDOgAAIANFDQADQCAGIAUtAAEiAzoAASAGQQFqIQYgBUEBaiEFIAMNAAsLIAcgACIDakEvOwAACyAEQQBCAEEAEFIiAEUEQCADEAYMAQsgBCADIAEgAxsgACACEHQhCCADEAYgCEJ/VwRAIAAQCyAIDAMLIAQgCEEDQYCA/I8EEHNBf0oNASAEIAgQchoLQn8hCAsgCAsiCEIgiKcQACAIpwsQACAAIAGtIAKtQiCGhBByCxYAIAAgAa0gAq1CIIaEIAMgBCAFEGYL3iMDD38IfgF8IwBB8ABrIgkkAAJAIAFBAE5BACAAG0UEQCACBEAgAkEANgIEIAJBEjYCAAsMAQsgACkDGCISAn5BsIMBKQMAIhNCf1EEQCAJQoOAgIBwNwMwIAlChoCAgPAANwMoIAlCgYCAgCA3AyBBsIMBQQAgCUEgahAkNwMAIAlCj4CAgHA3AxAgCUKJgICAoAE3AwAgCUKMgICA0AE3AwhBuIMBQQggCRAkNwMAQbCDASkDACETCyATC4MgE1IEQCACBEAgAkEANgIEIAJBHDYCAAsMAQsgASABQRByQbiDASkDACITIBKDIBNRGyIKQRhxQRhGBEAgAgRAIAJBADYCBCACQRk2AgALDAELIAlBOGoQKgJAIAAgCUE4ahAhBEACQCAAKAIMQQVGBEAgACgCEEEsRg0BCyACBEAgAiAAKAIMNgIAIAIgACgCEDYCBAsMAgsgCkEBcUUEQCACBEAgAkEANgIEIAJBCTYCAAsMAwsgAhBJIgVFDQEgBSAKNgIEIAUgADYCACAKQRBxRQ0CIAUgBSgCFEECcjYCFCAFIAUoAhhBAnI2AhgMAgsgCkECcQRAIAIEQCACQQA2AgQgAkEKNgIACwwCCyAAEDJBf0wEQCACBEAgAiAAKAIMNgIAIAIgACgCEDYCBAsMAQsCfyAKQQhxBEACQCACEEkiAUUNACABIAo2AgQgASAANgIAIApBEHFFDQAgASABKAIUQQJyNgIUIAEgASgCGEECcjYCGAsgAQwBCyMAQUBqIg4kACAOQQhqECoCQCAAIA5BCGoQIUF/TARAIAIEQCACIAAoAgw2AgAgAiAAKAIQNgIECwwBCyAOLQAIQQRxRQRAIAIEQCACQYoBNgIEIAJBBDYCAAsMAQsgDikDICETIAIQSSIFRQRAQQAhBQwBCyAFIAo2AgQgBSAANgIAIApBEHEEQCAFIAUoAhRBAnI2AhQgBSAFKAIYQQJyNgIYCwJAAkACQCATUARAAn8gACEBAkADQCABKQMYQoCAEINCAFINASABKAIAIgENAAtBAQwBCyABQQBCAEESEA6nCw0EIAVBCGoEQCAFQQA2AgwgBUETNgIICwwBCyMAQdAAayIBJAACQCATQhVYBEAgBUEIagRAIAVBADYCDCAFQRM2AggLDAELAkACQCAFKAIAQgAgE0KqgAQgE0KqgARUGyISfUECEBRBf0oNACAFKAIAIgMoAgxBBEYEQCADKAIQQRZGDQELIAVBCGoEQCAFIAMoAgw2AgggBSADKAIQNgIMCwwBCyAFKAIAEDMiE0J/VwRAIAUoAgAhAyAFQQhqIggEQCAIIAMoAgw2AgAgCCADKAIQNgIECwwBCyAFKAIAIBJBACAFQQhqIg8QLSIERQ0BIBJCqoAEWgRAAkAgBCkDCEIUVARAIARBADoAAAwBCyAEQhQ3AxAgBEEBOgAACwsgAQRAIAFBADYCBCABQRM2AgALIARCABATIQwCQCAELQAABH4gBCkDCCAEKQMQfQVCAAunIgdBEmtBA0sEQEJ/IRcDQCAMQQFrIQMgByAMakEVayEGAkADQCADQQFqIgNB0AAgBiADaxB6IgNFDQEgA0EBaiIMQZ8SQQMQPQ0ACwJAIAMgBCgCBGusIhIgBCkDCFYEQCAEQQA6AAAMAQsgBCASNwMQIARBAToAAAsgBC0AAAR+IAQpAxAFQgALIRICQCAELQAABH4gBCkDCCAEKQMQfQVCAAtCFVgEQCABBEAgAUEANgIEIAFBEzYCAAsMAQsgBEIEEBMoAABB0JaVMEcEQCABBEAgAUEANgIEIAFBEzYCAAsMAQsCQAJAAkAgEkIUVA0AIAQoAgQgEqdqQRRrKAAAQdCWmThHDQACQCASQhR9IhQgBCIDKQMIVgRAIANBADoAAAwBCyADIBQ3AxAgA0EBOgAACyAFKAIUIRAgBSgCACEGIAMtAAAEfiAEKQMQBUIACyEWIARCBBATGiAEEAwhCyAEEAwhDSAEEB0iFEJ/VwRAIAEEQCABQRY2AgQgAUEENgIACwwECyAUQjh8IhUgEyAWfCIWVgRAIAEEQCABQQA2AgQgAUEVNgIACwwECwJAAkAgEyAUVg0AIBUgEyAEKQMIfFYNAAJAIBQgE30iFSAEKQMIVgRAIANBADoAAAwBCyADIBU3AxAgA0EBOgAAC0EAIQcMAQsgBiAUQQAQFEF/TARAIAEEQCABIAYoAgw2AgAgASAGKAIQNgIECwwFC0EBIQcgBkI4IAFBEGogARAtIgNFDQQLIANCBBATKAAAQdCWmTBHBEAgAQRAIAFBADYCBCABQRU2AgALIAdFDQQgAxAIDAQLIAMQHSEVAkAgEEEEcSIGRQ0AIBQgFXxCDHwgFlENACABBEAgAUEANgIEIAFBFTYCAAsgB0UNBCADEAgMBAsgA0IEEBMaIAMQFSIQIAsgC0H//wNGGyELIAMQFSIRIA0gDUH//wNGGyENAkAgBkUNACANIBFGQQAgCyAQRhsNACABBEAgAUEANgIEIAFBFTYCAAsgB0UNBCADEAgMBAsgCyANcgRAIAEEQCABQQA2AgQgAUEBNgIACyAHRQ0EIAMQCAwECyADEB0iGCADEB1SBEAgAQRAIAFBADYCBCABQQE2AgALIAdFDQQgAxAIDAQLIAMQHSEVIAMQHSEWIAMtAABFBEAgAQRAIAFBADYCBCABQRQ2AgALIAdFDQQgAxAIDAQLIAcEQCADEAgLAkAgFkIAWQRAIBUgFnwiGSAWWg0BCyABBEAgAUEWNgIEIAFBBDYCAAsMBAsgEyAUfCIUIBlUBEAgAQRAIAFBADYCBCABQRU2AgALDAQLAkAgBkUNACAUIBlRDQAgAQRAIAFBADYCBCABQRU2AgALDAQLIBggFUIugFgNASABBEAgAUEANgIEIAFBFTYCAAsMAwsCQCASIAQpAwhWBEAgBEEAOgAADAELIAQgEjcDECAEQQE6AAALIAUoAhQhAyAELQAABH4gBCkDCCAEKQMQfQVCAAtCFVgEQCABBEAgAUEANgIEIAFBFTYCAAsMAwsgBC0AAAR+IAQpAxAFQgALIRQgBEIEEBMaIAQQFQRAIAEEQCABQQA2AgQgAUEBNgIACwwDCyAEEAwgBBAMIgZHBEAgAQRAIAFBADYCBCABQRM2AgALDAMLIAQQFSEHIAQQFa0iFiAHrSIVfCIYIBMgFHwiFFYEQCABBEAgAUEANgIEIAFBFTYCAAsMAwsCQCADQQRxRQ0AIBQgGFENACABBEAgAUEANgIEIAFBFTYCAAsMAwsgBq0gARBqIgNFDQIgAyAWNwMgIAMgFTcDGCADQQA6ACwMAQsgGCABEGoiA0UNASADIBY3AyAgAyAVNwMYIANBAToALAsCQCASQhR8IhQgBCkDCFYEQCAEQQA6AAAMAQsgBCAUNwMQIARBAToAAAsgBBAMIQYCQCADKQMYIAMpAyB8IBIgE3xWDQACQCAGRQRAIAUtAARBBHFFDQELAkAgEkIWfCISIAQpAwhWBEAgBEEAOgAADAELIAQgEjcDECAEQQE6AAALIAQtAAAEfiAEKQMIIAQpAxB9BUIACyIUIAatIhJUDQEgBS0ABEEEcUEAIBIgFFIbDQEgBkUNACADIAQgEhATIAZBACABEDUiBjYCKCAGDQAgAxAWDAILAkAgEyADKQMgIhJYBEACQCASIBN9IhIgBCkDCFYEQCAEQQA6AAAMAQsgBCASNwMQIARBAToAAAsgBCADKQMYEBMiBkUNAiAGIAMpAxgQFyIHDQEgAQRAIAFBADYCBCABQQ42AgALIAMQFgwDCyAFKAIAIBJBABAUIQcgBSgCACEGIAdBf0wEQCABBEAgASAGKAIMNgIAIAEgBigCEDYCBAsgAxAWDAMLQQAhByAGEDMgAykDIFENACABBEAgAUEANgIEIAFBEzYCAAsgAxAWDAILQgAhFAJAAkAgAykDGCIWUEUEQANAIBQgAykDCFIiC0UEQCADLQAsDQMgFkIuVA0DAn8CQCADKQMQIhVCgIAEfCISIBVaQQAgEkKAgICAAVQbRQ0AIAMoAgAgEqdBBHQQNCIGRQ0AIAMgBjYCAAJAIAMpAwgiFSASWg0AIAYgFadBBHRqIgZCADcCACAGQgA3AAUgFUIBfCIVIBJRDQADQCADKAIAIBWnQQR0aiIGQgA3AgAgBkIANwAFIBVCAXwiFSASUg0ACwsgAyASNwMIIAMgEjcDEEEBDAELIAEEQCABQQA2AgQgAUEONgIAC0EAC0UNBAtB2AAQCSIGBH8gBkIANwMgIAZBADYCGCAGQv////8PNwMQIAZBADsBDCAGQb+GKDYCCCAGQQE6AAYgBkEAOwEEIAZBADYCACAGQgA3A0ggBkGAgNiNeDYCRCAGQgA3AyggBkIANwMwIAZCADcDOCAGQUBrQQA7AQAgBkIANwNQIAYFQQALIQYgAygCACAUp0EEdGogBjYCAAJAIAYEQCAGIAUoAgAgB0EAIAEQaCISQn9VDQELIAsNBCABKAIAQRNHDQQgAQRAIAFBADYCBCABQRU2AgALDAQLIBRCAXwhFCAWIBJ9IhZCAFINAAsLIBQgAykDCFINAAJAIAUtAARBBHFFDQAgBwRAIActAAAEfyAHKQMQIAcpAwhRBUEAC0UNAgwBCyAFKAIAEDMiEkJ/VwRAIAUoAgAhBiABBEAgASAGKAIMNgIAIAEgBigCEDYCBAsgAxAWDAULIBIgAykDGCADKQMgfFINAQsgBxAIAn4gCARAAn8gF0IAVwRAIAUgCCABEEghFwsgBSADIAEQSCISIBdVCwRAIAgQFiASDAILIAMQFgwFC0IAIAUtAARBBHFFDQAaIAUgAyABEEgLIRcgAyEIDAMLIAEEQCABQQA2AgQgAUEVNgIACyAHEAggAxAWDAILIAMQFiAHEAgMAQsgAQRAIAFBADYCBCABQRU2AgALIAMQFgsCQCAMIAQoAgRrrCISIAQpAwhWBEAgBEEAOgAADAELIAQgEjcDECAEQQE6AAALIAQtAAAEfiAEKQMIIAQpAxB9BUIAC6ciB0ESa0EDSw0BCwsgBBAIIBdCf1UNAwwBCyAEEAgLIA8iAwRAIAMgASgCADYCACADIAEoAgQ2AgQLIAgQFgtBACEICyABQdAAaiQAIAgNAQsgAgRAIAIgBSgCCDYCACACIAUoAgw2AgQLDAELIAUgCCgCADYCQCAFIAgpAwg3AzAgBSAIKQMQNwM4IAUgCCgCKDYCICAIEAYgBSgCUCEIIAVBCGoiBCEBQQAhBwJAIAUpAzAiE1ANAEGAgICAeCEGAn8gE7pEAAAAAAAA6D+jRAAA4P///+9BpCIaRAAAAAAAAPBBYyAaRAAAAAAAAAAAZnEEQCAaqwwBC0EACyIDQYCAgIB4TQRAIANBAWsiA0EBdiADciIDQQJ2IANyIgNBBHYgA3IiA0EIdiADciIDQRB2IANyQQFqIQYLIAYgCCgCACIMTQ0AIAYQPCILRQRAIAEEQCABQQA2AgQgAUEONgIACwwBCwJAIAgpAwhCACAMG1AEQCAIKAIQIQ8MAQsgCCgCECEPA0AgDyAHQQJ0aigCACIBBEADQCABKAIYIQMgASALIAEoAhwgBnBBAnRqIg0oAgA2AhggDSABNgIAIAMiAQ0ACwsgB0EBaiIHIAxHDQALCyAPEAYgCCAGNgIAIAggCzYCEAsCQCAFKQMwUA0AQgAhEwJAIApBBHFFBEADQCAFKAJAIBOnQQR0aigCACgCMEEAQQAgAhAlIgFFDQQgBSgCUCABIBNBCCAEEE1FBEAgBCgCAEEKRw0DCyATQgF8IhMgBSkDMFQNAAwDCwALA0AgBSgCQCATp0EEdGooAgAoAjBBAEEAIAIQJSIBRQ0DIAUoAlAgASATQQggBBBNRQ0BIBNCAXwiEyAFKQMwVA0ACwwBCyACBEAgAiAEKAIANgIAIAIgBCgCBDYCBAsMAQsgBSAFKAIUNgIYDAELIAAgACgCMEEBajYCMCAFEEtBACEFCyAOQUBrJAAgBQsiBQ0BIAAQGhoLQQAhBQsgCUHwAGokACAFCxAAIwAgAGtBcHEiACQAIAALBgAgACQACwQAIwAL4CoDEX8IfgN8IwBBwMAAayIHJABBfyECAkAgAEUNAAJ/IAAtAChFBEBBACAAKAIYIAAoAhRGDQEaC0EBCyEBAkACQCAAKQMwIhRQRQRAIAAoAkAhCgNAIAogEqdBBHRqIgMtAAwhCwJAAkAgAygCCA0AIAsNACADKAIEIgNFDQEgAygCAEUNAQtBASEBCyAXIAtBAXOtQv8Bg3whFyASQgF8IhIgFFINAAsgF0IAUg0BCyAAKAIEQQhxIAFyRQ0BAn8gACgCACIDKAIkIgFBA0cEQCADKAIgBH9BfyADEBpBAEgNAhogAygCJAUgAQsEQCADEEMLQX8gA0EAQgBBDxAOQgBTDQEaIANBAzYCJAtBAAtBf0oNASAAKAIAKAIMQRZGBEAgACgCACgCEEEsRg0CCyAAKAIAIQEgAEEIagRAIAAgASgCDDYCCCAAIAEoAhA2AgwLDAILIAFFDQAgFCAXVARAIABBCGoEQCAAQQA2AgwgAEEUNgIICwwCCyAXp0EDdBAJIgtFDQFCfyEWQgAhEgNAAkAgCiASp0EEdGoiBigCACIDRQ0AAkAgBigCCA0AIAYtAAwNACAGKAIEIgFFDQEgASgCAEUNAQsgFiADKQNIIhMgEyAWVhshFgsgBi0ADEUEQCAXIBlYBEAgCxAGIABBCGoEQCAAQQA2AgwgAEEUNgIICwwECyALIBmnQQN0aiASNwMAIBlCAXwhGQsgEkIBfCISIBRSDQALIBcgGVYEQCALEAYgAEEIagRAIABBADYCDCAAQRQ2AggLDAILAkACQCAAKAIAKQMYQoCACINQDQACQAJAIBZCf1INACAAKQMwIhNQDQIgE0IBgyEVIAAoAkAhAwJAIBNCAVEEQEJ/IRRCACESQgAhFgwBCyATQn6DIRlCfyEUQgAhEkIAIRYDQCADIBKnQQR0aigCACIBBEAgFiABKQNIIhMgEyAWVCIBGyEWIBQgEiABGyEUCyADIBJCAYQiGKdBBHRqKAIAIgEEQCAWIAEpA0giEyATIBZUIgEbIRYgFCAYIAEbIRQLIBJCAnwhEiAZQgJ9IhlQRQ0ACwsCQCAVUA0AIAMgEqdBBHRqKAIAIgFFDQAgFiABKQNIIhMgEyAWVCIBGyEWIBQgEiABGyEUCyAUQn9RDQBCACETIwBBEGsiBiQAAkAgACAUIABBCGoiCBBBIhVQDQAgFSAAKAJAIBSnQQR0aigCACIKKQMgIhh8IhQgGFpBACAUQn9VG0UEQCAIBEAgCEEWNgIEIAhBBDYCAAsMAQsgCi0ADEEIcUUEQCAUIRMMAQsgACgCACAUQQAQFCEBIAAoAgAhAyABQX9MBEAgCARAIAggAygCDDYCACAIIAMoAhA2AgQLDAELIAMgBkEMakIEEBFCBFIEQCAAKAIAIQEgCARAIAggASgCDDYCACAIIAEoAhA2AgQLDAELIBRCBHwgFCAGKAAMQdCWncAARhtCFEIMAn9BASEBAkAgCikDKEL+////D1YNACAKKQMgQv7///8PVg0AQQAhAQsgAQsbfCIUQn9XBEAgCARAIAhBFjYCBCAIQQQ2AgALDAELIBQhEwsgBkEQaiQAIBMiFkIAUg0BIAsQBgwFCyAWUA0BCwJ/IAAoAgAiASgCJEEBRgRAIAFBDGoEQCABQQA2AhAgAUESNgIMC0F/DAELQX8gAUEAIBZBERAOQgBTDQAaIAFBATYCJEEAC0F/Sg0BC0IAIRYCfyAAKAIAIgEoAiRBAUYEQCABQQxqBEAgAUEANgIQIAFBEjYCDAtBfwwBC0F/IAFBAEIAQQgQDkIAUw0AGiABQQE2AiRBAAtBf0oNACAAKAIAIQEgAEEIagRAIAAgASgCDDYCCCAAIAEoAhA2AgwLIAsQBgwCCyAAKAJUIgIEQCACQgA3AxggAigCAEQAAAAAAAAAACACKAIMIAIoAgQRDgALIABBCGohBCAXuiEcQgAhFAJAAkACQANAIBcgFCITUgRAIBO6IByjIRsgE0IBfCIUuiAcoyEaAkAgACgCVCICRQ0AIAIgGjkDKCACIBs5AyAgAisDECAaIBuhRAAAAAAAAAAAoiAboCIaIAIrAxihY0UNACACKAIAIBogAigCDCACKAIEEQ4AIAIgGjkDGAsCfwJAIAAoAkAgCyATp0EDdGopAwAiE6dBBHRqIg0oAgAiAQRAIAEpA0ggFlQNAQsgDSgCBCEFAkACfwJAIA0oAggiAkUEQCAFRQ0BQQEgBSgCACICQQFxDQIaIAJBwABxQQZ2DAILQQEgBQ0BGgsgDSABECsiBTYCBCAFRQ0BIAJBAEcLIQZBACEJIwBBEGsiDCQAAkAgEyAAKQMwWgRAIABBCGoEQCAAQQA2AgwgAEESNgIIC0F/IQkMAQsgACgCQCIKIBOnIgNBBHRqIg8oAgAiAkUNACACLQAEDQACQCACKQNIQhp8IhhCf1cEQCAAQQhqBEAgAEEWNgIMIABBBDYCCAsMAQtBfyEJIAAoAgAgGEEAEBRBf0wEQCAAKAIAIQIgAEEIagRAIAAgAigCDDYCCCAAIAIoAhA2AgwLDAILIAAoAgBCBCAMQQxqIABBCGoiDhAtIhBFDQEgEBAMIQEgEBAMIQggEC0AAAR/IBApAxAgECkDCFEFQQALIQIgEBAIIAJFBEAgDgRAIA5BADYCBCAOQRQ2AgALDAILAkAgCEUNACAAKAIAIAGtQQEQFEF/TARAQYSEASgCACECIA4EQCAOIAI2AgQgDkEENgIACwwDC0EAIAAoAgAgCEEAIA4QRSIBRQ0BIAEgCEGAAiAMQQhqIA4QbiECIAEQBiACRQ0BIAwoAggiAkUNACAMIAIQbSICNgIIIA8oAgAoAjQgAhBvIQIgDygCACACNgI0CyAPKAIAIgJBAToABEEAIQkgCiADQQR0aigCBCIBRQ0BIAEtAAQNASACKAI0IQIgAUEBOgAEIAEgAjYCNAwBC0F/IQkLIAxBEGokACAJQQBIDQUgACgCABAfIhhCAFMNBSAFIBg3A0ggBgRAQQAhDCANKAIIIg0hASANRQRAIAAgACATQQhBABB/IgwhASAMRQ0HCwJAAkAgASAHQQhqECFBf0wEQCAEBEAgBCABKAIMNgIAIAQgASgCEDYCBAsMAQsgBykDCCISQsAAg1AEQCAHQQA7ATggByASQsAAhCISNwMICwJAAkAgBSgCECICQX5PBEAgBy8BOCIDRQ0BIAUgAzYCECADIQIMAgsgAg0AIBJCBINQDQAgByAHKQMgNwMoIAcgEkIIhCISNwMIQQAhAgwBCyAHIBJC9////w+DIhI3AwgLIBJCgAGDUARAIAdBADsBOiAHIBJCgAGEIhI3AwgLAn8gEkIEg1AEQEJ/IRVBgAoMAQsgBSAHKQMgIhU3AyggEkIIg1AEQAJAAkACQAJAQQggAiACQX1LG0H//wNxDg0CAwMDAwMDAwEDAwMAAwtBgApBgAIgFUKUwuTzD1YbDAQLQYAKQYACIBVCg4Ow/w9WGwwDC0GACkGAAiAVQv////8PVhsMAgtBgApBgAIgFUIAUhsMAQsgBSAHKQMoNwMgQYACCyEPIAAoAgAQHyITQn9XBEAgACgCACECIAQEQCAEIAIoAgw2AgAgBCACKAIQNgIECwwBCyAFIAUvAQxB9/8DcTsBDCAAIAUgDxA3IgpBAEgNACAHLwE4IghBCCAFKAIQIgMgA0F9SxtB//8DcSICRyEGAkACQAJAAkACQAJAAkAgAiAIRwRAIANBAEchAwwBC0EAIQMgBS0AAEGAAXFFDQELIAUvAVIhCSAHLwE6IQIMAQsgBS8BUiIJIAcvAToiAkYNAQsgASABKAIwQQFqNgIwIAJB//8DcQ0BIAEhAgwCCyABIAEoAjBBAWo2AjBBACEJDAILQSZBACAHLwE6QQFGGyICRQRAIAQEQCAEQQA2AgQgBEEYNgIACyABEAsMAwsgACABIAcvATpBACAAKAIcIAIRBgAhAiABEAsgAkUNAgsgCUEARyEJIAhBAEcgBnFFBEAgAiEBDAELIAAgAiAHLwE4EIEBIQEgAhALIAFFDQELAkAgCEUgBnJFBEAgASECDAELIAAgAUEAEIABIQIgARALIAJFDQELAkAgA0UEQCACIQMMAQsgACACIAUoAhBBASAFLwFQEIIBIQMgAhALIANFDQELAkAgCUUEQCADIQEMAQsgBSgCVCIBRQRAIAAoAhwhAQsCfyAFLwFSGkEBCwRAIAQEQCAEQQA2AgQgBEEYNgIACyADEAsMAgsgACADIAUvAVJBASABQQARBgAhASADEAsgAUUNAQsgACgCABAfIhhCf1cEQCAAKAIAIQIgBARAIAQgAigCDDYCACAEIAIoAhA2AgQLDAELAkAgARAyQQBOBEACfwJAAkAgASAHQUBrQoDAABARIhJCAVMNAEIAIRkgFUIAVQRAIBW5IRoDQCAAIAdBQGsgEhAbQQBIDQMCQCASQoDAAFINACAAKAJUIgJFDQAgAiAZQoBAfSIZuSAaoxB7CyABIAdBQGtCgMAAEBEiEkIAVQ0ACwwBCwNAIAAgB0FAayASEBtBAEgNAiABIAdBQGtCgMAAEBEiEkIAVQ0ACwtBACASQn9VDQEaIAQEQCAEIAEoAgw2AgAgBCABKAIQNgIECwtBfwshAiABEBoaDAELIAQEQCAEIAEoAgw2AgAgBCABKAIQNgIEC0F/IQILIAEgB0EIahAhQX9MBEAgBARAIAQgASgCDDYCACAEIAEoAhA2AgQLQX8hAgsCf0EAIQkCQCABIgNFDQADQCADLQAaQQFxBEBB/wEhCSADQQBCAEEQEA4iFUIAUw0CIBVCBFkEQCADQQxqBEAgA0EANgIQIANBFDYCDAsMAwsgFachCQwCCyADKAIAIgMNAAsLIAlBGHRBGHUiA0F/TAsEQCAEBEAgBCABKAIMNgIAIAQgASgCEDYCBAsgARALDAELIAEQCyACQQBIDQAgACgCABAfIRUgACgCACECIBVCf1cEQCAEBEAgBCACKAIMNgIAIAQgAigCEDYCBAsMAQsgAiATEHVBf0wEQCAAKAIAIQIgBARAIAQgAigCDDYCACAEIAIoAhA2AgQLDAELIAcpAwgiE0LkAINC5ABSBEAgBARAIARBADYCBCAEQRQ2AgALDAELAkAgBS0AAEEgcQ0AIBNCEINQRQRAIAUgBygCMDYCFAwBCyAFQRRqEAEaCyAFIAcvATg2AhAgBSAHKAI0NgIYIAcpAyAhEyAFIBUgGH03AyAgBSATNwMoIAUgBS8BDEH5/wNxIANB/wFxQQF0cjsBDCAPQQp2IQNBPyEBAkACQAJAAkAgBSgCECICQQxrDgMAAQIBCyAFQS47AQoMAgtBLSEBIAMNACAFKQMoQv7///8PVg0AIAUpAyBC/v///w9WDQBBFCEBIAJBCEYNACAFLwFSQQFGDQAgBSgCMCICBH8gAi8BBAVBAAtB//8DcSICBEAgAiAFKAIwKAIAakEBay0AAEEvRg0BC0EKIQELIAUgATsBCgsgACAFIA8QNyICQQBIDQAgAiAKRwRAIAQEQCAEQQA2AgQgBEEUNgIACwwBCyAAKAIAIBUQdUF/Sg0BIAAoAgAhAiAEBEAgBCACKAIMNgIAIAQgAigCEDYCBAsLIA0NByAMEAsMBwsgDQ0CIAwQCwwCCyAFIAUvAQxB9/8DcTsBDCAAIAVBgAIQN0EASA0FIAAgEyAEEEEiE1ANBSAAKAIAIBNBABAUQX9MBEAgACgCACECIAQEQCAEIAIoAgw2AgAgBCACKAIQNgIECwwGCyAFKQMgIRIjAEGAQGoiAyQAAkAgElBFBEAgAEEIaiECIBK6IRoDQEF/IQEgACgCACADIBJCgMAAIBJCgMAAVBsiEyACEGVBAEgNAiAAIAMgExAbQQBIDQIgACgCVCAaIBIgE30iErqhIBqjEHsgEkIAUg0ACwtBACEBCyADQYBAayQAIAFBf0oNAUEBIREgAUEcdkEIcUEIRgwCCyAEBEAgBEEANgIEIARBDjYCAAsMBAtBAAtFDQELCyARDQBBfyECAkAgACgCABAfQgBTDQAgFyEUQQAhCkIAIRcjAEHwAGsiESQAAkAgACgCABAfIhVCAFkEQCAUUEUEQANAIAAgACgCQCALIBenQQN0aigCAEEEdGoiAygCBCIBBH8gAQUgAygCAAtBgAQQNyIBQQBIBEBCfyEXDAQLIAFBAEcgCnIhCiAXQgF8IhcgFFINAAsLQn8hFyAAKAIAEB8iGEJ/VwRAIAAoAgAhASAAQQhqBEAgACABKAIMNgIIIAAgASgCEDYCDAsMAgsgEULiABAXIgZFBEAgAEEIagRAIABBADYCDCAAQQ42AggLDAILIBggFX0hEyAVQv////8PViAUQv//A1ZyIApyQQFxBEAgBkGZEkEEECwgBkIsEBggBkEtEA0gBkEtEA0gBkEAEBIgBkEAEBIgBiAUEBggBiAUEBggBiATEBggBiAVEBggBkGUEkEEECwgBkEAEBIgBiAYEBggBkEBEBILIAZBnhJBBBAsIAZBABASIAYgFEL//wMgFEL//wNUG6dB//8DcSIBEA0gBiABEA0gBkF/IBOnIBNC/v///w9WGxASIAZBfyAVpyAVQv7///8PVhsQEiAGIABBJEEgIAAtACgbaigCACIDBH8gAy8BBAVBAAtB//8DcRANIAYtAABFBEAgAEEIagRAIABBADYCDCAAQRQ2AggLIAYQCAwCCyAAIAYoAgQgBi0AAAR+IAYpAxAFQgALEBshASAGEAggAUEASA0BIAMEQCAAIAMoAgAgAzMBBBAbQQBIDQILIBMhFwwBCyAAKAIAIQEgAEEIagRAIAAgASgCDDYCCCAAIAEoAhA2AgwLQn8hFwsgEUHwAGokACAXQgBTDQAgACgCABAfQj+HpyECCyALEAYgAkEASA0BAn8gACgCACIBKAIkQQFHBEAgAUEMagRAIAFBADYCECABQRI2AgwLQX8MAQsgASgCICICQQJPBEAgAUEMagRAIAFBADYCECABQR02AgwLQX8MAQsCQCACQQFHDQAgARAaQQBODQBBfwwBCyABQQBCAEEJEA5Cf1cEQCABQQI2AiRBfwwBCyABQQA2AiRBAAtFDQIgACgCACECIAQEQCAEIAIoAgw2AgAgBCACKAIQNgIECwwBCyALEAYLIAAoAlQQfCAAKAIAEENBfyECDAILIAAoAlQQfAsgABBLQQAhAgsgB0HAwABqJAAgAgtFAEHwgwFCADcDAEHogwFCADcDAEHggwFCADcDAEHYgwFCADcDAEHQgwFCADcDAEHIgwFCADcDAEHAgwFCADcDAEHAgwELoQMBCH8jAEGgAWsiAiQAIAAQMQJAAn8CQCAAKAIAIgFBAE4EQCABQbATKAIASA0BCyACIAE2AhAgAkEgakH2ESACQRBqEHZBASEGIAJBIGohBCACQSBqECIhA0EADAELIAFBAnQiAUGwEmooAgAhBQJ/AkACQCABQcATaigCAEEBaw4CAAEECyAAKAIEIQNB9IIBKAIAIQdBACEBAkACQANAIAMgAUHQ8QBqLQAARwRAQdcAIQQgAUEBaiIBQdcARw0BDAILCyABIgQNAEGw8gAhAwwBC0Gw8gAhAQNAIAEtAAAhCCABQQFqIgMhASAIDQAgAyEBIARBAWsiBA0ACwsgBygCFBogAwwBC0EAIAAoAgRrQQJ0QdjAAGooAgALIgRFDQEgBBAiIQMgBUUEQEEAIQVBASEGQQAMAQsgBRAiQQJqCyEBIAEgA2pBAWoQCSIBRQRAQegSKAIAIQUMAQsgAiAENgIIIAJBrBJBkRIgBhs2AgQgAkGsEiAFIAYbNgIAIAFBqwogAhB2IAAgATYCCCABIQULIAJBoAFqJAAgBQszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQBxogACAAKAIUIAFqNgIUIAILBgBBsIgBCwYAQayIAQsGAEGkiAELBwAgAEEEagsHACAAQQhqCyYBAX8gACgCFCIBBEAgARALCyAAKAIEIQEgAEEEahAxIAAQBiABC6kBAQN/AkAgAC0AACICRQ0AA0AgAS0AACIERQRAIAIhAwwCCwJAIAIgBEYNACACQSByIAIgAkHBAGtBGkkbIAEtAAAiAkEgciACIAJBwQBrQRpJG0YNACAALQAAIQMMAgsgAUEBaiEBIAAtAAEhAiAAQQFqIQAgAg0ACwsgA0H/AXEiAEEgciAAIABBwQBrQRpJGyABLQAAIgBBIHIgACAAQcEAa0EaSRtrC8sGAgJ+An8jAEHgAGsiByQAAkACQAJAAkACQAJAAkACQAJAAkACQCAEDg8AAQoCAwQGBwgICAgICAUICyABQgA3AyAMCQsgACACIAMQESIFQn9XBEAgAUEIaiIBBEAgASAAKAIMNgIAIAEgACgCEDYCBAsMCAsCQCAFUARAIAEpAygiAyABKQMgUg0BIAEgAzcDGCABQQE2AgQgASgCAEUNASAAIAdBKGoQIUF/TARAIAFBCGoiAQRAIAEgACgCDDYCACABIAAoAhA2AgQLDAoLAkAgBykDKCIDQiCDUA0AIAcoAlQgASgCMEYNACABQQhqBEAgAUEANgIMIAFBBzYCCAsMCgsgA0IEg1ANASAHKQNAIAEpAxhRDQEgAUEIagRAIAFBADYCDCABQRU2AggLDAkLIAEoAgQNACABKQMoIgMgASkDICIGVA0AIAUgAyAGfSIDWA0AIAEoAjAhBANAIAECfyAFIAN9IgZC/////w8gBkL/////D1QbIganIQBBACACIAOnaiIIRQ0AGiAEIAggAEHUgAEoAgARAAALIgQ2AjAgASABKQMoIAZ8NwMoIAUgAyAGfCIDVg0ACwsgASABKQMgIAV8NwMgDAgLIAEoAgRFDQcgAiABKQMYIgM3AxggASgCMCEAIAJBADYCMCACIAM3AyAgAiAANgIsIAIgAikDAELsAYQ3AwAMBwsgA0IIWgR+IAIgASgCCDYCACACIAEoAgw2AgRCCAVCfwshBQwGCyABEAYMBQtCfyEFIAApAxgiA0J/VwRAIAFBCGoiAQRAIAEgACgCDDYCACABIAAoAhA2AgQLDAULIAdBfzYCGCAHQo+AgICAAjcDECAHQoyAgIDQATcDCCAHQomAgICgATcDACADQQggBxAkQn+FgyEFDAQLIANCD1gEQCABQQhqBEAgAUEANgIMIAFBEjYCCAsMAwsgAkUNAgJAIAAgAikDACACKAIIEBRBAE4EQCAAEDMiA0J/VQ0BCyABQQhqIgEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwDCyABIAM3AyAMAwsgASkDICEFDAILIAFBCGoEQCABQQA2AgwgAUEcNgIICwtCfyEFCyAHQeAAaiQAIAULjAcCAn4CfyMAQRBrIgckAAJAAkACQAJAAkACQAJAAkACQAJAIAQOEQABAgMFBggICAgICAgIBwgECAsgAUJ/NwMgIAFBADoADyABQQA7AQwgAUIANwMYIAEoAqxAIAEoAqhAKAIMEQEArUIBfSEFDAgLQn8hBSABKAIADQdCACEFIANQDQcgAS0ADQ0HIAFBKGohBAJAA0ACQCAHIAMgBX03AwggASgCrEAgAiAFp2ogB0EIaiABKAKoQCgCHBEAACEIQgAgBykDCCAIQQJGGyAFfCEFAkACQAJAIAhBAWsOAwADAQILIAFBAToADSABKQMgIgNCf1cEQCABBEAgAUEANgIEIAFBFDYCAAsMBQsgAS0ADkUNBCADIAVWDQQgASADNwMYIAFBAToADyACIAQgA6cQBxogASkDGCEFDAwLIAEtAAwNAyAAIARCgMAAEBEiBkJ/VwRAIAEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwECyAGUARAIAFBAToADCABKAKsQCABKAKoQCgCGBEDACABKQMgQn9VDQEgAUIANwMgDAELAkAgASkDIEIAWQRAIAFBADoADgwBCyABIAY3AyALIAEoAqxAIAQgBiABKAKoQCgCFBEPABoLIAMgBVYNAQwCCwsgASgCAA0AIAEEQCABQQA2AgQgAUEUNgIACwsgBVBFBEAgAUEAOgAOIAEgASkDGCAFfDcDGAwIC0J/QgAgASgCABshBQwHCyABKAKsQCABKAKoQCgCEBEBAK1CAX0hBQwGCyABLQAQBEAgAS0ADQRAIAIgAS0ADwR/QQAFQQggASgCFCIAIABBfUsbCzsBMCACIAEpAxg3AyAgAiACKQMAQsgAhDcDAAwHCyACIAIpAwBCt////w+DNwMADAYLIAJBADsBMCACKQMAIQMgAS0ADQRAIAEpAxghBSACIANCxACENwMAIAIgBTcDGEIAIQUMBgsgAiADQrv///8Pg0LAAIQ3AwAMBQsgAS0ADw0EIAEoAqxAIAEoAqhAKAIIEQEArCEFDAQLIANCCFoEfiACIAEoAgA2AgAgAiABKAIENgIEQggFQn8LIQUMAwsgAUUNAiABKAKsQCABKAKoQCgCBBEDACABEDEgARAGDAILIAdBfzYCAEEQIAcQJEI/hCEFDAELIAEEQCABQQA2AgQgAUEUNgIAC0J/IQULIAdBEGokACAFC2MAQcgAEAkiAEUEQEGEhAEoAgAhASACBEAgAiABNgIEIAJBATYCAAsgAA8LIABBADoADCAAQQA6AAQgACACNgIAIABBADYCOCAAQgA3AzAgACABQQkgAUEBa0EJSRs2AgggAAu3fAIefwZ+IAIpAwAhIiAAIAE2AhwgACAiQv////8PICJC/////w9UGz4CICAAQRBqIQECfyAALQAEBEACfyAALQAMQQJ0IQpBfiEEAkACQAJAIAEiBUUNACAFKAIgRQ0AIAUoAiRFDQAgBSgCHCIDRQ0AIAMoAgAgBUcNAAJAAkAgAygCICIGQTlrDjkBAgICAgICAgICAgIBAgICAQICAgICAgICAgICAgICAgICAQICAgICAgICAgICAQICAgICAgICAgEACyAGQZoFRg0AIAZBKkcNAQsgCkEFSw0AAkACQCAFKAIMRQ0AIAUoAgQiAQRAIAUoAgBFDQELIAZBmgVHDQEgCkEERg0BCyAFQeDAACgCADYCGEF+DAQLIAUoAhBFDQEgAygCJCEEIAMgCjYCJAJAIAMoAhAEQCADEDACQCAFKAIQIgYgAygCECIIIAYgCEkbIgFFDQAgBSgCDCADKAIIIAEQBxogBSAFKAIMIAFqNgIMIAMgAygCCCABajYCCCAFIAUoAhQgAWo2AhQgBSAFKAIQIAFrIgY2AhAgAyADKAIQIAFrIgg2AhAgCA0AIAMgAygCBDYCCEEAIQgLIAYEQCADKAIgIQYMAgsMBAsgAQ0AIApBAXRBd0EAIApBBEsbaiAEQQF0QXdBACAEQQRKG2pKDQAgCkEERg0ADAILAkACQAJAAkACQCAGQSpHBEAgBkGaBUcNASAFKAIERQ0DDAcLIAMoAhRFBEAgA0HxADYCIAwCCyADKAI0QQx0QYDwAWshBAJAIAMoAowBQQJODQAgAygCiAEiAUEBTA0AIAFBBUwEQCAEQcAAciEEDAELQYABQcABIAFBBkYbIARyIQQLIAMoAgQgCGogBEEgciAEIAMoAmgbIgFBH3AgAXJBH3NBCHQgAUGA/gNxQQh2cjsAACADIAMoAhBBAmoiATYCECADKAJoBEAgAygCBCABaiAFKAIwIgFBGHQgAUEIdEGAgPwHcXIgAUEIdkGA/gNxIAFBGHZycjYAACADIAMoAhBBBGo2AhALIAVBATYCMCADQfEANgIgIAUQCiADKAIQDQcgAygCICEGCwJAAkACQAJAIAZBOUYEfyADQaABakHkgAEoAgARAQAaIAMgAygCECIBQQFqNgIQIAEgAygCBGpBHzoAACADIAMoAhAiAUEBajYCECABIAMoAgRqQYsBOgAAIAMgAygCECIBQQFqNgIQIAEgAygCBGpBCDoAAAJAIAMoAhwiAUUEQCADKAIEIAMoAhBqQQA2AAAgAyADKAIQIgFBBWo2AhAgASADKAIEakEAOgAEQQIhBCADKAKIASIBQQlHBEBBBCABQQJIQQJ0IAMoAowBQQFKGyEECyADIAMoAhAiAUEBajYCECABIAMoAgRqIAQ6AAAgAyADKAIQIgFBAWo2AhAgASADKAIEakEDOgAAIANB8QA2AiAgBRAKIAMoAhBFDQEMDQsgASgCJCELIAEoAhwhCSABKAIQIQggASgCLCENIAEoAgAhBiADIAMoAhAiAUEBajYCEEECIQQgASADKAIEaiANQQBHQQF0IAZBAEdyIAhBAEdBAnRyIAlBAEdBA3RyIAtBAEdBBHRyOgAAIAMoAgQgAygCEGogAygCHCgCBDYAACADIAMoAhAiDUEEaiIGNgIQIAMoAogBIgFBCUcEQEEEIAFBAkhBAnQgAygCjAFBAUobIQQLIAMgDUEFajYCECADKAIEIAZqIAQ6AAAgAygCHCgCDCEEIAMgAygCECIBQQFqNgIQIAEgAygCBGogBDoAACADKAIcIgEoAhAEfyADKAIEIAMoAhBqIAEoAhQ7AAAgAyADKAIQQQJqNgIQIAMoAhwFIAELKAIsBEAgBQJ/IAUoAjAhBiADKAIQIQRBACADKAIEIgFFDQAaIAYgASAEQdSAASgCABEAAAs2AjALIANBxQA2AiAgA0EANgIYDAILIAMoAiAFIAYLQcUAaw4jAAQEBAEEBAQEBAQEBAQEBAQEBAQEBAIEBAQEBAQEBAQEBAMECyADKAIcIgEoAhAiBgRAIAMoAgwiCCADKAIQIgQgAS8BFCADKAIYIg1rIglqSQRAA0AgAygCBCAEaiAGIA1qIAggBGsiCBAHGiADIAMoAgwiDTYCEAJAIAMoAhwoAixFDQAgBCANTw0AIAUCfyAFKAIwIQZBACADKAIEIARqIgFFDQAaIAYgASANIARrQdSAASgCABEAAAs2AjALIAMgAygCGCAIajYCGCAFKAIcIgYQMAJAIAUoAhAiBCAGKAIQIgEgASAESxsiAUUNACAFKAIMIAYoAgggARAHGiAFIAUoAgwgAWo2AgwgBiAGKAIIIAFqNgIIIAUgBSgCFCABajYCFCAFIAUoAhAgAWs2AhAgBiAGKAIQIAFrIgE2AhAgAQ0AIAYgBigCBDYCCAsgAygCEA0MIAMoAhghDSADKAIcKAIQIQZBACEEIAkgCGsiCSADKAIMIghLDQALCyADKAIEIARqIAYgDWogCRAHGiADIAMoAhAgCWoiDTYCEAJAIAMoAhwoAixFDQAgBCANTw0AIAUCfyAFKAIwIQZBACADKAIEIARqIgFFDQAaIAYgASANIARrQdSAASgCABEAAAs2AjALIANBADYCGAsgA0HJADYCIAsgAygCHCgCHARAIAMoAhAiBCEJA0ACQCAEIAMoAgxHDQACQCADKAIcKAIsRQ0AIAQgCU0NACAFAn8gBSgCMCEGQQAgAygCBCAJaiIBRQ0AGiAGIAEgBCAJa0HUgAEoAgARAAALNgIwCyAFKAIcIgYQMAJAIAUoAhAiBCAGKAIQIgEgASAESxsiAUUNACAFKAIMIAYoAgggARAHGiAFIAUoAgwgAWo2AgwgBiAGKAIIIAFqNgIIIAUgBSgCFCABajYCFCAFIAUoAhAgAWs2AhAgBiAGKAIQIAFrIgE2AhAgAQ0AIAYgBigCBDYCCAtBACEEQQAhCSADKAIQRQ0ADAsLIAMoAhwoAhwhBiADIAMoAhgiAUEBajYCGCABIAZqLQAAIQEgAyAEQQFqNgIQIAMoAgQgBGogAToAACABBEAgAygCECEEDAELCwJAIAMoAhwoAixFDQAgAygCECIGIAlNDQAgBQJ/IAUoAjAhBEEAIAMoAgQgCWoiAUUNABogBCABIAYgCWtB1IABKAIAEQAACzYCMAsgA0EANgIYCyADQdsANgIgCwJAIAMoAhwoAiRFDQAgAygCECIEIQkDQAJAIAQgAygCDEcNAAJAIAMoAhwoAixFDQAgBCAJTQ0AIAUCfyAFKAIwIQZBACADKAIEIAlqIgFFDQAaIAYgASAEIAlrQdSAASgCABEAAAs2AjALIAUoAhwiBhAwAkAgBSgCECIEIAYoAhAiASABIARLGyIBRQ0AIAUoAgwgBigCCCABEAcaIAUgBSgCDCABajYCDCAGIAYoAgggAWo2AgggBSAFKAIUIAFqNgIUIAUgBSgCECABazYCECAGIAYoAhAgAWsiATYCECABDQAgBiAGKAIENgIIC0EAIQRBACEJIAMoAhBFDQAMCgsgAygCHCgCJCEGIAMgAygCGCIBQQFqNgIYIAEgBmotAAAhASADIARBAWo2AhAgAygCBCAEaiABOgAAIAEEQCADKAIQIQQMAQsLIAMoAhwoAixFDQAgAygCECIGIAlNDQAgBQJ/IAUoAjAhBEEAIAMoAgQgCWoiAUUNABogBCABIAYgCWtB1IABKAIAEQAACzYCMAsgA0HnADYCIAsCQCADKAIcKAIsBEAgAygCDCADKAIQIgFBAmpJBH8gBRAKIAMoAhANAkEABSABCyADKAIEaiAFKAIwOwAAIAMgAygCEEECajYCECADQaABakHkgAEoAgARAQAaCyADQfEANgIgIAUQCiADKAIQRQ0BDAcLDAYLIAUoAgQNAQsgAygCPA0AIApFDQEgAygCIEGaBUYNAQsCfyADKAKIASIBRQRAIAMgChCFAQwBCwJAAkACQCADKAKMAUECaw4CAAECCwJ/AkADQAJAAkAgAygCPA0AIAMQLyADKAI8DQAgCg0BQQAMBAsgAygCSCADKAJoai0AACEEIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qQQA6AAAgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtaiAEOgAAIAMgBEECdGoiASABLwHkAUEBajsB5AEgAyADKAI8QQFrNgI8IAMgAygCaEEBaiIBNgJoIAMoAvAtIAMoAvQtRw0BQQAhBCADIAMoAlgiBkEATgR/IAMoAkggBmoFQQALIAEgBmtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEA0BDAILCyADQQA2AoQuIApBBEYEQCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBARAPIAMgAygCaDYCWCADKAIAEApBA0ECIAMoAgAoAhAbDAILIAMoAvAtBEBBACEEIAMgAygCWCIBQQBOBH8gAygCSCABagVBAAsgAygCaCABa0EAEA8gAyADKAJoNgJYIAMoAgAQCiADKAIAKAIQRQ0BC0EBIQQLIAQLDAILAn8CQANAAkACQAJAAkACQCADKAI8Ig1BggJLDQAgAxAvAkAgAygCPCINQYICSw0AIAoNAEEADAgLIA1FDQQgDUECSw0AIAMoAmghCAwBCyADKAJoIghFBEBBACEIDAELIAMoAkggCGoiAUEBayIELQAAIgYgAS0AAEcNACAGIAQtAAJHDQAgBEEDaiEEQQAhCQJAA0AgBiAELQAARw0BIAQtAAEgBkcEQCAJQQFyIQkMAgsgBC0AAiAGRwRAIAlBAnIhCQwCCyAELQADIAZHBEAgCUEDciEJDAILIAQtAAQgBkcEQCAJQQRyIQkMAgsgBC0ABSAGRwRAIAlBBXIhCQwCCyAELQAGIAZHBEAgCUEGciEJDAILIAQtAAcgBkcEQCAJQQdyIQkMAgsgBEEIaiEEIAlB+AFJIQEgCUEIaiEJIAENAAtBgAIhCQtBggIhBCANIAlBAmoiASABIA1LGyIBQYECSw0BIAEiBEECSw0BCyADKAJIIAhqLQAAIQQgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtakEAOgAAIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qIAQ6AAAgAyAEQQJ0aiIBIAEvAeQBQQFqOwHkASADIAMoAjxBAWs2AjwgAyADKAJoQQFqIgQ2AmgMAQsgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtakEBOgAAIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qIARBA2s6AAAgAyADKAKALkEBajYCgC4gBEH9zgBqLQAAQQJ0IANqQegJaiIBIAEvAQBBAWo7AQAgA0GAywAtAABBAnRqQdgTaiIBIAEvAQBBAWo7AQAgAyADKAI8IARrNgI8IAMgAygCaCAEaiIENgJoCyADKALwLSADKAL0LUcNAUEAIQggAyADKAJYIgFBAE4EfyADKAJIIAFqBUEACyAEIAFrQQAQDyADIAMoAmg2AlggAygCABAKIAMoAgAoAhANAQwCCwsgA0EANgKELiAKQQRGBEAgAyADKAJYIgFBAE4EfyADKAJIIAFqBUEACyADKAJoIAFrQQEQDyADIAMoAmg2AlggAygCABAKQQNBAiADKAIAKAIQGwwCCyADKALwLQRAQQAhCCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEEUNAQtBASEICyAICwwBCyADIAogAUEMbEG42ABqKAIAEQIACyIBQX5xQQJGBEAgA0GaBTYCIAsgAUF9cUUEQEEAIQQgBSgCEA0CDAQLIAFBAUcNAAJAAkACQCAKQQFrDgUAAQEBAgELIAMpA5guISICfwJ+IAMoAqAuIgFBA2oiCUE/TQRAQgIgAa2GICKEDAELIAFBwABGBEAgAygCBCADKAIQaiAiNwAAIAMgAygCEEEIajYCEEICISJBCgwCCyADKAIEIAMoAhBqQgIgAa2GICKENwAAIAMgAygCEEEIajYCECABQT1rIQlCAkHAACABa62ICyEiIAlBB2ogCUE5SQ0AGiADKAIEIAMoAhBqICI3AAAgAyADKAIQQQhqNgIQQgAhIiAJQTlrCyEBIAMgIjcDmC4gAyABNgKgLiADEDAMAQsgA0EAQQBBABA5IApBA0cNACADKAJQQQBBgIAIEBkgAygCPA0AIANBADYChC4gA0EANgJYIANBADYCaAsgBRAKIAUoAhANAAwDC0EAIQQgCkEERw0AAkACfwJAAkAgAygCFEEBaw4CAQADCyAFIANBoAFqQeCAASgCABEBACIBNgIwIAMoAgQgAygCEGogATYAACADIAMoAhBBBGoiATYCECADKAIEIAFqIQQgBSgCCAwBCyADKAIEIAMoAhBqIQQgBSgCMCIBQRh0IAFBCHRBgID8B3FyIAFBCHZBgP4DcSABQRh2cnILIQEgBCABNgAAIAMgAygCEEEEajYCEAsgBRAKIAMoAhQiAUEBTgRAIANBACABazYCFAsgAygCEEUhBAsgBAwCCyAFQezAACgCADYCGEF7DAELIANBfzYCJEEACwwBCyMAQRBrIhQkAEF+IRcCQCABIgxFDQAgDCgCIEUNACAMKAIkRQ0AIAwoAhwiB0UNACAHKAIAIAxHDQAgBygCBCIIQbT+AGtBH0sNACAMKAIMIhBFDQAgDCgCACIBRQRAIAwoAgQNAQsgCEG//gBGBEAgB0HA/gA2AgRBwP4AIQgLIAdBpAFqIR8gB0G8BmohGSAHQbwBaiEcIAdBoAFqIR0gB0G4AWohGiAHQfwKaiEYIAdBQGshHiAHKAKIASEFIAwoAgQiICEGIAcoAoQBIQogDCgCECIPIRYCfwJAAkACQANAAkBBfSEEQQEhCQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAhBtP4Aaw4fBwYICQolJicoBSwtLQsZGgQMAjIzATUANw0OAzlISUwLIAcoApQBIQMgASEEIAYhCAw1CyAHKAKUASEDIAEhBCAGIQgMMgsgBygCtAEhCAwuCyAHKAIMIQgMQQsgBUEOTw0pIAZFDUEgBUEIaiEIIAFBAWohBCAGQQFrIQkgAS0AACAFdCAKaiEKIAVBBkkNDCAEIQEgCSEGIAghBQwpCyAFQSBPDSUgBkUNQCABQQFqIQQgBkEBayEIIAEtAAAgBXQgCmohCiAFQRhJDQ0gBCEBIAghBgwlCyAFQRBPDRUgBkUNPyAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEISQ0NIAQhASAJIQYgCCEFDBULIAcoAgwiC0UNByAFQRBPDSIgBkUNPiAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEISQ0NIAQhASAJIQYgCCEFDCILIAVBH0sNFQwUCyAFQQ9LDRYMFQsgBygCFCIEQYAIcUUEQCAFIQgMFwsgCiEIIAVBD0sNGAwXCyAKIAVBB3F2IQogBUF4cSIFQR9LDQwgBkUNOiAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEYSQ0GIAQhASAJIQYgCCEFDAwLIAcoArQBIgggBygCqAEiC08NIwwiCyAPRQ0qIBAgBygCjAE6AAAgB0HI/gA2AgQgD0EBayEPIBBBAWohECAHKAIEIQgMOQsgBygCDCIDRQRAQQAhCAwJCyAFQR9LDQcgBkUNNyAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEYSQ0BIAQhASAJIQYgCCEFDAcLIAdBwP4ANgIEDCoLIAlFBEAgBCEBQQAhBiAIIQUgDSEEDDgLIAVBEGohCSABQQJqIQQgBkECayELIAEtAAEgCHQgCmohCiAFQQ9LBEAgBCEBIAshBiAJIQUMBgsgC0UEQCAEIQFBACEGIAkhBSANIQQMOAsgBUEYaiEIIAFBA2ohBCAGQQNrIQsgAS0AAiAJdCAKaiEKIAVBB0sEQCAEIQEgCyEGIAghBQwGCyALRQRAIAQhAUEAIQYgCCEFIA0hBAw4CyAFQSBqIQUgBkEEayEGIAEtAAMgCHQgCmohCiABQQRqIQEMBQsgCUUEQCAEIQFBACEGIAghBSANIQQMNwsgBUEQaiEFIAZBAmshBiABLQABIAh0IApqIQogAUECaiEBDBwLIAlFBEAgBCEBQQAhBiAIIQUgDSEEDDYLIAVBEGohCSABQQJqIQQgBkECayELIAEtAAEgCHQgCmohCiAFQQ9LBEAgBCEBIAshBiAJIQUMBgsgC0UEQCAEIQFBACEGIAkhBSANIQQMNgsgBUEYaiEIIAFBA2ohBCAGQQNrIQsgAS0AAiAJdCAKaiEKIAUEQCAEIQEgCyEGIAghBQwGCyALRQRAIAQhAUEAIQYgCCEFIA0hBAw2CyAFQSBqIQUgBkEEayEGIAEtAAMgCHQgCmohCiABQQRqIQEMBQsgBUEIaiEJIAhFBEAgBCEBQQAhBiAJIQUgDSEEDDULIAFBAmohBCAGQQJrIQggAS0AASAJdCAKaiEKIAVBD0sEQCAEIQEgCCEGDBgLIAVBEGohCSAIRQRAIAQhAUEAIQYgCSEFIA0hBAw1CyABQQNqIQQgBkEDayEIIAEtAAIgCXQgCmohCiAFQQdLBEAgBCEBIAghBgwYCyAFQRhqIQUgCEUEQCAEIQFBACEGIA0hBAw1CyAGQQRrIQYgAS0AAyAFdCAKaiEKIAFBBGohAQwXCyAJDQYgBCEBQQAhBiAIIQUgDSEEDDMLIAlFBEAgBCEBQQAhBiAIIQUgDSEEDDMLIAVBEGohBSAGQQJrIQYgAS0AASAIdCAKaiEKIAFBAmohAQwUCyAMIBYgD2siCSAMKAIUajYCFCAHIAcoAiAgCWo2AiACQCADQQRxRQ0AIAkEQAJAIBAgCWshBCAMKAIcIggoAhQEQCAIQUBrIAQgCUEAQdiAASgCABEIAAwBCyAIIAgoAhwgBCAJQcCAASgCABEAACIENgIcIAwgBDYCMAsLIAcoAhRFDQAgByAeQeCAASgCABEBACIENgIcIAwgBDYCMAsCQCAHKAIMIghBBHFFDQAgBygCHCAKIApBCHRBgID8B3EgCkEYdHIgCkEIdkGA/gNxIApBGHZyciAHKAIUG0YNACAHQdH+ADYCBCAMQaQMNgIYIA8hFiAHKAIEIQgMMQtBACEKQQAhBSAPIRYLIAdBz/4ANgIEDC0LIApB//8DcSIEIApBf3NBEHZHBEAgB0HR/gA2AgQgDEGOCjYCGCAHKAIEIQgMLwsgB0HC/gA2AgQgByAENgKMAUEAIQpBACEFCyAHQcP+ADYCBAsgBygCjAEiBARAIA8gBiAEIAQgBksbIgQgBCAPSxsiCEUNHiAQIAEgCBAHIQQgByAHKAKMASAIazYCjAEgBCAIaiEQIA8gCGshDyABIAhqIQEgBiAIayEGIAcoAgQhCAwtCyAHQb/+ADYCBCAHKAIEIQgMLAsgBUEQaiEFIAZBAmshBiABLQABIAh0IApqIQogAUECaiEBCyAHIAo2AhQgCkH/AXFBCEcEQCAHQdH+ADYCBCAMQYIPNgIYIAcoAgQhCAwrCyAKQYDAA3EEQCAHQdH+ADYCBCAMQY0JNgIYIAcoAgQhCAwrCyAHKAIkIgQEQCAEIApBCHZBAXE2AgALAkAgCkGABHFFDQAgBy0ADEEEcUUNACAUIAo7AAwgBwJ/IAcoAhwhBUEAIBRBDGoiBEUNABogBSAEQQJB1IABKAIAEQAACzYCHAsgB0G2/gA2AgRBACEFQQAhCgsgBkUNKCABQQFqIQQgBkEBayEIIAEtAAAgBXQgCmohCiAFQRhPBEAgBCEBIAghBgwBCyAFQQhqIQkgCEUEQCAEIQFBACEGIAkhBSANIQQMKwsgAUECaiEEIAZBAmshCCABLQABIAl0IApqIQogBUEPSwRAIAQhASAIIQYMAQsgBUEQaiEJIAhFBEAgBCEBQQAhBiAJIQUgDSEEDCsLIAFBA2ohBCAGQQNrIQggAS0AAiAJdCAKaiEKIAVBB0sEQCAEIQEgCCEGDAELIAVBGGohBSAIRQRAIAQhAUEAIQYgDSEEDCsLIAZBBGshBiABLQADIAV0IApqIQogAUEEaiEBCyAHKAIkIgQEQCAEIAo2AgQLAkAgBy0AFUECcUUNACAHLQAMQQRxRQ0AIBQgCjYADCAHAn8gBygCHCEFQQAgFEEMaiIERQ0AGiAFIARBBEHUgAEoAgARAAALNgIcCyAHQbf+ADYCBEEAIQVBACEKCyAGRQ0mIAFBAWohBCAGQQFrIQggAS0AACAFdCAKaiEKIAVBCE8EQCAEIQEgCCEGDAELIAVBCGohBSAIRQRAIAQhAUEAIQYgDSEEDCkLIAZBAmshBiABLQABIAV0IApqIQogAUECaiEBCyAHKAIkIgQEQCAEIApBCHY2AgwgBCAKQf8BcTYCCAsCQCAHLQAVQQJxRQ0AIActAAxBBHFFDQAgFCAKOwAMIAcCfyAHKAIcIQVBACAUQQxqIgRFDQAaIAUgBEECQdSAASgCABEAAAs2AhwLIAdBuP4ANgIEQQAhCEEAIQVBACEKIAcoAhQiBEGACHENAQsgBygCJCIEBEAgBEEANgIQCyAIIQUMAgsgBkUEQEEAIQYgCCEKIA0hBAwmCyABQQFqIQkgBkEBayELIAEtAAAgBXQgCGohCiAFQQhPBEAgCSEBIAshBgwBCyAFQQhqIQUgC0UEQCAJIQFBACEGIA0hBAwmCyAGQQJrIQYgAS0AASAFdCAKaiEKIAFBAmohAQsgByAKQf//A3EiCDYCjAEgBygCJCIFBEAgBSAINgIUC0EAIQUCQCAEQYAEcUUNACAHLQAMQQRxRQ0AIBQgCjsADCAHAn8gBygCHCEIQQAgFEEMaiIERQ0AGiAIIARBAkHUgAEoAgARAAALNgIcC0EAIQoLIAdBuf4ANgIECyAHKAIUIglBgAhxBEAgBiAHKAKMASIIIAYgCEkbIg4EQAJAIAcoAiQiA0UNACADKAIQIgRFDQAgAygCGCILIAMoAhQgCGsiCE0NACAEIAhqIAEgCyAIayAOIAggDmogC0sbEAcaIAcoAhQhCQsCQCAJQYAEcUUNACAHLQAMQQRxRQ0AIAcCfyAHKAIcIQRBACABRQ0AGiAEIAEgDkHUgAEoAgARAAALNgIcCyAHIAcoAowBIA5rIgg2AowBIAYgDmshBiABIA5qIQELIAgNEwsgB0G6/gA2AgQgB0EANgKMAQsCQCAHLQAVQQhxBEBBACEIIAZFDQQDQCABIAhqLQAAIQMCQCAHKAIkIgtFDQAgCygCHCIERQ0AIAcoAowBIgkgCygCIE8NACAHIAlBAWo2AowBIAQgCWogAzoAAAsgA0EAIAYgCEEBaiIISxsNAAsCQCAHLQAVQQJxRQ0AIActAAxBBHFFDQAgBwJ/IAcoAhwhBEEAIAFFDQAaIAQgASAIQdSAASgCABEAAAs2AhwLIAEgCGohASAGIAhrIQYgA0UNAQwTCyAHKAIkIgRFDQAgBEEANgIcCyAHQbv+ADYCBCAHQQA2AowBCwJAIActABVBEHEEQEEAIQggBkUNAwNAIAEgCGotAAAhAwJAIAcoAiQiC0UNACALKAIkIgRFDQAgBygCjAEiCSALKAIoTw0AIAcgCUEBajYCjAEgBCAJaiADOgAACyADQQAgBiAIQQFqIghLGw0ACwJAIActABVBAnFFDQAgBy0ADEEEcUUNACAHAn8gBygCHCEEQQAgAUUNABogBCABIAhB1IABKAIAEQAACzYCHAsgASAIaiEBIAYgCGshBiADRQ0BDBILIAcoAiQiBEUNACAEQQA2AiQLIAdBvP4ANgIECyAHKAIUIgtBgARxBEACQCAFQQ9LDQAgBkUNHyAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEITwRAIAQhASAJIQYgCCEFDAELIAlFBEAgBCEBQQAhBiAIIQUgDSEEDCILIAVBEGohBSAGQQJrIQYgAS0AASAIdCAKaiEKIAFBAmohAQsCQCAHLQAMQQRxRQ0AIAogBy8BHEYNACAHQdH+ADYCBCAMQdcMNgIYIAcoAgQhCAwgC0EAIQpBACEFCyAHKAIkIgQEQCAEQQE2AjAgBCALQQl2QQFxNgIsCwJAIActAAxBBHFFDQAgC0UNACAHIB5B5IABKAIAEQEAIgQ2AhwgDCAENgIwCyAHQb/+ADYCBCAHKAIEIQgMHgtBACEGDA4LAkAgC0ECcUUNACAKQZ+WAkcNACAHKAIoRQRAIAdBDzYCKAtBACEKIAdBADYCHCAUQZ+WAjsADCAHIBRBDGoiBAR/QQAgBEECQdSAASgCABEAAAVBAAs2AhwgB0G1/gA2AgRBACEFIAcoAgQhCAwdCyAHKAIkIgQEQCAEQX82AjALAkAgC0EBcQRAIApBCHRBgP4DcSAKQQh2akEfcEUNAQsgB0HR/gA2AgQgDEH2CzYCGCAHKAIEIQgMHQsgCkEPcUEIRwRAIAdB0f4ANgIEIAxBgg82AhggBygCBCEIDB0LIApBBHYiBEEPcSIJQQhqIQsgCUEHTUEAIAcoAigiCAR/IAgFIAcgCzYCKCALCyALTxtFBEAgBUEEayEFIAdB0f4ANgIEIAxB+gw2AhggBCEKIAcoAgQhCAwdCyAHQQE2AhxBACEFIAdBADYCFCAHQYACIAl0NgIYIAxBATYCMCAHQb3+AEG//gAgCkGAwABxGzYCBEEAIQogBygCBCEIDBwLIAcgCkEIdEGAgPwHcSAKQRh0ciAKQQh2QYD+A3EgCkEYdnJyIgQ2AhwgDCAENgIwIAdBvv4ANgIEQQAhCkEAIQULIAcoAhBFBEAgDCAPNgIQIAwgEDYCDCAMIAY2AgQgDCABNgIAIAcgBTYCiAEgByAKNgKEAUECIRcMIAsgB0EBNgIcIAxBATYCMCAHQb/+ADYCBAsCfwJAIAcoAghFBEAgBUEDSQ0BIAUMAgsgB0HO/gA2AgQgCiAFQQdxdiEKIAVBeHEhBSAHKAIEIQgMGwsgBkUNGSAGQQFrIQYgAS0AACAFdCAKaiEKIAFBAWohASAFQQhqCyEEIAcgCkEBcTYCCAJAAkACQAJAAkAgCkEBdkEDcUEBaw4DAQIDAAsgB0HB/gA2AgQMAwsgB0Gw2wA2ApgBIAdCiYCAgNAANwOgASAHQbDrADYCnAEgB0HH/gA2AgQMAgsgB0HE/gA2AgQMAQsgB0HR/gA2AgQgDEHXDTYCGAsgBEEDayEFIApBA3YhCiAHKAIEIQgMGQsgByAKQR9xIghBgQJqNgKsASAHIApBBXZBH3EiBEEBajYCsAEgByAKQQp2QQ9xQQRqIgs2AqgBIAVBDmshBSAKQQ52IQogCEEdTUEAIARBHkkbRQRAIAdB0f4ANgIEIAxB6gk2AhggBygCBCEIDBkLIAdBxf4ANgIEQQAhCCAHQQA2ArQBCyAIIQQDQCAFQQJNBEAgBkUNGCAGQQFrIQYgAS0AACAFdCAKaiEKIAVBCGohBSABQQFqIQELIAcgBEEBaiIINgK0ASAHIARBAXRBsOwAai8BAEEBdGogCkEHcTsBvAEgBUEDayEFIApBA3YhCiALIAgiBEsNAAsLIAhBEk0EQEESIAhrIQ1BAyAIa0EDcSIEBEADQCAHIAhBAXRBsOwAai8BAEEBdGpBADsBvAEgCEEBaiEIIARBAWsiBA0ACwsgDUEDTwRAA0AgB0G8AWoiDSAIQQF0IgRBsOwAai8BAEEBdGpBADsBACANIARBsuwAai8BAEEBdGpBADsBACANIARBtOwAai8BAEEBdGpBADsBACANIARBtuwAai8BAEEBdGpBADsBACAIQQRqIghBE0cNAAsLIAdBEzYCtAELIAdBBzYCoAEgByAYNgKYASAHIBg2ArgBQQAhCEEAIBxBEyAaIB0gGRBOIg0EQCAHQdH+ADYCBCAMQfQINgIYIAcoAgQhCAwXCyAHQcb+ADYCBCAHQQA2ArQBQQAhDQsgBygCrAEiFSAHKAKwAWoiESAISwRAQX8gBygCoAF0QX9zIRIgBygCmAEhGwNAIAYhCSABIQsCQCAFIgMgGyAKIBJxIhNBAnRqLQABIg5PBEAgBSEEDAELA0AgCUUNDSALLQAAIAN0IQ4gC0EBaiELIAlBAWshCSADQQhqIgQhAyAEIBsgCiAOaiIKIBJxIhNBAnRqLQABIg5JDQALIAshASAJIQYLAkAgGyATQQJ0ai8BAiIFQQ9NBEAgByAIQQFqIgk2ArQBIAcgCEEBdGogBTsBvAEgBCAOayEFIAogDnYhCiAJIQgMAQsCfwJ/AkACQAJAIAVBEGsOAgABAgsgDkECaiIFIARLBEADQCAGRQ0bIAZBAWshBiABLQAAIAR0IApqIQogAUEBaiEBIARBCGoiBCAFSQ0ACwsgBCAOayEFIAogDnYhBCAIRQRAIAdB0f4ANgIEIAxBvAk2AhggBCEKIAcoAgQhCAwdCyAFQQJrIQUgBEECdiEKIARBA3FBA2ohCSAIQQF0IAdqLwG6AQwDCyAOQQNqIgUgBEsEQANAIAZFDRogBkEBayEGIAEtAAAgBHQgCmohCiABQQFqIQEgBEEIaiIEIAVJDQALCyAEIA5rQQNrIQUgCiAOdiIEQQN2IQogBEEHcUEDagwBCyAOQQdqIgUgBEsEQANAIAZFDRkgBkEBayEGIAEtAAAgBHQgCmohCiABQQFqIQEgBEEIaiIEIAVJDQALCyAEIA5rQQdrIQUgCiAOdiIEQQd2IQogBEH/AHFBC2oLIQlBAAshAyAIIAlqIBFLDRMgCUEBayEEIAlBA3EiCwRAA0AgByAIQQF0aiADOwG8ASAIQQFqIQggCUEBayEJIAtBAWsiCw0ACwsgBEEDTwRAA0AgByAIQQF0aiIEIAM7Ab4BIAQgAzsBvAEgBCADOwHAASAEIAM7AcIBIAhBBGohCCAJQQRrIgkNAAsLIAcgCDYCtAELIAggEUkNAAsLIAcvAbwFRQRAIAdB0f4ANgIEIAxB0Qs2AhggBygCBCEIDBYLIAdBCjYCoAEgByAYNgKYASAHIBg2ArgBQQEgHCAVIBogHSAZEE4iDQRAIAdB0f4ANgIEIAxB2Ag2AhggBygCBCEIDBYLIAdBCTYCpAEgByAHKAK4ATYCnAFBAiAHIAcoAqwBQQF0akG8AWogBygCsAEgGiAfIBkQTiINBEAgB0HR/gA2AgQgDEGmCTYCGCAHKAIEIQgMFgsgB0HH/gA2AgRBACENCyAHQcj+ADYCBAsCQCAGQQ9JDQAgD0GEAkkNACAMIA82AhAgDCAQNgIMIAwgBjYCBCAMIAE2AgAgByAFNgKIASAHIAo2AoQBIAwgFkHogAEoAgARBwAgBygCiAEhBSAHKAKEASEKIAwoAgQhBiAMKAIAIQEgDCgCECEPIAwoAgwhECAHKAIEQb/+AEcNByAHQX82ApBHIAcoAgQhCAwUCyAHQQA2ApBHIAUhCSAGIQggASEEAkAgBygCmAEiEiAKQX8gBygCoAF0QX9zIhVxIg5BAnRqLQABIgsgBU0EQCAFIQMMAQsDQCAIRQ0PIAQtAAAgCXQhCyAEQQFqIQQgCEEBayEIIAlBCGoiAyEJIAMgEiAKIAtqIgogFXEiDkECdGotAAEiC0kNAAsLIBIgDkECdGoiAS8BAiETAkBBACABLQAAIhEgEUHwAXEbRQRAIAshBgwBCyAIIQYgBCEBAkAgAyIFIAsgEiAKQX8gCyARanRBf3MiFXEgC3YgE2oiEUECdGotAAEiDmpPBEAgAyEJDAELA0AgBkUNDyABLQAAIAV0IQ4gAUEBaiEBIAZBAWshBiAFQQhqIgkhBSALIBIgCiAOaiIKIBVxIAt2IBNqIhFBAnRqLQABIg5qIAlLDQALIAEhBCAGIQgLIBIgEUECdGoiAS0AACERIAEvAQIhEyAHIAs2ApBHIAsgDmohBiAJIAtrIQMgCiALdiEKIA4hCwsgByAGNgKQRyAHIBNB//8DcTYCjAEgAyALayEFIAogC3YhCiARRQRAIAdBzf4ANgIEDBALIBFBIHEEQCAHQb/+ADYCBCAHQX82ApBHDBALIBFBwABxBEAgB0HR/gA2AgQgDEHQDjYCGAwQCyAHQcn+ADYCBCAHIBFBD3EiAzYClAELAkAgA0UEQCAHKAKMASELIAQhASAIIQYMAQsgBSEJIAghBiAEIQsCQCADIAVNBEAgBCEBDAELA0AgBkUNDSAGQQFrIQYgCy0AACAJdCAKaiEKIAtBAWoiASELIAlBCGoiCSADSQ0ACwsgByAHKAKQRyADajYCkEcgByAHKAKMASAKQX8gA3RBf3NxaiILNgKMASAJIANrIQUgCiADdiEKCyAHQcr+ADYCBCAHIAs2ApRHCyAFIQkgBiEIIAEhBAJAIAcoApwBIhIgCkF/IAcoAqQBdEF/cyIVcSIOQQJ0ai0AASIDIAVNBEAgBSELDAELA0AgCEUNCiAELQAAIAl0IQMgBEEBaiEEIAhBAWshCCAJQQhqIgshCSALIBIgAyAKaiIKIBVxIg5BAnRqLQABIgNJDQALCyASIA5BAnRqIgEvAQIhEwJAIAEtAAAiEUHwAXEEQCAHKAKQRyEGIAMhCQwBCyAIIQYgBCEBAkAgCyIFIAMgEiAKQX8gAyARanRBf3MiFXEgA3YgE2oiEUECdGotAAEiCWpPBEAgCyEODAELA0AgBkUNCiABLQAAIAV0IQkgAUEBaiEBIAZBAWshBiAFQQhqIg4hBSADIBIgCSAKaiIKIBVxIAN2IBNqIhFBAnRqLQABIglqIA5LDQALIAEhBCAGIQgLIBIgEUECdGoiAS0AACERIAEvAQIhEyAHIAcoApBHIANqIgY2ApBHIA4gA2shCyAKIAN2IQoLIAcgBiAJajYCkEcgCyAJayEFIAogCXYhCiARQcAAcQRAIAdB0f4ANgIEIAxB7A42AhggBCEBIAghBiAHKAIEIQgMEgsgB0HL/gA2AgQgByARQQ9xIgM2ApQBIAcgE0H//wNxNgKQAQsCQCADRQRAIAQhASAIIQYMAQsgBSEJIAghBiAEIQsCQCADIAVNBEAgBCEBDAELA0AgBkUNCCAGQQFrIQYgCy0AACAJdCAKaiEKIAtBAWoiASELIAlBCGoiCSADSQ0ACwsgByAHKAKQRyADajYCkEcgByAHKAKQASAKQX8gA3RBf3NxajYCkAEgCSADayEFIAogA3YhCgsgB0HM/gA2AgQLIA9FDQACfyAHKAKQASIIIBYgD2siBEsEQAJAIAggBGsiCCAHKAIwTQ0AIAcoAoxHRQ0AIAdB0f4ANgIEIAxBuQw2AhggBygCBCEIDBILAn8CQAJ/IAcoAjQiBCAISQRAIAcoAjggBygCLCAIIARrIghragwBCyAHKAI4IAQgCGtqCyILIBAgDyAQaiAQa0EBaqwiISAPIAcoAowBIgQgCCAEIAhJGyIEIAQgD0sbIgitIiIgISAiVBsiIqciCWoiBEkgCyAQT3ENACALIBBNIAkgC2ogEEtxDQAgECALIAkQBxogBAwBCyAQIAsgCyAQayIEIARBH3UiBGogBHMiCRAHIAlqIQQgIiAJrSIkfSIjUEUEQCAJIAtqIQkDQAJAICMgJCAjICRUGyIiQiBUBEAgIiEhDAELICIiIUIgfSImQgWIQgF8QgODIiVQRQRAA0AgBCAJKQAANwAAIAQgCSkAGDcAGCAEIAkpABA3ABAgBCAJKQAINwAIICFCIH0hISAJQSBqIQkgBEEgaiEEICVCAX0iJUIAUg0ACwsgJkLgAFQNAANAIAQgCSkAADcAACAEIAkpABg3ABggBCAJKQAQNwAQIAQgCSkACDcACCAEIAkpADg3ADggBCAJKQAwNwAwIAQgCSkAKDcAKCAEIAkpACA3ACAgBCAJKQBYNwBYIAQgCSkAUDcAUCAEIAkpAEg3AEggBCAJKQBANwBAIAQgCSkAYDcAYCAEIAkpAGg3AGggBCAJKQBwNwBwIAQgCSkAeDcAeCAJQYABaiEJIARBgAFqIQQgIUKAAX0iIUIfVg0ACwsgIUIQWgRAIAQgCSkAADcAACAEIAkpAAg3AAggIUIQfSEhIAlBEGohCSAEQRBqIQQLICFCCFoEQCAEIAkpAAA3AAAgIUIIfSEhIAlBCGohCSAEQQhqIQQLICFCBFoEQCAEIAkoAAA2AAAgIUIEfSEhIAlBBGohCSAEQQRqIQQLICFCAloEQCAEIAkvAAA7AAAgIUICfSEhIAlBAmohCSAEQQJqIQQLICMgIn0hIyAhUEUEQCAEIAktAAA6AAAgCUEBaiEJIARBAWohBAsgI0IAUg0ACwsgBAsMAQsgECAIIA8gBygCjAEiBCAEIA9LGyIIIA9ByIABKAIAEQQACyEQIAcgBygCjAEgCGsiBDYCjAEgDyAIayEPIAQNAiAHQcj+ADYCBCAHKAIEIQgMDwsgDSEJCyAJIQQMDgsgBygCBCEIDAwLIAEgBmohASAFIAZBA3RqIQUMCgsgBCAIaiEBIAUgCEEDdGohBQwJCyAEIAhqIQEgCyAIQQN0aiEFDAgLIAEgBmohASAFIAZBA3RqIQUMBwsgBCAIaiEBIAUgCEEDdGohBQwGCyAEIAhqIQEgAyAIQQN0aiEFDAULIAEgBmohASAFIAZBA3RqIQUMBAsgB0HR/gA2AgQgDEG8CTYCGCAHKAIEIQgMBAsgBCEBIAghBiAHKAIEIQgMAwtBACEGIAQhBSANIQQMAwsCQAJAIAhFBEAgCiEJDAELIAcoAhRFBEAgCiEJDAELAkAgBUEfSw0AIAZFDQMgBUEIaiEJIAFBAWohBCAGQQFrIQsgAS0AACAFdCAKaiEKIAVBGE8EQCAEIQEgCyEGIAkhBQwBCyALRQRAIAQhAUEAIQYgCSEFIA0hBAwGCyAFQRBqIQsgAUECaiEEIAZBAmshAyABLQABIAl0IApqIQogBUEPSwRAIAQhASADIQYgCyEFDAELIANFBEAgBCEBQQAhBiALIQUgDSEEDAYLIAVBGGohCSABQQNqIQQgBkEDayEDIAEtAAIgC3QgCmohCiAFQQdLBEAgBCEBIAMhBiAJIQUMAQsgA0UEQCAEIQFBACEGIAkhBSANIQQMBgsgBUEgaiEFIAZBBGshBiABLQADIAl0IApqIQogAUEEaiEBC0EAIQkgCEEEcQRAIAogBygCIEcNAgtBACEFCyAHQdD+ADYCBEEBIQQgCSEKDAMLIAdB0f4ANgIEIAxBjQw2AhggBygCBCEIDAELC0EAIQYgDSEECyAMIA82AhAgDCAQNgIMIAwgBjYCBCAMIAE2AgAgByAFNgKIASAHIAo2AoQBAkAgBygCLA0AIA8gFkYNAiAHKAIEIgFB0P4ASw0CIAFBzv4ASQ0ACwJ/IBYgD2shCiAHKAIMQQRxIQkCQAJAAkAgDCgCHCIDKAI4Ig1FBEBBASEIIAMgAygCACIBKAIgIAEoAiggAygCmEdBASADKAIodGpBARAoIg02AjggDUUNAQsgAygCLCIGRQRAIANCADcDMCADQQEgAygCKHQiBjYCLAsgBiAKTQRAAkAgCQRAAkAgBiAKTw0AIAogBmshBSAQIAprIQEgDCgCHCIGKAIUBEAgBkFAayABIAVBAEHYgAEoAgARCAAMAQsgBiAGKAIcIAEgBUHAgAEoAgARAAAiATYCHCAMIAE2AjALIAMoAiwiDUUNASAQIA1rIQUgAygCOCEBIAwoAhwiBigCFARAIAZBQGsgASAFIA1B3IABKAIAEQgADAILIAYgBigCHCABIAUgDUHEgAEoAgARBAAiATYCHCAMIAE2AjAMAQsgDSAQIAZrIAYQBxoLIANBADYCNCADIAMoAiw2AjBBAAwECyAKIAYgAygCNCIFayIBIAEgCksbIQsgECAKayEGIAUgDWohBQJAIAkEQAJAIAtFDQAgDCgCHCIBKAIUBEAgAUFAayAFIAYgC0HcgAEoAgARCAAMAQsgASABKAIcIAUgBiALQcSAASgCABEEACIBNgIcIAwgATYCMAsgCiALayIFRQ0BIBAgBWshBiADKAI4IQEgDCgCHCINKAIUBEAgDUFAayABIAYgBUHcgAEoAgARCAAMBQsgDSANKAIcIAEgBiAFQcSAASgCABEEACIBNgIcIAwgATYCMAwECyAFIAYgCxAHGiAKIAtrIgUNAgtBACEIIANBACADKAI0IAtqIgUgBSADKAIsIgFGGzYCNCABIAMoAjAiAU0NACADIAEgC2o2AjALIAgMAgsgAygCOCAQIAVrIAUQBxoLIAMgBTYCNCADIAMoAiw2AjBBAAtFBEAgDCgCECEPIAwoAgQhFyAHKAKIAQwDCyAHQdL+ADYCBAtBfCEXDAILIAYhFyAFCyEFIAwgICAXayIBIAwoAghqNgIIIAwgFiAPayIGIAwoAhRqNgIUIAcgBygCICAGajYCICAMIAcoAghBAEdBBnQgBWogBygCBCIFQb/+AEZBB3RqQYACIAVBwv4ARkEIdCAFQcf+AEYbajYCLCAEIARBeyAEGyABIAZyGyEXCyAUQRBqJAAgFwshASACIAIpAwAgADUCIH03AwACQAJAAkACQCABQQVqDgcBAgICAgMAAgtBAQ8LIAAoAhQNAEEDDwsgACgCACIABEAgACABNgIEIABBDTYCAAtBAiEBCyABCwkAIABBAToADAtEAAJAIAJC/////w9YBEAgACgCFEUNAQsgACgCACIABEAgAEEANgIEIABBEjYCAAtBAA8LIAAgATYCECAAIAI+AhRBAQu5AQEEfyAAQRBqIQECfyAALQAEBEAgARCEAQwBC0F+IQMCQCABRQ0AIAEoAiBFDQAgASgCJCIERQ0AIAEoAhwiAkUNACACKAIAIAFHDQAgAigCBEG0/gBrQR9LDQAgAigCOCIDBEAgBCABKAIoIAMQHiABKAIkIQQgASgCHCECCyAEIAEoAiggAhAeQQAhAyABQQA2AhwLIAMLIgEEQCAAKAIAIgAEQCAAIAE2AgQgAEENNgIACwsgAUUL0gwBBn8gAEIANwIQIABCADcCHCAAQRBqIQICfyAALQAEBEAgACgCCCEBQesMLQAAQTFGBH8Cf0F+IQMCQCACRQ0AIAJBADYCGCACKAIgIgRFBEAgAkEANgIoIAJBJzYCIEEnIQQLIAIoAiRFBEAgAkEoNgIkC0EGIAEgAUF/RhsiBUEASA0AIAVBCUoNAEF8IQMgBCACKAIoQQFB0C4QKCIBRQ0AIAIgATYCHCABIAI2AgAgAUEPNgI0IAFCgICAgKAFNwIcIAFBADYCFCABQYCAAjYCMCABQf//ATYCOCABIAIoAiAgAigCKEGAgAJBAhAoNgJIIAEgAigCICACKAIoIAEoAjBBAhAoIgM2AkwgA0EAIAEoAjBBAXQQGSACKAIgIAIoAihBgIAEQQIQKCEDIAFBgIACNgLoLSABQQA2AkAgASADNgJQIAEgAigCICACKAIoQYCAAkEEECgiAzYCBCABIAEoAugtIgRBAnQ2AgwCQAJAIAEoAkhFDQAgASgCTEUNACABKAJQRQ0AIAMNAQsgAUGaBTYCICACQejAACgCADYCGCACEIQBGkF8DAILIAFBADYCjAEgASAFNgKIASABQgA3AyggASADIARqNgLsLSABIARBA2xBA2s2AvQtQX4hAwJAIAJFDQAgAigCIEUNACACKAIkRQ0AIAIoAhwiAUUNACABKAIAIAJHDQACQAJAIAEoAiAiBEE5aw45AQICAgICAgICAgICAQICAgECAgICAgICAgICAgICAgICAgECAgICAgICAgICAgECAgICAgICAgIBAAsgBEGaBUYNACAEQSpHDQELIAJBAjYCLCACQQA2AgggAkIANwIUIAFBADYCECABIAEoAgQ2AgggASgCFCIDQX9MBEAgAUEAIANrIgM2AhQLIAFBOUEqIANBAkYbNgIgIAIgA0ECRgR/IAFBoAFqQeSAASgCABEBAAVBAQs2AjAgAUF+NgIkIAFBADYCoC4gAUIANwOYLiABQYgXakGg0wA2AgAgASABQcwVajYCgBcgAUH8FmpBjNMANgIAIAEgAUHYE2o2AvQWIAFB8BZqQfjSADYCACABIAFB5AFqNgLoFiABEIgBQQAhAwsgAw0AIAIoAhwiAiACKAIwQQF0NgJEQQAhAyACKAJQQQBBgIAIEBkgAiACKAKIASIEQQxsIgFBtNgAai8BADYClAEgAiABQbDYAGovAQA2ApABIAIgAUGy2ABqLwEANgJ4IAIgAUG22ABqLwEANgJ0QfiAASgCACEFQeyAASgCACEGQYCBASgCACEBIAJCADcCbCACQgA3AmQgAkEANgI8IAJBADYChC4gAkIANwJUIAJBKSABIARBCUYiARs2AnwgAkEqIAYgARs2AoABIAJBKyAFIAEbNgKEAQsgAwsFQXoLDAELAn9BekHrDC0AAEExRw0AGkF+IAJFDQAaIAJBADYCGCACKAIgIgNFBEAgAkEANgIoIAJBJzYCIEEnIQMLIAIoAiRFBEAgAkEoNgIkC0F8IAMgAigCKEEBQaDHABAoIgRFDQAaIAIgBDYCHCAEQQA2AjggBCACNgIAIARBtP4ANgIEIARBzIABKAIAEQkANgKYR0F+IQMCQCACRQ0AIAIoAiBFDQAgAigCJCIFRQ0AIAIoAhwiAUUNACABKAIAIAJHDQAgASgCBEG0/gBrQR9LDQACQAJAIAEoAjgiBgRAIAEoAihBD0cNAQsgAUEPNgIoIAFBADYCDAwBCyAFIAIoAiggBhAeIAFBADYCOCACKAIgIQUgAUEPNgIoIAFBADYCDCAFRQ0BCyACKAIkRQ0AIAIoAhwiAUUNACABKAIAIAJHDQAgASgCBEG0/gBrQR9LDQBBACEDIAFBADYCNCABQgA3AiwgAUEANgIgIAJBADYCCCACQgA3AhQgASgCDCIFBEAgAiAFQQFxNgIwCyABQrT+ADcCBCABQgA3AoQBIAFBADYCJCABQoCAgoAQNwMYIAFCgICAgHA3AxAgAUKBgICAcDcCjEcgASABQfwKaiIFNgK4ASABIAU2ApwBIAEgBTYCmAELQQAgA0UNABogAigCJCACKAIoIAQQHiACQQA2AhwgAwsLIgIEQCAAKAIAIgAEQCAAIAI2AgQgAEENNgIACwsgAkULKQEBfyAALQAERQRAQQAPC0ECIQEgACgCCCIAQQNOBH8gAEEHSgVBAgsLBgAgABAGC2MAQcgAEAkiAEUEQEGEhAEoAgAhASACBEAgAiABNgIEIAJBATYCAAsgAA8LIABBADoADCAAQQE6AAQgACACNgIAIABBADYCOCAAQgA3AzAgACABQQkgAUEBa0EJSRs2AgggAAukCgIIfwF+QfCAAUH0gAEgACgCdEGBCEkbIQYCQANAAkACfwJAIAAoAjxBhQJLDQAgABAvAkAgACgCPCICQYUCSw0AIAENAEEADwsgAkUNAiACQQRPDQBBAAwBCyAAIAAoAmggACgChAERAgALIQMgACAAKAJsOwFgQQIhAgJAIAA1AmggA619IgpCAVMNACAKIAAoAjBBhgJrrVUNACAAKAJwIAAoAnhPDQAgA0UNACAAIAMgBigCABECACICQQVLDQBBAiACIAAoAowBQQFGGyECCwJAIAAoAnAiA0EDSQ0AIAIgA0sNACAAIAAoAvAtIgJBAWo2AvAtIAAoAjwhBCACIAAoAuwtaiAAKAJoIgcgAC8BYEF/c2oiAjoAACAAIAAoAvAtIgVBAWo2AvAtIAUgACgC7C1qIAJBCHY6AAAgACAAKALwLSIFQQFqNgLwLSAFIAAoAuwtaiADQQNrOgAAIAAgACgCgC5BAWo2AoAuIANB/c4Aai0AAEECdCAAakHoCWoiAyADLwEAQQFqOwEAIAAgAkEBayICIAJBB3ZBgAJqIAJBgAJJG0GAywBqLQAAQQJ0akHYE2oiAiACLwEAQQFqOwEAIAAgACgCcCIFQQFrIgM2AnAgACAAKAI8IANrNgI8IAAoAvQtIQggACgC8C0hCSAEIAdqQQNrIgQgACgCaCICSwRAIAAgAkEBaiAEIAJrIgIgBUECayIEIAIgBEkbIAAoAoABEQUAIAAoAmghAgsgAEEANgJkIABBADYCcCAAIAIgA2oiBDYCaCAIIAlHDQJBACECIAAgACgCWCIDQQBOBH8gACgCSCADagVBAAsgBCADa0EAEA8gACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQDQIMAwsgACgCZARAIAAoAmggACgCSGpBAWstAAAhAyAAIAAoAvAtIgRBAWo2AvAtIAQgACgC7C1qQQA6AAAgACAAKALwLSIEQQFqNgLwLSAEIAAoAuwtakEAOgAAIAAgACgC8C0iBEEBajYC8C0gBCAAKALsLWogAzoAACAAIANBAnRqIgMgAy8B5AFBAWo7AeQBIAAoAvAtIAAoAvQtRgRAIAAgACgCWCIDQQBOBH8gACgCSCADagVBAAsgACgCaCADa0EAEA8gACAAKAJoNgJYIAAoAgAQCgsgACACNgJwIAAgACgCaEEBajYCaCAAIAAoAjxBAWs2AjwgACgCACgCEA0CQQAPBSAAQQE2AmQgACACNgJwIAAgACgCaEEBajYCaCAAIAAoAjxBAWs2AjwMAgsACwsgACgCZARAIAAoAmggACgCSGpBAWstAAAhAiAAIAAoAvAtIgNBAWo2AvAtIAMgACgC7C1qQQA6AAAgACAAKALwLSIDQQFqNgLwLSADIAAoAuwtakEAOgAAIAAgACgC8C0iA0EBajYC8C0gAyAAKALsLWogAjoAACAAIAJBAnRqIgIgAi8B5AFBAWo7AeQBIAAoAvAtIAAoAvQtRhogAEEANgJkCyAAIAAoAmgiA0ECIANBAkkbNgKELiABQQRGBEAgACAAKAJYIgFBAE4EfyAAKAJIIAFqBUEACyADIAFrQQEQDyAAIAAoAmg2AlggACgCABAKQQNBAiAAKAIAKAIQGw8LIAAoAvAtBEBBACECIAAgACgCWCIBQQBOBH8gACgCSCABagVBAAsgAyABa0EAEA8gACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQRQ0BC0EBIQILIAIL2BACEH8BfiAAKAKIAUEFSCEOA0ACQAJ/AkACQAJAAn8CQAJAIAAoAjxBhQJNBEAgABAvIAAoAjwiA0GFAksNASABDQFBAA8LIA4NASAIIQMgBSEHIAohDSAGQf//A3FFDQEMAwsgA0UNA0EAIANBBEkNARoLIAAgACgCaEH4gAEoAgARAgALIQZBASECQQAhDSAAKAJoIgOtIAatfSISQgFTDQIgEiAAKAIwQYYCa61VDQIgBkUNAiAAIAZB8IABKAIAEQIAIgZBASAGQfz/A3EbQQEgACgCbCINQf//A3EgA0H//wNxSRshBiADIQcLAkAgACgCPCIEIAZB//8DcSICQQRqTQ0AIAZB//8DcUEDTQRAQQEgBkEBa0H//wNxIglFDQQaIANB//8DcSIEIAdBAWpB//8DcSIDSw0BIAAgAyAJIAQgA2tBAWogAyAJaiAESxtB7IABKAIAEQUADAELAkAgACgCeEEEdCACSQ0AIARBBEkNACAGQQFrQf//A3EiDCAHQQFqQf//A3EiBGohCSAEIANB//8DcSIDTwRAQeyAASgCACELIAMgCUkEQCAAIAQgDCALEQUADAMLIAAgBCADIARrQQFqIAsRBQAMAgsgAyAJTw0BIAAgAyAJIANrQeyAASgCABEFAAwBCyAGIAdqQf//A3EiA0UNACAAIANBAWtB+IABKAIAEQIAGgsgBgwCCyAAIAAoAmgiBUECIAVBAkkbNgKELiABQQRGBEBBACEDIAAgACgCWCIBQQBOBH8gACgCSCABagVBAAsgBSABa0EBEA8gACAAKAJoNgJYIAAoAgAQCkEDQQIgACgCACgCEBsPCyAAKALwLQRAQQAhAkEAIQMgACAAKAJYIgFBAE4EfyAAKAJIIAFqBUEACyAFIAFrQQAQDyAAIAAoAmg2AlggACgCABAKIAAoAgAoAhBFDQMLQQEhAgwCCyADIQdBAQshBEEAIQYCQCAODQAgACgCPEGHAkkNACACIAdB//8DcSIQaiIDIAAoAkRBhgJrTw0AIAAgAzYCaEEAIQogACADQfiAASgCABECACEFAn8CQCAAKAJoIgitIAWtfSISQgFTDQAgEiAAKAIwQYYCa61VDQAgBUUNACAAIAVB8IABKAIAEQIAIQYgAC8BbCIKIAhB//8DcSIFTw0AIAZB//8DcSIDQQRJDQAgCCAEQf//A3FBAkkNARogCCACIApBAWpLDQEaIAggAiAFQQFqSw0BGiAIIAAoAkgiCSACa0EBaiICIApqLQAAIAIgBWotAABHDQEaIAggCUEBayICIApqIgwtAAAgAiAFaiIPLQAARw0BGiAIIAUgCCAAKAIwQYYCayICa0H//wNxQQAgAiAFSRsiEU0NARogCCADQf8BSw0BGiAGIQUgCCECIAQhAyAIIAoiCUECSQ0BGgNAAkAgA0EBayEDIAVBAWohCyAJQQFrIQkgAkEBayECIAxBAWsiDC0AACAPQQFrIg8tAABHDQAgA0H//wNxRQ0AIBEgAkH//wNxTw0AIAVB//8DcUH+AUsNACALIQUgCUH//wNxQQFLDQELCyAIIANB//8DcUEBSw0BGiAIIAtB//8DcUECRg0BGiAIQQFqIQggAyEEIAshBiAJIQogAgwBC0EBIQYgCAshBSAAIBA2AmgLAn8gBEH//wNxIgNBA00EQCAEQf//A3EiA0UNAyAAKAJIIAdB//8DcWotAAAhBCAAIAAoAvAtIgJBAWo2AvAtIAIgACgC7C1qQQA6AAAgACAAKALwLSICQQFqNgLwLSACIAAoAuwtakEAOgAAIAAgACgC8C0iAkEBajYC8C0gAiAAKALsLWogBDoAACAAIARBAnRqIgRB5AFqIAQvAeQBQQFqOwEAIAAgACgCPEEBazYCPCAAKALwLSICIAAoAvQtRiIEIANBAUYNARogACgCSCAHQQFqQf//A3FqLQAAIQkgACACQQFqNgLwLSAAKALsLSACakEAOgAAIAAgACgC8C0iAkEBajYC8C0gAiAAKALsLWpBADoAACAAIAAoAvAtIgJBAWo2AvAtIAIgACgC7C1qIAk6AAAgACAJQQJ0aiICQeQBaiACLwHkAUEBajsBACAAIAAoAjxBAWs2AjwgBCAAKALwLSICIAAoAvQtRmoiBCADQQJGDQEaIAAoAkggB0ECakH//wNxai0AACEHIAAgAkEBajYC8C0gACgC7C0gAmpBADoAACAAIAAoAvAtIgJBAWo2AvAtIAIgACgC7C1qQQA6AAAgACAAKALwLSICQQFqNgLwLSACIAAoAuwtaiAHOgAAIAAgB0ECdGoiB0HkAWogBy8B5AFBAWo7AQAgACAAKAI8QQFrNgI8IAQgACgC8C0gACgC9C1GagwBCyAAIAAoAvAtIgJBAWo2AvAtIAIgACgC7C1qIAdB//8DcSANQf//A3FrIgc6AAAgACAAKALwLSICQQFqNgLwLSACIAAoAuwtaiAHQQh2OgAAIAAgACgC8C0iAkEBajYC8C0gAiAAKALsLWogBEEDazoAACAAIAAoAoAuQQFqNgKALiADQf3OAGotAABBAnQgAGpB6AlqIgQgBC8BAEEBajsBACAAIAdBAWsiBCAEQQd2QYACaiAEQYACSRtBgMsAai0AAEECdGpB2BNqIgQgBC8BAEEBajsBACAAIAAoAjwgA2s2AjwgACgC8C0gACgC9C1GCyEEIAAgACgCaCADaiIHNgJoIARFDQFBACECQQAhBCAAIAAoAlgiA0EATgR/IAAoAkggA2oFQQALIAcgA2tBABAPIAAgACgCaDYCWCAAKAIAEAogACgCACgCEA0BCwsgAgu0BwIEfwF+AkADQAJAAkACQAJAIAAoAjxBhQJNBEAgABAvAkAgACgCPCICQYUCSw0AIAENAEEADwsgAkUNBCACQQRJDQELIAAgACgCaEH4gAEoAgARAgAhAiAANQJoIAKtfSIGQgFTDQAgBiAAKAIwQYYCa61VDQAgAkUNACAAIAJB8IABKAIAEQIAIgJBBEkNACAAIAAoAvAtIgNBAWo2AvAtIAMgACgC7C1qIAAoAmggACgCbGsiAzoAACAAIAAoAvAtIgRBAWo2AvAtIAQgACgC7C1qIANBCHY6AAAgACAAKALwLSIEQQFqNgLwLSAEIAAoAuwtaiACQQNrOgAAIAAgACgCgC5BAWo2AoAuIAJB/c4Aai0AAEECdCAAakHoCWoiBCAELwEAQQFqOwEAIAAgA0EBayIDIANBB3ZBgAJqIANBgAJJG0GAywBqLQAAQQJ0akHYE2oiAyADLwEAQQFqOwEAIAAgACgCPCACayIFNgI8IAAoAvQtIQMgACgC8C0hBCAAKAJ4IAJPQQAgBUEDSxsNASAAIAAoAmggAmoiAjYCaCAAIAJBAWtB+IABKAIAEQIAGiADIARHDQQMAgsgACgCSCAAKAJoai0AACECIAAgACgC8C0iA0EBajYC8C0gAyAAKALsLWpBADoAACAAIAAoAvAtIgNBAWo2AvAtIAMgACgC7C1qQQA6AAAgACAAKALwLSIDQQFqNgLwLSADIAAoAuwtaiACOgAAIAAgAkECdGoiAkHkAWogAi8B5AFBAWo7AQAgACAAKAI8QQFrNgI8IAAgACgCaEEBajYCaCAAKALwLSAAKAL0LUcNAwwBCyAAIAAoAmhBAWoiBTYCaCAAIAUgAkEBayICQeyAASgCABEFACAAIAAoAmggAmo2AmggAyAERw0CC0EAIQNBACECIAAgACgCWCIEQQBOBH8gACgCSCAEagVBAAsgACgCaCAEa0EAEA8gACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQDQEMAgsLIAAgACgCaCIEQQIgBEECSRs2AoQuIAFBBEYEQEEAIQIgACAAKAJYIgFBAE4EfyAAKAJIIAFqBUEACyAEIAFrQQEQDyAAIAAoAmg2AlggACgCABAKQQNBAiAAKAIAKAIQGw8LIAAoAvAtBEBBACEDQQAhAiAAIAAoAlgiAUEATgR/IAAoAkggAWoFQQALIAQgAWtBABAPIAAgACgCaDYCWCAAKAIAEAogACgCACgCEEUNAQtBASEDCyADC80JAgl/An4gAUEERiEGIAAoAiwhAgJAAkACQCABQQRGBEAgAkECRg0CIAIEQCAAQQAQUCAAQQA2AiwgACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQRQ0ECyAAIAYQTyAAQQI2AiwMAQsgAg0BIAAoAjxFDQEgACAGEE8gAEEBNgIsCyAAIAAoAmg2AlgLQQJBASABQQRGGyEKA0ACQCAAKAIMIAAoAhBBCGpLDQAgACgCABAKIAAoAgAiAigCEA0AQQAhAyABQQRHDQIgAigCBA0CIAAoAqAuDQIgACgCLEVBAXQPCwJAAkAgACgCPEGFAk0EQCAAEC8CQCAAKAI8IgNBhQJLDQAgAQ0AQQAPCyADRQ0CIAAoAiwEfyADBSAAIAYQTyAAIAo2AiwgACAAKAJoNgJYIAAoAjwLQQRJDQELIAAgACgCaEH4gAEoAgARAgAhBCAAKAJoIgKtIAStfSILQgFTDQAgCyAAKAIwQYYCa61VDQAgAiAAKAJIIgJqIgMvAAAgAiAEaiICLwAARw0AIANBAmogAkECakHQgAEoAgARAgBBAmoiA0EESQ0AIAAoAjwiAiADIAIgA0kbIgJBggIgAkGCAkkbIgdB/c4Aai0AACICQQJ0IgRBhMkAajMBACEMIARBhskAai8BACEDIAJBCGtBE00EQCAHQQNrIARBgNEAaigCAGutIAOthiAMhCEMIARBsNYAaigCACADaiEDCyAAKAKgLiEFIAMgC6dBAWsiCCAIQQd2QYACaiAIQYACSRtBgMsAai0AACICQQJ0IglBgsoAai8BAGohBCAJQYDKAGozAQAgA62GIAyEIQsgACkDmC4hDAJAIAUgAkEESQR/IAQFIAggCUGA0gBqKAIAa60gBK2GIAuEIQsgCUGw1wBqKAIAIARqCyICaiIDQT9NBEAgCyAFrYYgDIQhCwwBCyAFQcAARgRAIAAoAgQgACgCEGogDDcAACAAIAAoAhBBCGo2AhAgAiEDDAELIAAoAgQgACgCEGogCyAFrYYgDIQ3AAAgACAAKAIQQQhqNgIQIANBQGohAyALQcAAIAVrrYghCwsgACALNwOYLiAAIAM2AqAuIAAgACgCPCAHazYCPCAAIAAoAmggB2o2AmgMAgsgACgCSCAAKAJoai0AAEECdCICQYDBAGozAQAhCyAAKQOYLiEMAkAgACgCoC4iBCACQYLBAGovAQAiAmoiA0E/TQRAIAsgBK2GIAyEIQsMAQsgBEHAAEYEQCAAKAIEIAAoAhBqIAw3AAAgACAAKAIQQQhqNgIQIAIhAwwBCyAAKAIEIAAoAhBqIAsgBK2GIAyENwAAIAAgACgCEEEIajYCECADQUBqIQMgC0HAACAEa62IIQsLIAAgCzcDmC4gACADNgKgLiAAIAAoAmhBAWo2AmggACAAKAI8QQFrNgI8DAELCyAAIAAoAmgiAkECIAJBAkkbNgKELiAAKAIsIQIgAUEERgRAAkAgAkUNACAAQQEQUCAAQQA2AiwgACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQDQBBAg8LQQMPCyACBEBBACEDIABBABBQIABBADYCLCAAIAAoAmg2AlggACgCABAKIAAoAgAoAhBFDQELQQEhAwsgAwucAQEFfyACQQFOBEAgAiAAKAJIIAFqIgNqQQJqIQQgA0ECaiECIAAoAlQhAyAAKAJQIQUDQCAAIAItAAAgA0EFdEHg/wFxcyIDNgJUIAUgA0EBdGoiBi8BACIHIAFB//8DcUcEQCAAKAJMIAEgACgCOHFB//8DcUEBdGogBzsBACAGIAE7AQALIAFBAWohASACQQFqIgIgBEkNAAsLC1sBAn8gACAAKAJIIAFqLQACIAAoAlRBBXRB4P8BcXMiAjYCVCABIAAoAlAgAkEBdGoiAy8BACICRwRAIAAoAkwgACgCOCABcUEBdGogAjsBACADIAE7AQALIAILEwAgAUEFdEHg/wFxIAJB/wFxcwsGACABEAYLLwAjAEEQayIAJAAgAEEMaiABIAJsEIwBIQEgACgCDCECIABBEGokAEEAIAIgARsLjAoCAX4CfyMAQfAAayIGJAACQAJAAkACQAJAAkACQAJAIAQODwABBwIEBQYGBgYGBgYGAwYLQn8hBQJAIAAgBkHkAGpCDBARIgNCf1cEQCABBEAgASAAKAIMNgIAIAEgACgCEDYCBAsMAQsCQCADQgxSBEAgAQRAIAFBADYCBCABQRE2AgALDAELIAEoAhQhBEEAIQJCASEFA0AgBkHkAGogAmoiAiACLQAAIARB/f8DcSICQQJyIAJBA3NsQQh2cyICOgAAIAYgAjoAKCABAn8gASgCDEF/cyECQQAgBkEoaiIERQ0AGiACIARBAUHUgAEoAgARAAALQX9zIgI2AgwgASABKAIQIAJB/wFxakGFiKLAAGxBAWoiAjYCECAGIAJBGHY6ACggAQJ/IAEoAhRBf3MhAkEAIAZBKGoiBEUNABogAiAEQQFB1IABKAIAEQAAC0F/cyIENgIUIAVCDFIEQCAFpyECIAVCAXwhBQwBCwtCACEFIAAgBkEoahAhQQBIDQEgBigCUCEAIwBBEGsiAiQAIAIgADYCDCAGAn8gAkEMahCNASIARQRAIAZBITsBJEEADAELAn8gACgCFCIEQdAATgRAIARBCXQMAQsgAEHQADYCFEGAwAILIQQgBiAAKAIMIAQgACgCEEEFdGpqQaDAAWo7ASQgACgCBEEFdCAAKAIIQQt0aiAAKAIAQQF2ags7ASYgAkEQaiQAIAYtAG8iACAGLQBXRg0BIAYtACcgAEYNASABBEAgAUEANgIEIAFBGzYCAAsLQn8hBQsgBkHwAGokACAFDwtCfyEFIAAgAiADEBEiA0J/VwRAIAEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwGCyMAQRBrIgAkAAJAIANQDQAgASgCFCEEIAJFBEBCASEFA0AgACACIAdqLQAAIARB/f8DcSIEQQJyIARBA3NsQQh2czoADyABAn8gASgCDEF/cyEEQQAgAEEPaiIHRQ0AGiAEIAdBAUHUgAEoAgARAAALQX9zIgQ2AgwgASABKAIQIARB/wFxakGFiKLAAGxBAWoiBDYCECAAIARBGHY6AA8gAQJ/IAEoAhRBf3MhBEEAIABBD2oiB0UNABogBCAHQQFB1IABKAIAEQAAC0F/cyIENgIUIAMgBVENAiAFpyEHIAVCAXwhBQwACwALQgEhBQNAIAAgAiAHai0AACAEQf3/A3EiBEECciAEQQNzbEEIdnMiBDoADyACIAdqIAQ6AAAgAQJ/IAEoAgxBf3MhBEEAIABBD2oiB0UNABogBCAHQQFB1IABKAIAEQAAC0F/cyIENgIMIAEgASgCECAEQf8BcWpBhYiiwABsQQFqIgQ2AhAgACAEQRh2OgAPIAECfyABKAIUQX9zIQRBACAAQQ9qIgdFDQAaIAQgB0EBQdSAASgCABEAAAtBf3MiBDYCFCADIAVRDQEgBachByAFQgF8IQUMAAsACyAAQRBqJAAgAyEFDAULIAJBADsBMiACIAIpAwAiA0KAAYQ3AwAgA0IIg1ANBCACIAIpAyBCDH03AyAMBAsgBkKFgICAcDcDECAGQoOAgIDAADcDCCAGQoGAgIAgNwMAQQAgBhAkIQUMAwsgA0IIWgR+IAIgASgCADYCACACIAEoAgQ2AgRCCAVCfwshBQwCCyABEAYMAQsgAQRAIAFBADYCBCABQRI2AgALQn8hBQsgBkHwAGokACAFC60DAgJ/An4jAEEQayIGJAACQAJAAkAgBEUNACABRQ0AIAJBAUYNAQtBACEDIABBCGoiAARAIABBADYCBCAAQRI2AgALDAELIANBAXEEQEEAIQMgAEEIaiIABEAgAEEANgIEIABBGDYCAAsMAQtBGBAJIgVFBEBBACEDIABBCGoiAARAIABBADYCBCAAQQ42AgALDAELIAVBADYCCCAFQgA3AgAgBUGQ8dmiAzYCFCAFQvis0ZGR8dmiIzcCDAJAIAQQIiICRQ0AIAKtIQhBACEDQYfTru5+IQJCASEHA0AgBiADIARqLQAAOgAPIAUgBkEPaiIDBH8gAiADQQFB1IABKAIAEQAABUEAC0F/cyICNgIMIAUgBSgCECACQf8BcWpBhYiiwABsQQFqIgI2AhAgBiACQRh2OgAPIAUCfyAFKAIUQX9zIQJBACAGQQ9qIgNFDQAaIAIgA0EBQdSAASgCABEAAAtBf3M2AhQgByAIUQ0BIAUoAgxBf3MhAiAHpyEDIAdCAXwhBwwACwALIAAgAUElIAUQQiIDDQAgBRAGQQAhAwsgBkEQaiQAIAMLnRoCBn4FfyMAQdAAayILJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADDhQFBhULAwQJDgACCBAKDw0HEQERDBELAkBByAAQCSIBBEAgAUIANwMAIAFCADcDMCABQQA2AiggAUIANwMgIAFCADcDGCABQgA3AxAgAUIANwMIIAFCADcDOCABQQgQCSIDNgIEIAMNASABEAYgAARAIABBADYCBCAAQQ42AgALCyAAQQA2AhQMFAsgA0IANwMAIAAgATYCFCABQUBrQgA3AwAgAUIANwM4DBQLAkACQCACUARAQcgAEAkiA0UNFCADQgA3AwAgA0IANwMwIANBADYCKCADQgA3AyAgA0IANwMYIANCADcDECADQgA3AwggA0IANwM4IANBCBAJIgE2AgQgAQ0BIAMQBiAABEAgAEEANgIEIABBDjYCAAsMFAsgAiAAKAIQIgEpAzBWBEAgAARAIABBADYCBCAAQRI2AgALDBQLIAEoAigEQCAABEAgAEEANgIEIABBHTYCAAsMFAsgASgCBCEDAkAgASkDCCIGQgF9IgdQDQADQAJAIAIgAyAHIAR9QgGIIAR8IgWnQQN0aikDAFQEQCAFQgF9IQcMAQsgBSAGUQRAIAYhBQwDCyADIAVCAXwiBKdBA3RqKQMAIAJWDQILIAQhBSAEIAdUDQALCwJAIAIgAyAFpyIKQQN0aikDAH0iBFBFBEAgASgCACIDIApBBHRqKQMIIQcMAQsgASgCACIDIAVCAX0iBadBBHRqKQMIIgchBAsgAiAHIAR9VARAIAAEQCAAQQA2AgQgAEEcNgIACwwUCyADIAVCAXwiBUEAIAAQiQEiA0UNEyADKAIAIAMoAggiCkEEdGpBCGsgBDcDACADKAIEIApBA3RqIAI3AwAgAyACNwMwIAMgASkDGCIGIAMpAwgiBEIBfSIHIAYgB1QbNwMYIAEgAzYCKCADIAE2AiggASAENwMgIAMgBTcDIAwBCyABQgA3AwALIAAgAzYCFCADIAQ3A0AgAyACNwM4QgAhBAwTCyAAKAIQIgEEQAJAIAEoAigiA0UEQCABKQMYIQIMAQsgA0EANgIoIAEoAihCADcDICABIAEpAxgiAiABKQMgIgUgAiAFVhsiAjcDGAsgASkDCCACVgRAA0AgASgCACACp0EEdGooAgAQBiACQgF8IgIgASkDCFQNAAsLIAEoAgAQBiABKAIEEAYgARAGCyAAKAIUIQEgAEEANgIUIAAgATYCEAwSCyACQghaBH4gASAAKAIANgIAIAEgACgCBDYCBEIIBUJ/CyEEDBELIAAoAhAiAQRAAkAgASgCKCIDRQRAIAEpAxghAgwBCyADQQA2AiggASgCKEIANwMgIAEgASkDGCICIAEpAyAiBSACIAVWGyICNwMYCyABKQMIIAJWBEADQCABKAIAIAKnQQR0aigCABAGIAJCAXwiAiABKQMIVA0ACwsgASgCABAGIAEoAgQQBiABEAYLIAAoAhQiAQRAAkAgASgCKCIDRQRAIAEpAxghAgwBCyADQQA2AiggASgCKEIANwMgIAEgASkDGCICIAEpAyAiBSACIAVWGyICNwMYCyABKQMIIAJWBEADQCABKAIAIAKnQQR0aigCABAGIAJCAXwiAiABKQMIVA0ACwsgASgCABAGIAEoAgQQBiABEAYLIAAQBgwQCyAAKAIQIgBCADcDOCAAQUBrQgA3AwAMDwsgAkJ/VwRAIAAEQCAAQQA2AgQgAEESNgIACwwOCyACIAAoAhAiAykDMCADKQM4IgZ9IgUgAiAFVBsiBVANDiABIAMpA0AiB6ciAEEEdCIBIAMoAgBqIgooAgAgBiADKAIEIABBA3RqKQMAfSICp2ogBSAKKQMIIAJ9IgYgBSAGVBsiBKcQByEKIAcgBCADKAIAIgAgAWopAwggAn1RrXwhAiAFIAZWBEADQCAKIASnaiAAIAKnQQR0IgFqIgAoAgAgBSAEfSIGIAApAwgiByAGIAdUGyIGpxAHGiACIAYgAygCACIAIAFqKQMIUa18IQIgBSAEIAZ8IgRWDQALCyADIAI3A0AgAyADKQM4IAR8NwM4DA4LQn8hBEHIABAJIgNFDQ0gA0IANwMAIANCADcDMCADQQA2AiggA0IANwMgIANCADcDGCADQgA3AxAgA0IANwMIIANCADcDOCADQQgQCSIBNgIEIAFFBEAgAxAGIAAEQCAAQQA2AgQgAEEONgIACwwOCyABQgA3AwAgACgCECIBBEACQCABKAIoIgpFBEAgASkDGCEEDAELIApBADYCKCABKAIoQgA3AyAgASABKQMYIgIgASkDICIFIAIgBVYbIgQ3AxgLIAEpAwggBFYEQANAIAEoAgAgBKdBBHRqKAIAEAYgBEIBfCIEIAEpAwhUDQALCyABKAIAEAYgASgCBBAGIAEQBgsgACADNgIQQgAhBAwNCyAAKAIUIgEEQAJAIAEoAigiA0UEQCABKQMYIQIMAQsgA0EANgIoIAEoAihCADcDICABIAEpAxgiAiABKQMgIgUgAiAFVhsiAjcDGAsgASkDCCACVgRAA0AgASgCACACp0EEdGooAgAQBiACQgF8IgIgASkDCFQNAAsLIAEoAgAQBiABKAIEEAYgARAGCyAAQQA2AhQMDAsgACgCECIDKQM4IAMpAzAgASACIAAQRCIHQgBTDQogAyAHNwM4AkAgAykDCCIGQgF9IgJQDQAgAygCBCEAA0ACQCAHIAAgAiAEfUIBiCAEfCIFp0EDdGopAwBUBEAgBUIBfSECDAELIAUgBlEEQCAGIQUMAwsgACAFQgF8IgSnQQN0aikDACAHVg0CCyAEIQUgAiAEVg0ACwsgAyAFNwNAQgAhBAwLCyAAKAIUIgMpAzggAykDMCABIAIgABBEIgdCAFMNCSADIAc3AzgCQCADKQMIIgZCAX0iAlANACADKAIEIQADQAJAIAcgACACIAR9QgGIIAR8IgWnQQN0aikDAFQEQCAFQgF9IQIMAQsgBSAGUQRAIAYhBQwDCyAAIAVCAXwiBKdBA3RqKQMAIAdWDQILIAQhBSACIARWDQALCyADIAU3A0BCACEEDAoLIAJCN1gEQCAABEAgAEEANgIEIABBEjYCAAsMCQsgARAqIAEgACgCDDYCKCAAKAIQKQMwIQIgAUEANgIwIAEgAjcDICABIAI3AxggAULcATcDAEI4IQQMCQsgACABKAIANgIMDAgLIAtBQGtBfzYCACALQouAgICwAjcDOCALQoyAgIDQATcDMCALQo+AgICgATcDKCALQpGAgICQATcDICALQoeAgICAATcDGCALQoWAgIDgADcDECALQoOAgIDAADcDCCALQoGAgIAgNwMAQQAgCxAkIQQMBwsgACgCECkDOCIEQn9VDQYgAARAIABBPTYCBCAAQR42AgALDAULIAAoAhQpAzgiBEJ/VQ0FIAAEQCAAQT02AgQgAEEeNgIACwwEC0J/IQQgAkJ/VwRAIAAEQCAAQQA2AgQgAEESNgIACwwFCyACIAAoAhQiAykDOCACfCIFQv//A3wiBFYEQCAABEAgAEEANgIEIABBEjYCAAsMBAsCQCAFIAMoAgQiCiADKQMIIganQQN0aikDACIHWA0AAkAgBCAHfUIQiCAGfCIIIAMpAxAiCVgNAEIQIAkgCVAbIQUDQCAFIgRCAYYhBSAEIAhUDQALIAQgCVQNACADKAIAIASnIgpBBHQQNCIMRQ0DIAMgDDYCACADKAIEIApBA3RBCGoQNCIKRQ0DIAMgBDcDECADIAo2AgQgAykDCCEGCyAGIAhaDQAgAygCACEMA0AgDCAGp0EEdGoiDUGAgAQQCSIONgIAIA5FBEAgAARAIABBADYCBCAAQQ42AgALDAYLIA1CgIAENwMIIAMgBkIBfCIFNwMIIAogBadBA3RqIAdCgIAEfCIHNwMAIAMpAwgiBiAIVA0ACwsgAykDQCEFIAMpAzghBwJAIAJQBEBCACEEDAELIAWnIgBBBHQiDCADKAIAaiINKAIAIAcgCiAAQQN0aikDAH0iBqdqIAEgAiANKQMIIAZ9IgcgAiAHVBsiBKcQBxogBSAEIAMoAgAiACAMaikDCCAGfVGtfCEFIAIgB1YEQANAIAAgBadBBHQiCmoiACgCACABIASnaiACIAR9IgYgACkDCCIHIAYgB1QbIganEAcaIAUgBiADKAIAIgAgCmopAwhRrXwhBSAEIAZ8IgQgAlQNAAsLIAMpAzghBwsgAyAFNwNAIAMgBCAHfCICNwM4IAIgAykDMFgNBCADIAI3AzAMBAsgAARAIABBADYCBCAAQRw2AgALDAILIAAEQCAAQQA2AgQgAEEONgIACyAABEAgAEEANgIEIABBDjYCAAsMAQsgAEEANgIUC0J/IQQLIAtB0ABqJAAgBAtIAQF/IABCADcCBCAAIAE2AgACQCABQQBIDQBBsBMoAgAgAUwNACABQQJ0QcATaigCAEEBRw0AQYSEASgCACECCyAAIAI2AgQLDgAgAkGx893xeWxBEHYLvgEAIwBBEGsiACQAIABBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAQRBqJAAgAkGx893xeWxBEHYLuQEBAX8jAEEQayIBJAAgAUEAOgAIQYCBAUECNgIAQfyAAUEDNgIAQfiAAUEENgIAQfSAAUEFNgIAQfCAAUEGNgIAQeyAAUEHNgIAQeiAAUEINgIAQeSAAUEJNgIAQeCAAUEKNgIAQdyAAUELNgIAQdiAAUEMNgIAQdSAAUENNgIAQdCAAUEONgIAQcyAAUEPNgIAQciAAUEQNgIAQcSAAUERNgIAQcCAAUESNgIAIAAQjgEgAUEQaiQAC78BAQF/IwBBEGsiAiQAIAJBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAIAEQkAEhACACQRBqJAAgAAu+AQEBfyMAQRBrIgIkACACQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgACABEFohACACQRBqJAAgAAu+AQEBfyMAQRBrIgIkACACQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgACABEFshACACQRBqJAAgAAu9AQEBfyMAQRBrIgMkACADQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgACABIAIQjwEgA0EQaiQAC4UBAgR/AX4jAEEQayIBJAACQCAAKQMwUARADAELA0ACQCAAIAVBACABQQ9qIAFBCGoQZiIEQX9GDQAgAS0AD0EDRw0AIAIgASgCCEGAgICAf3FBgICAgHpGaiECC0F/IQMgBEF/Rg0BIAIhAyAFQgF8IgUgACkDMFQNAAsLIAFBEGokACADCwuMdSUAQYAIC7ELaW5zdWZmaWNpZW50IG1lbW9yeQBuZWVkIGRpY3Rpb25hcnkALSsgICAwWDB4AFppcCBhcmNoaXZlIGluY29uc2lzdGVudABJbnZhbGlkIGFyZ3VtZW50AGludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldABpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQAdW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0AGludmFsaWQgZGlzdGFuY2VzIHNldABpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0AEZpbGUgYWxyZWFkeSBleGlzdHMAdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMAaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocwAlcyVzJXMAYnVmZmVyIGVycm9yAE5vIGVycm9yAHN0cmVhbSBlcnJvcgBUZWxsIGVycm9yAEludGVybmFsIGVycm9yAFNlZWsgZXJyb3IAV3JpdGUgZXJyb3IAZmlsZSBlcnJvcgBSZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoADEuMi4xMy56bGliLW5nAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRl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UgAIANIACAAyAAgAsgAIAHIACADyAAgACgAIAIoACABKAAgAygAIACoACACqAAgAagAIAOoACAAaAAgAmgAIAFoACADaAAgAOgAIALoACAB6AAgA+gAIAAYACACGAAgARgAIAMYACAAmAAgApgAIAGYACADmAAgAFgAIAJYACABWAAgA1gAIADYACAC2AAgAdgAIAPYACAAOAAgAjgAIAE4ACADOAAgALgAIAK4ACABuAAgA7gAIAB4ACACeAAgAXgAIAN4ACAA+AAgAvgAIAH4ACAD+AAgAAQAIAIEACABBAAgAwQAIACEACAChAAgAYQAIAOEACAARAAgAkQAIAFEACADRAAgAMQAIALEACABxAAgA8QAIAAkACACJAAgASQAIAMkACAApAAgAqQAIAGkACADpAAgAGQAIAJkACABZAAgA2QAIADkACAC5AAgAeQAIAPkACAAFAAgAhQAIAEUACADFAAgAJQAIAKUACABlAAgA5QAIABUACACVAAgAVQAIANUACAA1AAgAtQAIAHUACAD1AAgADQAIAI0ACABNAAgAzQAIAC0ACACtAAgAbQAIAO0ACAAdAAgAnQAIAF0ACADdAAgAPQAIAL0ACAB9AAgA/QAIABMACQATAQkAkwAJAJMBCQBTAAkAUwEJANMACQDTAQkAMwAJADMBCQCzAAkAswEJAHMACQBzAQkA8wAJAPMBCQALAAkACwEJAIsACQCLAQkASwAJAEsBCQDLAAkAywEJACsACQArAQkAqwAJAKsBCQBrAAkAawEJAOsACQDrAQkAGwAJABsBCQCbAAkAmwEJAFsACQBbAQkA2wAJANsBCQA7AAkAOwEJALsACQC7AQkAewAJAHsBCQD7AAkA+wEJAAcACQAHAQkAhwAJAIcBCQBHAAkARwEJAMcACQDHAQkAJwAJACcBCQCnAAkApwEJAGcACQBnAQkA5wAJAOcBCQAXAAkAFwEJAJcACQCXAQkAVwAJAFcBCQDXAAkA1wEJADcACQA3AQkAtwAJALcBCQB3AAkAdwEJAPcACQD3AQkADwAJAA8BCQCPAAkAjwEJAE8ACQBPAQkAzwAJAM8BCQAvAAkALwEJAK8ACQCvAQkAbwAJAG8BCQDvAAkA7wEJAB8ACQAfAQkAnwAJAJ8BCQBfAAkAXwEJAN8ACQDfAQkAPwAJAD8BCQC/AAkA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SXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AQcCAAQuFARMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAgERQADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAQfSCAQsCXEQAQbCDAQsQ/////////////////////w=="; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + var binary = tryParseAsDataURI(file); + if (binary) { + return binary; + } + if (readBinary) { + return readBinary(file); + } else { + throw "sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"; + } + } catch (err2) { + abort(err2); + } + } + function instantiateSync(file, info) { + var instance; + var module2; + var binary; + try { + binary = getBinary(file); + module2 = new WebAssembly.Module(binary); + instance = new WebAssembly.Instance(module2, info); + } catch (e) { + var str = e.toString(); + err("failed to compile wasm module: " + str); + if (str.includes("imported Memory") || str.includes("memory import")) { + err( + "Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)." + ); + } + throw e; + } + return [instance, module2]; + } + function createWasm() { + var info = { a: asmLibraryArg }; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmMemory = Module["asm"]["g"]; + updateGlobalBufferAndViews(wasmMemory.buffer); + wasmTable = Module["asm"]["W"]; + addOnInit(Module["asm"]["h"]); + removeRunDependency(); + } + addRunDependency(); + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + var result = instantiateSync(wasmBinaryFile, info); + receiveInstance(result[0]); + return Module["asm"]; + } + function LE_HEAP_LOAD_F32(byteOffset) { + return HEAP_DATA_VIEW.getFloat32(byteOffset, true); + } + function LE_HEAP_LOAD_F64(byteOffset) { + return HEAP_DATA_VIEW.getFloat64(byteOffset, true); + } + function LE_HEAP_LOAD_I16(byteOffset) { + return HEAP_DATA_VIEW.getInt16(byteOffset, true); + } + function LE_HEAP_LOAD_I32(byteOffset) { + return HEAP_DATA_VIEW.getInt32(byteOffset, true); + } + function LE_HEAP_STORE_I32(byteOffset, value) { + HEAP_DATA_VIEW.setInt32(byteOffset, value, true); + } + function callRuntimeCallbacks(callbacks) { + while (callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func = callback.func; + if (typeof func === "number") { + if (callback.arg === void 0) { + wasmTable.get(func)(); + } else { + wasmTable.get(func)(callback.arg); + } + } else { + func(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _gmtime_r(time, tmPtr) { + var date = new Date(LE_HEAP_LOAD_I32((time >> 2) * 4) * 1e3); + LE_HEAP_STORE_I32((tmPtr >> 2) * 4, date.getUTCSeconds()); + LE_HEAP_STORE_I32((tmPtr + 4 >> 2) * 4, date.getUTCMinutes()); + LE_HEAP_STORE_I32((tmPtr + 8 >> 2) * 4, date.getUTCHours()); + LE_HEAP_STORE_I32((tmPtr + 12 >> 2) * 4, date.getUTCDate()); + LE_HEAP_STORE_I32((tmPtr + 16 >> 2) * 4, date.getUTCMonth()); + LE_HEAP_STORE_I32((tmPtr + 20 >> 2) * 4, date.getUTCFullYear() - 1900); + LE_HEAP_STORE_I32((tmPtr + 24 >> 2) * 4, date.getUTCDay()); + LE_HEAP_STORE_I32((tmPtr + 36 >> 2) * 4, 0); + LE_HEAP_STORE_I32((tmPtr + 32 >> 2) * 4, 0); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = (date.getTime() - start) / (1e3 * 60 * 60 * 24) | 0; + LE_HEAP_STORE_I32((tmPtr + 28 >> 2) * 4, yday); + if (!_gmtime_r.GMTString) + _gmtime_r.GMTString = allocateUTF8("GMT"); + LE_HEAP_STORE_I32((tmPtr + 40 >> 2) * 4, _gmtime_r.GMTString); + return tmPtr; + } + function ___gmtime_r(a0, a1) { + return _gmtime_r(a0, a1); + } + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = HEAPU8.length; + requestedSize = requestedSize >>> 0; + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + function _setTempRet0(val) { + } + function _time(ptr) { + var ret = Date.now() / 1e3 | 0; + if (ptr) { + LE_HEAP_STORE_I32((ptr >> 2) * 4, ret); + } + return ret; + } + function _tzset() { + if (_tzset.called) + return; + _tzset.called = true; + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + LE_HEAP_STORE_I32((__get_timezone() >> 2) * 4, stdTimezoneOffset * 60); + LE_HEAP_STORE_I32( + (__get_daylight() >> 2) * 4, + Number(winterOffset != summerOffset) + ); + function extractZone(date) { + var match = date.toTimeString().match(/\(([A-Za-z ]+)\)$/); + return match ? match[1] : "GMT"; + } + var winterName = extractZone(winter); + var summerName = extractZone(summer); + var winterNamePtr = allocateUTF8(winterName); + var summerNamePtr = allocateUTF8(summerName); + if (summerOffset < winterOffset) { + LE_HEAP_STORE_I32((__get_tzname() >> 2) * 4, winterNamePtr); + LE_HEAP_STORE_I32((__get_tzname() + 4 >> 2) * 4, summerNamePtr); + } else { + LE_HEAP_STORE_I32((__get_tzname() >> 2) * 4, summerNamePtr); + LE_HEAP_STORE_I32((__get_tzname() + 4 >> 2) * 4, winterNamePtr); + } + } + function _timegm(tmPtr) { + _tzset(); + var time = Date.UTC( + LE_HEAP_LOAD_I32((tmPtr + 20 >> 2) * 4) + 1900, + LE_HEAP_LOAD_I32((tmPtr + 16 >> 2) * 4), + LE_HEAP_LOAD_I32((tmPtr + 12 >> 2) * 4), + LE_HEAP_LOAD_I32((tmPtr + 8 >> 2) * 4), + LE_HEAP_LOAD_I32((tmPtr + 4 >> 2) * 4), + LE_HEAP_LOAD_I32((tmPtr >> 2) * 4), + 0 + ); + var date = new Date(time); + LE_HEAP_STORE_I32((tmPtr + 24 >> 2) * 4, date.getUTCDay()); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = (date.getTime() - start) / (1e3 * 60 * 60 * 24) | 0; + LE_HEAP_STORE_I32((tmPtr + 28 >> 2) * 4, yday); + return date.getTime() / 1e3 | 0; + } + function intArrayFromBase64(s) { + { + var buf; + try { + buf = Buffer.from(s, "base64"); + } catch (_) { + buf = new Buffer(s, "base64"); + } + return new Uint8Array( + buf["buffer"], + buf["byteOffset"], + buf["byteLength"] + ); + } + } + function tryParseAsDataURI(filename) { + if (!isDataURI(filename)) { + return; + } + return intArrayFromBase64(filename.slice(dataURIPrefix.length)); + } + var asmLibraryArg = { + e: ___gmtime_r, + c: _emscripten_memcpy_big, + d: _emscripten_resize_heap, + a: _setTempRet0, + b: _time, + f: _timegm + }; + var asm = createWasm(); + Module["___wasm_call_ctors"] = asm["h"]; + Module["_zip_ext_count_symlinks"] = asm["i"]; + Module["_zip_file_get_external_attributes"] = asm["j"]; + Module["_zipstruct_statS"] = asm["k"]; + Module["_zipstruct_stat_size"] = asm["l"]; + Module["_zipstruct_stat_mtime"] = asm["m"]; + Module["_zipstruct_stat_crc"] = asm["n"]; + Module["_zipstruct_errorS"] = asm["o"]; + Module["_zipstruct_error_code_zip"] = asm["p"]; + Module["_zipstruct_stat_comp_size"] = asm["q"]; + Module["_zipstruct_stat_comp_method"] = asm["r"]; + Module["_zip_close"] = asm["s"]; + Module["_zip_delete"] = asm["t"]; + Module["_zip_dir_add"] = asm["u"]; + Module["_zip_discard"] = asm["v"]; + Module["_zip_error_init_with_code"] = asm["w"]; + Module["_zip_get_error"] = asm["x"]; + Module["_zip_file_get_error"] = asm["y"]; + Module["_zip_error_strerror"] = asm["z"]; + Module["_zip_fclose"] = asm["A"]; + Module["_zip_file_add"] = asm["B"]; + Module["_free"] = asm["C"]; + var _malloc = Module["_malloc"] = asm["D"]; + Module["_zip_source_error"] = asm["E"]; + Module["_zip_source_seek"] = asm["F"]; + Module["_zip_file_set_external_attributes"] = asm["G"]; + Module["_zip_file_set_mtime"] = asm["H"]; + Module["_zip_fopen_index"] = asm["I"]; + Module["_zip_fread"] = asm["J"]; + Module["_zip_get_name"] = asm["K"]; + Module["_zip_get_num_entries"] = asm["L"]; + Module["_zip_source_read"] = asm["M"]; + Module["_zip_name_locate"] = asm["N"]; + Module["_zip_open_from_source"] = asm["O"]; + Module["_zip_set_file_compression"] = asm["P"]; + Module["_zip_source_buffer"] = asm["Q"]; + Module["_zip_source_buffer_create"] = asm["R"]; + Module["_zip_source_close"] = asm["S"]; + Module["_zip_source_free"] = asm["T"]; + Module["_zip_source_keep"] = asm["U"]; + Module["_zip_source_open"] = asm["V"]; + Module["_zip_source_tell"] = asm["X"]; + Module["_zip_stat_index"] = asm["Y"]; + var __get_tzname = Module["__get_tzname"] = asm["Z"]; + var __get_daylight = Module["__get_daylight"] = asm["_"]; + var __get_timezone = Module["__get_timezone"] = asm["$"]; + var stackSave = Module["stackSave"] = asm["aa"]; + var stackRestore = Module["stackRestore"] = asm["ba"]; + var stackAlloc = Module["stackAlloc"] = asm["ca"]; + Module["cwrap"] = cwrap; + Module["getValue"] = getValue; + var calledRun; + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run(args) { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run; + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run(); + return createModule2; + }; +}(); +module.exports = createModule; +}(libzipSync)); + +const createModule = libzipSync.exports; + +const number64 = [ + `number`, + `number` +]; +var Errors = /* @__PURE__ */ ((Errors2) => { + Errors2[Errors2["ZIP_ER_OK"] = 0] = "ZIP_ER_OK"; + Errors2[Errors2["ZIP_ER_MULTIDISK"] = 1] = "ZIP_ER_MULTIDISK"; + Errors2[Errors2["ZIP_ER_RENAME"] = 2] = "ZIP_ER_RENAME"; + Errors2[Errors2["ZIP_ER_CLOSE"] = 3] = "ZIP_ER_CLOSE"; + Errors2[Errors2["ZIP_ER_SEEK"] = 4] = "ZIP_ER_SEEK"; + Errors2[Errors2["ZIP_ER_READ"] = 5] = "ZIP_ER_READ"; + Errors2[Errors2["ZIP_ER_WRITE"] = 6] = "ZIP_ER_WRITE"; + Errors2[Errors2["ZIP_ER_CRC"] = 7] = "ZIP_ER_CRC"; + Errors2[Errors2["ZIP_ER_ZIPCLOSED"] = 8] = "ZIP_ER_ZIPCLOSED"; + Errors2[Errors2["ZIP_ER_NOENT"] = 9] = "ZIP_ER_NOENT"; + Errors2[Errors2["ZIP_ER_EXISTS"] = 10] = "ZIP_ER_EXISTS"; + Errors2[Errors2["ZIP_ER_OPEN"] = 11] = "ZIP_ER_OPEN"; + Errors2[Errors2["ZIP_ER_TMPOPEN"] = 12] = "ZIP_ER_TMPOPEN"; + Errors2[Errors2["ZIP_ER_ZLIB"] = 13] = "ZIP_ER_ZLIB"; + Errors2[Errors2["ZIP_ER_MEMORY"] = 14] = "ZIP_ER_MEMORY"; + Errors2[Errors2["ZIP_ER_CHANGED"] = 15] = "ZIP_ER_CHANGED"; + Errors2[Errors2["ZIP_ER_COMPNOTSUPP"] = 16] = "ZIP_ER_COMPNOTSUPP"; + Errors2[Errors2["ZIP_ER_EOF"] = 17] = "ZIP_ER_EOF"; + Errors2[Errors2["ZIP_ER_INVAL"] = 18] = "ZIP_ER_INVAL"; + Errors2[Errors2["ZIP_ER_NOZIP"] = 19] = "ZIP_ER_NOZIP"; + Errors2[Errors2["ZIP_ER_INTERNAL"] = 20] = "ZIP_ER_INTERNAL"; + Errors2[Errors2["ZIP_ER_INCONS"] = 21] = "ZIP_ER_INCONS"; + Errors2[Errors2["ZIP_ER_REMOVE"] = 22] = "ZIP_ER_REMOVE"; + Errors2[Errors2["ZIP_ER_DELETED"] = 23] = "ZIP_ER_DELETED"; + Errors2[Errors2["ZIP_ER_ENCRNOTSUPP"] = 24] = "ZIP_ER_ENCRNOTSUPP"; + Errors2[Errors2["ZIP_ER_RDONLY"] = 25] = "ZIP_ER_RDONLY"; + Errors2[Errors2["ZIP_ER_NOPASSWD"] = 26] = "ZIP_ER_NOPASSWD"; + Errors2[Errors2["ZIP_ER_WRONGPASSWD"] = 27] = "ZIP_ER_WRONGPASSWD"; + Errors2[Errors2["ZIP_ER_OPNOTSUPP"] = 28] = "ZIP_ER_OPNOTSUPP"; + Errors2[Errors2["ZIP_ER_INUSE"] = 29] = "ZIP_ER_INUSE"; + Errors2[Errors2["ZIP_ER_TELL"] = 30] = "ZIP_ER_TELL"; + Errors2[Errors2["ZIP_ER_COMPRESSED_DATA"] = 31] = "ZIP_ER_COMPRESSED_DATA"; + return Errors2; +})(Errors || {}); +const makeInterface = (emZip) => ({ + get HEAPU8() { + return emZip.HEAPU8; + }, + errors: Errors, + SEEK_SET: 0, + SEEK_CUR: 1, + SEEK_END: 2, + ZIP_CHECKCONS: 4, + ZIP_EXCL: 2, + ZIP_RDONLY: 16, + ZIP_FL_OVERWRITE: 8192, + ZIP_FL_COMPRESSED: 4, + ZIP_OPSYS_DOS: 0, + ZIP_OPSYS_AMIGA: 1, + ZIP_OPSYS_OPENVMS: 2, + ZIP_OPSYS_UNIX: 3, + ZIP_OPSYS_VM_CMS: 4, + ZIP_OPSYS_ATARI_ST: 5, + ZIP_OPSYS_OS_2: 6, + ZIP_OPSYS_MACINTOSH: 7, + ZIP_OPSYS_Z_SYSTEM: 8, + ZIP_OPSYS_CPM: 9, + ZIP_OPSYS_WINDOWS_NTFS: 10, + ZIP_OPSYS_MVS: 11, + ZIP_OPSYS_VSE: 12, + ZIP_OPSYS_ACORN_RISC: 13, + ZIP_OPSYS_VFAT: 14, + ZIP_OPSYS_ALTERNATE_MVS: 15, + ZIP_OPSYS_BEOS: 16, + ZIP_OPSYS_TANDEM: 17, + ZIP_OPSYS_OS_400: 18, + ZIP_OPSYS_OS_X: 19, + ZIP_CM_DEFAULT: -1, + ZIP_CM_STORE: 0, + ZIP_CM_DEFLATE: 8, + uint08S: emZip._malloc(1), + uint32S: emZip._malloc(4), + malloc: emZip._malloc, + free: emZip._free, + getValue: emZip.getValue, + openFromSource: emZip.cwrap(`zip_open_from_source`, `number`, [`number`, `number`, `number`]), + close: emZip.cwrap(`zip_close`, `number`, [`number`]), + discard: emZip.cwrap(`zip_discard`, null, [`number`]), + getError: emZip.cwrap(`zip_get_error`, `number`, [`number`]), + getName: emZip.cwrap(`zip_get_name`, `string`, [`number`, `number`, `number`]), + getNumEntries: emZip.cwrap(`zip_get_num_entries`, `number`, [`number`, `number`]), + delete: emZip.cwrap(`zip_delete`, `number`, [`number`, `number`]), + statIndex: emZip.cwrap(`zip_stat_index`, `number`, [`number`, ...number64, `number`, `number`]), + fopenIndex: emZip.cwrap(`zip_fopen_index`, `number`, [`number`, ...number64, `number`]), + fread: emZip.cwrap(`zip_fread`, `number`, [`number`, `number`, `number`, `number`]), + fclose: emZip.cwrap(`zip_fclose`, `number`, [`number`]), + dir: { + add: emZip.cwrap(`zip_dir_add`, `number`, [`number`, `string`]) + }, + file: { + add: emZip.cwrap(`zip_file_add`, `number`, [`number`, `string`, `number`, `number`]), + getError: emZip.cwrap(`zip_file_get_error`, `number`, [`number`]), + getExternalAttributes: emZip.cwrap(`zip_file_get_external_attributes`, `number`, [`number`, ...number64, `number`, `number`, `number`]), + setExternalAttributes: emZip.cwrap(`zip_file_set_external_attributes`, `number`, [`number`, ...number64, `number`, `number`, `number`]), + setMtime: emZip.cwrap(`zip_file_set_mtime`, `number`, [`number`, ...number64, `number`, `number`]), + setCompression: emZip.cwrap(`zip_set_file_compression`, `number`, [`number`, ...number64, `number`, `number`]) + }, + ext: { + countSymlinks: emZip.cwrap(`zip_ext_count_symlinks`, `number`, [`number`]) + }, + error: { + initWithCode: emZip.cwrap(`zip_error_init_with_code`, null, [`number`, `number`]), + strerror: emZip.cwrap(`zip_error_strerror`, `string`, [`number`]) + }, + name: { + locate: emZip.cwrap(`zip_name_locate`, `number`, [`number`, `string`, `number`]) + }, + source: { + fromUnattachedBuffer: emZip.cwrap(`zip_source_buffer_create`, `number`, [`number`, ...number64, `number`, `number`]), + fromBuffer: emZip.cwrap(`zip_source_buffer`, `number`, [`number`, `number`, ...number64, `number`]), + free: emZip.cwrap(`zip_source_free`, null, [`number`]), + keep: emZip.cwrap(`zip_source_keep`, null, [`number`]), + open: emZip.cwrap(`zip_source_open`, `number`, [`number`]), + close: emZip.cwrap(`zip_source_close`, `number`, [`number`]), + seek: emZip.cwrap(`zip_source_seek`, `number`, [`number`, ...number64, `number`]), + tell: emZip.cwrap(`zip_source_tell`, `number`, [`number`]), + read: emZip.cwrap(`zip_source_read`, `number`, [`number`, `number`, `number`]), + error: emZip.cwrap(`zip_source_error`, `number`, [`number`]) + }, + struct: { + statS: emZip.cwrap(`zipstruct_statS`, `number`, []), + statSize: emZip.cwrap(`zipstruct_stat_size`, `number`, [`number`]), + statCompSize: emZip.cwrap(`zipstruct_stat_comp_size`, `number`, [`number`]), + statCompMethod: emZip.cwrap(`zipstruct_stat_comp_method`, `number`, [`number`]), + statMtime: emZip.cwrap(`zipstruct_stat_mtime`, `number`, [`number`]), + statCrc: emZip.cwrap(`zipstruct_stat_crc`, `number`, [`number`]), + errorS: emZip.cwrap(`zipstruct_errorS`, `number`, []), + errorCodeZip: emZip.cwrap(`zipstruct_error_code_zip`, `number`, [`number`]) + } +}); + +function getArchivePart(path, extension) { + let idx = path.indexOf(extension); + if (idx <= 0) + return null; + let nextCharIdx = idx; + while (idx >= 0) { + nextCharIdx = idx + extension.length; + if (path[nextCharIdx] === ppath.sep) + break; + if (path[idx - 1] === ppath.sep) + return null; + idx = path.indexOf(extension, nextCharIdx); + } + if (path.length > nextCharIdx && path[nextCharIdx] !== ppath.sep) + return null; + return path.slice(0, nextCharIdx); +} +class ZipOpenFS extends MountFS { + static async openPromise(fn, opts) { + const zipOpenFs = new ZipOpenFS(opts); + try { + return await fn(zipOpenFs); + } finally { + zipOpenFs.saveAndClose(); + } + } + constructor(opts = {}) { + const fileExtensions = opts.fileExtensions; + const readOnlyArchives = opts.readOnlyArchives; + const getMountPoint = typeof fileExtensions === `undefined` ? (path) => getArchivePart(path, `.zip`) : (path) => { + for (const extension of fileExtensions) { + const result = getArchivePart(path, extension); + if (result) { + return result; + } + } + return null; + }; + const factorySync = (baseFs, p) => { + return new ZipFS(p, { + baseFs, + readOnly: readOnlyArchives, + stats: baseFs.statSync(p) + }); + }; + const factoryPromise = async (baseFs, p) => { + const zipOptions = { + baseFs, + readOnly: readOnlyArchives, + stats: await baseFs.statPromise(p) + }; + return () => { + return new ZipFS(p, zipOptions); + }; + }; + super({ + ...opts, + factorySync, + factoryPromise, + getMountPoint + }); + } +} + +const DEFAULT_COMPRESSION_LEVEL = `mixed`; +function toUnixTimestamp(time) { + if (typeof time === `string` && String(+time) === time) + return +time; + if (typeof time === `number` && Number.isFinite(time)) { + if (time < 0) { + return Date.now() / 1e3; + } else { + return time; + } + } + if (nodeUtils.types.isDate(time)) + return time.getTime() / 1e3; + throw new Error(`Invalid time`); +} +function makeEmptyArchive() { + return Buffer.from([ + 80, + 75, + 5, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]); +} +class LibzipError extends Error { + constructor(message, code) { + super(message); + this.name = `Libzip Error`; + this.code = code; + } +} +class ZipFS extends BasePortableFakeFS { + constructor(source, opts = {}) { + super(); + this.listings = /* @__PURE__ */ new Map(); + this.entries = /* @__PURE__ */ new Map(); + this.fileSources = /* @__PURE__ */ new Map(); + this.fds = /* @__PURE__ */ new Map(); + this.nextFd = 0; + this.ready = false; + this.readOnly = false; + const pathOptions = opts; + this.level = typeof pathOptions.level !== `undefined` ? pathOptions.level : DEFAULT_COMPRESSION_LEVEL; + source ??= makeEmptyArchive(); + if (typeof source === `string`) { + const { baseFs = new NodeFS() } = pathOptions; + this.baseFs = baseFs; + this.path = source; + } else { + this.path = null; + this.baseFs = null; + } + if (opts.stats) { + this.stats = opts.stats; + } else { + if (typeof source === `string`) { + try { + this.stats = this.baseFs.statSync(source); + } catch (error) { + if (error.code === `ENOENT` && pathOptions.create) { + this.stats = makeDefaultStats(); + } else { + throw error; + } + } + } else { + this.stats = makeDefaultStats(); + } + } + this.libzip = getInstance(); + const errPtr = this.libzip.malloc(4); + try { + let flags = 0; + if (opts.readOnly) { + flags |= this.libzip.ZIP_RDONLY; + this.readOnly = true; + } + if (typeof source === `string`) + source = pathOptions.create ? makeEmptyArchive() : this.baseFs.readFileSync(source); + const lzSource = this.allocateUnattachedSource(source); + try { + this.zip = this.libzip.openFromSource(lzSource, flags, errPtr); + this.lzSource = lzSource; + } catch (error) { + this.libzip.source.free(lzSource); + throw error; + } + if (this.zip === 0) { + const error = this.libzip.struct.errorS(); + this.libzip.error.initWithCode(error, this.libzip.getValue(errPtr, `i32`)); + throw this.makeLibzipError(error); + } + } finally { + this.libzip.free(errPtr); + } + this.listings.set(PortablePath.root, /* @__PURE__ */ new Set()); + const entryCount = this.libzip.getNumEntries(this.zip, 0); + for (let t = 0; t < entryCount; ++t) { + const raw = this.libzip.getName(this.zip, t, 0); + if (ppath.isAbsolute(raw)) + continue; + const p = ppath.resolve(PortablePath.root, raw); + this.registerEntry(p, t); + if (raw.endsWith(`/`)) { + this.registerListing(p); + } + } + this.symlinkCount = this.libzip.ext.countSymlinks(this.zip); + if (this.symlinkCount === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + this.ready = true; + } + makeLibzipError(error) { + const errorCode = this.libzip.struct.errorCodeZip(error); + const strerror = this.libzip.error.strerror(error); + const libzipError = new LibzipError(strerror, this.libzip.errors[errorCode]); + if (errorCode === this.libzip.errors.ZIP_ER_CHANGED) + throw new Error(`Assertion failed: Unexpected libzip error: ${libzipError.message}`); + return libzipError; + } + getExtractHint(hints) { + for (const fileName of this.entries.keys()) { + const ext = this.pathUtils.extname(fileName); + if (hints.relevantExtensions.has(ext)) { + return true; + } + } + return false; + } + getAllFiles() { + return Array.from(this.entries.keys()); + } + getRealPath() { + if (!this.path) + throw new Error(`ZipFS don't have real paths when loaded from a buffer`); + return this.path; + } + prepareClose() { + if (!this.ready) + throw EBUSY(`archive closed, close`); + unwatchAllFiles(this); + } + getBufferAndClose() { + this.prepareClose(); + if (this.entries.size === 0) { + this.discardAndClose(); + return makeEmptyArchive(); + } + try { + this.libzip.source.keep(this.lzSource); + if (this.libzip.close(this.zip) === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + if (this.libzip.source.open(this.lzSource) === -1) + throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); + if (this.libzip.source.seek(this.lzSource, 0, 0, this.libzip.SEEK_END) === -1) + throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); + const size = this.libzip.source.tell(this.lzSource); + if (size === -1) + throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); + if (this.libzip.source.seek(this.lzSource, 0, 0, this.libzip.SEEK_SET) === -1) + throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); + const buffer = this.libzip.malloc(size); + if (!buffer) + throw new Error(`Couldn't allocate enough memory`); + try { + const rc = this.libzip.source.read(this.lzSource, buffer, size); + if (rc === -1) + throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); + else if (rc < size) + throw new Error(`Incomplete read`); + else if (rc > size) + throw new Error(`Overread`); + const memory = this.libzip.HEAPU8.subarray(buffer, buffer + size); + return Buffer.from(memory); + } finally { + this.libzip.free(buffer); + } + } finally { + this.libzip.source.close(this.lzSource); + this.libzip.source.free(this.lzSource); + this.ready = false; + } + } + discardAndClose() { + this.prepareClose(); + this.libzip.discard(this.zip); + this.ready = false; + } + saveAndClose() { + if (!this.path || !this.baseFs) + throw new Error(`ZipFS cannot be saved and must be discarded when loaded from a buffer`); + if (this.readOnly) { + this.discardAndClose(); + return; + } + const newMode = this.baseFs.existsSync(this.path) || this.stats.mode === DEFAULT_MODE ? void 0 : this.stats.mode; + this.baseFs.writeFileSync(this.path, this.getBufferAndClose(), { mode: newMode }); + this.ready = false; + } + resolve(p) { + return ppath.resolve(PortablePath.root, p); + } + async openPromise(p, flags, mode) { + return this.openSync(p, flags, mode); + } + openSync(p, flags, mode) { + const fd = this.nextFd++; + this.fds.set(fd, { cursor: 0, p }); + return fd; + } + hasOpenFileHandles() { + return !!this.fds.size; + } + async opendirPromise(p, opts) { + return this.opendirSync(p, opts); + } + opendirSync(p, opts = {}) { + const resolvedP = this.resolveFilename(`opendir '${p}'`, p); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`opendir '${p}'`); + const directoryListing = this.listings.get(resolvedP); + if (!directoryListing) + throw ENOTDIR(`opendir '${p}'`); + const entries = [...directoryListing]; + const fd = this.openSync(resolvedP, `r`); + const onClose = () => { + this.closeSync(fd); + }; + return opendir(this, resolvedP, entries, { onClose }); + } + async readPromise(fd, buffer, offset, length, position) { + return this.readSync(fd, buffer, offset, length, position); + } + readSync(fd, buffer, offset = 0, length = buffer.byteLength, position = -1) { + const entry = this.fds.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`read`); + const realPosition = position === -1 || position === null ? entry.cursor : position; + const source = this.readFileSync(entry.p); + source.copy(buffer, offset, realPosition, realPosition + length); + const bytesRead = Math.max(0, Math.min(source.length - realPosition, length)); + if (position === -1 || position === null) + entry.cursor += bytesRead; + return bytesRead; + } + async writePromise(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return this.writeSync(fd, buffer, position); + } else { + return this.writeSync(fd, buffer, offset, length, position); + } + } + writeSync(fd, buffer, offset, length, position) { + const entry = this.fds.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`read`); + throw new Error(`Unimplemented`); + } + async closePromise(fd) { + return this.closeSync(fd); + } + closeSync(fd) { + const entry = this.fds.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`read`); + this.fds.delete(fd); + } + createReadStream(p, { encoding } = {}) { + if (p === null) + throw new Error(`Unimplemented`); + const fd = this.openSync(p, `r`); + const stream$1 = Object.assign( + new stream.PassThrough({ + emitClose: true, + autoDestroy: true, + destroy: (error, callback) => { + clearImmediate(immediate); + this.closeSync(fd); + callback(error); + } + }), + { + close() { + stream$1.destroy(); + }, + bytesRead: 0, + path: p, + pending: false + } + ); + const immediate = setImmediate(async () => { + try { + const data = await this.readFilePromise(p, encoding); + stream$1.bytesRead = data.length; + stream$1.end(data); + } catch (error) { + stream$1.destroy(error); + } + }); + return stream$1; + } + createWriteStream(p, { encoding } = {}) { + if (this.readOnly) + throw EROFS(`open '${p}'`); + if (p === null) + throw new Error(`Unimplemented`); + const chunks = []; + const fd = this.openSync(p, `w`); + const stream$1 = Object.assign( + new stream.PassThrough({ + autoDestroy: true, + emitClose: true, + destroy: (error, callback) => { + try { + if (error) { + callback(error); + } else { + this.writeFileSync(p, Buffer.concat(chunks), encoding); + callback(null); + } + } catch (err) { + callback(err); + } finally { + this.closeSync(fd); + } + } + }), + { + close() { + stream$1.destroy(); + }, + bytesWritten: 0, + path: p, + pending: false + } + ); + stream$1.on(`data`, (chunk) => { + const chunkBuffer = Buffer.from(chunk); + stream$1.bytesWritten += chunkBuffer.length; + chunks.push(chunkBuffer); + }); + return stream$1; + } + async realpathPromise(p) { + return this.realpathSync(p); + } + realpathSync(p) { + const resolvedP = this.resolveFilename(`lstat '${p}'`, p); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`lstat '${p}'`); + return resolvedP; + } + async existsPromise(p) { + return this.existsSync(p); + } + existsSync(p) { + if (!this.ready) + throw EBUSY(`archive closed, existsSync '${p}'`); + if (this.symlinkCount === 0) { + const resolvedP2 = ppath.resolve(PortablePath.root, p); + return this.entries.has(resolvedP2) || this.listings.has(resolvedP2); + } + let resolvedP; + try { + resolvedP = this.resolveFilename(`stat '${p}'`, p, void 0, false); + } catch (error) { + return false; + } + if (resolvedP === void 0) + return false; + return this.entries.has(resolvedP) || this.listings.has(resolvedP); + } + async accessPromise(p, mode) { + return this.accessSync(p, mode); + } + accessSync(p, mode = fs.constants.F_OK) { + const resolvedP = this.resolveFilename(`access '${p}'`, p); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`access '${p}'`); + if (this.readOnly && mode & fs.constants.W_OK) { + throw EROFS(`access '${p}'`); + } + } + async statPromise(p, opts = { bigint: false }) { + if (opts.bigint) + return this.statSync(p, { bigint: true }); + return this.statSync(p); + } + statSync(p, opts = { bigint: false, throwIfNoEntry: true }) { + const resolvedP = this.resolveFilename(`stat '${p}'`, p, void 0, opts.throwIfNoEntry); + if (resolvedP === void 0) + return void 0; + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) { + if (opts.throwIfNoEntry === false) + return void 0; + throw ENOENT(`stat '${p}'`); + } + if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) + throw ENOTDIR(`stat '${p}'`); + return this.statImpl(`stat '${p}'`, resolvedP, opts); + } + async fstatPromise(fd, opts) { + return this.fstatSync(fd, opts); + } + fstatSync(fd, opts) { + const entry = this.fds.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fstatSync`); + const { p } = entry; + const resolvedP = this.resolveFilename(`stat '${p}'`, p); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`stat '${p}'`); + if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) + throw ENOTDIR(`stat '${p}'`); + return this.statImpl(`fstat '${p}'`, resolvedP, opts); + } + async lstatPromise(p, opts = { bigint: false }) { + if (opts.bigint) + return this.lstatSync(p, { bigint: true }); + return this.lstatSync(p); + } + lstatSync(p, opts = { bigint: false, throwIfNoEntry: true }) { + const resolvedP = this.resolveFilename(`lstat '${p}'`, p, false, opts.throwIfNoEntry); + if (resolvedP === void 0) + return void 0; + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) { + if (opts.throwIfNoEntry === false) + return void 0; + throw ENOENT(`lstat '${p}'`); + } + if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) + throw ENOTDIR(`lstat '${p}'`); + return this.statImpl(`lstat '${p}'`, resolvedP, opts); + } + statImpl(reason, p, opts = {}) { + const entry = this.entries.get(p); + if (typeof entry !== `undefined`) { + const stat = this.libzip.struct.statS(); + const rc = this.libzip.statIndex(this.zip, entry, 0, 0, stat); + if (rc === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + const uid = this.stats.uid; + const gid = this.stats.gid; + const size = this.libzip.struct.statSize(stat) >>> 0; + const blksize = 512; + const blocks = Math.ceil(size / blksize); + const mtimeMs = (this.libzip.struct.statMtime(stat) >>> 0) * 1e3; + const atimeMs = mtimeMs; + const birthtimeMs = mtimeMs; + const ctimeMs = mtimeMs; + const atime = new Date(atimeMs); + const birthtime = new Date(birthtimeMs); + const ctime = new Date(ctimeMs); + const mtime = new Date(mtimeMs); + const type = this.listings.has(p) ? fs.constants.S_IFDIR : this.isSymbolicLink(entry) ? fs.constants.S_IFLNK : fs.constants.S_IFREG; + const defaultMode = type === fs.constants.S_IFDIR ? 493 : 420; + const mode = type | this.getUnixMode(entry, defaultMode) & 511; + const crc = this.libzip.struct.statCrc(stat); + const statInstance = Object.assign(new StatEntry(), { uid, gid, size, blksize, blocks, atime, birthtime, ctime, mtime, atimeMs, birthtimeMs, ctimeMs, mtimeMs, mode, crc }); + return opts.bigint === true ? convertToBigIntStats(statInstance) : statInstance; + } + if (this.listings.has(p)) { + const uid = this.stats.uid; + const gid = this.stats.gid; + const size = 0; + const blksize = 512; + const blocks = 0; + const atimeMs = this.stats.mtimeMs; + const birthtimeMs = this.stats.mtimeMs; + const ctimeMs = this.stats.mtimeMs; + const mtimeMs = this.stats.mtimeMs; + const atime = new Date(atimeMs); + const birthtime = new Date(birthtimeMs); + const ctime = new Date(ctimeMs); + const mtime = new Date(mtimeMs); + const mode = fs.constants.S_IFDIR | 493; + const crc = 0; + const statInstance = Object.assign(new StatEntry(), { uid, gid, size, blksize, blocks, atime, birthtime, ctime, mtime, atimeMs, birthtimeMs, ctimeMs, mtimeMs, mode, crc }); + return opts.bigint === true ? convertToBigIntStats(statInstance) : statInstance; + } + throw new Error(`Unreachable`); + } + getUnixMode(index, defaultMode) { + const rc = this.libzip.file.getExternalAttributes(this.zip, index, 0, 0, this.libzip.uint08S, this.libzip.uint32S); + if (rc === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + const opsys = this.libzip.getValue(this.libzip.uint08S, `i8`) >>> 0; + if (opsys !== this.libzip.ZIP_OPSYS_UNIX) + return defaultMode; + return this.libzip.getValue(this.libzip.uint32S, `i32`) >>> 16; + } + registerListing(p) { + const existingListing = this.listings.get(p); + if (existingListing) + return existingListing; + const parentListing = this.registerListing(ppath.dirname(p)); + parentListing.add(ppath.basename(p)); + const newListing = /* @__PURE__ */ new Set(); + this.listings.set(p, newListing); + return newListing; + } + registerEntry(p, index) { + const parentListing = this.registerListing(ppath.dirname(p)); + parentListing.add(ppath.basename(p)); + this.entries.set(p, index); + } + unregisterListing(p) { + this.listings.delete(p); + const parentListing = this.listings.get(ppath.dirname(p)); + parentListing?.delete(ppath.basename(p)); + } + unregisterEntry(p) { + this.unregisterListing(p); + const entry = this.entries.get(p); + this.entries.delete(p); + if (typeof entry === `undefined`) + return; + this.fileSources.delete(entry); + if (this.isSymbolicLink(entry)) { + this.symlinkCount--; + } + } + deleteEntry(p, index) { + this.unregisterEntry(p); + const rc = this.libzip.delete(this.zip, index); + if (rc === -1) { + throw this.makeLibzipError(this.libzip.getError(this.zip)); + } + } + resolveFilename(reason, p, resolveLastComponent = true, throwIfNoEntry = true) { + if (!this.ready) + throw EBUSY(`archive closed, ${reason}`); + let resolvedP = ppath.resolve(PortablePath.root, p); + if (resolvedP === `/`) + return PortablePath.root; + const fileIndex = this.entries.get(resolvedP); + if (resolveLastComponent && fileIndex !== void 0) { + if (this.symlinkCount !== 0 && this.isSymbolicLink(fileIndex)) { + const target = this.getFileSource(fileIndex).toString(); + return this.resolveFilename(reason, ppath.resolve(ppath.dirname(resolvedP), target), true, throwIfNoEntry); + } else { + return resolvedP; + } + } + while (true) { + const parentP = this.resolveFilename(reason, ppath.dirname(resolvedP), true, throwIfNoEntry); + if (parentP === void 0) + return parentP; + const isDir = this.listings.has(parentP); + const doesExist = this.entries.has(parentP); + if (!isDir && !doesExist) { + if (throwIfNoEntry === false) + return void 0; + throw ENOENT(reason); + } + if (!isDir) + throw ENOTDIR(reason); + resolvedP = ppath.resolve(parentP, ppath.basename(resolvedP)); + if (!resolveLastComponent || this.symlinkCount === 0) + break; + const index = this.libzip.name.locate(this.zip, resolvedP.slice(1), 0); + if (index === -1) + break; + if (this.isSymbolicLink(index)) { + const target = this.getFileSource(index).toString(); + resolvedP = ppath.resolve(ppath.dirname(resolvedP), target); + } else { + break; + } + } + return resolvedP; + } + allocateBuffer(content) { + if (!Buffer.isBuffer(content)) + content = Buffer.from(content); + const buffer = this.libzip.malloc(content.byteLength); + if (!buffer) + throw new Error(`Couldn't allocate enough memory`); + const heap = new Uint8Array(this.libzip.HEAPU8.buffer, buffer, content.byteLength); + heap.set(content); + return { buffer, byteLength: content.byteLength }; + } + allocateUnattachedSource(content) { + const error = this.libzip.struct.errorS(); + const { buffer, byteLength } = this.allocateBuffer(content); + const source = this.libzip.source.fromUnattachedBuffer(buffer, byteLength, 0, 1, error); + if (source === 0) { + this.libzip.free(error); + throw this.makeLibzipError(error); + } + return source; + } + allocateSource(content) { + const { buffer, byteLength } = this.allocateBuffer(content); + const source = this.libzip.source.fromBuffer(this.zip, buffer, byteLength, 0, 1); + if (source === 0) { + this.libzip.free(buffer); + throw this.makeLibzipError(this.libzip.getError(this.zip)); + } + return source; + } + setFileSource(p, content) { + const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content); + const target = ppath.relative(PortablePath.root, p); + const lzSource = this.allocateSource(content); + try { + const newIndex = this.libzip.file.add(this.zip, target, lzSource, this.libzip.ZIP_FL_OVERWRITE); + if (newIndex === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + if (this.level !== `mixed`) { + const method = this.level === 0 ? this.libzip.ZIP_CM_STORE : this.libzip.ZIP_CM_DEFLATE; + const rc = this.libzip.file.setCompression(this.zip, newIndex, 0, method, this.level); + if (rc === -1) { + throw this.makeLibzipError(this.libzip.getError(this.zip)); + } + } + this.fileSources.set(newIndex, buffer); + return newIndex; + } catch (error) { + this.libzip.source.free(lzSource); + throw error; + } + } + isSymbolicLink(index) { + if (this.symlinkCount === 0) + return false; + const attrs = this.libzip.file.getExternalAttributes(this.zip, index, 0, 0, this.libzip.uint08S, this.libzip.uint32S); + if (attrs === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + const opsys = this.libzip.getValue(this.libzip.uint08S, `i8`) >>> 0; + if (opsys !== this.libzip.ZIP_OPSYS_UNIX) + return false; + const attributes = this.libzip.getValue(this.libzip.uint32S, `i32`) >>> 16; + return (attributes & fs.constants.S_IFMT) === fs.constants.S_IFLNK; + } + getFileSource(index, opts = { asyncDecompress: false }) { + const cachedFileSource = this.fileSources.get(index); + if (typeof cachedFileSource !== `undefined`) + return cachedFileSource; + const stat = this.libzip.struct.statS(); + const rc = this.libzip.statIndex(this.zip, index, 0, 0, stat); + if (rc === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + const size = this.libzip.struct.statCompSize(stat); + const compressionMethod = this.libzip.struct.statCompMethod(stat); + const buffer = this.libzip.malloc(size); + try { + const file = this.libzip.fopenIndex(this.zip, index, 0, this.libzip.ZIP_FL_COMPRESSED); + if (file === 0) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + try { + const rc2 = this.libzip.fread(file, buffer, size, 0); + if (rc2 === -1) + throw this.makeLibzipError(this.libzip.file.getError(file)); + else if (rc2 < size) + throw new Error(`Incomplete read`); + else if (rc2 > size) + throw new Error(`Overread`); + const memory = this.libzip.HEAPU8.subarray(buffer, buffer + size); + const data = Buffer.from(memory); + if (compressionMethod === 0) { + this.fileSources.set(index, data); + return data; + } else if (opts.asyncDecompress) { + return new Promise((resolve, reject) => { + zlib__default.default.inflateRaw(data, (error, result) => { + if (error) { + reject(error); + } else { + this.fileSources.set(index, result); + resolve(result); + } + }); + }); + } else { + const decompressedData = zlib__default.default.inflateRawSync(data); + this.fileSources.set(index, decompressedData); + return decompressedData; + } + } finally { + this.libzip.fclose(file); + } + } finally { + this.libzip.free(buffer); + } + } + async fchmodPromise(fd, mask) { + return this.chmodPromise(this.fdToPath(fd, `fchmod`), mask); + } + fchmodSync(fd, mask) { + return this.chmodSync(this.fdToPath(fd, `fchmodSync`), mask); + } + async chmodPromise(p, mask) { + return this.chmodSync(p, mask); + } + chmodSync(p, mask) { + if (this.readOnly) + throw EROFS(`chmod '${p}'`); + mask &= 493; + const resolvedP = this.resolveFilename(`chmod '${p}'`, p, false); + const entry = this.entries.get(resolvedP); + if (typeof entry === `undefined`) + throw new Error(`Assertion failed: The entry should have been registered (${resolvedP})`); + const oldMod = this.getUnixMode(entry, fs.constants.S_IFREG | 0); + const newMod = oldMod & ~511 | mask; + const rc = this.libzip.file.setExternalAttributes(this.zip, entry, 0, 0, this.libzip.ZIP_OPSYS_UNIX, newMod << 16); + if (rc === -1) { + throw this.makeLibzipError(this.libzip.getError(this.zip)); + } + } + async fchownPromise(fd, uid, gid) { + return this.chownPromise(this.fdToPath(fd, `fchown`), uid, gid); + } + fchownSync(fd, uid, gid) { + return this.chownSync(this.fdToPath(fd, `fchownSync`), uid, gid); + } + async chownPromise(p, uid, gid) { + return this.chownSync(p, uid, gid); + } + chownSync(p, uid, gid) { + throw new Error(`Unimplemented`); + } + async renamePromise(oldP, newP) { + return this.renameSync(oldP, newP); + } + renameSync(oldP, newP) { + throw new Error(`Unimplemented`); + } + async copyFilePromise(sourceP, destP, flags) { + const { indexSource, indexDest, resolvedDestP } = this.prepareCopyFile(sourceP, destP, flags); + const source = await this.getFileSource(indexSource, { asyncDecompress: true }); + const newIndex = this.setFileSource(resolvedDestP, source); + if (newIndex !== indexDest) { + this.registerEntry(resolvedDestP, newIndex); + } + } + copyFileSync(sourceP, destP, flags = 0) { + const { indexSource, indexDest, resolvedDestP } = this.prepareCopyFile(sourceP, destP, flags); + const source = this.getFileSource(indexSource); + const newIndex = this.setFileSource(resolvedDestP, source); + if (newIndex !== indexDest) { + this.registerEntry(resolvedDestP, newIndex); + } + } + prepareCopyFile(sourceP, destP, flags = 0) { + if (this.readOnly) + throw EROFS(`copyfile '${sourceP} -> '${destP}'`); + if ((flags & fs.constants.COPYFILE_FICLONE_FORCE) !== 0) + throw ENOSYS(`unsupported clone operation`, `copyfile '${sourceP}' -> ${destP}'`); + const resolvedSourceP = this.resolveFilename(`copyfile '${sourceP} -> ${destP}'`, sourceP); + const indexSource = this.entries.get(resolvedSourceP); + if (typeof indexSource === `undefined`) + throw EINVAL(`copyfile '${sourceP}' -> '${destP}'`); + const resolvedDestP = this.resolveFilename(`copyfile '${sourceP}' -> ${destP}'`, destP); + const indexDest = this.entries.get(resolvedDestP); + if ((flags & (fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE_FORCE)) !== 0 && typeof indexDest !== `undefined`) + throw EEXIST(`copyfile '${sourceP}' -> '${destP}'`); + return { + indexSource, + resolvedDestP, + indexDest + }; + } + async appendFilePromise(p, content, opts) { + if (this.readOnly) + throw EROFS(`open '${p}'`); + if (typeof opts === `undefined`) + opts = { flag: `a` }; + else if (typeof opts === `string`) + opts = { flag: `a`, encoding: opts }; + else if (typeof opts.flag === `undefined`) + opts = { flag: `a`, ...opts }; + return this.writeFilePromise(p, content, opts); + } + appendFileSync(p, content, opts = {}) { + if (this.readOnly) + throw EROFS(`open '${p}'`); + if (typeof opts === `undefined`) + opts = { flag: `a` }; + else if (typeof opts === `string`) + opts = { flag: `a`, encoding: opts }; + else if (typeof opts.flag === `undefined`) + opts = { flag: `a`, ...opts }; + return this.writeFileSync(p, content, opts); + } + fdToPath(fd, reason) { + const path = this.fds.get(fd)?.p; + if (typeof path === `undefined`) + throw EBADF(reason); + return path; + } + async writeFilePromise(p, content, opts) { + const { encoding, mode, index, resolvedP } = this.prepareWriteFile(p, opts); + if (index !== void 0 && typeof opts === `object` && opts.flag && opts.flag.includes(`a`)) + content = Buffer.concat([await this.getFileSource(index, { asyncDecompress: true }), Buffer.from(content)]); + if (encoding !== null) + content = content.toString(encoding); + const newIndex = this.setFileSource(resolvedP, content); + if (newIndex !== index) + this.registerEntry(resolvedP, newIndex); + if (mode !== null) { + await this.chmodPromise(resolvedP, mode); + } + } + writeFileSync(p, content, opts) { + const { encoding, mode, index, resolvedP } = this.prepareWriteFile(p, opts); + if (index !== void 0 && typeof opts === `object` && opts.flag && opts.flag.includes(`a`)) + content = Buffer.concat([this.getFileSource(index), Buffer.from(content)]); + if (encoding !== null) + content = content.toString(encoding); + const newIndex = this.setFileSource(resolvedP, content); + if (newIndex !== index) + this.registerEntry(resolvedP, newIndex); + if (mode !== null) { + this.chmodSync(resolvedP, mode); + } + } + prepareWriteFile(p, opts) { + if (typeof p === `number`) + p = this.fdToPath(p, `read`); + if (this.readOnly) + throw EROFS(`open '${p}'`); + const resolvedP = this.resolveFilename(`open '${p}'`, p); + if (this.listings.has(resolvedP)) + throw EISDIR(`open '${p}'`); + let encoding = null, mode = null; + if (typeof opts === `string`) { + encoding = opts; + } else if (typeof opts === `object`) { + ({ + encoding = null, + mode = null + } = opts); + } + const index = this.entries.get(resolvedP); + return { + encoding, + mode, + resolvedP, + index + }; + } + async unlinkPromise(p) { + return this.unlinkSync(p); + } + unlinkSync(p) { + if (this.readOnly) + throw EROFS(`unlink '${p}'`); + const resolvedP = this.resolveFilename(`unlink '${p}'`, p); + if (this.listings.has(resolvedP)) + throw EISDIR(`unlink '${p}'`); + const index = this.entries.get(resolvedP); + if (typeof index === `undefined`) + throw EINVAL(`unlink '${p}'`); + this.deleteEntry(resolvedP, index); + } + async utimesPromise(p, atime, mtime) { + return this.utimesSync(p, atime, mtime); + } + utimesSync(p, atime, mtime) { + if (this.readOnly) + throw EROFS(`utimes '${p}'`); + const resolvedP = this.resolveFilename(`utimes '${p}'`, p); + this.utimesImpl(resolvedP, mtime); + } + async lutimesPromise(p, atime, mtime) { + return this.lutimesSync(p, atime, mtime); + } + lutimesSync(p, atime, mtime) { + if (this.readOnly) + throw EROFS(`lutimes '${p}'`); + const resolvedP = this.resolveFilename(`utimes '${p}'`, p, false); + this.utimesImpl(resolvedP, mtime); + } + utimesImpl(resolvedP, mtime) { + if (this.listings.has(resolvedP)) { + if (!this.entries.has(resolvedP)) + this.hydrateDirectory(resolvedP); + } + const entry = this.entries.get(resolvedP); + if (entry === void 0) + throw new Error(`Unreachable`); + const rc = this.libzip.file.setMtime(this.zip, entry, 0, toUnixTimestamp(mtime), 0); + if (rc === -1) { + throw this.makeLibzipError(this.libzip.getError(this.zip)); + } + } + async mkdirPromise(p, opts) { + return this.mkdirSync(p, opts); + } + mkdirSync(p, { mode = 493, recursive = false } = {}) { + if (recursive) + return this.mkdirpSync(p, { chmod: mode }); + if (this.readOnly) + throw EROFS(`mkdir '${p}'`); + const resolvedP = this.resolveFilename(`mkdir '${p}'`, p); + if (this.entries.has(resolvedP) || this.listings.has(resolvedP)) + throw EEXIST(`mkdir '${p}'`); + this.hydrateDirectory(resolvedP); + this.chmodSync(resolvedP, mode); + return void 0; + } + async rmdirPromise(p, opts) { + return this.rmdirSync(p, opts); + } + rmdirSync(p, { recursive = false } = {}) { + if (this.readOnly) + throw EROFS(`rmdir '${p}'`); + if (recursive) { + this.removeSync(p); + return; + } + const resolvedP = this.resolveFilename(`rmdir '${p}'`, p); + const directoryListing = this.listings.get(resolvedP); + if (!directoryListing) + throw ENOTDIR(`rmdir '${p}'`); + if (directoryListing.size > 0) + throw ENOTEMPTY(`rmdir '${p}'`); + const index = this.entries.get(resolvedP); + if (typeof index === `undefined`) + throw EINVAL(`rmdir '${p}'`); + this.deleteEntry(p, index); + } + hydrateDirectory(resolvedP) { + const index = this.libzip.dir.add(this.zip, ppath.relative(PortablePath.root, resolvedP)); + if (index === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + this.registerListing(resolvedP); + this.registerEntry(resolvedP, index); + return index; + } + async linkPromise(existingP, newP) { + return this.linkSync(existingP, newP); + } + linkSync(existingP, newP) { + throw EOPNOTSUPP(`link '${existingP}' -> '${newP}'`); + } + async symlinkPromise(target, p) { + return this.symlinkSync(target, p); + } + symlinkSync(target, p) { + if (this.readOnly) + throw EROFS(`symlink '${target}' -> '${p}'`); + const resolvedP = this.resolveFilename(`symlink '${target}' -> '${p}'`, p); + if (this.listings.has(resolvedP)) + throw EISDIR(`symlink '${target}' -> '${p}'`); + if (this.entries.has(resolvedP)) + throw EEXIST(`symlink '${target}' -> '${p}'`); + const index = this.setFileSource(resolvedP, target); + this.registerEntry(resolvedP, index); + const rc = this.libzip.file.setExternalAttributes(this.zip, index, 0, 0, this.libzip.ZIP_OPSYS_UNIX, (fs.constants.S_IFLNK | 511) << 16); + if (rc === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + this.symlinkCount += 1; + } + async readFilePromise(p, encoding) { + if (typeof encoding === `object`) + encoding = encoding ? encoding.encoding : void 0; + const data = await this.readFileBuffer(p, { asyncDecompress: true }); + return encoding ? data.toString(encoding) : data; + } + readFileSync(p, encoding) { + if (typeof encoding === `object`) + encoding = encoding ? encoding.encoding : void 0; + const data = this.readFileBuffer(p); + return encoding ? data.toString(encoding) : data; + } + readFileBuffer(p, opts = { asyncDecompress: false }) { + if (typeof p === `number`) + p = this.fdToPath(p, `read`); + const resolvedP = this.resolveFilename(`open '${p}'`, p); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`open '${p}'`); + if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) + throw ENOTDIR(`open '${p}'`); + if (this.listings.has(resolvedP)) + throw EISDIR(`read`); + const entry = this.entries.get(resolvedP); + if (entry === void 0) + throw new Error(`Unreachable`); + return this.getFileSource(entry, opts); + } + async readdirPromise(p, opts) { + return this.readdirSync(p, opts); + } + readdirSync(p, opts) { + const resolvedP = this.resolveFilename(`scandir '${p}'`, p); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`scandir '${p}'`); + const directoryListing = this.listings.get(resolvedP); + if (!directoryListing) + throw ENOTDIR(`scandir '${p}'`); + if (opts?.recursive) { + if (opts?.withFileTypes) { + const entries = Array.from(directoryListing, (name) => { + return Object.assign(this.statImpl(`lstat`, ppath.join(p, name)), { + name, + path: PortablePath.dot + }); + }); + for (const entry of entries) { + if (!entry.isDirectory()) + continue; + const subPath = ppath.join(entry.path, entry.name); + const subListing = this.listings.get(ppath.join(resolvedP, subPath)); + for (const child of subListing) { + entries.push(Object.assign(this.statImpl(`lstat`, ppath.join(p, subPath, child)), { + name: child, + path: subPath + })); + } + } + return entries; + } else { + const entries = [...directoryListing]; + for (const subPath of entries) { + const subListing = this.listings.get(ppath.join(resolvedP, subPath)); + if (typeof subListing === `undefined`) + continue; + for (const child of subListing) { + entries.push(ppath.join(subPath, child)); + } + } + return entries; + } + } else if (opts?.withFileTypes) { + return Array.from(directoryListing, (name) => { + return Object.assign(this.statImpl(`lstat`, ppath.join(p, name)), { + name, + path: void 0 + }); + }); + } else { + return [...directoryListing]; + } + } + async readlinkPromise(p) { + const entry = this.prepareReadlink(p); + return (await this.getFileSource(entry, { asyncDecompress: true })).toString(); + } + readlinkSync(p) { + const entry = this.prepareReadlink(p); + return this.getFileSource(entry).toString(); + } + prepareReadlink(p) { + const resolvedP = this.resolveFilename(`readlink '${p}'`, p, false); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`readlink '${p}'`); + if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) + throw ENOTDIR(`open '${p}'`); + if (this.listings.has(resolvedP)) + throw EINVAL(`readlink '${p}'`); + const entry = this.entries.get(resolvedP); + if (entry === void 0) + throw new Error(`Unreachable`); + if (!this.isSymbolicLink(entry)) + throw EINVAL(`readlink '${p}'`); + return entry; + } + async truncatePromise(p, len = 0) { + const resolvedP = this.resolveFilename(`open '${p}'`, p); + const index = this.entries.get(resolvedP); + if (typeof index === `undefined`) + throw EINVAL(`open '${p}'`); + const source = await this.getFileSource(index, { asyncDecompress: true }); + const truncated = Buffer.alloc(len, 0); + source.copy(truncated); + return await this.writeFilePromise(p, truncated); + } + truncateSync(p, len = 0) { + const resolvedP = this.resolveFilename(`open '${p}'`, p); + const index = this.entries.get(resolvedP); + if (typeof index === `undefined`) + throw EINVAL(`open '${p}'`); + const source = this.getFileSource(index); + const truncated = Buffer.alloc(len, 0); + source.copy(truncated); + return this.writeFileSync(p, truncated); + } + async ftruncatePromise(fd, len) { + return this.truncatePromise(this.fdToPath(fd, `ftruncate`), len); + } + ftruncateSync(fd, len) { + return this.truncateSync(this.fdToPath(fd, `ftruncateSync`), len); + } + watch(p, a, b) { + let persistent; + switch (typeof a) { + case `function`: + case `string`: + case `undefined`: + { + persistent = true; + } + break; + default: + { + ({ persistent = true } = a); + } + break; + } + if (!persistent) + return { on: () => { + }, close: () => { + } }; + const interval = setInterval(() => { + }, 24 * 60 * 60 * 1e3); + return { on: () => { + }, close: () => { + clearInterval(interval); + } }; + } + watchFile(p, a, b) { + const resolvedP = ppath.resolve(PortablePath.root, p); + return watchFile(this, resolvedP, a, b); + } + unwatchFile(p, cb) { + const resolvedP = ppath.resolve(PortablePath.root, p); + return unwatchFile(this, resolvedP, cb); + } +} + +setFactory(() => { + const emZip = createModule(); + return makeInterface(emZip); +}); + +var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => { + ErrorCode2["API_ERROR"] = `API_ERROR`; + ErrorCode2["BUILTIN_NODE_RESOLUTION_FAILED"] = `BUILTIN_NODE_RESOLUTION_FAILED`; + ErrorCode2["EXPORTS_RESOLUTION_FAILED"] = `EXPORTS_RESOLUTION_FAILED`; + ErrorCode2["MISSING_DEPENDENCY"] = `MISSING_DEPENDENCY`; + ErrorCode2["MISSING_PEER_DEPENDENCY"] = `MISSING_PEER_DEPENDENCY`; + ErrorCode2["QUALIFIED_PATH_RESOLUTION_FAILED"] = `QUALIFIED_PATH_RESOLUTION_FAILED`; + ErrorCode2["INTERNAL"] = `INTERNAL`; + ErrorCode2["UNDECLARED_DEPENDENCY"] = `UNDECLARED_DEPENDENCY`; + ErrorCode2["UNSUPPORTED"] = `UNSUPPORTED`; + return ErrorCode2; +})(ErrorCode || {}); +const MODULE_NOT_FOUND_ERRORS = /* @__PURE__ */ new Set([ + "BUILTIN_NODE_RESOLUTION_FAILED" /* BUILTIN_NODE_RESOLUTION_FAILED */, + "MISSING_DEPENDENCY" /* MISSING_DEPENDENCY */, + "MISSING_PEER_DEPENDENCY" /* MISSING_PEER_DEPENDENCY */, + "QUALIFIED_PATH_RESOLUTION_FAILED" /* QUALIFIED_PATH_RESOLUTION_FAILED */, + "UNDECLARED_DEPENDENCY" /* UNDECLARED_DEPENDENCY */ +]); +function makeError(pnpCode, message, data = {}, code) { + code ??= MODULE_NOT_FOUND_ERRORS.has(pnpCode) ? `MODULE_NOT_FOUND` : pnpCode; + const propertySpec = { + configurable: true, + writable: true, + enumerable: false + }; + return Object.defineProperties(new Error(message), { + code: { + ...propertySpec, + value: code + }, + pnpCode: { + ...propertySpec, + value: pnpCode + }, + data: { + ...propertySpec, + value: data + } + }); +} +function getIssuerModule(parent) { + let issuer = parent; + while (issuer && (issuer.id === `[eval]` || issuer.id === `` || !issuer.filename)) + issuer = issuer.parent; + return issuer || null; +} +function getPathForDisplay(p) { + return npath.normalize(npath.fromPortablePath(p)); +} + +const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10)); +const WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2 || major === 18 && minor >= 13; + +function readPackageScope(checkPath) { + const rootSeparatorIndex = checkPath.indexOf(npath.sep); + let separatorIndex; + do { + separatorIndex = checkPath.lastIndexOf(npath.sep); + checkPath = checkPath.slice(0, separatorIndex); + if (checkPath.endsWith(`${npath.sep}node_modules`)) + return false; + const pjson = readPackage(checkPath + npath.sep); + if (pjson) { + return { + data: pjson, + path: checkPath + }; + } + } while (separatorIndex > rootSeparatorIndex); + return false; +} +function readPackage(requestPath) { + const jsonPath = npath.resolve(requestPath, `package.json`); + if (!fs__default.default.existsSync(jsonPath)) + return null; + return JSON.parse(fs__default.default.readFileSync(jsonPath, `utf8`)); +} +function ERR_REQUIRE_ESM(filename, parentPath = null) { + const basename = parentPath && path__default.default.basename(filename) === path__default.default.basename(parentPath) ? filename : path__default.default.basename(filename); + const msg = `require() of ES Module ${filename}${parentPath ? ` from ${parentPath}` : ``} not supported. +Instead change the require of ${basename} in ${parentPath} to a dynamic import() which is available in all CommonJS modules.`; + const err = new Error(msg); + err.code = `ERR_REQUIRE_ESM`; + return err; +} +function reportRequiredFilesToWatchMode(files) { + if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) { + files = files.map((filename) => npath.fromPortablePath(VirtualFS.resolveVirtual(npath.toPortablePath(filename)))); + if (WATCH_MODE_MESSAGE_USES_ARRAYS) { + process.send({ "watch:require": files }); + } else { + for (const filename of files) { + process.send({ "watch:require": filename }); + } + } + } +} + +function applyPatch(pnpapi, opts) { + let enableNativeHooks = true; + process.versions.pnp = String(pnpapi.VERSIONS.std); + const moduleExports = require$$0__default.default; + moduleExports.findPnpApi = (lookupSource) => { + const lookupPath = lookupSource instanceof url.URL ? url.fileURLToPath(lookupSource) : lookupSource; + const apiPath = opts.manager.findApiPathFor(lookupPath); + if (apiPath === null) + return null; + const apiEntry = opts.manager.getApiEntry(apiPath, true); + return apiEntry.instance.findPackageLocator(lookupPath) ? apiEntry.instance : null; + }; + function getRequireStack(parent) { + const requireStack = []; + for (let cursor = parent; cursor; cursor = cursor.parent) + requireStack.push(cursor.filename || cursor.id); + return requireStack; + } + const originalModuleLoad = require$$0.Module._load; + require$$0.Module._load = function(request, parent, isMain) { + if (request === `pnpapi`) { + const parentApiPath = opts.manager.getApiPathFromParent(parent); + if (parentApiPath) { + return opts.manager.getApiEntry(parentApiPath, true).instance; + } + } + return originalModuleLoad.call(require$$0.Module, request, parent, isMain); + }; + function getIssuerSpecsFromPaths(paths) { + return paths.map((path) => ({ + apiPath: opts.manager.findApiPathFor(path), + path, + module: null + })); + } + function getIssuerSpecsFromModule(module) { + if (module && module.id !== `` && module.id !== `internal/preload` && !module.parent && !module.filename && module.paths.length > 0) { + return [{ + apiPath: opts.manager.findApiPathFor(module.paths[0]), + path: module.paths[0], + module + }]; + } + const issuer = getIssuerModule(module); + if (issuer !== null) { + const path = npath.dirname(issuer.filename); + const apiPath = opts.manager.getApiPathFromParent(issuer); + return [{ apiPath, path, module }]; + } else { + const path = process.cwd(); + const apiPath = opts.manager.findApiPathFor(npath.join(path, `[file]`)) ?? opts.manager.getApiPathFromParent(null); + return [{ apiPath, path, module }]; + } + } + function makeFakeParent(path) { + const fakeParent = new require$$0.Module(``); + const fakeFilePath = npath.join(path, `[file]`); + fakeParent.paths = require$$0.Module._nodeModulePaths(fakeFilePath); + return fakeParent; + } + const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:@[^/]+\/)?[^/]+)\/*(.*|)$/; + const originalModuleResolveFilename = require$$0.Module._resolveFilename; + require$$0.Module._resolveFilename = function(request, parent, isMain, options) { + if (require$$0.isBuiltin(request)) + return request; + if (!enableNativeHooks) + return originalModuleResolveFilename.call(require$$0.Module, request, parent, isMain, options); + if (options && options.plugnplay === false) { + const { plugnplay, ...forwardedOptions } = options; + try { + enableNativeHooks = false; + return originalModuleResolveFilename.call(require$$0.Module, request, parent, isMain, forwardedOptions); + } finally { + enableNativeHooks = true; + } + } + if (options) { + const optionNames = new Set(Object.keys(options)); + optionNames.delete(`paths`); + optionNames.delete(`plugnplay`); + if (optionNames.size > 0) { + throw makeError( + ErrorCode.UNSUPPORTED, + `Some options passed to require() aren't supported by PnP yet (${Array.from(optionNames).join(`, `)})` + ); + } + } + const issuerSpecs = options && options.paths ? getIssuerSpecsFromPaths(options.paths) : getIssuerSpecsFromModule(parent); + if (request.match(pathRegExp) === null) { + const parentDirectory = parent?.filename != null ? npath.dirname(parent.filename) : null; + const absoluteRequest = npath.isAbsolute(request) ? request : parentDirectory !== null ? npath.resolve(parentDirectory, request) : null; + if (absoluteRequest !== null) { + const apiPath = parent && parentDirectory === npath.dirname(absoluteRequest) ? opts.manager.getApiPathFromParent(parent) : opts.manager.findApiPathFor(absoluteRequest); + if (apiPath !== null) { + issuerSpecs.unshift({ + apiPath, + path: parentDirectory, + module: null + }); + } + } + } + let firstError; + for (const { apiPath, path, module } of issuerSpecs) { + let resolution; + const issuerApi = apiPath !== null ? opts.manager.getApiEntry(apiPath, true).instance : null; + try { + if (issuerApi !== null) { + resolution = issuerApi.resolveRequest(request, path !== null ? `${path}/` : null); + } else { + if (path === null) + throw new Error(`Assertion failed: Expected the path to be set`); + resolution = originalModuleResolveFilename.call(require$$0.Module, request, module || makeFakeParent(path), isMain); + } + } catch (error) { + firstError = firstError || error; + continue; + } + if (resolution !== null) { + return resolution; + } + } + const requireStack = getRequireStack(parent); + Object.defineProperty(firstError, `requireStack`, { + configurable: true, + writable: true, + enumerable: false, + value: requireStack + }); + if (requireStack.length > 0) + firstError.message += ` +Require stack: +- ${requireStack.join(` +- `)}`; + if (typeof firstError.pnpCode === `string`) + Error.captureStackTrace(firstError); + throw firstError; + }; + const originalFindPath = require$$0.Module._findPath; + require$$0.Module._findPath = function(request, paths, isMain) { + if (request === `pnpapi`) + return false; + if (!enableNativeHooks) + return originalFindPath.call(require$$0.Module, request, paths, isMain); + const isAbsolute = npath.isAbsolute(request); + if (isAbsolute) + paths = [``]; + else if (!paths || paths.length === 0) + return false; + for (const path of paths) { + let resolution; + try { + const pnpApiPath = opts.manager.findApiPathFor(isAbsolute ? request : path); + if (pnpApiPath !== null) { + const api = opts.manager.getApiEntry(pnpApiPath, true).instance; + resolution = api.resolveRequest(request, path) || false; + } else { + resolution = originalFindPath.call(require$$0.Module, request, [path], isMain); + } + } catch (error) { + continue; + } + if (resolution) { + return resolution; + } + } + return false; + }; + const originalExtensionJSFunction = require$$0.Module._extensions[`.js`]; + require$$0.Module._extensions[`.js`] = function(module, filename) { + if (filename.endsWith(`.js`)) { + const pkg = readPackageScope(filename); + if (pkg && pkg.data?.type === `module`) { + const err = ERR_REQUIRE_ESM(filename, module.parent?.filename); + Error.captureStackTrace(err); + throw err; + } + } + originalExtensionJSFunction.call(this, module, filename); + }; + const originalDlopen = process.dlopen; + process.dlopen = function(...args) { + const [module, filename, ...rest] = args; + return originalDlopen.call( + this, + module, + npath.fromPortablePath(VirtualFS.resolveVirtual(npath.toPortablePath(filename))), + ...rest + ); + }; + const originalEmit = process.emit; + process.emit = function(name, data, ...args) { + if (name === `warning` && typeof data === `object` && data.name === `ExperimentalWarning` && (data.message.includes(`--experimental-loader`) || data.message.includes(`Custom ESM Loaders is an experimental feature`))) + return false; + return originalEmit.apply(process, arguments); + }; + patchFs(fs__default.default, new PosixFS(opts.fakeFs)); +} + +function hydrateRuntimeState(data, { basePath }) { + const portablePath = npath.toPortablePath(basePath); + const absolutePortablePath = ppath.resolve(portablePath); + const ignorePattern = data.ignorePatternData !== null ? new RegExp(data.ignorePatternData) : null; + const packageLocatorsByLocations = /* @__PURE__ */ new Map(); + const packageRegistry = new Map(data.packageRegistryData.map(([packageName, packageStoreData]) => { + return [packageName, new Map(packageStoreData.map(([packageReference, packageInformationData]) => { + if (packageName === null !== (packageReference === null)) + throw new Error(`Assertion failed: The name and reference should be null, or neither should`); + const discardFromLookup = packageInformationData.discardFromLookup ?? false; + const packageLocator = { name: packageName, reference: packageReference }; + const entry = packageLocatorsByLocations.get(packageInformationData.packageLocation); + if (!entry) { + packageLocatorsByLocations.set(packageInformationData.packageLocation, { locator: packageLocator, discardFromLookup }); + } else { + entry.discardFromLookup = entry.discardFromLookup && discardFromLookup; + if (!discardFromLookup) { + entry.locator = packageLocator; + } + } + let resolvedPackageLocation = null; + return [packageReference, { + packageDependencies: new Map(packageInformationData.packageDependencies), + packagePeers: new Set(packageInformationData.packagePeers), + linkType: packageInformationData.linkType, + discardFromLookup, + get packageLocation() { + return resolvedPackageLocation || (resolvedPackageLocation = ppath.join(absolutePortablePath, packageInformationData.packageLocation)); + } + }]; + }))]; + })); + const fallbackExclusionList = new Map(data.fallbackExclusionList.map(([packageName, packageReferences]) => { + return [packageName, new Set(packageReferences)]; + })); + const fallbackPool = new Map(data.fallbackPool); + const dependencyTreeRoots = data.dependencyTreeRoots; + const enableTopLevelFallback = data.enableTopLevelFallback; + return { + basePath: portablePath, + dependencyTreeRoots, + enableTopLevelFallback, + fallbackExclusionList, + fallbackPool, + ignorePattern, + packageLocatorsByLocations, + packageRegistry + }; +} + +const ArrayIsArray = Array.isArray; +const JSONStringify = JSON.stringify; +const ObjectGetOwnPropertyNames = Object.getOwnPropertyNames; +const ObjectPrototypeHasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop); +const RegExpPrototypeExec = (obj, string) => RegExp.prototype.exec.call(obj, string); +const RegExpPrototypeSymbolReplace = (obj, ...rest) => RegExp.prototype[Symbol.replace].apply(obj, rest); +const StringPrototypeEndsWith = (str, ...rest) => String.prototype.endsWith.apply(str, rest); +const StringPrototypeIncludes = (str, ...rest) => String.prototype.includes.apply(str, rest); +const StringPrototypeLastIndexOf = (str, ...rest) => String.prototype.lastIndexOf.apply(str, rest); +const StringPrototypeIndexOf = (str, ...rest) => String.prototype.indexOf.apply(str, rest); +const StringPrototypeReplace = (str, ...rest) => String.prototype.replace.apply(str, rest); +const StringPrototypeSlice = (str, ...rest) => String.prototype.slice.apply(str, rest); +const StringPrototypeStartsWith = (str, ...rest) => String.prototype.startsWith.apply(str, rest); +const SafeMap = Map; +const JSONParse = JSON.parse; + +function createErrorType(code, messageCreator, errorType) { + return class extends errorType { + constructor(...args) { + super(messageCreator(...args)); + this.code = code; + this.name = `${errorType.name} [${code}]`; + } + }; +} +const ERR_PACKAGE_IMPORT_NOT_DEFINED = createErrorType( + `ERR_PACKAGE_IMPORT_NOT_DEFINED`, + (specifier, packagePath, base) => { + return `Package import specifier "${specifier}" is not defined${packagePath ? ` in package ${packagePath}package.json` : ``} imported from ${base}`; + }, + TypeError +); +const ERR_INVALID_MODULE_SPECIFIER = createErrorType( + `ERR_INVALID_MODULE_SPECIFIER`, + (request, reason, base = void 0) => { + return `Invalid module "${request}" ${reason}${base ? ` imported from ${base}` : ``}`; + }, + TypeError +); +const ERR_INVALID_PACKAGE_TARGET = createErrorType( + `ERR_INVALID_PACKAGE_TARGET`, + (pkgPath, key, target, isImport = false, base = void 0) => { + const relError = typeof target === `string` && !isImport && target.length && !StringPrototypeStartsWith(target, `./`); + if (key === `.`) { + assert__default.default(isImport === false); + return `Invalid "exports" main target ${JSONStringify(target)} defined in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ``}${relError ? `; targets must start with "./"` : ``}`; + } + return `Invalid "${isImport ? `imports` : `exports`}" target ${JSONStringify( + target + )} defined for '${key}' in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ``}${relError ? `; targets must start with "./"` : ``}`; + }, + Error +); +const ERR_INVALID_PACKAGE_CONFIG = createErrorType( + `ERR_INVALID_PACKAGE_CONFIG`, + (path, base, message) => { + return `Invalid package config ${path}${base ? ` while importing ${base}` : ``}${message ? `. ${message}` : ``}`; + }, + Error +); +const ERR_PACKAGE_PATH_NOT_EXPORTED = createErrorType( + "ERR_PACKAGE_PATH_NOT_EXPORTED", + (pkgPath, subpath, base = void 0) => { + if (subpath === ".") + return `No "exports" main defined in ${pkgPath}package.json${base ? ` imported from ${base}` : ""}`; + return `Package subpath '${subpath}' is not defined by "exports" in ${pkgPath}package.json${base ? ` imported from ${base}` : ""}`; + }, + Error +); + +function filterOwnProperties(source, keys) { + const filtered = /* @__PURE__ */ Object.create(null); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (ObjectPrototypeHasOwnProperty(source, key)) { + filtered[key] = source[key]; + } + } + return filtered; +} + +const packageJSONCache = new SafeMap(); +function getPackageConfig(path, specifier, base, readFileSyncFn) { + const existing = packageJSONCache.get(path); + if (existing !== void 0) { + return existing; + } + const source = readFileSyncFn(path); + if (source === void 0) { + const packageConfig2 = { + pjsonPath: path, + exists: false, + main: void 0, + name: void 0, + type: "none", + exports: void 0, + imports: void 0 + }; + packageJSONCache.set(path, packageConfig2); + return packageConfig2; + } + let packageJSON; + try { + packageJSON = JSONParse(source); + } catch (error) { + throw new ERR_INVALID_PACKAGE_CONFIG( + path, + (base ? `"${specifier}" from ` : "") + url.fileURLToPath(base || specifier), + error.message + ); + } + let { imports, main, name, type } = filterOwnProperties(packageJSON, [ + "imports", + "main", + "name", + "type" + ]); + const exports = ObjectPrototypeHasOwnProperty(packageJSON, "exports") ? packageJSON.exports : void 0; + if (typeof imports !== "object" || imports === null) { + imports = void 0; + } + if (typeof main !== "string") { + main = void 0; + } + if (typeof name !== "string") { + name = void 0; + } + if (type !== "module" && type !== "commonjs") { + type = "none"; + } + const packageConfig = { + pjsonPath: path, + exists: true, + main, + name, + type, + exports, + imports + }; + packageJSONCache.set(path, packageConfig); + return packageConfig; +} +function getPackageScopeConfig(resolved, readFileSyncFn) { + let packageJSONUrl = new URL("./package.json", resolved); + while (true) { + const packageJSONPath2 = packageJSONUrl.pathname; + if (StringPrototypeEndsWith(packageJSONPath2, "node_modules/package.json")) { + break; + } + const packageConfig2 = getPackageConfig( + url.fileURLToPath(packageJSONUrl), + resolved, + void 0, + readFileSyncFn + ); + if (packageConfig2.exists) { + return packageConfig2; + } + const lastPackageJSONUrl = packageJSONUrl; + packageJSONUrl = new URL("../package.json", packageJSONUrl); + if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) { + break; + } + } + const packageJSONPath = url.fileURLToPath(packageJSONUrl); + const packageConfig = { + pjsonPath: packageJSONPath, + exists: false, + main: void 0, + name: void 0, + type: "none", + exports: void 0, + imports: void 0 + }; + packageJSONCache.set(packageJSONPath, packageConfig); + return packageConfig; +} + +/** + @license + Copyright Node.js contributors. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +*/ +function throwImportNotDefined(specifier, packageJSONUrl, base) { + throw new ERR_PACKAGE_IMPORT_NOT_DEFINED( + specifier, + packageJSONUrl && url.fileURLToPath(new URL(".", packageJSONUrl)), + url.fileURLToPath(base) + ); +} +function throwInvalidSubpath(subpath, packageJSONUrl, internal, base) { + const reason = `request is not a valid subpath for the "${internal ? "imports" : "exports"}" resolution of ${url.fileURLToPath(packageJSONUrl)}`; + throw new ERR_INVALID_MODULE_SPECIFIER( + subpath, + reason, + base && url.fileURLToPath(base) + ); +} +function throwInvalidPackageTarget(subpath, target, packageJSONUrl, internal, base) { + if (typeof target === "object" && target !== null) { + target = JSONStringify(target, null, ""); + } else { + target = `${target}`; + } + throw new ERR_INVALID_PACKAGE_TARGET( + url.fileURLToPath(new URL(".", packageJSONUrl)), + subpath, + target, + internal, + base && url.fileURLToPath(base) + ); +} +const invalidSegmentRegEx = /(^|\\|\/)((\.|%2e)(\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\|\/|$)/i; +const patternRegEx = /\*/g; +function resolvePackageTargetString(target, subpath, match, packageJSONUrl, base, pattern, internal, conditions) { + if (subpath !== "" && !pattern && target[target.length - 1] !== "/") + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + if (!StringPrototypeStartsWith(target, "./")) { + if (internal && !StringPrototypeStartsWith(target, "../") && !StringPrototypeStartsWith(target, "/")) { + let isURL = false; + try { + new URL(target); + isURL = true; + } catch { + } + if (!isURL) { + const exportTarget = pattern ? RegExpPrototypeSymbolReplace(patternRegEx, target, () => subpath) : target + subpath; + return exportTarget; + } + } + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + } + if (RegExpPrototypeExec( + invalidSegmentRegEx, + StringPrototypeSlice(target, 2) + ) !== null) + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + const resolved = new URL(target, packageJSONUrl); + const resolvedPath = resolved.pathname; + const packagePath = new URL(".", packageJSONUrl).pathname; + if (!StringPrototypeStartsWith(resolvedPath, packagePath)) + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + if (subpath === "") + return resolved; + if (RegExpPrototypeExec(invalidSegmentRegEx, subpath) !== null) { + const request = pattern ? StringPrototypeReplace(match, "*", () => subpath) : match + subpath; + throwInvalidSubpath(request, packageJSONUrl, internal, base); + } + if (pattern) { + return new URL( + RegExpPrototypeSymbolReplace(patternRegEx, resolved.href, () => subpath) + ); + } + return new URL(subpath, resolved); +} +function isArrayIndex(key) { + const keyNum = +key; + if (`${keyNum}` !== key) + return false; + return keyNum >= 0 && keyNum < 4294967295; +} +function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath, base, pattern, internal, conditions) { + if (typeof target === "string") { + return resolvePackageTargetString( + target, + subpath, + packageSubpath, + packageJSONUrl, + base, + pattern, + internal); + } else if (ArrayIsArray(target)) { + if (target.length === 0) { + return null; + } + let lastException; + for (let i = 0; i < target.length; i++) { + const targetItem = target[i]; + let resolveResult; + try { + resolveResult = resolvePackageTarget( + packageJSONUrl, + targetItem, + subpath, + packageSubpath, + base, + pattern, + internal, + conditions + ); + } catch (e) { + lastException = e; + if (e.code === "ERR_INVALID_PACKAGE_TARGET") { + continue; + } + throw e; + } + if (resolveResult === void 0) { + continue; + } + if (resolveResult === null) { + lastException = null; + continue; + } + return resolveResult; + } + if (lastException === void 0 || lastException === null) + return lastException; + throw lastException; + } else if (typeof target === "object" && target !== null) { + const keys = ObjectGetOwnPropertyNames(target); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (isArrayIndex(key)) { + throw new ERR_INVALID_PACKAGE_CONFIG( + url.fileURLToPath(packageJSONUrl), + base, + '"exports" cannot contain numeric property keys.' + ); + } + } + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key === "default" || conditions.has(key)) { + const conditionalTarget = target[key]; + const resolveResult = resolvePackageTarget( + packageJSONUrl, + conditionalTarget, + subpath, + packageSubpath, + base, + pattern, + internal, + conditions + ); + if (resolveResult === void 0) + continue; + return resolveResult; + } + } + return void 0; + } else if (target === null) { + return null; + } + throwInvalidPackageTarget( + packageSubpath, + target, + packageJSONUrl, + internal, + base + ); +} +function patternKeyCompare(a, b) { + const aPatternIndex = StringPrototypeIndexOf(a, "*"); + const bPatternIndex = StringPrototypeIndexOf(b, "*"); + const baseLenA = aPatternIndex === -1 ? a.length : aPatternIndex + 1; + const baseLenB = bPatternIndex === -1 ? b.length : bPatternIndex + 1; + if (baseLenA > baseLenB) + return -1; + if (baseLenB > baseLenA) + return 1; + if (aPatternIndex === -1) + return 1; + if (bPatternIndex === -1) + return -1; + if (a.length > b.length) + return -1; + if (b.length > a.length) + return 1; + return 0; +} +function isConditionalExportsMainSugar(exports, packageJSONUrl, base) { + if (typeof exports === "string" || ArrayIsArray(exports)) + return true; + if (typeof exports !== "object" || exports === null) + return false; + const keys = ObjectGetOwnPropertyNames(exports); + let isConditionalSugar = false; + let i = 0; + for (let j = 0; j < keys.length; j++) { + const key = keys[j]; + const curIsConditionalSugar = key === "" || key[0] !== "."; + if (i++ === 0) { + isConditionalSugar = curIsConditionalSugar; + } else if (isConditionalSugar !== curIsConditionalSugar) { + throw new ERR_INVALID_PACKAGE_CONFIG( + url.fileURLToPath(packageJSONUrl), + base, + `"exports" cannot contain some keys starting with '.' and some not. The exports object must either be an object of package subpath keys or an object of main entry condition name keys only.` + ); + } + } + return isConditionalSugar; +} +function throwExportsNotFound(subpath, packageJSONUrl, base) { + throw new ERR_PACKAGE_PATH_NOT_EXPORTED( + url.fileURLToPath(new URL(".", packageJSONUrl)), + subpath, + base && url.fileURLToPath(base) + ); +} +const emittedPackageWarnings = /* @__PURE__ */ new Set(); +function emitTrailingSlashPatternDeprecation(match, pjsonUrl, base) { + const pjsonPath = url.fileURLToPath(pjsonUrl); + if (emittedPackageWarnings.has(pjsonPath + "|" + match)) + return; + emittedPackageWarnings.add(pjsonPath + "|" + match); + process.emitWarning( + `Use of deprecated trailing slash pattern mapping "${match}" in the "exports" field module resolution of the package at ${pjsonPath}${base ? ` imported from ${url.fileURLToPath(base)}` : ""}. Mapping specifiers ending in "/" is no longer supported.`, + "DeprecationWarning", + "DEP0155" + ); +} +function packageExportsResolve({ + packageJSONUrl, + packageSubpath, + exports, + base, + conditions +}) { + if (isConditionalExportsMainSugar(exports, packageJSONUrl, base)) + exports = { ".": exports }; + if (ObjectPrototypeHasOwnProperty(exports, packageSubpath) && !StringPrototypeIncludes(packageSubpath, "*") && !StringPrototypeEndsWith(packageSubpath, "/")) { + const target = exports[packageSubpath]; + const resolveResult = resolvePackageTarget( + packageJSONUrl, + target, + "", + packageSubpath, + base, + false, + false, + conditions + ); + if (resolveResult == null) { + throwExportsNotFound(packageSubpath, packageJSONUrl, base); + } + return resolveResult; + } + let bestMatch = ""; + let bestMatchSubpath; + const keys = ObjectGetOwnPropertyNames(exports); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const patternIndex = StringPrototypeIndexOf(key, "*"); + if (patternIndex !== -1 && StringPrototypeStartsWith( + packageSubpath, + StringPrototypeSlice(key, 0, patternIndex) + )) { + if (StringPrototypeEndsWith(packageSubpath, "/")) + emitTrailingSlashPatternDeprecation( + packageSubpath, + packageJSONUrl, + base + ); + const patternTrailer = StringPrototypeSlice(key, patternIndex + 1); + if (packageSubpath.length >= key.length && StringPrototypeEndsWith(packageSubpath, patternTrailer) && patternKeyCompare(bestMatch, key) === 1 && StringPrototypeLastIndexOf(key, "*") === patternIndex) { + bestMatch = key; + bestMatchSubpath = StringPrototypeSlice( + packageSubpath, + patternIndex, + packageSubpath.length - patternTrailer.length + ); + } + } + } + if (bestMatch) { + const target = exports[bestMatch]; + const resolveResult = resolvePackageTarget( + packageJSONUrl, + target, + bestMatchSubpath, + bestMatch, + base, + true, + false, + conditions + ); + if (resolveResult == null) { + throwExportsNotFound(packageSubpath, packageJSONUrl, base); + } + return resolveResult; + } + throwExportsNotFound(packageSubpath, packageJSONUrl, base); +} +function packageImportsResolve({ name, base, conditions, readFileSyncFn }) { + if (name === "#" || StringPrototypeStartsWith(name, "#/") || StringPrototypeEndsWith(name, "/")) { + const reason = "is not a valid internal imports specifier name"; + throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, url.fileURLToPath(base)); + } + let packageJSONUrl; + const packageConfig = getPackageScopeConfig(base, readFileSyncFn); + if (packageConfig.exists) { + packageJSONUrl = url.pathToFileURL(packageConfig.pjsonPath); + const imports = packageConfig.imports; + if (imports) { + if (ObjectPrototypeHasOwnProperty(imports, name) && !StringPrototypeIncludes(name, "*")) { + const resolveResult = resolvePackageTarget( + packageJSONUrl, + imports[name], + "", + name, + base, + false, + true, + conditions + ); + if (resolveResult != null) { + return resolveResult; + } + } else { + let bestMatch = ""; + let bestMatchSubpath; + const keys = ObjectGetOwnPropertyNames(imports); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const patternIndex = StringPrototypeIndexOf(key, "*"); + if (patternIndex !== -1 && StringPrototypeStartsWith( + name, + StringPrototypeSlice(key, 0, patternIndex) + )) { + const patternTrailer = StringPrototypeSlice(key, patternIndex + 1); + if (name.length >= key.length && StringPrototypeEndsWith(name, patternTrailer) && patternKeyCompare(bestMatch, key) === 1 && StringPrototypeLastIndexOf(key, "*") === patternIndex) { + bestMatch = key; + bestMatchSubpath = StringPrototypeSlice( + name, + patternIndex, + name.length - patternTrailer.length + ); + } + } + } + if (bestMatch) { + const target = imports[bestMatch]; + const resolveResult = resolvePackageTarget( + packageJSONUrl, + target, + bestMatchSubpath, + bestMatch, + base, + true, + true, + conditions + ); + if (resolveResult != null) { + return resolveResult; + } + } + } + } + } + throwImportNotDefined(name, packageJSONUrl, base); +} + +const flagSymbol = Symbol('arg flag'); + +class ArgError extends Error { + constructor(msg, code) { + super(msg); + this.name = 'ArgError'; + this.code = code; + + Object.setPrototypeOf(this, ArgError.prototype); + } +} + +function arg( + opts, + { + argv = process.argv.slice(2), + permissive = false, + stopAtPositional = false + } = {} +) { + if (!opts) { + throw new ArgError( + 'argument specification object is required', + 'ARG_CONFIG_NO_SPEC' + ); + } + + const result = { _: [] }; + + const aliases = {}; + const handlers = {}; + + for (const key of Object.keys(opts)) { + if (!key) { + throw new ArgError( + 'argument key cannot be an empty string', + 'ARG_CONFIG_EMPTY_KEY' + ); + } + + if (key[0] !== '-') { + throw new ArgError( + `argument key must start with '-' but found: '${key}'`, + 'ARG_CONFIG_NONOPT_KEY' + ); + } + + if (key.length === 1) { + throw new ArgError( + `argument key must have a name; singular '-' keys are not allowed: ${key}`, + 'ARG_CONFIG_NONAME_KEY' + ); + } + + if (typeof opts[key] === 'string') { + aliases[key] = opts[key]; + continue; + } + + let type = opts[key]; + let isFlag = false; + + if ( + Array.isArray(type) && + type.length === 1 && + typeof type[0] === 'function' + ) { + const [fn] = type; + type = (value, name, prev = []) => { + prev.push(fn(value, name, prev[prev.length - 1])); + return prev; + }; + isFlag = fn === Boolean || fn[flagSymbol] === true; + } else if (typeof type === 'function') { + isFlag = type === Boolean || type[flagSymbol] === true; + } else { + throw new ArgError( + `type missing or not a function or valid array type: ${key}`, + 'ARG_CONFIG_VAD_TYPE' + ); + } + + if (key[1] !== '-' && key.length > 2) { + throw new ArgError( + `short argument keys (with a single hyphen) must have only one character: ${key}`, + 'ARG_CONFIG_SHORTOPT_TOOLONG' + ); + } + + handlers[key] = [type, isFlag]; + } + + for (let i = 0, len = argv.length; i < len; i++) { + const wholeArg = argv[i]; + + if (stopAtPositional && result._.length > 0) { + result._ = result._.concat(argv.slice(i)); + break; + } + + if (wholeArg === '--') { + result._ = result._.concat(argv.slice(i + 1)); + break; + } + + if (wholeArg.length > 1 && wholeArg[0] === '-') { + /* eslint-disable operator-linebreak */ + const separatedArguments = + wholeArg[1] === '-' || wholeArg.length === 2 + ? [wholeArg] + : wholeArg + .slice(1) + .split('') + .map((a) => `-${a}`); + /* eslint-enable operator-linebreak */ + + for (let j = 0; j < separatedArguments.length; j++) { + const arg = separatedArguments[j]; + const [originalArgName, argStr] = + arg[1] === '-' ? arg.split(/=(.*)/, 2) : [arg, undefined]; + + let argName = originalArgName; + while (argName in aliases) { + argName = aliases[argName]; + } + + if (!(argName in handlers)) { + if (permissive) { + result._.push(arg); + continue; + } else { + throw new ArgError( + `unknown or unexpected option: ${originalArgName}`, + 'ARG_UNKNOWN_OPTION' + ); + } + } + + const [type, isFlag] = handlers[argName]; + + if (!isFlag && j + 1 < separatedArguments.length) { + throw new ArgError( + `option requires argument (but was followed by another short argument): ${originalArgName}`, + 'ARG_MISSING_REQUIRED_SHORTARG' + ); + } + + if (isFlag) { + result[argName] = type(true, argName, result[argName]); + } else if (argStr === undefined) { + if ( + argv.length < i + 2 || + (argv[i + 1].length > 1 && + argv[i + 1][0] === '-' && + !( + argv[i + 1].match(/^-?\d*(\.(?=\d))?\d*$/) && + (type === Number || + // eslint-disable-next-line no-undef + (typeof BigInt !== 'undefined' && type === BigInt)) + )) + ) { + const extended = + originalArgName === argName ? '' : ` (alias for ${argName})`; + throw new ArgError( + `option requires argument: ${originalArgName}${extended}`, + 'ARG_MISSING_REQUIRED_LONGARG' + ); + } + + result[argName] = type(argv[i + 1], argName, result[argName]); + ++i; + } else { + result[argName] = type(argStr, argName, result[argName]); + } + } + } else { + result._.push(wholeArg); + } + } + + return result; +} + +arg.flag = (fn) => { + fn[flagSymbol] = true; + return fn; +}; + +// Utility types +arg.COUNT = arg.flag((v, name, existingCount) => (existingCount || 0) + 1); + +// Expose error class +arg.ArgError = ArgError; + +var arg_1 = arg; + +/** + @license + The MIT License (MIT) + + Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ +function getOptionValue(opt) { + parseOptions(); + return options[opt]; +} +let options; +function parseOptions() { + if (!options) { + options = { + "--conditions": [], + ...parseArgv(getNodeOptionsEnvArgv()), + ...parseArgv(process.execArgv) + }; + } +} +function parseArgv(argv) { + return arg_1( + { + "--conditions": [String], + "-C": "--conditions" + }, + { + argv, + permissive: true + } + ); +} +function getNodeOptionsEnvArgv() { + const errors = []; + const envArgv = ParseNodeOptionsEnvVar(process.env.NODE_OPTIONS || "", errors); + if (errors.length !== 0) ; + return envArgv; +} +function ParseNodeOptionsEnvVar(node_options, errors) { + const env_argv = []; + let is_in_string = false; + let will_start_new_arg = true; + for (let index = 0; index < node_options.length; ++index) { + let c = node_options[index]; + if (c === "\\" && is_in_string) { + if (index + 1 === node_options.length) { + errors.push("invalid value for NODE_OPTIONS (invalid escape)\n"); + return env_argv; + } else { + c = node_options[++index]; + } + } else if (c === " " && !is_in_string) { + will_start_new_arg = true; + continue; + } else if (c === '"') { + is_in_string = !is_in_string; + continue; + } + if (will_start_new_arg) { + env_argv.push(c); + will_start_new_arg = false; + } else { + env_argv[env_argv.length - 1] += c; + } + } + if (is_in_string) { + errors.push("invalid value for NODE_OPTIONS (unterminated string)\n"); + } + return env_argv; +} + +function makeApi(runtimeState, opts) { + const alwaysWarnOnFallback = Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK) > 0; + const debugLevel = Number(process.env.PNP_DEBUG_LEVEL); + const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/; + const isStrictRegExp = /^(\/|\.{1,2}(\/|$))/; + const isDirRegExp = /\/$/; + const isRelativeRegexp = /^\.{0,2}\//; + const topLevelLocator = { name: null, reference: null }; + const fallbackLocators = []; + const emittedWarnings = /* @__PURE__ */ new Set(); + if (runtimeState.enableTopLevelFallback === true) + fallbackLocators.push(topLevelLocator); + if (opts.compatibilityMode !== false) { + for (const name of [`react-scripts`, `gatsby`]) { + const packageStore = runtimeState.packageRegistry.get(name); + if (packageStore) { + for (const reference of packageStore.keys()) { + if (reference === null) { + throw new Error(`Assertion failed: This reference shouldn't be null`); + } else { + fallbackLocators.push({ name, reference }); + } + } + } + } + } + const { + ignorePattern, + packageRegistry, + packageLocatorsByLocations + } = runtimeState; + function makeLogEntry(name, args) { + return { + fn: name, + args, + error: null, + result: null + }; + } + function trace(entry) { + const colors = process.stderr?.hasColors?.() ?? process.stdout.isTTY; + const c = (n, str) => `\x1B[${n}m${str}\x1B[0m`; + const error = entry.error; + if (error) + console.error(c(`31;1`, `\u2716 ${entry.error?.message.replace(/\n.*/s, ``)}`)); + else + console.error(c(`33;1`, `\u203C Resolution`)); + if (entry.args.length > 0) + console.error(); + for (const arg of entry.args) + console.error(` ${c(`37;1`, `In \u2190`)} ${nodeUtils.inspect(arg, { colors, compact: true })}`); + if (entry.result) { + console.error(); + console.error(` ${c(`37;1`, `Out \u2192`)} ${nodeUtils.inspect(entry.result, { colors, compact: true })}`); + } + const stack = new Error().stack.match(/(?<=^ +)at.*/gm)?.slice(2) ?? []; + if (stack.length > 0) { + console.error(); + for (const line of stack) { + console.error(` ${c(`38;5;244`, line)}`); + } + } + console.error(); + } + function maybeLog(name, fn) { + if (opts.allowDebug === false) + return fn; + if (Number.isFinite(debugLevel)) { + if (debugLevel >= 2) { + return (...args) => { + const logEntry = makeLogEntry(name, args); + try { + return logEntry.result = fn(...args); + } catch (error) { + throw logEntry.error = error; + } finally { + trace(logEntry); + } + }; + } else if (debugLevel >= 1) { + return (...args) => { + try { + return fn(...args); + } catch (error) { + const logEntry = makeLogEntry(name, args); + logEntry.error = error; + trace(logEntry); + throw error; + } + }; + } + } + return fn; + } + function getPackageInformationSafe(packageLocator) { + const packageInformation = getPackageInformation(packageLocator); + if (!packageInformation) { + throw makeError( + ErrorCode.INTERNAL, + `Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)` + ); + } + return packageInformation; + } + function isDependencyTreeRoot(packageLocator) { + if (packageLocator.name === null) + return true; + for (const dependencyTreeRoot of runtimeState.dependencyTreeRoots) + if (dependencyTreeRoot.name === packageLocator.name && dependencyTreeRoot.reference === packageLocator.reference) + return true; + return false; + } + const defaultExportsConditions = /* @__PURE__ */ new Set([ + `node`, + `require`, + ...getOptionValue(`--conditions`) + ]); + function applyNodeExportsResolution(unqualifiedPath, conditions = defaultExportsConditions, issuer) { + const locator = findPackageLocator(ppath.join(unqualifiedPath, `internal.js`), { + resolveIgnored: true, + includeDiscardFromLookup: true + }); + if (locator === null) { + throw makeError( + ErrorCode.INTERNAL, + `The locator that owns the "${unqualifiedPath}" path can't be found inside the dependency tree (this is probably an internal error)` + ); + } + const { packageLocation } = getPackageInformationSafe(locator); + const manifestPath = ppath.join(packageLocation, Filename.manifest); + if (!opts.fakeFs.existsSync(manifestPath)) + return null; + const pkgJson = JSON.parse(opts.fakeFs.readFileSync(manifestPath, `utf8`)); + if (pkgJson.exports == null) + return null; + let subpath = ppath.contains(packageLocation, unqualifiedPath); + if (subpath === null) { + throw makeError( + ErrorCode.INTERNAL, + `unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)` + ); + } + if (subpath !== `.` && !isRelativeRegexp.test(subpath)) + subpath = `./${subpath}`; + try { + const resolvedExport = packageExportsResolve({ + packageJSONUrl: url.pathToFileURL(npath.fromPortablePath(manifestPath)), + packageSubpath: subpath, + exports: pkgJson.exports, + base: issuer ? url.pathToFileURL(npath.fromPortablePath(issuer)) : null, + conditions + }); + return npath.toPortablePath(url.fileURLToPath(resolvedExport)); + } catch (error) { + throw makeError( + ErrorCode.EXPORTS_RESOLUTION_FAILED, + error.message, + { unqualifiedPath: getPathForDisplay(unqualifiedPath), locator, pkgJson, subpath: getPathForDisplay(subpath), conditions }, + error.code + ); + } + } + function applyNodeExtensionResolution(unqualifiedPath, candidates, { extensions }) { + let stat; + try { + candidates.push(unqualifiedPath); + stat = opts.fakeFs.statSync(unqualifiedPath); + } catch (error) { + } + if (stat && !stat.isDirectory()) + return opts.fakeFs.realpathSync(unqualifiedPath); + if (stat && stat.isDirectory()) { + let pkgJson; + try { + pkgJson = JSON.parse(opts.fakeFs.readFileSync(ppath.join(unqualifiedPath, Filename.manifest), `utf8`)); + } catch (error) { + } + let nextUnqualifiedPath; + if (pkgJson && pkgJson.main) + nextUnqualifiedPath = ppath.resolve(unqualifiedPath, pkgJson.main); + if (nextUnqualifiedPath && nextUnqualifiedPath !== unqualifiedPath) { + const resolution = applyNodeExtensionResolution(nextUnqualifiedPath, candidates, { extensions }); + if (resolution !== null) { + return resolution; + } + } + } + for (let i = 0, length = extensions.length; i < length; i++) { + const candidateFile = `${unqualifiedPath}${extensions[i]}`; + candidates.push(candidateFile); + if (opts.fakeFs.existsSync(candidateFile)) { + return candidateFile; + } + } + if (stat && stat.isDirectory()) { + for (let i = 0, length = extensions.length; i < length; i++) { + const candidateFile = ppath.format({ dir: unqualifiedPath, name: `index`, ext: extensions[i] }); + candidates.push(candidateFile); + if (opts.fakeFs.existsSync(candidateFile)) { + return candidateFile; + } + } + } + return null; + } + function makeFakeModule(path) { + const fakeModule = new require$$0.Module(path, null); + fakeModule.filename = path; + fakeModule.paths = require$$0.Module._nodeModulePaths(path); + return fakeModule; + } + function callNativeResolution(request, issuer) { + if (issuer.endsWith(`/`)) + issuer = ppath.join(issuer, `internal.js`); + return require$$0.Module._resolveFilename(npath.fromPortablePath(request), makeFakeModule(npath.fromPortablePath(issuer)), false, { plugnplay: false }); + } + function isPathIgnored(path) { + if (ignorePattern === null) + return false; + const subPath = ppath.contains(runtimeState.basePath, path); + if (subPath === null) + return false; + if (ignorePattern.test(subPath.replace(/\/$/, ``))) { + return true; + } else { + return false; + } + } + const VERSIONS = { std: 3, resolveVirtual: 1, getAllLocators: 1 }; + const topLevel = topLevelLocator; + function getPackageInformation({ name, reference }) { + const packageInformationStore = packageRegistry.get(name); + if (!packageInformationStore) + return null; + const packageInformation = packageInformationStore.get(reference); + if (!packageInformation) + return null; + return packageInformation; + } + function findPackageDependents({ name, reference }) { + const dependents = []; + for (const [dependentName, packageInformationStore] of packageRegistry) { + if (dependentName === null) + continue; + for (const [dependentReference, packageInformation] of packageInformationStore) { + if (dependentReference === null) + continue; + const dependencyReference = packageInformation.packageDependencies.get(name); + if (dependencyReference !== reference) + continue; + if (dependentName === name && dependentReference === reference) + continue; + dependents.push({ + name: dependentName, + reference: dependentReference + }); + } + } + return dependents; + } + function findBrokenPeerDependencies(dependency, initialPackage) { + const brokenPackages = /* @__PURE__ */ new Map(); + const alreadyVisited = /* @__PURE__ */ new Set(); + const traversal = (currentPackage) => { + const identifier = JSON.stringify(currentPackage.name); + if (alreadyVisited.has(identifier)) + return; + alreadyVisited.add(identifier); + const dependents = findPackageDependents(currentPackage); + for (const dependent of dependents) { + const dependentInformation = getPackageInformationSafe(dependent); + if (dependentInformation.packagePeers.has(dependency)) { + traversal(dependent); + } else { + let brokenSet = brokenPackages.get(dependent.name); + if (typeof brokenSet === `undefined`) + brokenPackages.set(dependent.name, brokenSet = /* @__PURE__ */ new Set()); + brokenSet.add(dependent.reference); + } + } + }; + traversal(initialPackage); + const brokenList = []; + for (const name of [...brokenPackages.keys()].sort()) + for (const reference of [...brokenPackages.get(name)].sort()) + brokenList.push({ name, reference }); + return brokenList; + } + function findPackageLocator(location, { resolveIgnored = false, includeDiscardFromLookup = false } = {}) { + if (isPathIgnored(location) && !resolveIgnored) + return null; + let relativeLocation = ppath.relative(runtimeState.basePath, location); + if (!relativeLocation.match(isStrictRegExp)) + relativeLocation = `./${relativeLocation}`; + if (!relativeLocation.endsWith(`/`)) + relativeLocation = `${relativeLocation}/`; + do { + const entry = packageLocatorsByLocations.get(relativeLocation); + if (typeof entry === `undefined` || entry.discardFromLookup && !includeDiscardFromLookup) { + relativeLocation = relativeLocation.substring(0, relativeLocation.lastIndexOf(`/`, relativeLocation.length - 2) + 1); + continue; + } + return entry.locator; + } while (relativeLocation !== ``); + return null; + } + function tryReadFile(filePath) { + try { + return opts.fakeFs.readFileSync(npath.toPortablePath(filePath), `utf8`); + } catch (err) { + if (err.code === `ENOENT`) + return void 0; + throw err; + } + } + function resolveToUnqualified(request, issuer, { considerBuiltins = true } = {}) { + if (request.startsWith(`#`)) + throw new Error(`resolveToUnqualified can not handle private import mappings`); + if (request === `pnpapi`) + return npath.toPortablePath(opts.pnpapiResolution); + if (considerBuiltins && require$$0.isBuiltin(request)) + return null; + const requestForDisplay = getPathForDisplay(request); + const issuerForDisplay = issuer && getPathForDisplay(issuer); + if (issuer && isPathIgnored(issuer)) { + if (!ppath.isAbsolute(request) || findPackageLocator(request) === null) { + const result = callNativeResolution(request, issuer); + if (result === false) { + throw makeError( + ErrorCode.BUILTIN_NODE_RESOLUTION_FAILED, + `The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) + +Require request: "${requestForDisplay}" +Required by: ${issuerForDisplay} +`, + { request: requestForDisplay, issuer: issuerForDisplay } + ); + } + return npath.toPortablePath(result); + } + } + let unqualifiedPath; + const dependencyNameMatch = request.match(pathRegExp); + if (!dependencyNameMatch) { + if (ppath.isAbsolute(request)) { + unqualifiedPath = ppath.normalize(request); + } else { + if (!issuer) { + throw makeError( + ErrorCode.API_ERROR, + `The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute`, + { request: requestForDisplay, issuer: issuerForDisplay } + ); + } + const absoluteIssuer = ppath.resolve(issuer); + if (issuer.match(isDirRegExp)) { + unqualifiedPath = ppath.normalize(ppath.join(absoluteIssuer, request)); + } else { + unqualifiedPath = ppath.normalize(ppath.join(ppath.dirname(absoluteIssuer), request)); + } + } + } else { + if (!issuer) { + throw makeError( + ErrorCode.API_ERROR, + `The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute`, + { request: requestForDisplay, issuer: issuerForDisplay } + ); + } + const [, dependencyName, subPath] = dependencyNameMatch; + const issuerLocator = findPackageLocator(issuer); + if (!issuerLocator) { + const result = callNativeResolution(request, issuer); + if (result === false) { + throw makeError( + ErrorCode.BUILTIN_NODE_RESOLUTION_FAILED, + `The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). + +Require path: "${requestForDisplay}" +Required by: ${issuerForDisplay} +`, + { request: requestForDisplay, issuer: issuerForDisplay } + ); + } + return npath.toPortablePath(result); + } + const issuerInformation = getPackageInformationSafe(issuerLocator); + let dependencyReference = issuerInformation.packageDependencies.get(dependencyName); + let fallbackReference = null; + if (dependencyReference == null) { + if (issuerLocator.name !== null) { + const exclusionEntry = runtimeState.fallbackExclusionList.get(issuerLocator.name); + const canUseFallbacks = !exclusionEntry || !exclusionEntry.has(issuerLocator.reference); + if (canUseFallbacks) { + for (let t = 0, T = fallbackLocators.length; t < T; ++t) { + const fallbackInformation = getPackageInformationSafe(fallbackLocators[t]); + const reference = fallbackInformation.packageDependencies.get(dependencyName); + if (reference == null) + continue; + if (alwaysWarnOnFallback) + fallbackReference = reference; + else + dependencyReference = reference; + break; + } + if (runtimeState.enableTopLevelFallback) { + if (dependencyReference == null && fallbackReference === null) { + const reference = runtimeState.fallbackPool.get(dependencyName); + if (reference != null) { + fallbackReference = reference; + } + } + } + } + } + } + let error = null; + if (dependencyReference === null) { + if (isDependencyTreeRoot(issuerLocator)) { + error = makeError( + ErrorCode.MISSING_PEER_DEPENDENCY, + `Your application tried to access ${dependencyName} (a peer dependency); this isn't allowed as there is no ancestor to satisfy the requirement. Use a devDependency if needed. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerForDisplay} +`, + { request: requestForDisplay, issuer: issuerForDisplay, dependencyName } + ); + } else { + const brokenAncestors = findBrokenPeerDependencies(dependencyName, issuerLocator); + if (brokenAncestors.every((ancestor) => isDependencyTreeRoot(ancestor))) { + error = makeError( + ErrorCode.MISSING_PEER_DEPENDENCY, + `${issuerLocator.name} tried to access ${dependencyName} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerLocator.name}@${issuerLocator.reference} (via ${issuerForDisplay}) +${brokenAncestors.map((ancestorLocator) => `Ancestor breaking the chain: ${ancestorLocator.name}@${ancestorLocator.reference} +`).join(``)} +`, + { request: requestForDisplay, issuer: issuerForDisplay, issuerLocator: Object.assign({}, issuerLocator), dependencyName, brokenAncestors } + ); + } else { + error = makeError( + ErrorCode.MISSING_PEER_DEPENDENCY, + `${issuerLocator.name} tried to access ${dependencyName} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerLocator.name}@${issuerLocator.reference} (via ${issuerForDisplay}) + +${brokenAncestors.map((ancestorLocator) => `Ancestor breaking the chain: ${ancestorLocator.name}@${ancestorLocator.reference} +`).join(``)} +`, + { request: requestForDisplay, issuer: issuerForDisplay, issuerLocator: Object.assign({}, issuerLocator), dependencyName, brokenAncestors } + ); + } + } + } else if (dependencyReference === void 0) { + if (!considerBuiltins && require$$0.isBuiltin(request)) { + if (isDependencyTreeRoot(issuerLocator)) { + error = makeError( + ErrorCode.UNDECLARED_DEPENDENCY, + `Your application tried to access ${dependencyName}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${dependencyName} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerForDisplay} +`, + { request: requestForDisplay, issuer: issuerForDisplay, dependencyName } + ); + } else { + error = makeError( + ErrorCode.UNDECLARED_DEPENDENCY, + `${issuerLocator.name} tried to access ${dependencyName}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${dependencyName} isn't otherwise declared in ${issuerLocator.name}'s dependencies, this makes the require call ambiguous and unsound. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerForDisplay} +`, + { request: requestForDisplay, issuer: issuerForDisplay, issuerLocator: Object.assign({}, issuerLocator), dependencyName } + ); + } + } else { + if (isDependencyTreeRoot(issuerLocator)) { + error = makeError( + ErrorCode.UNDECLARED_DEPENDENCY, + `Your application tried to access ${dependencyName}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerForDisplay} +`, + { request: requestForDisplay, issuer: issuerForDisplay, dependencyName } + ); + } else { + error = makeError( + ErrorCode.UNDECLARED_DEPENDENCY, + `${issuerLocator.name} tried to access ${dependencyName}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerLocator.name}@${issuerLocator.reference} (via ${issuerForDisplay}) +`, + { request: requestForDisplay, issuer: issuerForDisplay, issuerLocator: Object.assign({}, issuerLocator), dependencyName } + ); + } + } + } + if (dependencyReference == null) { + if (fallbackReference === null || error === null) + throw error || new Error(`Assertion failed: Expected an error to have been set`); + dependencyReference = fallbackReference; + const message = error.message.replace(/\n.*/g, ``); + error.message = message; + if (!emittedWarnings.has(message) && debugLevel !== 0) { + emittedWarnings.add(message); + process.emitWarning(error); + } + } + const dependencyLocator = Array.isArray(dependencyReference) ? { name: dependencyReference[0], reference: dependencyReference[1] } : { name: dependencyName, reference: dependencyReference }; + const dependencyInformation = getPackageInformationSafe(dependencyLocator); + if (!dependencyInformation.packageLocation) { + throw makeError( + ErrorCode.MISSING_DEPENDENCY, + `A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. + +Required package: ${dependencyLocator.name}@${dependencyLocator.reference}${dependencyLocator.name !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerLocator.name}@${issuerLocator.reference} (via ${issuerForDisplay}) +`, + { request: requestForDisplay, issuer: issuerForDisplay, dependencyLocator: Object.assign({}, dependencyLocator) } + ); + } + const dependencyLocation = dependencyInformation.packageLocation; + if (subPath) { + unqualifiedPath = ppath.join(dependencyLocation, subPath); + } else { + unqualifiedPath = dependencyLocation; + } + } + return ppath.normalize(unqualifiedPath); + } + function resolveUnqualifiedExport(request, unqualifiedPath, conditions = defaultExportsConditions, issuer) { + if (isStrictRegExp.test(request)) + return unqualifiedPath; + const unqualifiedExportPath = applyNodeExportsResolution(unqualifiedPath, conditions, issuer); + if (unqualifiedExportPath) { + return ppath.normalize(unqualifiedExportPath); + } else { + return unqualifiedPath; + } + } + function resolveUnqualified(unqualifiedPath, { extensions = Object.keys(require$$0.Module._extensions) } = {}) { + const candidates = []; + const qualifiedPath = applyNodeExtensionResolution(unqualifiedPath, candidates, { extensions }); + if (qualifiedPath) { + return ppath.normalize(qualifiedPath); + } else { + reportRequiredFilesToWatchMode(candidates.map((candidate) => npath.fromPortablePath(candidate))); + const unqualifiedPathForDisplay = getPathForDisplay(unqualifiedPath); + const containingPackage = findPackageLocator(unqualifiedPath); + if (containingPackage) { + const { packageLocation } = getPackageInformationSafe(containingPackage); + let exists = true; + try { + opts.fakeFs.accessSync(packageLocation); + } catch (err) { + if (err?.code === `ENOENT`) { + exists = false; + } else { + const readableError = (err?.message ?? err ?? `empty exception thrown`).replace(/^[A-Z]/, ($0) => $0.toLowerCase()); + throw makeError(ErrorCode.QUALIFIED_PATH_RESOLUTION_FAILED, `Required package exists but could not be accessed (${readableError}). + +Missing package: ${containingPackage.name}@${containingPackage.reference} +Expected package location: ${getPathForDisplay(packageLocation)} +`, { unqualifiedPath: unqualifiedPathForDisplay, extensions }); + } + } + if (!exists) { + const errorMessage = packageLocation.includes(`/unplugged/`) ? `Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).` : `Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.`; + throw makeError( + ErrorCode.QUALIFIED_PATH_RESOLUTION_FAILED, + `${errorMessage} + +Missing package: ${containingPackage.name}@${containingPackage.reference} +Expected package location: ${getPathForDisplay(packageLocation)} +`, + { unqualifiedPath: unqualifiedPathForDisplay, extensions } + ); + } + } + throw makeError( + ErrorCode.QUALIFIED_PATH_RESOLUTION_FAILED, + `Qualified path resolution failed: we looked for the following paths, but none could be accessed. + +Source path: ${unqualifiedPathForDisplay} +${candidates.map((candidate) => `Not found: ${getPathForDisplay(candidate)} +`).join(``)}`, + { unqualifiedPath: unqualifiedPathForDisplay, extensions } + ); + } + } + function resolvePrivateRequest(request, issuer, opts2) { + if (!issuer) + throw new Error(`Assertion failed: An issuer is required to resolve private import mappings`); + const resolved = packageImportsResolve({ + name: request, + base: url.pathToFileURL(npath.fromPortablePath(issuer)), + conditions: opts2.conditions ?? defaultExportsConditions, + readFileSyncFn: tryReadFile + }); + if (resolved instanceof URL) { + return resolveUnqualified(npath.toPortablePath(url.fileURLToPath(resolved)), { extensions: opts2.extensions }); + } else { + if (resolved.startsWith(`#`)) + throw new Error(`Mapping from one private import to another isn't allowed`); + return resolveRequest(resolved, issuer, opts2); + } + } + function resolveRequest(request, issuer, opts2 = {}) { + try { + if (request.startsWith(`#`)) + return resolvePrivateRequest(request, issuer, opts2); + const { considerBuiltins, extensions, conditions } = opts2; + const unqualifiedPath = resolveToUnqualified(request, issuer, { considerBuiltins }); + if (request === `pnpapi`) + return unqualifiedPath; + if (unqualifiedPath === null) + return null; + const isIssuerIgnored = () => issuer !== null ? isPathIgnored(issuer) : false; + const remappedPath = (!considerBuiltins || !require$$0.isBuiltin(request)) && !isIssuerIgnored() ? resolveUnqualifiedExport(request, unqualifiedPath, conditions, issuer) : unqualifiedPath; + return resolveUnqualified(remappedPath, { extensions }); + } catch (error) { + if (Object.hasOwn(error, `pnpCode`)) + Object.assign(error.data, { request: getPathForDisplay(request), issuer: issuer && getPathForDisplay(issuer) }); + throw error; + } + } + function resolveVirtual(request) { + const normalized = ppath.normalize(request); + const resolved = VirtualFS.resolveVirtual(normalized); + return resolved !== normalized ? resolved : null; + } + return { + VERSIONS, + topLevel, + getLocator: (name, referencish) => { + if (Array.isArray(referencish)) { + return { name: referencish[0], reference: referencish[1] }; + } else { + return { name, reference: referencish }; + } + }, + getDependencyTreeRoots: () => { + return [...runtimeState.dependencyTreeRoots]; + }, + getAllLocators() { + const locators = []; + for (const [name, entry] of packageRegistry) + for (const reference of entry.keys()) + if (name !== null && reference !== null) + locators.push({ name, reference }); + return locators; + }, + getPackageInformation: (locator) => { + const info = getPackageInformation(locator); + if (info === null) + return null; + const packageLocation = npath.fromPortablePath(info.packageLocation); + const nativeInfo = { ...info, packageLocation }; + return nativeInfo; + }, + findPackageLocator: (path) => { + return findPackageLocator(npath.toPortablePath(path)); + }, + resolveToUnqualified: maybeLog(`resolveToUnqualified`, (request, issuer, opts2) => { + const portableIssuer = issuer !== null ? npath.toPortablePath(issuer) : null; + const resolution = resolveToUnqualified(npath.toPortablePath(request), portableIssuer, opts2); + if (resolution === null) + return null; + return npath.fromPortablePath(resolution); + }), + resolveUnqualified: maybeLog(`resolveUnqualified`, (unqualifiedPath, opts2) => { + return npath.fromPortablePath(resolveUnqualified(npath.toPortablePath(unqualifiedPath), opts2)); + }), + resolveRequest: maybeLog(`resolveRequest`, (request, issuer, opts2) => { + const portableIssuer = issuer !== null ? npath.toPortablePath(issuer) : null; + const resolution = resolveRequest(npath.toPortablePath(request), portableIssuer, opts2); + if (resolution === null) + return null; + return npath.fromPortablePath(resolution); + }), + resolveVirtual: maybeLog(`resolveVirtual`, (path) => { + const result = resolveVirtual(npath.toPortablePath(path)); + if (result !== null) { + return npath.fromPortablePath(result); + } else { + return null; + } + }) + }; +} + +function makeManager(pnpapi, opts) { + const initialApiPath = npath.toPortablePath(pnpapi.resolveToUnqualified(`pnpapi`, null)); + const initialApiStats = opts.fakeFs.statSync(npath.toPortablePath(initialApiPath)); + const apiMetadata = /* @__PURE__ */ new Map([ + [initialApiPath, { + instance: pnpapi, + stats: initialApiStats, + lastRefreshCheck: Date.now() + }] + ]); + function loadApiInstance(pnpApiPath) { + const nativePath = npath.fromPortablePath(pnpApiPath); + const module = new require$$0.Module(nativePath, null); + module.load(nativePath); + return module.exports; + } + function refreshApiEntry(pnpApiPath, apiEntry) { + const timeNow = Date.now(); + if (timeNow - apiEntry.lastRefreshCheck < 500) + return; + apiEntry.lastRefreshCheck = timeNow; + const stats = opts.fakeFs.statSync(pnpApiPath); + if (stats.mtime > apiEntry.stats.mtime) { + process.emitWarning(`[Warning] The runtime detected new information in a PnP file; reloading the API instance (${npath.fromPortablePath(pnpApiPath)})`); + apiEntry.stats = stats; + apiEntry.instance = loadApiInstance(pnpApiPath); + } + } + function getApiEntry(pnpApiPath, refresh = false) { + let apiEntry = apiMetadata.get(pnpApiPath); + if (typeof apiEntry !== `undefined`) { + if (refresh) { + refreshApiEntry(pnpApiPath, apiEntry); + } + } else { + apiMetadata.set(pnpApiPath, apiEntry = { + instance: loadApiInstance(pnpApiPath), + stats: opts.fakeFs.statSync(pnpApiPath), + lastRefreshCheck: Date.now() + }); + } + return apiEntry; + } + const findApiPathCache = /* @__PURE__ */ new Map(); + function addToCacheAndReturn(start, end, target) { + if (target !== null) { + target = VirtualFS.resolveVirtual(target); + target = opts.fakeFs.realpathSync(target); + } + let curr; + let next = start; + do { + curr = next; + findApiPathCache.set(curr, target); + next = ppath.dirname(curr); + } while (curr !== end); + return target; + } + function findApiPathFor(modulePath) { + let bestCandidate = null; + for (const [apiPath, apiEntry] of apiMetadata) { + const locator = apiEntry.instance.findPackageLocator(modulePath); + if (!locator) + continue; + if (apiMetadata.size === 1) + return apiPath; + const packageInformation = apiEntry.instance.getPackageInformation(locator); + if (!packageInformation) + throw new Error(`Assertion failed: Couldn't get package information for '${modulePath}'`); + if (!bestCandidate) + bestCandidate = { packageLocation: packageInformation.packageLocation, apiPaths: [] }; + if (packageInformation.packageLocation === bestCandidate.packageLocation) { + bestCandidate.apiPaths.push(apiPath); + } else if (packageInformation.packageLocation.length > bestCandidate.packageLocation.length) { + bestCandidate = { packageLocation: packageInformation.packageLocation, apiPaths: [apiPath] }; + } + } + if (bestCandidate) { + if (bestCandidate.apiPaths.length === 1) + return bestCandidate.apiPaths[0]; + const controlSegment = bestCandidate.apiPaths.map((apiPath) => ` ${npath.fromPortablePath(apiPath)}`).join(` +`); + throw new Error(`Unable to locate pnpapi, the module '${modulePath}' is controlled by multiple pnpapi instances. +This is usually caused by using the global cache (enableGlobalCache: true) + +Controlled by: +${controlSegment} +`); + } + const start = ppath.resolve(npath.toPortablePath(modulePath)); + let curr; + let next = start; + do { + curr = next; + const cached = findApiPathCache.get(curr); + if (cached !== void 0) + return addToCacheAndReturn(start, curr, cached); + const cjsCandidate = ppath.join(curr, Filename.pnpCjs); + if (opts.fakeFs.existsSync(cjsCandidate) && opts.fakeFs.statSync(cjsCandidate).isFile()) + return addToCacheAndReturn(start, curr, cjsCandidate); + const legacyCjsCandidate = ppath.join(curr, Filename.pnpJs); + if (opts.fakeFs.existsSync(legacyCjsCandidate) && opts.fakeFs.statSync(legacyCjsCandidate).isFile()) + return addToCacheAndReturn(start, curr, legacyCjsCandidate); + next = ppath.dirname(curr); + } while (curr !== PortablePath.root); + return addToCacheAndReturn(start, curr, null); + } + const moduleToApiPathCache = /* @__PURE__ */ new WeakMap(); + function getApiPathFromParent(parent) { + if (parent == null) + return initialApiPath; + let apiPath = moduleToApiPathCache.get(parent); + if (typeof apiPath !== `undefined`) + return apiPath; + apiPath = parent.filename ? findApiPathFor(parent.filename) : null; + moduleToApiPathCache.set(parent, apiPath); + return apiPath; + } + return { + getApiPathFromParent, + findApiPathFor, + getApiEntry + }; +} + +const localFs = { ...fs__default.default }; +const nodeFs = new NodeFS(localFs); +const defaultRuntimeState = $$SETUP_STATE(hydrateRuntimeState); +const defaultPnpapiResolution = __filename; +const defaultFsLayer = new VirtualFS({ + baseFs: new ZipOpenFS({ + baseFs: nodeFs, + maxOpenFiles: 80, + readOnlyArchives: true + }) +}); +class DynamicFS extends ProxiedFS { + constructor() { + super(ppath); + this.baseFs = defaultFsLayer; + } + mapToBase(p) { + return p; + } + mapFromBase(p) { + return p; + } +} +const dynamicFsLayer = new DynamicFS(); +let manager; +const defaultApi = Object.assign(makeApi(defaultRuntimeState, { + fakeFs: dynamicFsLayer, + pnpapiResolution: defaultPnpapiResolution +}), { + makeApi: ({ + basePath = void 0, + fakeFs = dynamicFsLayer, + pnpapiResolution = defaultPnpapiResolution, + ...rest + }) => { + const apiRuntimeState = typeof basePath !== `undefined` ? $$SETUP_STATE(hydrateRuntimeState, basePath) : defaultRuntimeState; + return makeApi(apiRuntimeState, { + fakeFs, + pnpapiResolution, + ...rest + }); + }, + setup: (api) => { + applyPatch(api || defaultApi, { + fakeFs: defaultFsLayer, + manager + }); + dynamicFsLayer.baseFs = new NodeFS(fs__default.default); + } +}); +manager = makeManager(defaultApi, { + fakeFs: dynamicFsLayer +}); +if (module.parent && module.parent.id === `internal/preload`) { + defaultApi.setup(); + if (module.filename) { + delete require$$0__default.default._cache[module.filename]; + } +} +if (process.mainModule === module) { + const reportError = (code, message, data) => { + process.stdout.write(`${JSON.stringify([{ code, message, data }, null])} +`); + }; + const reportSuccess = (resolution) => { + process.stdout.write(`${JSON.stringify([null, resolution])} +`); + }; + const processResolution = (request, issuer) => { + try { + reportSuccess(defaultApi.resolveRequest(request, issuer)); + } catch (error) { + reportError(error.code, error.message, error.data); + } + }; + const processRequest = (data) => { + try { + const [request, issuer] = JSON.parse(data); + processResolution(request, issuer); + } catch (error) { + reportError(`INVALID_JSON`, error.message, error.data); + } + }; + if (process.argv.length > 2) { + if (process.argv.length !== 4) { + process.stderr.write(`Usage: ${process.argv[0]} ${process.argv[1]} +`); + process.exitCode = 64; + } else { + processResolution(process.argv[2], process.argv[3]); + } + } else { + let buffer = ``; + const decoder = new StringDecoder__default.default.StringDecoder(); + process.stdin.on(`data`, (chunk) => { + buffer += decoder.write(chunk); + do { + const index = buffer.indexOf(` +`); + if (index === -1) + break; + const line = buffer.slice(0, index); + buffer = buffer.slice(index + 1); + processRequest(line); + } while (true); + }); + } +} + +module.exports = defaultApi; diff --git a/.pnp.loader.mjs b/.pnp.loader.mjs new file mode 100644 index 00000000..fe96ee1d --- /dev/null +++ b/.pnp.loader.mjs @@ -0,0 +1,2090 @@ +import fs from 'fs'; +import { URL as URL$1, fileURLToPath, pathToFileURL } from 'url'; +import path from 'path'; +import { createHash } from 'crypto'; +import { EOL } from 'os'; +import moduleExports, { isBuiltin } from 'module'; +import assert from 'assert'; + +const SAFE_TIME = 456789e3; + +const PortablePath = { + root: `/`, + dot: `.`, + parent: `..` +}; +const npath = Object.create(path); +const ppath = Object.create(path.posix); +npath.cwd = () => process.cwd(); +ppath.cwd = process.platform === `win32` ? () => toPortablePath(process.cwd()) : process.cwd; +if (process.platform === `win32`) { + ppath.resolve = (...segments) => { + if (segments.length > 0 && ppath.isAbsolute(segments[0])) { + return path.posix.resolve(...segments); + } else { + return path.posix.resolve(ppath.cwd(), ...segments); + } + }; +} +const contains = function(pathUtils, from, to) { + from = pathUtils.normalize(from); + to = pathUtils.normalize(to); + if (from === to) + return `.`; + if (!from.endsWith(pathUtils.sep)) + from = from + pathUtils.sep; + if (to.startsWith(from)) { + return to.slice(from.length); + } else { + return null; + } +}; +npath.contains = (from, to) => contains(npath, from, to); +ppath.contains = (from, to) => contains(ppath, from, to); +const WINDOWS_PATH_REGEXP = /^([a-zA-Z]:.*)$/; +const UNC_WINDOWS_PATH_REGEXP = /^\/\/(\.\/)?(.*)$/; +const PORTABLE_PATH_REGEXP = /^\/([a-zA-Z]:.*)$/; +const UNC_PORTABLE_PATH_REGEXP = /^\/unc\/(\.dot\/)?(.*)$/; +function fromPortablePathWin32(p) { + let portablePathMatch, uncPortablePathMatch; + if (portablePathMatch = p.match(PORTABLE_PATH_REGEXP)) + p = portablePathMatch[1]; + else if (uncPortablePathMatch = p.match(UNC_PORTABLE_PATH_REGEXP)) + p = `\\\\${uncPortablePathMatch[1] ? `.\\` : ``}${uncPortablePathMatch[2]}`; + else + return p; + return p.replace(/\//g, `\\`); +} +function toPortablePathWin32(p) { + p = p.replace(/\\/g, `/`); + let windowsPathMatch, uncWindowsPathMatch; + if (windowsPathMatch = p.match(WINDOWS_PATH_REGEXP)) + p = `/${windowsPathMatch[1]}`; + else if (uncWindowsPathMatch = p.match(UNC_WINDOWS_PATH_REGEXP)) + p = `/unc/${uncWindowsPathMatch[1] ? `.dot/` : ``}${uncWindowsPathMatch[2]}`; + return p; +} +const toPortablePath = process.platform === `win32` ? toPortablePathWin32 : (p) => p; +const fromPortablePath = process.platform === `win32` ? fromPortablePathWin32 : (p) => p; +npath.fromPortablePath = fromPortablePath; +npath.toPortablePath = toPortablePath; +function convertPath(targetPathUtils, sourcePath) { + return targetPathUtils === npath ? fromPortablePath(sourcePath) : toPortablePath(sourcePath); +} + +const defaultTime = new Date(SAFE_TIME * 1e3); +const defaultTimeMs = defaultTime.getTime(); +async function copyPromise(destinationFs, destination, sourceFs, source, opts) { + const normalizedDestination = destinationFs.pathUtils.normalize(destination); + const normalizedSource = sourceFs.pathUtils.normalize(source); + const prelayout = []; + const postlayout = []; + const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : await sourceFs.lstatPromise(normalizedSource); + await destinationFs.mkdirpPromise(destinationFs.pathUtils.dirname(destination), { utimes: [atime, mtime] }); + await copyImpl(prelayout, postlayout, destinationFs, normalizedDestination, sourceFs, normalizedSource, { ...opts, didParentExist: true }); + for (const operation of prelayout) + await operation(); + await Promise.all(postlayout.map((operation) => { + return operation(); + })); +} +async function copyImpl(prelayout, postlayout, destinationFs, destination, sourceFs, source, opts) { + const destinationStat = opts.didParentExist ? await maybeLStat(destinationFs, destination) : null; + const sourceStat = await sourceFs.lstatPromise(source); + const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : sourceStat; + let updated; + switch (true) { + case sourceStat.isDirectory(): + { + updated = await copyFolder(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } + break; + case sourceStat.isFile(): + { + updated = await copyFile(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } + break; + case sourceStat.isSymbolicLink(): + { + updated = await copySymlink(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } + break; + default: + { + throw new Error(`Unsupported file type (${sourceStat.mode})`); + } + } + if (opts.linkStrategy?.type !== `HardlinkFromIndex` || !sourceStat.isFile()) { + if (updated || destinationStat?.mtime?.getTime() !== mtime.getTime() || destinationStat?.atime?.getTime() !== atime.getTime()) { + postlayout.push(() => destinationFs.lutimesPromise(destination, atime, mtime)); + updated = true; + } + if (destinationStat === null || (destinationStat.mode & 511) !== (sourceStat.mode & 511)) { + postlayout.push(() => destinationFs.chmodPromise(destination, sourceStat.mode & 511)); + updated = true; + } + } + return updated; +} +async function maybeLStat(baseFs, p) { + try { + return await baseFs.lstatPromise(p); + } catch (e) { + return null; + } +} +async function copyFolder(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (destinationStat !== null && !destinationStat.isDirectory()) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + let updated = false; + if (destinationStat === null) { + prelayout.push(async () => { + try { + await destinationFs.mkdirPromise(destination, { mode: sourceStat.mode }); + } catch (err) { + if (err.code !== `EEXIST`) { + throw err; + } + } + }); + updated = true; + } + const entries = await sourceFs.readdirPromise(source); + const nextOpts = opts.didParentExist && !destinationStat ? { ...opts, didParentExist: false } : opts; + if (opts.stableSort) { + for (const entry of entries.sort()) { + if (await copyImpl(prelayout, postlayout, destinationFs, destinationFs.pathUtils.join(destination, entry), sourceFs, sourceFs.pathUtils.join(source, entry), nextOpts)) { + updated = true; + } + } + } else { + const entriesUpdateStatus = await Promise.all(entries.map(async (entry) => { + await copyImpl(prelayout, postlayout, destinationFs, destinationFs.pathUtils.join(destination, entry), sourceFs, sourceFs.pathUtils.join(source, entry), nextOpts); + })); + if (entriesUpdateStatus.some((status) => status)) { + updated = true; + } + } + return updated; +} +async function copyFileViaIndex(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts, linkStrategy) { + const sourceHash = await sourceFs.checksumFilePromise(source, { algorithm: `sha1` }); + const indexPath = destinationFs.pathUtils.join(linkStrategy.indexPath, sourceHash.slice(0, 2), `${sourceHash}.dat`); + let AtomicBehavior; + ((AtomicBehavior2) => { + AtomicBehavior2[AtomicBehavior2["Lock"] = 0] = "Lock"; + AtomicBehavior2[AtomicBehavior2["Rename"] = 1] = "Rename"; + })(AtomicBehavior || (AtomicBehavior = {})); + let atomicBehavior = 1 /* Rename */; + let indexStat = await maybeLStat(destinationFs, indexPath); + if (destinationStat) { + const isDestinationHardlinkedFromIndex = indexStat && destinationStat.dev === indexStat.dev && destinationStat.ino === indexStat.ino; + const isIndexModified = indexStat?.mtimeMs !== defaultTimeMs; + if (isDestinationHardlinkedFromIndex) { + if (isIndexModified && linkStrategy.autoRepair) { + atomicBehavior = 0 /* Lock */; + indexStat = null; + } + } + if (!isDestinationHardlinkedFromIndex) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + } + const tempPath = !indexStat && atomicBehavior === 1 /* Rename */ ? `${indexPath}.${Math.floor(Math.random() * 4294967296).toString(16).padStart(8, `0`)}` : null; + let tempPathCleaned = false; + prelayout.push(async () => { + if (!indexStat) { + if (atomicBehavior === 0 /* Lock */) { + await destinationFs.lockPromise(indexPath, async () => { + const content = await sourceFs.readFilePromise(source); + await destinationFs.writeFilePromise(indexPath, content); + }); + } + if (atomicBehavior === 1 /* Rename */ && tempPath) { + const content = await sourceFs.readFilePromise(source); + await destinationFs.writeFilePromise(tempPath, content); + try { + await destinationFs.linkPromise(tempPath, indexPath); + } catch (err) { + if (err.code === `EEXIST`) { + tempPathCleaned = true; + await destinationFs.unlinkPromise(tempPath); + } else { + throw err; + } + } + } + } + if (!destinationStat) { + await destinationFs.linkPromise(indexPath, destination); + } + }); + postlayout.push(async () => { + if (!indexStat) + await destinationFs.lutimesPromise(indexPath, defaultTime, defaultTime); + if (tempPath && !tempPathCleaned) { + await destinationFs.unlinkPromise(tempPath); + } + }); + return false; +} +async function copyFileDirect(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (destinationStat !== null) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + prelayout.push(async () => { + const content = await sourceFs.readFilePromise(source); + await destinationFs.writeFilePromise(destination, content); + }); + return true; +} +async function copyFile(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (opts.linkStrategy?.type === `HardlinkFromIndex`) { + return copyFileViaIndex(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts, opts.linkStrategy); + } else { + return copyFileDirect(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } +} +async function copySymlink(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (destinationStat !== null) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + prelayout.push(async () => { + await destinationFs.symlinkPromise(convertPath(destinationFs.pathUtils, await sourceFs.readlinkPromise(source)), destination); + }); + return true; +} + +class FakeFS { + constructor(pathUtils) { + this.pathUtils = pathUtils; + } + async *genTraversePromise(init, { stableSort = false } = {}) { + const stack = [init]; + while (stack.length > 0) { + const p = stack.shift(); + const entry = await this.lstatPromise(p); + if (entry.isDirectory()) { + const entries = await this.readdirPromise(p); + if (stableSort) { + for (const entry2 of entries.sort()) { + stack.push(this.pathUtils.join(p, entry2)); + } + } else { + throw new Error(`Not supported`); + } + } else { + yield p; + } + } + } + async checksumFilePromise(path, { algorithm = `sha512` } = {}) { + const fd = await this.openPromise(path, `r`); + try { + const CHUNK_SIZE = 65536; + const chunk = Buffer.allocUnsafeSlow(CHUNK_SIZE); + const hash = createHash(algorithm); + let bytesRead = 0; + while ((bytesRead = await this.readPromise(fd, chunk, 0, CHUNK_SIZE)) !== 0) + hash.update(bytesRead === CHUNK_SIZE ? chunk : chunk.slice(0, bytesRead)); + return hash.digest(`hex`); + } finally { + await this.closePromise(fd); + } + } + async removePromise(p, { recursive = true, maxRetries = 5 } = {}) { + let stat; + try { + stat = await this.lstatPromise(p); + } catch (error) { + if (error.code === `ENOENT`) { + return; + } else { + throw error; + } + } + if (stat.isDirectory()) { + if (recursive) { + const entries = await this.readdirPromise(p); + await Promise.all(entries.map((entry) => { + return this.removePromise(this.pathUtils.resolve(p, entry)); + })); + } + for (let t = 0; t <= maxRetries; t++) { + try { + await this.rmdirPromise(p); + break; + } catch (error) { + if (error.code !== `EBUSY` && error.code !== `ENOTEMPTY`) { + throw error; + } else if (t < maxRetries) { + await new Promise((resolve) => setTimeout(resolve, t * 100)); + } + } + } + } else { + await this.unlinkPromise(p); + } + } + removeSync(p, { recursive = true } = {}) { + let stat; + try { + stat = this.lstatSync(p); + } catch (error) { + if (error.code === `ENOENT`) { + return; + } else { + throw error; + } + } + if (stat.isDirectory()) { + if (recursive) + for (const entry of this.readdirSync(p)) + this.removeSync(this.pathUtils.resolve(p, entry)); + this.rmdirSync(p); + } else { + this.unlinkSync(p); + } + } + async mkdirpPromise(p, { chmod, utimes } = {}) { + p = this.resolve(p); + if (p === this.pathUtils.dirname(p)) + return void 0; + const parts = p.split(this.pathUtils.sep); + let createdDirectory; + for (let u = 2; u <= parts.length; ++u) { + const subPath = parts.slice(0, u).join(this.pathUtils.sep); + if (!this.existsSync(subPath)) { + try { + await this.mkdirPromise(subPath); + } catch (error) { + if (error.code === `EEXIST`) { + continue; + } else { + throw error; + } + } + createdDirectory ??= subPath; + if (chmod != null) + await this.chmodPromise(subPath, chmod); + if (utimes != null) { + await this.utimesPromise(subPath, utimes[0], utimes[1]); + } else { + const parentStat = await this.statPromise(this.pathUtils.dirname(subPath)); + await this.utimesPromise(subPath, parentStat.atime, parentStat.mtime); + } + } + } + return createdDirectory; + } + mkdirpSync(p, { chmod, utimes } = {}) { + p = this.resolve(p); + if (p === this.pathUtils.dirname(p)) + return void 0; + const parts = p.split(this.pathUtils.sep); + let createdDirectory; + for (let u = 2; u <= parts.length; ++u) { + const subPath = parts.slice(0, u).join(this.pathUtils.sep); + if (!this.existsSync(subPath)) { + try { + this.mkdirSync(subPath); + } catch (error) { + if (error.code === `EEXIST`) { + continue; + } else { + throw error; + } + } + createdDirectory ??= subPath; + if (chmod != null) + this.chmodSync(subPath, chmod); + if (utimes != null) { + this.utimesSync(subPath, utimes[0], utimes[1]); + } else { + const parentStat = this.statSync(this.pathUtils.dirname(subPath)); + this.utimesSync(subPath, parentStat.atime, parentStat.mtime); + } + } + } + return createdDirectory; + } + async copyPromise(destination, source, { baseFs = this, overwrite = true, stableSort = false, stableTime = false, linkStrategy = null } = {}) { + return await copyPromise(this, destination, baseFs, source, { overwrite, stableSort, stableTime, linkStrategy }); + } + copySync(destination, source, { baseFs = this, overwrite = true } = {}) { + const stat = baseFs.lstatSync(source); + const exists = this.existsSync(destination); + if (stat.isDirectory()) { + this.mkdirpSync(destination); + const directoryListing = baseFs.readdirSync(source); + for (const entry of directoryListing) { + this.copySync(this.pathUtils.join(destination, entry), baseFs.pathUtils.join(source, entry), { baseFs, overwrite }); + } + } else if (stat.isFile()) { + if (!exists || overwrite) { + if (exists) + this.removeSync(destination); + const content = baseFs.readFileSync(source); + this.writeFileSync(destination, content); + } + } else if (stat.isSymbolicLink()) { + if (!exists || overwrite) { + if (exists) + this.removeSync(destination); + const target = baseFs.readlinkSync(source); + this.symlinkSync(convertPath(this.pathUtils, target), destination); + } + } else { + throw new Error(`Unsupported file type (file: ${source}, mode: 0o${stat.mode.toString(8).padStart(6, `0`)})`); + } + const mode = stat.mode & 511; + this.chmodSync(destination, mode); + } + async changeFilePromise(p, content, opts = {}) { + if (Buffer.isBuffer(content)) { + return this.changeFileBufferPromise(p, content, opts); + } else { + return this.changeFileTextPromise(p, content, opts); + } + } + async changeFileBufferPromise(p, content, { mode } = {}) { + let current = Buffer.alloc(0); + try { + current = await this.readFilePromise(p); + } catch (error) { + } + if (Buffer.compare(current, content) === 0) + return; + await this.writeFilePromise(p, content, { mode }); + } + async changeFileTextPromise(p, content, { automaticNewlines, mode } = {}) { + let current = ``; + try { + current = await this.readFilePromise(p, `utf8`); + } catch (error) { + } + const normalizedContent = automaticNewlines ? normalizeLineEndings(current, content) : content; + if (current === normalizedContent) + return; + await this.writeFilePromise(p, normalizedContent, { mode }); + } + changeFileSync(p, content, opts = {}) { + if (Buffer.isBuffer(content)) { + return this.changeFileBufferSync(p, content, opts); + } else { + return this.changeFileTextSync(p, content, opts); + } + } + changeFileBufferSync(p, content, { mode } = {}) { + let current = Buffer.alloc(0); + try { + current = this.readFileSync(p); + } catch (error) { + } + if (Buffer.compare(current, content) === 0) + return; + this.writeFileSync(p, content, { mode }); + } + changeFileTextSync(p, content, { automaticNewlines = false, mode } = {}) { + let current = ``; + try { + current = this.readFileSync(p, `utf8`); + } catch (error) { + } + const normalizedContent = automaticNewlines ? normalizeLineEndings(current, content) : content; + if (current === normalizedContent) + return; + this.writeFileSync(p, normalizedContent, { mode }); + } + async movePromise(fromP, toP) { + try { + await this.renamePromise(fromP, toP); + } catch (error) { + if (error.code === `EXDEV`) { + await this.copyPromise(toP, fromP); + await this.removePromise(fromP); + } else { + throw error; + } + } + } + moveSync(fromP, toP) { + try { + this.renameSync(fromP, toP); + } catch (error) { + if (error.code === `EXDEV`) { + this.copySync(toP, fromP); + this.removeSync(fromP); + } else { + throw error; + } + } + } + async lockPromise(affectedPath, callback) { + const lockPath = `${affectedPath}.flock`; + const interval = 1e3 / 60; + const startTime = Date.now(); + let fd = null; + const isAlive = async () => { + let pid; + try { + [pid] = await this.readJsonPromise(lockPath); + } catch (error) { + return Date.now() - startTime < 500; + } + try { + process.kill(pid, 0); + return true; + } catch (error) { + return false; + } + }; + while (fd === null) { + try { + fd = await this.openPromise(lockPath, `wx`); + } catch (error) { + if (error.code === `EEXIST`) { + if (!await isAlive()) { + try { + await this.unlinkPromise(lockPath); + continue; + } catch (error2) { + } + } + if (Date.now() - startTime < 60 * 1e3) { + await new Promise((resolve) => setTimeout(resolve, interval)); + } else { + throw new Error(`Couldn't acquire a lock in a reasonable time (via ${lockPath})`); + } + } else { + throw error; + } + } + } + await this.writePromise(fd, JSON.stringify([process.pid])); + try { + return await callback(); + } finally { + try { + await this.closePromise(fd); + await this.unlinkPromise(lockPath); + } catch (error) { + } + } + } + async readJsonPromise(p) { + const content = await this.readFilePromise(p, `utf8`); + try { + return JSON.parse(content); + } catch (error) { + error.message += ` (in ${p})`; + throw error; + } + } + readJsonSync(p) { + const content = this.readFileSync(p, `utf8`); + try { + return JSON.parse(content); + } catch (error) { + error.message += ` (in ${p})`; + throw error; + } + } + async writeJsonPromise(p, data, { compact = false } = {}) { + const space = compact ? 0 : 2; + return await this.writeFilePromise(p, `${JSON.stringify(data, null, space)} +`); + } + writeJsonSync(p, data, { compact = false } = {}) { + const space = compact ? 0 : 2; + return this.writeFileSync(p, `${JSON.stringify(data, null, space)} +`); + } + async preserveTimePromise(p, cb) { + const stat = await this.lstatPromise(p); + const result = await cb(); + if (typeof result !== `undefined`) + p = result; + await this.lutimesPromise(p, stat.atime, stat.mtime); + } + async preserveTimeSync(p, cb) { + const stat = this.lstatSync(p); + const result = cb(); + if (typeof result !== `undefined`) + p = result; + this.lutimesSync(p, stat.atime, stat.mtime); + } +} +class BasePortableFakeFS extends FakeFS { + constructor() { + super(ppath); + } +} +function getEndOfLine(content) { + const matches = content.match(/\r?\n/g); + if (matches === null) + return EOL; + const crlf = matches.filter((nl) => nl === `\r +`).length; + const lf = matches.length - crlf; + return crlf > lf ? `\r +` : ` +`; +} +function normalizeLineEndings(originalContent, newContent) { + return newContent.replace(/\r?\n/g, getEndOfLine(originalContent)); +} + +class ProxiedFS extends FakeFS { + getExtractHint(hints) { + return this.baseFs.getExtractHint(hints); + } + resolve(path) { + return this.mapFromBase(this.baseFs.resolve(this.mapToBase(path))); + } + getRealPath() { + return this.mapFromBase(this.baseFs.getRealPath()); + } + async openPromise(p, flags, mode) { + return this.baseFs.openPromise(this.mapToBase(p), flags, mode); + } + openSync(p, flags, mode) { + return this.baseFs.openSync(this.mapToBase(p), flags, mode); + } + async opendirPromise(p, opts) { + return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(p), opts), { path: p }); + } + opendirSync(p, opts) { + return Object.assign(this.baseFs.opendirSync(this.mapToBase(p), opts), { path: p }); + } + async readPromise(fd, buffer, offset, length, position) { + return await this.baseFs.readPromise(fd, buffer, offset, length, position); + } + readSync(fd, buffer, offset, length, position) { + return this.baseFs.readSync(fd, buffer, offset, length, position); + } + async writePromise(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return await this.baseFs.writePromise(fd, buffer, offset); + } else { + return await this.baseFs.writePromise(fd, buffer, offset, length, position); + } + } + writeSync(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return this.baseFs.writeSync(fd, buffer, offset); + } else { + return this.baseFs.writeSync(fd, buffer, offset, length, position); + } + } + async closePromise(fd) { + return this.baseFs.closePromise(fd); + } + closeSync(fd) { + this.baseFs.closeSync(fd); + } + createReadStream(p, opts) { + return this.baseFs.createReadStream(p !== null ? this.mapToBase(p) : p, opts); + } + createWriteStream(p, opts) { + return this.baseFs.createWriteStream(p !== null ? this.mapToBase(p) : p, opts); + } + async realpathPromise(p) { + return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(p))); + } + realpathSync(p) { + return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(p))); + } + async existsPromise(p) { + return this.baseFs.existsPromise(this.mapToBase(p)); + } + existsSync(p) { + return this.baseFs.existsSync(this.mapToBase(p)); + } + accessSync(p, mode) { + return this.baseFs.accessSync(this.mapToBase(p), mode); + } + async accessPromise(p, mode) { + return this.baseFs.accessPromise(this.mapToBase(p), mode); + } + async statPromise(p, opts) { + return this.baseFs.statPromise(this.mapToBase(p), opts); + } + statSync(p, opts) { + return this.baseFs.statSync(this.mapToBase(p), opts); + } + async fstatPromise(fd, opts) { + return this.baseFs.fstatPromise(fd, opts); + } + fstatSync(fd, opts) { + return this.baseFs.fstatSync(fd, opts); + } + lstatPromise(p, opts) { + return this.baseFs.lstatPromise(this.mapToBase(p), opts); + } + lstatSync(p, opts) { + return this.baseFs.lstatSync(this.mapToBase(p), opts); + } + async fchmodPromise(fd, mask) { + return this.baseFs.fchmodPromise(fd, mask); + } + fchmodSync(fd, mask) { + return this.baseFs.fchmodSync(fd, mask); + } + async chmodPromise(p, mask) { + return this.baseFs.chmodPromise(this.mapToBase(p), mask); + } + chmodSync(p, mask) { + return this.baseFs.chmodSync(this.mapToBase(p), mask); + } + async fchownPromise(fd, uid, gid) { + return this.baseFs.fchownPromise(fd, uid, gid); + } + fchownSync(fd, uid, gid) { + return this.baseFs.fchownSync(fd, uid, gid); + } + async chownPromise(p, uid, gid) { + return this.baseFs.chownPromise(this.mapToBase(p), uid, gid); + } + chownSync(p, uid, gid) { + return this.baseFs.chownSync(this.mapToBase(p), uid, gid); + } + async renamePromise(oldP, newP) { + return this.baseFs.renamePromise(this.mapToBase(oldP), this.mapToBase(newP)); + } + renameSync(oldP, newP) { + return this.baseFs.renameSync(this.mapToBase(oldP), this.mapToBase(newP)); + } + async copyFilePromise(sourceP, destP, flags = 0) { + return this.baseFs.copyFilePromise(this.mapToBase(sourceP), this.mapToBase(destP), flags); + } + copyFileSync(sourceP, destP, flags = 0) { + return this.baseFs.copyFileSync(this.mapToBase(sourceP), this.mapToBase(destP), flags); + } + async appendFilePromise(p, content, opts) { + return this.baseFs.appendFilePromise(this.fsMapToBase(p), content, opts); + } + appendFileSync(p, content, opts) { + return this.baseFs.appendFileSync(this.fsMapToBase(p), content, opts); + } + async writeFilePromise(p, content, opts) { + return this.baseFs.writeFilePromise(this.fsMapToBase(p), content, opts); + } + writeFileSync(p, content, opts) { + return this.baseFs.writeFileSync(this.fsMapToBase(p), content, opts); + } + async unlinkPromise(p) { + return this.baseFs.unlinkPromise(this.mapToBase(p)); + } + unlinkSync(p) { + return this.baseFs.unlinkSync(this.mapToBase(p)); + } + async utimesPromise(p, atime, mtime) { + return this.baseFs.utimesPromise(this.mapToBase(p), atime, mtime); + } + utimesSync(p, atime, mtime) { + return this.baseFs.utimesSync(this.mapToBase(p), atime, mtime); + } + async lutimesPromise(p, atime, mtime) { + return this.baseFs.lutimesPromise(this.mapToBase(p), atime, mtime); + } + lutimesSync(p, atime, mtime) { + return this.baseFs.lutimesSync(this.mapToBase(p), atime, mtime); + } + async mkdirPromise(p, opts) { + return this.baseFs.mkdirPromise(this.mapToBase(p), opts); + } + mkdirSync(p, opts) { + return this.baseFs.mkdirSync(this.mapToBase(p), opts); + } + async rmdirPromise(p, opts) { + return this.baseFs.rmdirPromise(this.mapToBase(p), opts); + } + rmdirSync(p, opts) { + return this.baseFs.rmdirSync(this.mapToBase(p), opts); + } + async linkPromise(existingP, newP) { + return this.baseFs.linkPromise(this.mapToBase(existingP), this.mapToBase(newP)); + } + linkSync(existingP, newP) { + return this.baseFs.linkSync(this.mapToBase(existingP), this.mapToBase(newP)); + } + async symlinkPromise(target, p, type) { + const mappedP = this.mapToBase(p); + if (this.pathUtils.isAbsolute(target)) + return this.baseFs.symlinkPromise(this.mapToBase(target), mappedP, type); + const mappedAbsoluteTarget = this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(p), target)); + const mappedTarget = this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(mappedP), mappedAbsoluteTarget); + return this.baseFs.symlinkPromise(mappedTarget, mappedP, type); + } + symlinkSync(target, p, type) { + const mappedP = this.mapToBase(p); + if (this.pathUtils.isAbsolute(target)) + return this.baseFs.symlinkSync(this.mapToBase(target), mappedP, type); + const mappedAbsoluteTarget = this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(p), target)); + const mappedTarget = this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(mappedP), mappedAbsoluteTarget); + return this.baseFs.symlinkSync(mappedTarget, mappedP, type); + } + async readFilePromise(p, encoding) { + return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding); + } + readFileSync(p, encoding) { + return this.baseFs.readFileSync(this.fsMapToBase(p), encoding); + } + readdirPromise(p, opts) { + return this.baseFs.readdirPromise(this.mapToBase(p), opts); + } + readdirSync(p, opts) { + return this.baseFs.readdirSync(this.mapToBase(p), opts); + } + async readlinkPromise(p) { + return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(p))); + } + readlinkSync(p) { + return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(p))); + } + async truncatePromise(p, len) { + return this.baseFs.truncatePromise(this.mapToBase(p), len); + } + truncateSync(p, len) { + return this.baseFs.truncateSync(this.mapToBase(p), len); + } + async ftruncatePromise(fd, len) { + return this.baseFs.ftruncatePromise(fd, len); + } + ftruncateSync(fd, len) { + return this.baseFs.ftruncateSync(fd, len); + } + watch(p, a, b) { + return this.baseFs.watch( + this.mapToBase(p), + a, + b + ); + } + watchFile(p, a, b) { + return this.baseFs.watchFile( + this.mapToBase(p), + a, + b + ); + } + unwatchFile(p, cb) { + return this.baseFs.unwatchFile(this.mapToBase(p), cb); + } + fsMapToBase(p) { + if (typeof p === `number`) { + return p; + } else { + return this.mapToBase(p); + } + } +} + +function direntToPortable(dirent) { + const portableDirent = dirent; + if (typeof dirent.path === `string`) + portableDirent.path = npath.toPortablePath(dirent.path); + return portableDirent; +} +class NodeFS extends BasePortableFakeFS { + constructor(realFs = fs) { + super(); + this.realFs = realFs; + } + getExtractHint() { + return false; + } + getRealPath() { + return PortablePath.root; + } + resolve(p) { + return ppath.resolve(p); + } + async openPromise(p, flags, mode) { + return await new Promise((resolve, reject) => { + this.realFs.open(npath.fromPortablePath(p), flags, mode, this.makeCallback(resolve, reject)); + }); + } + openSync(p, flags, mode) { + return this.realFs.openSync(npath.fromPortablePath(p), flags, mode); + } + async opendirPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (typeof opts !== `undefined`) { + this.realFs.opendir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.opendir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }).then((dir) => { + const dirWithFixedPath = dir; + Object.defineProperty(dirWithFixedPath, `path`, { + value: p, + configurable: true, + writable: true + }); + return dirWithFixedPath; + }); + } + opendirSync(p, opts) { + const dir = typeof opts !== `undefined` ? this.realFs.opendirSync(npath.fromPortablePath(p), opts) : this.realFs.opendirSync(npath.fromPortablePath(p)); + const dirWithFixedPath = dir; + Object.defineProperty(dirWithFixedPath, `path`, { + value: p, + configurable: true, + writable: true + }); + return dirWithFixedPath; + } + async readPromise(fd, buffer, offset = 0, length = 0, position = -1) { + return await new Promise((resolve, reject) => { + this.realFs.read(fd, buffer, offset, length, position, (error, bytesRead) => { + if (error) { + reject(error); + } else { + resolve(bytesRead); + } + }); + }); + } + readSync(fd, buffer, offset, length, position) { + return this.realFs.readSync(fd, buffer, offset, length, position); + } + async writePromise(fd, buffer, offset, length, position) { + return await new Promise((resolve, reject) => { + if (typeof buffer === `string`) { + return this.realFs.write(fd, buffer, offset, this.makeCallback(resolve, reject)); + } else { + return this.realFs.write(fd, buffer, offset, length, position, this.makeCallback(resolve, reject)); + } + }); + } + writeSync(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return this.realFs.writeSync(fd, buffer, offset); + } else { + return this.realFs.writeSync(fd, buffer, offset, length, position); + } + } + async closePromise(fd) { + await new Promise((resolve, reject) => { + this.realFs.close(fd, this.makeCallback(resolve, reject)); + }); + } + closeSync(fd) { + this.realFs.closeSync(fd); + } + createReadStream(p, opts) { + const realPath = p !== null ? npath.fromPortablePath(p) : p; + return this.realFs.createReadStream(realPath, opts); + } + createWriteStream(p, opts) { + const realPath = p !== null ? npath.fromPortablePath(p) : p; + return this.realFs.createWriteStream(realPath, opts); + } + async realpathPromise(p) { + return await new Promise((resolve, reject) => { + this.realFs.realpath(npath.fromPortablePath(p), {}, this.makeCallback(resolve, reject)); + }).then((path) => { + return npath.toPortablePath(path); + }); + } + realpathSync(p) { + return npath.toPortablePath(this.realFs.realpathSync(npath.fromPortablePath(p), {})); + } + async existsPromise(p) { + return await new Promise((resolve) => { + this.realFs.exists(npath.fromPortablePath(p), resolve); + }); + } + accessSync(p, mode) { + return this.realFs.accessSync(npath.fromPortablePath(p), mode); + } + async accessPromise(p, mode) { + return await new Promise((resolve, reject) => { + this.realFs.access(npath.fromPortablePath(p), mode, this.makeCallback(resolve, reject)); + }); + } + existsSync(p) { + return this.realFs.existsSync(npath.fromPortablePath(p)); + } + async statPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.stat(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.stat(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + statSync(p, opts) { + if (opts) { + return this.realFs.statSync(npath.fromPortablePath(p), opts); + } else { + return this.realFs.statSync(npath.fromPortablePath(p)); + } + } + async fstatPromise(fd, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.fstat(fd, opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.fstat(fd, this.makeCallback(resolve, reject)); + } + }); + } + fstatSync(fd, opts) { + if (opts) { + return this.realFs.fstatSync(fd, opts); + } else { + return this.realFs.fstatSync(fd); + } + } + async lstatPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.lstat(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.lstat(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + lstatSync(p, opts) { + if (opts) { + return this.realFs.lstatSync(npath.fromPortablePath(p), opts); + } else { + return this.realFs.lstatSync(npath.fromPortablePath(p)); + } + } + async fchmodPromise(fd, mask) { + return await new Promise((resolve, reject) => { + this.realFs.fchmod(fd, mask, this.makeCallback(resolve, reject)); + }); + } + fchmodSync(fd, mask) { + return this.realFs.fchmodSync(fd, mask); + } + async chmodPromise(p, mask) { + return await new Promise((resolve, reject) => { + this.realFs.chmod(npath.fromPortablePath(p), mask, this.makeCallback(resolve, reject)); + }); + } + chmodSync(p, mask) { + return this.realFs.chmodSync(npath.fromPortablePath(p), mask); + } + async fchownPromise(fd, uid, gid) { + return await new Promise((resolve, reject) => { + this.realFs.fchown(fd, uid, gid, this.makeCallback(resolve, reject)); + }); + } + fchownSync(fd, uid, gid) { + return this.realFs.fchownSync(fd, uid, gid); + } + async chownPromise(p, uid, gid) { + return await new Promise((resolve, reject) => { + this.realFs.chown(npath.fromPortablePath(p), uid, gid, this.makeCallback(resolve, reject)); + }); + } + chownSync(p, uid, gid) { + return this.realFs.chownSync(npath.fromPortablePath(p), uid, gid); + } + async renamePromise(oldP, newP) { + return await new Promise((resolve, reject) => { + this.realFs.rename(npath.fromPortablePath(oldP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); + }); + } + renameSync(oldP, newP) { + return this.realFs.renameSync(npath.fromPortablePath(oldP), npath.fromPortablePath(newP)); + } + async copyFilePromise(sourceP, destP, flags = 0) { + return await new Promise((resolve, reject) => { + this.realFs.copyFile(npath.fromPortablePath(sourceP), npath.fromPortablePath(destP), flags, this.makeCallback(resolve, reject)); + }); + } + copyFileSync(sourceP, destP, flags = 0) { + return this.realFs.copyFileSync(npath.fromPortablePath(sourceP), npath.fromPortablePath(destP), flags); + } + async appendFilePromise(p, content, opts) { + return await new Promise((resolve, reject) => { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.appendFile(fsNativePath, content, opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.appendFile(fsNativePath, content, this.makeCallback(resolve, reject)); + } + }); + } + appendFileSync(p, content, opts) { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.appendFileSync(fsNativePath, content, opts); + } else { + this.realFs.appendFileSync(fsNativePath, content); + } + } + async writeFilePromise(p, content, opts) { + return await new Promise((resolve, reject) => { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.writeFile(fsNativePath, content, opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.writeFile(fsNativePath, content, this.makeCallback(resolve, reject)); + } + }); + } + writeFileSync(p, content, opts) { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.writeFileSync(fsNativePath, content, opts); + } else { + this.realFs.writeFileSync(fsNativePath, content); + } + } + async unlinkPromise(p) { + return await new Promise((resolve, reject) => { + this.realFs.unlink(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + }); + } + unlinkSync(p) { + return this.realFs.unlinkSync(npath.fromPortablePath(p)); + } + async utimesPromise(p, atime, mtime) { + return await new Promise((resolve, reject) => { + this.realFs.utimes(npath.fromPortablePath(p), atime, mtime, this.makeCallback(resolve, reject)); + }); + } + utimesSync(p, atime, mtime) { + this.realFs.utimesSync(npath.fromPortablePath(p), atime, mtime); + } + async lutimesPromise(p, atime, mtime) { + return await new Promise((resolve, reject) => { + this.realFs.lutimes(npath.fromPortablePath(p), atime, mtime, this.makeCallback(resolve, reject)); + }); + } + lutimesSync(p, atime, mtime) { + this.realFs.lutimesSync(npath.fromPortablePath(p), atime, mtime); + } + async mkdirPromise(p, opts) { + return await new Promise((resolve, reject) => { + this.realFs.mkdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + }); + } + mkdirSync(p, opts) { + return this.realFs.mkdirSync(npath.fromPortablePath(p), opts); + } + async rmdirPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.rmdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.rmdir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + rmdirSync(p, opts) { + return this.realFs.rmdirSync(npath.fromPortablePath(p), opts); + } + async linkPromise(existingP, newP) { + return await new Promise((resolve, reject) => { + this.realFs.link(npath.fromPortablePath(existingP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); + }); + } + linkSync(existingP, newP) { + return this.realFs.linkSync(npath.fromPortablePath(existingP), npath.fromPortablePath(newP)); + } + async symlinkPromise(target, p, type) { + return await new Promise((resolve, reject) => { + this.realFs.symlink(npath.fromPortablePath(target.replace(/\/+$/, ``)), npath.fromPortablePath(p), type, this.makeCallback(resolve, reject)); + }); + } + symlinkSync(target, p, type) { + return this.realFs.symlinkSync(npath.fromPortablePath(target.replace(/\/+$/, ``)), npath.fromPortablePath(p), type); + } + async readFilePromise(p, encoding) { + return await new Promise((resolve, reject) => { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + this.realFs.readFile(fsNativePath, encoding, this.makeCallback(resolve, reject)); + }); + } + readFileSync(p, encoding) { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + return this.realFs.readFileSync(fsNativePath, encoding); + } + async readdirPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + if (opts.recursive && process.platform === `win32`) { + if (opts.withFileTypes) { + this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback((results) => resolve(results.map(direntToPortable)), reject)); + } else { + this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback((results) => resolve(results.map(npath.toPortablePath)), reject)); + } + } else { + this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } + } else { + this.realFs.readdir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + readdirSync(p, opts) { + if (opts) { + if (opts.recursive && process.platform === `win32`) { + if (opts.withFileTypes) { + return this.realFs.readdirSync(npath.fromPortablePath(p), opts).map(direntToPortable); + } else { + return this.realFs.readdirSync(npath.fromPortablePath(p), opts).map(npath.toPortablePath); + } + } else { + return this.realFs.readdirSync(npath.fromPortablePath(p), opts); + } + } else { + return this.realFs.readdirSync(npath.fromPortablePath(p)); + } + } + async readlinkPromise(p) { + return await new Promise((resolve, reject) => { + this.realFs.readlink(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + }).then((path) => { + return npath.toPortablePath(path); + }); + } + readlinkSync(p) { + return npath.toPortablePath(this.realFs.readlinkSync(npath.fromPortablePath(p))); + } + async truncatePromise(p, len) { + return await new Promise((resolve, reject) => { + this.realFs.truncate(npath.fromPortablePath(p), len, this.makeCallback(resolve, reject)); + }); + } + truncateSync(p, len) { + return this.realFs.truncateSync(npath.fromPortablePath(p), len); + } + async ftruncatePromise(fd, len) { + return await new Promise((resolve, reject) => { + this.realFs.ftruncate(fd, len, this.makeCallback(resolve, reject)); + }); + } + ftruncateSync(fd, len) { + return this.realFs.ftruncateSync(fd, len); + } + watch(p, a, b) { + return this.realFs.watch( + npath.fromPortablePath(p), + a, + b + ); + } + watchFile(p, a, b) { + return this.realFs.watchFile( + npath.fromPortablePath(p), + a, + b + ); + } + unwatchFile(p, cb) { + return this.realFs.unwatchFile(npath.fromPortablePath(p), cb); + } + makeCallback(resolve, reject) { + return (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }; + } +} + +const NUMBER_REGEXP = /^[0-9]+$/; +const VIRTUAL_REGEXP = /^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/; +const VALID_COMPONENT = /^([^/]+-)?[a-f0-9]+$/; +class VirtualFS extends ProxiedFS { + constructor({ baseFs = new NodeFS() } = {}) { + super(ppath); + this.baseFs = baseFs; + } + static makeVirtualPath(base, component, to) { + if (ppath.basename(base) !== `__virtual__`) + throw new Error(`Assertion failed: Virtual folders must be named "__virtual__"`); + if (!ppath.basename(component).match(VALID_COMPONENT)) + throw new Error(`Assertion failed: Virtual components must be ended by an hexadecimal hash`); + const target = ppath.relative(ppath.dirname(base), to); + const segments = target.split(`/`); + let depth = 0; + while (depth < segments.length && segments[depth] === `..`) + depth += 1; + const finalSegments = segments.slice(depth); + const fullVirtualPath = ppath.join(base, component, String(depth), ...finalSegments); + return fullVirtualPath; + } + static resolveVirtual(p) { + const match = p.match(VIRTUAL_REGEXP); + if (!match || !match[3] && match[5]) + return p; + const target = ppath.dirname(match[1]); + if (!match[3] || !match[4]) + return target; + const isnum = NUMBER_REGEXP.test(match[4]); + if (!isnum) + return p; + const depth = Number(match[4]); + const backstep = `../`.repeat(depth); + const subpath = match[5] || `.`; + return VirtualFS.resolveVirtual(ppath.join(target, backstep, subpath)); + } + getExtractHint(hints) { + return this.baseFs.getExtractHint(hints); + } + getRealPath() { + return this.baseFs.getRealPath(); + } + realpathSync(p) { + const match = p.match(VIRTUAL_REGEXP); + if (!match) + return this.baseFs.realpathSync(p); + if (!match[5]) + return p; + const realpath = this.baseFs.realpathSync(this.mapToBase(p)); + return VirtualFS.makeVirtualPath(match[1], match[3], realpath); + } + async realpathPromise(p) { + const match = p.match(VIRTUAL_REGEXP); + if (!match) + return await this.baseFs.realpathPromise(p); + if (!match[5]) + return p; + const realpath = await this.baseFs.realpathPromise(this.mapToBase(p)); + return VirtualFS.makeVirtualPath(match[1], match[3], realpath); + } + mapToBase(p) { + if (p === ``) + return p; + if (this.pathUtils.isAbsolute(p)) + return VirtualFS.resolveVirtual(p); + const resolvedRoot = VirtualFS.resolveVirtual(this.baseFs.resolve(PortablePath.dot)); + const resolvedP = VirtualFS.resolveVirtual(this.baseFs.resolve(p)); + return ppath.relative(resolvedRoot, resolvedP) || PortablePath.dot; + } + mapFromBase(p) { + return p; + } +} + +const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10)); +const WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2 || major === 18 && minor >= 13; +const HAS_LAZY_LOADED_TRANSLATORS = major === 20 && minor < 6 || major === 19 && minor >= 3; + +function readPackageScope(checkPath) { + const rootSeparatorIndex = checkPath.indexOf(npath.sep); + let separatorIndex; + do { + separatorIndex = checkPath.lastIndexOf(npath.sep); + checkPath = checkPath.slice(0, separatorIndex); + if (checkPath.endsWith(`${npath.sep}node_modules`)) + return false; + const pjson = readPackage(checkPath + npath.sep); + if (pjson) { + return { + data: pjson, + path: checkPath + }; + } + } while (separatorIndex > rootSeparatorIndex); + return false; +} +function readPackage(requestPath) { + const jsonPath = npath.resolve(requestPath, `package.json`); + if (!fs.existsSync(jsonPath)) + return null; + return JSON.parse(fs.readFileSync(jsonPath, `utf8`)); +} + +async function tryReadFile$1(path2) { + try { + return await fs.promises.readFile(path2, `utf8`); + } catch (error) { + if (error.code === `ENOENT`) + return null; + throw error; + } +} +function tryParseURL(str, base) { + try { + return new URL$1(str, base); + } catch { + return null; + } +} +let entrypointPath = null; +function setEntrypointPath(file) { + entrypointPath = file; +} +function getFileFormat(filepath) { + const ext = path.extname(filepath); + switch (ext) { + case `.mjs`: { + return `module`; + } + case `.cjs`: { + return `commonjs`; + } + case `.wasm`: { + throw new Error( + `Unknown file extension ".wasm" for ${filepath}` + ); + } + case `.json`: { + return `json`; + } + case `.js`: { + const pkg = readPackageScope(filepath); + if (!pkg) + return `commonjs`; + return pkg.data.type ?? `commonjs`; + } + default: { + if (entrypointPath !== filepath) + return null; + const pkg = readPackageScope(filepath); + if (!pkg) + return `commonjs`; + if (pkg.data.type === `module`) + return null; + return pkg.data.type ?? `commonjs`; + } + } +} + +async function load$1(urlString, context, nextLoad) { + const url = tryParseURL(urlString); + if (url?.protocol !== `file:`) + return nextLoad(urlString, context, nextLoad); + const filePath = fileURLToPath(url); + const format = getFileFormat(filePath); + if (!format) + return nextLoad(urlString, context, nextLoad); + if (format === `json` && context.importAssertions?.type !== `json`) { + const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import assertion of type "json"`); + err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`; + throw err; + } + if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) { + const pathToSend = pathToFileURL( + npath.fromPortablePath( + VirtualFS.resolveVirtual(npath.toPortablePath(filePath)) + ) + ).href; + process.send({ + "watch:import": WATCH_MODE_MESSAGE_USES_ARRAYS ? [pathToSend] : pathToSend + }); + } + return { + format, + source: format === `commonjs` ? void 0 : await fs.promises.readFile(filePath, `utf8`), + shortCircuit: true + }; +} + +const ArrayIsArray = Array.isArray; +const JSONStringify = JSON.stringify; +const ObjectGetOwnPropertyNames = Object.getOwnPropertyNames; +const ObjectPrototypeHasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop); +const RegExpPrototypeExec = (obj, string) => RegExp.prototype.exec.call(obj, string); +const RegExpPrototypeSymbolReplace = (obj, ...rest) => RegExp.prototype[Symbol.replace].apply(obj, rest); +const StringPrototypeEndsWith = (str, ...rest) => String.prototype.endsWith.apply(str, rest); +const StringPrototypeIncludes = (str, ...rest) => String.prototype.includes.apply(str, rest); +const StringPrototypeLastIndexOf = (str, ...rest) => String.prototype.lastIndexOf.apply(str, rest); +const StringPrototypeIndexOf = (str, ...rest) => String.prototype.indexOf.apply(str, rest); +const StringPrototypeReplace = (str, ...rest) => String.prototype.replace.apply(str, rest); +const StringPrototypeSlice = (str, ...rest) => String.prototype.slice.apply(str, rest); +const StringPrototypeStartsWith = (str, ...rest) => String.prototype.startsWith.apply(str, rest); +const SafeMap = Map; +const JSONParse = JSON.parse; + +function createErrorType(code, messageCreator, errorType) { + return class extends errorType { + constructor(...args) { + super(messageCreator(...args)); + this.code = code; + this.name = `${errorType.name} [${code}]`; + } + }; +} +const ERR_PACKAGE_IMPORT_NOT_DEFINED = createErrorType( + `ERR_PACKAGE_IMPORT_NOT_DEFINED`, + (specifier, packagePath, base) => { + return `Package import specifier "${specifier}" is not defined${packagePath ? ` in package ${packagePath}package.json` : ``} imported from ${base}`; + }, + TypeError +); +const ERR_INVALID_MODULE_SPECIFIER = createErrorType( + `ERR_INVALID_MODULE_SPECIFIER`, + (request, reason, base = void 0) => { + return `Invalid module "${request}" ${reason}${base ? ` imported from ${base}` : ``}`; + }, + TypeError +); +const ERR_INVALID_PACKAGE_TARGET = createErrorType( + `ERR_INVALID_PACKAGE_TARGET`, + (pkgPath, key, target, isImport = false, base = void 0) => { + const relError = typeof target === `string` && !isImport && target.length && !StringPrototypeStartsWith(target, `./`); + if (key === `.`) { + assert(isImport === false); + return `Invalid "exports" main target ${JSONStringify(target)} defined in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ``}${relError ? `; targets must start with "./"` : ``}`; + } + return `Invalid "${isImport ? `imports` : `exports`}" target ${JSONStringify( + target + )} defined for '${key}' in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ``}${relError ? `; targets must start with "./"` : ``}`; + }, + Error +); +const ERR_INVALID_PACKAGE_CONFIG = createErrorType( + `ERR_INVALID_PACKAGE_CONFIG`, + (path, base, message) => { + return `Invalid package config ${path}${base ? ` while importing ${base}` : ``}${message ? `. ${message}` : ``}`; + }, + Error +); + +function filterOwnProperties(source, keys) { + const filtered = /* @__PURE__ */ Object.create(null); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (ObjectPrototypeHasOwnProperty(source, key)) { + filtered[key] = source[key]; + } + } + return filtered; +} + +const packageJSONCache = new SafeMap(); +function getPackageConfig(path, specifier, base, readFileSyncFn) { + const existing = packageJSONCache.get(path); + if (existing !== void 0) { + return existing; + } + const source = readFileSyncFn(path); + if (source === void 0) { + const packageConfig2 = { + pjsonPath: path, + exists: false, + main: void 0, + name: void 0, + type: "none", + exports: void 0, + imports: void 0 + }; + packageJSONCache.set(path, packageConfig2); + return packageConfig2; + } + let packageJSON; + try { + packageJSON = JSONParse(source); + } catch (error) { + throw new ERR_INVALID_PACKAGE_CONFIG( + path, + (base ? `"${specifier}" from ` : "") + fileURLToPath(base || specifier), + error.message + ); + } + let { imports, main, name, type } = filterOwnProperties(packageJSON, [ + "imports", + "main", + "name", + "type" + ]); + const exports = ObjectPrototypeHasOwnProperty(packageJSON, "exports") ? packageJSON.exports : void 0; + if (typeof imports !== "object" || imports === null) { + imports = void 0; + } + if (typeof main !== "string") { + main = void 0; + } + if (typeof name !== "string") { + name = void 0; + } + if (type !== "module" && type !== "commonjs") { + type = "none"; + } + const packageConfig = { + pjsonPath: path, + exists: true, + main, + name, + type, + exports, + imports + }; + packageJSONCache.set(path, packageConfig); + return packageConfig; +} +function getPackageScopeConfig(resolved, readFileSyncFn) { + let packageJSONUrl = new URL("./package.json", resolved); + while (true) { + const packageJSONPath2 = packageJSONUrl.pathname; + if (StringPrototypeEndsWith(packageJSONPath2, "node_modules/package.json")) { + break; + } + const packageConfig2 = getPackageConfig( + fileURLToPath(packageJSONUrl), + resolved, + void 0, + readFileSyncFn + ); + if (packageConfig2.exists) { + return packageConfig2; + } + const lastPackageJSONUrl = packageJSONUrl; + packageJSONUrl = new URL("../package.json", packageJSONUrl); + if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) { + break; + } + } + const packageJSONPath = fileURLToPath(packageJSONUrl); + const packageConfig = { + pjsonPath: packageJSONPath, + exists: false, + main: void 0, + name: void 0, + type: "none", + exports: void 0, + imports: void 0 + }; + packageJSONCache.set(packageJSONPath, packageConfig); + return packageConfig; +} + +/** + @license + Copyright Node.js contributors. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +*/ +function throwImportNotDefined(specifier, packageJSONUrl, base) { + throw new ERR_PACKAGE_IMPORT_NOT_DEFINED( + specifier, + packageJSONUrl && fileURLToPath(new URL(".", packageJSONUrl)), + fileURLToPath(base) + ); +} +function throwInvalidSubpath(subpath, packageJSONUrl, internal, base) { + const reason = `request is not a valid subpath for the "${internal ? "imports" : "exports"}" resolution of ${fileURLToPath(packageJSONUrl)}`; + throw new ERR_INVALID_MODULE_SPECIFIER( + subpath, + reason, + base && fileURLToPath(base) + ); +} +function throwInvalidPackageTarget(subpath, target, packageJSONUrl, internal, base) { + if (typeof target === "object" && target !== null) { + target = JSONStringify(target, null, ""); + } else { + target = `${target}`; + } + throw new ERR_INVALID_PACKAGE_TARGET( + fileURLToPath(new URL(".", packageJSONUrl)), + subpath, + target, + internal, + base && fileURLToPath(base) + ); +} +const invalidSegmentRegEx = /(^|\\|\/)((\.|%2e)(\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\|\/|$)/i; +const patternRegEx = /\*/g; +function resolvePackageTargetString(target, subpath, match, packageJSONUrl, base, pattern, internal, conditions) { + if (subpath !== "" && !pattern && target[target.length - 1] !== "/") + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + if (!StringPrototypeStartsWith(target, "./")) { + if (internal && !StringPrototypeStartsWith(target, "../") && !StringPrototypeStartsWith(target, "/")) { + let isURL = false; + try { + new URL(target); + isURL = true; + } catch { + } + if (!isURL) { + const exportTarget = pattern ? RegExpPrototypeSymbolReplace(patternRegEx, target, () => subpath) : target + subpath; + return exportTarget; + } + } + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + } + if (RegExpPrototypeExec( + invalidSegmentRegEx, + StringPrototypeSlice(target, 2) + ) !== null) + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + const resolved = new URL(target, packageJSONUrl); + const resolvedPath = resolved.pathname; + const packagePath = new URL(".", packageJSONUrl).pathname; + if (!StringPrototypeStartsWith(resolvedPath, packagePath)) + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + if (subpath === "") + return resolved; + if (RegExpPrototypeExec(invalidSegmentRegEx, subpath) !== null) { + const request = pattern ? StringPrototypeReplace(match, "*", () => subpath) : match + subpath; + throwInvalidSubpath(request, packageJSONUrl, internal, base); + } + if (pattern) { + return new URL( + RegExpPrototypeSymbolReplace(patternRegEx, resolved.href, () => subpath) + ); + } + return new URL(subpath, resolved); +} +function isArrayIndex(key) { + const keyNum = +key; + if (`${keyNum}` !== key) + return false; + return keyNum >= 0 && keyNum < 4294967295; +} +function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath, base, pattern, internal, conditions) { + if (typeof target === "string") { + return resolvePackageTargetString( + target, + subpath, + packageSubpath, + packageJSONUrl, + base, + pattern, + internal); + } else if (ArrayIsArray(target)) { + if (target.length === 0) { + return null; + } + let lastException; + for (let i = 0; i < target.length; i++) { + const targetItem = target[i]; + let resolveResult; + try { + resolveResult = resolvePackageTarget( + packageJSONUrl, + targetItem, + subpath, + packageSubpath, + base, + pattern, + internal, + conditions + ); + } catch (e) { + lastException = e; + if (e.code === "ERR_INVALID_PACKAGE_TARGET") { + continue; + } + throw e; + } + if (resolveResult === void 0) { + continue; + } + if (resolveResult === null) { + lastException = null; + continue; + } + return resolveResult; + } + if (lastException === void 0 || lastException === null) + return lastException; + throw lastException; + } else if (typeof target === "object" && target !== null) { + const keys = ObjectGetOwnPropertyNames(target); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (isArrayIndex(key)) { + throw new ERR_INVALID_PACKAGE_CONFIG( + fileURLToPath(packageJSONUrl), + base, + '"exports" cannot contain numeric property keys.' + ); + } + } + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key === "default" || conditions.has(key)) { + const conditionalTarget = target[key]; + const resolveResult = resolvePackageTarget( + packageJSONUrl, + conditionalTarget, + subpath, + packageSubpath, + base, + pattern, + internal, + conditions + ); + if (resolveResult === void 0) + continue; + return resolveResult; + } + } + return void 0; + } else if (target === null) { + return null; + } + throwInvalidPackageTarget( + packageSubpath, + target, + packageJSONUrl, + internal, + base + ); +} +function patternKeyCompare(a, b) { + const aPatternIndex = StringPrototypeIndexOf(a, "*"); + const bPatternIndex = StringPrototypeIndexOf(b, "*"); + const baseLenA = aPatternIndex === -1 ? a.length : aPatternIndex + 1; + const baseLenB = bPatternIndex === -1 ? b.length : bPatternIndex + 1; + if (baseLenA > baseLenB) + return -1; + if (baseLenB > baseLenA) + return 1; + if (aPatternIndex === -1) + return 1; + if (bPatternIndex === -1) + return -1; + if (a.length > b.length) + return -1; + if (b.length > a.length) + return 1; + return 0; +} +function packageImportsResolve({ name, base, conditions, readFileSyncFn }) { + if (name === "#" || StringPrototypeStartsWith(name, "#/") || StringPrototypeEndsWith(name, "/")) { + const reason = "is not a valid internal imports specifier name"; + throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, fileURLToPath(base)); + } + let packageJSONUrl; + const packageConfig = getPackageScopeConfig(base, readFileSyncFn); + if (packageConfig.exists) { + packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); + const imports = packageConfig.imports; + if (imports) { + if (ObjectPrototypeHasOwnProperty(imports, name) && !StringPrototypeIncludes(name, "*")) { + const resolveResult = resolvePackageTarget( + packageJSONUrl, + imports[name], + "", + name, + base, + false, + true, + conditions + ); + if (resolveResult != null) { + return resolveResult; + } + } else { + let bestMatch = ""; + let bestMatchSubpath; + const keys = ObjectGetOwnPropertyNames(imports); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const patternIndex = StringPrototypeIndexOf(key, "*"); + if (patternIndex !== -1 && StringPrototypeStartsWith( + name, + StringPrototypeSlice(key, 0, patternIndex) + )) { + const patternTrailer = StringPrototypeSlice(key, patternIndex + 1); + if (name.length >= key.length && StringPrototypeEndsWith(name, patternTrailer) && patternKeyCompare(bestMatch, key) === 1 && StringPrototypeLastIndexOf(key, "*") === patternIndex) { + bestMatch = key; + bestMatchSubpath = StringPrototypeSlice( + name, + patternIndex, + name.length - patternTrailer.length + ); + } + } + } + if (bestMatch) { + const target = imports[bestMatch]; + const resolveResult = resolvePackageTarget( + packageJSONUrl, + target, + bestMatchSubpath, + bestMatch, + base, + true, + true, + conditions + ); + if (resolveResult != null) { + return resolveResult; + } + } + } + } + } + throwImportNotDefined(name, packageJSONUrl, base); +} + +const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/; +const isRelativeRegexp = /^\.{0,2}\//; +function tryReadFile(filePath) { + try { + return fs.readFileSync(filePath, `utf8`); + } catch (err) { + if (err.code === `ENOENT`) + return void 0; + throw err; + } +} +async function resolvePrivateRequest(specifier, issuer, context, nextResolve) { + const resolved = packageImportsResolve({ + name: specifier, + base: pathToFileURL(issuer), + conditions: new Set(context.conditions), + readFileSyncFn: tryReadFile + }); + if (resolved instanceof URL) { + return { url: resolved.href, shortCircuit: true }; + } else { + if (resolved.startsWith(`#`)) + throw new Error(`Mapping from one private import to another isn't allowed`); + return resolve$1(resolved, context, nextResolve); + } +} +async function resolve$1(originalSpecifier, context, nextResolve) { + const { findPnpApi } = moduleExports; + if (!findPnpApi || isBuiltin(originalSpecifier)) + return nextResolve(originalSpecifier, context, nextResolve); + let specifier = originalSpecifier; + const url = tryParseURL(specifier, isRelativeRegexp.test(specifier) ? context.parentURL : void 0); + if (url) { + if (url.protocol !== `file:`) + return nextResolve(originalSpecifier, context, nextResolve); + specifier = fileURLToPath(url); + } + const { parentURL, conditions = [] } = context; + const issuer = parentURL && tryParseURL(parentURL)?.protocol === `file:` ? fileURLToPath(parentURL) : process.cwd(); + const pnpapi = findPnpApi(issuer) ?? (url ? findPnpApi(specifier) : null); + if (!pnpapi) + return nextResolve(originalSpecifier, context, nextResolve); + if (specifier.startsWith(`#`)) + return resolvePrivateRequest(specifier, issuer, context, nextResolve); + const dependencyNameMatch = specifier.match(pathRegExp); + let allowLegacyResolve = false; + if (dependencyNameMatch) { + const [, dependencyName, subPath] = dependencyNameMatch; + if (subPath === `` && dependencyName !== `pnpapi`) { + const resolved = pnpapi.resolveToUnqualified(`${dependencyName}/package.json`, issuer); + if (resolved) { + const content = await tryReadFile$1(resolved); + if (content) { + const pkg = JSON.parse(content); + allowLegacyResolve = pkg.exports == null; + } + } + } + } + let result; + try { + result = pnpapi.resolveRequest(specifier, issuer, { + conditions: new Set(conditions), + extensions: allowLegacyResolve ? void 0 : [] + }); + } catch (err) { + if (err instanceof Error && `code` in err && err.code === `MODULE_NOT_FOUND`) + err.code = `ERR_MODULE_NOT_FOUND`; + throw err; + } + if (!result) + throw new Error(`Resolving '${specifier}' from '${issuer}' failed`); + const resultURL = pathToFileURL(result); + if (url) { + resultURL.search = url.search; + resultURL.hash = url.hash; + } + if (!parentURL) + setEntrypointPath(fileURLToPath(resultURL)); + return { + url: resultURL.href, + shortCircuit: true + }; +} + +if (!HAS_LAZY_LOADED_TRANSLATORS) { + const binding = process.binding(`fs`); + const originalReadFile = binding.readFileUtf8 || binding.readFileSync; + if (originalReadFile) { + binding[originalReadFile.name] = function(...args) { + try { + return fs.readFileSync(args[0], { + encoding: `utf8`, + flag: args[1] + }); + } catch { + } + return originalReadFile.apply(this, args); + }; + } else { + const binding2 = process.binding(`fs`); + const originalfstat = binding2.fstat; + const ZIP_MASK = 4278190080; + const ZIP_MAGIC = 704643072; + binding2.fstat = function(...args) { + const [fd, useBigint, req] = args; + if ((fd & ZIP_MASK) === ZIP_MAGIC && useBigint === false && req === void 0) { + try { + const stats = fs.fstatSync(fd); + return new Float64Array([ + stats.dev, + stats.mode, + stats.nlink, + stats.uid, + stats.gid, + stats.rdev, + stats.blksize, + stats.ino, + stats.size, + stats.blocks + ]); + } catch { + } + } + return originalfstat.apply(this, args); + }; + } +} + +const resolve = resolve$1; +const load = load$1; + +export { load, resolve }; diff --git a/.prettierignore b/.prettierignore index 0e80a3c8..72d7ea41 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,7 @@ -# package.json is formatted by package managers, so we ignore it here -package.json \ No newline at end of file +config/eslint-config-bitauth +wasm +.yarn +.pnp.* +package.json +src/lib/address/fixtures/key_io_*.json +src/lib/vm/instruction-sets/xec/fixtures/satoshi-client/*.json \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index dacf61ff..0c2aa1e4 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -6,9 +6,9 @@ "dtsvet.vscode-wasm", "gruntfuggly.todo-tree", "maelvalais.autoconf", - "bungcip.better-toml", "ms-vscode.cpptools", "streetsidesoftware.code-spell-checker", - "ms-azuretools.vscode-docker" + "ms-azuretools.vscode-docker", + "arcanis.vscode-zipfs" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index f5025c53..d4c7e2ef 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,16 @@ { "cSpell.userWords": [], // only use words from .cspell.json - "debug.javascript.usePreview": false, "deno.enable": false, "editor.formatOnSave": true, "editor.semanticHighlighting.enabled": true, - "typescript.tsdk": "node_modules/typescript/lib", + "typescript.tsdk": ".yarn/sdks/typescript/lib", "typescript.enablePromptUseWorkspaceTsdk": true, "cSpell.enabled": true, - "typescript.preferences.importModuleSpecifierEnding": "js" + "typescript.preferences.importModuleSpecifierEnding": "js", + "search.exclude": { + "**/.yarn": true, + "**/.pnp.*": true + }, + "eslint.nodePath": ".yarn/sdks", + "prettier.prettierPath": ".yarn/sdks/prettier/index.js" } diff --git a/.yarn b/.yarn index b13e162c..1c743318 160000 --- a/.yarn +++ b/.yarn @@ -1 +1 @@ -Subproject commit b13e162cd936faa7ac667c724bc360527d1c53f1 +Subproject commit 1c743318a465c6dcbd55de1186e70839e2f02b12 diff --git a/.yarnrc.yml b/.yarnrc.yml index a568a96c..3b187193 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1,7 +1,5 @@ -nodeLinker: node-modules +enableScripts: false -plugins: - - path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs - spec: "@yarnpkg/plugin-interactive-tools" +nodeLinker: pnp -yarnPath: .yarn/releases/yarn-3.3.1.cjs +yarnPath: .yarn/releases/yarn-4.0.2.cjs diff --git a/CHANGELOG-v1-to-v2.md b/CHANGELOG-v1-to-v2.md index 782d5250..9d670345 100644 --- a/CHANGELOG-v1-to-v2.md +++ b/CHANGELOG-v1-to-v2.md @@ -1,4 +1,4 @@ -### Draft v2 Notes +# Migrating from v1 to v2 Libauth is now a [pure ESM package](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c), simplifying the developer experience by allowing WASM crypto to be instantiated internally/automatically by default πŸŽ‰. This refactor also simplifies the usage of and types surrounding Libauth virtual machines and compilers, and several other APIs have been improved. @@ -34,3 +34,6 @@ Several other improvements have been made: - **Expanded state available to VMs and compilers** – VM and compiler operations can now access all raw contents of transactions and source outputs. - **Expanded capabilities of template scenarios** – scenarios can now represent any transaction shape and generate full, serializable transactions. - **New VM bytecode test vector generation** – Libauth includes a new `vmb_tests` test vector generation system to produce sets of cross-implementation test vectors as serialized transactions; this allows for sets of test vectors that fully test all transaction validation infrastructure without making assumptions about implementation internals. +- **Improved CashAddress utilities** – cash address utilities no longer require enums, hash lengths are measured in bytes rather than bits, and `type` is distinguished from `typeBit`. +- **More consistent [encoding/decoding utilities](./docs/encodings-and-formats.md)** – Several decoding methods have been renamed and refactored to use the new ReadPosition API. +- **More consistent [error handling](./docs/errors.md)** – all possible errors are surfaced in type signatures as `string`s. diff --git a/README.md b/README.md index 69285d4a..bdf6a094 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ Libauth uses [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/ Pull Requests welcome! Please see [`CONTRIBUTING.md`](.github/CONTRIBUTING.md) for details. -This library requires [Yarn](https://yarnpkg.com/) for development. If you don't have Yarn, make sure you have `Node.js` installed, then run `npm install -g yarn`. Once Yarn is installed: +This library requires [Yarn](https://yarnpkg.com/) for development. With `Node.js` installed, the `yarn` package manager can be installed by running `corepack enable`. Once `yarn` is installed: ```sh # note the use of --recursive to clone submodules diff --git a/config/api-extractor.json b/config/api-extractor.json index 2f23edb3..b3ed25c5 100644 --- a/config/api-extractor.json +++ b/config/api-extractor.json @@ -1,340 +1,340 @@ -/** - * Config file for API Extractor. For more info, please visit: https://api-extractor.com - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - - /** - * Optionally specifies another JSON config file that this file extends from. This provides a way for - * standard settings to be shared across multiple projects. - * - * If the path starts with "./" or "../", the path is resolved relative to the folder of the file that contains - * the "extends" field. Otherwise, the first path segment is interpreted as an NPM package name, and will be - * resolved using NodeJS require(). - * - * SUPPORTED TOKENS: none - * DEFAULT VALUE: "" - */ - // "extends": "./shared/api-extractor-base.json" - // "extends": "my-package/include/api-extractor-base.json" - - /** - * Determines the "" token that can be used with other config file settings. The project folder - * typically contains the tsconfig.json and package.json config files, but the path is user-defined. - * - * The path is resolved relative to the folder of the config file that contains the setting. - * - * The default value for "projectFolder" is the token "", which means the folder is determined by traversing - * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder - * that contains a tsconfig.json file. If a tsconfig.json file cannot be found in this way, then an error - * will be reported. - * - * SUPPORTED TOKENS: - * DEFAULT VALUE: "" - */ - // "projectFolder": "..", - - /** - * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis. API Extractor - * analyzes the symbols exported by this module. - * - * The file extension must be ".d.ts" and not ".ts". - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - */ - "mainEntryPointFilePath": "/build/main/index.d.ts", - - /** - * Determines how the TypeScript compiler engine will be invoked by API Extractor. - */ - "compiler": { - /** - * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * Note: This setting will be ignored if "overrideTsconfig" is used. - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/tsconfig.json" - */ - // "tsconfigFilePath": "/tsconfig.json", - /** - * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk. - * The object must conform to the TypeScript tsconfig schema: - * - * http://json.schemastore.org/tsconfig - * - * If omitted, then the tsconfig.json file will be read from the "projectFolder". - * - * DEFAULT VALUE: no overrideTsconfig section - */ - // "overrideTsconfig": { - // . . . - // } - /** - * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended - * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when - * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses - * for its analysis. Where possible, the underlying issue should be fixed rather than relying on skipLibCheck. - * - * DEFAULT VALUE: false - */ - // "skipLibCheck": true, - }, - - /** - * Configures how the API report file (*.api.md) will be generated. - */ - "apiReport": { - /** - * (REQUIRED) Whether to generate an API report. - */ - "enabled": true, - - /** - * The filename for the API report files. It will be combined with "reportFolder" or "reportTempFolder" to produce - * a full file path. - * - * The file extension should be ".api.md", and the string should not contain a path separator such as "\" or "/". - * - * SUPPORTED TOKENS: , - * DEFAULT VALUE: ".api.md" - */ - // "reportFileName": ".api.md", - - /** - * Specifies the folder where the API report file is written. The file name portion is determined by - * the "reportFileName" setting. - * - * The API report file is normally tracked by Git. Changes to it can be used to trigger a branch policy, - * e.g. for an API review. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/etc/" - */ - "reportFolder": "/docs/api/" - - /** - * Specifies the folder where the temporary report file is written. The file name portion is determined by - * the "reportFileName" setting. - * - * After the temporary file is written to disk, it is compared with the file in the "reportFolder". - * If they are different, a production build will fail. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/temp/" - */ - // "reportTempFolder": "/temp/" - }, - - /** - * Configures how the doc model file (*.api.json) will be generated. - */ - "docModel": { - /** - * (REQUIRED) Whether to generate a doc model file. - */ - "enabled": true - - /** - * The output path for the doc model file. The file extension should be ".api.json". - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/temp/.api.json" - */ - // "apiJsonFilePath": "/temp/.api.json" - }, - - /** - * Configures how the .d.ts rollup file will be generated. - */ - "dtsRollup": { - /** - * (REQUIRED) Whether to generate the .d.ts rollup file. - */ - "enabled": true, - - /** - * Specifies the output path for a .d.ts rollup file to be generated without any trimming. - * This file will include all declarations that are exported by the main entry point. - * - * If the path is an empty string, then this file will not be written. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/dist/.d.ts" - */ - "untrimmedFilePath": "/build/-all.d.ts", - - /** - * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "beta" release. - * This file will include only declarations that are marked as "@public" or "@beta". - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "" - */ - "betaTrimmedFilePath": "/build/-beta.d.ts", - - /** - * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "public" release. - * This file will include only declarations that are marked as "@public". - * - * If the path is an empty string, then this file will not be written. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "" - */ - "publicTrimmedFilePath": "/build/-public.d.ts" - - /** - * When a declaration is trimmed, by default it will be replaced by a code comment such as - * "Excluded from this release type: exampleMember". Set "omitTrimmingComments" to true to remove the - * declaration completely. - * - * DEFAULT VALUE: false - */ - // "omitTrimmingComments": true - }, - - /** - * Configures how the tsdoc-metadata.json file will be generated. - */ - "tsdocMetadata": { - /** - * Whether to generate the tsdoc-metadata.json file. - * - * DEFAULT VALUE: true - */ - // "enabled": true, - /** - * Specifies where the TSDoc metadata file should be written. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * The default value is "", which causes the path to be automatically inferred from the "tsdocMetadata", - * "typings" or "main" fields of the project's package.json. If none of these fields are set, the lookup - * falls back to "tsdoc-metadata.json" in the package folder. - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "" - */ - // "tsdocMetadataFilePath": "/dist/tsdoc-metadata.json" - }, - - /** - * Configures how API Extractor reports error and warning messages produced during analysis. - * - * There are three sources of messages: compiler messages, API Extractor messages, and TSDoc messages. - */ - "messages": { - /** - * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing - * the input .d.ts files. - * - * TypeScript message identifiers start with "TS" followed by an integer. For example: "TS2551" - * - * DEFAULT VALUE: A single "default" entry with logLevel=warning. - */ - "compilerMessageReporting": { - /** - * Configures the default routing for messages that don't match an explicit rule in this table. - */ - "default": { - /** - * Specifies whether the message should be written to the the tool's output log. Note that - * the "addToApiReportFile" property may supersede this option. - * - * Possible values: "error", "warning", "none" - * - * Errors cause the build to fail and return a nonzero exit code. Warnings cause a production build fail - * and return a nonzero exit code. For a non-production build (e.g. when "api-extractor run" includes - * the "--local" option), the warning is displayed but the build will not fail. - * - * DEFAULT VALUE: "warning" - */ - "logLevel": "warning" - - /** - * When addToApiReportFile is true: If API Extractor is configured to write an API report file (.api.md), - * then the message will be written inside that file; otherwise, the message is instead logged according to - * the "logLevel" option. - * - * DEFAULT VALUE: false - */ - // "addToApiReportFile": false - } - - // "TS2551": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . - }, - - /** - * Configures handling of messages reported by API Extractor during its analysis. - * - * API Extractor message identifiers start with "ae-". For example: "ae-extra-release-tag" - * - * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings - */ - "extractorMessageReporting": { - "default": { - "logLevel": "warning" - // "addToApiReportFile": false - } - - // "ae-extra-release-tag": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . - }, - - /** - * Configures handling of messages reported by the TSDoc parser when analyzing code comments. - * - * TSDoc message identifiers start with "tsdoc-". For example: "tsdoc-link-tag-unescaped-text" - * - * DEFAULT VALUE: A single "default" entry with logLevel=warning. - */ - "tsdocMessageReporting": { - "default": { - "logLevel": "warning" - // "addToApiReportFile": false - } - - // "tsdoc-link-tag-unescaped-text": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . - } - } -} +/** + * Config file for API Extractor. For more info, please visit: https://api-extractor.com + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + + /** + * Optionally specifies another JSON config file that this file extends from. This provides a way for + * standard settings to be shared across multiple projects. + * + * If the path starts with "./" or "../", the path is resolved relative to the folder of the file that contains + * the "extends" field. Otherwise, the first path segment is interpreted as an NPM package name, and will be + * resolved using NodeJS require(). + * + * SUPPORTED TOKENS: none + * DEFAULT VALUE: "" + */ + // "extends": "./shared/api-extractor-base.json" + // "extends": "my-package/include/api-extractor-base.json" + + /** + * Determines the "" token that can be used with other config file settings. The project folder + * typically contains the tsconfig.json and package.json config files, but the path is user-defined. + * + * The path is resolved relative to the folder of the config file that contains the setting. + * + * The default value for "projectFolder" is the token "", which means the folder is determined by traversing + * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder + * that contains a tsconfig.json file. If a tsconfig.json file cannot be found in this way, then an error + * will be reported. + * + * SUPPORTED TOKENS: + * DEFAULT VALUE: "" + */ + // "projectFolder": "..", + + /** + * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis. API Extractor + * analyzes the symbols exported by this module. + * + * The file extension must be ".d.ts" and not ".ts". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + */ + "mainEntryPointFilePath": "/build/index.d.ts", + + /** + * Determines how the TypeScript compiler engine will be invoked by API Extractor. + */ + "compiler": { + /** + * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * Note: This setting will be ignored if "overrideTsconfig" is used. + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/tsconfig.json" + */ + // "tsconfigFilePath": "/tsconfig.json", + /** + * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk. + * The object must conform to the TypeScript tsconfig schema: + * + * http://json.schemastore.org/tsconfig + * + * If omitted, then the tsconfig.json file will be read from the "projectFolder". + * + * DEFAULT VALUE: no overrideTsconfig section + */ + // "overrideTsconfig": { + // . . . + // } + /** + * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended + * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when + * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses + * for its analysis. Where possible, the underlying issue should be fixed rather than relying on skipLibCheck. + * + * DEFAULT VALUE: false + */ + // "skipLibCheck": true, + }, + + /** + * Configures how the API report file (*.api.md) will be generated. + */ + "apiReport": { + /** + * (REQUIRED) Whether to generate an API report. + */ + "enabled": true, + + /** + * The filename for the API report files. It will be combined with "reportFolder" or "reportTempFolder" to produce + * a full file path. + * + * The file extension should be ".api.md", and the string should not contain a path separator such as "\" or "/". + * + * SUPPORTED TOKENS: , + * DEFAULT VALUE: ".api.md" + */ + // "reportFileName": ".api.md", + + /** + * Specifies the folder where the API report file is written. The file name portion is determined by + * the "reportFileName" setting. + * + * The API report file is normally tracked by Git. Changes to it can be used to trigger a branch policy, + * e.g. for an API review. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/etc/" + */ + "reportFolder": "/build/api/" + + /** + * Specifies the folder where the temporary report file is written. The file name portion is determined by + * the "reportFileName" setting. + * + * After the temporary file is written to disk, it is compared with the file in the "reportFolder". + * If they are different, a production build will fail. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/" + */ + // "reportTempFolder": "/temp/" + }, + + /** + * Configures how the doc model file (*.api.json) will be generated. + */ + "docModel": { + /** + * (REQUIRED) Whether to generate a doc model file. + */ + "enabled": true + + /** + * The output path for the doc model file. The file extension should be ".api.json". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/.api.json" + */ + // "apiJsonFilePath": "/temp/.api.json" + }, + + /** + * Configures how the .d.ts rollup file will be generated. + */ + "dtsRollup": { + /** + * (REQUIRED) Whether to generate the .d.ts rollup file. + */ + "enabled": true, + + /** + * Specifies the output path for a .d.ts rollup file to be generated without any trimming. + * This file will include all declarations that are exported by the main entry point. + * + * If the path is an empty string, then this file will not be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/dist/.d.ts" + */ + "untrimmedFilePath": "/build/-all.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "beta" release. + * This file will include only declarations that are marked as "@public" or "@beta". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + "betaTrimmedFilePath": "/build/-beta.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "public" release. + * This file will include only declarations that are marked as "@public". + * + * If the path is an empty string, then this file will not be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + "publicTrimmedFilePath": "/build/-public.d.ts" + + /** + * When a declaration is trimmed, by default it will be replaced by a code comment such as + * "Excluded from this release type: exampleMember". Set "omitTrimmingComments" to true to remove the + * declaration completely. + * + * DEFAULT VALUE: false + */ + // "omitTrimmingComments": true + }, + + /** + * Configures how the tsdoc-metadata.json file will be generated. + */ + "tsdocMetadata": { + /** + * Whether to generate the tsdoc-metadata.json file. + * + * DEFAULT VALUE: true + */ + // "enabled": true, + /** + * Specifies where the TSDoc metadata file should be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * The default value is "", which causes the path to be automatically inferred from the "tsdocMetadata", + * "typings" or "main" fields of the project's package.json. If none of these fields are set, the lookup + * falls back to "tsdoc-metadata.json" in the package folder. + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "tsdocMetadataFilePath": "/dist/tsdoc-metadata.json" + }, + + /** + * Configures how API Extractor reports error and warning messages produced during analysis. + * + * There are three sources of messages: compiler messages, API Extractor messages, and TSDoc messages. + */ + "messages": { + /** + * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing + * the input .d.ts files. + * + * TypeScript message identifiers start with "TS" followed by an integer. For example: "TS2551" + * + * DEFAULT VALUE: A single "default" entry with logLevel=warning. + */ + "compilerMessageReporting": { + /** + * Configures the default routing for messages that don't match an explicit rule in this table. + */ + "default": { + /** + * Specifies whether the message should be written to the the tool's output log. Note that + * the "addToApiReportFile" property may supersede this option. + * + * Possible values: "error", "warning", "none" + * + * Errors cause the build to fail and return a nonzero exit code. Warnings cause a production build fail + * and return a nonzero exit code. For a non-production build (e.g. when "api-extractor run" includes + * the "--local" option), the warning is displayed but the build will not fail. + * + * DEFAULT VALUE: "warning" + */ + "logLevel": "warning" + + /** + * When addToApiReportFile is true: If API Extractor is configured to write an API report file (.api.md), + * then the message will be written inside that file; otherwise, the message is instead logged according to + * the "logLevel" option. + * + * DEFAULT VALUE: false + */ + // "addToApiReportFile": false + } + + // "TS2551": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + }, + + /** + * Configures handling of messages reported by API Extractor during its analysis. + * + * API Extractor message identifiers start with "ae-". For example: "ae-extra-release-tag" + * + * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings + */ + "extractorMessageReporting": { + "default": { + "logLevel": "warning" + // "addToApiReportFile": false + } + + // "ae-extra-release-tag": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + }, + + /** + * Configures handling of messages reported by the TSDoc parser when analyzing code comments. + * + * TSDoc message identifiers start with "tsdoc-". For example: "tsdoc-link-tag-unescaped-text" + * + * DEFAULT VALUE: A single "default" entry with logLevel=warning. + */ + "tsdocMessageReporting": { + "default": { + "logLevel": "warning" + // "addToApiReportFile": false + } + + // "tsdoc-link-tag-unescaped-text": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + } + } +} diff --git a/config/eslint-config-bitauth b/config/eslint-config-bitauth new file mode 160000 index 00000000..271ca754 --- /dev/null +++ b/config/eslint-config-bitauth @@ -0,0 +1 @@ +Subproject commit 271ca754e19528b883ebbfce88692119863af43b diff --git a/docs/errors.md b/docs/errors.md index 91d62b13..128e9943 100644 --- a/docs/errors.md +++ b/docs/errors.md @@ -1,7 +1,6 @@ # Libauth Errors -In Libauth, expected errors use the type `string` rather than `Error` (or other objects that inherit from `Error`) to simplify the resulting function types and -typechecking requirements. +In Libauth, expected errors use the type `string` rather than `Error` (or other objects that inherit from `Error`) to simplify the resulting function types and typechecking requirements. This convention ensures consistency of returned errors in all environments, avoids exposing internal details like stack traces and line numbers, and allows error messages to be recorded or displayed as text without an explicit or implicit `toString()` method call (e.g. for cleaner compatibility with [`restrict-template-expressions`](https://typescript-eslint.io/rules/restrict-template-expressions/)). diff --git a/package.json b/package.json index 1f5b5633..835441ea 100644 --- a/package.json +++ b/package.json @@ -37,25 +37,27 @@ "build:wasm": "cpy --flat src/lib/bin/secp256k1/secp256k1.wasm build/lib/bin/secp256k1 && cpy --flat src/lib/bin/sha1/sha1.wasm build/lib/bin/sha1 && cpy --flat src/lib/bin/sha256/sha256.wasm build/lib/bin/sha256 && cpy --flat src/lib/bin/sha512/sha512.wasm build/lib/bin/sha512 && cpy --flat src/lib/bin/ripemd160/ripemd160.wasm build/lib/bin/ripemd160", "compile:debug:secp256k1": "docker run -it libauth-secp256k1 bash", "compile:debug:hashes": "docker run -it libauth-hashes bash", - "fix": "yarn fix:prettier && yarn fix:lint", - "fix:prettier": "prettier \"src/**/*.ts\" --write", - "fix:lint": "eslint . --ext .ts --fix", + "fix": "yarn fix:eslint && yarn fix:prettier", + "fix:prettier": "prettier . --write", + "fix:eslint": "yarn test:eslint --fix", "gen:vmb-tests": "yarn build && yarn gen:vmb-tests:bch && yarn gen:vmb-tests-prettier", "gen:vmb-tests-prettier": "prettier 'src/lib/vmb-tests/generated/**/*.json' --write", "gen:vmb-tests:bch": "node 'build/lib/vmb-tests/bch-vmb-tests.spec.helper.js' 'src/lib/vmb-tests/generated/bch' && yarn run gen:vmb-tests:bch:reasons", "gen:vmb-tests:bch:reasons": "node 'build/lib/vmb-tests/bch-vmb-tests-invalid.spec.helper.js'", "wallet": "node 'build/lib/vmb-tests/bch-vmb-tests.live.spec.helper.js'", - "gen:schema": "yarn gen:schema:authentication-template", - "gen:schema:authentication-template": "ts-json-schema-generator --no-ref-encode --path 'src/lib/compiler/template-types.ts' --type 'AuthenticationTemplate' > src/lib/schema/authentication-template.schema.json && prettier 'src/lib/schema/authentication-template.schema.json' --write && ajv compile -s src/lib/schema/authentication-template.schema.json --allowUnionTypes -o src/lib/schema/ajv/validate-authentication-template.js && prettier 'src/lib/schema/ajv/validate-authentication-template.js' --write && node -e \"const fs = require('fs'), path = 'src/lib/schema/ajv/validate-authentication-template.js'; fs.writeFileSync(path, fs.readFileSync(path, 'utf8').replace(/'use strict'[\\s\\S]*module.exports.default =/, 'export default'), 'utf8')\"", + "gen:schema": "yarn gen:schema:wallet-template && yarn gen:schema:bcmr", + "gen:schema:wallet-template": "ts-json-schema-generator --no-ref-encode --path 'src/lib/engine/types/template-types.ts' --type 'WalletTemplate' > src/lib/schema/wallet-template.schema.json && prettier 'src/lib/schema/wallet-template.schema.json' --write && ajv compile -s src/lib/schema/wallet-template.schema.json --allowUnionTypes -o src/lib/schema/ajv/validate-wallet-template.js && prettier 'src/lib/schema/ajv/validate-wallet-template.js' --write && node -e \"const fs = require('fs'), path = 'src/lib/schema/ajv/validate-wallet-template.js'; fs.writeFileSync(path, fs.readFileSync(path, 'utf8').replace(/'use strict'[\\s\\S]*module.exports.default =/, 'export default'), 'utf8')\"", + "gen:schema:bcmr": "ts-json-schema-generator --no-ref-encode --path 'src/lib/engine/types/bcmr-types.ts' --type 'MetadataRegistry' > src/lib/schema/bcmr.schema.json && prettier 'src/lib/schema/bcmr.schema.json' --write && ajv compile -s src/lib/schema/bcmr.schema.json --allowUnionTypes -o src/lib/schema/ajv/validate-bcmr.js && prettier 'src/lib/schema/ajv/validate-bcmr.js' --write && node -e \"const fs = require('fs'), path = 'src/lib/schema/ajv/validate-bcmr.js'; fs.writeFileSync(path, fs.readFileSync(path, 'utf8').replace(/'use strict'[\\s\\S]*module.exports.default =/, 'export default'), 'utf8')\"", "gen:schema-TODO": "//TODO: use ajv compile --code-esm option after merge: https://github.com/ajv-validator/ajv-cli/pull/200", - "gen:templates": "yarn build && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'p2pkh' > src/lib/transaction/fixtures/templates/p2pkh.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' '2-of-3' > src/lib/transaction/fixtures/templates/2-of-3.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' '2-of-2-recoverable' > src/lib/transaction/fixtures/templates/2-of-2-recoverable.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'sig-of-sig' > src/lib/transaction/fixtures/templates/sig-of-sig.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'cash-channels' > src/lib/transaction/fixtures/templates/cash-channels.json && prettier 'src/lib/transaction/fixtures/templates/*.json' --write", + "gen:templates": "yarn build && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'p2pkh' > src/lib/transaction/fixtures/templates/p2pkh.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' '2-of-3' > src/lib/transaction/fixtures/templates/2-of-3.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' '2-of-2-recoverable' > src/lib/transaction/fixtures/templates/2-of-2-recoverable.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'sig-of-sig' > src/lib/transaction/fixtures/templates/sig-of-sig.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'cash-channels-v1' > src/lib/transaction/fixtures/templates/cash-channels-v1.json && prettier 'src/lib/transaction/fixtures/templates/*.json' --write", "gen:graph": "mkdir -p temp && madge --image temp/deps-$(date +\"%FT%H%M\").svg build/index.js", - "test": "yarn build && yarn test:deps && yarn test:schemas && yarn test:lint && yarn test:prettier && yarn test:spelling && yarn test:cycles && yarn test:unit", + "test": "yarn build && yarn test:deps && yarn test:schemas && yarn test:lint && yarn test:cycles && yarn test:unit", "test:deps": "node -e \"import('./package.json', { assert: { type: 'json' } }).then(p => typeof p.dependencies === 'undefined' ? console.log('No dependencies found.') : (console.error('Dependencies are not allowed.') && process.exit(1)));\"", "test:schemas:unchanged": "yarn gen:schema && node -e \"child_process.exec('git status src/lib/schema --porcelain | head -c1 | wc -c', (err, stdout) => stdout.trim() === '0' ? process.exit(0) : process.exit(1) )\"", "test:schemas": "yarn test:schemas:unchanged && echo \"Schemas are up to date.\" || echo \"Error: one or more schemas are outdated. Please review and commit the changes in src/lib/schema.\"", - "test:lint": "eslint . --ext .ts", - "test:prettier": "prettier \"src/**/*.ts\" --list-different", + "test:lint": "yarn test:prettier && yarn test:eslint && yarn test:spelling", + "test:eslint": "eslint . -c .eslintrc", + "test:prettier": "prettier . --list-different", "test:spelling": "cspell \"{README.md,.github/*.md,src/**/*.ts}\"", "test:cycles": "madge --circular build/index.js", "test:unit": "c8 ava", @@ -76,8 +78,8 @@ "doc:logo": "cpy assets/libauth.svg build/docs", "doc:html": "typedoc src/index.ts --out build/docs", "doc:next": "yarn build && yarn doc:extract && yarn doc:generate", - "doc:extract": "api-extractor run --local --typescript-compiler-folder node_modules/typescript", - "doc:generate": "api-documenter markdown -i temp -o docs/markdown", + "doc:extract": "mkdir -p build/api && api-extractor run --local --typescript-compiler-folder node_modules/typescript", + "doc:generate": "api-documenter markdown -i temp -o build/api/markdown", "doc:check-api": "api-extractor run --typescript-compiler-folder node_modules/typescript", "version": "standard-version", "version:alpha": "standard-version --prerelease alpha", @@ -89,50 +91,49 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "devDependencies": { - "@ava/typescript": "^3.0.1", - "@fast-check/ava": "^1.1.3", - "@microsoft/api-documenter": "^7.19.27", - "@microsoft/api-extractor": "^7.33.7", - "@rollup/plugin-alias": "^4.0.2", - "@rollup/plugin-commonjs": "^22.0.2", - "@rollup/plugin-node-resolve": "^15.0.1", - "@types/elliptic": "^6.4.14", - "@types/express": "^4.17.15", - "@typescript-eslint/eslint-plugin": "^5.48.1", - "@typescript-eslint/parser": "^5.48.1", + "@ava/typescript": "^4.1.0", + "@fast-check/ava": "^1.2.1", + "@microsoft/api-documenter": "^7.23.16", + "@microsoft/api-extractor": "^7.39.1", + "@playwright/test": "^1.40.1", + "@rollup/plugin-alias": "^5.1.0", + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-node-resolve": "^15.2.3", + "@types/elliptic": "^6.4.18", + "@types/express": "^4.17.21", + "@types/node": "^20.10.6", + "@typescript-eslint/eslint-plugin": "^6.18.1", + "@typescript-eslint/parser": "^6.17.0", "ajv-cli": "^5.0.0", "asmcrypto.js": "^2.3.2", - "ava": "^5.1.0", - "bcrypto": "^5.4.0", - "bitcore-lib-cash": "^8.25.40", - "c8": "^7.12.0", + "ava": "^6.0.1", + "bitcore-lib-cash": "^10.0.23", + "c8": "^9.0.0", "chuhai": "^1.2.0", - "cpy-cli": "^4.2.0", - "cspell": "^6.18.1", + "cpy-cli": "^5.0.0", + "cspell": "^8.3.2", "cz-conventional-changelog": "^3.3.0", "elliptic": "^6.5.4", - "eslint": "8.31.0", - "eslint-config-bitauth": "^3.1.2", - "eslint-config-prettier": "^8.6.0", + "eslint": "8.56.0", + "eslint-config-bitauth": "5.0.0", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-functional": "^4.4.1", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-functional": "^6.0.0", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-tsdoc": "^0.2.17", "express": "^4.18.2", - "fast-check": "^3.5.0", + "fast-check": "^3.15.0", "hash.js": "^1.1.7", - "madge": "^5.0.1", - "open-cli": "^7.1.0", - "prettier": "^2.8.2", - "puppeteer": "^19.5.0", - "rollup": "^2.79.1", - "secp256k1": "^4.0.3", + "madge": "^6.1.0", + "open-cli": "^8.0.0", + "prettier": "^3.1.1", + "rollup": "^4.9.2", + "secp256k1": "^5.0.0", "source-map-support": "^0.5.21", "standard-version": "^9.5.0", - "ts-json-schema-generator": "^1.2.0", - "typedoc": "^0.23.24", - "typescript": "^4.9.4" + "ts-json-schema-generator": "^1.5.0", + "typedoc": "^0.25.6", + "typescript": "^5.3.3" }, "files": [ "build", @@ -202,9 +203,13 @@ "exclude": [ "**/*.bench.js", "**/*.spec.js", - "**/*.spec.helper.js" + "**/*.spec.helper.js", + ".pnp.*" ] }, "sideEffects": false, - "packageManager": "yarn@3.3.1" + "packageManager": "yarn@4.0.2", + "resolutions": { + "eslint-config-bitauth": "portal:./config/eslint-config-bitauth" + } } diff --git a/src/lib/address/base58-address.spec.ts b/src/lib/address/base58-address.spec.ts index e8789866..16f6b928 100644 --- a/src/lib/address/base58-address.spec.ts +++ b/src/lib/address/base58-address.spec.ts @@ -1,4 +1,3 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { @@ -19,12 +18,14 @@ import keyIoInvalid from './fixtures/key_io_invalid.json' assert { type: 'json' // eslint-disable-next-line import/no-restricted-paths, import/no-internal-modules import keyIoValid from './fixtures/key_io_valid.json' assert { type: 'json' }; +import { fc, testProp } from '@fast-check/ava'; + const invalidVectors = Object.values(keyIoInvalid).filter( - (item) => Array.isArray(item) && item.every((x) => typeof x === 'string') + (item) => Array.isArray(item) && item.every((x) => typeof x === 'string'), ); const validVectors = Object.values(keyIoValid).filter((item) => - item.every((x) => !Array.isArray(x)) + item.every((x) => !Array.isArray(x)), ); test('encodeBase58AddressFormat', (t) => { @@ -32,16 +33,16 @@ test('encodeBase58AddressFormat', (t) => { t.deepEqual( encodeBase58AddressFormat(Base58AddressFormatVersion.p2pkh, payload), // cspell: disable-next-line - '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i' + '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', ); t.deepEqual( encodeBase58AddressFormat( Base58AddressFormatVersion.p2pkh, payload, - sha256 + sha256, ), // cspell: disable-next-line - '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i' + '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', ); }); @@ -50,32 +51,32 @@ test('encodeBase58Address', (t) => { t.deepEqual( encodeBase58Address('p2pkh', payload, sha256), // cspell: disable-next-line - '1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu' + '1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu', ); t.deepEqual( encodeBase58Address('p2pkhTestnet', payload, sha256), // cspell: disable-next-line - 'mrLC19Je2BuWQDkWSTriGYPyQJXKkkBmCx' + 'mrLC19Je2BuWQDkWSTriGYPyQJXKkkBmCx', ); t.deepEqual( encodeBase58Address('p2pkhCopayBCH', payload), // cspell: disable-next-line - 'CTH8H8Zj6DSnXFBKQeDG28ogAS92iS16Bp' + 'CTH8H8Zj6DSnXFBKQeDG28ogAS92iS16Bp', ); t.deepEqual( encodeBase58Address('p2sh20', payload, sha256), // cspell: disable-next-line - '3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC' + '3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC', ); t.deepEqual( encodeBase58Address('p2sh20Testnet', payload), // cspell: disable-next-line - '2N44ThNe8NXHyv4bsX8AoVCXquBRW94Ls7W' + '2N44ThNe8NXHyv4bsX8AoVCXquBRW94Ls7W', ); t.deepEqual( encodeBase58Address('p2sh20CopayBCH', payload, sha256), // cspell: disable-next-line - 'HHLN6S9BcP1JLSrMhgD5qe57iVEMFMLCBT' + 'HHLN6S9BcP1JLSrMhgD5qe57iVEMFMLCBT', ); }); @@ -84,12 +85,12 @@ test('decodeBase58AddressFormat', (t) => { t.deepEqual( // cspell: disable-next-line decodeBase58AddressFormat('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i'), - { payload, version: Base58AddressFormatVersion.p2pkh } + { payload, version: Base58AddressFormatVersion.p2pkh }, ); t.deepEqual( // cspell: disable-next-line decodeBase58AddressFormat('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', sha256), - { payload, version: Base58AddressFormatVersion.p2pkh } + { payload, version: Base58AddressFormatVersion.p2pkh }, ); }); @@ -98,12 +99,12 @@ test('decodeBase58Address', (t) => { t.deepEqual( // cspell: disable-next-line decodeBase58Address('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i'), - { payload, version: Base58AddressFormatVersion.p2pkh } + { payload, version: Base58AddressFormatVersion.p2pkh }, ); t.deepEqual( // cspell: disable-next-line decodeBase58Address('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', sha256), - { payload, version: Base58AddressFormatVersion.p2pkh } + { payload, version: Base58AddressFormatVersion.p2pkh }, ); }); @@ -126,33 +127,33 @@ testProp( payload, version, }); - } + }, ); test('decodeBase58AddressFormat: errors', (t) => { t.deepEqual( // cspell: disable-next-line decodeBase58AddressFormat('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62a'), - Base58AddressError.invalidChecksum + Base58AddressError.invalidChecksum, ); t.deepEqual(decodeBase58AddressFormat('1234'), Base58AddressError.tooShort); t.deepEqual( // cspell: disable-next-line decodeBase58AddressFormat('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I'), - Base58AddressError.unknownCharacter + Base58AddressError.unknownCharacter, ); }); test('decodeBase58Address: errors', (t) => { t.deepEqual( // cspell: disable-next-line decodeBase58Address('6PfDNQxJdsBx7K4r9kMrRBZSa2NZKVNUZn'), - Base58AddressError.unknownAddressVersion + Base58AddressError.unknownAddressVersion, ); t.deepEqual( // cspell: disable-next-line decodeBase58Address('2DqXtydYdu9pq6uXcy3Tbw3pUscCiPC6F'), // Base58AddressError.incorrectLength - Base58AddressError.unknownAddressVersion + Base58AddressError.unknownAddressVersion, ); }); @@ -186,11 +187,10 @@ test('Base58Address Valid Vectors (from C++ implementation – includes WIF vect isCompressed?: boolean; isPrivkey: boolean; chain: 'main' | 'regtest' | 'test'; - } + }, ]; const testnet = meta.chain !== 'main'; - // eslint-disable-next-line functional/no-conditional-statement if (meta.isPrivkey) { const wifKey = base58Address; const compressed = Boolean(meta.isCompressed); @@ -200,20 +200,18 @@ test('Base58Address Valid Vectors (from C++ implementation – includes WIF vect ? 'testnet' : 'testnetUncompressed' : compressed - ? 'mainnet' - : 'mainnetUncompressed'; + ? 'mainnet' + : 'mainnetUncompressed'; t.deepEqual(decodePrivateKeyWif(wifKey), { privateKey, type }); - - // eslint-disable-next-line functional/no-conditional-statement } else { const lockingBytecode = data; t.deepEqual( lockingBytecodeToBase58Address( hexToBin(lockingBytecode), testnet ? 'testnet' : 'mainnet', - sha256 + sha256, ), - base58Address + base58Address, ); } }); diff --git a/src/lib/address/base58-address.ts b/src/lib/address/base58-address.ts index 0dd75178..57a0d82a 100644 --- a/src/lib/address/base58-address.ts +++ b/src/lib/address/base58-address.ts @@ -107,11 +107,11 @@ export type Base58AddressNetwork = 'copayBCH' | 'mainnet' | 'testnet'; * implementation) */ export const encodeBase58AddressFormat = < - VersionType extends number = Base58AddressFormatVersion + VersionType extends number = Base58AddressFormatVersion, >( version: VersionType, payload: Uint8Array, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const checksumBytes = 4; const content = Uint8Array.from([version, ...payload]); @@ -146,7 +146,7 @@ export const encodeBase58Address = ( | 'p2sh20CopayBCH' | 'p2sh20Testnet', payload: Uint8Array, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => encodeBase58AddressFormat( { @@ -158,7 +158,7 @@ export const encodeBase58Address = ( p2sh20Testnet: Base58AddressFormatVersion.p2sh20Testnet, }[type], payload, - sha256 + sha256, ); export enum Base58AddressError { @@ -181,7 +181,7 @@ export enum Base58AddressError { */ export const decodeBase58AddressFormat = ( address: string, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const checksumBytes = 4; const bin = base58ToBin(address); @@ -232,7 +232,7 @@ export const decodeBase58AddressFormat = ( */ export const decodeBase58Address = ( address: string, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const decoded = decodeBase58AddressFormat(address, sha256); if (typeof decoded === 'string') return decoded; diff --git a/src/lib/address/bech32.spec.ts b/src/lib/address/bech32.spec.ts index 7a5d8281..0c882f47 100644 --- a/src/lib/address/bech32.spec.ts +++ b/src/lib/address/bech32.spec.ts @@ -1,6 +1,4 @@ -import { testProp } from '@fast-check/ava'; import test from 'ava'; -import fc from 'fast-check'; import { Bech32DecodingError, @@ -14,6 +12,9 @@ import { regroupBits, } from '../lib.js'; +import { testProp } from '@fast-check/ava'; +import fc from 'fast-check'; + test('regroupBits', (t) => { t.deepEqual( regroupBits({ @@ -21,7 +22,7 @@ test('regroupBits', (t) => { resultWordLength: 1, sourceWordLength: 8, }), - [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], ); t.deepEqual( regroupBits({ @@ -29,7 +30,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 1, }), - [0b11111111, 0b11111111] + [0b11111111, 0b11111111], ); t.deepEqual( regroupBits({ @@ -37,7 +38,7 @@ test('regroupBits', (t) => { resultWordLength: 2, sourceWordLength: 8, }), - [0b11, 0b11, 0b11, 0b11, 0b11, 0b11, 0b11, 0b11] + [0b11, 0b11, 0b11, 0b11, 0b11, 0b11, 0b11, 0b11], ); t.deepEqual( regroupBits({ @@ -45,7 +46,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 2, }), - [0b11111111, 0b11111111] + [0b11111111, 0b11111111], ); t.deepEqual( regroupBits({ @@ -53,7 +54,7 @@ test('regroupBits', (t) => { resultWordLength: 3, sourceWordLength: 8, }), - [0b111, 0b111, 0b111, 0b111, 0b111, 0b100] + [0b111, 0b111, 0b111, 0b111, 0b111, 0b100], ); t.deepEqual( regroupBits({ @@ -65,7 +66,7 @@ test('regroupBits', (t) => { * The 2 padding bit are now considered significant, so we have to add * padding to encode them. */ - [0b11111111, 0b11111111, 0b00] + [0b11111111, 0b11111111, 0b00], ); t.deepEqual( regroupBits({ @@ -73,7 +74,7 @@ test('regroupBits', (t) => { resultWordLength: 4, sourceWordLength: 8, }), - [0b1111, 0b1111, 0b1111, 0b1111] + [0b1111, 0b1111, 0b1111, 0b1111], ); t.deepEqual( regroupBits({ @@ -81,7 +82,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 4, }), - [0b11111111, 0b11111111] + [0b11111111, 0b11111111], ); t.deepEqual( regroupBits({ @@ -89,7 +90,7 @@ test('regroupBits', (t) => { resultWordLength: 5, sourceWordLength: 8, }), - [0b11111, 0b11111, 0b11111, 0b10000] + [0b11111, 0b11111, 0b11111, 0b10000], ); t.deepEqual( regroupBits({ @@ -97,7 +98,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 5, }), - [0b11111111, 0b11111111, 0b0000] + [0b11111111, 0b11111111, 0b0000], ); t.deepEqual( regroupBits({ @@ -105,7 +106,7 @@ test('regroupBits', (t) => { resultWordLength: 6, sourceWordLength: 8, }), - [0b111111, 0b111111, 0b111100] + [0b111111, 0b111111, 0b111100], ); t.deepEqual( regroupBits({ @@ -113,7 +114,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 6, }), - [0b11111111, 0b11111111, 0b00] + [0b11111111, 0b11111111, 0b00], ); t.deepEqual( regroupBits({ @@ -121,7 +122,7 @@ test('regroupBits', (t) => { resultWordLength: 7, sourceWordLength: 8, }), - [0b1111111, 0b1111111, 0b1100000] + [0b1111111, 0b1111111, 0b1100000], ); t.deepEqual( regroupBits({ @@ -129,7 +130,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 7, }), - [0b11111111, 0b11111111, 0b00000] + [0b11111111, 0b11111111, 0b00000], ); t.deepEqual( regroupBits({ @@ -137,7 +138,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 8, }), - [0b11111111, 0b11111111] + [0b11111111, 0b11111111], ); t.deepEqual( regroupBits({ @@ -145,11 +146,11 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 8, }), - [0b11111111, 0b11111111] + [0b11111111, 0b11111111], ); t.deepEqual( regroupBits({ bin: [256], resultWordLength: 5, sourceWordLength: 8 }), - BitRegroupingError.integerOutOfRange + BitRegroupingError.integerOutOfRange, ); t.deepEqual( regroupBits({ @@ -158,7 +159,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 5, }), - BitRegroupingError.requiresDisallowedPadding + BitRegroupingError.requiresDisallowedPadding, ); t.deepEqual( regroupBits({ @@ -170,7 +171,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 5, }), - BitRegroupingError.requiresDisallowedPadding + BitRegroupingError.requiresDisallowedPadding, ); t.deepEqual( regroupBits({ @@ -179,7 +180,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 5, }), - BitRegroupingError.hasDisallowedPadding + BitRegroupingError.hasDisallowedPadding, ); }); @@ -202,7 +203,7 @@ test('decodeBech32', (t) => { // cspell: disable-next-line decodeBech32('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), // prettier-ignore - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], ); }); @@ -215,7 +216,7 @@ test('encodeBech32', (t) => { // prettier-ignore encodeBech32([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]), // cspell: disable-next-line - 'qpzry9x8gf2tvdw0s3jn54khce6mua7l' + 'qpzry9x8gf2tvdw0s3jn54khce6mua7l', ); }); @@ -229,19 +230,19 @@ test('binToBech32Padded', (t) => { test('bech32PaddedToBin', (t) => { t.deepEqual( bech32PaddedToBin('qqq'), - BitRegroupingError.hasDisallowedPadding + BitRegroupingError.hasDisallowedPadding, ); t.deepEqual(bech32PaddedToBin('qq'), Uint8Array.of(0)); t.deepEqual( bech32PaddedToBin('tf'), - BitRegroupingError.requiresDisallowedPadding + BitRegroupingError.requiresDisallowedPadding, ); t.deepEqual(bech32PaddedToBin('lu'), Uint8Array.of(255)); // cspell: disable-next-line t.deepEqual(bech32PaddedToBin('qqqsyqc'), Uint8Array.of(0, 1, 2, 3)); t.deepEqual( bech32PaddedToBin('qqq1'), - Bech32DecodingError.notBech32CharacterSet + Bech32DecodingError.notBech32CharacterSet, ); }); @@ -267,9 +268,9 @@ testProp( (t, input) => { t.deepEqual( decodeBech32(encodeBech32(input)), - input as ReturnType + input as ReturnType, ); - } + }, ); testProp( @@ -278,17 +279,17 @@ testProp( (t, input) => { t.deepEqual( binToBech32Padded( - bech32PaddedToBin(binToBech32Padded(input)) as Uint8Array + bech32PaddedToBin(binToBech32Padded(input)) as Uint8Array, ), - binToBech32Padded(input) + binToBech32Padded(input), ); - } + }, ); testProp( '[fast-check] binToBech32Padded -> isBech32', [fcUint8Array(0, maxBinLength)], - (t, input) => t.true(isBech32CharacterSet(binToBech32Padded(input))) + (t, input) => t.true(isBech32CharacterSet(binToBech32Padded(input))), ); testProp( @@ -303,5 +304,5 @@ testProp( return; } t.deepEqual(binToBech32Padded(tryBin), maybeBech32); - } + }, ); diff --git a/src/lib/address/bech32.ts b/src/lib/address/bech32.ts index 4e161939..83f71301 100644 --- a/src/lib/address/bech32.ts +++ b/src/lib/address/bech32.ts @@ -1,5 +1,3 @@ -import type { Immutable } from '../lib.js'; - /** * The list of 32 symbols used in Bech32 encoding. */ @@ -18,7 +16,7 @@ export enum BitRegroupingError { requiresDisallowedPadding = 'Encoding requires padding while padding is disallowed.', } -/* eslint-disable functional/no-let, no-bitwise, functional/no-expression-statement, functional/no-conditional-statement, complexity */ +/* eslint-disable functional/no-let, no-bitwise, functional/no-expression-statements, functional/no-conditional-statements, complexity */ /** * Given an array of integers, regroup bits from `sourceWordLength` to * `resultWordLength`, returning a new array of integers between 0 and @@ -40,7 +38,7 @@ export const regroupBits = ({ * An array of numbers representing the bits to regroup. Each item must be a * number within the range of `sourceWordLength`. */ - bin: Immutable | readonly number[]; + bin: number[] | Uint8Array; /** * The bit-length of each number in `bin`, e.g. to regroup bits from a * `Uint8Array`, use `8` (must be a positive integer) @@ -62,7 +60,7 @@ export const regroupBits = ({ let bits = 0; const result = []; const maxResultInt = (1 << resultWordLength) - 1; - // eslint-disable-next-line functional/no-loop-statement, @typescript-eslint/prefer-for-of, no-plusplus + // eslint-disable-next-line functional/no-loop-statements, @typescript-eslint/prefer-for-of, no-plusplus for (let p = 0; p < bin.length; ++p) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const value = bin[p]!; @@ -71,7 +69,7 @@ export const regroupBits = ({ } accumulator = (accumulator << sourceWordLength) | value; bits += sourceWordLength; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (bits >= resultWordLength) { bits -= resultWordLength; // eslint-disable-next-line functional/immutable-data @@ -91,7 +89,7 @@ export const regroupBits = ({ } return result; }; -/* eslint-enable functional/no-let, no-bitwise, functional/no-expression-statement, functional/no-conditional-statement, complexity */ +/* eslint-enable functional/no-let, no-bitwise, functional/no-expression-statements, functional/no-conditional-statements, complexity */ /** * Encode an array of numbers as a base32 string using the Bech32 character set. @@ -102,12 +100,12 @@ export const regroupBits = ({ * * @param base32IntegerArray - the array of 5-bit integers to encode */ -export const encodeBech32 = (base32IntegerArray: readonly number[]) => { +export const encodeBech32 = (base32IntegerArray: number[]) => { // eslint-disable-next-line functional/no-let let result = ''; - // eslint-disable-next-line @typescript-eslint/prefer-for-of, functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line @typescript-eslint/prefer-for-of, functional/no-let, functional/no-loop-statements, no-plusplus for (let i = 0; i < base32IntegerArray.length; i++) { - // eslint-disable-next-line functional/no-expression-statement, @typescript-eslint/no-non-null-assertion + // eslint-disable-next-line functional/no-expression-statements, @typescript-eslint/no-non-null-assertion result += bech32CharacterSet[base32IntegerArray[i]!]; } return result; @@ -126,13 +124,13 @@ export const encodeBech32 = (base32IntegerArray: readonly number[]) => { export const decodeBech32 = (validBech32: string) => { const result: (typeof bech32CharacterSetIndex)[keyof typeof bech32CharacterSetIndex][] = []; - // eslint-disable-next-line @typescript-eslint/prefer-for-of, functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line @typescript-eslint/prefer-for-of, functional/no-let, functional/no-loop-statements, no-plusplus for (let i = 0; i < validBech32.length; i++) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data result.push( bech32CharacterSetIndex[ validBech32[i] as keyof typeof bech32CharacterSetIndex - ] + ], ); } return result; @@ -184,11 +182,11 @@ export const bech32PaddedToBin = (bech32Padded: string) => { * * @param bytes - the Uint8Array to bech32 encode */ -export const binToBech32Padded = (bytes: Immutable) => +export const binToBech32Padded = (bytes: Uint8Array) => encodeBech32( regroupBits({ bin: bytes, resultWordLength: base32WordLength, sourceWordLength: base256WordLength, - }) as number[] + }) as number[], ); diff --git a/src/lib/address/cash-address.spec.ts b/src/lib/address/cash-address.spec.ts index adf36a0d..44496a05 100644 --- a/src/lib/address/cash-address.spec.ts +++ b/src/lib/address/cash-address.spec.ts @@ -1,5 +1,4 @@ import test from 'ava'; -import fc from 'fast-check'; import type { CashAddressAvailableTypeBits, @@ -32,6 +31,8 @@ import { // eslint-disable-next-line import/no-restricted-paths, import/no-internal-modules import cashAddrJson from './fixtures/cashaddr.json' assert { type: 'json' }; +import fc from 'fast-check'; + const lowercaseLetter = () => fc.integer({ max: 122, min: 97 }).map((i) => String.fromCharCode(i)); @@ -44,35 +45,35 @@ test('maskCashAddressPrefix', (t) => { test('encodeCashAddressVersionByte', (t) => { t.deepEqual( encodeCashAddressVersionByte(CashAddressTypeBits.p2pkh, 20), - CashAddressVersionByte.p2pkh + CashAddressVersionByte.p2pkh, ); t.deepEqual( encodeCashAddressVersionByte(0, 20), - CashAddressVersionByte.p2pkh + CashAddressVersionByte.p2pkh, ); t.deepEqual( encodeCashAddressVersionByte(CashAddressTypeBits.p2sh, 20), - CashAddressVersionByte.p2sh20 + CashAddressVersionByte.p2sh20, ); t.deepEqual( encodeCashAddressVersionByte(1, 20), - CashAddressVersionByte.p2sh20 + CashAddressVersionByte.p2sh20, ); t.deepEqual( encodeCashAddressVersionByte(CashAddressTypeBits.p2sh, 32), - CashAddressVersionByte.p2sh32 + CashAddressVersionByte.p2sh32, ); t.deepEqual( encodeCashAddressVersionByte(CashAddressTypeBits.p2pkhWithTokens, 20), - CashAddressVersionByte.p2pkhWithTokens + CashAddressVersionByte.p2pkhWithTokens, ); t.deepEqual( encodeCashAddressVersionByte(CashAddressTypeBits.p2shWithTokens, 20), - CashAddressVersionByte.p2sh20WithTokens + CashAddressVersionByte.p2sh20WithTokens, ); t.deepEqual( encodeCashAddressVersionByte(CashAddressTypeBits.p2shWithTokens, 32), - CashAddressVersionByte.p2sh32WithTokens + CashAddressVersionByte.p2sh32WithTokens, ); }); @@ -91,19 +92,19 @@ test('decodeCashAddressVersionByte', (t) => { }); t.deepEqual( decodeCashAddressVersionByte(0b10000000), - CashAddressVersionByteDecodingError.reservedBitSet + CashAddressVersionByteDecodingError.reservedBitSet, ); t.deepEqual( decodeCashAddressVersionByte(CashAddressVersionByte.p2pkhWithTokens), - { length: 20, typeBits: 2 } + { length: 20, typeBits: 2 }, ); t.deepEqual( decodeCashAddressVersionByte(CashAddressVersionByte.p2sh20WithTokens), - { length: 20, typeBits: 3 } + { length: 20, typeBits: 3 }, ); t.deepEqual( decodeCashAddressVersionByte(CashAddressVersionByte.p2sh32WithTokens), - { length: 32, typeBits: 3 } + { length: 32, typeBits: 3 }, ); t.deepEqual(decodeCashAddressVersionByte(0b01000011), { length: 32, @@ -121,35 +122,35 @@ test('encodeCashAddress: works', (t) => { t.deepEqual( encodeCashAddress('bchtest', CashAddressType.p2pkh, payload), - 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ); t.deepEqual( encodeCashAddress('bchtest', 'p2pkh', payload), - 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ); t.deepEqual( encodeCashAddress('bitcoincash', CashAddressType.p2pkh, payload), - 'bitcoincash:qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6' + 'bitcoincash:qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6', ); t.deepEqual( encodeCashAddress('bitcoincash', 'p2pkh', payload), - 'bitcoincash:qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6' + 'bitcoincash:qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6', ); t.deepEqual( encodeCashAddress('bitcoincash', CashAddressType.p2pkhWithTokens, payload), - 'bitcoincash:zq2azmyyv6dtgczexyalqar70q036yund5j2mspghf' + 'bitcoincash:zq2azmyyv6dtgczexyalqar70q036yund5j2mspghf', ); t.deepEqual( encodeCashAddress('bitcoincash', 'p2pkhWithTokens', payload), - 'bitcoincash:zq2azmyyv6dtgczexyalqar70q036yund5j2mspghf' + 'bitcoincash:zq2azmyyv6dtgczexyalqar70q036yund5j2mspghf', ); t.deepEqual( encodeCashAddress('bchreg', 'p2pkh', payload), - 'bchreg:qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq' + 'bchreg:qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq', ); t.deepEqual( encodeCashAddress('bchreg', 'p2pkh', payload), - 'bchreg:qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq' + 'bchreg:qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq', ); t.deepEqual( @@ -157,10 +158,10 @@ test('encodeCashAddress: works', (t) => { 'bitauth', encodeCashAddressVersionByte(0, 32), hexToBin( - '978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1' - ) + '978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1', + ), ), - 'bitauth:qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w' + 'bitauth:qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w', ); t.throws(() => encodeCashAddress('bitcoincash', 'p2sh', hexToBin('97')), { @@ -172,7 +173,7 @@ test('encodeCashAddress: works', (t) => { test('decodeCashAddress: works', (t) => { const payload = hexToBin('15d16c84669ab46059313bf0747e781f1d13936d'); const result = decodeCashAddress( - 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ); if (typeof result === 'string') { t.log(result); @@ -190,7 +191,7 @@ test('decodeCashAddress: works', (t) => { payload, prefix: CashAddressNetworkPrefix.testnet, type: CashAddressType.p2pkh, - } + }, ); t.deepEqual( @@ -199,11 +200,11 @@ test('decodeCashAddress: works', (t) => { payload, prefix: CashAddressNetworkPrefix.mainnet, type: CashAddressType.p2pkh, - } + }, ); t.deepEqual( decodeCashAddress('bitcoincash:qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6'), - { payload, prefix: 'bitcoincash', type: CashAddressType.p2pkh } + { payload, prefix: 'bitcoincash', type: CashAddressType.p2pkh }, ); t.deepEqual( @@ -212,63 +213,63 @@ test('decodeCashAddress: works', (t) => { payload, prefix: CashAddressNetworkPrefix.regtest, type: CashAddressType.p2pkh, - } + }, ); t.deepEqual( decodeCashAddress('bchreg:qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq'), - { payload, prefix: 'bchreg', type: CashAddressType.p2pkh } + { payload, prefix: 'bchreg', type: CashAddressType.p2pkh }, ); t.deepEqual( decodeCashAddressFormat( - 'bitauth:qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w' + 'bitauth:qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w', ), { payload: hexToBin( - '978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1' + '978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1', ), prefix: 'bitauth', version: encodeCashAddressVersionByte(0, 32), - } + }, ); t.deepEqual( decodeCashAddressFormat( - ':qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w' + ':qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w', ), - CashAddressDecodingError.invalidFormat + CashAddressDecodingError.invalidFormat, ); t.deepEqual( decodeCashAddress('prefix:broken'), - CashAddressDecodingError.invalidCharacters + CashAddressDecodingError.invalidCharacters, ); t.deepEqual( decodeCashAddressFormat('prefix:broken'), - CashAddressDecodingError.invalidCharacters + CashAddressDecodingError.invalidCharacters, ); t.deepEqual( // cspell: disable-next-line decodeCashAddressFormat('verybroken:lll30n6j98m5'), - CashAddressDecodingError.improperPadding + CashAddressDecodingError.improperPadding, ); t.deepEqual( // cspell: disable-next-line decodeCashAddressFormat('bchtest:testnetaddress4d6njnut'), - CashAddressDecodingError.improperPadding + CashAddressDecodingError.improperPadding, ); t.deepEqual( decodeCashAddress( - 'bchreg:555555555555555555555555555555555555555555555udxmlmrz' + 'bchreg:555555555555555555555555555555555555555555555udxmlmrz', ), - CashAddressDecodingError.reservedByte + CashAddressDecodingError.reservedByte, ); t.deepEqual( decodeCashAddress('bitcoincash:qu2azmyyv6dtgczexyalqar70q036yund53an46hf6'), - CashAddressDecodingError.mismatchedPayloadLength + CashAddressDecodingError.mismatchedPayloadLength, ); }); @@ -282,10 +283,9 @@ test('CashAddress test vectors', (t) => { const typeBits = vector.type as CashAddressAvailableTypeBits; const version = encodeCashAddressVersionByte( typeBits, - payload.length as CashAddressSupportedLength + payload.length as CashAddressSupportedLength, ); const encodeResult = encodeCashAddressFormat(prefix, version, payload); - // eslint-disable-next-line functional/no-conditional-statement if (cashaddr !== encodeResult) { t.log('expected vector', vector.cashaddr); t.log('typeBits', typeBits); @@ -296,7 +296,6 @@ test('CashAddress test vectors', (t) => { t.deepEqual(vector.cashaddr, encodeResult); const decodeResult = decodeCashAddressNonStandard(cashaddr); - // eslint-disable-next-line functional/no-conditional-statement if (typeof decodeResult === 'string') { t.log(decodeResult); t.fail(); @@ -309,43 +308,43 @@ test('decodeCashAddressWithoutPrefix', (t) => { const payload = hexToBin('15d16c84669ab46059313bf0747e781f1d13936d'); t.deepEqual( decodeCashAddressFormatWithoutPrefix( - 'qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ), - { payload, prefix: 'bchtest', version: 0 } + { payload, prefix: 'bchtest', version: 0 }, ); t.deepEqual( decodeCashAddressFormatWithoutPrefix( - 'qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6' + 'qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6', ), - { payload, prefix: 'bitcoincash', version: 0 } + { payload, prefix: 'bitcoincash', version: 0 }, ); t.deepEqual( decodeCashAddressFormatWithoutPrefix( - 'qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq' + 'qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq', ), - { payload, prefix: 'bchreg', version: 0 } + { payload, prefix: 'bchreg', version: 0 }, ); t.deepEqual( decodeCashAddressFormatWithoutPrefix( 'qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w', - ['bitauth'] + ['bitauth'], ), { payload: hexToBin( - '978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1' + '978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1', ), prefix: 'bitauth', version: encodeCashAddressVersionByte(0, 32), - } + }, ); t.deepEqual( // cspell: disable-next-line decodeCashAddressFormatWithoutPrefix('qwtcxp42fcp06phz', ['bitauth']), - CashAddressDecodingError.invalidChecksum + CashAddressDecodingError.invalidChecksum, ); }); @@ -360,11 +359,11 @@ test('[fast-check] encodeCashAddressFormat <-> decodeCashAddressFormat', (t) => (prefix, version, payload) => { t.deepEqual( decodeCashAddressFormat( - encodeCashAddressFormat(prefix, version, payload) + encodeCashAddressFormat(prefix, version, payload), ), - { payload, prefix, version } + { payload, prefix, version }, ); - } + }, ); t.notThrows(() => { fc.assert(roundTripWithPayloadLength(20)); @@ -392,12 +391,12 @@ test('[fast-check] encodeCashAddressNonStandard <-> decodeCashAddressNonStandard encodeCashAddressNonStandard( prefix, typeBits as CashAddressAvailableTypeBits, - payload - ) + payload, + ), ), - { payload, prefix, typeBits } + { payload, prefix, typeBits }, ); - } + }, ); t.notThrows(() => { fc.assert(roundTripWithPayloadLength(20)); @@ -413,7 +412,7 @@ test('[fast-check] encodeCashAddressNonStandard <-> decodeCashAddressNonStandard test('[fast-check] encodeCashAddress <-> decodeCashAddress', (t) => { const prefixes = Object.keys( - CashAddressNetworkPrefix + CashAddressNetworkPrefix, ) as CashAddressNetworkPrefix[]; const types = Object.keys(CashAddressType) as CashAddressType[]; const roundTripWithPayloadLength = (length: CashAddressSupportedLength) => @@ -428,9 +427,9 @@ test('[fast-check] encodeCashAddress <-> decodeCashAddress', (t) => { const type = types[typeIndex]!; t.deepEqual( decodeCashAddress(encodeCashAddress(prefix, type, payload)), - { payload, prefix, type } + { payload, prefix, type }, ); - } + }, ); t.notThrows(() => { fc.assert(roundTripWithPayloadLength(20)); @@ -448,35 +447,35 @@ test('attemptCashAddressErrorCorrection', (t) => { t.deepEqual( attemptCashAddressFormatErrorCorrection( // cspell: disable-next-line - ':qq2azmyyv6dtgczexyalqar70q036yund53jvfde0c' + ':qq2azmyyv6dtgczexyalqar70q036yund53jvfde0c', ), - CashAddressDecodingError.invalidFormat + CashAddressDecodingError.invalidFormat, ); t.deepEqual( attemptCashAddressFormatErrorCorrection( // cspell: disable-next-line - 'broken:broken' + 'broken:broken', ), - CashAddressDecodingError.invalidCharacters + CashAddressDecodingError.invalidCharacters, ); t.deepEqual( attemptCashAddressFormatErrorCorrection( // cspell: disable-next-line - 'achtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0c' + 'achtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0c', ), { address: 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', corrections: [0, 49], - } + }, ); t.deepEqual( attemptCashAddressFormatErrorCorrection( // cspell: disable-next-line - 'btcbest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'btcbest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ), - CashAddressCorrectionError.tooManyErrors + CashAddressCorrectionError.tooManyErrors, ); }); @@ -489,24 +488,24 @@ test('[fast-check] attemptCashAddressErrorCorrection', (t) => { fc.nat(15), fc.uint8Array({ maxLength: payloadLength, minLength: payloadLength }), fc.array(fc.nat(payloadLength), { maxLength: 2, minLength: 0 }), - // eslint-disable-next-line max-params + // eslint-disable-next-line @typescript-eslint/max-params (prefix, typeBits, payload, randomErrors) => { const address = encodeCashAddressNonStandard( prefix, typeBits as CashAddressAvailableTypeBits, - payload + payload, ); const addressChars = splitEvery(address, 1); const errors = [ ...new Set( randomErrors .filter((i) => i !== prefix.length) - .sort((a, b) => a - b) + .sort((a, b) => a - b), ), ]; const broken = addressChars .map((char, i) => - errors.includes(i) ? (char === 'q' ? 'p' : 'q') : char + errors.includes(i) ? (char === 'q' ? 'p' : 'q') : char, ) .join(''); @@ -514,7 +513,7 @@ test('[fast-check] attemptCashAddressErrorCorrection', (t) => { address, corrections: errors, }); - } + }, ); t.notThrows(() => { fc.assert(correctsUpToTwoErrors(20)); @@ -551,47 +550,47 @@ test( legacyVectors, // cspell: disable-next-line '1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu', - 'bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a' + 'bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a', ); test( legacyVectors, // cspell: disable-next-line '1KXrWXciRDZUpQwQmuM1DbwsKDLYAYsVLR', - 'bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy' + 'bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy', ); test( legacyVectors, // cspell: disable-next-line '16w1D5WRVKJuZUsSRzdLp9w3YGcgoxDXb', - 'bitcoincash:qqq3728yw0y47sqn6l2na30mcw6zm78dzqre909m2r' + 'bitcoincash:qqq3728yw0y47sqn6l2na30mcw6zm78dzqre909m2r', ); test( legacyVectors, // cspell: disable-next-line '3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC', - 'bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq' + 'bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq', ); test( legacyVectors, // cspell: disable-next-line '3LDsS579y7sruadqu11beEJoTjdFiFCdX4', - 'bitcoincash:pr95sy3j9xwd2ap32xkykttr4cvcu7as4yc93ky28e' + 'bitcoincash:pr95sy3j9xwd2ap32xkykttr4cvcu7as4yc93ky28e', ); test( legacyVectors, // cspell: disable-next-line '31nwvkZwyPdgzjBJZXfDmSWsC4ZLKpYyUw', - 'bitcoincash:pqq3728yw0y47sqn6l2na30mcw6zm78dzq5ucqzc37' + 'bitcoincash:pqq3728yw0y47sqn6l2na30mcw6zm78dzq5ucqzc37', ); test( legacyVectors, // cspell: disable-next-line '1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3', - 'bitcoincash:qr7fzmep8g7h7ymfxy74lgc0v950j3r2959lhtxxsl' + 'bitcoincash:qr7fzmep8g7h7ymfxy74lgc0v950j3r2959lhtxxsl', ); diff --git a/src/lib/address/cash-address.ts b/src/lib/address/cash-address.ts index 3be4f0c5..16dbfacd 100644 --- a/src/lib/address/cash-address.ts +++ b/src/lib/address/cash-address.ts @@ -1,5 +1,4 @@ import { formatError } from '../format/format.js'; -import type { Immutable } from '../lib.js'; import { decodeBech32, @@ -213,7 +212,7 @@ const enum Constants { */ export const encodeCashAddressVersionByte = ( typeBits: CashAddressAvailableTypeBits, - length: CashAddressSupportedLength + length: CashAddressSupportedLength, ) => // eslint-disable-next-line no-bitwise (typeBits << Constants.cashAddressTypeBitsShift) | @@ -253,9 +252,9 @@ export const decodeCashAddressVersionByte = (version: number) => */ export const maskCashAddressPrefix = (prefix: string) => { const result = []; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let i = 0; i < prefix.length; i++) { - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, functional/immutable-data result.push(prefix.charCodeAt(i) & Constants.asciiCaseInsensitiveBits); } return result; @@ -314,8 +313,8 @@ const bech32GeneratorRemainingBytes = [0xf2bc8e61, 0xb76d99e2, 0x3e5fb3c4, 0x2ea * @param v - Array of 5-bit integers over which the checksum is to be computed */ // Derived from the `bitcore-lib-cash` implementation (does not require BigInt): https://github.com/bitpay/bitcore -export const cashAddressPolynomialModulo = (v: readonly number[]) => { - /* eslint-disable functional/no-let, functional/no-loop-statement, functional/no-expression-statement, no-bitwise, @typescript-eslint/no-magic-numbers */ +export const cashAddressPolynomialModulo = (v: number[]) => { + /* eslint-disable functional/no-let, functional/no-loop-statements, functional/no-expression-statements, no-bitwise, @typescript-eslint/no-magic-numbers */ let mostSignificantByte = 0; let lowerBytes = 1; let c = 0; @@ -331,7 +330,7 @@ export const cashAddressPolynomialModulo = (v: readonly number[]) => { lowerBytes ^= v[j]!; // eslint-disable-next-line no-plusplus for (let i = 0; i < bech32GeneratorMostSignificantByte.length; ++i) { - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (c & (1 << i)) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion mostSignificantByte ^= bech32GeneratorMostSignificantByte[i]!; @@ -341,13 +340,13 @@ export const cashAddressPolynomialModulo = (v: readonly number[]) => { } } lowerBytes ^= 1; - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (lowerBytes < 0) { lowerBytes ^= 1 << 31; lowerBytes += (1 << 30) * 2; } return mostSignificantByte * (1 << 30) * 4 + lowerBytes; - /* eslint-enable functional/no-let, functional/no-loop-statement, functional/no-expression-statement, no-bitwise, @typescript-eslint/no-magic-numbers */ + /* eslint-enable functional/no-let, functional/no-loop-statements, functional/no-expression-statements, no-bitwise, @typescript-eslint/no-magic-numbers */ }; /** @@ -358,11 +357,11 @@ export const cashAddressPolynomialModulo = (v: readonly number[]) => { */ export const cashAddressChecksumToUint5Array = (checksum: number) => { const result = []; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let i = 0; i < Constants.base256WordLength; ++i) { - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, @typescript-eslint/no-magic-numbers, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, @typescript-eslint/no-magic-numbers, functional/immutable-data result.push(checksum & 31); - // eslint-disable-next-line functional/no-expression-statement, @typescript-eslint/no-magic-numbers, no-param-reassign + // eslint-disable-next-line functional/no-expression-statements, @typescript-eslint/no-magic-numbers, no-param-reassign checksum /= 32; } // eslint-disable-next-line functional/immutable-data @@ -384,7 +383,7 @@ export const cashAddressChecksumToUint5Array = (checksum: number) => { export const encodeCashAddressFormat = ( prefix: string, version: number, - payload: Immutable + payload: Uint8Array, ) => { const checksum40BitPlaceholder = [0, 0, 0, 0, 0, 0, 0, 0]; const payloadContents = regroupBits({ @@ -413,7 +412,7 @@ export enum CashAddressEncodingError { } export const isValidCashAddressPayloadLength = ( - length: number + length: number, ): length is CashAddressSupportedLength => (cashAddressLengthToSizeBits[length as CashAddressSupportedLength] as | CashAddressSizeBits @@ -443,22 +442,22 @@ export const isValidCashAddressPayloadLength = ( export const encodeCashAddressNonStandard = ( prefix: string, typeBits: CashAddressAvailableTypeBits, - payload: Uint8Array + payload: Uint8Array, ) => { const { length } = payload; if (!isValidCashAddressPayloadLength(length)) { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error( formatError( CashAddressEncodingError.unsupportedPayloadLength, - `Payload length: ${length}.` - ) + `Payload length: ${length}.`, + ), ); } return encodeCashAddressFormat( prefix, encodeCashAddressVersionByte(typeBits, length), - payload + payload, ); }; @@ -484,12 +483,12 @@ export const encodeCashAddressNonStandard = ( export const encodeCashAddress = ( prefix: `${CashAddressNetworkPrefix}`, type: `${CashAddressType}`, - payload: Uint8Array + payload: Uint8Array, ) => encodeCashAddressNonStandard( prefix, cashAddressTypeToTypeBits[type], - payload + payload, ); export enum CashAddressDecodingError { @@ -639,13 +638,13 @@ export const decodeCashAddress = (address: string) => { // decodeCashAddressWithoutPrefix export const decodeCashAddressFormatWithoutPrefix = ( address: string, - possiblePrefixes: readonly string[] = [ + possiblePrefixes: string[] = [ CashAddressNetworkPrefix.mainnet, CashAddressNetworkPrefix.testnet, CashAddressNetworkPrefix.regtest, - ] + ], ) => { - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const prefix of possiblePrefixes) { const attempt = decodeCashAddressFormat(`${prefix}:${address}`); if (attempt !== CashAddressDecodingError.invalidChecksum) { @@ -670,14 +669,12 @@ export const decodeCashAddressFormatWithoutPrefix = ( * @param polynomial - an array of 5-bit integers representing the terms of a * CashAddress polynomial */ -export const cashAddressPolynomialToCashAddress = ( - polynomial: readonly number[] -) => { +export const cashAddressPolynomialToCashAddress = (polynomial: number[]) => { const separatorPosition = polynomial.indexOf(0); const prefix = polynomial .slice(0, separatorPosition) .map((integer) => - String.fromCharCode(Constants.asciiLowerCaseStart + integer) + String.fromCharCode(Constants.asciiLowerCaseStart + integer), ) .join(''); const contents = encodeBech32(polynomial.slice(separatorPosition + 1)); @@ -737,9 +734,9 @@ export const attemptCashAddressFormatErrorCorrection = (address: string) => { } const syndromes: { [index: string]: number } = {}; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let term = 0; term < polynomial.length; term++) { - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for ( // eslint-disable-next-line functional/no-let let errorVector = 1; @@ -747,7 +744,7 @@ export const attemptCashAddressFormatErrorCorrection = (address: string) => { // eslint-disable-next-line no-plusplus errorVector++ ) { - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, functional/immutable-data polynomial[term] ^= errorVector; const correct = cashAddressPolynomialModulo(polynomial); @@ -759,14 +756,14 @@ export const attemptCashAddressFormatErrorCorrection = (address: string) => { } // eslint-disable-next-line no-bitwise const s0 = (BigInt(correct) ^ BigInt(originalChecksum)).toString(); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data syndromes[s0] = term * Constants.finiteFieldOrder + errorVector; - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, functional/immutable-data polynomial[term] ^= errorVector; } } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [s0, pe] of Object.entries(syndromes)) { // eslint-disable-next-line no-bitwise const s1Location = (BigInt(s0) ^ BigInt(originalChecksum)).toString(); @@ -774,9 +771,9 @@ export const attemptCashAddressFormatErrorCorrection = (address: string) => { if (s1 !== undefined) { const correctionIndex1 = Math.trunc(pe / Constants.finiteFieldOrder); const correctionIndex2 = Math.trunc(s1 / Constants.finiteFieldOrder); - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, functional/immutable-data polynomial[correctionIndex1] ^= pe % Constants.finiteFieldOrder; - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, functional/immutable-data polynomial[correctionIndex2] ^= s1 % Constants.finiteFieldOrder; return { address: cashAddressPolynomialToCashAddress(polynomial), diff --git a/src/lib/address/locking-bytecode.spec.ts b/src/lib/address/locking-bytecode.spec.ts index cc04e6bb..117eb4cb 100644 --- a/src/lib/address/locking-bytecode.spec.ts +++ b/src/lib/address/locking-bytecode.spec.ts @@ -19,10 +19,10 @@ import { test('lockingBytecode <-> AddressContents: P2PK', (t) => { const genesisCoinbase = hexToBin( - '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac' + '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac', ); const genesisPublicKey = hexToBin( - '04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f' + '04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f', ); t.deepEqual(lockingBytecodeToAddressContents(genesisCoinbase), { @@ -35,21 +35,21 @@ test('lockingBytecode <-> AddressContents: P2PK', (t) => { payload: genesisPublicKey, type: 'P2PK', }), - genesisCoinbase + genesisCoinbase, ); t.deepEqual( addressContentsToLockingBytecode({ payload: genesisPublicKey, type: LockingBytecodeType.p2pk, }), - genesisCoinbase + genesisCoinbase, ); const genesisCoinbaseCompressed = hexToBin( - '2103678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6ac' + '2103678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6ac', ); const compressedPublicKey = hexToBin( - '03678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6' + '03678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6', ); t.deepEqual(lockingBytecodeToAddressContents(genesisCoinbaseCompressed), { payload: compressedPublicKey, @@ -61,7 +61,7 @@ test('lockingBytecode <-> AddressContents: P2PK', (t) => { payload: compressedPublicKey, type: LockingBytecodeType.p2pk, }), - genesisCoinbaseCompressed + genesisCoinbaseCompressed, ); }); @@ -77,14 +77,14 @@ test('lockingBytecode <-> AddressContents: P2PKH', (t) => { payload: expectedPayload, type: 'P2PKH', }), - p2pkh + p2pkh, ); t.deepEqual( addressContentsToLockingBytecode({ payload: expectedPayload, type: LockingBytecodeType.p2pkh, }), - p2pkh + p2pkh, ); }); @@ -100,14 +100,14 @@ test('lockingBytecode <-> AddressContents: P2SH20', (t) => { payload: expectedPayload, type: 'P2SH20', }), - p2sh20 + p2sh20, ); t.deepEqual( addressContentsToLockingBytecode({ payload: expectedPayload, type: LockingBytecodeType.p2sh20, }), - p2sh20 + p2sh20, ); }); @@ -125,7 +125,7 @@ test('lockingBytecode <-> AddressContents: unknown', (t) => { // @ts-expect-error type: 'unknown', }), - { message: 'Unrecognized addressContents type: unknown' } + { message: 'Unrecognized addressContents type: unknown' }, ); const almostP2pk = hexToBin('0100ac'); @@ -184,12 +184,12 @@ const cashVectors = test.macro<[string, string]>({ options: { tokenSupport: false }, prefix: 'bitcoincash', }, - 'cashAddressToLockingBytecode' + 'cashAddressToLockingBytecode', ); t.deepEqual( lockingBytecodeToCashAddress(hexToBin(bytecode), 'bitcoincash'), cashAddress, - 'lockingBytecodeToCashAddress' + 'lockingBytecodeToCashAddress', ); }, title: (_, cashAddress) => @@ -199,42 +199,42 @@ const cashVectors = test.macro<[string, string]>({ test( cashVectors, 'bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a', - '76a91476a04053bda0a88bda5177b86a15c3b29f55987388ac' + '76a91476a04053bda0a88bda5177b86a15c3b29f55987388ac', ); test( cashVectors, 'bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy', - '76a914cb481232299cd5743151ac4b2d63ae198e7bb0a988ac' + '76a914cb481232299cd5743151ac4b2d63ae198e7bb0a988ac', ); test( cashVectors, 'bitcoincash:qqq3728yw0y47sqn6l2na30mcw6zm78dzqre909m2r', - '76a914011f28e473c95f4013d7d53ec5fbc3b42df8ed1088ac' + '76a914011f28e473c95f4013d7d53ec5fbc3b42df8ed1088ac', ); test( cashVectors, 'bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq', - 'a91476a04053bda0a88bda5177b86a15c3b29f55987387' + 'a91476a04053bda0a88bda5177b86a15c3b29f55987387', ); test( cashVectors, 'bitcoincash:pr95sy3j9xwd2ap32xkykttr4cvcu7as4yc93ky28e', - 'a914cb481232299cd5743151ac4b2d63ae198e7bb0a987' + 'a914cb481232299cd5743151ac4b2d63ae198e7bb0a987', ); test( cashVectors, 'bitcoincash:pqq3728yw0y47sqn6l2na30mcw6zm78dzq5ucqzc37', - 'a914011f28e473c95f4013d7d53ec5fbc3b42df8ed1087' + 'a914011f28e473c95f4013d7d53ec5fbc3b42df8ed1087', ); test('lockingBytecodeToCashAddress: P2PK', (t) => { const genesisCoinbase = hexToBin( - '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac' + '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac', ); t.deepEqual(lockingBytecodeToCashAddress(genesisCoinbase, 'bitcoincash'), { @@ -242,16 +242,16 @@ test('lockingBytecodeToCashAddress: P2PK', (t) => { }); const genesisCoinbaseCompressed = hexToBin( - '2103678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6ac' + '2103678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6ac', ); t.deepEqual( lockingBytecodeToCashAddress( genesisCoinbaseCompressed, - CashAddressNetworkPrefix.mainnet + CashAddressNetworkPrefix.mainnet, ), { error: CashAddressEncodingError.noTypeBitsValueStandardizedForP2pk, - } + }, ); }); @@ -262,7 +262,7 @@ test('cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: P2PKH', (t) t.deepEqual(lockingBytecodeToCashAddress(p2pkh, 'bitcoincash'), address); t.deepEqual( lockingBytecodeToCashAddress(p2pkh, 'bitcoincash', { tokenSupport: true }), - tokenAddress + tokenAddress, ); t.deepEqual(cashAddressToLockingBytecode(address), { bytecode: p2pkh, @@ -283,7 +283,7 @@ test('cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: P2SH20', (t t.deepEqual(lockingBytecodeToCashAddress(p2sh20, 'bitcoincash'), address); t.deepEqual( lockingBytecodeToCashAddress(p2sh20, 'bitcoincash', { tokenSupport: true }), - tokenAddress + tokenAddress, ); t.deepEqual(cashAddressToLockingBytecode(address), { bytecode: p2sh20, @@ -299,7 +299,7 @@ test('cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: P2SH20', (t test('cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: P2SH32', (t) => { const p2sh32 = hexToBin( - 'aa20000000000000000000000000000012345678900000000000000000000000000087' + 'aa20000000000000000000000000000012345678900000000000000000000000000087', ); const address = 'bitcoincash:pvqqqqqqqqqqqqqqqqqqqqqqzg69v7ysqqqqqqqqqqqqqqqqqqqqqpkp7fqn0'; @@ -308,7 +308,7 @@ test('cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: P2SH32', (t t.deepEqual(lockingBytecodeToCashAddress(p2sh32, 'bitcoincash'), address); t.deepEqual( lockingBytecodeToCashAddress(p2sh32, 'bitcoincash', { tokenSupport: true }), - tokenAddress + tokenAddress, ); t.deepEqual(cashAddressToLockingBytecode(address), { bytecode: p2sh32, @@ -329,7 +329,7 @@ test('lockingBytecodeToCashAddress: error', (t) => { error: CashAddressEncodingError.unknownLockingBytecodeType, }); const genesisCoinbase = hexToBin( - '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac' + '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac', ); t.deepEqual(lockingBytecodeToCashAddress(genesisCoinbase, 'bitcoincash'), { error: CashAddressEncodingError.noTypeBitsValueStandardizedForP2pk, @@ -339,22 +339,22 @@ test('lockingBytecodeToCashAddress: error', (t) => { test('cashAddressToLockingBytecode: error', (t) => { t.deepEqual( cashAddressToLockingBytecode('bad:address'), - CashAddressDecodingError.invalidChecksum + CashAddressDecodingError.invalidChecksum, ); t.deepEqual( cashAddressToLockingBytecode( - 'bitcoincash:dp60yz0ka2g8ut4y3a604czhs2hg5ejj2u6xkulaqj' + 'bitcoincash:dp60yz0ka2g8ut4y3a604czhs2hg5ejj2u6xkulaqj', ), - `${CashAddressDecodingError.unknownAddressType} Type bit value: 13.` + `${CashAddressDecodingError.unknownAddressType} Type bit value: 13.`, ); }); test('lockingBytecodeToBase58Address: P2PK', (t) => { const genesisCoinbase = hexToBin( - '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac' + '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac', ); const genesisPublicKey = hexToBin( - '04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f' + '04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f', ); t.deepEqual( @@ -362,25 +362,25 @@ test('lockingBytecodeToBase58Address: P2PK', (t) => { { payload: genesisPublicKey, type: LockingBytecodeType.p2pk, - } + }, ); const genesisCoinbaseCompressed = hexToBin( - '2103678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6ac' + '2103678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6ac', ); const compressedPublicKey = hexToBin( - '03678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6' + '03678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6', ); t.deepEqual( lockingBytecodeToBase58Address( genesisCoinbaseCompressed, 'testnet', - sha256 + sha256, ), { payload: compressedPublicKey, type: LockingBytecodeType.p2pk, - } + }, ); }); @@ -395,7 +395,7 @@ test('base58AddressToLockingBytecode <-> lockingBytecodeToBase58Address: P2PKH', t.deepEqual(lockingBytecodeToBase58Address(p2pkh, 'mainnet'), address); t.deepEqual( lockingBytecodeToBase58Address(p2pkh, 'testnet', sha256), - addressTestnet + addressTestnet, ); t.deepEqual(lockingBytecodeToBase58Address(p2pkh, 'copayBCH'), addressCopay); @@ -424,7 +424,7 @@ test('base58AddressToLockingBytecode <-> lockingBytecodeToBase58Address: P2SH20' t.deepEqual(lockingBytecodeToBase58Address(p2sh20, 'mainnet'), address); t.deepEqual( lockingBytecodeToBase58Address(p2sh20, 'testnet', sha256), - addressTestnet + addressTestnet, ); t.deepEqual(lockingBytecodeToBase58Address(p2sh20, 'copayBCH'), addressCopay); @@ -445,6 +445,6 @@ test('base58AddressToLockingBytecode <-> lockingBytecodeToBase58Address: P2SH20' test('base58AddressToLockingBytecode: error', (t) => { t.deepEqual( base58AddressToLockingBytecode('bad:address'), - Base58AddressError.unknownCharacter + Base58AddressError.unknownCharacter, ); }); diff --git a/src/lib/address/locking-bytecode.ts b/src/lib/address/locking-bytecode.ts index d6c61fad..b98f8211 100644 --- a/src/lib/address/locking-bytecode.ts +++ b/src/lib/address/locking-bytecode.ts @@ -63,19 +63,19 @@ export enum LockingBytecodeType { * An object representing the contents of an address of a known address type. * This can be used to encode an address or its locking bytecode. */ -export interface KnownAddressTypeContents { +export type KnownAddressTypeContents = { type: `${LockingBytecodeType}`; payload: Uint8Array; -} +}; -export interface UnknownAddressTypeContents { +export type UnknownAddressTypeContents = { /** * This address type represents an address using an unknown or uncommon * locking bytecode pattern for which no standardized address formats exist. */ type: 'unknown'; payload: Uint8Array; -} +}; /** * An object representing the contents of an address. This can be used to encode @@ -208,13 +208,13 @@ const enum AddressPayload { // eslint-disable-next-line complexity export const lockingBytecodeToAddressContents = ( - bytecode: Uint8Array + bytecode: Uint8Array, ): AddressContents => { if (isPayToPublicKeyHash(bytecode)) { return { payload: bytecode.slice( AddressPayload.p2pkhStart, - AddressPayload.p2pkhEnd + AddressPayload.p2pkhEnd, ), type: LockingBytecodeType.p2pkh, }; @@ -224,7 +224,7 @@ export const lockingBytecodeToAddressContents = ( return { payload: bytecode.slice( AddressPayload.p2sh20Start, - AddressPayload.p2sh20End + AddressPayload.p2sh20End, ), type: LockingBytecodeType.p2sh20, }; @@ -234,7 +234,7 @@ export const lockingBytecodeToAddressContents = ( return { payload: bytecode.slice( AddressPayload.p2sh32Start, - AddressPayload.p2sh32End + AddressPayload.p2sh32End, ), type: LockingBytecodeType.p2sh32, }; @@ -244,7 +244,7 @@ export const lockingBytecodeToAddressContents = ( return { payload: bytecode.slice( AddressPayload.p2pkUncompressedStart, - AddressPayload.p2pkUncompressedEnd + AddressPayload.p2pkUncompressedEnd, ), type: LockingBytecodeType.p2pk, }; @@ -254,7 +254,7 @@ export const lockingBytecodeToAddressContents = ( return { payload: bytecode.slice( AddressPayload.p2pkCompressedStart, - AddressPayload.p2pkCompressedEnd + AddressPayload.p2pkCompressedEnd, ), type: LockingBytecodeType.p2pk, }; @@ -368,7 +368,7 @@ export const addressContentsToLockingBytecode = ({ } return unknownValue( type, - `Unrecognized addressContents type: ${type as string}` + `Unrecognized addressContents type: ${type as string}`, ); }; @@ -391,7 +391,7 @@ export const addressContentsToLockingBytecode = ({ export const lockingBytecodeToCashAddress = ( bytecode: Uint8Array, prefix: `${CashAddressNetworkPrefix}` = 'bitcoincash', - options = { tokenSupport: false } + options = { tokenSupport: false }, ) => { const contents = lockingBytecodeToAddressContents(bytecode); if (contents.type === LockingBytecodeType.p2pkh) { @@ -399,7 +399,7 @@ export const lockingBytecodeToCashAddress = ( ? encodeCashAddress( prefix, CashAddressType.p2pkhWithTokens, - contents.payload + contents.payload, ) : encodeCashAddress(prefix, CashAddressType.p2pkh, contents.payload); } @@ -411,7 +411,7 @@ export const lockingBytecodeToCashAddress = ( ? encodeCashAddress( prefix, CashAddressType.p2shWithTokens, - contents.payload + contents.payload, ) : encodeCashAddress(prefix, CashAddressType.p2sh, contents.payload); } @@ -426,7 +426,7 @@ export const lockingBytecodeToCashAddress = ( } return unknownValue( contents.type, - `Unrecognized locking bytecode type: ${contents.type as string}` + `Unrecognized locking bytecode type: ${contents.type as string}`, ); }; @@ -451,7 +451,7 @@ export const cashAddressToLockingBytecode = (address: string) => { ) { return formatError( LockingBytecodeGenerationError.unsupportedPayloadLength, - `Payload length: ${decoded.payload.length}` + `Payload length: ${decoded.payload.length}`, ); } if ( @@ -490,7 +490,7 @@ export const cashAddressToLockingBytecode = (address: string) => { } return unknownValue( decoded.type, - `Unrecognized address type: ${decoded.type as string}` + `Unrecognized address type: ${decoded.type as string}`, ); }; @@ -516,7 +516,7 @@ export const cashAddressToLockingBytecode = (address: string) => { export const lockingBytecodeToBase58Address = ( bytecode: Uint8Array, network: `${Base58AddressNetwork}` = 'mainnet', - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const contents = lockingBytecodeToAddressContents(bytecode); @@ -528,7 +528,7 @@ export const lockingBytecodeToBase58Address = ( testnet: Base58AddressFormatVersion.p2pkhTestnet, }[network], contents.payload, - sha256 + sha256, ); } if (contents.type === LockingBytecodeType.p2sh20) { @@ -539,7 +539,7 @@ export const lockingBytecodeToBase58Address = ( testnet: Base58AddressFormatVersion.p2sh20Testnet, }[network], contents.payload, - sha256 + sha256, ); } @@ -556,7 +556,7 @@ export const lockingBytecodeToBase58Address = ( */ export const base58AddressToLockingBytecode = ( address: string, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const decoded = decodeBase58Address(address, sha256); if (typeof decoded === 'string') return decoded; diff --git a/src/lib/bin/hashes.ts b/src/lib/bin/hashes.ts index 99fa8816..4c977b24 100644 --- a/src/lib/bin/hashes.ts +++ b/src/lib/bin/hashes.ts @@ -1,11 +1,11 @@ -export interface HashFunction { - readonly final: (rawState: Uint8Array) => Uint8Array; - readonly hash: (input: Uint8Array) => Uint8Array; - readonly init: () => Uint8Array; - readonly update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; -} +export type HashFunction = { + final: (rawState: Uint8Array) => Uint8Array; + hash: (input: Uint8Array) => Uint8Array; + init: () => Uint8Array; + update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; +}; -/* eslint-disable functional/no-conditional-statement, functional/no-let, functional/no-expression-statement, no-underscore-dangle, functional/no-try-statement, @typescript-eslint/no-magic-numbers, max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-non-null-assertion */ +/* eslint-disable functional/no-conditional-statements, functional/no-let, functional/no-expression-statements, no-underscore-dangle, functional/no-try-statements, @typescript-eslint/no-magic-numbers, @typescript-eslint/max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-non-null-assertion */ /** * Note, most of this method is translated and boiled-down from the wasm-pack * workflow. Significant changes to wasm-bindgen or wasm-pack build will likely @@ -17,7 +17,7 @@ export const instantiateRustWasm = async ( hashExportName: string, initExportName: string, updateExportName: string, - finalExportName: string + finalExportName: string, ): Promise => { const wasm = ( await WebAssembly.instantiate(webassemblyBytes, { @@ -30,14 +30,14 @@ export const instantiateRustWasm = async ( // eslint-disable-next-line camelcase, @typescript-eslint/naming-convention __wbindgen_throw: /* istanbul ignore next */ ( ptr: number, - len: number + len: number, ) => { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error( // eslint-disable-next-line @typescript-eslint/no-use-before-define Array.from(getUint8Memory().subarray(ptr, ptr + len)) .map((num) => String.fromCharCode(num)) - .join('') + .join(''), ); }, }, @@ -158,4 +158,4 @@ export const instantiateRustWasm = async ( update, }; }; -/* eslint-enable functional/no-conditional-statement, functional/no-let, functional/no-expression-statement, no-underscore-dangle, functional/no-try-statement, @typescript-eslint/no-magic-numbers, max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-non-null-assertion */ +/* eslint-enable functional/no-conditional-statements, functional/no-let, functional/no-expression-statements, no-underscore-dangle, functional/no-try-statements, @typescript-eslint/no-magic-numbers, @typescript-eslint/max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-non-null-assertion */ diff --git a/src/lib/bin/secp256k1/secp256k1-wasm-types.ts b/src/lib/bin/secp256k1/secp256k1-wasm-types.ts index 283340a5..50672ad0 100644 --- a/src/lib/bin/secp256k1/secp256k1-wasm-types.ts +++ b/src/lib/bin/secp256k1/secp256k1-wasm-types.ts @@ -61,7 +61,7 @@ export enum CompressionFlag { * **It's very unlikely that consumers will need to use this interface directly. * See [[Secp256k1]] for a more purely-functional API.** */ -export interface Secp256k1Wasm { +export type Secp256k1Wasm = { /** * Create a Secp256k1 context object. * @@ -74,7 +74,7 @@ export interface Secp256k1Wasm { * verification). * @param context - a `Context` flag representing the capabilities needed */ - readonly contextCreate: (context: ContextFlag) => number; + contextCreate: (context: ContextFlag) => number; /** * Updates the context randomization to protect against side-channel leakage. @@ -97,24 +97,24 @@ export interface Secp256k1Wasm { * @param contextPtr - pointer to a context object * @param seedPtr - pointer to a 32-byte random seed */ - readonly contextRandomize: (contextPtr: number, seedPtr: number) => 0 | 1; + contextRandomize: (contextPtr: number, seedPtr: number) => 0 | 1; /** * Frees a pointer allocated by the `malloc` method. * @param pointer - the pointer to be freed */ - readonly free: (pointer: number) => number; + free: (pointer: number) => number; - readonly heapU32: Uint32Array; - readonly heapU8: Uint8Array; - readonly instance: WebAssembly.Instance; + heapU32: Uint32Array; + heapU8: Uint8Array; + instance: WebAssembly.Instance; /** * Allocates the given number of bytes in WebAssembly memory. * @param malloc - the number of bytes to allocate */ - readonly malloc: (bytes: number) => number; + malloc: (bytes: number) => number; /** * The Secp256k1 library accepts a pointer to a `size_t outputlen` for both @@ -123,14 +123,14 @@ export interface Secp256k1Wasm { * This is a convenience method to create and set the value of those pointers. * @param value - the value of the `size_t` (e.g. the buffer length) */ - readonly mallocSizeT: (value: number) => number; + mallocSizeT: (value: number) => number; /** * Allocates space for the provided array, and assigns the array to the space. * * @param array - a Uint8Array to allocate in WebAssembly memory */ - readonly mallocUint8Array: (array: Uint8Array) => number; + mallocUint8Array: (array: Uint8Array) => number; /** * Tweak a _privateKey_ by adding _tweak_ to it. @@ -140,10 +140,10 @@ export interface Secp256k1Wasm { * @param secretKeyPtr - pointer to a 32 byte private key * @param tweakNum256Ptr - pointer to a 256 bit int representing the tweak value */ - readonly privkeyTweakAdd: ( + privkeyTweakAdd: ( contextPtr: number, secretKeyPtr: number, - tweakNum256Ptr: number + tweakNum256Ptr: number, ) => 0 | 1; /** @@ -154,10 +154,10 @@ export interface Secp256k1Wasm { * @param secretKeyPtr - pointer to a 32 byte private key * @param tweakNum256Ptr - pointer to a 256 bit int representing the tweak value */ - readonly privkeyTweakMul: ( + privkeyTweakMul: ( contextPtr: number, secretKeyPtr: number, - tweakNum256Ptr: number + tweakNum256Ptr: number, ) => 0 | 1; /** @@ -170,10 +170,10 @@ export interface Secp256k1Wasm { * internal representation, and must be serialized for outside use) * @param secretKeyPtr - pointer to a 32-byte private key */ - readonly pubkeyCreate: ( + pubkeyCreate: ( contextPtr: number, publicKeyPtr: number, - secretKeyPtr: number + secretKeyPtr: number, ) => 0 | 1; /** @@ -194,12 +194,12 @@ export interface Secp256k1Wasm { * (Note, this should be a simple integer, rather than a `size_t` pointer as * is required by the serialization methods.) */ - readonly pubkeyParse: ( + pubkeyParse: ( contextPtr: number, publicKeyOutPtr: number, publicKeyInPtr: number, // eslint-disable-next-line @typescript-eslint/no-magic-numbers - publicKeyInLength: 33 | 65 + publicKeyInLength: 33 | 65, ) => 0 | 1; /** @@ -216,12 +216,12 @@ export interface Secp256k1Wasm { * @param compression - a CompressionFlag indicating compressed * or uncompressed */ - readonly pubkeySerialize: ( + pubkeySerialize: ( contextPtr: number, outputPtr: number, outputLengthPtr: number, publicKeyPtr: number, - compression: CompressionFlag + compression: CompressionFlag, ) => 1; /** @@ -234,10 +234,10 @@ export interface Secp256k1Wasm { * @param tweakNum256Ptr - pointer to a 256 bit int representing the tweak value */ - readonly pubkeyTweakAdd: ( + pubkeyTweakAdd: ( contextPtr: number, publicKeyPtr: number, - tweakNum256Ptr: number + tweakNum256Ptr: number, ) => 0 | 1; /** @@ -250,10 +250,10 @@ export interface Secp256k1Wasm { * @param tweakNum256Ptr - pointer to a 256 bit int representing the tweak value */ - readonly pubkeyTweakMul: ( + pubkeyTweakMul: ( contextPtr: number, publicKeyPtr: number, - tweakNum256Ptr: number + tweakNum256Ptr: number, ) => 0 | 1; /** @@ -263,14 +263,14 @@ export interface Secp256k1Wasm { * @param pointer - a pointer to the beginning of the Uint8Array element * @param bytes - the number of bytes to copy */ - readonly readHeapU8: (pointer: number, bytes: number) => Uint8Array; + readHeapU8: (pointer: number, bytes: number) => Uint8Array; /** * Read a `size_t` from WebAssembly memory. * * @param pointer - a pointer to the `size_t` variable to read */ - readonly readSizeT: (pointer: number) => number; + readSizeT: (pointer: number) => number; /** * Compute the public key given a recoverable signature and message hash. @@ -284,11 +284,11 @@ export interface Secp256k1Wasm { * @param msg32Ptr - pointer to the 32-byte message hash the signed by this * signature */ - readonly recover: ( + recover: ( contextPtr: number, publicKeyPtr: number, rSigPtr: number, - msg32Ptr: number + msg32Ptr: number, ) => 0 | 1; /** @@ -309,11 +309,11 @@ export interface Secp256k1Wasm { * @param inputSigPtr - pointer to a serialized signature in compact format * @param rid - the recovery number, as an int. (Not a pointer) */ - readonly recoverableSignatureParse: ( + recoverableSignatureParse: ( contextPtr: number, outputRSigPtr: number, inputSigPtr: number, - rid: number + rid: number, ) => 0 | 1; /** @@ -329,11 +329,11 @@ export interface Secp256k1Wasm { * @param rSigPtr - pointer to the 65-byte signature to be serialized * (internal format) */ - readonly recoverableSignatureSerialize: ( + recoverableSignatureSerialize: ( contextPtr: number, sigOutPtr: number, recIDOutPtr: number, - rSigPtr: number + rSigPtr: number, ) => 1; /** @@ -359,11 +359,11 @@ export interface Secp256k1Wasm { * @param msg32Ptr - pointer to the 32-byte message hash being signed * @param secretKeyPtr - pointer to a 32-byte secret key */ - readonly schnorrSign: ( + schnorrSign: ( contextPtr: number, outputSigPtr: number, msg32Ptr: number, - secretKeyPtr: number + secretKeyPtr: number, ) => 0 | 1; /** @@ -378,11 +378,11 @@ export interface Secp256k1Wasm { * @param pubkeyPtr - pointer to the parsed pubkey with which to verify * (internal format) */ - readonly schnorrVerify: ( + schnorrVerify: ( contextPtr: number, sigPtr: number, msg32Ptr: number, - publicKeyPtr: number + publicKeyPtr: number, ) => 0 | 1; /** @@ -393,7 +393,7 @@ export interface Secp256k1Wasm { * @param contextPtr - pointer to a context object * @param secretKeyPtr - pointer to a 32-byte secret key */ - readonly seckeyVerify: (contextPtr: number, secretKeyPtr: number) => 0 | 1; + seckeyVerify: (contextPtr: number, secretKeyPtr: number) => 0 | 1; /** * Create an ECDSA signature. The created signature is always in lower-S form. @@ -412,11 +412,11 @@ export interface Secp256k1Wasm { * @param msg32Ptr - pointer to the 32-byte message hash being signed * @param secretKeyPtr - pointer to a 32-byte secret key */ - readonly sign: ( + sign: ( contextPtr: number, outputSigPtr: number, msg32Ptr: number, - secretKeyPtr: number + secretKeyPtr: number, ) => 0 | 1; /** @@ -434,10 +434,10 @@ export interface Secp256k1Wasm { * signature will be written (internal format) * @param inputSigPtr - pointer to a signature to malleate */ - readonly signatureMalleate: ( + signatureMalleate: ( contextPtr: number, outputSigPtr: number, - inputSigPtr: number + inputSigPtr: number, ) => 1; /** @@ -483,10 +483,10 @@ export interface Secp256k1Wasm { * @param inputSigPtr - pointer to a signature to check/normalize (internal * format) */ - readonly signatureNormalize: ( + signatureNormalize: ( contextPtr: number, outputSigPtr: number, - inputSigPtr: number + inputSigPtr: number, ) => 0 | 1; /** @@ -506,10 +506,10 @@ export interface Secp256k1Wasm { * will be written. (internal format) * @param compactSigInPtr - pointer to a serialized signature in compact format */ - readonly signatureParseCompact: ( + signatureParseCompact: ( contextPtr: number, sigOutPtr: number, - compactSigInPtr: number + compactSigInPtr: number, ) => 0 | 1; /** @@ -532,11 +532,11 @@ export interface Secp256k1Wasm { * this should be a simple integer, rather than a `size_t` pointer as is * required by the serialization methods.) */ - readonly signatureParseDER: ( + signatureParseDER: ( contextPtr: number, sigOutPtr: number, sigDERInPtr: number, - sigDERInLength: number + sigDERInLength: number, ) => 0 | 1; /** @@ -550,10 +550,10 @@ export interface Secp256k1Wasm { * @param inputSigPtr - pointer to the 64-byte signature to be serialized * (internal format) */ - readonly signatureSerializeCompact: ( + signatureSerializeCompact: ( contextPtr: number, outputCompactSigPtr: number, - inputSigPtr: number + inputSigPtr: number, ) => 1; /** @@ -570,11 +570,11 @@ export interface Secp256k1Wasm { * @param inputSigPtr - pointer to the 64-byte signature to be serialized * (internal format) */ - readonly signatureSerializeDER: ( + signatureSerializeDER: ( contextPtr: number, outputDERSigPtr: number, outputDERSigLengthPtr: number, - inputSigPtr: number + inputSigPtr: number, ) => 0 | 1; /** @@ -595,11 +595,11 @@ export interface Secp256k1Wasm { * @param msg32Ptr - pointer to the 32-byte message hash being signed * @param secretKeyPtr - pointer to a 32-byte secret key */ - readonly signRecoverable: ( + signRecoverable: ( contextPtr: number, outputRSigPtr: number, msg32Ptr: number, - secretKeyPtr: number + secretKeyPtr: number, ) => 0 | 1; /** @@ -623,10 +623,10 @@ export interface Secp256k1Wasm { * @param pubkeyPtr - pointer to the parsed pubkey with which to verify * (internal format) */ - readonly verify: ( + verify: ( contextPtr: number, sigPtr: number, msg32Ptr: number, - pubkeyPtr: number + pubkeyPtr: number, ) => 0 | 1; -} +}; diff --git a/src/lib/bin/secp256k1/secp256k1-wasm.spec.ts b/src/lib/bin/secp256k1/secp256k1-wasm.spec.ts index 98276877..99203c44 100644 --- a/src/lib/bin/secp256k1/secp256k1-wasm.spec.ts +++ b/src/lib/bin/secp256k1/secp256k1-wasm.spec.ts @@ -57,7 +57,7 @@ const sigSchnorr = new Uint8Array([0xb5, 0x10, 0x41, 0x58, 0x7d, 0xa9, 0x46, 0xe const testSecp256k1Wasm = ( t: ExecutionContext, - secp256k1Wasm: Secp256k1Wasm + secp256k1Wasm: Secp256k1Wasm, ) => { t.truthy(secp256k1Wasm.heapU32); t.truthy(secp256k1Wasm.heapU8); @@ -66,7 +66,7 @@ const testSecp256k1Wasm = ( const contextPtr = secp256k1Wasm.contextCreate(ContextFlag.BOTH); { const seedPtr = secp256k1Wasm.mallocUint8Array( - new Uint8Array(randomBytes(32)) + new Uint8Array(randomBytes(32)), ); t.is(secp256k1Wasm.contextRandomize(contextPtr, seedPtr), 1); secp256k1Wasm.free(seedPtr); @@ -86,14 +86,14 @@ const testSecp256k1Wasm = ( uncompressedOutputPtr, uncompressedOutputLengthPtr, rawPubkeyPtr, - CompressionFlag.UNCOMPRESSED + CompressionFlag.UNCOMPRESSED, ); const uncompressedLength = secp256k1Wasm.readSizeT( - uncompressedOutputLengthPtr + uncompressedOutputLengthPtr, ); const uncompressedPublicKey = secp256k1Wasm.readHeapU8( uncompressedOutputPtr, - uncompressedLength + uncompressedLength, ); t.deepEqual(pubkeyUncompressed, uncompressedPublicKey); @@ -105,12 +105,12 @@ const testSecp256k1Wasm = ( compressedOutputPtr, compressedOutputLengthPtr, rawPubkeyPtr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ); const compressedLength = secp256k1Wasm.readSizeT(compressedOutputLengthPtr); const compressedPublicKey = secp256k1Wasm.readHeapU8( compressedOutputPtr, - compressedLength + compressedLength, ); t.deepEqual(pubkeyCompressed, compressedPublicKey); @@ -121,9 +121,9 @@ const testSecp256k1Wasm = ( contextPtr, rawPubkey2Ptr, uncompressedOutputPtr, - 65 + 65, ), - 1 + 1, ); const compressedOutput2Ptr = secp256k1Wasm.malloc(33); const compressedOutput2LengthPtr = secp256k1Wasm.mallocSizeT(33); @@ -133,14 +133,14 @@ const testSecp256k1Wasm = ( compressedOutput2Ptr, compressedOutput2LengthPtr, rawPubkey2Ptr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ), - 1 + 1, ); const convertedLength = secp256k1Wasm.readSizeT(compressedOutput2LengthPtr); const convertedPublicKey = secp256k1Wasm.readHeapU8( compressedOutput2Ptr, - convertedLength + convertedLength, ); t.deepEqual(convertedPublicKey, pubkeyCompressed); t.deepEqual(convertedPublicKey, compressedPublicKey); @@ -158,9 +158,9 @@ const testSecp256k1Wasm = ( contextPtr, sigDERPtr, sigDERLengthPtr, - rawSigPtr + rawSigPtr, ), - 1 + 1, ); const sigDERLength = secp256k1Wasm.readSizeT(sigDERLengthPtr); t.is(sigDERLength, 71); @@ -174,9 +174,9 @@ const testSecp256k1Wasm = ( contextPtr, rawSig2Ptr, sigDERPtr, - sigDERLength + sigDERLength, ), - 1 + 1, ); // serialize the signature in compact format @@ -184,7 +184,7 @@ const testSecp256k1Wasm = ( secp256k1Wasm.signatureSerializeCompact( contextPtr, compactSigPtr, - rawSig2Ptr + rawSig2Ptr, ); const compactSig = secp256k1Wasm.readHeapU8(compactSigPtr, 64); t.deepEqual(compactSig, sigCompact); @@ -193,13 +193,13 @@ const testSecp256k1Wasm = ( const rawSig3Ptr = secp256k1Wasm.malloc(64); t.is( secp256k1Wasm.signatureParseCompact(contextPtr, rawSig3Ptr, compactSigPtr), - 1 + 1, ); // verify the signature t.is( secp256k1Wasm.verify(contextPtr, rawSig3Ptr, sigHashPtr, rawPubkeyPtr), - 1 + 1, ); // malleate, verify and fail @@ -209,11 +209,11 @@ const testSecp256k1Wasm = ( secp256k1Wasm.signatureMalleate( contextPtr, malleatedTwicePtr, - malleatedSigPtr + malleatedSigPtr, ); t.is( secp256k1Wasm.verify(contextPtr, malleatedSigPtr, sigHashPtr, rawPubkeyPtr), - 0 + 0, ); const rawSig3 = secp256k1Wasm.readHeapU8(rawSig3Ptr, 64); const malleatedTwiceSig = secp256k1Wasm.readHeapU8(malleatedTwicePtr, 64); @@ -225,18 +225,18 @@ const testSecp256k1Wasm = ( secp256k1Wasm.signatureNormalize( contextPtr, normalizedSigPtr, - malleatedSigPtr + malleatedSigPtr, ), - 1 + 1, ); t.is( secp256k1Wasm.verify( contextPtr, normalizedSigPtr, sigHashPtr, - rawPubkeyPtr + rawPubkeyPtr, ), - 1 + 1, ); // recovery signature @@ -247,9 +247,9 @@ const testSecp256k1Wasm = ( contextPtr, rawRSigPtr, sigHashPtr, - privkeyPtr + privkeyPtr, ), - 1 + 1, ); // the r and s portions of the signature should match that of a non-recoverable signature @@ -260,7 +260,7 @@ const testSecp256k1Wasm = ( contextPtr, compactRSigPtr, rIDPtr, - rawRSigPtr + rawRSigPtr, ); const compactRSig = secp256k1Wasm.readHeapU8(compactRSigPtr, 64); // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion @@ -276,13 +276,13 @@ const testSecp256k1Wasm = ( contextPtr, rawRSig2Ptr, compactRSigPtr, - rID + rID, ), - 1 + 1, ); t.deepEqual( secp256k1Wasm.readHeapU8(rawRSigPtr, 65), - secp256k1Wasm.readHeapU8(rawRSig2Ptr, 65) + secp256k1Wasm.readHeapU8(rawRSig2Ptr, 65), ); // the recovered public key should match the derived public key @@ -295,9 +295,9 @@ const testSecp256k1Wasm = ( contextPtr, recoveredPublicKeyPtr, rawRSigPtr, - sigHashPtr + sigHashPtr, ), - 1 + 1, ); secp256k1Wasm.pubkeySerialize( @@ -305,11 +305,11 @@ const testSecp256k1Wasm = ( recoveredPublicKeyCompressedPtr, recoveredPublicKeyCompressedLengthPtr, recoveredPublicKeyPtr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ); t.deepEqual( pubkeyCompressed, - secp256k1Wasm.readHeapU8(recoveredPublicKeyCompressedPtr, 33) + secp256k1Wasm.readHeapU8(recoveredPublicKeyCompressedPtr, 33), ); // skipping uncompressed checks since we already verified that parsing and serializing works. @@ -346,14 +346,14 @@ const testSecp256k1Wasm = ( secp256k1Wasm.heapU8.copyWithin( rawPubkeyTweakedAddPtr, rawPubkeyPtr, - rawPubkeyPtr + 64 + rawPubkeyPtr + 64, ); secp256k1Wasm.heapU8.set(privkey, privkeyTweakedMulPtr); secp256k1Wasm.heapU8.copyWithin( rawPubkeyTweakedMulPtr, rawPubkeyPtr, - rawPubkeyPtr + 64 + rawPubkeyPtr + 64, ); /* @@ -364,51 +364,51 @@ const testSecp256k1Wasm = ( secp256k1Wasm.privkeyTweakAdd( contextPtr, privkeyTweakedAddPtr, - keyTweakPtr + keyTweakPtr, ), - 1 + 1, ); t.deepEqual( secp256k1Wasm.readHeapU8(privkeyTweakedAddPtr, 32), - privkeyTweakedAdd + privkeyTweakedAdd, ); t.is( secp256k1Wasm.pubkeyCreate( contextPtr, rawPubkeyDerivedTweakedAddPtr, - privkeyTweakedAddPtr + privkeyTweakedAddPtr, ), - 1 + 1, ); secp256k1Wasm.pubkeySerialize( contextPtr, pubkeyDerivedTweakedAddCompressedPtr, pubkeyDerivedTweakedAddCompressedLengthPtr, rawPubkeyDerivedTweakedAddPtr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ); t.deepEqual( secp256k1Wasm.readHeapU8(pubkeyDerivedTweakedAddCompressedPtr, 33), - pubkeyTweakedAddCompressed + pubkeyTweakedAddCompressed, ); t.is( secp256k1Wasm.pubkeyTweakAdd( contextPtr, rawPubkeyTweakedAddPtr, - keyTweakPtr + keyTweakPtr, ), - 1 + 1, ); secp256k1Wasm.pubkeySerialize( contextPtr, pubkeyTweakedAddCompressedPtr, pubkeyTweakedAddCompressedLengthPtr, rawPubkeyTweakedAddPtr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ); t.deepEqual( secp256k1Wasm.readHeapU8(pubkeyTweakedAddCompressedPtr, 33), - pubkeyTweakedAddCompressed + pubkeyTweakedAddCompressed, ); // tweak mul @@ -416,51 +416,51 @@ const testSecp256k1Wasm = ( secp256k1Wasm.privkeyTweakMul( contextPtr, privkeyTweakedMulPtr, - keyTweakPtr + keyTweakPtr, ), - 1 + 1, ); t.deepEqual( secp256k1Wasm.readHeapU8(privkeyTweakedMulPtr, 32), - privkeyTweakedMul + privkeyTweakedMul, ); t.is( secp256k1Wasm.pubkeyCreate( contextPtr, rawPubkeyDerivedTweakedMulPtr, - privkeyTweakedMulPtr + privkeyTweakedMulPtr, ), - 1 + 1, ); secp256k1Wasm.pubkeySerialize( contextPtr, pubkeyDerivedTweakedMulCompressedPtr, pubkeyDerivedTweakedMulCompressedLengthPtr, rawPubkeyDerivedTweakedMulPtr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ); t.deepEqual( secp256k1Wasm.readHeapU8(pubkeyDerivedTweakedMulCompressedPtr, 33), - pubkeyTweakedMulCompressed + pubkeyTweakedMulCompressed, ); t.is( secp256k1Wasm.pubkeyTweakMul( contextPtr, rawPubkeyTweakedMulPtr, - keyTweakPtr + keyTweakPtr, ), - 1 + 1, ); secp256k1Wasm.pubkeySerialize( contextPtr, pubkeyTweakedMulCompressedPtr, pubkeyTweakedMulCompressedLengthPtr, rawPubkeyTweakedMulPtr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ); t.deepEqual( secp256k1Wasm.readHeapU8(pubkeyTweakedMulCompressedPtr, 33), - pubkeyTweakedMulCompressed + pubkeyTweakedMulCompressed, ); // create schnorr signature @@ -471,9 +471,9 @@ const testSecp256k1Wasm = ( contextPtr, schnorrSigPtr, schnorrMsgHashPtr, - privkeyPtr + privkeyPtr, ), - 1 + 1, ); t.deepEqual(secp256k1Wasm.readHeapU8(schnorrSigPtr, 64), sigSchnorr); @@ -483,9 +483,9 @@ const testSecp256k1Wasm = ( contextPtr, schnorrSigPtr, schnorrMsgHashPtr, - rawPubkeyPtr + rawPubkeyPtr, ), - 1 + 1, ); }; diff --git a/src/lib/bin/secp256k1/secp256k1-wasm.ts b/src/lib/bin/secp256k1/secp256k1-wasm.ts index afe2b20e..50890f22 100644 --- a/src/lib/bin/secp256k1/secp256k1-wasm.ts +++ b/src/lib/bin/secp256k1/secp256k1-wasm.ts @@ -1,4 +1,4 @@ -/* eslint-disable no-underscore-dangle, max-params, @typescript-eslint/naming-convention */ +/* eslint-disable no-underscore-dangle, @typescript-eslint/max-params, @typescript-eslint/naming-convention */ // cSpell:ignore memcpy, anyfunc import { base64ToBin } from '../../format/format.js'; @@ -13,7 +13,7 @@ export { ContextFlag, CompressionFlag }; const wrapSecp256k1Wasm = ( instance: WebAssembly.Instance, heapU8: Uint8Array, - heapU32: Uint32Array + heapU32: Uint32Array, ): Secp256k1Wasm => ({ contextCreate: (context) => (instance.exports as any)._secp256k1_context_create(context), @@ -30,13 +30,13 @@ const wrapSecp256k1Wasm = ( const pointer = (instance.exports as any)._malloc(4); // eslint-disable-next-line no-bitwise, @typescript-eslint/no-magic-numbers const pointerView32 = pointer >> 2; - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements heapU32.set([num], pointerView32); return pointer; }, mallocUint8Array: (array) => { const pointer = (instance.exports as any)._malloc(array.length) as number; - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements heapU8.set(array, pointer); return pointer; }, @@ -44,57 +44,57 @@ const wrapSecp256k1Wasm = ( (instance.exports as any)._secp256k1_ec_privkey_tweak_add( contextPtr, secretKeyPtr, - tweakNum256Ptr + tweakNum256Ptr, ), privkeyTweakMul: (contextPtr, secretKeyPtr, tweakNum256Ptr) => (instance.exports as any)._secp256k1_ec_privkey_tweak_mul( contextPtr, secretKeyPtr, - tweakNum256Ptr + tweakNum256Ptr, ), pubkeyCreate: (contextPtr, publicKeyPtr, secretKeyPtr) => (instance.exports as any)._secp256k1_ec_pubkey_create( contextPtr, publicKeyPtr, - secretKeyPtr + secretKeyPtr, ), pubkeyParse: ( contextPtr, publicKeyOutPtr, publicKeyInPtr, - publicKeyInLength + publicKeyInLength, ) => (instance.exports as any)._secp256k1_ec_pubkey_parse( contextPtr, publicKeyOutPtr, publicKeyInPtr, - publicKeyInLength + publicKeyInLength, ), pubkeySerialize: ( contextPtr, outputPtr, outputLengthPtr, publicKeyPtr, - compression + compression, ) => (instance.exports as any)._secp256k1_ec_pubkey_serialize( contextPtr, outputPtr, outputLengthPtr, publicKeyPtr, - compression + compression, ), pubkeyTweakAdd: (contextPtr, publicKeyPtr, tweakNum256Ptr) => (instance.exports as any)._secp256k1_ec_pubkey_tweak_add( contextPtr, publicKeyPtr, - tweakNum256Ptr + tweakNum256Ptr, ), pubkeyTweakMul: (contextPtr, publicKeyPtr, tweakNum256Ptr) => (instance.exports as any)._secp256k1_ec_pubkey_tweak_mul( contextPtr, publicKeyPtr, - tweakNum256Ptr + tweakNum256Ptr, ), readHeapU8: (pointer, bytes) => new Uint8Array(heapU8.buffer, pointer, bytes), readSizeT: (pointer) => { @@ -108,7 +108,7 @@ const wrapSecp256k1Wasm = ( contextPtr, outputPubkeyPointer, rSigPtr, - msg32Ptr + msg32Ptr, ), recoverableSignatureParse: (contextPtr, outputRSigPtr, inputSigPtr, rid) => ( @@ -117,13 +117,13 @@ const wrapSecp256k1Wasm = ( contextPtr, outputRSigPtr, inputSigPtr, - rid + rid, ), recoverableSignatureSerialize: ( contextPtr, sigOutPtr, recIDOutPtr, - rSigPtr + rSigPtr, ) => ( instance.exports as any @@ -131,95 +131,95 @@ const wrapSecp256k1Wasm = ( contextPtr, sigOutPtr, recIDOutPtr, - rSigPtr + rSigPtr, ), schnorrSign: (contextPtr, outputSigPtr, msg32Ptr, secretKeyPtr) => (instance.exports as any)._secp256k1_schnorr_sign( contextPtr, outputSigPtr, msg32Ptr, - secretKeyPtr + secretKeyPtr, ), schnorrVerify: (contextPtr, sigPtr, msg32Ptr, publicKeyPtr) => (instance.exports as any)._secp256k1_schnorr_verify( contextPtr, sigPtr, msg32Ptr, - publicKeyPtr + publicKeyPtr, ), seckeyVerify: (contextPtr, secretKeyPtr) => (instance.exports as any)._secp256k1_ec_seckey_verify( contextPtr, - secretKeyPtr + secretKeyPtr, ), sign: (contextPtr, outputSigPtr, msg32Ptr, secretKeyPtr) => (instance.exports as any)._secp256k1_ecdsa_sign( contextPtr, outputSigPtr, msg32Ptr, - secretKeyPtr + secretKeyPtr, ), signRecoverable: (contextPtr, outputRSigPtr, msg32Ptr, secretKeyPtr) => (instance.exports as any)._secp256k1_ecdsa_sign_recoverable( contextPtr, outputRSigPtr, msg32Ptr, - secretKeyPtr + secretKeyPtr, ), signatureMalleate: (contextPtr, outputSigPtr, inputSigPtr) => (instance.exports as any)._secp256k1_ecdsa_signature_malleate( contextPtr, outputSigPtr, - inputSigPtr + inputSigPtr, ), signatureNormalize: (contextPtr, outputSigPtr, inputSigPtr) => (instance.exports as any)._secp256k1_ecdsa_signature_normalize( contextPtr, outputSigPtr, - inputSigPtr + inputSigPtr, ), signatureParseCompact: (contextPtr, sigOutPtr, compactSigInPtr) => (instance.exports as any)._secp256k1_ecdsa_signature_parse_compact( contextPtr, sigOutPtr, - compactSigInPtr + compactSigInPtr, ), signatureParseDER: (contextPtr, sigOutPtr, sigDERInPtr, sigDERInLength) => (instance.exports as any)._secp256k1_ecdsa_signature_parse_der( contextPtr, sigOutPtr, sigDERInPtr, - sigDERInLength + sigDERInLength, ), signatureSerializeCompact: (contextPtr, outputCompactSigPtr, inputSigPtr) => (instance.exports as any)._secp256k1_ecdsa_signature_serialize_compact( contextPtr, outputCompactSigPtr, - inputSigPtr + inputSigPtr, ), signatureSerializeDER: ( contextPtr, outputDERSigPtr, outputDERSigLengthPtr, - inputSigPtr + inputSigPtr, ) => (instance.exports as any)._secp256k1_ecdsa_signature_serialize_der( contextPtr, outputDERSigPtr, outputDERSigLengthPtr, - inputSigPtr + inputSigPtr, ), verify: (contextPtr, sigPtr, msg32Ptr, pubkeyPtr) => (instance.exports as any)._secp256k1_ecdsa_verify( contextPtr, sigPtr, msg32Ptr, - pubkeyPtr + pubkeyPtr, ), }); /* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable functional/immutable-data, functional/no-expression-statement, @typescript-eslint/no-magic-numbers, functional/no-conditional-statement, no-bitwise, functional/no-throw-statement */ +/* eslint-disable functional/immutable-data, functional/no-expression-statements, @typescript-eslint/no-magic-numbers, functional/no-conditional-statements, no-bitwise, functional/no-throw-statements */ /** * Method extracted from Emscripten's preamble.js */ @@ -253,7 +253,7 @@ const alignMemory = (factor: number, size: number) => * @param webassemblyBytes - A buffer containing the secp256k1 binary. */ export const instantiateSecp256k1WasmBytes = async ( - webassemblyBytes: ArrayBuffer + webassemblyBytes: ArrayBuffer, ): Promise => { const STACK_ALIGN = 16; const GLOBAL_BASE = 1024; @@ -321,7 +321,7 @@ export const instantiateSecp256k1WasmBytes = async ( _emscripten_memcpy_big: /* istanbul ignore next */ ( dest: number, src: number, - num: number + num: number, ) => { heapU8.set(heapU8.subarray(src, src + num), dest); return dest; @@ -359,7 +359,7 @@ export const instantiateSecp256k1WasmBytes = async ( return wrapSecp256k1Wasm(result.instance, heapU8, heapU32); }); }; -/* eslint-enable functional/immutable-data, functional/no-expression-statement, @typescript-eslint/no-magic-numbers, functional/no-conditional-statement, no-bitwise, functional/no-throw-statement */ +/* eslint-enable functional/immutable-data, functional/no-expression-statements, @typescript-eslint/no-magic-numbers, functional/no-conditional-statements, no-bitwise, functional/no-throw-statements */ export const getEmbeddedSecp256k1Binary = () => base64ToBin(secp256k1Base64Bytes).buffer; diff --git a/src/lib/compiler/compiler-bch/compiler-bch-operations.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch-operations.spec.ts index decb6b03..a5ccfc4f 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch-operations.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch-operations.spec.ts @@ -13,13 +13,13 @@ test('compilerOperationSigningSerializationFullBCH: requires an algorithm', (t) sha256: { hash: () => Uint8Array.of() }, sourceScriptIds: ['test'], unlockingScripts: { test: 'lock' }, - } + }, ), { error: 'Invalid signing serialization operation. Include the desired component or algorithm, e.g. "signing_serialization.version".', status: 'error', - } + }, ); }); test('compilerOperationSigningSerializationFullBCH: error on unknown algorithms', (t) => { @@ -32,12 +32,12 @@ test('compilerOperationSigningSerializationFullBCH: error on unknown algorithms' sha256: { hash: () => Uint8Array.of() }, sourceScriptIds: ['test'], unlockingScripts: { test: 'lock' }, - } + }, ), { error: 'Unknown signing serialization algorithm, "full_unknown_serialization".', status: 'error', - } + }, ); }); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts index 96f8d502..b94ca66a 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts @@ -43,7 +43,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -52,10 +52,10 @@ test( '', { currentBlockTime: dateToLocktime( - new Date('2019-10-13T00:00:00.000Z') + new Date('2019-10-13T00:00:00.000Z'), ) as number, }, - { bytecode: hexToBin('040069a25d'), success: true } + { bytecode: hexToBin('040069a25d'), success: true }, ); test( @@ -78,7 +78,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -86,7 +86,7 @@ test( expectCompilationResult, '', { currentBlockHeight: 1 }, - { bytecode: hexToBin('51'), success: true } + { bytecode: hexToBin('51'), success: true }, ); test( @@ -115,7 +115,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { unlockingScriptTimeLockTypes: { test: 'height' } } + { unlockingScriptTimeLockTypes: { test: 'height' } }, ); test( @@ -144,7 +144,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { unlockingScriptTimeLockTypes: { test: 'timestamp' } } + { unlockingScriptTimeLockTypes: { test: 'timestamp' } }, ); test( @@ -182,7 +182,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { unlockingScriptTimeLockTypes: { test: 'height' } } + { unlockingScriptTimeLockTypes: { test: 'height' } }, ); test( @@ -205,7 +205,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -228,7 +228,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); /** @@ -244,10 +244,10 @@ test( { currentBlockHeight: 1, currentBlockTime: dateToLocktime( - new Date('2019-10-13T00:00:00.000Z') + new Date('2019-10-13T00:00:00.000Z'), ) as number, }, - { bytecode: hexToBin('51040069a25d'), success: true } + { bytecode: hexToBin('51040069a25d'), success: true }, ); test( @@ -280,7 +280,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -303,7 +303,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test.failing( @@ -313,10 +313,10 @@ test.failing( {}, { bytecode: hexToBin( - '4c9d000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba214e63bf41490e67d34476778f6707aa6c8d2c8dccdf78ae11e40ee9f91e89a705050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa450000000041000000' + '4c9d000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba214e63bf41490e67d34476778f6707aa6c8d2c8dccdf78ae11e40ee9f91e89a705050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa450000000041000000', ), success: true, - } + }, ); test.failing( @@ -326,10 +326,10 @@ test.failing( {}, { bytecode: hexToBin( - '4c9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa4500000000c1000000' + '4c9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa4500000000c1000000', ), success: true, - } + }, ); test.failing( @@ -339,10 +339,10 @@ test.failing( {}, { bytecode: hexToBin( - '4c9d000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba0000000000000000000000000000000000000000000000000000000000000000050505050505050505050505050505050505050505050505050505050505050500000000000000000000000000000000009c12cfdc04c74584d787ac3d23772132c18524bc7ab28dec4219b8fc5b425f700000000043000000' + '4c9d000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba0000000000000000000000000000000000000000000000000000000000000000050505050505050505050505050505050505050505050505050505050505050500000000000000000000000000000000009c12cfdc04c74584d787ac3d23772132c18524bc7ab28dec4219b8fc5b425f700000000043000000', ), success: true, - } + }, ); test.failing( @@ -352,10 +352,10 @@ test.failing( {}, { bytecode: hexToBin( - '4c9d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050505050505050505050505050505050505050505050505050505050505050500000000000000000000000000000000009c12cfdc04c74584d787ac3d23772132c18524bc7ab28dec4219b8fc5b425f7000000000c3000000' + '4c9d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050505050505050505050505050505050505050505050505050505050505050500000000000000000000000000000000009c12cfdc04c74584d787ac3d23772132c18524bc7ab28dec4219b8fc5b425f7000000000c3000000', ), success: true, - } + }, ); test.failing( @@ -365,10 +365,10 @@ test.failing( {}, { bytecode: hexToBin( - '4c9d000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba00000000000000000000000000000000000000000000000000000000000000000505050505050505050505050505050505050505050505050505050505050505000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042000000' + '4c9d000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba00000000000000000000000000000000000000000000000000000000000000000505050505050505050505050505050505050505050505050505050505050505000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042000000', ), success: true, - } + }, ); test.failing( @@ -378,10 +378,10 @@ test.failing( {}, { bytecode: hexToBin( - '4c9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2000000' + '4c9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2000000', ), success: true, - } + }, ); test.failing( @@ -392,7 +392,7 @@ test.failing( { bytecode: hexToBin('51'), success: true, - } + }, ); test.failing( @@ -402,10 +402,10 @@ test.failing( {}, { bytecode: hexToBin( - '209c12cfdc04c74584d787ac3d23772132c18524bc7ab28dec4219b8fc5b425f70' + '209c12cfdc04c74584d787ac3d23772132c18524bc7ab28dec4219b8fc5b425f70', ), success: true, - } + }, ); test( @@ -416,7 +416,7 @@ test( { bytecode: hexToBin('0100'), success: true, - } + }, ); test( @@ -427,7 +427,7 @@ test( { bytecode: hexToBin('00'), success: true, - } + }, ); test( @@ -438,7 +438,7 @@ test( { bytecode: hexToBin('0400000000'), success: true, - } + }, ); test( @@ -449,7 +449,7 @@ test( { bytecode: hexToBin('0400000000'), success: true, - } + }, ); test.failing( @@ -459,10 +459,10 @@ test.failing( {}, { bytecode: hexToBin( - '200505050505050505050505050505050505050505050505050505050505050505' + '200505050505050505050505050505050505050505050505050505050505050505', ), success: true, - } + }, ); test.failing( @@ -473,7 +473,7 @@ test.failing( { bytecode: hexToBin('080000000000000000'), success: true, - } + }, ); test( @@ -484,7 +484,7 @@ test( { bytecode: hexToBin('0400000000'), success: true, - } + }, ); test.failing( @@ -495,7 +495,7 @@ test.failing( { bytecode: hexToBin('52'), success: true, - } + }, ); test.failing( @@ -505,10 +505,10 @@ test.failing( {}, { bytecode: hexToBin( - '201cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba' + '201cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba', ), success: true, - } + }, ); test.failing( @@ -519,7 +519,7 @@ test.failing( { bytecode: hexToBin('53'), success: true, - } + }, ); test.failing( @@ -529,10 +529,10 @@ test.failing( {}, { bytecode: hexToBin( - '20c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa45' + '20c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa45', ), success: true, - } + }, ); test.failing( @@ -543,7 +543,7 @@ test.failing( { bytecode: hexToBin('54'), success: true, - } + }, ); test.failing( @@ -553,10 +553,10 @@ test.failing( {}, { bytecode: hexToBin( - '20214e63bf41490e67d34476778f6707aa6c8d2c8dccdf78ae11e40ee9f91e89a7' + '20214e63bf41490e67d34476778f6707aa6c8d2c8dccdf78ae11e40ee9f91e89a7', ), success: true, - } + }, ); test( @@ -567,7 +567,7 @@ test( { bytecode: hexToBin('0400000000'), success: true, - } + }, ); test( @@ -594,7 +594,7 @@ test( {}, { unlockingScripts: {}, - } + }, ); test( @@ -623,7 +623,7 @@ test( unlockingScripts: { test: 'some_unknown_script', }, - } + }, ); test( @@ -653,7 +653,7 @@ test( lock: 'invalid', test: '', }, - } + }, ); test( @@ -676,7 +676,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -699,7 +699,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test.failing( @@ -742,7 +742,7 @@ test.failing( { bytecode: hexToBin('510052'), success: true, - } + }, ); t.deepEqual( @@ -753,7 +753,7 @@ test.failing( { bytecode: hexToBin('510052'), success: true, - } + }, ); - } + }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts index f51914a5..a86eac41 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts @@ -19,11 +19,11 @@ test( { keys: { privateKeys: { owner: privkey } } }, { bytecode: hexToBin( - '463044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a003abcdef' + '463044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a003abcdef', ), success: true, }, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -33,17 +33,17 @@ test( { bytecode: { 'owner.data_signature.another': hexToBin( - '3044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a0' + '3044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a0', ), }, }, { bytecode: hexToBin( - '463044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a003abcdef' + '463044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a003abcdef', ), success: true, }, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -67,7 +67,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -91,7 +91,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -115,7 +115,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -141,7 +141,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -166,7 +166,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'Key' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -191,7 +191,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'Key' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -216,7 +216,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'Key' } }, - { sha256: undefined } + { sha256: undefined }, ); test( @@ -240,7 +240,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -252,11 +252,11 @@ test( }, { bytecode: hexToBin( - '463044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a003abcdef' + '463044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a003abcdef', ), success: true, }, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -280,5 +280,5 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.evaluations.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.evaluations.spec.ts index 7a3e011c..64c23115 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.evaluations.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.evaluations.spec.ts @@ -15,7 +15,7 @@ test( { bytecode: Uint8Array.of(0x03), success: true, - } + }, ); test.only( @@ -26,7 +26,7 @@ test.only( { bytecode: Uint8Array.from([0xaa, 0xbb, 0xcc]), success: true, - } + }, ); test( @@ -37,7 +37,7 @@ test( { bytecode: Uint8Array.of(), success: true, - } + }, ); test( @@ -60,7 +60,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -85,7 +85,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { vm: undefined } + { vm: undefined }, ); test( @@ -110,7 +110,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { createAuthenticationProgram: undefined } + { createAuthenticationProgram: undefined }, ); test( @@ -133,7 +133,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -156,7 +156,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -179,7 +179,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -202,7 +202,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -225,7 +225,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -248,7 +248,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -259,7 +259,7 @@ test( { bytecode: Uint8Array.of(), success: true, - } + }, ); test( @@ -270,7 +270,7 @@ test( { bytecode: Uint8Array.of(0x03), success: true, - } + }, ); test( @@ -293,7 +293,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -316,7 +316,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -349,7 +349,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -372,5 +372,5 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.hd-key.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.hd-key.spec.ts index ace63614..1b5b77b6 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.hd-key.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.hd-key.spec.ts @@ -16,13 +16,13 @@ import { * `m/0` public key push */ const m0PublicPush = hexToBin( - '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); /** * `m/0/0` public key push */ const m00PublicPush = hexToBin( - '2102df61d0e0ca2d1f02670cd94941d1f3299e10a01f0cc008b695e73006e4b28bfc' + '2102df61d0e0ca2d1f02670cd94941d1f3299e10a01f0cc008b695e73006e4b28bfc', ); /** * `m/0'` HD public key @@ -34,14 +34,14 @@ const m0HardenedHdPublicKeyTestnet = * `m/0'/1` public key push */ const m0H1PublicPush = hexToBin( - '21034f4d20bf3a18f6deb0109c20e0ab7328b22ff0d5a29ce85595344012ebca41e6' + '21034f4d20bf3a18f6deb0109c20e0ab7328b22ff0d5a29ce85595344012ebca41e6', ); /** * `m/1` public key push */ const m1PublicPush = hexToBin( - '21034002efc4f44014b116a986faa63b741b0b894a45ccf3f30c671e4146fb1c1954' + '21034002efc4f44014b116a986faa63b741b0b894a45ccf3f30c671e4146fb1c1954', ); test.failing( @@ -53,11 +53,11 @@ test.failing( }, { bytecode: hexToBin( - '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241' + '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241', ), success: true, }, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test.failing( @@ -69,11 +69,11 @@ test.failing( }, { bytecode: hexToBin( - '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41' + '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41', ), success: true, }, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -97,7 +97,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -108,7 +108,7 @@ test( hdKeys: { addressIndex: 0, hdPrivateKeys: { ownerEntityId: hdPrivateKey } }, }, { bytecode: m0PublicPush, success: true }, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -119,7 +119,7 @@ test( hdKeys: { addressIndex: 0, hdPublicKeys: { ownerEntityId: hdPublicKey } }, }, { bytecode: m0PublicPush, success: true }, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -129,7 +129,7 @@ test( { hdKeys: { addressIndex: 0, hdPublicKeys: { ownerEntityId: hdPublicKey } } }, { bytecode: m1PublicPush, success: true }, { owner: { type: 'HdKey' } }, - { variables: { owner: { addressOffset: 1, type: 'HdKey' } } } + { variables: { owner: { addressOffset: 1, type: 'HdKey' } } }, ); test( @@ -155,7 +155,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'HdKey' }, - } + }, ); test( @@ -180,7 +180,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -190,13 +190,13 @@ test( { bytecode: { 'owner.public_key': hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), }, }, { bytecode: m0PublicPush, success: true }, { owner: { type: 'HdKey' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -206,18 +206,18 @@ test( { bytecode: { 'owner.signature.all_outputs': hexToBin( - '3044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241' + '3044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241', ), }, }, { bytecode: hexToBin( - '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241' + '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241', ), success: true, }, { owner: { type: 'HdKey' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -227,18 +227,18 @@ test( { bytecode: { 'owner.schnorr_signature.all_outputs': hexToBin( - '313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41' + '313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41', ), }, }, { bytecode: hexToBin( - '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41' + '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41', ), success: true, }, { owner: { type: 'HdKey' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -264,7 +264,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -290,7 +290,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -316,7 +316,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -342,7 +342,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -367,7 +367,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -392,7 +392,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -419,7 +419,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -446,7 +446,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -473,7 +473,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { sha256: undefined } + { sha256: undefined }, ); test( @@ -500,7 +500,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { sha256: undefined } + { sha256: undefined }, ); test( @@ -512,7 +512,7 @@ test( }, { bytecode: m0PublicPush, success: true }, { owner: { type: 'HdKey' } }, - { variables: { owner: { addressOffset: -1, type: 'HdKey' } } } + { variables: { owner: { addressOffset: -1, type: 'HdKey' } } }, ); test( @@ -523,7 +523,7 @@ test( hdKeys: { addressIndex: 1, hdPrivateKeys: { ownerEntityId: hdPrivateKey } }, }, { bytecode: m1PublicPush, success: true }, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -535,7 +535,7 @@ test( }, { bytecode: m1PublicPush, success: true }, { owner: { type: 'HdKey' } }, - { variables: { owner: { addressOffset: 1, type: 'HdKey' } } } + { variables: { owner: { addressOffset: 1, type: 'HdKey' } } }, ); test( @@ -547,7 +547,7 @@ test( }, { bytecode: m1PublicPush, success: true }, { owner: { type: 'HdKey' } }, - { variables: { owner: { addressOffset: -1, type: 'HdKey' } } } + { variables: { owner: { addressOffset: -1, type: 'HdKey' } } }, ); test( @@ -576,7 +576,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -605,7 +605,7 @@ test( { owner: { type: 'HdKey' }, }, - { variables: { owner: { addressOffset: -1, type: 'HdKey' } } } + { variables: { owner: { addressOffset: -1, type: 'HdKey' } } }, ); test( @@ -639,7 +639,7 @@ test( lock: 'invalid', test: '', }, - } + }, ); test( @@ -670,7 +670,7 @@ test( }, { entityOwnership: undefined, - } + }, ); test( @@ -697,7 +697,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { entityOwnership: {} } + { entityOwnership: {} }, ); test( @@ -724,7 +724,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { entityOwnership: undefined } + { entityOwnership: undefined }, ); test( @@ -751,7 +751,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { entityOwnership: {} } + { entityOwnership: {} }, ); test( @@ -777,7 +777,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -806,7 +806,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -828,7 +828,7 @@ test( type: 'HdKey', }, }, - } + }, ); test( @@ -865,7 +865,7 @@ test( type: 'HdKey', }, }, - } + }, ); test( @@ -902,7 +902,7 @@ test( type: 'HdKey', }, }, - } + }, ); test( @@ -939,7 +939,7 @@ test( type: 'HdKey', }, }, - } + }, ); test( @@ -961,7 +961,7 @@ test( type: 'HdKey', }, }, - } + }, ); test( @@ -984,5 +984,5 @@ test( type: 'HdKey', }, }, - } + }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.key.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.key.spec.ts index ca6e4187..075d2b0c 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.key.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.key.spec.ts @@ -18,13 +18,13 @@ test.failing( { keys: { privateKeys: { owner: privkey } } }, { bytecode: hexToBin( - '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241' + '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241', ), success: true, }, { owner: { type: 'Key' }, - } + }, ); test.failing( @@ -34,13 +34,13 @@ test.failing( { keys: { privateKeys: { owner: privkey } } }, { bytecode: hexToBin( - '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41' + '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41', ), success: true, }, { owner: { type: 'Key' }, - } + }, ); test( @@ -50,13 +50,13 @@ test( { keys: { privateKeys: { owner: privkey } } }, { bytecode: hexToBin( - '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), success: true, }, { owner: { type: 'Key' }, - } + }, ); test( @@ -83,7 +83,7 @@ test( { owner: { type: 'Key' }, }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -93,20 +93,20 @@ test( { bytecode: { 'owner.public_key': hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), }, }, { bytecode: hexToBin( - '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), success: true, }, { owner: { type: 'Key' }, }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -139,7 +139,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -149,21 +149,21 @@ test( { bytecode: { 'owner.signature.all_outputs': hexToBin( - '3044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241' + '3044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241', ), }, keys: {}, }, { bytecode: hexToBin( - '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241' + '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241', ), success: true, }, { owner: { type: 'Key' }, }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -173,19 +173,19 @@ test( { bytecode: { 'owner.schnorr_signature.all_outputs': hexToBin( - '313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41' + '313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41', ), }, }, { bytecode: hexToBin( - '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41' + '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41', ), success: true, }, { owner: { type: 'Key' }, - } + }, ); test( @@ -211,7 +211,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -239,7 +239,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -267,7 +267,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -295,7 +295,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -320,7 +320,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -345,7 +345,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -371,7 +371,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -398,7 +398,7 @@ test( { owner: { type: 'Key' }, }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -425,7 +425,7 @@ test( { owner: { type: 'Key' }, }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -452,7 +452,7 @@ test( { owner: { type: 'Key' }, }, - { sha256: undefined } + { sha256: undefined }, ); test( @@ -479,7 +479,7 @@ test( { owner: { type: 'Key' }, }, - { sha256: undefined } + { sha256: undefined }, ); test( @@ -511,5 +511,5 @@ test( lock: 'invalid', test: '', }, - } + }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.langauge.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.langauge.spec.ts index e3c1be47..41706f0a 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.langauge.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.langauge.spec.ts @@ -13,7 +13,7 @@ test( expectCompilationResult, '', {}, - { bytecode: hexToBin(''), success: true } + { bytecode: hexToBin(''), success: true }, ); test( @@ -21,7 +21,7 @@ test( expectCompilationResult, '42 -42 2_147_483_647 -2_147_483_647', {}, - { bytecode: hexToBin('2aaaffffff7fffffffff'), success: true } + { bytecode: hexToBin('2aaaffffff7fffffffff'), success: true }, ); test( @@ -29,7 +29,7 @@ test( expectCompilationResult, '0b1 0b1111_1111 0b111 0b1111_1111__1111_1111__1111_1111__1111_1111____1111_1111__1111_1111__1111_1111__1111_1111_1', {}, - { bytecode: hexToBin('01ff07ffffffffffffffff01'), success: true } + { bytecode: hexToBin('01ff07ffffffffffffffff01'), success: true }, ); test( @@ -37,7 +37,7 @@ test( expectCompilationResult, "'abc\"`πŸ‘'", {}, - { bytecode: hexToBin('6162632260f09f918d'), success: true } + { bytecode: hexToBin('6162632260f09f918d'), success: true }, ); test( @@ -45,7 +45,7 @@ test( expectCompilationResult, '"abc\'`πŸ‘"', {}, - { bytecode: hexToBin('6162632760f09f918d'), success: true } + { bytecode: hexToBin('6162632760f09f918d'), success: true }, ); test( @@ -53,7 +53,7 @@ test( expectCompilationResult, '0xdead__beef', {}, - { bytecode: hexToBin('deadbeef'), success: true } + { bytecode: hexToBin('deadbeef'), success: true }, ); test( @@ -61,7 +61,7 @@ test( expectCompilationResult, 'OP_0 OP_1 OP_ADD', {}, - { bytecode: hexToBin('005193'), success: true } + { bytecode: hexToBin('005193'), success: true }, ); test( @@ -78,7 +78,7 @@ test( 0xef `, {}, - { bytecode: hexToBin('abcdef'), success: true } + { bytecode: hexToBin('abcdef'), success: true }, ); test( @@ -86,7 +86,7 @@ test( expectCompilationResult, '<>', {}, - { bytecode: hexToBin('00'), success: true } + { bytecode: hexToBin('00'), success: true }, ); test( @@ -97,7 +97,7 @@ test( { bytecode: hexToBin('4f005152535455565758595a5b5c5d5e5f600111'), success: true, - } + }, ); test( @@ -108,7 +108,7 @@ test( { bytecode: hexToBin('4f005152535455565758595a5b5c5d5e5f600111'), success: true, - } + }, ); test( @@ -119,7 +119,7 @@ test( { bytecode: hexToBin('0100'), success: true, - } + }, ); test( @@ -130,7 +130,7 @@ test( { bytecode: hexToBin('03616263'), success: true, - } + }, ); test( @@ -141,7 +141,7 @@ test( { bytecode: hexToBin('010001510152'), success: true, - } + }, ); test( @@ -152,7 +152,7 @@ test( { bytecode: hexToBin('03020151'), success: true, - } + }, ); test( @@ -172,7 +172,7 @@ test( { bytecode: hexToBin('00000000000061626327f09fa79927'), success: true, - } + }, ); test( @@ -192,7 +192,7 @@ test( c: '0x123456', test: 'a', }, - } + }, ); test( @@ -224,5 +224,5 @@ test( c: ' \n a', test: '\na', }, - } + }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.p2sh.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.p2sh.spec.ts index 693eb404..0d05d68a 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.p2sh.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.p2sh.spec.ts @@ -29,7 +29,7 @@ test( unlockingScripts: { test: 'lock', }, - } + }, ); test( @@ -53,7 +53,7 @@ test( unlockingScripts: { test: 'lock', }, - } + }, ); test( @@ -77,7 +77,7 @@ test( unlockingScripts: { unlock: 'test', }, - } + }, ); test( @@ -101,7 +101,7 @@ test( unlockingScripts: { unlock: 'test', }, - } + }, ); test( @@ -111,7 +111,7 @@ test( {}, { bytecode: hexToBin( - 'aa20cc2cfe8f87c6f8dc5a518c06c7c939a2f91d0294a59cd8d0b97a3d68700b95b287' + 'aa20cc2cfe8f87c6f8dc5a518c06c7c939a2f91d0294a59cd8d0b97a3d68700b95b287', ), success: true, }, @@ -127,7 +127,7 @@ test( unlockingScripts: { unlock: 'test', }, - } + }, ); test( @@ -162,7 +162,7 @@ test( unlockingScripts: { test: 'lock', }, - } + }, ); test( @@ -190,7 +190,7 @@ test( lockingScriptTypes: { test: 'p2sh20', }, - } + }, ); test( @@ -227,5 +227,5 @@ test( unlock: 'test', }, vm: undefined, - } + }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts index 3187c6a0..42fc65b3 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts @@ -81,8 +81,8 @@ const testSigningSerializationAlgorithms = test.macro<[string, string]>( success: true, }, `Expected bytecode:\n ${stringify(bytecodeHex)} \n\nResult: ${stringify( - resultUnlock - )}` + resultUnlock, + )}`, ); const resultUnlockHd = compiler.generateBytecode({ data: { @@ -98,94 +98,94 @@ const testSigningSerializationAlgorithms = test.macro<[string, string]>( success: true, }, `Expected bytecode:\n ${stringify(bytecodeHex)} \n\nResult: ${stringify( - resultUnlockHd - )}` + resultUnlockHd, + )}`, ); - } + }, ); test.failing( '[BCH compiler] signing serialization algorithms - ECDSA all_outputs', testSigningSerializationAlgorithms, ' ', - '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - ECDSA all_outputs_single_input', testSigningSerializationAlgorithms, ' ', - '483045022100b30fb165fa511b6ff3718a4dcc6dd25dd916620e08e207c47a54bae56a3dbd5402202cf24193d51a9cd11be879eb1da063ad22ac30b355855e5c8147bf1e5f2e2cf1c1210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '483045022100b30fb165fa511b6ff3718a4dcc6dd25dd916620e08e207c47a54bae56a3dbd5402202cf24193d51a9cd11be879eb1da063ad22ac30b355855e5c8147bf1e5f2e2cf1c1210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - ECDSA corresponding_output', testSigningSerializationAlgorithms, ' ', - '483045022100cea4e9fe270b4337c3c0cffdf57b2ccba11245752a860f9ff5c06cd3bfa399d902203ebef34068efe7e9bd2a334f886bc720e975fd4485df9d8b8e0b98e671c1d02243210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '483045022100cea4e9fe270b4337c3c0cffdf57b2ccba11245752a860f9ff5c06cd3bfa399d902203ebef34068efe7e9bd2a334f886bc720e975fd4485df9d8b8e0b98e671c1d02243210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - ECDSA corresponding_output_single_input', testSigningSerializationAlgorithms, ' ', - '473044022075bdb3381383221ea3073b2cc806b9f63ce0f1c1c5276f72a7b58922df2e69e40220075ec2497b9fa291ab028eed556fdc3591d93c52da80a35410731de40de8a0a6c3210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '473044022075bdb3381383221ea3073b2cc806b9f63ce0f1c1c5276f72a7b58922df2e69e40220075ec2497b9fa291ab028eed556fdc3591d93c52da80a35410731de40de8a0a6c3210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - ECDSA no_outputs', testSigningSerializationAlgorithms, ' ', - '47304402206e41f758eb74d0b679a5747c50a3e0c361dee4249ccc82ee491c862455a973e802204056bc00f207a7fb8ef3e2e068c09ca0d71f70685c66af7231a2aa0fb3e335f242210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '47304402206e41f758eb74d0b679a5747c50a3e0c361dee4249ccc82ee491c862455a973e802204056bc00f207a7fb8ef3e2e068c09ca0d71f70685c66af7231a2aa0fb3e335f242210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - ECDSA no_outputs_single_input', testSigningSerializationAlgorithms, ' ', - '483045022100bf73fa9557d725441b35af93ba2ae49e3afe3bd93cbddf9555e179fcc0b52d6f02203d7fb85de9ba6347ac87fe400819455c3a9f1a5c310f4e2dd32c00ae353a1981c2210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '483045022100bf73fa9557d725441b35af93ba2ae49e3afe3bd93cbddf9555e179fcc0b52d6f02203d7fb85de9ba6347ac87fe400819455c3a9f1a5c310f4e2dd32c00ae353a1981c2210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - Schnorr all_outputs', testSigningSerializationAlgorithms, ' ', - '419adccdbb9b0242938a08900238e302c446dcde0415cc3252c2371da1f827090171ed051c9c121030c37caacc81217b979de766b69d04f64c67219c8ebc45fd2541210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '419adccdbb9b0242938a08900238e302c446dcde0415cc3252c2371da1f827090171ed051c9c121030c37caacc81217b979de766b69d04f64c67219c8ebc45fd2541210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - Schnorr all_outputs_single_input', testSigningSerializationAlgorithms, ' ', - '41a8ffa79bd74f44780b6679cbc177735691d85ea86129909b4943e1541594babafab8433943b71de881d8ac6114da4c6095528d93b77cc570a61102ec6352b2ffc1210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '41a8ffa79bd74f44780b6679cbc177735691d85ea86129909b4943e1541594babafab8433943b71de881d8ac6114da4c6095528d93b77cc570a61102ec6352b2ffc1210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - Schnorr corresponding_output', testSigningSerializationAlgorithms, ' ', - '4157130313297ff18f71e123522f6e673258aad57b02bc963350fb59490cde160ebb9da2cdef624d6efa447a297a4d46e56b0035012de361b9902565231782aa8f43210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '4157130313297ff18f71e123522f6e673258aad57b02bc963350fb59490cde160ebb9da2cdef624d6efa447a297a4d46e56b0035012de361b9902565231782aa8f43210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - Schnorr corresponding_output_single_input', testSigningSerializationAlgorithms, ' ', - '41476031c21a9fe94b33135f7e7107a532de49956b0abf16a3bd941dad494b5e507274d50d2f2a67d30d2d26b76465be5bcc42a13b61d16e44068c3d1d905ac628c3210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '41476031c21a9fe94b33135f7e7107a532de49956b0abf16a3bd941dad494b5e507274d50d2f2a67d30d2d26b76465be5bcc42a13b61d16e44068c3d1d905ac628c3210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - Schnorr no_outputs', testSigningSerializationAlgorithms, ' ', - '41c3e465fa4b26870a817aeb29ebce6d697fa76c39454b9bd7d85875ca2a742e47660ce169087d0ac90b7ff35b7854efa1dcfe85fcf5080f6754d69585ab45875f42210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '41c3e465fa4b26870a817aeb29ebce6d697fa76c39454b9bd7d85875ca2a742e47660ce169087d0ac90b7ff35b7854efa1dcfe85fcf5080f6754d69585ab45875f42210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - Schnorr no_outputs_single_input', testSigningSerializationAlgorithms, ' ', - '413c24af0348f4eedba198f146fcfd3a099f67d4b17e690321bd038a3fd0ff8340200ab71722d2dd7fa3a513902c04362ff5ea41e4a7548e7733b377678bddcceac2210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '413c24af0348f4eedba198f146fcfd3a099f67d4b17e690321bd038a3fd0ff8340200ab71722d2dd7fa3a513902c04362ff5ea41e4a7548e7733b377678bddcceac2210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test('[BCH compiler] signing serialization algorithms - no signing serialization data', (t) => { diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.spec.helper.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.spec.helper.ts index e9973969..3c143725 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.spec.helper.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.spec.helper.ts @@ -52,7 +52,7 @@ export const expectCompilationResult = test.macro< CompilationData, BytecodeGenerationResult, CompilerConfiguration['variables']?, - Partial>? + Partial>?, ] >( ( @@ -61,8 +61,8 @@ export const expectCompilationResult = test.macro< otherData, expectedResult, variables, - configurationOverrides - // eslint-disable-next-line max-params + configurationOverrides, + // eslint-disable-next-line @typescript-eslint/max-params ) => { const compiler = compilerConfigurationToCompilerBCH< CompilerConfigurationBCH, @@ -105,8 +105,8 @@ export const expectCompilationResult = test.macro< resultUnlock, expectedResult, `- \nResult: ${stringifyTestVector( - resultUnlock - )}\n\nExpected:\n ${stringifyTestVector(expectedResult)}\n` + resultUnlock, + )}\n\nExpected:\n ${stringifyTestVector(expectedResult)}\n`, ); - } + }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.variables.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.variables.spec.ts index a26c9ea0..427ddc41 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.variables.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.variables.spec.ts @@ -24,7 +24,7 @@ test( name: 'Data', type: 'AddressData', }, - } + }, ); test( @@ -47,7 +47,7 @@ test( name: 'no description', type: 'AddressData', }, - } + }, ); test( @@ -84,7 +84,7 @@ test( { one: { type: 'AddressData' }, two: { type: 'AddressData' }, - } + }, ); test( @@ -127,7 +127,7 @@ test( { one: { type: 'AddressData' }, two: { type: 'AddressData' }, - } + }, ); test( @@ -146,7 +146,7 @@ test( name: 'Data', type: 'WalletData', }, - } + }, ); test( @@ -169,7 +169,7 @@ test( name: 'no description', type: 'WalletData', }, - } + }, ); test( @@ -206,7 +206,7 @@ test( { one: { type: 'WalletData' }, two: { type: 'WalletData' }, - } + }, ); test( @@ -249,7 +249,7 @@ test( { one: { type: 'WalletData' }, two: { type: 'WalletData' }, - } + }, ); test( @@ -262,7 +262,7 @@ test( errors: [ { error: - 'The "current_block_height" variable type can not be resolved because the "currentBlockHeight" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "current_block_height" variable type can not be resolved because the "currentBlockHeight" operation has not been included in this compiler\'s configuration.', range: { endColumn: 22, endLineNumber: 1, @@ -274,7 +274,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { operations: undefined } + { operations: undefined }, ); test( @@ -287,7 +287,7 @@ test( errors: [ { error: - 'The "current_block_time" variable type can not be resolved because the "currentBlockTime" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "current_block_time" variable type can not be resolved because the "currentBlockTime" operation has not been included in this compiler\'s configuration.', range: { endColumn: 20, endLineNumber: 1, @@ -299,7 +299,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { operations: undefined } + { operations: undefined }, ); test( @@ -312,7 +312,7 @@ test( errors: [ { error: - 'The "signing_serialization" variable type can not be resolved because the "signingSerialization" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "signing_serialization" variable type can not be resolved because the "signingSerialization" operation has not been included in this compiler\'s configuration.', range: { endColumn: 31, endLineNumber: 1, @@ -324,7 +324,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { operations: undefined } + { operations: undefined }, ); test( @@ -337,7 +337,7 @@ test( errors: [ { error: - 'The "a" variable type can not be resolved because the "addressData" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "a" variable type can not be resolved because the "addressData" operation has not been included in this compiler\'s configuration.', range: { endColumn: 3, endLineNumber: 1, @@ -351,7 +351,7 @@ test( { a: { type: 'AddressData' }, }, - { operations: undefined } + { operations: undefined }, ); test( @@ -364,7 +364,7 @@ test( errors: [ { error: - 'The "a" variable type can not be resolved because the "hdKey" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "a" variable type can not be resolved because the "hdKey" operation has not been included in this compiler\'s configuration.', range: { endColumn: 3, endLineNumber: 1, @@ -378,7 +378,7 @@ test( { a: { type: 'HdKey' }, }, - { operations: undefined } + { operations: undefined }, ); test( @@ -391,7 +391,7 @@ test( errors: [ { error: - 'The "a" variable type can not be resolved because the "key" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "a" variable type can not be resolved because the "key" operation has not been included in this compiler\'s configuration.', range: { endColumn: 3, endLineNumber: 1, @@ -405,7 +405,7 @@ test( { a: { type: 'Key' }, }, - { operations: undefined } + { operations: undefined }, ); test( @@ -418,7 +418,7 @@ test( errors: [ { error: - 'The "a" variable type can not be resolved because the "walletData" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "a" variable type can not be resolved because the "walletData" operation has not been included in this compiler\'s configuration.', range: { endColumn: 3, endLineNumber: 1, @@ -432,5 +432,5 @@ test( { a: { type: 'WalletData' }, }, - { operations: undefined } + { operations: undefined }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.spec.ts index 81174f8f..83448548 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.spec.ts @@ -42,7 +42,7 @@ test.failing('[BCH compiler] createCompilerBCH: generateBytecode', (t) => { bytecode: hexToBin('76a91415d16c84669ab46059313bf0747e781f1d13936d88ac'), success: true, }, - stringifyTestVector(resultLock) + stringifyTestVector(resultLock), ); const resultUnlock = compiler.generateBytecode({ @@ -56,11 +56,11 @@ test.failing('[BCH compiler] createCompilerBCH: generateBytecode', (t) => { resultUnlock, { bytecode: hexToBin( - '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), success: true, }, - stringifyTestVector(resultUnlock) + stringifyTestVector(resultUnlock), ); }); @@ -293,7 +293,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, reduce: { bytecode: hexToBin( - '76a91415d16c84669ab46059313bf0747e781f1d13936d88ac' + '76a91415d16c84669ab46059313bf0747e781f1d13936d88ac', ), range: { endColumn: 76, @@ -333,7 +333,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { script: [ { bytecode: hexToBin( - '15d16c84669ab46059313bf0747e781f1d13936d' + '15d16c84669ab46059313bf0747e781f1d13936d', ), range: { endColumn: 48, @@ -343,7 +343,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, source: { bytecode: hexToBin( - '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5a9' + '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5a9', ), range: { endColumn: 47, @@ -354,11 +354,11 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { script: [ { bytecode: hexToBin( - '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), push: { bytecode: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), range: { endColumn: 35, @@ -369,7 +369,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { script: [ { bytecode: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), range: { endColumn: 35, @@ -417,7 +417,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { instructions: [ { data: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), opcode: 33, }, @@ -439,7 +439,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { instructions: [ { data: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), opcode: 33, }, @@ -455,7 +455,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { signedMessages: [], stack: [ hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), ], }, @@ -465,7 +465,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { instructions: [ { data: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), opcode: 33, }, @@ -489,7 +489,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { instructions: [ { data: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), opcode: 33, }, @@ -597,7 +597,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, type: 'bytecode', value: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), variable: 'a.public_key', }, @@ -643,7 +643,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { ], success: true, }, - stringifyTestVector(resultLock) + stringifyTestVector(resultLock), ); const resultUnlock = compiler.generateBytecode({ @@ -658,7 +658,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { resultUnlock, { bytecode: hexToBin( - '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), parse: { end: { @@ -761,7 +761,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, reduce: { bytecode: hexToBin( - '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), range: { endColumn: 41, @@ -772,11 +772,11 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { script: [ { bytecode: hexToBin( - '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141' + '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141', ), push: { bytecode: hexToBin( - '304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141' + '304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141', ), range: { endColumn: 25, @@ -787,7 +787,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { script: [ { bytecode: hexToBin( - '304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141' + '304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141', ), range: { endColumn: 25, @@ -807,11 +807,11 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, { bytecode: hexToBin( - '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), push: { bytecode: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), range: { endColumn: 40, @@ -822,7 +822,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { script: [ { bytecode: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), range: { endColumn: 40, @@ -861,12 +861,12 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, signature: { serialization: hexToBin( - '000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba214e63bf41490e67d34476778f6707aa6c8d2c8dccdf78ae11e40ee9f91e89a70505050505050505050505050505050505050505050505050505050505050505000000001976a91415d16c84669ab46059313bf0747e781f1d13936d88ac000000000000000000000000c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa450000000041000000' + '000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba214e63bf41490e67d34476778f6707aa6c8d2c8dccdf78ae11e40ee9f91e89a70505050505050505050505050505050505050505050505050505050505050505000000001976a91415d16c84669ab46059313bf0747e781f1d13936d88ac000000000000000000000000c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa450000000041000000', ), }, type: 'bytecode', value: hexToBin( - '304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141' + '304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141', ), variable: 'a.signature.all_outputs', }, @@ -890,7 +890,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, type: 'bytecode', value: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), variable: 'a.public_key', }, @@ -899,6 +899,6 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { ], success: true, }, - stringifyTestVector(resultUnlock) + stringifyTestVector(resultUnlock), ); }); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.ts b/src/lib/compiler/compiler-bch/compiler-bch.ts index 97bfc6c6..76d21f78 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.ts @@ -8,12 +8,12 @@ import { import type { AnyCompilerConfiguration, AuthenticationProgramStateBCH, - AuthenticationTemplate, CompilationContextBCH, CompilationData, CompilerConfiguration, CompilerOperationResult, Sha256, + WalletTemplate, } from '../../lib.js'; import { createVirtualMachineBCH, @@ -33,9 +33,9 @@ import { } from '../compiler-operation-helpers.js'; import { compilerOperationsCommon } from '../compiler-operations.js'; import { - authenticationTemplateToCompilerConfiguration, compilerConfigurationToCompilerBCH, createAuthenticationProgramEvaluationCommon, + walletTemplateToCompilerConfiguration, } from '../compiler-utils.js'; export type CompilerOperationsKeyBCH = @@ -109,7 +109,7 @@ export enum SigningSerializationAlgorithmIdentifier { // eslint-disable-next-line complexity const getSigningSerializationType = ( algorithmIdentifier: string, - prefix = '' + prefix = '', ) => { switch (algorithmIdentifier) { case `${prefix}${SigningSerializationAlgorithmIdentifier.allOutputs}`: @@ -125,17 +125,17 @@ const getSigningSerializationType = ( SigningSerializationFlag.allOutputs | SigningSerializationFlag.singleInput | SigningSerializationFlag.utxos | - SigningSerializationFlag.forkId + SigningSerializationFlag.forkId, ); case `${prefix}${SigningSerializationAlgorithmIdentifier.correspondingOutput}`: return Uint8Array.of(SigningSerializationTypeBCH.correspondingOutput); case `${prefix}${SigningSerializationAlgorithmIdentifier.correspondingOutputAllUtxos}`: return Uint8Array.of( - SigningSerializationTypeBCH.correspondingOutputAllUtxos + SigningSerializationTypeBCH.correspondingOutputAllUtxos, ); case `${prefix}${SigningSerializationAlgorithmIdentifier.correspondingOutputSingleInput}`: return Uint8Array.of( - SigningSerializationTypeBCH.correspondingOutputSingleInput + SigningSerializationTypeBCH.correspondingOutputSingleInput, ); case `${prefix}${SigningSerializationAlgorithmIdentifier.correspondingOutputSingleInputInvalidAllUtxos}`: return Uint8Array.of( @@ -143,7 +143,7 @@ const getSigningSerializationType = ( SigningSerializationFlag.correspondingOutput | SigningSerializationFlag.singleInput | SigningSerializationFlag.utxos | - SigningSerializationFlag.forkId + SigningSerializationFlag.forkId, ); case `${prefix}${SigningSerializationAlgorithmIdentifier.noOutputs}`: return Uint8Array.of(SigningSerializationTypeBCH.noOutputs); @@ -157,7 +157,7 @@ const getSigningSerializationType = ( SigningSerializationFlag.noOutputs | SigningSerializationFlag.singleInput | SigningSerializationFlag.utxos | - SigningSerializationFlag.forkId + SigningSerializationFlag.forkId, ); default: return undefined; @@ -180,7 +180,7 @@ export const compilerOperationHelperComputeSignatureBCH = ({ operationName: string; sign: ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; sha256: { hash: Sha256['hash'] }; }): CompilerOperationResult => { @@ -212,7 +212,7 @@ export const compilerOperationHelperComputeSignatureBCH = ({ const serialization = generateSigningSerializationBCH( compilationContext, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const digest = hash256(serialization, sha256); const bitcoinEncodedSignature = Uint8Array.from([ @@ -282,7 +282,7 @@ export const compilerOperationHelperHdKeySignatureBCH = ({ sign: secp256k1[secp256k1Method], }); }, - }) + }), ); export const compilerOperationHdKeyEcdsaSignatureBCH = @@ -354,7 +354,7 @@ export const compilerOperationHelperKeySignatureBCH = ({ sign: secp256k1[secp256k1Method], }); }, - }) + }), ); export const compilerOperationKeyEcdsaSignatureBCH = @@ -370,7 +370,7 @@ export const compilerOperationKeySchnorrSignatureBCH = export const compilerOperationHelperComputeDataSignatureBCH = < Data extends CompilationData, - Configuration extends AnyCompilerConfiguration + Configuration extends AnyCompilerConfiguration, >({ data, configuration, @@ -387,7 +387,7 @@ export const compilerOperationHelperComputeDataSignatureBCH = < operationName: string; sign: ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; sha256: { hash: Sha256['hash'] }; }): CompilerOperationResult => { @@ -395,7 +395,7 @@ export const compilerOperationHelperComputeDataSignatureBCH = < string, string | undefined, string | undefined, - string | undefined + string | undefined, ]; if (unknown !== undefined) { @@ -480,7 +480,7 @@ export const compilerOperationHelperKeyDataSignatureBCH = ({ sign: secp256k1[secp256k1Method], }); }, - }) + }), ); export const compilerOperationKeyEcdsaDataSignatureBCH = @@ -538,7 +538,7 @@ export const compilerOperationHelperHdKeyDataSignatureBCH = ({ sign: secp256k1[secp256k1Method], }); }, - }) + }), ); export const compilerOperationHdKeyEcdsaDataSignatureBCH = @@ -579,7 +579,7 @@ export const compilerOperationSigningSerializationFullBCH = const signingSerializationType = getSigningSerializationType( algorithmOrComponent, - 'full_' + 'full_', ); if (signingSerializationType === undefined) { return { @@ -609,7 +609,7 @@ export const compilerOperationSigningSerializationFullBCH = coveredBytecode: result, signingSerializationType, }, - sha256 + sha256, ), status: 'success', }; @@ -673,10 +673,10 @@ export type CompilerConfigurationBCH = CompilerConfiguration< * include the `scripts` property */ export const createCompilerBCH = < - Configuration extends AnyCompilerConfiguration, - ProgramState extends AuthenticationProgramStateBCH + Configuration extends CompilerConfiguration, + ProgramState extends AuthenticationProgramStateBCH, >( - configuration: Configuration + configuration: Configuration, ) => compilerConfigurationToCompilerBCH({ ...{ @@ -687,10 +687,7 @@ export const createCompilerBCH = < secp256k1: internalSecp256k1, sha256: internalSha256, sha512: internalSha512, - vm: - configuration.vm === undefined - ? createVirtualMachineBCH() - : configuration.vm, + vm: configuration.vm ?? createVirtualMachineBCH(), }, ...configuration, }); @@ -698,21 +695,21 @@ export const createCompilerBCH = < export const createCompiler = createCompilerBCH; /** - * Create a BCH `Compiler` from an `AuthenticationTemplate` and an optional set + * Create a BCH `Compiler` from an `WalletTemplate` and an optional set * of overrides. - * @param template - the `AuthenticationTemplate` from which to create the BCH + * @param template - the `WalletTemplate` from which to create the BCH * compiler * @param overrides - a compiler configuration from which properties will be * used to override properties of the default BCH configuration */ -export const authenticationTemplateToCompilerBCH = < - Configuration extends AnyCompilerConfiguration, - ProgramState extends AuthenticationProgramStateBCH +export const walletTemplateToCompilerBCH = < + Configuration extends CompilerConfiguration, + ProgramState extends AuthenticationProgramStateBCH, >( - template: AuthenticationTemplate, - overrides?: Configuration + template: WalletTemplate, + overrides?: Configuration, ) => createCompilerBCH({ ...overrides, - ...authenticationTemplateToCompilerConfiguration(template), + ...walletTemplateToCompilerConfiguration(template), } as Configuration); diff --git a/src/lib/compiler/compiler-defaults.ts b/src/lib/compiler/compiler-defaults.ts index 21b73746..c6b627d2 100644 --- a/src/lib/compiler/compiler-defaults.ts +++ b/src/lib/compiler/compiler-defaults.ts @@ -8,10 +8,11 @@ export enum CompilerDefaults { * The value used for `["slot"]` and `["copy"]` locking or unlocking bytecode * when generating a scenario and no `unlockingScriptId` is provided. */ + // eslint-disable-next-line @typescript-eslint/no-mixed-enums defaultScenarioBytecode = '', /** * - * The value of `currentBlockHeight` in the default authentication template + * The value of `currentBlockHeight` in the default wallet template * scenario. This is the height of the second mined block after the genesis * block: `000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd`. * @@ -21,7 +22,7 @@ export enum CompilerDefaults { */ defaultScenarioCurrentBlockHeight = 2, /** - * The value of `currentBlockTime` in the default authentication template + * The value of `currentBlockTime` in the default wallet template * scenario. This is the Median Time-Past block time (BIP113) of block `2` * (the block used in * {@link CompilerDefaults.defaultScenarioCurrentBlockHeight}). @@ -39,17 +40,22 @@ export enum CompilerDefaults { * The default `sequenceNumber` of inputs in scenarios. */ defaultScenarioInputSequenceNumber = 0, + /** + * The default `lockingBytecode` value for scenario outputs, + * `OP_RETURN <"libauth">` (hex: `6a076c696261757468`). + */ + defaultScenarioOutputLockingBytecode = '6a076c696261757468', /** * The default `valueSatoshis` of outputs in scenarios. */ defaultScenarioOutputValueSatoshis = 0, /** - * The value of `transaction.locktime` in the default authentication template + * The value of `transaction.locktime` in the default wallet template * scenario. */ defaultScenarioTransactionLocktime = 0, /** - * The value of `transaction.version` in the default authentication template + * The value of `transaction.version` in the default wallet template * scenario. Transaction version `2` enables `OP_CHECKSEQUENCEVERIFY` as * described in BIP68, BIP112, and BIP113. */ @@ -70,7 +76,7 @@ export enum CompilerDefaults { /** * The prefix used to refer to other scenario bytecode scripts from within a - * bytecode script. See {@link AuthenticationTemplateScenarioData.bytecode} + * bytecode script. See {@link WalletTemplateScenarioData.bytecode} * for details. */ scenarioBytecodeScriptPrefix = '_scenario.', diff --git a/src/lib/compiler/compiler-operation-helpers.spec.ts b/src/lib/compiler/compiler-operation-helpers.spec.ts index 9ae9789b..f9ca77ee 100644 --- a/src/lib/compiler/compiler-operation-helpers.spec.ts +++ b/src/lib/compiler/compiler-operation-helpers.spec.ts @@ -14,7 +14,7 @@ test('attemptCompilerOperations: can skip configuration property check', (t) => dataProperties: [], operation: () => ({ error: 'test failed', status: 'error' }), })('', {}, { scripts: {} }), - { status: 'skip' } + { status: 'skip' }, ); }); @@ -33,6 +33,6 @@ test('compilerOperationHelperGenerateCoveredBytecode: empty sourceScriptIds', (t 'Identifier "test" requires a signing serialization, but "coveredBytecode" cannot be determined because the compiler configuration\'s "sourceScriptIds" is empty.', status: 'error', }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); diff --git a/src/lib/compiler/compiler-operation-helpers.ts b/src/lib/compiler/compiler-operation-helpers.ts index 158f5ef6..bc642226 100644 --- a/src/lib/compiler/compiler-operation-helpers.ts +++ b/src/lib/compiler/compiler-operation-helpers.ts @@ -2,7 +2,6 @@ import { decodeHdPrivateKey, deriveHdPath } from '../key/key.js'; import { resolveScriptIdentifier } from '../language/language.js'; import type { AnyCompilerConfiguration, - AuthenticationTemplateHdKey, CompilationContextBCH, CompilationData, CompilerConfiguration, @@ -10,6 +9,7 @@ import type { CompilerOperationErrorFatal, CompilerOperationResult, CompilerOperationSkip, + WalletTemplateHdKey, } from '../lib.js'; import { CompilerDefaults } from './compiler-defaults.js'; @@ -27,10 +27,10 @@ import { CompilerDefaults } from './compiler-defaults.js'; export const attemptCompilerOperations = ( operations: CompilerOperation[], - finalOperation: CompilerOperation + finalOperation: CompilerOperation, ): CompilerOperation => (identifier, data, configuration) => { - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const operation of operations) { const result = operation(identifier, data, configuration); if (result.status !== 'skip') return result; @@ -51,7 +51,7 @@ export const compilerOperationRequires = CanBeSkipped extends boolean, RequiredDataProperties extends keyof CompilationData, RequiredConfigurationProperties extends keyof CompilerConfiguration, - CompilationContext = CompilationContextBCH + CompilationContext = CompilationContextBCH, >({ /** * If `true`, the accepted operation may return `false`, and any missing @@ -89,12 +89,12 @@ export const compilerOperationRequires = CompilerConfiguration, RequiredConfigurationProperties > - > + >, ) => CompilerOperationResult; }): CompilerOperation => // eslint-disable-next-line complexity (identifier, data, configuration) => { - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const property of configurationProperties) { if (configuration[property] === undefined) return ( @@ -108,7 +108,7 @@ export const compilerOperationRequires = ? CompilerOperationSkip : CompilerOperationErrorFatal; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const property of dataProperties) { if ( (data[property] as (typeof data)[typeof property] | undefined) === @@ -137,7 +137,7 @@ export const compilerOperationRequires = CompilerConfiguration, RequiredConfigurationProperties > - > + >, ); }; @@ -173,7 +173,7 @@ export const compilerOperationHelperDeriveHdPrivateNode = ({ sha256: NonNullable; sha512: NonNullable; }; - hdKey: AuthenticationTemplateHdKey; + hdKey: WalletTemplateHdKey; identifier: string; }): CompilerOperationResult => { const addressOffset = @@ -203,7 +203,7 @@ export const compilerOperationHelperDeriveHdPrivateNode = ({ const instanceNode = deriveHdPath( masterContents.node, instancePath, - configuration + configuration, ); if (typeof instanceNode === 'string') { @@ -221,7 +221,7 @@ export const compilerOperationHelperDeriveHdPrivateNode = ({ export const compilerOperationHelperUnknownEntity = ( identifier: string, - variableId: string + variableId: string, ) => ({ error: `Identifier "${identifier}" refers to an HdKey, but the "entityOwnership" for "${variableId}" is not available in this compiler configuration.`, status: 'error' as const, @@ -274,9 +274,7 @@ export const compilerOperationHelperDeriveHdKeyPrivate = ({ /** * Guaranteed to be an `HdKey` if this method is reached in the compiler. */ - const hdKey = configuration.variables[ - variableId - ] as AuthenticationTemplateHdKey; + const hdKey = configuration.variables[variableId] as WalletTemplateHdKey; return compilerOperationHelperDeriveHdPrivateNode({ addressIndex, @@ -331,7 +329,7 @@ export const compilerOperationHelperCompileScript = ({ * {@link CompilerOperationErrorFatal}. */ export const compilerOperationHelperGenerateCoveredBytecode = < - CompilationContext + CompilationContext, >({ data, configuration, diff --git a/src/lib/compiler/compiler-operations.ts b/src/lib/compiler/compiler-operations.ts index ef128fc6..089bc970 100644 --- a/src/lib/compiler/compiler-operations.ts +++ b/src/lib/compiler/compiler-operations.ts @@ -4,10 +4,7 @@ import { valueSatoshisToBin, } from '../format/format.js'; import { decodeHdPublicKey, deriveHdPath } from '../key/key.js'; -import type { - AuthenticationTemplateHdKey, - CompilerOperationResult, -} from '../lib.js'; +import type { CompilerOperationResult, WalletTemplateHdKey } from '../lib.js'; import { encodeTransactionInputSequenceNumbersForSigning, encodeTransactionOutpoints, @@ -90,7 +87,7 @@ export const compilerOperationSigningSerializationCorrespondingOutput = dataProperties: ['compilationContext'], operation: (_, data) => { const { correspondingOutput } = generateSigningSerializationComponentsBCH( - data.compilationContext + data.compilationContext, ); return correspondingOutput === undefined ? { bytecode: Uint8Array.of(), status: 'success' } @@ -108,13 +105,13 @@ export const compilerOperationSigningSerializationCorrespondingOutputHash = dataProperties: ['compilationContext'], operation: (_, data, configuration) => { const { correspondingOutput } = generateSigningSerializationComponentsBCH( - data.compilationContext + data.compilationContext, ); return correspondingOutput === undefined ? { bytecode: Uint8Array.of(), status: 'success' } : { bytecode: configuration.sha256.hash( - configuration.sha256.hash(correspondingOutput) + configuration.sha256.hash(correspondingOutput), ), status: 'success', }; @@ -122,7 +119,7 @@ export const compilerOperationSigningSerializationCorrespondingOutputHash = }); const compilerOperationHelperSigningSerializationCoveredBytecode = ( - returnLength: boolean + returnLength: boolean, ) => compilerOperationRequires({ canBeSkipped: false, @@ -163,7 +160,7 @@ export const compilerOperationSigningSerializationLocktime = dataProperties: ['compilationContext'], operation: (_, data) => ({ bytecode: numberToBinUint32LE( - data.compilationContext.transaction.locktime + data.compilationContext.transaction.locktime, ), status: 'success', }), @@ -179,7 +176,7 @@ export const compilerOperationSigningSerializationOutpointIndex = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion data.compilationContext.transaction.inputs[ data.compilationContext.inputIndex - ]!.outpointIndex + ]!.outpointIndex, ), status: 'success', }), @@ -210,7 +207,7 @@ export const compilerOperationSigningSerializationOutputValue = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion data.compilationContext.sourceOutputs[ data.compilationContext.inputIndex - ]!.valueSatoshis + ]!.valueSatoshis, ), status: 'success', }), @@ -226,7 +223,7 @@ export const compilerOperationSigningSerializationSequenceNumber = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion data.compilationContext.transaction.inputs[ data.compilationContext.inputIndex - ]!.sequenceNumber + ]!.sequenceNumber, ), status: 'success', }), @@ -239,7 +236,7 @@ export const compilerOperationSigningSerializationTransactionOutpoints = dataProperties: ['compilationContext'], operation: (_, data) => ({ bytecode: encodeTransactionOutpoints( - data.compilationContext.transaction.inputs + data.compilationContext.transaction.inputs, ), status: 'success', }), @@ -253,8 +250,10 @@ export const compilerOperationSigningSerializationTransactionOutpointsHash = operation: (_, data, configuration) => ({ bytecode: configuration.sha256.hash( configuration.sha256.hash( - encodeTransactionOutpoints(data.compilationContext.transaction.inputs) - ) + encodeTransactionOutpoints( + data.compilationContext.transaction.inputs, + ), + ), ), status: 'success', }), @@ -267,7 +266,7 @@ export const compilerOperationSigningSerializationTransactionOutputs = dataProperties: ['compilationContext'], operation: (_, data) => ({ bytecode: encodeTransactionOutputsForSigning( - data.compilationContext.transaction.outputs + data.compilationContext.transaction.outputs, ), status: 'success', }), @@ -282,9 +281,9 @@ export const compilerOperationSigningSerializationTransactionOutputsHash = bytecode: configuration.sha256.hash( configuration.sha256.hash( encodeTransactionOutputsForSigning( - data.compilationContext.transaction.outputs - ) - ) + data.compilationContext.transaction.outputs, + ), + ), ), status: 'success', }), @@ -297,7 +296,7 @@ export const compilerOperationSigningSerializationTransactionSequenceNumbers = dataProperties: ['compilationContext'], operation: (_, data) => ({ bytecode: encodeTransactionInputSequenceNumbersForSigning( - data.compilationContext.transaction.inputs + data.compilationContext.transaction.inputs, ), status: 'success', }), @@ -312,9 +311,9 @@ export const compilerOperationSigningSerializationTransactionSequenceNumbersHash bytecode: configuration.sha256.hash( configuration.sha256.hash( encodeTransactionInputSequenceNumbersForSigning( - data.compilationContext.transaction.inputs - ) - ) + data.compilationContext.transaction.inputs, + ), + ), ), status: 'success', }), @@ -327,7 +326,7 @@ export const compilerOperationSigningSerializationVersion = dataProperties: ['compilationContext'], operation: (_, data) => ({ bytecode: numberToBinUint32LE( - data.compilationContext.transaction.version + data.compilationContext.transaction.version, ), status: 'success', }), @@ -349,7 +348,7 @@ export const compilerOperationKeyPublicKeyCommon = attemptCompilerOperations( return { bytecode: secp256k1.derivePublicKeyCompressed( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - privateKeys[variableId]! + privateKeys[variableId]!, ) as Uint8Array, status: 'success', }; @@ -360,7 +359,7 @@ export const compilerOperationKeyPublicKeyCommon = attemptCompilerOperations( status: 'error', }; }, - }) + }), ); export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( @@ -400,7 +399,7 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( */ const hdKey = configuration.variables[ variableId - ] as AuthenticationTemplateHdKey; + ] as WalletTemplateHdKey; if (entityHdPrivateKey !== undefined) { const privateResult = compilerOperationHelperDeriveHdPrivateNode({ @@ -414,7 +413,7 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( if (privateResult.status === 'error') return privateResult; return { bytecode: configuration.secp256k1.derivePublicKeyCompressed( - privateResult.bytecode + privateResult.bytecode, ) as Uint8Array, status: 'success', }; @@ -452,7 +451,7 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( const masterContents = decodeHdPublicKey( entityHdPublicKey, - configuration + configuration, ); if (typeof masterContents === 'string') { return { @@ -464,7 +463,7 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( const instanceNode = deriveHdPath( masterContents.node, instancePath, - configuration + configuration, ); if (typeof instanceNode === 'string') { @@ -476,7 +475,7 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( return { bytecode: instanceNode.publicKey, status: 'success' }; }, - }) + }), ); /* eslint-disable camelcase, @typescript-eslint/naming-convention */ diff --git a/src/lib/compiler/compiler-types.ts b/src/lib/compiler/compiler-types.ts index fe258864..2c3dd000 100644 --- a/src/lib/compiler/compiler-types.ts +++ b/src/lib/compiler/compiler-types.ts @@ -1,7 +1,5 @@ import type { AuthenticationProgramCommon, - AuthenticationTemplateScenario, - AuthenticationTemplateVariable, AuthenticationVirtualMachine, CompilationContextBCH, CompilationResult, @@ -10,39 +8,40 @@ import type { Secp256k1, Sha256, Sha512, + WalletTemplateScenario, + WalletTemplateVariable, } from '../lib.js'; -export interface CompilerOperationDebug { +export type CompilerOperationDebug = { /** * An additional, complex property that may be returned by custom compiler * operations. For use in extending the compiler to support additional return * information like {@link CompilerOperationSuccessSignature}. */ debug?: unknown; -} +}; /** * A non-recoverable error in a compiler operation. This is any error that * cannot be resolved by simply providing a missing variable. */ -export interface CompilerOperationErrorFatal extends CompilerOperationDebug { +export type CompilerOperationErrorFatal = CompilerOperationDebug & { status: 'error'; error: string; -} +}; /** * A recoverable error in a compiler operation. This occurs when a required * variable was not provided. */ -export interface CompilerOperationErrorRecoverable - extends CompilerOperationErrorFatal { +export type CompilerOperationErrorRecoverable = CompilerOperationErrorFatal & { /** * The full identifier (including any compilation operations) of the variable * missing from compilation, e.g. `my_key.signature.all_outputs` or * `my_key.public_key`. */ recoverable: true; -} +}; /** * An unsuccessful compiler operation result. @@ -58,11 +57,10 @@ export type CompilerOperationSuccess = | CompilerOperationSuccessGeneric | CompilerOperationSuccessSignatureType; -export interface CompilerOperationSuccessGeneric - extends CompilerOperationDebug { +export type CompilerOperationSuccessGeneric = CompilerOperationDebug & { status: 'success'; bytecode: Uint8Array; -} +}; /** * A successful signature-generation compiler operation. This provides slightly @@ -77,42 +75,42 @@ export type CompilerOperationSuccessSignatureType = /** * The result of a successful `signature` compiler operation. */ -export interface CompilerOperationSuccessSignature - extends CompilerOperationSuccessGeneric { - signature: { - /** - * The transaction signing serialization signed by a signature. This signing - * serialization is hashed twice with `sha256`, and the digest is signed. - */ - serialization: Uint8Array; +export type CompilerOperationSuccessSignature = + CompilerOperationSuccessGeneric & { + signature: { + /** + * The transaction signing serialization signed by a signature. This signing + * serialization is hashed twice with `sha256`, and the digest is signed. + */ + serialization: Uint8Array; + }; }; -} /** * The result of a successful `data_signature` compiler operation. */ -export interface CompilerOperationSuccessDataSignature - extends CompilerOperationSuccessGeneric { - signature: { - /** - * The digest of the raw message signed by a data signature. - */ - digest: Uint8Array; - /** - * The raw message signed by a data signature. This message is hashed once - * with `sha256`, and the digest is signed. - */ - message: Uint8Array; +export type CompilerOperationSuccessDataSignature = + CompilerOperationSuccessGeneric & { + signature: { + /** + * The digest of the raw message signed by a data signature. + */ + digest: Uint8Array; + /** + * The raw message signed by a data signature. This message is hashed once + * with `sha256`, and the digest is signed. + */ + message: Uint8Array; + }; }; -} /** * An unsuccessful compiler operation result that should be skipped by the * compiler. See {@link attemptCompilerOperations} for details. */ -export interface CompilerOperationSkip { +export type CompilerOperationSkip = { status: 'skip'; -} +}; export type CompilerOperationResult = CanBeSkipped extends true @@ -142,12 +140,14 @@ export type CompilerOperationResult = export type CompilerOperation< CompilationContext = unknown, CanBeSkipped extends boolean = false, - Data extends CompilationData = CompilationData, - Configuration extends AnyCompilerConfiguration = CompilerConfiguration + Data extends + CompilationData = CompilationData, + Configuration extends + AnyCompilerConfiguration = AnyCompilerConfiguration, > = ( identifier: string, data: Data, - configuration: Configuration + configuration: Configuration, ) => CompilerOperationResult; export type CompilerOperationsKeysCommon = 'public_key' | 'signature'; @@ -211,7 +211,7 @@ export type CompilerOperationsSigningSerializationCommon = * * @remarks * A {@link CompilerConfiguration} must include a subset of the script's - * {@link AuthenticationTemplate} – all the variables and scripts referenced + * {@link WalletTemplate} – all the variables and scripts referenced * (including children of children) by the script in question. * * The context must also include an object mapping of opcode identifiers to the @@ -243,7 +243,7 @@ export type CompilerOperationsSigningSerializationCommon = * operations for `current_block_time` variables or `false` if only a single * compiler operation is used for all instances (default: `false`) */ -export interface CompilerConfiguration< +export type CompilerConfiguration< CompilationContext = unknown, CompilerKeyOperations extends string | false = CompilerOperationsKeysCommon, CompilerSigningSerializationOperations extends @@ -252,8 +252,8 @@ export interface CompilerConfiguration< CompilerAddressDataOperations extends string | false = false, CompilerWalletDataOperations extends string | false = false, CompilerCurrentBlockHeightOperations extends string | false = false, - CompilerCurrentBlockTimeOperations extends string | false = false -> { + CompilerCurrentBlockTimeOperations extends string | false = false, +> = { /** * A method that accepts the compiled bytecode contents of a CashAssembly * evaluation and produces the equivalent {@link AuthenticationProgram} to be @@ -263,7 +263,7 @@ export interface CompilerConfiguration< */ createAuthenticationProgram?: | (( - evaluationBytecode: Uint8Array + evaluationBytecode: Uint8Array, // eslint-disable-next-line @typescript-eslint/no-explicit-any ) => any) | undefined; @@ -378,11 +378,9 @@ export interface CompilerConfiguration< ripemd160?: { hash: Ripemd160['hash'] } | undefined; /** * An object mapping scenario identifiers to the - * {@link AuthenticationTemplateScenario}s they represent. + * {@link WalletTemplateScenario}s they represent. */ - scenarios?: - | { [scriptId: string]: AuthenticationTemplateScenario } - | undefined; + scenarios?: { [scriptId: string]: WalletTemplateScenario } | undefined; /** * An object mapping script identifiers to the text of script in CashAssembly. * @@ -447,7 +445,7 @@ export interface CompilerConfiguration< * The `height` type indicates that the transaction's locktime is provided as * a block height (the `locktime` value is less than `500000000`). * - * See {@link AuthenticationTemplateScript.timeLockType} for details. + * See {@link WalletTemplateScript.timeLockType} for details. */ unlockingScriptTimeLockTypes?: | { @@ -457,27 +455,25 @@ export interface CompilerConfiguration< /** * An object mapping template variable identifiers to the - * {@link AuthenticationTemplateVariable} describing them. + * {@link WalletTemplateVariable} describing them. * * To avoid compilation errors, this object must contain all variables * referenced by the script being compiled (including in child scripts). */ - variables?: - | { [variableId: string]: AuthenticationTemplateVariable } - | undefined; + variables?: { [variableId: string]: WalletTemplateVariable } | undefined; /** * The {@link AuthenticationVirtualMachine} on which CashAssembly `evaluation` * results will be computed. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any vm?: AuthenticationVirtualMachine | undefined; -} +}; /** * Data required at compilation time to generate the bytecode for a particular * CashAssembly Template script. */ -export interface CompilationData { +export type CompilationData = { /** * A map of full identifiers to pre-computed bytecode for this compilation. * @@ -590,7 +586,7 @@ export interface CompilationData { * operations used in the compilation. */ compilationContext?: CompilationContext; -} +}; /** * Any compiler configuration, where each data type may use either a single or @@ -612,7 +608,7 @@ export type AnyCompilerConfiguration = * irrelevant. */ export type AnyCompilerConfigurationIgnoreOperations< - CompilationContext = CompilationContextBCH + CompilationContext = CompilationContextBCH, > = Omit, 'operations'>; export type BytecodeGenerationResult = @@ -623,26 +619,26 @@ export type BytecodeGenerationResult = }; /** - * A fully-generated authentication template scenario. Useful for estimating - * transactions and testing/debugging authentication templates. See - * {@link AuthenticationTemplateScenario} for details. + * A fully-generated wallet template scenario. Useful for estimating + * transactions and testing/debugging wallet templates. See + * {@link WalletTemplateScenario} for details. */ -export interface Scenario { +export type Scenario = { data: CompilationData; program: AuthenticationProgramCommon; -} +}; /** * A scenario generation result that includes all compilation information for * the scripts under test (in the scenario's "slot"s). This allows - * authentication template editors to display debugging information in context. + * wallet template editors to display debugging information in context. * * Note, scenarios can also include compilations for source outputs, inputs, and * outputs that are not under test – while debugging information is not * provided for these other compilations, any errors will result in `scenario` * being set to an error message (`string`). */ -export interface ScenarioGenerationDebuggingResult { +export type ScenarioGenerationDebuggingResult = { /** * Either the compiled scenario or an error message describing the scenario * generation failure. @@ -660,18 +656,18 @@ export interface ScenarioGenerationDebuggingResult { * compilation). */ unlockingCompilation?: CompilationResult; -} +}; /** * A {@link Compiler} is a wrapper around a specific * {@link CompilerConfiguration} that exposes a purely-functional interface and * allows for stronger type checking. */ -export interface Compiler< +export type Compiler< CompilationContext, Configuration extends AnyCompilerConfiguration, - ProgramState -> { + ProgramState, +> = { configuration: Configuration; /** * Generate the bytecode for the given script and compilation data. @@ -735,4 +731,4 @@ export interface Compiler< | (Debug extends true ? ScenarioGenerationDebuggingResult : Scenario); -} +}; diff --git a/src/lib/compiler/compiler-utils.ts b/src/lib/compiler/compiler-utils.ts index 39efeb55..0dbe3cf6 100644 --- a/src/lib/compiler/compiler-utils.ts +++ b/src/lib/compiler/compiler-utils.ts @@ -12,13 +12,13 @@ import type { AuthenticationProgramStateControlStack, AuthenticationProgramStateMinimum, AuthenticationProgramStateStack, - AuthenticationTemplate, BytecodeGenerationResult, CompilationContextBCH, CompilationData, CompilationResult, Compiler, CompilerConfiguration, + WalletTemplate, } from '../lib.js'; import { generateBytecodeMap, @@ -40,9 +40,9 @@ export const createCompilerGenerateBytecodeFunction = Configuration extends AnyCompilerConfiguration, ProgramState extends AuthenticationProgramStateControlStack & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - compilerConfiguration: Configuration + compilerConfiguration: Configuration, ) => ({ data, @@ -56,18 +56,18 @@ export const createCompilerGenerateBytecodeFunction = const result = compileScript( scriptId, data, - compilerConfiguration + compilerConfiguration, ); return ( debug === true ? result : result.success - ? { bytecode: result.bytecode, success: true } - : { - errorType: result.errorType, - errors: result.errors, - success: false, - } + ? { bytecode: result.bytecode, success: true } + : { + errorType: result.errorType, + errors: result.errors, + success: false, + } ) as Debug extends true ? CompilationResult : BytecodeGenerationResult; @@ -84,9 +84,9 @@ export const compilerConfigurationToCompilerBCH = < Configuration extends AnyCompilerConfiguration, ProgramState extends AuthenticationProgramStateControlStack & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - configuration: Configuration + configuration: Configuration, ): Compiler => { const generateBytecode = createCompilerGenerateBytecodeFunction(configuration); @@ -107,7 +107,7 @@ export const compilerConfigurationToCompilerBCH = < scenarioId, unlockingScriptId, }, - debug + debug, ), }; }; @@ -134,7 +134,7 @@ const nullHashLength = 32; * created authentication program */ export const createAuthenticationProgramEvaluationCommon = ( - evaluationBytecode: Uint8Array + evaluationBytecode: Uint8Array, ): AuthenticationProgramCommon => ({ inputIndex: 0, sourceOutputs: [ @@ -172,10 +172,10 @@ export const createAuthenticationProgramEvaluationCommon = ( * configuration – must include the `scripts` property */ export const createCompilerCommon = < - Configuration extends AnyCompilerConfiguration, - ProgramState extends AuthenticationProgramStateCommon + Configuration extends CompilerConfiguration, + ProgramState extends AuthenticationProgramStateCommon, >( - scriptsAndOverrides: Configuration + scriptsAndOverrides: Configuration, ): Compiler => compilerConfigurationToCompilerBCH({ ...{ @@ -216,7 +216,7 @@ export const compileCashAssembly = (script: string) => { return `CashAssembly compilation error:${result.errors.reduce( (all, { error, range }) => `${all} [${range.startLineNumber}, ${range.startColumn}]: ${error}`, - '' + '', )}`; }; @@ -229,8 +229,8 @@ export const compileCashAssembly = (script: string) => { * @param disassembledBytecode - the disassembled bytecode to re-assemble */ export const assembleBytecode = ( - opcodes: Readonly<{ [opcode: string]: Uint8Array }>, - disassembledBytecode: string + opcodes: { [opcode: string]: Uint8Array }, + disassembledBytecode: string, ) => { const configuration = { opcodes, @@ -280,17 +280,17 @@ export const assembleBytecodeBTC = (disassembledBytecode: string) => /** * Create a partial {@link CompilerConfiguration} from an - * {@link AuthenticationTemplate} by extracting and formatting the `scripts` and + * {@link WalletTemplate} by extracting and formatting the `scripts` and * `variables` properties. * - * Note, if this {@link AuthenticationTemplate} might be malformed, first - * validate it with {@link importAuthenticationTemplate}. + * Note, if this {@link WalletTemplate} might be malformed, first + * validate it with {@link importWalletTemplate}. * - * @param template - the {@link AuthenticationTemplate} from which to extract + * @param template - the {@link WalletTemplate} from which to extract * the compiler configuration */ -export const authenticationTemplateToCompilerConfiguration = ( - template: AuthenticationTemplate +export const walletTemplateToCompilerConfiguration = ( + template: WalletTemplate, ): Pick< CompilerConfiguration, | 'entityOwnership' @@ -304,33 +304,35 @@ export const authenticationTemplateToCompilerConfiguration = ( /** * Template scripts including virtualized test scripts. */ - const virtualizedScripts: AuthenticationTemplate['scripts'] = Object.entries( - template.scripts - ).reduce((all, [scriptId, script]) => { + const virtualizedScripts: WalletTemplate['scripts'] = Object.entries( + template.scripts, + ).reduce((all, [scriptId, script]) => { if ('tests' in script) { return { ...all, - ...Object.entries(script.tests).reduce< - AuthenticationTemplate['scripts'] - >((tests, [testId, test]) => { - const pushTestedScript = script.pushed === true; - const checkScriptId = `${scriptId}.${testId}.check`; - const virtualizedLockingScriptId = `${scriptId}.${testId}.lock`; - const virtualizedUnlockingScriptId = `${scriptId}.${testId}.unlock`; - return { - ...tests, - [checkScriptId]: { script: test.check }, - [virtualizedLockingScriptId]: { - script: pushTestedScript - ? `<${scriptId}> ${checkScriptId}` - : `${scriptId} ${checkScriptId}`, - }, - [virtualizedUnlockingScriptId]: { - script: test.setup ?? '', - unlocks: virtualizedLockingScriptId, - }, - }; - }, {}), + ...Object.entries(script.tests).reduce( + (tests, [testId, test]) => { + const pushTestedScript = script.pushed === true; + const checkScriptId = `${scriptId}.${testId}.check`; + const virtualizedLockingScriptId = `${scriptId}.${testId}.lock`; + const virtualizedUnlockingScriptId = `${scriptId}.${testId}.unlock`; + return { + ...tests, + [checkScriptId]: { script: test.check }, + [virtualizedLockingScriptId]: { + lockingType: 'p2sh20', + script: pushTestedScript + ? `<${scriptId}> ${checkScriptId}` + : `${scriptId} ${checkScriptId}`, + }, + [virtualizedUnlockingScriptId]: { + script: test.setup ?? '', + unlocks: virtualizedLockingScriptId, + }, + }; + }, + {}, + ), }; } return all; @@ -355,10 +357,10 @@ export const authenticationTemplateToCompilerConfiguration = ( ...entityVariables, [variableId]: entityId, }), - {} + {}, ), }), - {} + {}, ); const unlockingScripts = Object.entries(allScripts).reduce< CompilerConfiguration['unlockingScripts'] @@ -367,7 +369,7 @@ export const authenticationTemplateToCompilerConfiguration = ( 'unlocks' in def && (def.unlocks as string | undefined) !== undefined ? { ...all, [id]: def.unlocks } : all, - {} + {}, ); const unlockingScriptTimeLockTypes = Object.entries(allScripts).reduce< CompilerConfiguration['unlockingScriptTimeLockTypes'] @@ -376,7 +378,7 @@ export const authenticationTemplateToCompilerConfiguration = ( 'timeLockType' in def && def.timeLockType !== undefined ? { ...all, [id]: def.timeLockType } : all, - {} + {}, ); const lockingScriptTypes = Object.entries(allScripts).reduce< CompilerConfiguration['lockingScriptTypes'] @@ -386,7 +388,7 @@ export const authenticationTemplateToCompilerConfiguration = ( (def.lockingType as string | undefined) !== undefined ? { ...all, [id]: def.lockingType } : all, - {} + {}, ); const scenarios = template.scenarios === undefined diff --git a/src/lib/compiler/compiler.spec.ts b/src/lib/compiler/compiler.spec.ts index 00068ad7..fe42c92e 100644 --- a/src/lib/compiler/compiler.spec.ts +++ b/src/lib/compiler/compiler.spec.ts @@ -1,15 +1,15 @@ /* eslint-disable camelcase */ import test from 'ava'; -import type { AuthenticationTemplate } from '../lib.js'; +import type { WalletTemplate } from '../lib.js'; import { - authenticationTemplateP2pkh, - authenticationTemplateP2pkhNonHd, - authenticationTemplateToCompilerConfiguration, createCompilerCommon, hexToBin, stringify, stringifyTestVector, + walletTemplateP2pkh, + walletTemplateP2pkhNonHd, + walletTemplateToCompilerConfiguration, } from '../lib.js'; test('createCompilerCommon', (t) => { @@ -37,9 +37,9 @@ test('createCompilerCommon', (t) => { }); }); -test('authenticationTemplateToCompilerConfiguration: authenticationTemplateP2pkhNonHd', (t) => { - const configuration = authenticationTemplateToCompilerConfiguration( - authenticationTemplateP2pkhNonHd +test('walletTemplateToCompilerConfiguration: walletTemplateP2pkhNonHd', (t) => { + const configuration = walletTemplateToCompilerConfiguration( + walletTemplateP2pkhNonHd, ); t.deepEqual( configuration, @@ -66,14 +66,13 @@ test('authenticationTemplateToCompilerConfiguration: authenticationTemplateP2pkh }, }, }, - stringify(configuration) + stringify(configuration), ); }); -test('authenticationTemplateToCompilerConfiguration: authenticationTemplateP2pkh', (t) => { - const configuration = authenticationTemplateToCompilerConfiguration( - authenticationTemplateP2pkh - ); +test('walletTemplateToCompilerConfiguration: walletTemplateP2pkh', (t) => { + const configuration = + walletTemplateToCompilerConfiguration(walletTemplateP2pkh); t.deepEqual( configuration, { @@ -99,12 +98,12 @@ test('authenticationTemplateToCompilerConfiguration: authenticationTemplateP2pkh }, }, }, - stringify(configuration) + stringify(configuration), ); }); -test('authenticationTemplateToCompilerConfiguration: virtualized tests', (t) => { - const configuration = authenticationTemplateToCompilerConfiguration({ +test('walletTemplateToCompilerConfiguration: virtualized tests', (t) => { + const configuration = walletTemplateToCompilerConfiguration({ entities: {}, scripts: { add_two: { @@ -129,13 +128,18 @@ test('authenticationTemplateToCompilerConfiguration: virtualized tests', (t) => }, supported: ['BCH_2022_05'], version: 0, - } as AuthenticationTemplate); + } as WalletTemplate); t.deepEqual( configuration, { entityOwnership: {}, - lockingScriptTypes: {}, + lockingScriptTypes: { + 'add_two.0.lock': 'p2sh20', + 'add_two.1.lock': 'p2sh20', + 'message.0.lock': 'p2sh20', + 'push_three.0.lock': 'p2sh20', + }, scripts: { add_two: '<2> OP_ADD', 'add_two.0.check': '<3> OP_EQUAL', @@ -163,6 +167,6 @@ test('authenticationTemplateToCompilerConfiguration: virtualized tests', (t) => }, variables: {}, }, - stringifyTestVector(configuration) + stringifyTestVector(configuration), ); }); diff --git a/src/lib/compiler/compiler.ts b/src/lib/compiler/compiler.ts index c7568679..ce35f2c8 100644 --- a/src/lib/compiler/compiler.ts +++ b/src/lib/compiler/compiler.ts @@ -7,4 +7,4 @@ export * from './compiler-utils.js'; export * from './scenarios.js'; export * from './p2pkh-utils.js'; export * from './standard/standard.js'; -export * from './template-types.js'; +export * from '../engine/types/template-types.js'; diff --git a/src/lib/compiler/p2pkh-utils.ts b/src/lib/compiler/p2pkh-utils.ts index 0f02cd32..ceb5d835 100644 --- a/src/lib/compiler/p2pkh-utils.ts +++ b/src/lib/compiler/p2pkh-utils.ts @@ -1,12 +1,9 @@ import { lockingBytecodeToCashAddress } from '../address/address.js'; -import type { - AuthenticationTemplate, - CashAddressNetworkPrefix, -} from '../lib.js'; -import { importAuthenticationTemplate } from '../schema/schema.js'; +import type { CashAddressNetworkPrefix, WalletTemplate } from '../lib.js'; +import { importWalletTemplate } from '../schema/schema.js'; -import { authenticationTemplateToCompilerBCH } from './compiler-bch/compiler-bch.js'; -import { authenticationTemplateP2pkh } from './standard/standard.js'; +import { walletTemplateToCompilerBCH } from './compiler-bch/compiler-bch.js'; +import { walletTemplateP2pkh } from './standard/standard.js'; /** * Derive the P2PKH locking bytecode at the provided index of the provided HD @@ -29,10 +26,8 @@ export const hdPrivateKeyToP2pkhLockingBytecode = ({ */ addressIndex: number; }) => { - const compiler = authenticationTemplateToCompilerBCH( - importAuthenticationTemplate( - authenticationTemplateP2pkh - ) as AuthenticationTemplate + const compiler = walletTemplateToCompilerBCH( + importWalletTemplate(walletTemplateP2pkh) as WalletTemplate, ); const lockingBytecode = compiler.generateBytecode({ data: { hdKeys: { addressIndex, hdPrivateKeys: { owner: hdKey } } }, @@ -70,5 +65,5 @@ export const hdPrivateKeyToP2pkhAddress = ({ }) => lockingBytecodeToCashAddress( hdPrivateKeyToP2pkhLockingBytecode({ addressIndex, hdKey }), - prefix + prefix, ) as string; diff --git a/src/lib/compiler/scenarios.spec.ts b/src/lib/compiler/scenarios.spec.ts index 2e07f2e6..056cacd4 100644 --- a/src/lib/compiler/scenarios.spec.ts +++ b/src/lib/compiler/scenarios.spec.ts @@ -2,26 +2,26 @@ import test from 'ava'; import type { - AuthenticationTemplate, ExtendedScenarioDefinition, PartialExactOptional, Scenario, + WalletTemplate, } from '../lib.js'; import { - authenticationTemplateP2pkh, - authenticationTemplateP2pkhNonHd, - authenticationTemplateToCompilerBCH, - authenticationTemplateToCompilerConfiguration, extendedScenarioDefinitionToCompilationData, extendScenarioDefinition, extendScenarioDefinitionData, generateDefaultScenarioDefinition, generateExtendedScenario, hexToBin, - importAuthenticationTemplate, + importWalletTemplate, sha256, sha512, stringifyTestVector, + walletTemplateP2pkh, + walletTemplateP2pkhNonHd, + walletTemplateToCompilerBCH, + walletTemplateToCompilerConfiguration, } from '../lib.js'; import { cashChannelsJson } from '../transaction/transaction-e2e.spec.helper.js'; @@ -50,13 +50,13 @@ test('generateDefaultScenarioDefinition: empty', (t) => { locktime: 0, outputs: [ { - lockingBytecode: {}, + lockingBytecode: '6a076c696261757468', }, ], version: 2, }, }, - stringifyTestVector(scenario) + stringifyTestVector(scenario), ); }); @@ -75,7 +75,7 @@ test('generateDefaultScenarioDefinition: missing sha256', (t) => { t.deepEqual( scenario, 'An implementations of "sha256" is required to generate defaults for HD keys, but the "sha256" property is not included in this compiler configuration.', - stringifyTestVector(scenario) + stringifyTestVector(scenario), ); }); @@ -94,7 +94,7 @@ test('generateDefaultScenarioDefinition: missing sha512', (t) => { t.deepEqual( scenario, 'An implementations of "sha512" is required to generate defaults for HD keys, but the "sha512" property is not included in this compiler configuration.', - stringifyTestVector(scenario) + stringifyTestVector(scenario), ); }); @@ -106,7 +106,7 @@ test('extendScenarioDefinitionData: empty', (t) => { test('extendScenarioDefinitionData: 1', (t) => { const extended = extendScenarioDefinitionData( { hdKeys: { hdPublicKeys: { b: '(hd public key)' } } }, - { bytecode: { test: '<"abc">' } } + { bytecode: { test: '<"abc">' } }, ); t.deepEqual( extended, @@ -114,7 +114,7 @@ test('extendScenarioDefinitionData: 1', (t) => { bytecode: { test: '<"abc">' }, hdKeys: { hdPublicKeys: { b: '(hd public key)' } }, }, - stringifyTestVector(extended) + stringifyTestVector(extended), ); }); @@ -149,13 +149,13 @@ test('extendScenarioDefinition: default', (t) => { locktime: 0, outputs: [ { - lockingBytecode: {}, + lockingBytecode: '6a076c696261757468', }, ], version: 2, }, }, - stringifyTestVector(extended) + stringifyTestVector(extended), ); }); @@ -204,7 +204,7 @@ test('extendScenarioDefinition: complex extend', (t) => { }, }, transaction: {}, - } + }, ); t.deepEqual( extended, @@ -249,7 +249,7 @@ test('extendScenarioDefinition: complex extend', (t) => { version: 2, }, }, - stringifyTestVector(extended) + stringifyTestVector(extended), ); }); @@ -282,7 +282,7 @@ test('extendScenarioDefinition: complex extend (2)', (t) => { currentBlockTime: 1231469665, }, sourceOutputs: [{ valueSatoshis: 'ffffffffffffffff' }], - } + }, ); t.deepEqual( extended, @@ -310,7 +310,7 @@ test('extendScenarioDefinition: complex extend (2)', (t) => { }, sourceOutputs: [{ valueSatoshis: 'ffffffffffffffff' }], }, - stringifyTestVector(extended) + stringifyTestVector(extended), ); }); @@ -322,7 +322,7 @@ test('generateExtendedScenario: unknown scenario identifier', (t) => { t.deepEqual( extended, 'Cannot extend scenario "unknown": a scenario with the identifier unknown is not included in this compiler configuration.', - stringifyTestVector(extended) + stringifyTestVector(extended), ); }); @@ -338,9 +338,9 @@ test('extendedScenarioDefinitionToCompilationData: empty hdKeys', (t) => { t.deepEqual(extended, { hdKeys: {} }, stringifyTestVector(extended)); }); -test('generateDefaultScenarioDefinition: authenticationTemplateP2pkhNonHd', (t) => { - const configuration = authenticationTemplateToCompilerConfiguration( - authenticationTemplateP2pkhNonHd +test('generateDefaultScenarioDefinition: walletTemplateP2pkhNonHd', (t) => { + const configuration = walletTemplateToCompilerConfiguration( + walletTemplateP2pkhNonHd, ); const scenario = generateDefaultScenarioDefinition(configuration); @@ -360,19 +360,17 @@ test('generateDefaultScenarioDefinition: authenticationTemplateP2pkhNonHd', (t) transaction: { inputs: [{ unlockingBytecode: ['slot'] }], locktime: 0, - outputs: [{ lockingBytecode: {} }], + outputs: [{ lockingBytecode: '6a076c696261757468' }], version: 2, }, }, - stringifyTestVector(scenario) + stringifyTestVector(scenario), ); }); -test('generateDefaultScenarioDefinition: authenticationTemplateP2pkh', (t) => { +test('generateDefaultScenarioDefinition: walletTemplateP2pkh', (t) => { const configuration = { - ...authenticationTemplateToCompilerConfiguration( - authenticationTemplateP2pkh - ), + ...walletTemplateToCompilerConfiguration(walletTemplateP2pkh), sha256, sha512, }; @@ -395,11 +393,11 @@ test('generateDefaultScenarioDefinition: authenticationTemplateP2pkh', (t) => { transaction: { inputs: [{ unlockingBytecode: ['slot'] }], locktime: 0, - outputs: [{ lockingBytecode: {} }], + outputs: [{ lockingBytecode: '6a076c696261757468' }], version: 2, }, }, - stringifyTestVector(scenario) + stringifyTestVector(scenario), ); }); @@ -407,11 +405,11 @@ export const expectScenarioGenerationResult = test.macro< [ string | undefined, string | undefined, - PartialExactOptional, + PartialExactOptional, Scenario | string, PartialExactOptional< - ReturnType - >? + ReturnType + >?, ] >( ( @@ -420,10 +418,10 @@ export const expectScenarioGenerationResult = test.macro< unlockingScriptId, templateOverrides, expectedResult, - configurationOverrides - // eslint-disable-next-line max-params + configurationOverrides, + // eslint-disable-next-line @typescript-eslint/max-params ) => { - const configuration = authenticationTemplateToCompilerConfiguration({ + const configuration = walletTemplateToCompilerConfiguration({ ...{ entities: { owner: { @@ -435,25 +433,47 @@ export const expectScenarioGenerationResult = test.macro< }, }, scripts: { - lock: { - lockingType: 'standard', + compileTimeAssert: { + name: 'Var1 Padded', + pushed: true, + script: + '$( OP_DUP <0> OP_GREATERTHAN OP_VERIFY OP_DUP <0xff7f> OP_LESSTHANOREQUAL OP_VERIFY <2> OP_NUM2BIN)', + tests: { + is_within_range: { + check: 'OP_SIZE <2> OP_EQUALVERIFY OP_BIN2NUM OP_EQUAL', + invalid: ['above', 'below'], + name: 'Is Within Range', + passes: ['within'], + }, + }, + }, + p2pkhLock: { + script: + 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', + }, + p2pkhUnlock: { + script: ' ', + unlocks: 'p2pkhLock', + }, + p2sh20Lock: { + lockingType: 'p2sh20', script: ' OP_DROP OP_DROP OP_1', }, - unlock: { + p2sh20Unlock: { script: '', - unlocks: 'lock', + unlocks: 'p2sh20Lock', }, }, supported: ['BCH_2020_05'], version: 0, }, ...templateOverrides, - } as AuthenticationTemplate); + } as WalletTemplate); const compiler = createCompilerBCH({ ...configuration, ...(configurationOverrides as Partial< - ReturnType + ReturnType >), }); @@ -466,17 +486,19 @@ export const expectScenarioGenerationResult = test.macro< scenario, expectedResult, `- \nResult: ${stringifyTestVector( - scenario - )}\n\nExpected:\n ${stringifyTestVector(expectedResult)}\n` + scenario, + )}\n\nExpected:\n ${stringifyTestVector( + expectedResult, + )}\n\nConfiguration: ${stringifyTestVector(configuration)}`, ); - } + }, ); test( 'generateScenario: deep extend', expectScenarioGenerationResult, 'c', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { @@ -517,7 +539,7 @@ test( keys: { privateKeys: { another: hexToBin( - '00000000000000000000000000000000000000000000000000000000000000ff' + '00000000000000000000000000000000000000000000000000000000000000ff', ), }, }, @@ -526,7 +548,9 @@ test( inputIndex: 0, sourceOutputs: [ { - lockingBytecode: hexToBin('03010203757551'), + lockingBytecode: hexToBin( + 'a9147ab197d4888698145e7a0af625f8181a95604cd887', + ), valueSatoshis: 0n, }, ], @@ -535,32 +559,32 @@ test( { outpointIndex: 0, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 0, unlockingBytecode: hexToBin( - '41d1851c0a464c5d6b5b15452327e187f5c19d0805a2ce821b00b239dcc2de2112335cf481bed0f69c780adf9eda30c3e0706b893b53e0a58fa9fad0628e30d0da41' + '41fd8c2293325a5e85ba2683aa41a3ad483a3917db24b512c396b696a5ccf023ffdbf3883a589271ff90589f0bcbc1ab69b966257df71c0dba78aea4e4064c5c00410703010203757551', ), }, ], locktime: 0, outputs: [ { - lockingBytecode: hexToBin('03010203757551'), + lockingBytecode: hexToBin('6a076c696261757468'), valueSatoshis: 0n, }, ], version: 2, }, }, - } + }, ); test( 'generateScenario: cyclical extend', expectScenarioGenerationResult, 'c', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { extends: 'c' }, @@ -568,47 +592,47 @@ test( c: { extends: 'b' }, }, }, - 'Cannot generate scenario "c": Cannot extend scenario "c": scenario "c" extends itself. Scenario inheritance path: c β†’ b β†’ a' + 'Cannot generate scenario "c": Cannot extend scenario "c": scenario "c" extends itself. Scenario inheritance path: c β†’ b β†’ a', ); test( 'generateScenario: no scenarios', expectScenarioGenerationResult, 'does_not_exist', - 'unlock', + 'p2sh20Unlock', { scenarios: undefined }, - 'Cannot generate scenario "does_not_exist": a scenario definition with the identifier does_not_exist is not included in this compiler configuration.' + 'Cannot generate scenario "does_not_exist": a scenario definition with the identifier does_not_exist is not included in this compiler configuration.', ); test( 'generateScenario: unknown scenario ID', expectScenarioGenerationResult, 'does_not_exist', - 'unlock', + 'p2sh20Unlock', { scenarios: { another: {} }, }, - 'Cannot generate scenario "does_not_exist": a scenario definition with the identifier does_not_exist is not included in this compiler configuration.' + 'Cannot generate scenario "does_not_exist": a scenario definition with the identifier does_not_exist is not included in this compiler configuration.', ); test( 'generateScenario: invalid bytecode value', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { data: { bytecode: { var1: 'invalid' } } }, }, }, - 'Cannot generate scenario "a". Compilation error while generating bytecode for "var1": [1, 1] Unknown identifier "invalid".' + 'Cannot generate scenario "a". Compilation error while generating bytecode for "var1": [1, 1] Unknown identifier "invalid".', ); -test.failing( +test( 'generateScenario: no scenario ID', expectScenarioGenerationResult, undefined, - 'unlock', + 'p2pkhUnlock', { scenarios: { a: {}, @@ -628,7 +652,7 @@ test.failing( keys: { privateKeys: { another: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), }, }, @@ -637,7 +661,9 @@ test.failing( inputIndex: 0, sourceOutputs: [ { - lockingBytecode: hexToBin(''), + lockingBytecode: hexToBin( + '76a9141431b2926e6c7953f3dc3f2c5c19fe2d2dc57cfc88ac', + ), valueSatoshis: 0n, }, ], @@ -646,23 +672,25 @@ test.failing( { outpointIndex: 0, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 0, - unlockingBytecode: hexToBin(''), + unlockingBytecode: hexToBin( + '4133afdb65a3c9d2b50f32bc0d6750473425b3c21b138c66596182f072cc2f49d956b71e0183f1aa5620616405ebff584a1e3d4584e9c83b3cd8cc669295db73f641210309c64e4fbc61f4ddc950eb0acff2047850b864d6fb8198070a946cda5d72e5ba', + ), }, ], locktime: 0, outputs: [ { - lockingBytecode: hexToBin(''), + lockingBytecode: hexToBin('6a076c696261757468'), valueSatoshis: 0n, }, ], version: 2, }, }, - } + }, ); test( @@ -685,7 +713,7 @@ test( keys: { privateKeys: { another: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), }, }, @@ -703,7 +731,7 @@ test( { outpointIndex: 0, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 0, unlockingBytecode: hexToBin(''), @@ -712,34 +740,34 @@ test( locktime: 0, outputs: [ { - lockingBytecode: hexToBin(''), + lockingBytecode: hexToBin('6a076c696261757468'), valueSatoshis: 0n, }, ], version: 2, }, }, - } + }, ); test( 'generateScenario: mismatched source outputs and transaction inputs', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { transaction: { inputs: [{}, {}] } }, }, }, - 'Cannot generate scenario "a": could not match source outputs with inputs - "sourceOutputs" must be the same length as "transaction.inputs".' + 'Cannot generate scenario "a": could not match source outputs with inputs - "sourceOutputs" must be the same length as "transaction.inputs".', ); test( 'generateScenario: ambiguous input under test', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { @@ -747,14 +775,14 @@ test( }, }, }, - 'Cannot generate scenario "a": Failed compilation of source output at index 0: Cannot resolve "var1" - the "bytecode" property was not provided in the compilation data. Failed compilation of transaction output at index 0: No script with an ID of "unknown" was provided in the compiler configuration.' + 'Cannot generate scenario "a": Failed compilation of source output at index 0: Cannot resolve "var1" - the "bytecode" property was not provided in the compilation data. Failed compilation of transaction output at index 0: No script with an ID of "unknown" was provided in the compiler configuration.', ); test( 'generateScenario: no locking script', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { @@ -762,10 +790,10 @@ test( }, }, }, - 'Cannot generate scenario "a" using unlocking script "unlock": the locking script unlocked by "unlock" is not provided in this compiler configuration.', + 'Cannot generate scenario "a" using unlocking script "p2sh20Unlock": the locking script unlocked by "p2sh20Unlock" is not provided in this compiler configuration.', { unlockingScripts: undefined, - } + }, ); test.failing( @@ -783,14 +811,14 @@ test.failing( 'Cannot generate scenario "a": Cannot generate locking bytecode for output 0: this output is set to use the script unlocked by the unlocking script under test, but an unlocking script ID was not provided for scenario generation.', { unlockingScripts: undefined, - } + }, ); -test.failing( +test( 'generateScenario: simple transaction, locking bytecode override', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { @@ -804,7 +832,9 @@ test.failing( }, }, }, - sourceOutputs: [{ valueSatoshis: 'ffffffffffffffff' }], + sourceOutputs: [ + { lockingBytecode: ['slot'], valueSatoshis: 'ffffffffffffffff' }, + ], transaction: { outputs: [ { @@ -821,13 +851,13 @@ test.failing( }, }, scripts: { - lock: { + p2sh20Lock: { lockingType: 'standard', script: 'OP_DROP OP_DROP OP_1', }, - unlock: { + p2sh20Unlock: { script: '', - unlocks: 'lock', + unlocks: 'p2sh20Lock', }, }, }, @@ -846,7 +876,7 @@ test.failing( keys: { privateKeys: { another: hexToBin( - '00000000000000000000000000000000000000000000000000000000000000ff' + '00000000000000000000000000000000000000000000000000000000000000ff', ), }, }, @@ -855,7 +885,7 @@ test.failing( inputIndex: 0, sourceOutputs: [ { - lockingBytecode: hexToBin(''), + lockingBytecode: hexToBin('75557551'), valueSatoshis: 0xffffffffffffffffn, }, ], @@ -864,10 +894,12 @@ test.failing( { outpointIndex: 0, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 0, - unlockingBytecode: hexToBin(''), + unlockingBytecode: hexToBin( + '419f16a55d6a75256ed6618a12d058f13d3792a3970ea75f11f670a886341bbd9d6e48b9f0cc6ff5074a1b15dd2e398150d4dcc184af8aaecbdc26fb16d15d8b7441', + ), }, ], locktime: 0, @@ -884,18 +916,19 @@ test.failing( version: 3, }, }, - } + }, ); -test.failing( +test( 'generateScenario: complex transaction, locking bytecode variable override', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { data: { bytecode: { var1: '0x010203' } }, + sourceOutputs: [{}, { lockingBytecode: ['slot'] }], transaction: { inputs: [ { @@ -947,7 +980,7 @@ test.failing( keys: { privateKeys: { another: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), }, }, @@ -956,7 +989,15 @@ test.failing( inputIndex: 1, sourceOutputs: [ { - lockingBytecode: hexToBin(''), + lockingBytecode: hexToBin( + 'a9147ab197d4888698145e7a0af625f8181a95604cd887', + ), + valueSatoshis: 0n, + }, + { + lockingBytecode: hexToBin( + 'a9147ab197d4888698145e7a0af625f8181a95604cd887', + ), valueSatoshis: 0n, }, ], @@ -965,46 +1006,54 @@ test.failing( { outpointIndex: 1, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 1, unlockingBytecode: hexToBin('beef'), }, { - outpointIndex: 0, + outpointIndex: 1, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 0, - unlockingBytecode: hexToBin(''), + unlockingBytecode: hexToBin( + '41ceed7320920a9b4035bc4afbb6118635113595a46bd5d64ee3651bb2e88986177b677219e864d639a405c4d0ab28a103a8b3df0cf49b6a0f1cd8d6d95dd9aa71410703010203757551', + ), }, ], locktime: 4294967295, outputs: [ { - lockingBytecode: hexToBin('03010203757551'), + lockingBytecode: hexToBin( + 'a9147ab197d4888698145e7a0af625f8181a95604cd887', + ), valueSatoshis: 1000n, }, { - lockingBytecode: hexToBin('03010203757551'), + lockingBytecode: hexToBin( + 'a9147ab197d4888698145e7a0af625f8181a95604cd887', + ), valueSatoshis: 0n, }, { - lockingBytecode: hexToBin('03030405757551'), + lockingBytecode: hexToBin( + 'a9144e6f989ad736aaffd2f895768f274579722fc73b87', + ), valueSatoshis: 0xffffffffffffffffn, }, ], version: 3, }, }, - } + }, ); -test.failing( +test( 'generateScenario: locking bytecode generation failure', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { @@ -1018,16 +1067,35 @@ test.failing( }, }, }, - 'Cannot generate scenario "a": Cannot generate locking bytecode for output 0: Compilation error while generating bytecode for "var1": [1, 1] Unknown identifier "broken".' + 'Cannot generate scenario "a": Failed compilation of source output at index 0: Cannot resolve "var1" - the "bytecode" property was not provided in the compilation data. Failed compilation of transaction output at index 0: Could not compile scenario "data.bytecode": Compilation error while generating bytecode for "var1": [1, 1] Unknown identifier "broken".', +); + +test( + 'generateScenario: invalid scenario for tested script', + expectScenarioGenerationResult, + 'above', + 'compileTimeAssert.is_within_range.unlock', + { + scenarios: { + above: { + data: { + bytecode: { + var1: '32768', + }, + }, + }, + }, + }, + 'Cannot generate scenario "above": Failed compilation of source output at index 0: Compilation error in resolved script "compileTimeAssert": [1, 1] Failed to reduce evaluation: Program failed an OP_VERIFY operation.', ); -test.failing('generateScenario: cash-channels - after_payment_time', (t) => { - const template = importAuthenticationTemplate(cashChannelsJson); +test('generateScenario: cash-channels-v1 - after_payment_time', (t) => { + const template = importWalletTemplate(cashChannelsJson); if (typeof template === 'string') { t.fail(template); return; } - const compiler = authenticationTemplateToCompilerBCH(template); + const compiler = walletTemplateToCompilerBCH(template); const scenario = compiler.generateScenario({ scenarioId: 'after_payment_time', unlockingScriptId: 'execute_authorization', @@ -1052,13 +1120,13 @@ test.failing('generateScenario: cash-channels - after_payment_time', (t) => { keys: { privateKeys: { owner: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), rate_oracle: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000003' + '0000000000000000000000000000000000000000000000000000000000000003', ), receiver: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000004' + '0000000000000000000000000000000000000000000000000000000000000005', ), }, }, @@ -1067,8 +1135,10 @@ test.failing('generateScenario: cash-channels - after_payment_time', (t) => { inputIndex: 0, sourceOutputs: [ { - lockingBytecode: undefined, - valueSatoshis: hexToBin('204e000000000000'), + lockingBytecode: hexToBin( + 'a914582d988b353dbe4d34863606fc7fac13a026f30187', + ), + valueSatoshis: 20000n, }, ], transaction: { @@ -1076,25 +1146,27 @@ test.failing('generateScenario: cash-channels - after_payment_time', (t) => { { outpointIndex: 0, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 0, - unlockingBytecode: undefined, + unlockingBytecode: hexToBin( + '412f8a7bef0803cf707cd971e50c3d0ecd432f361d40b22dddb548972522c49cf7d4d55c8eea3ce2e69e6db08857ebd503fc0f0bfecc1ba2fc29fd48d51b5f5a9f414c6902000000d5a45bffe65ef500725b4bc16e60ba39910d364324f702be75ed825c1c78a50c8cb9012517c817fead650287d61bdd9c68803b6bf9c64133dcab3e65b5a50cb9000000000000000000000000000000000000000000000000000000000000000100000000e24c4e210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817987c63766b56795f795779765c79a26958805779588057795880577958807e7e766b7e7e7e7cbbb16d6d5879020202004c92886c537958807e7c6c21022f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4766b7ea9882102f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9bb57795779815193528057797e7ea9011702a9147b01877e7e7e5579817b9458807c7e7c7eaa7c7e7e7e7e7e7e7ea86c7653797bad7b01407f757b7bba67ac6808204e00000000000004000000000880bf345e4100000000021027473045022100a42985db397f96f2dbec3846026c7e0d77a9de8e7a3239e6d241e1123e123e9602202bc889045417638a75ba423d567fa50a6f49ab9d23657dacdf09311db37b9be51477bf07ad61ce9c0ed3b026db9f6201a80a6afcec02042902e803035553440480bf345e473045022100f32fb0c45c9b0915455b6c8dbadb61f05f6b6e5cd74bce81e9fcadadbae466ba02207f7aa8052816478fc104d44b14161bbdc9011cadcc69b52f60337c0767e6622b514ce2210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817987c63766b56795f795779765c79a26958805779588057795880577958807e7e766b7e7e7e7cbbb16d6d5879020200886c537958807e7c6c21022f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4766b7ea9882102f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9bb57795779815193528057797e7ea9011702a9147b01877e7e7e5579817b9458807c7e7c7eaa7c7e7e7e7e7e7e7ea86c7653797bad7b01407f757b7bba67ac68', + ), }, ], locktime: 1580515200, outputs: [ { lockingBytecode: hexToBin( - 'a9149a97dc2531b9b9af6319aab57ea369284289998987' + 'a91456e3217f1b623d9d566ee2e648cf6c74ac6a9b1687', ), - valueSatoshis: hexToBin('1027000000000000'), + valueSatoshis: 10000n, }, ], version: 2, }, }, }, - stringifyTestVector(scenario) + stringifyTestVector(scenario), ); }); diff --git a/src/lib/compiler/scenarios.ts b/src/lib/compiler/scenarios.ts index 63dfe287..f5accb38 100644 --- a/src/lib/compiler/scenarios.ts +++ b/src/lib/compiler/scenarios.ts @@ -9,11 +9,6 @@ import { deriveHdPrivateNodeFromSeed, encodeHdPrivateKey } from '../key/key.js'; import { compileScriptRaw, stringifyErrors } from '../language/language.js'; import type { AnyCompilerConfigurationIgnoreOperations, - AuthenticationTemplateKey, - AuthenticationTemplateScenario, - AuthenticationTemplateScenarioBytecode, - AuthenticationTemplateScenarioData, - AuthenticationTemplateScenarioOutput, CompilationContextBCH, CompilationData, CompilationError, @@ -23,22 +18,21 @@ import type { Output, Scenario, ScenarioGenerationDebuggingResult, + WalletTemplateKey, + WalletTemplateScenario, + WalletTemplateScenarioBytecode, + WalletTemplateScenarioData, + WalletTemplateScenarioOutput, } from '../lib.js'; import { CompilerDefaults } from './compiler-defaults.js'; /** - * The default `lockingBytecode` value for scenario outputs is a new empty - * object (`{}`). - */ -const defaultScenarioOutputLockingBytecode = () => ({}); - -/** - * The contents of an {@link AuthenticationTemplateScenario} without the `name` + * The contents of an {@link WalletTemplateScenario} without the `name` * and `description`. */ export type ScenarioDefinition = Pick< - AuthenticationTemplateScenario, + WalletTemplateScenario, 'data' | 'sourceOutputs' | 'transaction' >; @@ -67,17 +61,18 @@ export type ExtendedScenarioDefinition = Required< * extended by all the configuration's scenarios. * * For details on default scenario generation, see - * {@link AuthenticationTemplateScenario.extends}. + * {@link WalletTemplateScenario.extends}. * * @param configuration - the compiler configuration from which to generate the * default scenario */ // eslint-disable-next-line complexity export const generateDefaultScenarioDefinition = < - Configuration extends AnyCompilerConfigurationIgnoreOperations, - CompilationContext + Configuration extends + AnyCompilerConfigurationIgnoreOperations, + CompilationContext, >( - configuration: Configuration + configuration: Configuration, ): ExtendedScenarioDefinition | string => { const { variables, entityOwnership } = configuration; @@ -86,8 +81,8 @@ export const generateDefaultScenarioDefinition = < ? [] : Object.entries(variables) .filter( - (entry): entry is [string, AuthenticationTemplateKey] => - entry[1].type === 'Key' + (entry): entry is [string, WalletTemplateKey] => + entry[1].type === 'Key', ) .map(([id]) => id); @@ -97,8 +92,8 @@ export const generateDefaultScenarioDefinition = < : Object.keys( Object.values(entityOwnership).reduce( (all, entityId) => ({ ...all, [entityId]: true }), - {} - ) + {}, + ), ); const valueMap = [...keyVariableIds, ...entityIds] @@ -108,7 +103,7 @@ export const generateDefaultScenarioDefinition = < ...all, [id]: bigIntToBinUint256BEClamped(BigInt(index + 1)), }), - {} + {}, ); const privateKeys = @@ -123,7 +118,7 @@ export const generateDefaultScenarioDefinition = < [variableId]: binToHex(valueMap[variableId]!), } : all, - {} + {}, ); const defaultScenario: ExtendedScenarioDefinition = { @@ -140,7 +135,12 @@ export const generateDefaultScenarioDefinition = < transaction: { inputs: [{ unlockingBytecode: ['slot'] }], locktime: CompilerDefaults.defaultScenarioTransactionLocktime as const, - outputs: [{ lockingBytecode: defaultScenarioOutputLockingBytecode() }], + outputs: [ + { + lockingBytecode: + CompilerDefaults.defaultScenarioOutputLockingBytecode as string, + }, + ], version: CompilerDefaults.defaultScenarioTransactionVersion as const, }, }; @@ -149,7 +149,7 @@ export const generateDefaultScenarioDefinition = < variables === undefined ? false : Object.values(variables).findIndex( - (variable) => variable.type === 'HdKey' + (variable) => variable.type === 'HdKey', ) !== -1; if (!hasHdKeys) { @@ -175,14 +175,14 @@ export const generateDefaultScenarioDefinition = < // eslint-disable-next-line @typescript-eslint/no-non-null-assertion valueMap[entityId]!, assumeValid, - crypto + crypto, ); const hdPrivateKey = encodeHdPrivateKey( { network: 'mainnet', node: masterNode, }, - crypto + crypto, ); return { ...all, [entityId]: hdPrivateKey }; @@ -211,8 +211,8 @@ export const generateDefaultScenarioDefinition = < */ // eslint-disable-next-line complexity export const extendScenarioDefinitionData = ( - parentData: NonNullable, - childData: NonNullable + parentData: NonNullable, + childData: NonNullable, ) => ({ ...parentData, ...childData, @@ -273,10 +273,10 @@ export const extendScenarioDefinitionData = ( */ // eslint-disable-next-line complexity export const extendScenarioDefinition = < - ParentScenarioType extends AuthenticationTemplateScenario + ParentScenarioType extends WalletTemplateScenario, >( parentScenario: ParentScenarioType, - childScenario: AuthenticationTemplateScenario + childScenario: WalletTemplateScenario, ) => ({ ...(parentScenario.data === undefined && childScenario.data === undefined @@ -284,7 +284,7 @@ export const extendScenarioDefinition = < : { data: extendScenarioDefinitionData( parentScenario.data ?? {}, - childScenario.data ?? {} + childScenario.data ?? {}, ), }), ...(parentScenario.transaction === undefined && @@ -303,9 +303,9 @@ export const extendScenarioDefinition = < sourceOutputs: childScenario.sourceOutputs ?? parentScenario.sourceOutputs, }), - } as ParentScenarioType extends ExtendedScenarioDefinition + }) as ParentScenarioType extends ExtendedScenarioDefinition ? ExtendedScenarioDefinition - : ScenarioDefinition); + : ScenarioDefinition; /** * Generate the full scenario that is extended by the provided scenario @@ -314,8 +314,9 @@ export const extendScenarioDefinition = < */ // eslint-disable-next-line complexity export const generateExtendedScenario = < - Configuration extends AnyCompilerConfigurationIgnoreOperations, - CompilationContext + Configuration extends + AnyCompilerConfigurationIgnoreOperations, + CompilationContext, >({ configuration, scenarioId, @@ -338,13 +339,13 @@ export const generateExtendedScenario = < }): ExtendedScenarioDefinition | string => { if (scenarioId === undefined) { return generateDefaultScenarioDefinition( - configuration + configuration, ); } if (sourceScenarioIds.includes(scenarioId)) { return `Cannot extend scenario "${scenarioId}": scenario "${scenarioId}" extends itself. Scenario inheritance path: ${sourceScenarioIds.join( - ' β†’ ' + ' β†’ ', )}`; } const scenario = configuration.scenarios?.[scenarioId]; @@ -354,7 +355,7 @@ export const generateExtendedScenario = < const parentScenario = scenario.extends === undefined ? generateDefaultScenarioDefinition( - configuration + configuration, ) : generateExtendedScenario({ configuration, @@ -377,7 +378,7 @@ export const generateExtendedScenario = < */ // eslint-disable-next-line complexity export const extendedScenarioDefinitionToCompilationData = ( - definition: Required> & ScenarioDefinition + definition: Required> & ScenarioDefinition, ): CompilationData => ({ ...(definition.data.currentBlockHeight === undefined ? {} @@ -417,7 +418,7 @@ export const extendedScenarioDefinitionToCompilationData = ( keys: { privateKeys: Object.entries(definition.data.keys.privateKeys).reduce( (all, [id, hex]) => ({ ...all, [id]: hexToBin(hex) }), - {} + {}, ), }, } @@ -426,11 +427,12 @@ export const extendedScenarioDefinitionToCompilationData = ( /** * Extend a {@link CompilationData} object with the compiled result of the - * bytecode scripts provided by an {@link AuthenticationTemplateScenarioData}. + * bytecode scripts provided by an {@link WalletTemplateScenarioData}. */ export const extendCompilationDataWithScenarioBytecode = < - Configuration extends AnyCompilerConfigurationIgnoreOperations, - CompilationContext + Configuration extends + AnyCompilerConfigurationIgnoreOperations, + CompilationContext, >({ compilationData, configuration, @@ -445,10 +447,10 @@ export const extendCompilationDataWithScenarioBytecode = < */ configuration: Configuration; /** - * The {@link AuthenticationTemplateScenarioData.bytecode} property. + * The {@link WalletTemplateScenarioData.bytecode} property. */ scenarioDataBytecodeScripts: NonNullable< - AuthenticationTemplateScenarioData['bytecode'] + WalletTemplateScenarioData['bytecode'] >; }) => { const prefixBytecodeScriptId = (id: string) => @@ -460,7 +462,7 @@ export const extendCompilationDataWithScenarioBytecode = < ...all, [prefixBytecodeScriptId(id)]: script, }), - {} + {}, ); const bytecodeScriptExtendedConfiguration: Configuration = { @@ -500,21 +502,21 @@ export const extendCompilationDataWithScenarioBytecode = < const failedResults = bytecodeCompilations.filter( ( - result + result, ): result is { errors: CompilationError[] | [CompilationError]; id: string; - } => 'errors' in result + } => 'errors' in result, ); if (failedResults.length > 0) { - return `${failedResults + return failedResults .map( (result) => `Compilation error while generating bytecode for "${ result.id - }": ${stringifyErrors(result.errors)}` + }": ${stringifyErrors(result.errors)}`, ) - .join('; ')}`; + .join('; '); } const compiledBytecode = ( @@ -524,7 +526,7 @@ export const extendCompilationDataWithScenarioBytecode = < }[] ).reduce<{ [fullIdentifier: string]: Uint8Array }>( (all, result) => ({ ...all, [result.id]: result.bytecode }), - {} + {}, ); return { @@ -536,30 +538,30 @@ export const extendCompilationDataWithScenarioBytecode = < }; /** - * Compile a {@link AuthenticationTemplateScenarioOutput.valueSatoshis}, + * Compile a {@link WalletTemplateScenarioOutput.valueSatoshis}, * returning the `Uint8Array` result. */ -export const compileAuthenticationTemplateScenarioValueSatoshis = ( - valueSatoshisDefinition: AuthenticationTemplateScenarioOutput['valueSatoshis'] = CompilerDefaults.defaultScenarioOutputValueSatoshis +export const compileWalletTemplateScenarioValueSatoshis = ( + valueSatoshisDefinition: WalletTemplateScenarioOutput['valueSatoshis'] = CompilerDefaults.defaultScenarioOutputValueSatoshis, ) => typeof valueSatoshisDefinition === 'string' ? binToValueSatoshis(hexToBin(valueSatoshisDefinition)) : BigInt(valueSatoshisDefinition); /** - * Compile an {@link AuthenticationTemplateScenarioBytecode} definition for an - * {@link AuthenticationTemplateScenario}, returning either a + * Compile an {@link WalletTemplateScenarioBytecode} definition for an + * {@link WalletTemplateScenario}, returning either a * simple `Uint8Array` result or a full CashAssembly {@link CompilationResult}. */ // eslint-disable-next-line complexity -export const compileAuthenticationTemplateScenarioBytecode = < +export const compileWalletTemplateScenarioBytecode = < Configuration extends AnyCompilerConfigurationIgnoreOperations, GenerateBytecode extends Compiler< CompilationContextBCH, Configuration, ProgramState >['generateBytecode'], - ProgramState + ProgramState, >({ bytecodeDefinition, compilationContext, @@ -569,11 +571,11 @@ export const compileAuthenticationTemplateScenarioBytecode = < generateBytecode, lockingOrUnlockingScriptIdUnderTest, }: { - bytecodeDefinition: AuthenticationTemplateScenarioBytecode; + bytecodeDefinition: WalletTemplateScenarioBytecode; compilationContext?: CompilationContextBCH; configuration: Configuration; extendedScenario: ExtendedScenarioDefinition; - defaultOverride: AuthenticationTemplateScenarioData; + defaultOverride: WalletTemplateScenarioData; generateBytecode: GenerateBytecode; lockingOrUnlockingScriptIdUnderTest?: string; }): @@ -603,7 +605,7 @@ export const compileAuthenticationTemplateScenarioBytecode = < const overrides = bytecodeDefinition.overrides ?? defaultOverride; const overriddenDataDefinition = extendScenarioDefinitionData( extendedScenario.data, - overrides + overrides, ); const data = extendCompilationDataWithScenarioBytecode({ compilationData: extendedScenarioDefinitionToCompilationData({ @@ -626,12 +628,12 @@ export const compileAuthenticationTemplateScenarioBytecode = < }; /** - * Compile a {@link AuthenticationTemplateScenarioOutput.token}, + * Compile a {@link WalletTemplateScenarioOutput.token}, * returning the {@link Output.token} result. */ // eslint-disable-next-line complexity export const compileScenarioOutputTokenData = ( - output: AuthenticationTemplateScenarioOutput + output: WalletTemplateScenarioOutput, ): Pick => output.token === undefined ? {} @@ -641,7 +643,7 @@ export const compileScenarioOutputTokenData = ( // TODO: doesn't verify length category: hexToBin( output.token.category ?? - CompilerDefaults.defaultScenarioOutputTokenCategory + CompilerDefaults.defaultScenarioOutputTokenCategory, ), ...(output.token.nft === undefined ? {} @@ -674,7 +676,7 @@ export const generateScenarioBCH = < ProgramState >['generateBytecode'], ProgramState, - Debug extends boolean + Debug extends boolean, >( { configuration, @@ -710,7 +712,7 @@ export const generateScenarioBCH = < */ lockingScriptId?: string | undefined; }, - debug?: Debug + debug?: Debug, ): | string | (Debug extends true @@ -739,7 +741,7 @@ export const generateScenarioBCH = < const extendedScenario = extendScenarioDefinition( parentScenario, - scenarioDefinition + scenarioDefinition, ); const partialCompilationData = extendedScenarioDefinitionToCompilationData(extendedScenario); @@ -761,17 +763,17 @@ export const generateScenarioBCH = < } const testedInputs = extendedScenario.transaction.inputs.filter((input) => - Array.isArray(input.unlockingBytecode) + Array.isArray(input.unlockingBytecode), ); if (testedInputs.length !== 1) { return `Cannot generate ${scenarioName}: the specific input under test in this scenario is ambiguous - "transaction.inputs" must include exactly one input that has "unlockingBytecode" set to ["slot"].`; } const testedInputIndex = extendedScenario.transaction.inputs.findIndex( - (input) => Array.isArray(input.unlockingBytecode) + (input) => Array.isArray(input.unlockingBytecode), ); const testedSourceOutputs = extendedScenario.sourceOutputs.filter((output) => - Array.isArray(output.lockingBytecode) + Array.isArray(output.lockingBytecode), ); if (testedSourceOutputs.length !== 1) { return `Cannot generate ${scenarioName}: the source output unlocked by the input under test in this scenario is ambiguous - "sourceOutputs" must include exactly one output that has "lockingBytecode" set to ["slot"].`; @@ -779,7 +781,7 @@ export const generateScenarioBCH = < if ( !Array.isArray( - extendedScenario.sourceOutputs[testedInputIndex]?.lockingBytecode + extendedScenario.sourceOutputs[testedInputIndex]?.lockingBytecode, ) ) { return `Cannot generate ${scenarioName}: the source output unlocked by the input under test in this scenario is ambiguous - the ["slot"] in "transaction.inputs" and "sourceOutputs" must be at the same index.`; @@ -793,11 +795,10 @@ export const generateScenarioBCH = < } const lockingScriptId = - providedLockingScriptId === undefined - ? unlockingScriptId === undefined - ? undefined - : configuration.unlockingScripts?.[unlockingScriptId] - : providedLockingScriptId; + providedLockingScriptId ?? + (unlockingScriptId === undefined + ? undefined + : configuration.unlockingScripts?.[unlockingScriptId]); if (unlockingScriptId !== undefined && lockingScriptId === undefined) { return `Cannot generate ${scenarioName} using unlocking script "${unlockingScriptId}": the locking script unlocked by "${unlockingScriptId}" is not provided in this compiler configuration.`; @@ -814,7 +815,7 @@ export const generateScenarioBCH = < const defaultOverride = {}; return { compiled: { - lockingBytecode: compileAuthenticationTemplateScenarioBytecode({ + lockingBytecode: compileWalletTemplateScenarioBytecode({ bytecodeDefinition, configuration, defaultOverride, @@ -822,8 +823,8 @@ export const generateScenarioBCH = < generateBytecode, lockingOrUnlockingScriptIdUnderTest: lockingScriptId, }), - valueSatoshis: compileAuthenticationTemplateScenarioValueSatoshis( - sourceOutput.valueSatoshis + valueSatoshis: compileWalletTemplateScenarioValueSatoshis( + sourceOutput.valueSatoshis, ), ...compileScenarioOutputTokenData(sourceOutput), }, @@ -831,11 +832,11 @@ export const generateScenarioBCH = < slot, type: 'source output' as const, }; - } + }, ); const lockingCompilation = sourceOutputCompilations.find( - (compilation) => compilation.slot + (compilation) => compilation.slot, )?.compiled.lockingBytecode as CompilationResult; const transactionOutputCompilations = @@ -843,7 +844,7 @@ export const generateScenarioBCH = < const defaultOverride = { hdKeys: { addressIndex: 1 } }; return { compiled: { - lockingBytecode: compileAuthenticationTemplateScenarioBytecode({ + lockingBytecode: compileWalletTemplateScenarioBytecode({ bytecodeDefinition: transactionOutput.lockingBytecode ?? {}, configuration, defaultOverride, @@ -851,8 +852,8 @@ export const generateScenarioBCH = < generateBytecode, lockingOrUnlockingScriptIdUnderTest: lockingScriptId, }), - valueSatoshis: compileAuthenticationTemplateScenarioValueSatoshis( - transactionOutput.valueSatoshis + valueSatoshis: compileWalletTemplateScenarioValueSatoshis( + transactionOutput.valueSatoshis, ), ...compileScenarioOutputTokenData(transactionOutput), }, @@ -870,7 +871,7 @@ export const generateScenarioBCH = < ...accumulated, ...result.compiled.lockingBytecode.errors.map( (errorObject) => - `Failed compilation of ${result.type} at index ${result.index}: ${errorObject.error}` + `Failed compilation of ${result.type} at index ${result.index}: ${errorObject.error}`, ), ]; } @@ -879,7 +880,7 @@ export const generateScenarioBCH = < if (outputCompilationErrors.length > 0) { const error = `Cannot generate ${scenarioName}: ${outputCompilationErrors.join( - ' ' + ' ', )}`; if (debug === true) { return { @@ -892,11 +893,11 @@ export const generateScenarioBCH = < return error; } const sourceOutputCompilationsSuccess = - sourceOutputCompilations as AuthenticationTemplateScenarioOutputSuccessfulCompilation[]; + sourceOutputCompilations as WalletTemplateScenarioOutputSuccessfulCompilation[]; const transactionOutputCompilationsSuccess = - transactionOutputCompilations as AuthenticationTemplateScenarioOutputSuccessfulCompilation[]; + transactionOutputCompilations as WalletTemplateScenarioOutputSuccessfulCompilation[]; - interface AuthenticationTemplateScenarioOutputSuccessfulCompilation { + type WalletTemplateScenarioOutputSuccessfulCompilation = { compiled: { lockingBytecode: CompilationResultSuccess | Uint8Array; valueSatoshis: bigint; @@ -905,10 +906,10 @@ export const generateScenarioBCH = < index: number; slot?: boolean; type: string; - } + }; const extractOutput = ( - compilation: AuthenticationTemplateScenarioOutputSuccessfulCompilation + compilation: WalletTemplateScenarioOutputSuccessfulCompilation, ) => { const { lockingBytecode, valueSatoshis, token } = compilation.compiled; return { @@ -930,13 +931,13 @@ export const generateScenarioBCH = < // TODO: doesn't verify length outpointTransactionHash: hexToBin( input.outpointTransactionHash ?? - CompilerDefaults.defaultScenarioInputOutpointTransactionHash + CompilerDefaults.defaultScenarioInputOutpointTransactionHash, ), sequenceNumber: input.sequenceNumber ?? CompilerDefaults.defaultScenarioInputSequenceNumber, unlockingBytecode: undefined, - }) + }), ); const transactionInputCompilations = extendedScenario.transaction.inputs.map( @@ -957,7 +958,7 @@ export const generateScenarioBCH = < inputsContext[index]!.outpointTransactionHash, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion sequenceNumber: inputsContext[index]!.sequenceNumber, - unlockingBytecode: compileAuthenticationTemplateScenarioBytecode({ + unlockingBytecode: compileWalletTemplateScenarioBytecode({ bytecodeDefinition, compilationContext: { inputIndex: index, @@ -979,14 +980,14 @@ export const generateScenarioBCH = < index, slot, }; - } + }, ); const unlockingCompilation = transactionInputCompilations.find( - (compilation) => compilation.slot + (compilation) => compilation.slot, )?.compiled.unlockingBytecode as CompilationResult; - interface AuthenticationTemplateScenarioInputSuccessfulCompilation { + type WalletTemplateScenarioInputSuccessfulCompilation = { compiled: { outpointIndex: number; outpointTransactionHash: Uint8Array; @@ -996,7 +997,7 @@ export const generateScenarioBCH = < index: number; slot?: boolean; type: string; - } + }; const inputCompilationErrors = transactionInputCompilations.reduce( (accumulated, result) => { @@ -1005,18 +1006,18 @@ export const generateScenarioBCH = < ...accumulated, ...result.compiled.unlockingBytecode.errors.map( (errorObject) => - `Failed compilation of input at index ${result.index}: ${errorObject.error}` + `Failed compilation of input at index ${result.index}: ${errorObject.error}`, ), ]; } return accumulated; }, - [] + [], ); if (inputCompilationErrors.length > 0) { const error = `Cannot generate ${scenarioName}: ${inputCompilationErrors.join( - ' ' + ' ', )}`; if (debug === true) { return { @@ -1031,7 +1032,7 @@ export const generateScenarioBCH = < } const transactionInputCompilationsSuccess = - transactionInputCompilations as AuthenticationTemplateScenarioInputSuccessfulCompilation[]; + transactionInputCompilations as WalletTemplateScenarioInputSuccessfulCompilation[]; const inputs = transactionInputCompilationsSuccess.map((compilation) => { const { diff --git a/src/lib/compiler/standard/p2pkh.spec.ts b/src/lib/compiler/standard/p2pkh.spec.ts index 1b051797..06e4fd8a 100644 --- a/src/lib/compiler/standard/p2pkh.spec.ts +++ b/src/lib/compiler/standard/p2pkh.spec.ts @@ -1,38 +1,27 @@ import test from 'ava'; import { - authenticationTemplateP2pkh, - authenticationTemplateP2pkhNonHd, - importAuthenticationTemplate, + importWalletTemplate, + walletTemplateP2pkh, + walletTemplateP2pkhNonHd, } from '../../lib.js'; -test('authenticationTemplateP2pkh is valid', (t) => { - const template = importAuthenticationTemplate( - authenticationTemplateP2pkhNonHd - ); +test('walletTemplateP2pkh is valid', (t) => { + const template = importWalletTemplate(walletTemplateP2pkhNonHd); t.true(typeof template !== 'string'); }); -test('authenticationTemplateP2pkh is mostly equivalent to authenticationTemplateP2pkhHd', (t) => { - t.deepEqual( - authenticationTemplateP2pkhNonHd.$schema, - authenticationTemplateP2pkh.$schema - ); - t.deepEqual( - authenticationTemplateP2pkhNonHd.scripts, - authenticationTemplateP2pkh.scripts - ); - t.deepEqual( - authenticationTemplateP2pkhNonHd.supported, - authenticationTemplateP2pkh.supported - ); +test('walletTemplateP2pkh is mostly equivalent to walletTemplateP2pkhHd', (t) => { + t.deepEqual(walletTemplateP2pkhNonHd.$schema, walletTemplateP2pkh.$schema); + t.deepEqual(walletTemplateP2pkhNonHd.scripts, walletTemplateP2pkh.scripts); t.deepEqual( - authenticationTemplateP2pkhNonHd.version, - authenticationTemplateP2pkh.version + walletTemplateP2pkhNonHd.supported, + walletTemplateP2pkh.supported, ); + t.deepEqual(walletTemplateP2pkhNonHd.version, walletTemplateP2pkh.version); }); -test('authenticationTemplateP2pkhHd is valid', (t) => { - const template = importAuthenticationTemplate(authenticationTemplateP2pkh); +test('walletTemplateP2pkhHd is valid', (t) => { + const template = importWalletTemplate(walletTemplateP2pkh); t.true(typeof template !== 'string'); }); diff --git a/src/lib/compiler/standard/p2pkh.ts b/src/lib/compiler/standard/p2pkh.ts index fe4ab73c..aaca7357 100644 --- a/src/lib/compiler/standard/p2pkh.ts +++ b/src/lib/compiler/standard/p2pkh.ts @@ -1,20 +1,20 @@ -import type { AuthenticationTemplate } from '../../lib.js'; +import type { WalletTemplate } from '../../lib.js'; /** - * A standard single-factor authentication template that uses + * A standard single-factor wallet template that uses * Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use * on the network. * * This P2PKH template uses BCH Schnorr signatures, reducing the size of * transactions. * - * Note, this authentication template uses only a single `Key`. For HD key - * support, see {@link authenticationTemplateP2pkhHd}. + * Note, this wallet template uses only a single `Key`. For HD key + * support, see {@link walletTemplateP2pkhHd}. */ -export const authenticationTemplateP2pkhNonHd: AuthenticationTemplate = { - $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', +export const walletTemplateP2pkhNonHd: WalletTemplate = { + $schema: 'https://libauth.org/schemas/wallet-template-v0.schema.json', description: - 'A standard single-factor authentication template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions.', + 'A standard single-factor wallet template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions.', entities: { owner: { description: 'The individual who can spend from this wallet.', @@ -48,7 +48,7 @@ export const authenticationTemplateP2pkhNonHd: AuthenticationTemplate = { }; /** - * A standard single-factor authentication template that uses + * A standard single-factor wallet template that uses * Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use * on the network. * @@ -58,10 +58,10 @@ export const authenticationTemplateP2pkhNonHd: AuthenticationTemplate = { * Because the template uses a Hierarchical Deterministic (HD) key, it also * supports watch-only clients. */ -export const authenticationTemplateP2pkh: AuthenticationTemplate = { - $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', +export const walletTemplateP2pkh: WalletTemplate = { + $schema: 'https://libauth.org/schemas/wallet-template-v0.schema.json', description: - 'A standard single-factor authentication template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions. Because the template uses a Hierarchical Deterministic (HD) key, it also supports watch-only clients.', + 'A standard single-factor wallet template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions. Because the template uses a Hierarchical Deterministic (HD) key, it also supports watch-only clients.', entities: { owner: { description: 'The individual who can spend from this wallet.', diff --git a/src/lib/crypto/combinations.ts b/src/lib/crypto/combinations.ts index 83d2d8ab..6cd3f7cf 100644 --- a/src/lib/crypto/combinations.ts +++ b/src/lib/crypto/combinations.ts @@ -19,7 +19,7 @@ export const hash160 = ( crypto: { ripemd160: { hash: Ripemd160['hash'] }; sha256: { hash: Sha256['hash'] }; - } = { ripemd160: internalRipemd160, sha256: internalSha256 } + } = { ripemd160: internalRipemd160, sha256: internalSha256 }, ) => crypto.ripemd160.hash(crypto.sha256.hash(payload)); /** @@ -33,5 +33,5 @@ export const hash160 = ( */ export const hash256 = ( payload: Uint8Array, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => sha256.hash(sha256.hash(payload)); diff --git a/src/lib/crypto/hash.bench.helper.ts b/src/lib/crypto/hash.bench.helper.ts index 1542ddd8..364391c8 100644 --- a/src/lib/crypto/hash.bench.helper.ts +++ b/src/lib/crypto/hash.bench.helper.ts @@ -1,31 +1,26 @@ /* global Buffer */ -/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statement, functional/no-conditional-statement, functional/no-return-void*/ +/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statements, functional/no-conditional-statements, functional/no-return-void*/ import { createHash, randomBytes } from 'crypto'; -import asmCrypto from 'asmcrypto.js'; import test from 'ava'; -import bcrypto from 'bcrypto'; -import suite from 'chuhai'; -import hashJs from 'hash.js'; import type { HashFunction } from '../lib.js'; +import asmCrypto from 'asmcrypto.js'; +import suite from 'chuhai'; +import hashJs from 'hash.js'; + export const benchmarkHashingFunction = ( hashFunctionName: string, hashFunctionPromise: Promise, - nodeJsAlgorithm: 'ripemd160' | 'sha1' | 'sha256' | 'sha512' + nodeJsAlgorithm: 'ripemd160' | 'sha1' | 'sha256' | 'sha512', ) => { const singlePassNodeBenchmark = (inputLength: number) => { - const bcryptoAlgorithm = nodeJsAlgorithm.toUpperCase() as - | 'RIPEMD160' - | 'SHA1' - | 'SHA256' - | 'SHA512'; test(`node: ${hashFunctionName}: hash a ${inputLength}-byte input`, async (t) => { const hashFunction = await hashFunctionPromise; await suite(t.title, (s) => { let message: Uint8Array; - let hash: Uint8Array | readonly number[] | null; + let hash: number[] | Uint8Array | null; /* * we let Node.js use the message as a Node.js buffer * (may slightly overestimate Node.js native performance) @@ -42,9 +37,6 @@ export const benchmarkHashingFunction = ( s.bench('hash.js', () => { hash = hashJs[nodeJsAlgorithm]().update(message).digest(); }); - s.bench('bcoin', () => { - hash = bcrypto[bcryptoAlgorithm].digest(Buffer.from(message)); - }); s.bench('node.js native', () => { hash = createHash(nodeJsAlgorithm).update(nodeJsBuffer).digest(); }); @@ -54,8 +46,8 @@ export const benchmarkHashingFunction = ( nodeJsAlgorithm === 'sha1' ? asmCrypto.Sha1 : nodeJsAlgorithm === 'sha256' - ? asmCrypto.Sha256 - : asmCrypto.Sha512; + ? asmCrypto.Sha256 + : asmCrypto.Sha512; s.bench('asmcrypto.js', () => { const instance = new Algorithm(); hash = instance.process(message).finish().result; @@ -64,7 +56,7 @@ export const benchmarkHashingFunction = ( s.cycle(() => { if (hash === null) { t.fail( - `asmcrypto.js failed to produce a hash for message: ${message.toString()}` + `asmcrypto.js failed to produce a hash for message: ${message.toString()}`, ); } else { t.deepEqual(new Uint8Array(hash), hashFunction.hash(message)); @@ -84,14 +76,14 @@ export const benchmarkHashingFunction = ( const hashFunction = await hashFunctionPromise; await suite(t.title, (s) => { let message: Uint8Array; - let messageChunks: readonly Uint8Array[]; - let nodeJsChunks: readonly Buffer[]; - let hash: Uint8Array | readonly number[] | null; + let messageChunks: Uint8Array[]; + let nodeJsChunks: Buffer[]; + let hash: number[] | Uint8Array | null; const nextCycle = () => { message = randomBytes(totalInput); const chunkCount = Math.ceil(message.length / chunkSize); messageChunks = Array.from({ length: chunkCount }).map((_, index) => - message.slice(index * chunkSize, index * chunkSize + chunkSize) + message.slice(index * chunkSize, index * chunkSize + chunkSize), ); nodeJsChunks = messageChunks.map((chunk) => Buffer.from(chunk)); }; @@ -100,15 +92,15 @@ export const benchmarkHashingFunction = ( hash = hashFunction.final( messageChunks.reduce( (state, chunk) => hashFunction.update(state, chunk), - hashFunction.init() - ) + hashFunction.init(), + ), ); }); s.bench('hash.js', () => { hash = messageChunks .reduce( (state, chunk) => state.update(chunk), - hashJs[nodeJsAlgorithm]() + hashJs[nodeJsAlgorithm](), ) .digest(); }); @@ -116,7 +108,7 @@ export const benchmarkHashingFunction = ( hash = nodeJsChunks .reduce( (state, chunk) => state.update(chunk), - createHash(nodeJsAlgorithm) + createHash(nodeJsAlgorithm), ) .digest(); }); @@ -126,8 +118,8 @@ export const benchmarkHashingFunction = ( nodeJsAlgorithm === 'sha1' ? asmCrypto.Sha1 : nodeJsAlgorithm === 'sha256' - ? asmCrypto.Sha256 - : asmCrypto.Sha512; + ? asmCrypto.Sha256 + : asmCrypto.Sha512; s.bench('asmcrypto.js', () => { const instance = new Algorithm(); hash = instance.process(message).finish().result; @@ -136,7 +128,7 @@ export const benchmarkHashingFunction = ( s.cycle(() => { if (hash === null) { t.fail( - `asmcrypto.js failed to produce a hash for message: ${message.toString()}` + `asmcrypto.js failed to produce a hash for message: ${message.toString()}`, ); } else { t.deepEqual(new Uint8Array(hash), hashFunction.hash(message)); diff --git a/src/lib/crypto/hash.browser.bench.helper.ts b/src/lib/crypto/hash.browser.bench.helper.ts index ad57c3bd..e24e277a 100644 --- a/src/lib/crypto/hash.browser.bench.helper.ts +++ b/src/lib/crypto/hash.browser.bench.helper.ts @@ -1,9 +1,5 @@ /* global window, crypto */ -/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statement, functional/no-conditional-statement, functional/no-return-void */ -import * as asmCrypto from 'asmcrypto.js'; -import suite from 'chuhai'; -import hashJs from 'hash.js'; - +/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statements, functional/no-conditional-statements, functional/no-return-void */ import type { HashFunction } from '../lib.js'; import { @@ -13,6 +9,10 @@ import { instantiateSha512, } from './crypto.js'; +import * as asmCrypto from 'asmcrypto.js'; +import suite from 'chuhai'; +import hashJs from 'hash.js'; + declare const benchError: (error: string) => void; declare const benchComplete: () => void; @@ -52,7 +52,7 @@ const singlePassBrowserBenchmark = async ({ s.cycle(() => { if (hash === null) { benchError( - `asmcrypto.js produced a null result given message: ${message.toString()}` + `asmcrypto.js produced a null result given message: ${message.toString()}`, ); } else { compare(hash, hashFunction.hash(message)); @@ -66,7 +66,7 @@ const singlePassBrowserBenchmark = async ({ s.bench('hash.js', () => { hash = new Uint8Array( - hashJs[hashFunctionName]().update(message).digest() + hashJs[hashFunctionName]().update(message).digest(), ); }); @@ -84,21 +84,21 @@ const singlePassBrowserBenchmark = async ({ }, { defer: true, - } + }, ); // eslint-disable-next-line @typescript-eslint/naming-convention const Algorithm = subtleCryptoAlgorithmName === 'SHA-1' ? asmCrypto.Sha1 : subtleCryptoAlgorithmName === 'SHA-256' - ? asmCrypto.Sha256 - : asmCrypto.Sha512; + ? asmCrypto.Sha256 + : asmCrypto.Sha512; s.bench('asmcrypto.js', () => { const instance = new Algorithm(); hash = instance.process(message).finish().result; }); } - } + }, ); const mb = 1_000_000; @@ -120,8 +120,8 @@ const incrementalBrowserBenchmark = async ({ }MB input in ${chunkSize / mb}MB chunks`, (s) => { let message: Uint8Array; - let messageChunks: readonly Uint8Array[]; - let hash: ArrayBuffer | Uint8Array | readonly number[] | null; + let messageChunks: Uint8Array[]; + let hash: ArrayBuffer | number[] | Uint8Array | null; const nextCycle = () => { /** @@ -130,7 +130,7 @@ const incrementalBrowserBenchmark = async ({ message = new Uint8Array(totalInput).fill(0); const chunkCount = Math.ceil(message.length / chunkSize); messageChunks = Array.from({ length: chunkCount }).map((_, index) => - message.slice(index * chunkSize, index * chunkSize + chunkSize) + message.slice(index * chunkSize, index * chunkSize + chunkSize), ); }; nextCycle(); @@ -138,7 +138,7 @@ const incrementalBrowserBenchmark = async ({ s.cycle(() => { if (hash === null) { benchError( - `asmcrypto.js produced a null result given message: ${message.toString()}` + `asmcrypto.js produced a null result given message: ${message.toString()}`, ); } else { compare(new Uint8Array(hash), hashFunction.hash(message)); @@ -150,8 +150,8 @@ const incrementalBrowserBenchmark = async ({ hash = hashFunction.final( messageChunks.reduce( (state, chunk) => hashFunction.update(state, chunk), - hashFunction.init() - ) + hashFunction.init(), + ), ); }); @@ -159,7 +159,7 @@ const incrementalBrowserBenchmark = async ({ hash = messageChunks .reduce( (state, chunk) => state.update(chunk), - hashJs[hashFunctionName]() + hashJs[hashFunctionName](), ) .digest(); }); @@ -170,14 +170,14 @@ const incrementalBrowserBenchmark = async ({ hashFunctionName === 'sha1' ? asmCrypto.Sha1 : hashFunctionName === 'sha256' - ? asmCrypto.Sha256 - : asmCrypto.Sha512; + ? asmCrypto.Sha256 + : asmCrypto.Sha512; s.bench('asmcrypto.js', () => { const instance = new Algorithm(); hash = instance.process(message).finish().result; }); } - } + }, ); const browserBenchmarks = async ({ diff --git a/src/lib/crypto/hash.browser.bench.ts b/src/lib/crypto/hash.browser.bench.ts index 44d50060..1ceecc15 100644 --- a/src/lib/crypto/hash.browser.bench.ts +++ b/src/lib/crypto/hash.browser.bench.ts @@ -1,10 +1,11 @@ import { join } from 'path'; +import test from 'ava'; + +import { chromium } from '@playwright/test'; import alias from '@rollup/plugin-alias'; import commonjs from '@rollup/plugin-commonjs'; import { nodeResolve } from '@rollup/plugin-node-resolve'; -import test from 'ava'; -import puppeteer from 'puppeteer'; import { rollup } from 'rollup'; const prepareCode = async () => { @@ -20,7 +21,7 @@ const prepareCode = async () => { const bundle = await rollup({ input: join( new URL('.', import.meta.url).pathname, - 'hash.browser.bench.helper.js' + 'hash.browser.bench.helper.js', ), plugins: [ alias({ @@ -33,7 +34,7 @@ const prepareCode = async () => { nodeResolve(), ], }); - // eslint-disable-next-line no-console, require-atomic-updates + // eslint-disable-next-line no-console console.warn = realConsoleWarn; const result = await bundle.generate({ @@ -43,10 +44,7 @@ const prepareCode = async () => { }; const preparePage = async () => { - const browser = await puppeteer.launch({ - args: ['--no-sandbox', '--disable-setuid-sandbox'], - // devtools: true - }); + const browser = await chromium.launch(); const page = await browser.newPage(); // https://github.com/GoogleChrome/puppeteer/issues/2301#issuecomment-379622459 await page.goto('file:///'); @@ -59,15 +57,12 @@ const preparePage = async () => { preparePage(), ]); - test(`# browser: ${await browser.version()}`, async (t) => { + test(`# browser: ${browser.version()}`, async (t) => { page.on('console', (msg) => { // eslint-disable-next-line no-console console.log(msg.text()); }); - page.on('error', (err) => { - // eslint-disable-next-line no-console - console.error(`error: ${String(err)}`); - }); + // cspell: disable-next-line page.on('pageerror', (err) => { // eslint-disable-next-line no-console diff --git a/src/lib/crypto/hash.spec.helper.ts b/src/lib/crypto/hash.spec.helper.ts index 93bb813b..ba035b9d 100644 --- a/src/lib/crypto/hash.spec.helper.ts +++ b/src/lib/crypto/hash.spec.helper.ts @@ -1,17 +1,17 @@ /* global Buffer */ -/* eslint-disable functional/no-expression-statement, functional/no-return-void */ +/* eslint-disable functional/no-expression-statements, functional/no-return-void */ import { createHash } from 'crypto'; import { readFileSync } from 'fs'; import { join } from 'path'; import test from 'ava'; -import bcrypto from 'bcrypto'; -import fc from 'fast-check'; -import hashJs from 'hash.js'; import type { HashFunction } from '../lib.js'; import { utf8ToBin } from '../lib.js'; +import fc from 'fast-check'; +import hashJs from 'hash.js'; + const testLength = 10000; const maxUint8Number = 255; @@ -43,19 +43,13 @@ export const testHashFunction = ({ nodeJsAlgorithm: 'ripemd160' | 'sha1' | 'sha256' | 'sha512'; }) => { const binary = getEmbeddedBinary(); - const bcryptoAlgorithm = nodeJsAlgorithm.toUpperCase() as - | 'RIPEMD160' - | 'SHA1' - | 'SHA256' - | 'SHA512'; - test(`[crypto] ${hashFunctionName} getEmbeddedBinary returns the proper binary`, (t) => { const path = join( new URL('.', import.meta.url).pathname, '..', 'bin', - `${hashFunctionName}`, - `${hashFunctionName}.wasm` + hashFunctionName, + `${hashFunctionName}.wasm`, ); const binaryFromDisk = readFileSync(path).buffer; t.deepEqual(binary, binaryFromDisk); @@ -77,21 +71,9 @@ export const testHashFunction = ({ const hash = createHash(nodeJsAlgorithm); t.deepEqual( new Uint8Array(hash.update(Buffer.from(message)).digest()), - hashFunction.hash(message) - ); - } - ); - - const equivalentToBcoin = fc.property( - fcUint8Array(0, testLength), - (message) => { - t.deepEqual( - new Uint8Array( - bcrypto[bcryptoAlgorithm].digest(Buffer.from(message)) - ), - hashFunction.hash(message) + hashFunction.hash(message), ); - } + }, ); const equivalentToHashJs = fc.property( @@ -99,13 +81,12 @@ export const testHashFunction = ({ (message) => { t.deepEqual( new Uint8Array(hashJs[nodeJsAlgorithm]().update(message).digest()), - hashFunction.hash(message) + hashFunction.hash(message), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToNative); - fc.assert(equivalentToBcoin); fc.assert(equivalentToHashJs); }); }); @@ -117,27 +98,27 @@ export const testHashFunction = ({ hashFunction.update( hashFunction.update( hashFunction.update(hashFunction.init(), utf8ToBin('a')), - utf8ToBin('b') + utf8ToBin('b'), ), - utf8ToBin('c') - ) + utf8ToBin('c'), + ), ), - abcHash + abcHash, ); t.deepEqual( hashFunction.final( - hashFunction.update(hashFunction.init(), utf8ToBin('test')) + hashFunction.update(hashFunction.init(), utf8ToBin('test')), ), - testHash + testHash, ); t.deepEqual( hashFunction.final( hashFunction.update( hashFunction.update(hashFunction.init(), utf8ToBin('lib')), - utf8ToBin('auth') - ) + utf8ToBin('auth'), + ), ), - libauthHash + libauthHash, ); const equivalentToSinglePass = fc.property( @@ -148,17 +129,17 @@ export const testHashFunction = ({ const chunks = Array.from({ length: chunkCount }) .map((_, index) => index * chunkSize) .map((startIndex) => - message.slice(startIndex, startIndex + chunkSize) + message.slice(startIndex, startIndex + chunkSize), ); const incrementalResult = hashFunction.final( chunks.reduce( (state, chunk) => hashFunction.update(state, chunk), - hashFunction.init() - ) + hashFunction.init(), + ), ); const singlePassResult = hashFunction.hash(message); t.deepEqual(incrementalResult, singlePassResult); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSinglePass); diff --git a/src/lib/crypto/hmac.spec.ts b/src/lib/crypto/hmac.spec.ts index 91a1c4ed..7e88075b 100644 --- a/src/lib/crypto/hmac.spec.ts +++ b/src/lib/crypto/hmac.spec.ts @@ -1,6 +1,5 @@ import { createHmac } from 'crypto'; -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { @@ -12,17 +11,19 @@ import { sha512, } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + const vectors = test.macro< [{ secret: string; message: string; sha256: string; sha512: string }] >({ exec: (t, vector) => { t.deepEqual( hmacSha256(hexToBin(vector.secret), hexToBin(vector.message), sha256), - hexToBin(vector.sha256) + hexToBin(vector.sha256), ); t.deepEqual( hmacSha512(hexToBin(vector.secret), hexToBin(vector.message), sha512), - hexToBin(vector.sha512) + hexToBin(vector.sha512), ); }, title: (title) => `[crypto] HMAC Test Vector #${title ?? '?'} (RFC 4231)`, @@ -98,9 +99,9 @@ testProp( (t, secret, message) => { t.deepEqual( binToHex(hmacSha256(secret, message)), - createHmac('sha256', secret).update(message).digest('hex') + createHmac('sha256', secret).update(message).digest('hex'), ); - } + }, ); testProp( @@ -112,7 +113,7 @@ testProp( (t, secret, message) => { t.deepEqual( binToHex(hmacSha512(secret, message)), - createHmac('sha512', secret).update(message).digest('hex') + createHmac('sha512', secret).update(message).digest('hex'), ); - } + }, ); diff --git a/src/lib/crypto/hmac.ts b/src/lib/crypto/hmac.ts index 6cf6e3f7..412c1751 100644 --- a/src/lib/crypto/hmac.ts +++ b/src/lib/crypto/hmac.ts @@ -17,7 +17,7 @@ export const instantiateHmacFunction = (hashFunction: (input: Uint8Array) => Uint8Array, blockByteLength: number) => (secret: Uint8Array, message: Uint8Array) => { const key = new Uint8Array(blockByteLength).fill(0); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements key.set(secret.length > blockByteLength ? hashFunction(secret) : secret, 0); const innerPaddingFill = 0x36; @@ -51,7 +51,7 @@ const sha256BlockByteLength = 64; export const hmacSha256 = ( secret: Uint8Array, message: Uint8Array, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => instantiateHmacFunction(sha256.hash, sha256BlockByteLength)(secret, message); @@ -72,6 +72,6 @@ const sha512BlockByteLength = 128; export const hmacSha512 = ( secret: Uint8Array, message: Uint8Array, - sha512: { hash: Sha512['hash'] } = internalSha512 + sha512: { hash: Sha512['hash'] } = internalSha512, ) => instantiateHmacFunction(sha512.hash, sha512BlockByteLength)(secret, message); diff --git a/src/lib/crypto/ripemd160.bench.ts b/src/lib/crypto/ripemd160.bench.ts index 5fcf7be7..de10e213 100644 --- a/src/lib/crypto/ripemd160.bench.ts +++ b/src/lib/crypto/ripemd160.bench.ts @@ -6,5 +6,5 @@ import { benchmarkHashingFunction } from './hash.bench.helper.js'; benchmarkHashingFunction( 'ripemd160', instantiateRipemd160(), - 'ripemd160' + 'ripemd160', ); diff --git a/src/lib/crypto/ripemd160.ts b/src/lib/crypto/ripemd160.ts index c81b4fc6..0dc6ccf7 100644 --- a/src/lib/crypto/ripemd160.ts +++ b/src/lib/crypto/ripemd160.ts @@ -6,7 +6,7 @@ import { ripemd160Base64Bytes, } from './dependencies.js'; -export interface Ripemd160 extends HashFunction { +export type Ripemd160 = HashFunction & { /** * Finish an incremental ripemd160 hashing computation. * @@ -14,7 +14,7 @@ export interface Ripemd160 extends HashFunction { * * @param rawState - a raw state returned by `update` */ - readonly final: (rawState: Uint8Array) => Uint8Array; + final: (rawState: Uint8Array) => Uint8Array; /** * Returns the ripemd160 hash of the provided input. @@ -24,7 +24,7 @@ export interface Ripemd160 extends HashFunction { * * @param input - a Uint8Array to be hashed using ripemd160 */ - readonly hash: (input: Uint8Array) => Uint8Array; + hash: (input: Uint8Array) => Uint8Array; /** * Begin an incremental ripemd160 hashing computation. @@ -40,7 +40,7 @@ export interface Ripemd160 extends HashFunction { * const hash = ripemd160.final(state3); * ``` */ - readonly init: () => Uint8Array; + init: () => Uint8Array; /** * Add input to an incremental ripemd160 hashing computation. @@ -54,8 +54,8 @@ export interface Ripemd160 extends HashFunction { * @param rawState - a raw state returned by either `init` or `update` * @param input - a Uint8Array to be added to the ripemd160 computation */ - readonly update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; -} + update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; +}; /** * The most performant way to instantiate ripemd160 functionality. To avoid @@ -64,7 +64,7 @@ export interface Ripemd160 extends HashFunction { * @param webassemblyBytes - A buffer containing the ripemd160 binary. */ export const instantiateRipemd160Bytes = async ( - webassemblyBytes: ArrayBuffer + webassemblyBytes: ArrayBuffer, ): Promise => { const wasm = await instantiateRustWasm( webassemblyBytes, @@ -72,7 +72,7 @@ export const instantiateRipemd160Bytes = async ( 'ripemd160', 'ripemd160_init', 'ripemd160_update', - 'ripemd160_final' + 'ripemd160_final', ); return { final: wasm.final, diff --git a/src/lib/crypto/secp256k1-types.ts b/src/lib/crypto/secp256k1-types.ts index 691199b1..dd77f8ea 100644 --- a/src/lib/crypto/secp256k1-types.ts +++ b/src/lib/crypto/secp256k1-types.ts @@ -1,9 +1,9 @@ export type RecoveryId = 0 | 1 | 2 | 3; -export interface RecoverableSignature { +export type RecoverableSignature = { recoveryId: RecoveryId; signature: Uint8Array; -} +}; /** * An object that exposes a set of purely-functional Secp256k1 methods. @@ -19,7 +19,7 @@ export interface RecoverableSignature { * : console.log('❌ Signature invalid'); * ``` */ -export interface Secp256k1 { +export type Secp256k1 = { /** * Tweak a privateKey by adding `tweakValue` to it. * @@ -29,9 +29,9 @@ export interface Secp256k1 { * @param privateKey - a valid secp256k1 private key * @param tweakValue - 256 bit value to tweak by (BE) */ - readonly addTweakPrivateKey: ( + addTweakPrivateKey: ( privateKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => Uint8Array | string; /** @@ -45,9 +45,9 @@ export interface Secp256k1 { * @param publicKey - a public key. * @param tweakValue - 256 bit value to tweak by (BE) */ - readonly addTweakPublicKeyCompressed: ( + addTweakPublicKeyCompressed: ( publicKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => Uint8Array | string; /** @@ -61,9 +61,9 @@ export interface Secp256k1 { * @param publicKey - a public key. * @param tweakValue - 256 bit value to tweak by (BE) */ - readonly addTweakPublicKeyUncompressed: ( + addTweakPublicKeyUncompressed: ( publicKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => Uint8Array | string; /** @@ -79,7 +79,7 @@ export interface Secp256k1 { * * @param privateKey - a public key to compress */ - readonly compressPublicKey: (publicKey: Uint8Array) => Uint8Array | string; + compressPublicKey: (publicKey: Uint8Array) => Uint8Array | string; /** * Derive a compressed public key from a valid secp256k1 private key. @@ -89,9 +89,7 @@ export interface Secp256k1 { * * @param privateKey - a valid secp256k1, 32-byte private key */ - readonly derivePublicKeyCompressed: ( - privateKey: Uint8Array - ) => Uint8Array | string; + derivePublicKeyCompressed: (privateKey: Uint8Array) => Uint8Array | string; /** * Derive an uncompressed public key from a valid secp256k1 private key. @@ -101,9 +99,7 @@ export interface Secp256k1 { * * @param privateKey - a valid secp256k1, 32-byte private key */ - readonly derivePublicKeyUncompressed: ( - privateKey: Uint8Array - ) => Uint8Array | string; + derivePublicKeyUncompressed: (privateKey: Uint8Array) => Uint8Array | string; /** * Malleate a compact-encoded ECDSA signature. @@ -117,9 +113,7 @@ export interface Secp256k1 { * @param signature - a compact-encoded ECDSA signature to malleate, max 72 * bytes */ - readonly malleateSignatureCompact: ( - signature: Uint8Array - ) => Uint8Array | string; + malleateSignatureCompact: (signature: Uint8Array) => Uint8Array | string; /** * Malleate a DER-encoded ECDSA signature. @@ -132,7 +126,7 @@ export interface Secp256k1 { * * @param signature - a DER-encoded ECDSA signature to malleate, max 72 bytes */ - readonly malleateSignatureDER: (signature: Uint8Array) => Uint8Array | string; + malleateSignatureDER: (signature: Uint8Array) => Uint8Array | string; /** * Tweak a privateKey by multiplying it by a `tweakValue`. @@ -144,9 +138,9 @@ export interface Secp256k1 { * @param tweakValue - 256 bit value to tweak by (BE) * */ - readonly mulTweakPrivateKey: ( + mulTweakPrivateKey: ( privateKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => Uint8Array | string; /** @@ -160,9 +154,9 @@ export interface Secp256k1 { * @param publicKey - a public key. * @param tweakValue - 256 bit value to tweak by (BE) */ - readonly mulTweakPublicKeyCompressed: ( + mulTweakPublicKeyCompressed: ( publicKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => Uint8Array | string; /** @@ -177,9 +171,9 @@ export interface Secp256k1 { * @param tweakValue - 256 bit value to tweak by (BE) */ - readonly mulTweakPublicKeyUncompressed: ( + mulTweakPublicKeyUncompressed: ( publicKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => Uint8Array | string; /** @@ -190,9 +184,7 @@ export interface Secp256k1 { * @param signature - a compact-encoded ECDSA signature to normalize to * lower-S form, max 72 bytes */ - readonly normalizeSignatureCompact: ( - signature: Uint8Array - ) => Uint8Array | string; + normalizeSignatureCompact: (signature: Uint8Array) => Uint8Array | string; /** * Normalize a DER-encoded ECDSA signature to lower-S form. @@ -202,9 +194,7 @@ export interface Secp256k1 { * @param signature - a DER-encoded ECDSA signature to normalize to lower-S * form, max 72 bytes */ - readonly normalizeSignatureDER: ( - signature: Uint8Array - ) => Uint8Array | string; + normalizeSignatureDER: (signature: Uint8Array) => Uint8Array | string; /** * Compute a compressed public key from a valid signature, recovery number, @@ -217,10 +207,10 @@ export interface Secp256k1 { * @param messageHash - the hash used to generate the signature and recovery * number */ - readonly recoverPublicKeyCompressed: ( + recoverPublicKeyCompressed: ( signature: Uint8Array, recoveryId: RecoveryId, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; /** @@ -234,10 +224,10 @@ export interface Secp256k1 { * @param messageHash - the hash used to generate the signature and recovery * number */ - readonly recoverPublicKeyUncompressed: ( + recoverPublicKeyUncompressed: ( signature: Uint8Array, recoveryId: RecoveryId, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; /** @@ -247,9 +237,7 @@ export interface Secp256k1 { * * @param signature - a compact-encoded ECDSA signature to convert */ - readonly signatureCompactToDER: ( - signature: Uint8Array - ) => Uint8Array | string; + signatureCompactToDER: (signature: Uint8Array) => Uint8Array | string; /** * Convert a DER-encoded ECDSA signature to compact encoding. @@ -258,9 +246,7 @@ export interface Secp256k1 { * * @param signature - a DER-encoded ECDSA signature to convert */ - readonly signatureDERToCompact: ( - signature: Uint8Array - ) => Uint8Array | string; + signatureDERToCompact: (signature: Uint8Array) => Uint8Array | string; /** * Create an ECDSA signature in compact format. The created signature is @@ -272,9 +258,9 @@ export interface Secp256k1 { * @param privateKey - a valid secp256k1 private key * @param messageHash - the 32-byte message hash to be signed */ - readonly signMessageHashCompact: ( + signMessageHashCompact: ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; /** @@ -287,9 +273,9 @@ export interface Secp256k1 { * @param privateKey - a valid secp256k1, 32-byte private key * @param messageHash - the 32-byte message hash to be signed */ - readonly signMessageHashDER: ( + signMessageHashDER: ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; /** @@ -305,9 +291,9 @@ export interface Secp256k1 { * @param privateKey - a valid secp256k1, 32-byte private key * @param messageHash - the 32-byte message hash to be signed */ - readonly signMessageHashRecoverableCompact: ( + signMessageHashRecoverableCompact: ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => RecoverableSignature | string; /** @@ -325,9 +311,9 @@ export interface Secp256k1 { * @param privateKey - a valid secp256k1, 32-byte private key * @param messageHash - the 32-byte message hash to be signed */ - readonly signMessageHashSchnorr: ( + signMessageHashSchnorr: ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; /** @@ -343,7 +329,7 @@ export interface Secp256k1 { * * @param publicKey - a public key to uncompress */ - readonly uncompressPublicKey: (publicKey: Uint8Array) => Uint8Array | string; + uncompressPublicKey: (publicKey: Uint8Array) => Uint8Array | string; /** * Verify that a private key is valid for secp256k1. Note, this library @@ -360,7 +346,7 @@ export interface Secp256k1 { * * @param privateKey - a 32-byte private key to validate */ - readonly validatePrivateKey: (privateKey: Uint8Array) => boolean; + validatePrivateKey: (privateKey: Uint8Array) => boolean; /** * Verify that a public key is valid for secp256k1. @@ -369,7 +355,7 @@ export interface Secp256k1 { * * @param publicKey - a public key to validate */ - readonly validatePublicKey: (publicKey: Uint8Array) => boolean; + validatePublicKey: (publicKey: Uint8Array) => boolean; /** * Normalize a signature to lower-S form, then `verifySignatureCompactLowS`. @@ -379,10 +365,10 @@ export interface Secp256k1 { * uncompressed (65-byte) format * @param messageHash - the 32-byte message hash signed by the signature */ - readonly verifySignatureCompact: ( + verifySignatureCompact: ( signature: Uint8Array, publicKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => boolean; /** @@ -395,10 +381,10 @@ export interface Secp256k1 { * uncompressed (65-byte) format * @param messageHash - the 32-byte message hash signed by the signature */ - readonly verifySignatureCompactLowS: ( + verifySignatureCompactLowS: ( signature: Uint8Array, publicKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => boolean; /** @@ -409,10 +395,10 @@ export interface Secp256k1 { * uncompressed (65-byte) format * @param messageHash - the 32-byte message hash signed by the signature */ - readonly verifySignatureDER: ( + verifySignatureDER: ( signature: Uint8Array, publicKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => boolean; /** @@ -425,10 +411,10 @@ export interface Secp256k1 { * uncompressed (65-byte) format * @param messageHash - the 32-byte message hash signed by the signature */ - readonly verifySignatureDERLowS: ( + verifySignatureDERLowS: ( signature: Uint8Array, publicKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => boolean; /** @@ -439,9 +425,9 @@ export interface Secp256k1 { * uncompressed (65-byte) format * @param messageHash - the 32-byte message hash signed by the signature */ - readonly verifySignatureSchnorr: ( + verifySignatureSchnorr: ( signature: Uint8Array, publicKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => boolean; -} +}; diff --git a/src/lib/crypto/secp256k1.bench.ts b/src/lib/crypto/secp256k1.bench.ts index a3a2f7f5..3fec9910 100644 --- a/src/lib/crypto/secp256k1.bench.ts +++ b/src/lib/crypto/secp256k1.bench.ts @@ -2,12 +2,13 @@ import { randomBytes } from 'crypto'; import test from 'ava'; + +import { binToHex, generatePrivateKey, instantiateSecp256k1 } from '../lib.js'; + import suite from 'chuhai'; import elliptic from 'elliptic'; import secp256k1Node from 'secp256k1'; -import { binToHex, generatePrivateKey, instantiateSecp256k1 } from '../lib.js'; - const secp256k1Promise = instantiateSecp256k1(); const privateKeyLength = 32; @@ -38,11 +39,11 @@ test('bench: secp256k1: verify signature Low-S, uncompressed pubkey', async (t) const privKey = generatePrivateKey(secureRandom); messageHash = randomBytes(privateKeyLength); pubkeyUncompressed = secp256k1.derivePublicKeyUncompressed( - privKey + privKey, ) as Uint8Array; ellipticPublicKey = ellipticEc.keyFromPublic( binToHex(pubkeyUncompressed), - 'hex' + 'hex', ); sigDER = secp256k1.signMessageHashDER(privKey, messageHash) as Uint8Array; result = false; @@ -52,7 +53,7 @@ test('bench: secp256k1: verify signature Low-S, uncompressed pubkey', async (t) result = secp256k1.verifySignatureDERLowS( sigDER, pubkeyUncompressed, - messageHash + messageHash, ); }); s.bench('elliptic', () => { @@ -64,7 +65,7 @@ test('bench: secp256k1: verify signature Low-S, uncompressed pubkey', async (t) result = secp256k1Node.ecdsaVerify( secp256k1Node.signatureImport(sigDER), messageHash, - pubkeyUncompressed + pubkeyUncompressed, ); }); s.cycle(() => { @@ -86,11 +87,11 @@ test('bench: secp256k1: verify signature Low-S, compressed pubkey', async (t) => const privKey = generatePrivateKey(secureRandom); messageHash = randomBytes(privateKeyLength); pubkeyCompressed = secp256k1.derivePublicKeyCompressed( - privKey + privKey, ) as Uint8Array; ellipticPublicKey = ellipticEc.keyFromPublic( binToHex(pubkeyCompressed), - 'hex' + 'hex', ); sigDER = secp256k1.signMessageHashDER(privKey, messageHash) as Uint8Array; result = false; @@ -100,7 +101,7 @@ test('bench: secp256k1: verify signature Low-S, compressed pubkey', async (t) => result = secp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - messageHash + messageHash, ); }); s.bench('elliptic', () => { @@ -112,7 +113,7 @@ test('bench: secp256k1: verify signature Low-S, compressed pubkey', async (t) => result = secp256k1Node.ecdsaVerify( secp256k1Node.signatureImport(sigDER), messageHash, - pubkeyCompressed + pubkeyCompressed, ); }); s.cycle(() => { @@ -131,18 +132,18 @@ test('bench: secp256k1: derive compressed pubkey', async (t) => { const nextCycle = () => { privKey = generatePrivateKey(secureRandom); pubkeyCompressedExpected = secp256k1.derivePublicKeyCompressed( - privKey + privKey, ) as Uint8Array; }; nextCycle(); s.bench('libauth', () => { pubkeyCompressedBenchmark = secp256k1.derivePublicKeyCompressed( - privKey + privKey, ) as Uint8Array; }); s.bench('elliptic', () => { pubkeyCompressedBenchmark = Uint8Array.from( - ellipticEc.keyFromPrivate(privKey).getPublic().encodeCompressed() + ellipticEc.keyFromPrivate(privKey).getPublic().encodeCompressed(), ); }); s.bench('secp256k1-node', () => { @@ -167,24 +168,24 @@ test('bench: secp256k1: create DER Low-S signature', async (t) => { messageHash = randomBytes(privateKeyLength); sigDERExpected = secp256k1.signMessageHashDER( privKey, - messageHash + messageHash, ) as Uint8Array; }; nextCycle(); s.bench('libauth', () => { sigDERBenchmark = secp256k1.signMessageHashDER( privKey, - messageHash + messageHash, ) as Uint8Array; }); s.bench('elliptic', () => { sigDERBenchmark = Uint8Array.from( - ellipticEc.keyFromPrivate(privKey).sign(messageHash).toDER() + ellipticEc.keyFromPrivate(privKey).sign(messageHash).toDER(), ); }); s.bench('secp256k1-node', () => { sigDERBenchmark = secp256k1Node.signatureExport( - secp256k1Node.ecdsaSign(messageHash, privKey).signature + secp256k1Node.ecdsaSign(messageHash, privKey).signature, ); }); s.cycle(() => { @@ -195,7 +196,7 @@ test('bench: secp256k1: create DER Low-S signature', async (t) => { */ t.deepEqual( sigDERExpected, - secp256k1.normalizeSignatureDER(new Uint8Array(sigDERBenchmark)) + secp256k1.normalizeSignatureDER(new Uint8Array(sigDERBenchmark)), ); nextCycle(); }); @@ -217,11 +218,11 @@ test('bench: secp256k1: sign: Schnorr vs. ECDSA', async (t) => { messageHash = randomBytes(privateKeyLength); sigDERExpected = secp256k1.signMessageHashDER( privKey, - messageHash + messageHash, ) as Uint8Array; sigSchnorrExpected = secp256k1.signMessageHashSchnorr( privKey, - messageHash + messageHash, ) as Uint8Array; }; nextCycle(); @@ -229,14 +230,14 @@ test('bench: secp256k1: sign: Schnorr vs. ECDSA', async (t) => { isSchnorr = false; sigDERBenchmark = secp256k1.signMessageHashDER( privKey, - messageHash + messageHash, ) as Uint8Array; }); s.bench('secp256k1.signMessageHashSchnorr', () => { isSchnorr = true; sigSchnorrBenchmark = secp256k1.signMessageHashSchnorr( privKey, - messageHash + messageHash, ) as Uint8Array; }); s.cycle(() => { @@ -263,12 +264,12 @@ test('bench: secp256k1: verify: Schnorr vs. ECDSA', async (t) => { const privKey = generatePrivateKey(secureRandom); messageHash = randomBytes(privateKeyLength); pubkeyCompressed = secp256k1.derivePublicKeyCompressed( - privKey + privKey, ) as Uint8Array; sigDER = secp256k1.signMessageHashDER(privKey, messageHash) as Uint8Array; sigSchnorr = secp256k1.signMessageHashSchnorr( privKey, - messageHash + messageHash, ) as Uint8Array; result = false; }; @@ -279,9 +280,9 @@ test('bench: secp256k1: verify: Schnorr vs. ECDSA', async (t) => { result = secp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - messageHash + messageHash, ); - } + }, ); s.bench( 'secp256k1.verifySignatureSchnorr (Schnorr, pubkey compressed)', @@ -289,9 +290,9 @@ test('bench: secp256k1: verify: Schnorr vs. ECDSA', async (t) => { result = secp256k1.verifySignatureSchnorr( sigSchnorr, pubkeyCompressed, - messageHash + messageHash, ); - } + }, ); s.cycle(() => { t.true(result); diff --git a/src/lib/crypto/secp256k1.spec.ts b/src/lib/crypto/secp256k1.spec.ts index 9eaff452..70da5baf 100644 --- a/src/lib/crypto/secp256k1.spec.ts +++ b/src/lib/crypto/secp256k1.spec.ts @@ -1,13 +1,10 @@ -/* eslint-disable max-lines, max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument */ +/* eslint-disable max-lines, @typescript-eslint/max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument */ // cspell:ignore recid /* global Buffer */ import { randomBytes } from 'crypto'; import test from 'ava'; -import elliptic from 'elliptic'; -import fc from 'fast-check'; -import secp256k1Node from 'secp256k1'; import type { RecoverableSignature } from '../lib.js'; import { @@ -18,6 +15,10 @@ import { Secp256k1Error, } from '../lib.js'; +import elliptic from 'elliptic'; +import fc from 'fast-check'; +import secp256k1Node from 'secp256k1'; + // test vectors (from `zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong`, m/0 and m/1): // prettier-ignore @@ -88,7 +89,7 @@ const ec = new elliptic.ec('secp256k1'); // eslint-disable-line new-cap const setupElliptic = (privateKey: Uint8Array) => { const key = ec.keyFromPrivate(privateKey); const pubUncompressed = new Uint8Array( - key.getPublic().encode('array', false) + key.getPublic().encode('array', false), ); const pubCompressed = new Uint8Array(key.getPublic().encodeCompressed()); return { @@ -104,7 +105,7 @@ const ellipticCheckSignature = ( sig: Uint8Array, // eslint-disable-next-line @typescript-eslint/no-explicit-any key: any, - message: Uint8Array + message: Uint8Array, ): boolean => key.verify(message, sig); // fast-check helpers @@ -114,20 +115,20 @@ const fcUint8Array = (minLength: number, maxLength: number) => .map((a) => Uint8Array.from(a)); const fcUint8Array32 = () => fcUint8Array(32, 32); const fcValidPrivateKey = fcUint8Array32().filter((generated) => - internalSecp256k1.validatePrivateKey(generated) + internalSecp256k1.validatePrivateKey(generated), ); test('[crypto] instantiateSecp256k1 with binary', async (t) => { const secp256k1 = await instantiateSecp256k1Bytes(binary); t.true( - secp256k1.verifySignatureDERLowS(sigDER, pubkeyCompressed, messageHash) + secp256k1.verifySignatureDERLowS(sigDER, pubkeyCompressed, messageHash), ); }); test('[crypto] instantiateSecp256k1 with randomization', async (t) => { const secp256k1 = await instantiateSecp256k1(randomBytes(32)); t.true( - secp256k1.verifySignatureDERLowS(sigDER, pubkeyUncompressed, messageHash) + secp256k1.verifySignatureDERLowS(sigDER, pubkeyUncompressed, messageHash), ); }); @@ -135,11 +136,11 @@ test('[crypto] secp256k1.addTweakPrivateKey', async (t) => { const secp256k1 = await secp256k1Promise; t.deepEqual( secp256k1.addTweakPrivateKey(privkey, keyTweakVal), - privkeyTweakedAdd + privkeyTweakedAdd, ); t.deepEqual( secp256k1.addTweakPrivateKey(privkey, Buffer.alloc(32, 255)), - Secp256k1Error.addTweakPrivateKey + Secp256k1Error.addTweakPrivateKey, ); }); @@ -151,10 +152,10 @@ test('[fast-check] [crypto] secp256k1.addTweakPrivateKey', async (t) => { t.deepEqual( secp256k1.addTweakPrivateKey(privateKey, keyTweakVal), new Uint8Array( - secp256k1Node.privateKeyTweakAdd(privateKey, keyTweakVal) - ) + secp256k1Node.privateKeyTweakAdd(privateKey, keyTweakVal), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -169,23 +170,23 @@ test('[crypto] secp256k1.addTweakPublicKeyCompressed', (t) => { t.deepEqual( internalSecp256k1.addTweakPublicKeyCompressed( pubkeyCompressed, - keyTweakVal + keyTweakVal, ), - pubkeyTweakedAddCompressed + pubkeyTweakedAddCompressed, ); t.deepEqual( internalSecp256k1.addTweakPublicKeyCompressed( new Uint8Array(65), - keyTweakVal + keyTweakVal, ), - Secp256k1Error.unparsablePublicKey + Secp256k1Error.unparsablePublicKey, ); t.deepEqual( internalSecp256k1.addTweakPublicKeyCompressed( pubkeyCompressed, - Buffer.alloc(32, 255) + Buffer.alloc(32, 255), ), - Secp256k1Error.addTweakPublicKey + Secp256k1Error.addTweakPublicKey, ); }); @@ -195,15 +196,15 @@ test('[fast-check] [crypto] secp256k1.addTweakPublicKeyCompressed', async (t) => fcValidPrivateKey, (privateKey) => { const pubkeyC = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( secp256k1.addTweakPublicKeyCompressed(pubkeyC, keyTweakVal), new Uint8Array( - secp256k1Node.publicKeyTweakAdd(pubkeyC, keyTweakVal, true) - ) + secp256k1Node.publicKeyTweakAdd(pubkeyC, keyTweakVal, true), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -218,23 +219,23 @@ test('[crypto] secp256k1.addTweakPublicKeyUncompressed', (t) => { t.deepEqual( internalSecp256k1.addTweakPublicKeyUncompressed( pubkeyUncompressed, - keyTweakVal + keyTweakVal, ), - pubkeyTweakedAddUncompressed + pubkeyTweakedAddUncompressed, ); t.deepEqual( internalSecp256k1.addTweakPublicKeyUncompressed( new Uint8Array(65), - keyTweakVal + keyTweakVal, ), - Secp256k1Error.unparsablePublicKey + Secp256k1Error.unparsablePublicKey, ); t.deepEqual( internalSecp256k1.addTweakPublicKeyUncompressed( pubkeyCompressed, - Buffer.alloc(32, 255) + Buffer.alloc(32, 255), ), - Secp256k1Error.addTweakPublicKey + Secp256k1Error.addTweakPublicKey, ); }); @@ -244,15 +245,15 @@ test('[fast-check] [crypto] secp256k1.addTweakPublicKeyUncompressed', async (t) fcValidPrivateKey, (privateKey) => { const pubkeyU = secp256k1.derivePublicKeyUncompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( secp256k1.addTweakPublicKeyUncompressed(pubkeyU, keyTweakVal), new Uint8Array( - secp256k1Node.publicKeyTweakAdd(pubkeyU, keyTweakVal, false) - ) + secp256k1Node.publicKeyTweakAdd(pubkeyU, keyTweakVal, false), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -266,11 +267,11 @@ test('[fast-check] [crypto] secp256k1.addTweakPublicKeyUncompressed', async (t) test('[crypto] secp256k1.compressPublicKey', (t) => { t.deepEqual( internalSecp256k1.compressPublicKey(pubkeyUncompressed), - pubkeyCompressed + pubkeyCompressed, ); t.deepEqual( internalSecp256k1.compressPublicKey(new Uint8Array(65)), - Secp256k1Error.unparsablePublicKey + Secp256k1Error.unparsablePublicKey, ); }); @@ -278,13 +279,13 @@ test('[fast-check] [crypto] secp256k1.compressPublicKey', async (t) => { const secp256k1 = await secp256k1Promise; const reversesUncompress = fc.property(fcValidPrivateKey, (privateKey) => { const pubkeyC = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( pubkeyC, secp256k1.compressPublicKey( - secp256k1.uncompressPublicKey(pubkeyC) as Uint8Array - ) + secp256k1.uncompressPublicKey(pubkeyC) as Uint8Array, + ), ); }); @@ -292,22 +293,22 @@ test('[fast-check] [crypto] secp256k1.compressPublicKey', async (t) => { fcValidPrivateKey, (privateKey) => { const pubkeyU = secp256k1.derivePublicKeyUncompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( secp256k1.compressPublicKey(pubkeyU), - new Uint8Array(secp256k1Node.publicKeyConvert(pubkeyU, true)) + new Uint8Array(secp256k1Node.publicKeyConvert(pubkeyU, true)), ); - } + }, ); const equivalentToElliptic = fc.property(fcValidPrivateKey, (privateKey) => { const pubkeyU = secp256k1.derivePublicKeyUncompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( secp256k1.compressPublicKey(pubkeyU), - new Uint8Array(ec.keyFromPublic(pubkeyU).getPublic().encodeCompressed()) + new Uint8Array(ec.keyFromPublic(pubkeyU).getPublic().encodeCompressed()), ); }); t.notThrows(() => { @@ -320,11 +321,11 @@ test('[fast-check] [crypto] secp256k1.compressPublicKey', async (t) => { test('[crypto] secp256k1.derivePublicKeyCompressed', (t) => { t.deepEqual( internalSecp256k1.derivePublicKeyCompressed(privkey), - pubkeyCompressed + pubkeyCompressed, ); t.deepEqual( internalSecp256k1.derivePublicKeyCompressed(secp256k1OrderN), - Secp256k1Error.derivePublicKeyFromInvalidPrivateKey + Secp256k1Error.derivePublicKeyFromInvalidPrivateKey, ); }); @@ -334,11 +335,11 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyCompressed', async (t) => { fcValidPrivateKey, (privateKey) => { const pubkeyU = secp256k1.derivePublicKeyUncompressed( - privateKey + privateKey, ) as Uint8Array; const pubkeyC = secp256k1.derivePublicKeyCompressed(privateKey); t.deepEqual(pubkeyC, secp256k1.compressPublicKey(pubkeyU)); - } + }, ); const equivalentToSecp256k1Node = fc.property( @@ -346,15 +347,15 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyCompressed', async (t) => { (privateKey) => { t.deepEqual( secp256k1.derivePublicKeyCompressed(privateKey), - new Uint8Array(secp256k1Node.publicKeyCreate(privateKey, true)) + new Uint8Array(secp256k1Node.publicKeyCreate(privateKey, true)), ); - } + }, ); const equivalentToElliptic = fc.property(fcValidPrivateKey, (privateKey) => { t.deepEqual( secp256k1.derivePublicKeyCompressed(privateKey), - setupElliptic(privateKey).pubCompressed + setupElliptic(privateKey).pubCompressed, ); }); t.notThrows(() => { @@ -367,11 +368,11 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyCompressed', async (t) => { test('[crypto] secp256k1.derivePublicKeyUncompressed', (t) => { t.deepEqual( internalSecp256k1.derivePublicKeyUncompressed(privkey), - pubkeyUncompressed + pubkeyUncompressed, ); t.deepEqual( internalSecp256k1.derivePublicKeyUncompressed(secp256k1OrderN), - Secp256k1Error.derivePublicKeyFromInvalidPrivateKey + Secp256k1Error.derivePublicKeyFromInvalidPrivateKey, ); }); @@ -381,11 +382,11 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyUncompressed', async (t) => fcValidPrivateKey, (privateKey) => { const pubkeyC = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; const pubkeyU = secp256k1.derivePublicKeyUncompressed(privateKey); t.deepEqual(pubkeyU, secp256k1.uncompressPublicKey(pubkeyC)); - } + }, ); const equivalentToSecp256k1Node = fc.property( @@ -393,15 +394,15 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyUncompressed', async (t) => (privateKey) => { t.deepEqual( secp256k1.derivePublicKeyUncompressed(privateKey), - new Uint8Array(secp256k1Node.publicKeyCreate(privateKey, false)) + new Uint8Array(secp256k1Node.publicKeyCreate(privateKey, false)), ); - } + }, ); const equivalentToElliptic = fc.property(fcValidPrivateKey, (privateKey) => { t.deepEqual( secp256k1.derivePublicKeyUncompressed(privateKey), - setupElliptic(privateKey).pubUncompressed + setupElliptic(privateKey).pubUncompressed, ); }); t.notThrows(() => { @@ -423,11 +424,11 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureDER', async (t) => { (privateKey, message) => { const { key } = setupElliptic(privateKey); const pubkey = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; const sig = secp256k1.signMessageHashDER( privateKey, - message + message, ) as Uint8Array; t.true(secp256k1.verifySignatureDERLowS(sig, pubkey, message)); t.true(ellipticCheckSignature(sig, key, message)); @@ -436,7 +437,7 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureDER', async (t) => { t.true(ellipticCheckSignature(malleated, key, message)); t.false(secp256k1.verifySignatureDERLowS(malleated, pubkey, message)); t.deepEqual(sig, secp256k1.malleateSignatureDER(malleated)); - } + }, ); t.notThrows(() => { fc.assert(malleationIsJustNegation); @@ -446,7 +447,7 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureDER', async (t) => { test('[crypto] secp256k1.malleateSignatureCompact', (t) => { t.deepEqual( internalSecp256k1.malleateSignatureCompact(sigCompact), - sigCompactHighS + sigCompactHighS, ); }); @@ -457,11 +458,11 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureCompact', async (t) => { fcUint8Array32(), (privateKey, message) => { const pubkey = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; const sig = secp256k1.signMessageHashCompact( privateKey, - message + message, ) as Uint8Array; t.true(secp256k1.verifySignatureCompactLowS(sig, pubkey, message)); t.true(secp256k1Node.ecdsaVerify(sig, message, pubkey)); @@ -470,18 +471,18 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureCompact', async (t) => { t.false(secp256k1.verifySignatureCompactLowS(malleated, pubkey, message)); t.false(secp256k1Node.ecdsaVerify(malleated, message, pubkey)); const malleatedMalleated = secp256k1.malleateSignatureCompact( - malleated + malleated, ) as Uint8Array; t.true(secp256k1Node.ecdsaVerify(malleatedMalleated, message, pubkey)); t.true( secp256k1.verifySignatureCompactLowS( malleatedMalleated, pubkey, - message - ) + message, + ), ); t.deepEqual(sig, malleatedMalleated); - } + }, ); t.notThrows(() => { fc.assert(malleationIsJustNegation); @@ -491,11 +492,11 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureCompact', async (t) => { test('[crypto] secp256k1.mulTweakPrivateKey', (t) => { t.deepEqual( internalSecp256k1.mulTweakPrivateKey(privkey, keyTweakVal), - privkeyTweakedMul + privkeyTweakedMul, ); t.deepEqual( internalSecp256k1.mulTweakPrivateKey(privkey, Buffer.alloc(32, 255)), - Secp256k1Error.mulTweakPrivateKey + Secp256k1Error.mulTweakPrivateKey, ); }); @@ -507,10 +508,10 @@ test('[fast-check] [crypto] secp256k1.mulTweakPrivateKey', async (t) => { t.deepEqual( secp256k1.mulTweakPrivateKey(privateKey, keyTweakVal), new Uint8Array( - secp256k1Node.privateKeyTweakMul(privateKey, keyTweakVal) - ) + secp256k1Node.privateKeyTweakMul(privateKey, keyTweakVal), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -525,23 +526,23 @@ test('[crypto] secp256k1.mulTweakPublicKeyCompressed', (t) => { t.deepEqual( internalSecp256k1.mulTweakPublicKeyCompressed( pubkeyCompressed, - keyTweakVal + keyTweakVal, ), - pubkeyTweakedMulCompressed + pubkeyTweakedMulCompressed, ); t.deepEqual( internalSecp256k1.mulTweakPublicKeyCompressed( new Uint8Array(65), - keyTweakVal + keyTweakVal, ), - Secp256k1Error.unparsablePublicKey + Secp256k1Error.unparsablePublicKey, ); t.deepEqual( internalSecp256k1.mulTweakPublicKeyCompressed( pubkeyCompressed, - Buffer.alloc(32, 255) + Buffer.alloc(32, 255), ), - Secp256k1Error.mulTweakPublicKey + Secp256k1Error.mulTweakPublicKey, ); }); @@ -551,15 +552,15 @@ test('[fast-check] [crypto] secp256k1.mulTweakPublicKeyCompressed', async (t) => fcValidPrivateKey, (privateKey) => { const pubkeyC = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( secp256k1.mulTweakPublicKeyCompressed(pubkeyC, keyTweakVal), new Uint8Array( - secp256k1Node.publicKeyTweakMul(pubkeyC, keyTweakVal, true) - ) + secp256k1Node.publicKeyTweakMul(pubkeyC, keyTweakVal, true), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -574,23 +575,23 @@ test('[crypto] secp256k1.mulTweakPublicKeyUncompressed', (t) => { t.deepEqual( internalSecp256k1.mulTweakPublicKeyUncompressed( pubkeyUncompressed, - keyTweakVal + keyTweakVal, ), - pubkeyTweakedMulUncompressed + pubkeyTweakedMulUncompressed, ); t.deepEqual( internalSecp256k1.mulTweakPublicKeyUncompressed( new Uint8Array(65), - keyTweakVal + keyTweakVal, ), - Secp256k1Error.unparsablePublicKey + Secp256k1Error.unparsablePublicKey, ); t.deepEqual( internalSecp256k1.mulTweakPublicKeyUncompressed( pubkeyCompressed, - Buffer.alloc(32, 255) + Buffer.alloc(32, 255), ), - Secp256k1Error.mulTweakPublicKey + Secp256k1Error.mulTweakPublicKey, ); }); @@ -600,15 +601,15 @@ test('[fast-check] [crypto] secp256k1.mulTweakPublicKeyUncompressed', async (t) fcValidPrivateKey, (privateKey) => { const pubkeyU = secp256k1.derivePublicKeyUncompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( secp256k1.mulTweakPublicKeyUncompressed(pubkeyU, keyTweakVal), new Uint8Array( - secp256k1Node.publicKeyTweakMul(pubkeyU, keyTweakVal, false) - ) + secp256k1Node.publicKeyTweakMul(pubkeyU, keyTweakVal, false), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -622,7 +623,7 @@ test('[fast-check] [crypto] secp256k1.mulTweakPublicKeyUncompressed', async (t) test('[crypto] secp256k1.normalizeSignatureCompact', (t) => { t.deepEqual( internalSecp256k1.normalizeSignatureCompact(sigCompactHighS), - sigCompact + sigCompact, ); }); @@ -634,15 +635,15 @@ test('[fast-check] [crypto] secp256k1.normalizeSignatureCompact', async (t) => { (privateKey, hash) => { const sig = secp256k1.signMessageHashCompact( privateKey, - hash + hash, ) as Uint8Array; t.deepEqual( sig, secp256k1.normalizeSignatureCompact( - secp256k1.malleateSignatureCompact(sig) as Uint8Array - ) + secp256k1.malleateSignatureCompact(sig) as Uint8Array, + ), ); - } + }, ); const equivalentToSecp256k1Node = fc.property( @@ -651,14 +652,14 @@ test('[fast-check] [crypto] secp256k1.normalizeSignatureCompact', async (t) => { (privateKey, hash) => { const sig = secp256k1.signMessageHashCompact( privateKey, - hash + hash, ) as Uint8Array; const malleated = secp256k1.malleateSignatureCompact(sig) as Uint8Array; t.deepEqual( secp256k1.normalizeSignatureCompact(malleated), - new Uint8Array(secp256k1Node.signatureNormalize(malleated)) + new Uint8Array(secp256k1Node.signatureNormalize(malleated)), ); - } + }, ); t.notThrows(() => { @@ -681,10 +682,10 @@ test('[fast-check] [crypto] secp256k1.normalizeSignatureDER', async (t) => { t.deepEqual( sig, secp256k1.normalizeSignatureDER( - secp256k1.malleateSignatureDER(sig) as Uint8Array - ) + secp256k1.malleateSignatureDER(sig) as Uint8Array, + ), ); - } + }, ); const equivalentToSecp256k1Node = fc.property( @@ -698,12 +699,12 @@ test('[fast-check] [crypto] secp256k1.normalizeSignatureDER', async (t) => { new Uint8Array( secp256k1Node.signatureExport( secp256k1Node.signatureNormalize( - secp256k1Node.signatureImport(malleated) - ) - ) - ) + secp256k1Node.signatureImport(malleated), + ), + ), + ), ); - } + }, ); t.notThrows(() => { @@ -717,26 +718,26 @@ test('[crypto] secp256k1.recoverPublicKeyCompressed', (t) => { internalSecp256k1.recoverPublicKeyCompressed( sigCompact, sigRecovery, - messageHash + messageHash, ), - pubkeyCompressed + pubkeyCompressed, ); t.deepEqual( internalSecp256k1.recoverPublicKeyCompressed( new Uint8Array(64).fill(255), sigRecovery, - messageHash + messageHash, ), - Secp256k1Error.recoverPublicKeyWithUnparsableSignature + Secp256k1Error.recoverPublicKeyWithUnparsableSignature, ); const failRecover = 2; t.deepEqual( internalSecp256k1.recoverPublicKeyCompressed( sigCompact, failRecover, - messageHash + messageHash, ), - Secp256k1Error.recoverPublicKeyInvalidMaterial + Secp256k1Error.recoverPublicKeyInvalidMaterial, ); }); @@ -748,24 +749,24 @@ test('[fast-check] [crypto] secp256k1.recoverPublicKeyCompressed', async (t) => (privateKey, hash) => { const recoverableStuff = secp256k1.signMessageHashRecoverableCompact( privateKey, - hash + hash, ) as RecoverableSignature; t.deepEqual( secp256k1.recoverPublicKeyCompressed( recoverableStuff.signature, recoverableStuff.recoveryId, - hash + hash, ), new Uint8Array( secp256k1Node.ecdsaRecover( recoverableStuff.signature, recoverableStuff.recoveryId, hash, - true - ) - ) + true, + ), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -777,9 +778,9 @@ test('[crypto] secp256k1.recoverPublicKeyUncompressed', (t) => { internalSecp256k1.recoverPublicKeyUncompressed( sigCompact, sigRecovery, - messageHash + messageHash, ), - pubkeyUncompressed + pubkeyUncompressed, ); }); @@ -791,24 +792,24 @@ test('[fast-check] [crypto] secp256k1.recoverPublicKeyUncompressed', async (t) = (privateKey, hash) => { const recoverableStuff = secp256k1.signMessageHashRecoverableCompact( privateKey, - hash + hash, ) as RecoverableSignature; t.deepEqual( secp256k1.recoverPublicKeyUncompressed( recoverableStuff.signature, recoverableStuff.recoveryId, - hash + hash, ), new Uint8Array( secp256k1Node.ecdsaRecover( recoverableStuff.signature, recoverableStuff.recoveryId, hash, - false - ) - ) + false, + ), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -818,15 +819,15 @@ test('[fast-check] [crypto] secp256k1.recoverPublicKeyUncompressed', async (t) = test('[crypto] secp256k1.signMessageHashCompact', (t) => { t.deepEqual( internalSecp256k1.signMessageHashCompact(privkey, messageHash), - sigCompact + sigCompact, ); t.notDeepEqual( internalSecp256k1.signMessageHashCompact(privkey, Uint8Array.of()), - sigCompact + sigCompact, ); t.deepEqual( internalSecp256k1.signMessageHashCompact(secp256k1OrderN, messageHash), - Secp256k1Error.signWithInvalidPrivateKey + Secp256k1Error.signWithInvalidPrivateKey, ); }); @@ -838,9 +839,9 @@ test('[fast-check] [crypto] secp256k1.signMessageHashCompact', async (t) => { (privateKey, hash) => { t.deepEqual( secp256k1.signMessageHashCompact(privateKey, hash), - new Uint8Array(secp256k1Node.ecdsaSign(hash, privateKey).signature) + new Uint8Array(secp256k1Node.ecdsaSign(hash, privateKey).signature), ); - } + }, ); const equivalentToElliptic = fc.property( @@ -852,11 +853,11 @@ test('[fast-check] [crypto] secp256k1.signMessageHashCompact', async (t) => { secp256k1.signMessageHashCompact(privateKey, hash), secp256k1.signatureDERToCompact( secp256k1.normalizeSignatureDER( - ellipticSignMessageDER(key, hash) - ) as Uint8Array - ) + ellipticSignMessageDER(key, hash), + ) as Uint8Array, + ), ); - } + }, ); t.notThrows(() => { @@ -868,15 +869,15 @@ test('[fast-check] [crypto] secp256k1.signMessageHashCompact', async (t) => { test('[crypto] secp256k1.signMessageHashDER', (t) => { t.deepEqual( internalSecp256k1.signMessageHashDER(privkey, messageHash), - sigDER + sigDER, ); t.notDeepEqual( internalSecp256k1.signMessageHashDER(privkey, Uint8Array.of()), - sigDER + sigDER, ); t.deepEqual( internalSecp256k1.signMessageHashDER(secp256k1OrderN, messageHash), - Secp256k1Error.signWithInvalidPrivateKey + Secp256k1Error.signWithInvalidPrivateKey, ); }); @@ -890,11 +891,11 @@ test('[fast-check] [crypto] secp256k1.signMessageHashDER', async (t) => { secp256k1.signMessageHashDER(privateKey, hash), new Uint8Array( secp256k1Node.signatureExport( - secp256k1Node.ecdsaSign(hash, privateKey).signature - ) - ) + secp256k1Node.ecdsaSign(hash, privateKey).signature, + ), + ), ); - } + }, ); const equivalentToElliptic = fc.property( @@ -904,9 +905,9 @@ test('[fast-check] [crypto] secp256k1.signMessageHashDER', async (t) => { const { key } = setupElliptic(privateKey); t.deepEqual( secp256k1.signMessageHashDER(privateKey, hash), - secp256k1.normalizeSignatureDER(ellipticSignMessageDER(key, hash)) + secp256k1.normalizeSignatureDER(ellipticSignMessageDER(key, hash)), ); - } + }, ); t.notThrows(() => { @@ -918,16 +919,16 @@ test('[fast-check] [crypto] secp256k1.signMessageHashDER', async (t) => { test('[crypto] secp256k1.signMessageHashRecoverableCompact', (t) => { const recoverableStuff = internalSecp256k1.signMessageHashRecoverableCompact( privkey, - messageHash + messageHash, ) as RecoverableSignature; t.is(recoverableStuff.recoveryId, sigRecovery); t.deepEqual(recoverableStuff.signature, sigCompact); t.deepEqual( internalSecp256k1.signMessageHashRecoverableCompact( secp256k1OrderN, - messageHash + messageHash, ), - Secp256k1Error.signWithInvalidPrivateKey + Secp256k1Error.signWithInvalidPrivateKey, ); }); @@ -943,9 +944,9 @@ test('[fast-check] [crypto] secp256k1.signMessageHashRecoverableCompact', async { recoveryId: nodeRecoverableStuff.recid, signature: new Uint8Array(nodeRecoverableStuff.signature), - } + }, ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -960,13 +961,13 @@ test('[fast-check] [crypto] secp256k1.signatureCompactToDER', async (t) => { const secp256k1 = await secp256k1Promise; const reversesCompress = fc.property(fcValidPrivateKey, (privateKey) => { const pubkeyU = secp256k1.derivePublicKeyUncompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( pubkeyU, secp256k1.uncompressPublicKey( - secp256k1.compressPublicKey(pubkeyU) as Uint8Array - ) + secp256k1.compressPublicKey(pubkeyU) as Uint8Array, + ), ); }); @@ -976,13 +977,13 @@ test('[fast-check] [crypto] secp256k1.signatureCompactToDER', async (t) => { (privateKey, hash) => { const sig = secp256k1.signMessageHashCompact( privateKey, - hash + hash, ) as Uint8Array; t.deepEqual( new Uint8Array(secp256k1Node.signatureExport(sig)), - secp256k1.signatureCompactToDER(sig) + secp256k1.signatureCompactToDER(sig), ); - } + }, ); t.notThrows(() => { @@ -996,7 +997,7 @@ test('[crypto] secp256k1.signatureDERToCompact', (t) => { const sigDERWithBrokenEncoding = sigDER.slice().fill(0, 0, 1); t.deepEqual( internalSecp256k1.signatureDERToCompact(sigDERWithBrokenEncoding), - Secp256k1Error.unparsableSignature + Secp256k1Error.unparsableSignature, ); }); @@ -1009,9 +1010,9 @@ test('[fast-check] [crypto] secp256k1.signatureDERToCompact', async (t) => { const sig = secp256k1.signMessageHashDER(privateKey, hash) as Uint8Array; t.deepEqual( new Uint8Array(secp256k1Node.signatureImport(sig)), - secp256k1.signatureDERToCompact(sig) + secp256k1.signatureDERToCompact(sig), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -1021,11 +1022,11 @@ test('[fast-check] [crypto] secp256k1.signatureDERToCompact', async (t) => { test('[crypto] secp256k1.uncompressPublicKey', (t) => { t.deepEqual( internalSecp256k1.uncompressPublicKey(pubkeyCompressed), - pubkeyUncompressed + pubkeyUncompressed, ); t.deepEqual( internalSecp256k1.uncompressPublicKey(new Uint8Array(33)), - Secp256k1Error.unparsablePublicKey + Secp256k1Error.unparsablePublicKey, ); }); @@ -1035,13 +1036,13 @@ test('[fast-check] [crypto] secp256k1.uncompressPublicKey', async (t) => { fcValidPrivateKey, (privateKey) => { const pubkeyC = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( new Uint8Array(secp256k1Node.publicKeyConvert(pubkeyC, false)), - secp256k1.uncompressPublicKey(pubkeyC) + secp256k1.uncompressPublicKey(pubkeyC), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -1070,7 +1071,7 @@ test('[fast-check] [crypto] secp256k1.validatePrivateKey', async (t) => { .map((random) => Uint8Array.from([...almostInvalid, ...random])), (privateKey) => secp256k1.validatePrivateKey(privateKey) === - secp256k1Node.privateKeyVerify(privateKey) + secp256k1Node.privateKeyVerify(privateKey), ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -1090,29 +1091,29 @@ test('[crypto] secp256k1.verifySignatureCompact', (t) => { internalSecp256k1.verifySignatureCompact( sigCompactHighS, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureCompact( sigCompactHighS, pubkeyCompressed, - Uint8Array.of() - ) + Uint8Array.of(), + ), ); t.true( internalSecp256k1.verifySignatureCompact( sigCompactHighS, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureCompact( Uint8Array.of(), pubkeyCompressed, - messageHash - ) + messageHash, + ), ); }); @@ -1130,13 +1131,13 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompact', async (t) => { const testSig = invalidate ? sig.fill(0, 6, 7) : sig; const pub = compressed ? pubCompressed : pubUncompressed; const malleated = secp256k1.malleateSignatureCompact( - testSig + testSig, ) as Uint8Array; return ( secp256k1Node.ecdsaVerify(testSig, message, pub) === secp256k1.verifySignatureCompact(malleated, pub, message) ); - } + }, ); const equivalentToElliptic = fc.property( @@ -1154,7 +1155,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompact', async (t) => { ellipticCheckSignature(testSig, key, message) === secp256k1.verifySignatureCompact(compactSig, pub, message) ); - } + }, ); t.notThrows(() => { @@ -1168,29 +1169,29 @@ test('[crypto] secp256k1.verifySignatureCompactLowS', (t) => { internalSecp256k1.verifySignatureCompactLowS( sigCompact, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureCompactLowS( Uint8Array.of(), pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.true( internalSecp256k1.verifySignatureCompactLowS( sigCompact, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureCompactLowS( sigCompact, pubkeyCompressed, - Uint8Array.of() - ) + Uint8Array.of(), + ), ); }); @@ -1211,7 +1212,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompactLowS', async (t) => secp256k1Node.ecdsaVerify(testSig, message, pub) === secp256k1.verifySignatureCompactLowS(testSig, pub, message) ); - } + }, ); const equivalentToElliptic = fc.property( @@ -1222,7 +1223,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompactLowS', async (t) => (privateKey, message, compressed, invalidate) => { const { key, pubUncompressed, pubCompressed } = setupElliptic(privateKey); const sig = secp256k1.normalizeSignatureDER( - ellipticSignMessageDER(key, message) + ellipticSignMessageDER(key, message), ) as Uint8Array; const testSig = invalidate ? sig.fill(0, 6, 20) : sig; const pub = compressed ? pubCompressed : pubUncompressed; @@ -1231,7 +1232,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompactLowS', async (t) => ellipticCheckSignature(testSig, key, message) === secp256k1.verifySignatureCompactLowS(compactSig, pub, message) ); - } + }, ); t.notThrows(() => { @@ -1245,50 +1246,50 @@ test('[crypto] secp256k1.verifySignatureDER', (t) => { internalSecp256k1.verifySignatureDER( sigDERHighS, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureDER( Uint8Array.of(), pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.true( internalSecp256k1.verifySignatureDER( sigDERHighS, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureDER( sigDERHighS, pubkeyCompressed, - Uint8Array.of() - ) + Uint8Array.of(), + ), ); t.false( internalSecp256k1.verifySignatureDER( Uint8Array.of(), pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.true( internalSecp256k1.verifySignatureDER( sigDERHighS, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureDER( sigDERHighS, pubkeyCompressed, - Uint8Array.of() - ) + Uint8Array.of(), + ), ); }); @@ -1297,74 +1298,74 @@ test('[crypto] secp256k1.verifySignatureDERLowS', (t) => { internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureDERLowS( Uint8Array.of(), pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.true( internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - Uint8Array.of() - ) + Uint8Array.of(), + ), ); t.false( internalSecp256k1.verifySignatureDERLowS( Uint8Array.of(), pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.true( internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - Uint8Array.of() - ) + Uint8Array.of(), + ), ); const pubkeyWithBrokenEncoding = pubkeyCompressed.slice().fill(0, 0, 1); t.false( internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyWithBrokenEncoding, - messageHash - ) + messageHash, + ), ); const sigDERWithBrokenEncoding = sigDER.slice().fill(0, 0, 1); t.false( internalSecp256k1.verifySignatureDERLowS( sigDERWithBrokenEncoding, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); const sigDERWithBadSignature = sigDER.slice().fill(0, 6, 7); t.false( internalSecp256k1.verifySignatureDERLowS( sigDERWithBadSignature, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); }); @@ -1387,7 +1388,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureDERLowS', async (t) => { secp256k1Node.ecdsaVerify(imported, message, pub) === secp256k1.verifySignatureDERLowS(testSig, pub, message) ); - } + }, ); const equivalentToElliptic = fc.property( @@ -1405,10 +1406,10 @@ test('[fast-check] [crypto] secp256k1.verifySignatureDERLowS', async (t) => { secp256k1.verifySignatureDERLowS( secp256k1.normalizeSignatureDER(testSig) as Uint8Array, pub, - message + message, ) ); - } + }, ); t.notThrows(() => { @@ -1420,15 +1421,15 @@ test('[fast-check] [crypto] secp256k1.verifySignatureDERLowS', async (t) => { test('[crypto] secp256k1.signMessageHashSchnorr', (t) => { t.deepEqual( internalSecp256k1.signMessageHashSchnorr(privkey, schnorrMsgHash), - sigSchnorr + sigSchnorr, ); t.notDeepEqual( internalSecp256k1.signMessageHashSchnorr(Uint8Array.of(), schnorrMsgHash), - sigSchnorr + sigSchnorr, ); t.deepEqual( internalSecp256k1.signMessageHashSchnorr(secp256k1OrderN, schnorrMsgHash), - Secp256k1Error.signWithInvalidPrivateKey + Secp256k1Error.signWithInvalidPrivateKey, ); }); @@ -1440,21 +1441,21 @@ test('[fast-check] [crypto] secp256k1.signMessageHashSchnorr', async (t) => { fc.boolean(), (privateKey, hash, invalidate) => { const publicKey = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; const signature = secp256k1.signMessageHashSchnorr( privateKey, - hash + hash, ) as Uint8Array; t.is( secp256k1.verifySignatureSchnorr( invalidate ? signature : signature.fill(0), publicKey, - hash + hash, ), - invalidate + invalidate, ); - } + }, ); t.notThrows(() => { fc.assert(createsValidSignatures); @@ -1466,31 +1467,31 @@ test('[crypto] secp256k1.verifySignatureSchnorr', (t) => { internalSecp256k1.verifySignatureSchnorr( sigSchnorr, pubkeyCompressed, - schnorrMsgHash - ) + schnorrMsgHash, + ), ); t.false( internalSecp256k1.verifySignatureSchnorr( Uint8Array.of(), pubkeyCompressed, - schnorrMsgHash - ) + schnorrMsgHash, + ), ); const pubkeyWithBrokenEncoding = pubkeyCompressed.slice().fill(0, 0, 1); t.false( internalSecp256k1.verifySignatureSchnorr( sigSchnorr, pubkeyWithBrokenEncoding, - schnorrMsgHash - ) + schnorrMsgHash, + ), ); const sigSchnorrWithBadSignature = sigSchnorr.slice().fill(0, 6, 7); t.false( internalSecp256k1.verifySignatureSchnorr( sigSchnorrWithBadSignature, pubkeyCompressed, - schnorrMsgHash - ) + schnorrMsgHash, + ), ); // test vectors from Bitcoin ABC libsecp256k1 diff --git a/src/lib/crypto/secp256k1.ts b/src/lib/crypto/secp256k1.ts index 193f144e..4046aaa5 100644 --- a/src/lib/crypto/secp256k1.ts +++ b/src/lib/crypto/secp256k1.ts @@ -1,4 +1,4 @@ -/* eslint-disable functional/no-conditional-statement, functional/no-expression-statement, functional/no-return-void */ +/* eslint-disable functional/no-conditional-statements, functional/no-expression-statements, functional/no-return-void */ import type { RecoveryId, Secp256k1, Secp256k1Wasm } from '../lib.js'; import { @@ -45,7 +45,7 @@ export enum Secp256k1Error { */ const wrapSecp256k1Wasm = ( secp256k1Wasm: Secp256k1Wasm, - randomSeed?: Uint8Array + randomSeed?: Uint8Array, ): Secp256k1 => { /** * Currently, this wrapper creates a context with both SIGN and VERIFY @@ -69,7 +69,7 @@ const wrapSecp256k1Wasm = ( const publicKeyScratch = secp256k1Wasm.malloc(ByteLength.maxPublicKey); const messageHashScratch = secp256k1Wasm.malloc(ByteLength.messageHash); const internalPublicKeyPtr = secp256k1Wasm.malloc( - ByteLength.internalPublicKey + ByteLength.internalPublicKey, ); const internalSigPtr = secp256k1Wasm.malloc(ByteLength.internalSig); const schnorrSigPtr = secp256k1Wasm.malloc(ByteLength.schnorrSig); @@ -103,7 +103,7 @@ const wrapSecp256k1Wasm = ( internalPublicKeyPtr, publicKeyScratch, // eslint-disable-next-line @typescript-eslint/no-magic-numbers - publicKey.length as 33 | 65 + publicKey.length as 33 | 65, ) === 1 ); }; @@ -122,7 +122,7 @@ const wrapSecp256k1Wasm = ( publicKeyScratch, lengthPtr, internalPublicKeyPtr, - flag + flag, ); return secp256k1Wasm.readHeapU8(publicKeyScratch, getLengthPtr()).slice(); }; @@ -131,11 +131,11 @@ const wrapSecp256k1Wasm = ( compressed ? serializePublicKey( ByteLength.compressedPublicKey, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ) : serializePublicKey( ByteLength.uncompressedPublicKey, - CompressionFlag.UNCOMPRESSED + CompressionFlag.UNCOMPRESSED, ); const convertPublicKey = (compressed: boolean) => (publicKey: Uint8Array) => { @@ -153,12 +153,12 @@ const wrapSecp256k1Wasm = ( contextPtr, internalSigPtr, sigScratch, - signature.length + signature.length, ) === 1 : secp256k1Wasm.signatureParseCompact( contextPtr, internalSigPtr, - sigScratch + sigScratch, ) === 1; }; @@ -166,7 +166,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.signatureSerializeCompact( contextPtr, sigScratch, - internalSigPtr + internalSigPtr, ); return secp256k1Wasm.readHeapU8(sigScratch, ByteLength.compactSig).slice(); }; @@ -177,7 +177,7 @@ const wrapSecp256k1Wasm = ( contextPtr, sigScratch, lengthPtr, - internalSigPtr + internalSigPtr, ); return secp256k1Wasm.readHeapU8(sigScratch, getLengthPtr()).slice(); }; @@ -204,7 +204,7 @@ const wrapSecp256k1Wasm = ( const withPrivateKey = ( privateKey: Uint8Array, - instructions: () => T + instructions: () => T, ): T => { fillPrivateKeyPtr(privateKey); const ret = instructions(); @@ -219,8 +219,8 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.pubkeyCreate( contextPtr, internalPublicKeyPtr, - privateKeyPtr - ) !== 1 + privateKeyPtr, + ) !== 1, ); if (invalid) { @@ -239,7 +239,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.signatureNormalize( contextPtr, internalSigPtr, - internalSigPtr + internalSigPtr, ); }; @@ -254,7 +254,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.signatureMalleate( contextPtr, internalSigPtr, - internalSigPtr + internalSigPtr, ); } return isDer ? getDERSig() : getCompactSig(); @@ -263,7 +263,7 @@ const wrapSecp256k1Wasm = ( const parseAndNormalizeSignature = ( signature: Uint8Array, isDer: boolean, - normalize: boolean + normalize: boolean, ) => { const ret = parseSignature(signature, isDer); if (normalize) { @@ -281,7 +281,7 @@ const wrapSecp256k1Wasm = ( contextPtr, internalSigPtr, messageHashScratch, - privateKeyPtr + privateKeyPtr, ) !== 1; if (failed) { @@ -294,14 +294,14 @@ const wrapSecp256k1Wasm = ( contextPtr, sigScratch, lengthPtr, - internalSigPtr + internalSigPtr, ); return secp256k1Wasm.readHeapU8(sigScratch, getLengthPtr()).slice(); } secp256k1Wasm.signatureSerializeCompact( contextPtr, sigScratch, - internalSigPtr + internalSigPtr, ); return secp256k1Wasm .readHeapU8(sigScratch, ByteLength.compactSig) @@ -318,7 +318,7 @@ const wrapSecp256k1Wasm = ( contextPtr, schnorrSigPtr, messageHashScratch, - privateKeyPtr + privateKeyPtr, ) !== 1; if (failed) { @@ -338,7 +338,7 @@ const wrapSecp256k1Wasm = ( contextPtr, internalSigPtr, messageHashScratch, - internalPublicKeyPtr + internalPublicKeyPtr, ) === 1 ); }; @@ -352,7 +352,7 @@ const wrapSecp256k1Wasm = ( const verifyMessageSchnorr = ( messageHash: Uint8Array, - signature: Uint8Array + signature: Uint8Array, ) => { fillMessageHashScratch(messageHash); const paddedSignature = cloneAndPad(signature, ByteLength.schnorrSig); @@ -362,7 +362,7 @@ const wrapSecp256k1Wasm = ( contextPtr, schnorrSigPtr, messageHashScratch, - internalPublicKeyPtr + internalPublicKeyPtr, ) === 1 ); }; @@ -376,7 +376,7 @@ const wrapSecp256k1Wasm = ( const signMessageHashRecoverable = ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => { fillMessageHashScratch(messageHash); return withPrivateKey(privateKey, () => { @@ -385,7 +385,7 @@ const wrapSecp256k1Wasm = ( contextPtr, internalRSigPtr, messageHashScratch, - privateKeyPtr + privateKeyPtr, ) !== 1 ) { return Secp256k1Error.signWithInvalidPrivateKey; @@ -394,7 +394,7 @@ const wrapSecp256k1Wasm = ( contextPtr, sigScratch, recoveryNumPtr, - internalRSigPtr + internalRSigPtr, ); return { @@ -411,7 +411,7 @@ const wrapSecp256k1Wasm = ( ( signature: Uint8Array, recoveryId: RecoveryId, - messageHash: Uint8Array + messageHash: Uint8Array, ) => { fillMessageHashScratch(messageHash); const paddedSignature = cloneAndPad(signature, ByteLength.maxECDSASig); @@ -421,7 +421,7 @@ const wrapSecp256k1Wasm = ( contextPtr, internalRSigPtr, sigScratch, - recoveryId + recoveryId, ) !== 1 ) { return Secp256k1Error.recoverPublicKeyWithUnparsableSignature; @@ -431,7 +431,7 @@ const wrapSecp256k1Wasm = ( contextPtr, internalPublicKeyPtr, internalRSigPtr, - messageHashScratch + messageHashScratch, ) !== 1 ) { return Secp256k1Error.recoverPublicKeyInvalidMaterial; @@ -441,7 +441,7 @@ const wrapSecp256k1Wasm = ( const addTweakPrivateKey = ( privateKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => { fillMessageHashScratch(tweakValue); return withPrivateKey(privateKey, () => { @@ -449,7 +449,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.privkeyTweakAdd( contextPtr, privateKeyPtr, - messageHashScratch + messageHashScratch, ) !== 1 ) { return Secp256k1Error.addTweakPrivateKey; @@ -462,7 +462,7 @@ const wrapSecp256k1Wasm = ( const mulTweakPrivateKey = ( privateKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => { fillMessageHashScratch(tweakValue); return withPrivateKey(privateKey, () => { @@ -470,7 +470,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.privkeyTweakMul( contextPtr, privateKeyPtr, - messageHashScratch + messageHashScratch, ) !== 1 ) { return Secp256k1Error.mulTweakPrivateKey; @@ -492,7 +492,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.pubkeyTweakAdd( contextPtr, internalPublicKeyPtr, - messageHashScratch + messageHashScratch, ) !== 1 ) { return Secp256k1Error.addTweakPublicKey; @@ -511,7 +511,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.pubkeyTweakMul( contextPtr, internalPublicKeyPtr, - messageHashScratch + messageHashScratch, ) !== 1 ) { return Secp256k1Error.mulTweakPublicKey; @@ -553,7 +553,7 @@ const wrapSecp256k1Wasm = ( validatePrivateKey: (privateKey) => withPrivateKey( privateKey, - () => secp256k1Wasm.seckeyVerify(contextPtr, privateKeyPtr) === 1 + () => secp256k1Wasm.seckeyVerify(contextPtr, privateKeyPtr) === 1, ), validatePublicKey: parsePublicKey, verifySignatureCompact: verifySignature(false, true), @@ -582,7 +582,7 @@ const wrapSecp256k1Wasm = ( * As most applications also benefit from deterministic, reproducible behavior, * context is not randomized by default in Libauth. To randomize the context, * provide a 32-byte Uint8Array of cryptographically strong random values - * (e.g. `Crypto.getRandomValues()`). + * (e.g. `crypto.getRandomValues(new Uint8Array(32))`). * * @param webassemblyBytes - an ArrayBuffer containing the bytes from Libauth's * `secp256k1.wasm` binary. Providing this buffer manually may be faster than @@ -592,11 +592,11 @@ const wrapSecp256k1Wasm = ( */ export const instantiateSecp256k1Bytes = async ( webassemblyBytes: ArrayBuffer, - randomSeed?: Uint8Array + randomSeed?: Uint8Array, ): Promise => wrapSecp256k1Wasm( await instantiateSecp256k1WasmBytes(webassemblyBytes), - randomSeed + randomSeed, ); /** @@ -609,6 +609,6 @@ export const instantiateSecp256k1Bytes = async ( * {@link instantiateSecp256k1Bytes} for details. */ export const instantiateSecp256k1 = async ( - randomSeed?: Uint8Array + randomSeed?: Uint8Array, ): Promise => wrapSecp256k1Wasm(await instantiateSecp256k1Wasm(), randomSeed); diff --git a/src/lib/crypto/sha1.ts b/src/lib/crypto/sha1.ts index d2e958dd..bd4bc47a 100644 --- a/src/lib/crypto/sha1.ts +++ b/src/lib/crypto/sha1.ts @@ -6,7 +6,7 @@ import { sha1Base64Bytes, } from './dependencies.js'; -export interface Sha1 extends HashFunction { +export type Sha1 = HashFunction & { /** * Finish an incremental sha1 hashing computation. * @@ -14,7 +14,7 @@ export interface Sha1 extends HashFunction { * * @param rawState - a raw state returned by `update`. */ - readonly final: (rawState: Uint8Array) => Uint8Array; + final: (rawState: Uint8Array) => Uint8Array; /** * Returns the sha1 hash of the provided input. @@ -24,7 +24,7 @@ export interface Sha1 extends HashFunction { * * @param input - a Uint8Array to be hashed using sha1 */ - readonly hash: (input: Uint8Array) => Uint8Array; + hash: (input: Uint8Array) => Uint8Array; /** * Begin an incremental sha1 hashing computation. @@ -40,7 +40,7 @@ export interface Sha1 extends HashFunction { * const hash = sha1.final(state3); * ``` */ - readonly init: () => Uint8Array; + init: () => Uint8Array; /** * Add input to an incremental sha1 hashing computation. @@ -54,8 +54,8 @@ export interface Sha1 extends HashFunction { * @param rawState - a raw state returned by either `init` or `update` * @param input - a Uint8Array to be added to the sha1 computation */ - readonly update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; -} + update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; +}; /** * The most performant way to instantiate sha1 functionality. To avoid @@ -64,7 +64,7 @@ export interface Sha1 extends HashFunction { * @param webassemblyBytes - A buffer containing the sha1 binary. */ export const instantiateSha1Bytes = async ( - webassemblyBytes: ArrayBuffer + webassemblyBytes: ArrayBuffer, ): Promise => { const wasm = await instantiateRustWasm( webassemblyBytes, @@ -72,7 +72,7 @@ export const instantiateSha1Bytes = async ( 'sha1', 'sha1_init', 'sha1_update', - 'sha1_final' + 'sha1_final', ); return { final: wasm.final, diff --git a/src/lib/crypto/sha256.ts b/src/lib/crypto/sha256.ts index 5ac97115..749902d5 100644 --- a/src/lib/crypto/sha256.ts +++ b/src/lib/crypto/sha256.ts @@ -6,7 +6,7 @@ import { sha256Base64Bytes, } from './dependencies.js'; -export interface Sha256 extends HashFunction { +export type Sha256 = HashFunction & { /** * Finish an incremental sha256 hashing computation. * @@ -14,7 +14,7 @@ export interface Sha256 extends HashFunction { * * @param rawState - a raw state returned by `update`. */ - readonly final: (rawState: Uint8Array) => Uint8Array; + final: (rawState: Uint8Array) => Uint8Array; /** * Returns the sha256 hash of the provided input. @@ -24,7 +24,7 @@ export interface Sha256 extends HashFunction { * * @param input - a Uint8Array to be hashed using sha256 */ - readonly hash: (input: Uint8Array) => Uint8Array; + hash: (input: Uint8Array) => Uint8Array; /** * Begin an incremental sha256 hashing computation. @@ -40,7 +40,7 @@ export interface Sha256 extends HashFunction { * const hash = sha256.final(state3); * ``` */ - readonly init: () => Uint8Array; + init: () => Uint8Array; /** * Add input to an incremental sha256 hashing computation. @@ -54,8 +54,8 @@ export interface Sha256 extends HashFunction { * @param rawState - a raw state returned by either `init` or `update` * @param input - a Uint8Array to be added to the sha256 computation */ - readonly update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; -} + update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; +}; /** * The most performant way to instantiate sha256 functionality. To avoid @@ -64,7 +64,7 @@ export interface Sha256 extends HashFunction { * @param webassemblyBytes - A buffer containing the sha256 binary. */ export const instantiateSha256Bytes = async ( - webassemblyBytes: ArrayBuffer + webassemblyBytes: ArrayBuffer, ): Promise => { const wasm = await instantiateRustWasm( webassemblyBytes, @@ -72,7 +72,7 @@ export const instantiateSha256Bytes = async ( 'sha256', 'sha256_init', 'sha256_update', - 'sha256_final' + 'sha256_final', ); return { final: wasm.final, diff --git a/src/lib/crypto/sha512.ts b/src/lib/crypto/sha512.ts index b21218b7..a7a3a9fb 100644 --- a/src/lib/crypto/sha512.ts +++ b/src/lib/crypto/sha512.ts @@ -6,7 +6,7 @@ import { sha512Base64Bytes, } from './dependencies.js'; -export interface Sha512 extends HashFunction { +export type Sha512 = HashFunction & { /** * Finish an incremental sha512 hashing computation. * @@ -14,7 +14,7 @@ export interface Sha512 extends HashFunction { * * @param rawState - a raw state returned by `update`. */ - readonly final: (rawState: Uint8Array) => Uint8Array; + final: (rawState: Uint8Array) => Uint8Array; /** * Returns the sha512 hash of the provided input. @@ -24,7 +24,7 @@ export interface Sha512 extends HashFunction { * * @param input - a Uint8Array to be hashed using sha512 */ - readonly hash: (input: Uint8Array) => Uint8Array; + hash: (input: Uint8Array) => Uint8Array; /** * Begin an incremental sha512 hashing computation. @@ -40,7 +40,7 @@ export interface Sha512 extends HashFunction { * const hash = sha512.final(state3); * ``` */ - readonly init: () => Uint8Array; + init: () => Uint8Array; /** * Add input to an incremental sha512 hashing computation. @@ -54,8 +54,8 @@ export interface Sha512 extends HashFunction { * @param rawState - a raw state returned by either `init` or `update` * @param input - a Uint8Array to be added to the sha512 computation */ - readonly update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; -} + update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; +}; /** * The most performant way to instantiate sha512 functionality. To avoid @@ -64,7 +64,7 @@ export interface Sha512 extends HashFunction { * @param webassemblyBytes - A buffer containing the sha512 binary. */ export const instantiateSha512Bytes = async ( - webassemblyBytes: ArrayBuffer + webassemblyBytes: ArrayBuffer, ): Promise => { const wasm = await instantiateRustWasm( webassemblyBytes, @@ -72,7 +72,7 @@ export const instantiateSha512Bytes = async ( 'sha512', 'sha512_init', 'sha512_update', - 'sha512_final' + 'sha512_final', ); return { final: wasm.final, diff --git a/src/lib/engine/engine.ts b/src/lib/engine/engine.ts new file mode 100644 index 00000000..e48eebbd --- /dev/null +++ b/src/lib/engine/engine.ts @@ -0,0 +1,8 @@ +export * from './types/bcmr-types.js'; +// export * from './types/draft-transaction-workspace-types.js'; +export * from './types/template-types.js'; +/* + * export * from './types/wallet-types.js'; + * export * from './types/wallet-activity-types.js'; + * export * from './types/wallet-set-types.js'; + */ diff --git a/src/lib/engine/types/bcmr-types.ts b/src/lib/engine/types/bcmr-types.ts new file mode 100644 index 00000000..8c4525ab --- /dev/null +++ b/src/lib/engine/types/bcmr-types.ts @@ -0,0 +1,940 @@ +// spell-checker:ignore DDTHH, ZDTC + +/** + * A mapping of identifiers to URIs associated with an entity. URI identifiers + * may be widely-standardized or registry-specific. Values must be valid URIs, + * including a protocol prefix – e.g. `https://` or `ipfs://`., Clients are only + * required to support `https` and `ipfs` URIs, but any scheme may be specified. + */ +export type URIs = { + [identifier: string]: string; +}; + +/** + * A mapping of extension identifiers to extension definitions. Extensions may + * be widely standardized or application-specific, and extension definitions + * must be either: + * + * - `string`s, + * - key-value mappings of `string`s, or + * - two-dimensional, key-value mappings of `string`s. + * + * This limitation encourages safety and wider compatibility across + * implementations. + * + * To encode an array, it is recommended that each value be assigned to a + * numeric key indicating the item's index (beginning at `0`). + * Numerically-indexed objects are often a more useful and resilient + * data-transfer format than simple arrays because they simplify difference-only + * transmission: only modified indexes need to be transferred, and shifts in + * item order must be explicit, simplifying merges of conflicting updates. + * + * For encoding of more complex data, consider using base64 and/or + * string-encoded JSON. + */ +export type Extensions = { + [extensionIdentifier: string]: + | string + | { [key: string]: string } + | { [keyA: string]: { [keyB: string]: string } }; +}; + +/** + * Tags allow registries to classify and group identities by a variety of + * characteristics. Tags are standardized within a registry and may represent + * either labels applied by that registry or designations by external + * authorities (certification, membership, ownership, etc.) that are tracked by + * that registry. + * + * Examples of possible tags include: `individual`, `organization`, `token`, + * `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, + * `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, + * `decentralized-exchange`, `liquidity-provider`, `sidechain`, + * `sidechain-bridge`, `acme-audited`, `acme-endorsed`, etc. + * + * Tags may be used by clients in search, discovery, and filtering of + * identities, and they can also convey information like accreditation from + * investor protection organizations, public certifications by security or + * financial auditors, and other designations that signal integrity and value + * to users. + */ +export type Tag = { + /** + * The name of this tag for use in interfaces. + * + * In user interfaces with limited space, names should be hidden beyond + * the first newline character or `20` characters until revealed by the user. + * + * E.g.: + * - `Individual` + * - `Token` + * - `Audited by ACME, Inc.` + */ + name: string; + + /** + * A string describing this tag for use in user interfaces. + * + * In user interfaces with limited space, descriptions should be hidden beyond + * the first newline character or `140` characters until revealed by the user. + * + * E.g.: + * - `An identity maintained by a single individual.` + * - `An identity representing a type of token.` + * - `An on-chain application that has passed security audits by ACME, Inc.` + */ + description?: string; + + /** + * A mapping of identifiers to URIs associated with this tag. URI identifiers + * may be widely-standardized or registry-specific. Values must be valid URIs, + * including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are + * only required to support `https` and `ipfs` URIs, but any scheme may + * be specified. + * + * The following identifiers are recommended for all tags: + * - `icon` + * - `web` + * + * The following optional identifiers are standardized: + * - `blog` + * - `chat` + * - `forum` + * - `icon-intro` + * - `registry` + * - `support` + * + * For details on these standard identifiers, see: + * https://github.com/bitjson/chip-bcmr#uri-identifiers + * + * Custom URI identifiers allow for sharing social networking profiles, p2p + * connection information, and other application-specific URIs. Identifiers + * must be lowercase, alphanumeric strings, with no whitespace or special + * characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`). + * + * For example, some common identifiers include: `discord`, `docker`, + * `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, + * `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, + * `youtube`. + */ + uris?: URIs; + + /** + * A mapping of `Tag` extension identifiers to extension definitions. + * {@link Extensions} may be widely standardized or application-specific. + */ + extensions?: Extensions; +}; + +/** + * A definition for one type of NFT within a token category. + */ +export type NftType = { + /** + * The name of this NFT type for use in interfaces. Names longer than `20` + * characters may be elided in some interfaces. + * + * E.g. `Market Order Buys`, `Limit Order Sales`, `Pledge Receipts`, + * `ACME Stadium Tickets`, `Sealed Votes`, etc. + */ + name: string; + + /** + * A string describing this NFT type for use in user interfaces. + * + * In user interfaces with limited space, names should be hidden beyond the + * first newline character or `140` characters until revealed by the user. + * + * E.g.: + * - "Receipts issued by the exchange to record details about purchases. After + * settlement, these receipts are redeemed for the purchased tokens."; + * - "Receipts issued by the crowdfunding campaign to document the value of + * funds pledged. If the user decides to cancel their pledge before the + * campaign completes, these receipts can be redeemed for a full refund."; + * - "Tickets issued for events at ACME Stadium."; + * - Sealed ballots certified by ACME decentralized organization during the + * voting period. After the voting period ends, these ballots must be revealed + * to reclaim the tokens used for voting." + */ + description?: string; + + /** + * A list of identifiers for fields contained in NFTs of this type. On + * successful parsing evaluations, the bottom item on the altstack indicates + * the matched NFT type, and the remaining altstack items represent NFT field + * contents in the order listed (where `fields[0]` is the second-to-bottom + * item, and the final item in `fields` is the top of the altstack). + * + * Fields should be ordered by recommended importance from most important to + * least important; in user interfaces, clients should display fields at lower + * indexes more prominently than those at higher indexes, e.g. if some fields + * cannot be displayed in minimized interfaces, higher-importance fields can + * still be represented. (Note, this ordering is controlled by the bytecode + * specified in `token.nft.parse.bytecode`.) + * + * If this is a sequential NFT, (the category's `parse.bytecode` is + * undefined), `fields` should be omitted or set to `undefined`. + */ + fields?: string[]; + + /** + * A mapping of identifiers to URIs associated with this NFT type. URI + * identifiers may be widely-standardized or registry-specific. Values must be + * valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). + * Clients are only required to support `https` and `ipfs` URIs, but any + * scheme may be specified. + */ + uris?: URIs; + + /** + * A mapping of NFT type extension identifiers to extension definitions. + * {@link Extensions} may be widely standardized or application-specific. + */ + extensions?: Extensions; +}; + +/** + * A definition specifying a field that can be encoded in non-fungible tokens of + * a token category. + */ +export type NftCategoryField = { + [identifier: string]: { + /** + * The name of this field for use in interfaces. Names longer than `20` + * characters may be elided in some interfaces. + * + * E.g.: + * - `BCH Pledged` + * - `Tokens Sold` + * - `Settlement Locktime` + * - `Seat Number`, + * - `IPFS Content Identifier` + * - `HTTPS URL` + */ + name?: string; + + /** + * A string describing how this identity uses NFTs (for use in user + * interfaces). Descriptions longer than `160` characters may be elided in + * some interfaces. + * + * E.g.: + * - `The BCH value pledged at the time this receipt was issued.` + * - `The number of tokens sold in this order.` + * - `The seat number associated with this ticket.` + */ + description?: string; + + /** + * The expected encoding of this field when read from the parsing altstack + * (see {@link ParsableNftCollection}). All encoding definitions must have a + * `type`, and some encoding definitions allow for additional hinting about + * display strategies in clients. + * + * Encoding types may be set to `binary`, `boolean`, `hex`, `number`, + * or `utf8`: + * + * - `binary` types should be displayed as binary literals (e.g. `0b0101`) + * - `boolean` types should be displayed as `true` if exactly `0x01` or + * `false` if exactly `0x00`. If a boolean value does not match one of these + * values, clients should represent the NFT as unable to be parsed + * (e.g. simply display the full `commitment`). + * - `hex` types should be displayed as hex literals (e.g.`0xabcd`). + * - `https-url` types are percent encoded with the `https://` prefix + * omitted; they may be displayed as URIs or as activatable links. + * - `ipfs-cid` types are binary-encoded IPFS Content Identifiers; they may + * be displayed as URIs or as activatable links. + * - `locktime` types are `OP_TXLOCKTIME` results: integers from `0` to + * `4294967295` (inclusive) where values less than `500000000` are + * understood to be a block height (the current block number in the chain, + * beginning from block `0`), and values greater than or equal to + * `500000000` are understood to be a Median Time Past (BIP113) UNIX + * timestamp. (Note, sequence age is not currently supported.) + * - `number` types should be displayed according the their configured + * `decimals` and `unit` values. + * - `utf8` types should be displayed as utf8 strings. + */ + encoding: + | { + type: + | 'binary' + | 'boolean' + | 'hex' + | 'https-url' + | 'ipfs-cid' + | 'utf8' + | `locktime`; + } + | { + type: 'number'; + + /** + * The `aggregate` property indicates that aggregating this field from + * multiple NFTs is desirable in user interfaces. For example, for a + * field named `BCH Pledged` where `aggregate` is `add`, the client + * can display a `Total BCH Pledged` in any user interface listing + * more than one NFT. + * + * If specified, clients should aggregate the field from all NFTs, of + * all NFT types within the category, within a particular view (e.g. + * NFTs held by a single wallet, NFTs existing in a single + * transaction's outputs, etc.) using the specified operation. + * + * Note, while aggregation could be performed using any commutative + * operation – multiplication, bitwise AND, bitwise OR, bitwise XOR, + * etc. – only `add` is currently supported. + */ + aggregate?: 'add'; + + /** + * An integer between `0` and `18` (inclusive) indicating the + * divisibility of the primary unit of this token field. + * + * This is the number of digits that can appear after the decimal + * separator in amounts. For a field with a `decimals` of `2`, a value + * of `123456` should be displayed as `1234.56`. + * + * If omitted, defaults to `0`. + */ + decimals?: number; + + /** + * The unit in which this field is denominated, taking the `decimals` + * value into account. If representing fungible token amount, this + * will often be the symbol of the represented token category. + * + * E.g. `BCH`, `sats`, `AcmeUSD`, etc. + * + * If not provided, clients should not represent this field as having + * a unit beyond the field's `name`. + */ + unit?: string; + }; + /** + * A mapping of identifiers to URIs associated with this NFT field. URI + * identifiers may be widely-standardized or registry-specific. Values must + * be valid URIs, including a protocol prefix (e.g. `https://` or + * `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, + * but any scheme may be specified. + */ + uris?: URIs; + + /** + * A mapping of NFT field extension identifiers to extension definitions. + * {@link Extensions} may be widely standardized or application-specific. + */ + extensions?: Extensions; + }; +}; + +/** + * Interpretation information for a collection of sequential NFTs, a collection + * in which each NFT includes only a sequential identifier within its on-chain + * commitment. Note that {@link SequentialNftCollection}s differ from + * {@link ParsableNftCollection}s in that sequential collections lack a + * parsing `bytecode` with which to inspect each NFT commitment: the type of + * each NFT is indexed by the full contents its commitment (interpreted as a + * positive VM integer in user interfaces). + */ +export type SequentialNftCollection = { + /** + * A mapping of each NFT commitment (typically, a positive integer encoded as + * a VM number) to metadata for that NFT type in this category. + */ + types: { + /** + * Interpretation information for each type of NFT within the token + * category, indexed by commitment hex. For sequential NFTs, the on-chain + * commitment of each NFT is interpreted as a VM number to reference its + * particular NFT type in user interfaces. Issuing a sequential NFT with a + * negative or invalid VM number is discouraged, but clients may render the + * commitment of such NFTs in hex-encoded form, prefixed with `X`. + */ + [commitmentHex: string]: NftType; + }; +}; + +/** + * Interpretation information for a collection of parsable NFTs, a collection + * in which each NFT may include additional metadata fields beyond a sequential + * identifier within its on-chain commitment. Note that + * {@link ParsableNftCollection}s differ from {@link SequentialNftCollection}s + * in that parsable collections require a parsing `bytecode` with which to + * inspect each NFT commitment: the type of each NFT is indexed by the + * hex-encoded contents the bottom item on the altstack following the evaluation + * of the parsing bytecode. + */ +export type ParsableNftCollection = { + /** + * A segment of hex-encoded Bitcoin Cash VM bytecode that parses UTXOs + * holding NFTs of this category, identifies the NFT's type within the + * category, and returns a list of the NFT's field values via the + * altstack. If undefined, this NFT Category includes only sequential NFTs, + * with only an identifier and no NFT fields encoded in each NFT's + * on-chain commitment. + * + * The parse `bytecode` is evaluated by instantiating and partially + * verifying a standardized NFT parsing transaction: + * - version: `2` + * - inputs: + * - 0: Spends the UTXO containing the NFT with an empty + * unlocking bytecode and sequence number of `0`. + * - 1: Spends index `0` of the empty hash outpoint, with locking + * bytecode set to `parse.bytecode`, unlocking bytecode `OP_1` + * (`0x51`) and sequence number `0`. + * - outputs: + * - 0: A locking bytecode of OP_RETURN (`0x6a`) and value of `0`. + * - locktime: `0` + * + * After input 1 of this NFT parsing transaction is evaluated, if the + * resulting stack is not valid (a single "truthy" element remaining on + * the stack) – or if the altstack is empty – parsing has failed and + * clients should represent the NFT as unable to be parsed (e.g. simply + * display the full `commitment` as a hex-encoded value in the user + * interface). + * + * On successful parsing evaluations, the bottom item on the altstack + * indicates the type of the NFT according to the matching definition in + * `types`. If no match is found, clients should represent the NFT as + * unable to be parsed. + * + * For example: `00d2517f7c6b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_1 OP_SPLIT + * OP_SWAP OP_TOALTSTACK OP_TOALTSTACK) splits the commitment after 1 byte, + * pushing the first byte to the altstack as an NFT type identifier and the + * remaining segment of the commitment as the first NFT field value. + * + * If undefined (in a {@link SequentialNftCollection}), this field could be + * considered to have a default value of `00d26b` (OP_0 OP_UTXOTOKENCOMMITMENT + * OP_TOALTSTACK), which takes the full contents of the commitment as a fixed + * type index. As such, each index of the NFT category's `types` maps a + * precise commitment value to the metadata for NFTs with that particular + * commitment. E.g. an NFT with an empty commitment (VM number 0) maps to + * `types['']`, a commitment of `01` (hex) maps to `types['01']`, etc. This + * pattern is used for collections of sequential NFTs. + */ + bytecode: string; + /** + * A mapping of hex-encoded values to definitions of possible NFT types + * in this category. + */ + types: { + /** + * A definitions for each type of NFT within the token category. Parsable + * NFT types are indexed by the hex-encoded value of the bottom altstack + * item following evaluation of `NftCategory.parse.bytecode`. The remaining + * altstack items are mapped to NFT fields according to the `fields` + * property of the matching NFT type. + */ + [bottomAltstackHex: string]: NftType; + }; +}; + +/** + * A definition specifying the non-fungible token information for a + * token category. + */ +export type NftCategory = { + /** + * A string describing how this identity uses NFTs (for use in user + * interfaces). Descriptions longer than `160` characters may be elided in + * some interfaces. + * + * E.g.: + * - "ACME DEX NFT order receipts are issued when you place orders on the + * decentralized exchange. After orders are processed, order receipts can + * be redeemed for purchased tokens or sales proceeds."; + * - "ACME Game collectable NFTs unlock unique playable content, user + * avatars, and item skins in ACME Game Online."; etc. + */ + description?: string; + + /** + * A mapping of field identifier to field definitions for the data fields + * that can appear in NFT commitments of this category. + * + * Categories including only sequential NFTs (where `parse.bytecode` is + * undefined) should omit `fields` (or set to `undefined`). + */ + fields?: NftCategoryField; + + /** + * Parsing and interpretation information for all NFTs of this category; + * this enables generalized wallets to parse and display detailed + * information about all NFTs held by the wallet, e.g. `BCH Pledged`, + * `Order Price`, `Seat Number`, `Asset Number`, + * `IPFS Content Identifier`, `HTTPS URL`, etc. + * + * Parsing instructions are provided in the `bytecode` property, and the + * results are interpreted using the `types` property. + */ + parse: ParsableNftCollection | SequentialNftCollection; +}; + +/** + * A definition specifying information about an identity's token category. + */ +export type TokenCategory = { + /** + * The current token category used by this identity. Often, this will be + * equal to the identity's authbase, but some token identities must migrate + * to new categories for technical reasons. + */ + category: string; + + /** + * An abbreviation used to uniquely identity this token category. + * + * Symbols must be comprised only of capital letters, numbers, and dashes + * (`-`). This can be validated with the regular expression: + * `/^[-A-Z0-9]+$/`. + */ + symbol: string; + + /** + * An integer between `0` and `18` (inclusive) indicating the divisibility + * of the primary unit of this token category. + * + * This is the number of digits that can appear after the decimal separator + * in fungible token amounts. For a token category with a `symbol` of + * `SYMBOL` and a `decimals` of `2`, a fungible token amount of `12345` + * should be displayed as `123.45 SYMBOL`. + * + * If omitted, defaults to `0`. + */ + decimals?: number; + + /** + * Display information for non-fungible tokens (NFTs) of this identity. + * Omitted for token categories without NFTs. + */ + nfts?: NftCategory; +}; + +/** + * A snapshot of the metadata for a particular identity at a specific time. + */ +export type IdentitySnapshot = { + /** + * The name of this identity for use in interfaces. + * + * In user interfaces with limited space, names should be hidden beyond + * the first newline character or `20` characters until revealed by the user. + * + * E.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc. + */ + name: string; + + /** + * A string describing this identity for use in user interfaces. + * + * In user interfaces with limited space, descriptions should be hidden beyond + * the first newline character or `140` characters until revealed by the user. + * + * E.g.: + * - `The common stock issued by ACME, Inc.` + * - `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.` + * - `Software developer and lead maintainer of Wallet Name.` + */ + description?: string; + + /** + * An array of `Tag` identifiers marking the `Tag`s associated with this + * identity. All specified tag identifiers must be defined in the registry's + * `tags` mapping. + */ + tags?: string[]; + + /** + * The timestamp at which this identity snapshot is fully in effect. This + * value should only be provided if the snapshot takes effect over a period + * of time (e.g. an in-circulation token identity is gradually migrating to + * a new category). In these cases, clients should gradually migrate to + * using the new information beginning after the identity snapshot's timestamp + * and the `migrated` time. + * + * This timestamp must be provided in simplified extended ISO 8601 format, a + * 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is + * zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript + * `Date.toISOString()`. + */ + migrated?: string; + + /** + * If this identity is a type of token, a data structure indicating how tokens + * should be understood and displayed in user interfaces. Omitted for + * non-token identities. + */ + token?: TokenCategory; + + /** + * The status of this identity, must be `active`, `inactive`, or `burned`. If + * omitted, defaults to `active`. + * - Identities with an `active` status should be actively tracked by clients. + * - Identities with an `inactive` status may be considered for archival by + * clients and may be removed in future registry versions. + * - Identities with a `burned` status have been destroyed by setting the + * latest identity output to a data-carrier output (`OP_RETURN`), permanently + * terminating the authchain. Clients should archive burned identities and – + * if the burned identity represented a token type – consider burning any + * remaining tokens of that category to reclaim funds from those outputs. + */ + status?: 'active' | 'burned' | 'inactive'; + + /** + * The split ID of this identity's chain of record. + * + * If undefined, defaults to {@link MetadataRegistry.defaultChain}. + */ + splitId?: string; + + /** + * A mapping of identifiers to URIs associated with this identity. URI + * identifiers may be widely-standardized or registry-specific. Values must be + * valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). + * Clients are only required to support `https` and `ipfs` URIs, but any + * scheme may be specified. + * + * The following identifiers are recommended for all identities: + * - `icon` + * - `web` + * + * The following optional identifiers are standardized: + * - `blog` + * - `chat` + * - `forum` + * - `icon-intro` + * - `image` + * - `migrate` + * - `registry` + * - `support` + * + * For details on these standard identifiers, see: + * https://github.com/bitjson/chip-bcmr#uri-identifiers + * + * Custom URI identifiers allow for sharing social networking profiles, p2p + * connection information, and other application-specific URIs. Identifiers + * must be lowercase, alphanumeric strings, with no whitespace or special + * characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`). + * + * For example, some common identifiers include: `discord`, `docker`, + * `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, + * `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, + * `youtube`. + */ + uris?: URIs; + + /** + * A mapping of `IdentitySnapshot` extension identifiers to extension + * definitions. {@link Extensions} may be widely standardized or + * application-specific. + * + * Standardized extensions for `IdentitySnapshot`s include the `authchain` + * extension. See + * https://github.com/bitjson/chip-bcmr#authchain-extension for details. + */ + extensions?: Extensions; +}; + +/** + * A snapshot of the metadata for a particular chain/network at a specific + * time. This allows for registries to provide similar metadata for each chain's + * native currency unit (name, description, symbol, icon, etc.) as can be + * provided for other registered tokens. + */ +export type ChainSnapshot = Omit & { + /** + * A data structure indicating how the chain's native currency units should be + * displayed in user interfaces. + */ + token: { + /** + * An abbreviation used to uniquely identity this native currency unit. + * + * Symbols must be comprised only of capital letters, numbers, and dashes + * (`-`). This can be validated with the regular expression: + * `/^[-A-Z0-9]+$/`. + */ + symbol: string; + + /** + * An integer between `0` and `18` (inclusive) indicating the divisibility + * of the primary unit of this native currency. + * + * This is the number of digits that can appear after the decimal separator + * in currency amounts. For a currency with a `symbol` of `SYMBOL` and a + * `decimals` of `2`, an amount of `12345` should be displayed as + * `123.45 SYMBOL`. + * + * If omitted, defaults to `0`. + */ + decimals?: number; + }; +}; + +/** + * A field keyed by timestamps to document the evolution of the field. Each + * timestamp must be provided in simplified extended ISO 8601 format, a + * 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is + * zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript + * `Date.toISOString()`. + * + * For example, to insert a new value: + * ```ts + * const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; + * ``` + */ +export type RegistryTimestampKeyedValues = { + [timestamp: string]: T; +}; + +/** + * A block height-keyed map of {@link ChainSnapshot}s documenting the evolution + * of a particular chain/network's identity. Like {@link IdentityHistory}, this + * structure allows wallets and other user interfaces to offer better + * experiences when a chain identity is rebranded, redenominated, or other + * important metadata is modified in a coordinated update. + */ +export type ChainHistory = RegistryTimestampKeyedValues; + +/** + * A timestamp-keyed map of {@link IdentitySnapshot}s documenting + * the evolution of a particular identity. The current identity information is + * the snapshot associated with the latest timestamp reached. If no timestamp + * has yet been reached, the snapshot of the oldest timestamp is considered + * current. Future-dated timestamps indicate planned migrations. + * + * This strategy allows wallets and other user interfaces to offer better + * experiences when an identity is rebranded, a token redenominated, or other + * important metadata is modified in a coordinated update. For example, a wallet + * may warn token holders of a forthcoming rebranding of fungible tokens they + * hold; after the change, the wallet may continue to offer prominent interface + * hints that the rebranded token identity was recently updated. + * + * Timestamps may be order by time via lexicographical sort. For determinism, it + * is recommended that implementations sort from newest to oldest in exported + * registry JSON files. + * + * If the current snapshot's {@link IdentitySnapshot.migrated} isn't specified, + * the snapshot's index is a precise time at which the snapshot takes effect and + * clients should begin using the new information. If `migrated` is specified, + * the snapshot's index is the timestamp at which the transition is considered + * to begin, see {@link IdentitySnapshot.migrated} for details. + * + * Each timestamp must be provided in simplified extended ISO 8601 format, a + * 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is + * zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript + * `Date.toISOString()`. + * + * In the case that an identity change occurs due to on-chain activity (e.g. an + * on-chain migration that is set to complete at a particular locktime value), + * registry-recorded timestamps reflect the real-world time at which the + * maintainer of the registry believes the on-chain activity to have actually + * occurred. Likewise, future-dated timestamps indicate a precise real-world + * time at which a snapshot is estimated to take effect, rather than the Median + * Time Past (BIP113) UNIX timestamp or another on-chain measurement of time. + */ +export type IdentityHistory = RegistryTimestampKeyedValues; + +/** + * An identity representing a metadata registry that is not published on-chain + * and therefore has no authbase or trackable authchain. + */ +export type OffChainRegistryIdentity = Pick< + IdentitySnapshot, + 'description' | 'extensions' | 'name' | 'tags' | 'uris' +>; + +/** + * A Bitcoin Cash Metadata Registry is an authenticated JSON file containing + * metadata about tokens, identities, contract applications, and other on-chain + * artifacts. BCMRs conform to the Bitcoin Cash Metadata Registry JSON Schema, + * and they can be published and maintained by any entity or individual. + */ +export type MetadataRegistry = { + /** + * The schema used by this registry. Many JSON editors can automatically + * provide inline documentation and autocomplete support using the `$schema` + * property, so it is recommended that registries include it. E.g.: + * `https://cashtokens.org/bcmr-v2.schema.json` + */ + $schema?: string; + + /** + * The version of this registry. Versioning adheres to Semantic Versioning + * (https://semver.org/). + */ + version: { + /** + * The major version is incremented when an identity is removed. + */ + major: number; + + /** + * The minor version is incremented when an identity is added or a new + * identity snapshot is added. + */ + minor: number; + + /** + * The patch version is incremented when an existing identity or identity + * snapshot is modified (e.g. to correct an error or add a missing piece of + * information) or when other registry properties (e.g. registry `name`, + * `description`, `uris`, etc.) are modified. + * + * Generally, substantive changes to an existing identity should be made + * using a new identity snapshot in a minor version upgrade – this allows + * clients to provide a better user experience by noting the change in + * relevant user interfaces. + * + * For example, patch upgrades might include spelling corrections in an + * existing snapshot or the addition of an `icon` containing a + * higher-resolution version of an existing `icon` image. On the other hand, + * a rebranding in which the icon is substantially changed may warrant a new + * identity snapshot to be added in a minor version upgrade. + */ + patch: number; + }; + + /** + * The timestamp of the latest revision made to this registry version. The + * timestamp must be provided in simplified extended ISO 8601 format, a + * 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is + * zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript + * `Date.toISOString()`. + */ + latestRevision: string; + + /** + * The identity information of this particular registry, provided as either an + * authbase (recommended) or an `IdentitySnapshot`. + * + * An authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for + * which the zeroth-descendant transaction chain (ZDTC) authenticates and + * publishes all registry updates. If an authbase is provided, the registry's + * identity information can be found in `identities[authbase]`, and clients + * should immediately attempt to verify the registry's identity on-chain. + * (See https://github.com/bitjson/chip-bcmr#chain-resolved-registries) + * + * If an `IdentitySnapshot` is provided directly, this registry does not + * support on-chain resolution/authentication, and the contained + * `IdentitySnapshot` can only be authenticated via DNS/HTTPS. + */ + registryIdentity: OffChainRegistryIdentity | string; + + /** + * A mapping of authbases to the `IdentityHistory` for that identity. + * + * An authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for + * which the zeroth-descendant transaction chain (ZDTC) authenticates and + * publishes an identity's claimed metadata. + * + * Identities may represent metadata registries, specific types of tokens, + * companies, organizations, individuals, or other on-chain entities. + */ + identities?: { + [authbase: string]: IdentityHistory; + }; + + /** + * A map of registry-specific `Tag`s used by this registry to convey + * information about identities it tracks. + * + * Tags allow registries to group identities into collections of related + * identities, marking characteristics or those identities. Tags are + * standardized within a registry and may represent either labels applied by + * that registry (e.g. `individual`, `organization`, `token`, `wallet`, + * `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, + * `wrapped`, `collectable`, `deflationary`, `governance`, + * `decentralized-exchange`, `liquidity-provider`, `sidechain`, + * `sidechain-bridge`, etc.) or designations by external authorities + * (certification, membership, ownership, etc.) that are tracked by + * that registry. + * + * Tags may be used by clients in search, discover, and filtering of + * identities, and they can also convey information like accreditation from + * investor protection organizations, public certifications by security or + * financial auditors, and other designations that signal legitimacy and value + * to users. + */ + tags?: { + [identifier: string]: Tag; + }; + + /** + * The split ID of the chain/network considered the "default" chain for this + * registry. Identities that do not specify a {@link IdentitySnapshot.splitId} + * are assumed to be set to this split ID. For a description of split IDs, + * see {@link MetadataRegistry.chains}. + * + * If not provided, the `defaultChain` is + * `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`, the BCH + * side of the BCH/XEC split (mainnet). Common values include: + * - `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367` + * (testnet4) + * - `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727` + * (chipnet) + */ + defaultChain?: string; + + /** + * A map of split IDs tracked by this registry to the {@link ChainHistory} for + * that chain/network. + * + * The split ID of a chain is the block header hash (A.K.A. block ID) of the + * first unique block after the most recent tracked split – a split after + * which both resulting chains are considered notable or tracked by the + * registry. (For chains with no such splits, this is the ID of the + * genesis block.) + * + * Note, split ID is inherently a "relative" identifier. After a tracked + * split, both resulting chains will have a new split ID. However, if a wallet + * has not yet heard about a particular split, that wallet will continue to + * reference one of the resulting chains by its previous split ID, and the + * split-unaware wallet may create transactions that are valid on both chains + * (losing claimable value if the receivers of their transactions don't + * acknowledge transfers on both chains). When a registry trusted by the + * wallet notes the split in it's `chains` map, the wallet can represent the + * split in the user interface using the the latest {@link ChainSnapshot} for + * each chain and splitting coins prior to spending (by introducing post-split + * coins in each transaction). + * + * This map may exclude the following well-known split IDs (all clients + * supporting any of these chains should build-in {@link ChainHistory} for + * those chains): + * + * - `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`: + * A.K.A. mainnet – the BCH side of the BCH/XEC split. + * - `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367`: + * A.K.A testnet4 – the test network on which CHIPs are activated + * simultaneously with mainnet (May 15 at 12 UTC). + * - `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727`: + * A.K.A. chipnet – the test network on which CHIPs are activated 6 months + * before mainnet (November 15 at 12 UTC). + * + * All other split IDs referenced by this registry should be included in this + * map. + */ + chains?: { + [splitId: string]: ChainHistory; + }; + + /** + * The license under which this registry is published. This may be specified + * as either a SPDX short identifier (https://spdx.org/licenses/) or by + * including the full text of the license. + * + * Common values include: + * - `CC0-1.0`: https://creativecommons.org/publicdomain/zero/1.0/ + * - `MIT`: https://opensource.org/licenses/MIT + */ + license?: string; + + /** + * A mapping of `Registry` extension identifiers to extension definitions. + * {@link Extensions} may be widely standardized or application-specific. + * + * Standardized extensions for `Registry`s include the `locale` extension. See + * https://github.com/bitjson/chip-bcmr#locales-extension for details. + */ + extensions?: Extensions; +}; diff --git a/src/lib/compiler/template-types.ts b/src/lib/engine/types/template-types.ts similarity index 79% rename from src/lib/compiler/template-types.ts rename to src/lib/engine/types/template-types.ts index dfab0813..c2fb1e4f 100644 --- a/src/lib/compiler/template-types.ts +++ b/src/lib/engine/types/template-types.ts @@ -10,31 +10,36 @@ */ /** - * An `AuthenticationTemplate` (A.K.A. `CashAssembly Template`) specifies a set - * of locking scripts, unlocking scripts, and other information required to use - * a certain authentication scheme. Templates fully describe wallets and - * protocols in a way that can be shared between software clients. + * A `WalletTemplate` specifies a set of locking scripts, unlocking scripts, and + * other information required to use a certain wallet protocol. Templates + * fully describe wallet protocols in a way that can be shared between + * software clients. */ -export interface AuthenticationTemplate { +export type WalletTemplate = { /** * The URI that identifies the JSON Schema used by this template. Try: - * `https://libauth.org/schemas/authentication-template-v0.schema.json` + * `https://libauth.org/schemas/wallet-template-v0.schema.json` * to enable documentation, autocompletion, and validation in JSON documents. */ $schema?: string; /** * An optionally multi-line, free-form, human-readable description for this - * authentication template (for use in user interfaces). If displayed, this + * wallet template (for use in user interfaces). If displayed, this * description should use a monospace font to properly render ASCII diagrams. + * + * Descriptions have no length limit, but in user interfaces with limited + * space, they should be hidden beyond the first newline character or `140` + * characters until revealed by the user (e.g. by hiding the remaining + * description until the user activates a "show more" link). */ description?: string; /** - * A map of entities defined in this authentication template. + * A map of entities defined in this wallet template. * * Object keys are used as entity identifiers, and by convention, should use * `snake_case`. */ - entities: { [entityId: string]: AuthenticationTemplateEntity }; + entities: { [entityId: string]: WalletTemplateEntity }; /** * A single-line, Title Case, human-readable name for this authentication * template (for use in user interfaces). @@ -43,24 +48,24 @@ export interface AuthenticationTemplate { /** * A scenario describes a context in which one or more scripts might be used. * Scenarios are used for transaction estimation and as an integrated testing - * system for authentication templates. + * system for wallet templates. * * Object keys are used as scenario identifiers, and by convention, should use * `snake_case`. */ - scenarios?: { [scenarioId: string]: AuthenticationTemplateScenario }; + scenarios?: { [scenarioId: string]: WalletTemplateScenario }; /** - * A map of scripts used in this authentication template. + * A map of scripts used in this wallet template. * * Object keys are used as script identifiers, and by convention, should use * `snake_case`. */ scripts: { [scriptId: string]: - | AuthenticationTemplateScript - | AuthenticationTemplateScriptLocking - | AuthenticationTemplateScriptTested - | AuthenticationTemplateScriptUnlocking; + | WalletTemplateScript + | WalletTemplateScriptLocking + | WalletTemplateScriptTested + | WalletTemplateScriptUnlocking; }; /** * A list of authentication virtual machine versions supported by this @@ -78,11 +83,11 @@ export interface AuthenticationTemplate { */ supported: AuthenticationVirtualMachineIdentifier[]; /** - * A number identifying the format of this AuthenticationTemplate. + * A number identifying the format of this WalletTemplate. * Currently, this implementation requires `version` be set to `0`. */ version: 0; -} +}; /** * Allowable identifiers for authentication virtual machine versions. The `BCH` @@ -113,9 +118,9 @@ export type AuthenticationVirtualMachineIdentifier = /** * An object describing the configuration for a particular entity within an - * authentication template. + * wallet template. */ -export interface AuthenticationTemplateEntity { +export type WalletTemplateEntity = { /** * An optionally multi-line, free-form, human-readable description for this * entity (for use in user interfaces). If displayed, this description @@ -149,13 +154,13 @@ export interface AuthenticationTemplateEntity { * Object keys are used as variable identifiers, and by convention, should use * `snake_case`. */ - variables?: { [variableId: string]: AuthenticationTemplateVariable }; -} + variables?: { [variableId: string]: WalletTemplateVariable }; +}; /** * An object defining the data to use while compiling a scenario. */ -export interface AuthenticationTemplateScenarioData { +export type WalletTemplateScenarioData = { /** * A map of full identifiers to CashAssembly scripts that compile to each * identifier's value for this scenario. Allowing `bytecode` to be specified @@ -255,11 +260,11 @@ export interface AuthenticationTemplateScenarioData { */ privateKeys?: { [variableId: string]: string }; }; -} +}; /** * A type that describes the configuration for a particular locking or - * unlocking bytecode within an authentication template scenario. + * unlocking bytecode within a wallet template scenario. * * Bytecode may be specified as either a hexadecimal-encoded string or an object * describing the required compilation. @@ -268,7 +273,7 @@ export interface AuthenticationTemplateScenarioData { * `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to * `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`. */ -export type AuthenticationTemplateScenarioBytecode = +export type WalletTemplateScenarioBytecode = | string | { /** @@ -289,13 +294,13 @@ export type AuthenticationTemplateScenarioBytecode = * Defaults to `{}` for `sourceOutputs` and `transaction.inputs`; defaults * to `{ "hdKeys": { "addressIndex": 1 } }` for `transaction.outputs`. */ - overrides?: AuthenticationTemplateScenarioData; + overrides?: WalletTemplateScenarioData; }; /** - * An example input used to define a scenario for an authentication template. + * An example input used to define a scenario for a wallet template. */ -export interface AuthenticationTemplateScenarioInput { +export type WalletTemplateScenarioInput = { /** * The index of the output in the transaction from which this input is spent. * @@ -388,22 +393,20 @@ export interface AuthenticationTemplateScenarioInput { * The `unlockingBytecode` value of this input for this scenario. This must be * either `["slot"]`, indicating that this input contains the * `unlockingBytecode` under test by the scenario, or an - * `AuthenticationTemplateScenarioBytecode`. + * `WalletTemplateScenarioBytecode`. * * For a scenario to be valid, `unlockingBytecode` must be `["slot"]` for * exactly one input in the scenario. * * Defaults to `["slot"]`. */ - unlockingBytecode?: AuthenticationTemplateScenarioBytecode | ['slot']; -} + unlockingBytecode?: WalletTemplateScenarioBytecode | ['slot']; +}; /** - * An example output used to define a scenario for an authentication template. + * An example output used to define a scenario for a wallet template. */ -export interface AuthenticationTemplateScenarioOutput< - IsSourceOutput extends boolean -> { +export type WalletTemplateScenarioOutput = { /** * The locking bytecode used to encumber this output. * @@ -418,8 +421,8 @@ export interface AuthenticationTemplateScenarioOutput< * exactly one source output slot and one input slot at the same index.) */ readonly lockingBytecode?: IsSourceOutput extends true - ? AuthenticationTemplateScenarioBytecode | ['slot'] - : AuthenticationTemplateScenarioBytecode; + ? WalletTemplateScenarioBytecode | ['slot'] + : WalletTemplateScenarioBytecode; /** * The value of the output in satoshis, the smallest unit of bitcoin. * @@ -439,7 +442,7 @@ export interface AuthenticationTemplateScenarioOutput< * * If undefined, this defaults to: `0`. */ - readonly valueSatoshis?: number | string; + valueSatoshis?: number | string; /** * The CashToken contents of this output. This property is only defined if the @@ -489,26 +492,26 @@ export interface AuthenticationTemplateScenarioOutput< commitment?: string; }; }; -} +}; /** - * A transaction output used to define an authentication template scenario + * A transaction output used to define a wallet template scenario * transaction. */ -export type AuthenticationTemplateScenarioTransactionOutput = - AuthenticationTemplateScenarioOutput; +export type WalletTemplateScenarioTransactionOutput = + WalletTemplateScenarioOutput; /** - * A source output used by an authentication template scenario. + * A source output used by a wallet template scenario. */ -export type AuthenticationTemplateScenarioSourceOutput = - AuthenticationTemplateScenarioOutput; +export type WalletTemplateScenarioSourceOutput = + WalletTemplateScenarioOutput; /** * An object describing the configuration for a particular scenario within an - * authentication template. + * wallet template. */ -export interface AuthenticationTemplateScenario { +export type WalletTemplateScenario = { /** * An object defining the data to use while compiling this scenario. The * properties specified here are used to extend the existing scenario data @@ -517,7 +520,7 @@ export interface AuthenticationTemplateScenario { * Each property is extended individually – to unset a previously-set * property, the property must be individually overridden in this object. */ - data?: AuthenticationTemplateScenarioData; + data?: WalletTemplateScenarioData; /** * An optionally multi-line, free-form, human-readable description for this @@ -620,7 +623,7 @@ export interface AuthenticationTemplateScenario { * If undefined, inherits the default scenario `inputs` value: * `[{ "unlockingBytecode": ["slot"] }]`. */ - inputs?: AuthenticationTemplateScenarioInput[]; + inputs?: WalletTemplateScenarioInput[]; /** * The locktime to use when generating the transaction for this scenario. A * positive integer from `0` to a maximum of `4294967295` – if undefined, @@ -671,7 +674,7 @@ export interface AuthenticationTemplateScenario { * * If undefined, defaults to `[{ "lockingBytecode": {} }]`. */ - outputs?: AuthenticationTemplateScenarioTransactionOutput[]; + outputs?: WalletTemplateScenarioTransactionOutput[]; /** * The version to use when generating the transaction for this scenario. A * positive integer from `0` to a maximum of `4294967295` – if undefined, @@ -693,14 +696,14 @@ export interface AuthenticationTemplateScenario { * * If undefined, defaults to `[{ "lockingBytecode": ["slot"] }]`. */ - sourceOutputs?: AuthenticationTemplateScenarioSourceOutput[]; -} + sourceOutputs?: WalletTemplateScenarioSourceOutput[]; +}; /** * An object describing the configuration for a particular script within an - * authentication template. + * wallet template. */ -export interface AuthenticationTemplateScript { +export type WalletTemplateScript = { /** * A single-line, human-readable name for this script (for use in user * interfaces). @@ -710,10 +713,9 @@ export interface AuthenticationTemplateScript { * The script definition in CashAssembly. */ script: string; -} +}; -export interface AuthenticationTemplateScriptUnlocking - extends AuthenticationTemplateScript { +export type WalletTemplateScriptUnlocking = WalletTemplateScript & { /** * TODO: not yet implemented * @@ -755,7 +757,7 @@ export interface AuthenticationTemplateScriptUnlocking * If not provided, the default scenario will be used for estimation. The * default scenario only provides values for each `Key` and `HdKey` variable, * so compilations requiring other variables will produce errors. See - * `AuthenticationTemplateScenario.extends` for details. + * `WalletTemplateScenario.extends` for details. */ estimate?: string; /** @@ -810,10 +812,9 @@ export interface AuthenticationTemplateScriptUnlocking * unlocking script, and the script it unlocks must be a locking script. */ unlocks: string; -} +}; -export interface AuthenticationTemplateScriptLocking - extends AuthenticationTemplateScript { +export type WalletTemplateScriptLocking = WalletTemplateScript & { /** * Indicates if P2SH20 infrastructure should be used when producing bytecode * related to this script. For more information on P2SH20, see BIP16. @@ -833,10 +834,9 @@ export interface AuthenticationTemplateScriptLocking * `unlocks` property of another script. */ lockingType: 'p2sh20' | 'p2sh32' | 'standard'; -} +}; -export interface AuthenticationTemplateScriptTested - extends AuthenticationTemplateScript { +export type WalletTemplateScriptTested = WalletTemplateScript & { /** * If set to `true`, indicates that this script should be wrapped in a push * statement for testing. @@ -853,10 +853,10 @@ export interface AuthenticationTemplateScriptTested * One or more tests that can be used during development and during template * validation to confirm the correctness of this tested script. */ - tests: { [testId: string]: AuthenticationTemplateScriptTest }; -} + tests: { [testId: string]: WalletTemplateScriptTest }; +}; -export interface AuthenticationTemplateScriptTest { +export type WalletTemplateScriptTest = { /** * The script to evaluate after the script being tested. This can be used to * check that the tested script leaves the expected results on the stack. For @@ -913,9 +913,9 @@ export interface AuthenticationTemplateScriptTest { * In scenario testing, this script is treated as the unlocking script. */ setup?: string; -} +}; -export interface AuthenticationTemplateVariableBase { +export type WalletTemplateVariableBase = { /** * A single-line, human readable description for this variable (for use in * user interfaces). @@ -927,133 +927,148 @@ export interface AuthenticationTemplateVariableBase { */ name?: string; type: string; -} +}; -export interface AuthenticationTemplateHdKey - extends AuthenticationTemplateVariableBase { +export type WalletTemplateKeyBase = { /** - * A single-line, human readable description for this HD key. - */ - description?: string; - /** - * A single-line, Title Case, human-readable name for this HD key. - */ - name?: string; - /** - * The offset by which to increment the `addressIndex` provided in the - * compilation data when deriving this `HdKey`. (Default: 0) + * If set to `true`, indicates that this key should never be used to sign two + * different messages. * - * This is useful for deriving the "next" (`1`) or "previous" (`-1`) address - * to be used in the current compiler configuration. - */ - addressOffset?: number; - /** - * The path to derive the entity's HD public key from the entity's master HD - * private key. By default, `m` (i.e. the entity's HD public key represents - * the same node in the HD tree as its HD private key). + * This is useful for contracts that use zero-confirmation escrow systems to + * guarantee against double-spend attempts. By indicating that the user could + * be subjected to losses if a key were used in multiple signatures, templates + * can ensure that wallet implementations apply appropriate safeguards around + * use of the key. * - * This can be used to specify another derivation path from which the - * `publicDerivationPath` begins, e.g. `m/0'/1'/2'`. See - * `publicDerivationPath` for details. - * - * This path must begin with an `m` (private derivation) and be fixed – it - * cannot contain an `i` character to represent the address index, as a - * dynamic hardened path would require a new HD public key for each address. - */ - hdPublicKeyDerivationPath?: string; - /** - * The derivation path used to derive this `HdKey` from the owning entity's HD - * private key. By default, `m/i`. - * - * This path uses the notation specified in BIP32 and the `i` character to - * represent the location of the `addressIndex`: - * - * The first character must be `m` (private derivation), followed by sets of - * `/` and a number representing the child index used in the derivation at - * that depth. Hardened derivation is represented by a trailing `'`, and - * hardened child indexes are represented with the hardened index offset - * (`2147483648`) subtracted. The `i` character is replaced with the value of - * `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is - * followed by `'`, the hardened index offset is added (`2147483648`) and - * hardened derivation is used. - * - * For example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in - * the following order: - * - * `derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)` - * - * Because hardened derivation requires knowledge of the private key, `HdKey` - * variables with `derivationPath`s that include hardened derivation cannot - * use HD public derivation (the `hdPublicKeys` property in - * `CompilationData`). Instead, compilation requires the respective HD private - * key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public - * key (`CompilationData.hdKeys.derivedPublicKeys`). - */ - privateDerivationPath?: string; - /** - * The derivation path used to derive this `HdKey`'s public key from the - * owning entity's HD public key. If not set, the public equivalent of - * `privateDerivationPath` is used. For the `privateDerivationPath` default of - * `m/i`, this is `M/i`. - * - * If `privateDerivationPath` uses hardened derivation for some levels, but - * later derivation levels use non-hardened derivation, `publicDerivationPath` - * can be used to specify a public derivation path beginning from - * `hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a - * non-hardened segment of `privateDerivationPath` that follows - * `hdPublicKeyDerivationPath`). - * - * The first character must be `M` (public derivation), followed by sets of - * `/` and a number representing the child index used in the non-hardened - * derivation at that depth. - * - * For example, if `privateDerivationPath` is `m/0'/i`, it is not possible to - * derive the equivalent public key with only the HD public key `M`. (The path - * "`M/0'/i`" is impossible.) However, given the HD public key for `m/0'`, it - * is possible to derive the public key of `m/0'/i` for any `i`. In this case, - * `hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath` - * would be the remaining `M/i`. - * - * @remarks - * Non-hardened derivation paths are more useful for some templates, e.g. to - * allow for new locking scripts to be generated without communicating new - * public keys between entities for each. **However, using a non-hardened key - * has critical security implications.** If an attacker gains possession of - * both a parent HD *public key* and any child private key, the attacker can - * easily derive the parent HD *private key*, and with it, all hardened and - * non-hardened child keys. See BIP32 or - * `crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode` for details. - */ - publicDerivationPath?: string; - /** - * The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key - * generation and mapping in a standard way. For greater control, use `Key`. + * Defaults to `false`. */ - type: 'HdKey'; -} + neverSignTwice?: boolean; +}; -export interface AuthenticationTemplateKey - extends AuthenticationTemplateVariableBase { - /** - * A single-line, human readable description for this key. - */ - description?: string; - /** - * A single-line, Title Case, human-readable name for this key. - */ - name?: string; - /** - * The `Key` type provides fine-grained control over key generation and - * mapping. Most templates should instead use `HdKey`. - * - * Any HD (Hierarchical-Deterministic) derivation must be completed outside of - * the templating system and provided at the time of use. - */ - type: 'Key'; -} +export type WalletTemplateHdKey = WalletTemplateKeyBase & + WalletTemplateVariableBase & { + /** + * A single-line, human readable description for this HD key. + */ + description?: string; + /** + * A single-line, Title Case, human-readable name for this HD key. + */ + name?: string; + /** + * The offset by which to increment the `addressIndex` provided in the + * compilation data when deriving this `HdKey`. (Default: 0) + * + * This is useful for deriving the "next" (`1`) or "previous" (`-1`) address + * to be used in the current compiler configuration. + */ + addressOffset?: number; + /** + * The path to derive the entity's HD public key from the entity's master HD + * private key. By default, `m` (i.e. the entity's HD public key represents + * the same node in the HD tree as its HD private key). + * + * This can be used to specify another derivation path from which the + * `publicDerivationPath` begins, e.g. `m/0'/1'/2'`. See + * `publicDerivationPath` for details. + * + * This path must begin with an `m` (private derivation) and be fixed – it + * cannot contain an `i` character to represent the address index, as a + * dynamic hardened path would require a new HD public key for each address. + */ + hdPublicKeyDerivationPath?: string; + /** + * The derivation path used to derive this `HdKey` from the owning entity's HD + * private key. By default, `m/i`. + * + * This path uses the notation specified in BIP32 and the `i` character to + * represent the location of the `addressIndex`: + * + * The first character must be `m` (private derivation), followed by sets of + * `/` and a number representing the child index used in the derivation at + * that depth. Hardened derivation is represented by a trailing `'`, and + * hardened child indexes are represented with the hardened index offset + * (`2147483648`) subtracted. The `i` character is replaced with the value of + * `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is + * followed by `'`, the hardened index offset is added (`2147483648`) and + * hardened derivation is used. + * + * For example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in + * the following order: + * + * `derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)` + * + * Because hardened derivation requires knowledge of the private key, `HdKey` + * variables with `derivationPath`s that include hardened derivation cannot + * use HD public derivation (the `hdPublicKeys` property in + * `CompilationData`). Instead, compilation requires the respective HD private + * key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public + * key (`CompilationData.hdKeys.derivedPublicKeys`). + */ + privateDerivationPath?: string; + /** + * The derivation path used to derive this `HdKey`'s public key from the + * owning entity's HD public key. If not set, the public equivalent of + * `privateDerivationPath` is used. For the `privateDerivationPath` default of + * `m/i`, this is `M/i`. + * + * If `privateDerivationPath` uses hardened derivation for some levels, but + * later derivation levels use non-hardened derivation, `publicDerivationPath` + * can be used to specify a public derivation path beginning from + * `hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a + * non-hardened segment of `privateDerivationPath` that follows + * `hdPublicKeyDerivationPath`). + * + * The first character must be `M` (public derivation), followed by sets of + * `/` and a number representing the child index used in the non-hardened + * derivation at that depth. + * + * For example, if `privateDerivationPath` is `m/0'/i`, it is not possible to + * derive the equivalent public key with only the HD public key `M`. (The path + * "`M/0'/i`" is impossible.) However, given the HD public key for `m/0'`, it + * is possible to derive the public key of `m/0'/i` for any `i`. In this case, + * `hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath` + * would be the remaining `M/i`. + * + * @remarks + * Non-hardened derivation paths are more useful for some templates, e.g. to + * allow for new locking scripts to be generated without communicating new + * public keys between entities for each. **However, using a non-hardened key + * has critical security implications.** If an attacker gains possession of + * both a parent HD *public key* and any child private key, the attacker can + * easily derive the parent HD *private key*, and with it, all hardened and + * non-hardened child keys. See BIP32 or + * `crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode` for details. + */ + publicDerivationPath?: string; + /** + * The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key + * generation and mapping in a standard way. For greater control, use `Key`. + */ + type: 'HdKey'; + }; + +export type WalletTemplateKey = WalletTemplateKeyBase & + WalletTemplateVariableBase & { + /** + * A single-line, human readable description for this key. + */ + description?: string; + /** + * A single-line, Title Case, human-readable name for this key. + */ + name?: string; + /** + * The `Key` type provides fine-grained control over key generation and + * mapping. Most templates should instead use `HdKey`. + * + * Any HD (Hierarchical-Deterministic) derivation must be completed outside of + * the templating system and provided at the time of use. + */ + type: 'Key'; + }; -export interface AuthenticationTemplateWalletData - extends AuthenticationTemplateVariableBase { +export type WalletTemplateWalletData = WalletTemplateVariableBase & { /** * A single-line, human readable description for this wallet data. */ @@ -1071,10 +1086,9 @@ export interface AuthenticationTemplateWalletData * For address-specific data, use `AddressData`. */ type: 'WalletData'; -} +}; -export interface AuthenticationTemplateAddressData - extends AuthenticationTemplateVariableBase { +export type WalletTemplateAddressData = WalletTemplateVariableBase & { /** * A single-line, human readable description for this address data. */ @@ -1091,10 +1105,10 @@ export interface AuthenticationTemplateAddressData * For more persistent data, use `WalletData`. */ type: 'AddressData'; -} +}; -export type AuthenticationTemplateVariable = - | AuthenticationTemplateAddressData - | AuthenticationTemplateHdKey - | AuthenticationTemplateKey - | AuthenticationTemplateWalletData; +export type WalletTemplateVariable = + | WalletTemplateAddressData + | WalletTemplateHdKey + | WalletTemplateKey + | WalletTemplateWalletData; diff --git a/src/lib/format/base-convert.spec.ts b/src/lib/format/base-convert.spec.ts index c30668d5..95f4ff44 100644 --- a/src/lib/format/base-convert.spec.ts +++ b/src/lib/format/base-convert.spec.ts @@ -1,4 +1,3 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import type { BaseConverter } from '../lib.js'; @@ -15,8 +14,10 @@ import { // eslint-disable-next-line import/no-restricted-paths, import/no-internal-modules import base58Json from './fixtures/base58_encode_decode.json' assert { type: 'json' }; +import { fc, testProp } from '@fast-check/ava'; + const base58Vectors = Object.values(base58Json).filter( - (item) => Array.isArray(item) && item.every((x) => typeof x === 'string') + (item) => Array.isArray(item) && item.every((x) => typeof x === 'string'), ); const base2 = createBaseConverter('01') as BaseConverter; @@ -40,7 +41,7 @@ test(base2Vector, '111111111111', Uint8Array.of(15, 255)); test( base2Vector, '11111111000000001111111100000000', - Uint8Array.of(255, 0, 255, 0) + Uint8Array.of(255, 0, 255, 0), ); const base16 = createBaseConverter('0123456789abcdef') as BaseConverter; @@ -76,7 +77,7 @@ test(base58Vector, 'aPEr', utf8ToBin('ccc')); test( base58Vector, '1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L', - hexToBin('00eb15231dfceb60925886b67d065299925915aeb172c06647') + hexToBin('00eb15231dfceb60925886b67d065299925915aeb172c06647'), ); test('createBaseConverter: alphabet too long', (t) => { @@ -84,16 +85,16 @@ test('createBaseConverter: alphabet too long', (t) => { createBaseConverter( range(255) .map((i) => String.fromCharCode(i)) - .join('') + .join(''), ), - BaseConversionError.tooLong + BaseConversionError.tooLong, ); }); test('createBaseConverter: ambiguous character in alphabet', (t) => { t.deepEqual( createBaseConverter('00'), - BaseConversionError.ambiguousCharacter + BaseConversionError.ambiguousCharacter, ); }); @@ -107,8 +108,8 @@ testProp( (t, input) => t.deepEqual( base2.encode(base2.decode(base2.encode(input)) as Uint8Array), - base2.encode(input) - ) + base2.encode(input), + ), ); testProp( @@ -117,13 +118,13 @@ testProp( (t, input) => t.deepEqual( base16.encode(base16.decode(base16.encode(input)) as Uint8Array), - base16.encode(input) - ) + base16.encode(input), + ), ); const base26 = createBaseConverter( // cspell: disable-next-line - 'abcdefghijklmnopqrstuvwxyz' + 'abcdefghijklmnopqrstuvwxyz', ) as BaseConverter; testProp( @@ -132,12 +133,12 @@ testProp( (t, input) => t.deepEqual( base26.encode(base26.decode(base26.encode(input)) as Uint8Array), - base26.encode(input) - ) + base26.encode(input), + ), ); const base42 = createBaseConverter( - '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghi' + '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghi', ) as BaseConverter; testProp( @@ -146,8 +147,8 @@ testProp( (t, input) => t.deepEqual( base42.encode(base42.decode(base42.encode(input)) as Uint8Array), - base42.encode(input) - ) + base42.encode(input), + ), ); testProp( @@ -156,13 +157,13 @@ testProp( (t, input) => t.deepEqual( binToBase58(base58ToBin(binToBase58(input)) as Uint8Array), - binToBase58(input) - ) + binToBase58(input), + ), ); test('base58 Test Vectors', (t) => { t.truthy(base58Vectors); - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [binHex, base58] of base58Vectors) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion t.deepEqual(base58ToBin(base58!) as Uint8Array, hexToBin(binHex!)); diff --git a/src/lib/format/base-convert.ts b/src/lib/format/base-convert.ts index 6d5b6851..210ecc7c 100644 --- a/src/lib/format/base-convert.ts +++ b/src/lib/format/base-convert.ts @@ -4,10 +4,10 @@ export enum BaseConversionError { unknownCharacter = 'Encountered an unknown character for this alphabet.', } -export interface BaseConverter { +export type BaseConverter = { decode: (source: string) => BaseConversionError.unknownCharacter | Uint8Array; encode: (input: Uint8Array) => string; -} +}; /** * Create a {@link BaseConverter}, exposing methods for encoding and decoding @@ -30,7 +30,7 @@ export interface BaseConverter { */ // Algorithm from the `base-x` implementation (derived from the original Satoshi implementation): https://github.com/cryptocoinjs/base-x export const createBaseConverter = ( - alphabet: string + alphabet: string, ): BaseConversionError | BaseConverter => { const undefinedValue = 255; const uint8ArrayBase = 256; @@ -39,13 +39,13 @@ export const createBaseConverter = ( const alphabetMap = new Uint8Array(uint8ArrayBase).fill(undefinedValue); - // eslint-disable-next-line functional/no-loop-statement, functional/no-let, no-plusplus + // eslint-disable-next-line functional/no-loop-statements, functional/no-let, no-plusplus for (let index = 0; index < alphabet.length; index++) { const characterCode = alphabet.charCodeAt(index); if (alphabetMap[characterCode] !== undefinedValue) { return BaseConversionError.ambiguousCharacter; } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data alphabetMap[characterCode] = index; } @@ -67,15 +67,15 @@ export const createBaseConverter = ( } const requiredLength = Math.floor( - (input.length - firstNonZeroIndex) * factor + 1 + (input.length - firstNonZeroIndex) * factor + 1, ); const decoded = new Uint8Array(requiredLength); - /* eslint-disable functional/no-let, functional/no-expression-statement */ + /* eslint-disable functional/no-let, functional/no-expression-statements */ let nextByte = firstNonZeroIndex; let remainingBytes = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (input[nextByte] !== undefined) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion let carry = alphabetMap[input.charCodeAt(nextByte)]!; @@ -83,7 +83,7 @@ export const createBaseConverter = ( return BaseConversionError.unknownCharacter; let digit = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for ( let steps = requiredLength - 1; (carry !== 0 || digit < remainingBytes) && steps !== -1; @@ -101,14 +101,14 @@ export const createBaseConverter = ( // eslint-disable-next-line no-plusplus nextByte++; } - /* eslint-enable functional/no-let, functional/no-expression-statement */ + /* eslint-enable functional/no-let, functional/no-expression-statements */ const firstNonZeroResultDigit = decoded.findIndex((value) => value !== 0); const bin = new Uint8Array( - firstNonZeroIndex + (requiredLength - firstNonZeroResultDigit) + firstNonZeroIndex + (requiredLength - firstNonZeroResultDigit), ); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements bin.set(decoded.slice(firstNonZeroResultDigit), firstNonZeroIndex); return bin; }, @@ -122,19 +122,19 @@ export const createBaseConverter = ( } const requiredLength = Math.floor( - (input.length - firstNonZeroIndex) * inverseFactor + 1 + (input.length - firstNonZeroIndex) * inverseFactor + 1, ); const encoded = new Uint8Array(requiredLength); - /* eslint-disable functional/no-let, functional/no-expression-statement */ + /* eslint-disable functional/no-let, functional/no-expression-statements */ let nextByte = firstNonZeroIndex; let remainingBytes = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (nextByte !== input.length) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion let carry = input[nextByte]!; let digit = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for ( let steps = requiredLength - 1; (carry !== 0 || digit < remainingBytes) && steps !== -1; @@ -151,7 +151,7 @@ export const createBaseConverter = ( // eslint-disable-next-line no-plusplus nextByte++; } - /* eslint-enable functional/no-let, functional/no-expression-statement */ + /* eslint-enable functional/no-let, functional/no-expression-statements */ const firstNonZeroResultDigit = encoded.findIndex((value) => value !== 0); diff --git a/src/lib/format/base64.ts b/src/lib/format/base64.ts index 3243ac5f..e63f9fba 100644 --- a/src/lib/format/base64.ts +++ b/src/lib/format/base64.ts @@ -15,7 +15,7 @@ export const isBase64 = (maybeBase64: string) => maybeBase64.length % base64GroupLength === 0 && !nonBase64Chars.test(maybeBase64); -/* eslint-disable functional/no-expression-statement, functional/immutable-data, @typescript-eslint/no-magic-numbers, no-bitwise, no-plusplus, @typescript-eslint/no-non-null-assertion */ +/* eslint-disable functional/no-expression-statements, functional/immutable-data, @typescript-eslint/no-magic-numbers, no-bitwise, no-plusplus, @typescript-eslint/no-non-null-assertion */ /** * Convert a base64-encoded string to a Uint8Array. @@ -28,7 +28,7 @@ export const isBase64 = (maybeBase64: string) => */ export const base64ToBin = (validBase64: string) => { const lookup = new Uint8Array(123); - // eslint-disable-next-line functional/no-let, functional/no-loop-statement + // eslint-disable-next-line functional/no-let, functional/no-loop-statements for (let i = 0; i < chars.length; i++) { lookup[chars.charCodeAt(i)] = i; } @@ -44,7 +44,7 @@ export const base64ToBin = (validBase64: string) => { const bytes = new Uint8Array(buffer); // eslint-disable-next-line functional/no-let let p = 0; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement + // eslint-disable-next-line functional/no-let, functional/no-loop-statements for (let i = 0; i < stringLength; i += 4) { const encoded1 = lookup[validBase64.charCodeAt(i)]!; const encoded2 = lookup[validBase64.charCodeAt(i + 1)]!; @@ -64,7 +64,7 @@ export const base64ToBin = (validBase64: string) => { export const binToBase64 = (bytes: Uint8Array) => { // eslint-disable-next-line functional/no-let let result = ''; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement + // eslint-disable-next-line functional/no-let, functional/no-loop-statements for (let i = 0; i < bytes.length; i += 3) { result += chars[bytes[i]! >> 2]; result += chars[((bytes[i]! & 3) << 4) | (bytes[i + 1]! >> 4)]; @@ -75,8 +75,8 @@ export const binToBase64 = (bytes: Uint8Array) => { bytes.length % 3 === 2 ? `${result.substring(0, result.length - 1)}=` : bytes.length % 3 === 1 - ? `${result.substring(0, result.length - 2)}==` - : result; + ? `${result.substring(0, result.length - 2)}==` + : result; return padded; }; -/* eslint-enable functional/no-expression-statement, functional/immutable-data, @typescript-eslint/no-magic-numbers, no-bitwise, no-plusplus, @typescript-eslint/no-non-null-assertion */ +/* eslint-enable functional/no-expression-statements, functional/immutable-data, @typescript-eslint/no-magic-numbers, no-bitwise, no-plusplus, @typescript-eslint/no-non-null-assertion */ diff --git a/src/lib/format/bin-string.spec.ts b/src/lib/format/bin-string.spec.ts index 944585ee..3e7ffd60 100644 --- a/src/lib/format/bin-string.spec.ts +++ b/src/lib/format/bin-string.spec.ts @@ -1,8 +1,9 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { binStringToBin, binToBinString, isBinString } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + test('isBinString', (t) => { t.deepEqual(isBinString('0'), false); t.deepEqual(isBinString('01'), false); @@ -28,6 +29,6 @@ testProp( (t, input) => t.deepEqual( binToBinString(binStringToBin(binToBinString(input))), - binToBinString(input) - ) + binToBinString(input), + ), ); diff --git a/src/lib/format/bin-string.ts b/src/lib/format/bin-string.ts index 5cde5b3d..b65d699a 100644 --- a/src/lib/format/bin-string.ts +++ b/src/lib/format/bin-string.ts @@ -18,8 +18,8 @@ const binary = 2; export const binStringToBin = (binaryDigits: string) => Uint8Array.from( splitEvery(binaryDigits, binaryByteWidth).map((byteString) => - parseInt(byteString, binary) - ) + parseInt(byteString, binary), + ), ); /** @@ -32,7 +32,7 @@ export const binStringToBin = (binaryDigits: string) => export const binToBinString = (bytes: Uint8Array) => bytes.reduce( (str, byte) => str + byte.toString(binary).padStart(binaryByteWidth, '0'), - '' + '', ); /** diff --git a/src/lib/format/error.ts b/src/lib/format/error.ts index 784be5d3..cbf52dcd 100644 --- a/src/lib/format/error.ts +++ b/src/lib/format/error.ts @@ -34,9 +34,9 @@ export const formatError = (errorType: string, errorDetails?: string) => export const unknownValue = ( value: never, message = `Received an unknown value: ${String( - value - )}. This should have been caught by TypeScript - are your types correct?` + value, + )}. This should have been caught by TypeScript - are your types correct?`, ) => { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error(message); }; diff --git a/src/lib/format/hex.spec.ts b/src/lib/format/hex.spec.ts index 4e74880d..5ea1e107 100644 --- a/src/lib/format/hex.spec.ts +++ b/src/lib/format/hex.spec.ts @@ -1,4 +1,3 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { @@ -10,6 +9,8 @@ import { swapEndianness, } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + test('range', (t) => { t.deepEqual(range(3), [0, 1, 2]); t.deepEqual(range(3, 1), [1, 2, 3]); @@ -31,18 +32,18 @@ test('isHex', (t) => { test('hexToBin', (t) => { t.deepEqual( hexToBin('0001022a646566ff'), - Uint8Array.from([0, 1, 2, 42, 100, 101, 102, 255]) + Uint8Array.from([0, 1, 2, 42, 100, 101, 102, 255]), ); t.deepEqual( hexToBin('0001022A646566FF'), - Uint8Array.from([0, 1, 2, 42, 100, 101, 102, 255]) + Uint8Array.from([0, 1, 2, 42, 100, 101, 102, 255]), ); }); test('binToHex', (t) => { t.deepEqual( binToHex(Uint8Array.from([0, 1, 2, 42, 100, 101, 102, 255])), - '0001022a646566ff' + '0001022a646566ff', ); }); @@ -50,7 +51,7 @@ testProp( '[fast-check] hexToBin <-> binToHex', [fc.uint8Array({ maxLength: 100, minLength: 0 })], (t, input) => - t.deepEqual(binToHex(hexToBin(binToHex(input))), binToHex(input)) + t.deepEqual(binToHex(hexToBin(binToHex(input))), binToHex(input)), ); test('swapEndianness', (t) => { diff --git a/src/lib/format/hex.ts b/src/lib/format/hex.ts index 6a4e826b..696934ae 100644 --- a/src/lib/format/hex.ts +++ b/src/lib/format/hex.ts @@ -39,8 +39,8 @@ const hexadecimal = 16; export const hexToBin = (validHex: string) => Uint8Array.from( splitEvery(validHex, hexByteWidth).map((byte) => - parseInt(byte, hexadecimal) - ) + parseInt(byte, hexadecimal), + ), ); /** @@ -61,7 +61,7 @@ export const isHex = (maybeHex: string) => export const binToHex = (bytes: Uint8Array) => bytes.reduce( (str, byte) => str + byte.toString(hexadecimal).padStart(hexByteWidth, '0'), - '' + '', ); /** @@ -77,12 +77,12 @@ export const swapEndianness = (validHex: string) => * Reduce an array of `Uint8Array`s into a single `Uint8Array`. * @param array - the array of `Uint8Array`s to flatten */ -export const flattenBinArray = (array: readonly Uint8Array[]) => { +export const flattenBinArray = (array: Uint8Array[]) => { const totalLength = array.reduce((total, bin) => total + bin.length, 0); const flattened = new Uint8Array(totalLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements array.reduce((index, bin) => { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements flattened.set(bin, index); return index + bin.length; }, 0); @@ -99,7 +99,7 @@ export const binsAreEqual = (a: Uint8Array, b: Uint8Array) => { if (a.length !== b.length) { return false; } - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let i = 0; i < a.length; i++) { if (a[i] !== b[i]) { return false; diff --git a/src/lib/format/log.spec.ts b/src/lib/format/log.spec.ts index 8b76a13a..aa96819f 100644 --- a/src/lib/format/log.spec.ts +++ b/src/lib/format/log.spec.ts @@ -8,20 +8,20 @@ test('stringify', (t) => { t.deepEqual(stringify(Uint8Array.of(32, 32)), '""'); t.deepEqual( stringify({ b: Uint8Array.of(32, 32) }), - '{\n "b": ""\n}' + '{\n "b": ""\n}', ); t.deepEqual( stringify((x: number) => x * 2), - '" x * 2>"' + '" x * 2>"', ); t.deepEqual( stringify({ c: (x: number) => x * 2 }), - '{\n "c": " x * 2>"\n}' + '{\n "c": " x * 2>"\n}', ); t.deepEqual(stringify(Symbol('A')), '""'); t.deepEqual( stringify({ d: Symbol('A') }), - '{\n "d": ""\n}' + '{\n "d": ""\n}', ); }); @@ -33,7 +33,7 @@ test('sortObjectKeys', (t) => { b: { ...{ c: 1 }, a: 2, b: null }, ...{ a: Uint8Array.of(2), c: Uint8Array.of(3) }, }), - { a: Uint8Array.of(2), b: { a: 2, b: null, c: 1 }, c: Uint8Array.of(3) } + { a: Uint8Array.of(2), b: { a: 2, b: null, c: 1 }, c: Uint8Array.of(3) }, ); const func = (x: number) => x * 2; t.deepEqual(sortObjectKeys(func), func); @@ -46,7 +46,12 @@ test('sortObjectKeys', (t) => { { b: Uint8Array.of(1), ...{ a: Uint8Array.of(2), c: Uint8Array.of(3) } }, 1, ]), - [3, 2, { a: Uint8Array.of(2), b: Uint8Array.of(1), c: Uint8Array.of(3) }, 1] + [ + 3, + 2, + { a: Uint8Array.of(2), b: Uint8Array.of(1), c: Uint8Array.of(3) }, + 1, + ], ); }); @@ -73,6 +78,6 @@ test('stringifyTestVector', (t) => { } ] }`, - one + one, ); }); diff --git a/src/lib/format/log.ts b/src/lib/format/log.ts index 4a92ec56..579145c1 100644 --- a/src/lib/format/log.ts +++ b/src/lib/format/log.ts @@ -47,7 +47,7 @@ export const stringify = (value: any, spacing = defaultStringifySpacing) => return item; } }, - spacing + spacing, ); /** @@ -57,11 +57,10 @@ export const stringify = (value: any, spacing = defaultStringifySpacing) => * @param objectOrArray - the object or array in which to sort object keys */ export const sortObjectKeys = ( - objectOrArray: unknown + objectOrArray: unknown, // eslint-disable-next-line @typescript-eslint/no-explicit-any ): any => { if (Array.isArray(objectOrArray)) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return return objectOrArray.map(sortObjectKeys); } if ( @@ -73,7 +72,7 @@ export const sortObjectKeys = ( } // eslint-disable-next-line functional/immutable-data const keys = Object.keys(objectOrArray).sort((a, b) => - a.localeCompare(b, 'en') + a.localeCompare(b, 'en'), ); return keys.reduce( (all, key) => ({ @@ -81,7 +80,7 @@ export const sortObjectKeys = ( // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment [key]: sortObjectKeys((objectOrArray as { [key: string]: unknown })[key]), }), - {} + {}, ); }; @@ -106,7 +105,7 @@ const bigIntRegex = /"[0-9]*)n>"/gu; export const stringifyTestVector = ( // eslint-disable-next-line @typescript-eslint/no-explicit-any value: any, - alphabetize = true + alphabetize = true, ) => { const stringified = alphabetize ? stringify(sortObjectKeys(value)) diff --git a/src/lib/format/number.bench.ts b/src/lib/format/number.bench.ts index 098dcb82..6e147ff1 100644 --- a/src/lib/format/number.bench.ts +++ b/src/lib/format/number.bench.ts @@ -3,7 +3,6 @@ import { randomBytes } from 'crypto'; import test from 'ava'; -import suite from 'chuhai'; import { bigIntToBinUint64LE, @@ -19,6 +18,8 @@ import { numberToBinUint32LEClamped, } from '../lib.js'; +import suite from 'chuhai'; + test(`node: binToBigIntUintBE vs. binToHex -> BigInt()`, async (t) => { await suite(t.title, (s) => { let sourceBin: Uint8Array; diff --git a/src/lib/format/number.spec.ts b/src/lib/format/number.spec.ts index 3fe56062..238915bb 100644 --- a/src/lib/format/number.spec.ts +++ b/src/lib/format/number.spec.ts @@ -1,4 +1,3 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { @@ -37,6 +36,8 @@ import { readCompactUintMinimal, } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + test('numberToBinUint16LE', (t) => { t.deepEqual(numberToBinUint16LE(0), Uint8Array.from([0, 0])); t.deepEqual(numberToBinUint16LE(1), Uint8Array.from([1, 0])); @@ -52,11 +53,11 @@ test('numberToBinUint16BE', (t) => { test('numberToBinUint16LE vs. numberToBinUint16LEClamped: behavior on overflow', (t) => { t.deepEqual( numberToBinUint16LE(0x01_0000), - numberToBinUint16LE(0x01_0000 % (0xffff + 1)) + numberToBinUint16LE(0x01_0000 % (0xffff + 1)), ); t.deepEqual( numberToBinUint16LEClamped(0x01_0000), - Uint8Array.from([0xff, 0xff]) + Uint8Array.from([0xff, 0xff]), ); }); @@ -71,7 +72,7 @@ test('numberToBinUint32LE', (t) => { t.deepEqual(numberToBinUint32LE(0x1234), Uint8Array.from([0x34, 0x12, 0, 0])); t.deepEqual( numberToBinUint32LE(0x12345678), - Uint8Array.from([0x78, 0x56, 0x34, 0x12]) + Uint8Array.from([0x78, 0x56, 0x34, 0x12]), ); }); @@ -81,18 +82,18 @@ test('numberToBinUint32BE', (t) => { t.deepEqual(numberToBinUint32BE(0x1234), Uint8Array.from([0, 0, 0x12, 0x34])); t.deepEqual( numberToBinUint32BE(0x12345678), - Uint8Array.from([0x12, 0x34, 0x56, 0x78]) + Uint8Array.from([0x12, 0x34, 0x56, 0x78]), ); }); test('numberToBinUint32LE vs. numberToBinUint32LEClamped: behavior on overflow', (t) => { t.deepEqual( numberToBinUint32LE(0x01_0000_0000), - numberToBinUint32LE(0x01_0000_0000 % (0xffffffff + 1)) + numberToBinUint32LE(0x01_0000_0000 % (0xffffffff + 1)), ); t.deepEqual( numberToBinUint32LEClamped(0x01_0000_0000), - Uint8Array.from([0xff, 0xff, 0xff, 0xff]) + Uint8Array.from([0xff, 0xff, 0xff, 0xff]), ); }); @@ -104,7 +105,7 @@ test('numberToBinUint32LE: behavior on negative numbers', (t) => { test('numberToBinUintLE', (t) => { t.deepEqual( numberToBinUintLE(Number.MAX_SAFE_INTEGER), - Uint8Array.from([255, 255, 255, 255, 255, 255, 31]) + Uint8Array.from([255, 255, 255, 255, 255, 255, 31]), ); }); @@ -121,15 +122,15 @@ test('numberToBinInt32LE', (t) => { t.deepEqual(numberToBinInt32LE(0x1234), Uint8Array.from([0x34, 0x12, 0, 0])); t.deepEqual( numberToBinInt32LE(-0x1234), - Uint8Array.from([0xcc, 0xed, 0xff, 0xff]) + Uint8Array.from([0xcc, 0xed, 0xff, 0xff]), ); t.deepEqual( numberToBinUint32LE(0x12345678), - Uint8Array.from([0x78, 0x56, 0x34, 0x12]) + Uint8Array.from([0x78, 0x56, 0x34, 0x12]), ); t.deepEqual( numberToBinInt32LE(-0x12345678), - Uint8Array.from([0x88, 0xa9, 0xcb, 0xed]) + Uint8Array.from([0x88, 0xa9, 0xcb, 0xed]), ); }); @@ -138,83 +139,83 @@ test('numberToBinInt32TwosCompliment', (t) => { t.deepEqual(numberToBinInt32TwosCompliment(1), Uint8Array.from([1, 0, 0, 0])); t.deepEqual( numberToBinInt32TwosCompliment(-0xffffffff), - Uint8Array.from([1, 0, 0, 0]) + Uint8Array.from([1, 0, 0, 0]), ); t.deepEqual( numberToBinInt32TwosCompliment(0xffffffff), - Uint8Array.from([255, 255, 255, 255]) + Uint8Array.from([255, 255, 255, 255]), ); t.deepEqual( numberToBinInt32TwosCompliment(-1), - Uint8Array.from([255, 255, 255, 255]) + Uint8Array.from([255, 255, 255, 255]), ); t.deepEqual( numberToBinInt32TwosCompliment(0xffff), - Uint8Array.from([255, 255, 0, 0]) + Uint8Array.from([255, 255, 0, 0]), ); t.deepEqual( numberToBinInt32TwosCompliment(-0xffff), - Uint8Array.from([1, 0, 255, 255]) + Uint8Array.from([1, 0, 255, 255]), ); t.deepEqual( numberToBinInt32TwosCompliment(1234567890), - Uint8Array.from([210, 2, 150, 73]) + Uint8Array.from([210, 2, 150, 73]), ); t.deepEqual( numberToBinInt32TwosCompliment(-1234567890), - Uint8Array.from([46, 253, 105, 182]) + Uint8Array.from([46, 253, 105, 182]), ); }); test('bigIntToBinUint64LE', (t) => { t.deepEqual( bigIntToBinUint64LE(0n), - Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]) + Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]), ); t.deepEqual( bigIntToBinUint64LE(0x01n), - Uint8Array.from([0x01, 0, 0, 0, 0, 0, 0, 0]) + Uint8Array.from([0x01, 0, 0, 0, 0, 0, 0, 0]), ); t.deepEqual( bigIntToBinUint64LE(0x12345678n), - Uint8Array.from([0x78, 0x56, 0x34, 0x12, 0, 0, 0, 0]) + Uint8Array.from([0x78, 0x56, 0x34, 0x12, 0, 0, 0, 0]), ); t.deepEqual( bigIntToBinUint64LE(BigInt(Number.MAX_SAFE_INTEGER)), - Uint8Array.from([255, 255, 255, 255, 255, 255, 31, 0]) + Uint8Array.from([255, 255, 255, 255, 255, 255, 31, 0]), ); t.deepEqual( bigIntToBinUint64LE(0xffffffffffffffffn), - Uint8Array.from([255, 255, 255, 255, 255, 255, 255, 255]) + Uint8Array.from([255, 255, 255, 255, 255, 255, 255, 255]), ); }); test('bigIntToBinUint64LE vs. bigIntToBinUint64LEClamped: behavior on overflow', (t) => { t.deepEqual( bigIntToBinUint64LE(0x010000000000000000n), - bigIntToBinUint64LE(0x010000000000000000n % (0xffffffffffffffffn + 1n)) + bigIntToBinUint64LE(0x010000000000000000n % (0xffffffffffffffffn + 1n)), ); t.deepEqual( bigIntToBinUint64LEClamped(0x010000000000000000n), - Uint8Array.from([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]) + Uint8Array.from([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]), ); }); test('bigIntToBinUint64LE vs. bigIntToBinUint64LEClamped: behavior on negative numbers', (t) => { t.deepEqual( bigIntToBinUint64LE(-1n), - Uint8Array.from([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]) + Uint8Array.from([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]), ); t.deepEqual( bigIntToBinUint64LEClamped(-1n), - Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]) + Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]), ); }); test('bigIntToCompactUint: larger values return modulo result after opcode', (t) => { t.deepEqual( bigIntToCompactUint(0x010000000000000001n), - Uint8Array.from([0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + Uint8Array.from([0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), ); }); @@ -223,15 +224,15 @@ test('binToNumberUintLE', (t) => { t.deepEqual(binToNumberUintLE(Uint8Array.from([0x34, 0x12])), 0x1234); t.deepEqual( binToNumberUintLE(Uint8Array.from([0x78, 0x56, 0x34, 0x12])), - 0x12345678 + 0x12345678, ); t.deepEqual( binToNumberUintLE(Uint8Array.from([0x90, 0x78, 0x56, 0x34, 0x12])), - 0x1234567890 + 0x1234567890, ); t.deepEqual( binToNumberUintLE(Uint8Array.from([255, 255, 255, 255, 255, 255, 31])), - Number.MAX_SAFE_INTEGER + Number.MAX_SAFE_INTEGER, ); t.deepEqual(binToNumberUintLE(Uint8Array.from([0x56, 0x34, 0x12])), 0x123456); const data = Uint8Array.from([0x90, 0x78, 0x56, 0x34, 0x12]); @@ -246,7 +247,7 @@ testProp( '[fast-check] numberToBinUintLE <-> binToNumberUintLE', [fc.integer({ max: Number.MAX_SAFE_INTEGER, min: 0 })], (t, maxSafeInt) => - t.deepEqual(binToNumberUintLE(numberToBinUintLE(maxSafeInt)), maxSafeInt) + t.deepEqual(binToNumberUintLE(numberToBinUintLE(maxSafeInt)), maxSafeInt), ); test('binToNumberUint16LE', (t) => { @@ -264,26 +265,26 @@ test('binToNumberInt16LE', (t) => { test('binToNumberInt32LE', (t) => { t.deepEqual( binToNumberInt32LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12])), - 0x12345678 + 0x12345678, ); t.deepEqual( binToNumberInt32LE(Uint8Array.from([0x88, 0xa9, 0xcb, 0xed])), - -0x12345678 + -0x12345678, ); }); test('binToNumberUint16LE: ignores bytes after the 2nd', (t) => { t.deepEqual( binToNumberUint16LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12, 0xff])), - 0x5678 + 0x5678, ); }); test('binToNumberUint32LE', (t) => { t.deepEqual( binToNumberUint32LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12])), - 0x12345678 + 0x12345678, ); const data = Uint8Array.from([0x90, 0x78, 0x56, 0x34, 0x12, 0x00]); const view = data.subarray(2); @@ -293,7 +294,7 @@ test('binToNumberUint32LE', (t) => { test('binToNumberUint32LE: ignores bytes after the 4th', (t) => { t.deepEqual( binToNumberUint32LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12, 0xff])), - 0x12345678 + 0x12345678, ); }); @@ -302,25 +303,25 @@ test('binToBigIntUintBE', (t) => { t.deepEqual(binToBigIntUintBE(Uint8Array.from([0x12, 0x34])), 0x1234n); t.deepEqual( binToBigIntUintBE(Uint8Array.from([0x12, 0x34, 0x56])), - 0x123456n + 0x123456n, ); t.deepEqual( binToBigIntUintBE(Uint8Array.from([0x12, 0x34, 0x56, 0x78])), - 0x12345678n + 0x12345678n, ); t.deepEqual( binToBigIntUintBE(Uint8Array.from([0x12, 0x34, 0x56, 0x78, 0x90])), - 0x1234567890n + 0x1234567890n, ); t.deepEqual( binToBigIntUintBE( - Uint8Array.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef]) + Uint8Array.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef]), ), - 0x1234567890abcdefn + 0x1234567890abcdefn, ); t.deepEqual( binToBigIntUintBE(Uint8Array.from([0x56, 0x78, 0x90, 0xab, 0xcd, 0xef])), - 0x567890abcdefn + 0x567890abcdefn, ); const d = Uint8Array.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef]); const view = d.subarray(2); @@ -347,7 +348,7 @@ test('binToBigIntUint256BE and bigIntToBinUint256BEClamped', (t) => { overMax[0] = 255; t.deepEqual( bigIntToBinUint256BEClamped(BigInt(`0x${binToHex(overMax)}`)), - max + max, ); }); @@ -357,8 +358,8 @@ testProp( (t, uint256) => t.deepEqual( binToBigIntUint256BE(bigIntToBinUint256BEClamped(uint256)), - uint256 - ) + uint256, + ), ); test('binToBigIntUintLE', (t) => { @@ -366,25 +367,25 @@ test('binToBigIntUintLE', (t) => { t.deepEqual(binToBigIntUintLE(Uint8Array.from([0x34, 0x12])), 0x1234n); t.deepEqual( binToBigIntUintLE(Uint8Array.from([0x56, 0x34, 0x12])), - 0x123456n + 0x123456n, ); t.deepEqual( binToBigIntUintLE(Uint8Array.from([0x78, 0x56, 0x34, 0x12])), - 0x12345678n + 0x12345678n, ); t.deepEqual( binToBigIntUintLE(Uint8Array.from([0x90, 0x78, 0x56, 0x34, 0x12])), - 0x1234567890n + 0x1234567890n, ); t.deepEqual( binToBigIntUintLE( - Uint8Array.from([0xef, 0xcd, 0xab, 0x90, 0x78, 0x56, 0x34, 0x12]) + Uint8Array.from([0xef, 0xcd, 0xab, 0x90, 0x78, 0x56, 0x34, 0x12]), ), - 0x1234567890abcdefn + 0x1234567890abcdefn, ); t.deepEqual( binToBigIntUintLE(Uint8Array.from([0xab, 0x90, 0x78, 0x56, 0x34, 0x12])), - 0x1234567890abn + 0x1234567890abn, ); const d = Uint8Array.from([0xef, 0xcd, 0xab, 0x90, 0x78, 0x56, 0x34, 0x12]); const view = d.subarray(2); @@ -401,40 +402,40 @@ testProp( const bin = bigIntToBinUintLE(uint256); const binReverse = bin.slice().reverse(); t.deepEqual(binToBigIntUintBE(binReverse), binToBigIntUintLE(bin)); - } + }, ); testProp( '[fast-check] bigIntToBinUintLE <-> binToBigIntUintLE', [fc.bigUintN(65)], (t, uint65) => - t.deepEqual(binToBigIntUintLE(bigIntToBinUintLE(uint65)), uint65) + t.deepEqual(binToBigIntUintLE(bigIntToBinUintLE(uint65)), uint65), ); test('binToBigIntUint64LE', (t) => { t.deepEqual( binToBigIntUint64LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12, 0, 0, 0, 0])), - 0x12345678n + 0x12345678n, ); t.deepEqual( binToBigIntUint64LE( - Uint8Array.from([0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01]) + Uint8Array.from([0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01]), ), - 0x0123456789abcdefn + 0x0123456789abcdefn, ); t.deepEqual( binToBigIntUint64LE( Uint8Array.from([ 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x00, 0x00, - ]) + ]), ), - 0x0123456789abcdefn + 0x0123456789abcdefn, ); const data = Uint8Array.from([0x90, 0x78, 0x56, 0x34, 0x12, 0, 0, 0, 0, 0]); const view = data.subarray(2); t.deepEqual(binToBigIntUint64LE(view), 0x123456n); t.throws(() => - binToBigIntUint64LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12])) + binToBigIntUint64LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12])), ); }); @@ -457,14 +458,14 @@ test('readCompactUint', (t) => { }); t.deepEqual( readCompactUint({ bin: Uint8Array.from([253, 0, 0]), index: 0 }), - { position: { bin: Uint8Array.from([253, 0, 0]), index: 3 }, result: 0n } + { position: { bin: Uint8Array.from([253, 0, 0]), index: 3 }, result: 0n }, ); t.deepEqual( readCompactUint({ bin: Uint8Array.from([254, 0, 0, 0, 0]), index: 0 }), { position: { bin: Uint8Array.from([254, 0, 0, 0, 0]), index: 5 }, result: 0n, - } + }, ); t.deepEqual( readCompactUint({ @@ -477,18 +478,18 @@ test('readCompactUint', (t) => { index: 9, }, result: 0n, - } + }, ); t.deepEqual( readCompactUint({ bin: Uint8Array.from([253, 253, 0]), index: 0 }), { position: { bin: Uint8Array.from([253, 253, 0]), index: 3 }, result: 253n, - } + }, ); t.deepEqual( readCompactUint({ bin: Uint8Array.from([]), index: 0 }), - CompactUintError.noPrefix + CompactUintError.noPrefix, ); }); @@ -499,7 +500,7 @@ test('readCompactUintMinimal', (t) => { }); t.deepEqual( readCompactUintMinimal({ bin: Uint8Array.from([253, 1, 0]), index: 0 }), - `${CompactUintError.nonMinimal} Value: 1, encoded length: 3, canonical length: 1` + `${CompactUintError.nonMinimal} Value: 1, encoded length: 3, canonical length: 1`, ); }); @@ -508,18 +509,18 @@ test('compactUintToBigInt', (t) => { t.deepEqual(compactUintToBigInt(Uint8Array.from([253, 253, 0])), 253n); t.deepEqual( compactUintToBigInt(Uint8Array.from([253])), - 'Error reading CompactUint: insufficient bytes. CompactUint prefix 253 requires at least 3 bytes. Remaining bytes: 1' + 'Error reading CompactUint: insufficient bytes. CompactUint prefix 253 requires at least 3 bytes. Remaining bytes: 1', ); t.deepEqual( compactUintToBigInt(Uint8Array.from([253, 0, 254, 0])), - 'Error decoding CompactUint: unexpected bytes after CompactUint. CompactUint ends at index 3, but input includes 4 bytes.' + 'Error decoding CompactUint: unexpected bytes after CompactUint. CompactUint ends at index 3, but input includes 4 bytes.', ); }); const compactUintVector = test.macro< [string, bigint, number, number?, string?] >({ - // eslint-disable-next-line max-params + // eslint-disable-next-line @typescript-eslint/max-params exec: (t, hex, value, nextIndex, start = 0, expected = hex) => { t.deepEqual(readCompactUint({ bin: hexToBin(hex), index: start }), { position: { bin: hexToBin(hex), index: nextIndex }, @@ -560,7 +561,7 @@ test( 0x0100000000n, 11, 2, - 'ff0000000001000000' + 'ff0000000001000000', ); test(compactUintVector, 'ff0100000001000000', 0x0100000001n, 9); test(compactUintVector, 'ff1111111111111111', 0x1111111111111111n, 9); @@ -573,7 +574,7 @@ testProp( const compactUint = bigIntToCompactUint(uint64); const result = compactUintToBigInt(compactUint); t.deepEqual(result, uint64); - } + }, ); test('int32SignedToUnsigned/int32UnsignedToSigned', (t) => { @@ -592,5 +593,5 @@ testProp( const signed = int32UnsignedToSigned(uint32); const unsigned = int32SignedToUnsigned(signed); t.deepEqual(unsigned, uint32); - } + }, ); diff --git a/src/lib/format/number.ts b/src/lib/format/number.ts index c78fe1f5..96669b77 100644 --- a/src/lib/format/number.ts +++ b/src/lib/format/number.ts @@ -14,14 +14,14 @@ export const numberToBinUintLE = (value: number) => { const result: number[] = []; // eslint-disable-next-line functional/no-let let remaining = value; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (remaining >= baseUint8Array) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data result.push(remaining % baseUint8Array); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements remaining = Math.floor(remaining / baseUint8Array); } - // eslint-disable-next-line functional/no-conditional-statement, functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-conditional-statements, functional/no-expression-statements, functional/immutable-data if (remaining > 0) result.push(remaining); return Uint8Array.from(result); }; @@ -36,7 +36,7 @@ export const numberToBinUintLE = (value: number) => { export const binToFixedLength = (bin: Uint8Array, bytes: number) => { const fixedBytes = new Uint8Array(bytes); const maxValue = 255; - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements, @typescript-eslint/no-unused-expressions bin.length > bytes ? fixedBytes.fill(maxValue) : fixedBytes.set(bin); return fixedBytes; }; @@ -79,7 +79,7 @@ export const numberToBinUint16LE = (value: number) => { const bin = new Uint8Array(uint16Length); const writeAsLittleEndian = true; const view = new DataView(bin.buffer, bin.byteOffset, bin.byteLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements view.setUint16(0, value, writeAsLittleEndian); return bin; }; @@ -98,7 +98,7 @@ export const numberToBinInt16LE = (value: number) => { const bin = new Uint8Array(int16Length); const writeAsLittleEndian = true; const view = new DataView(bin.buffer, bin.byteOffset, bin.byteLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements view.setInt16(0, value, writeAsLittleEndian); return bin; }; @@ -117,7 +117,7 @@ export const numberToBinInt32LE = (value: number) => { const bin = new Uint8Array(int32Length); const writeAsLittleEndian = true; const view = new DataView(bin.buffer, bin.byteOffset, bin.byteLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements view.setInt32(0, value, writeAsLittleEndian); return bin; }; @@ -162,7 +162,7 @@ export const numberToBinUint16BE = (value: number) => { const bin = new Uint8Array(uint16Length); const writeAsLittleEndian = false; const view = new DataView(bin.buffer, bin.byteOffset, bin.byteLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements view.setUint16(0, value, writeAsLittleEndian); return bin; }; @@ -181,7 +181,7 @@ export const numberToBinUint32LE = (value: number) => { const bin = new Uint8Array(uint32Length); const writeAsLittleEndian = true; const view = new DataView(bin.buffer, bin.byteOffset, bin.byteLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements view.setUint32(0, value, writeAsLittleEndian); return bin; }; @@ -200,7 +200,7 @@ export const numberToBinUint32BE = (value: number) => { const bin = new Uint8Array(uint32Length); const writeAsLittleEndian = false; const view = new DataView(bin.buffer, bin.byteOffset, bin.byteLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements view.setUint32(0, value, writeAsLittleEndian); return bin; }; @@ -217,14 +217,14 @@ export const bigIntToBinUintLE = (value: bigint) => { const result: number[] = []; // eslint-disable-next-line functional/no-let let remaining = value; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (remaining >= base) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data result.push(Number(remaining % base)); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements remaining /= base; } - // eslint-disable-next-line functional/no-conditional-statement, functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-conditional-statements, functional/no-expression-statements, functional/immutable-data if (remaining > 0n) result.push(Number(remaining)); return Uint8Array.from(result.length > 0 ? result : [0]); @@ -274,11 +274,11 @@ export const numberToBinInt32TwosCompliment = (value: number) => { const bytes = 4; const bitsInAByte = 8; const bin = new Uint8Array(bytes); - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let index = 0; index < bytes; index++) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data bin[index] = value; - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, no-param-reassign + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, no-param-reassign value >>>= bitsInAByte; } return bin; @@ -305,12 +305,12 @@ export const binToNumberUintLE = (bin: Uint8Array, bytes = bin.length) => { const bitsInAByte = 8; if (bin.length !== bytes) { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new TypeError(`Bin length must be ${bytes}.`); } return new Uint8Array(bin.buffer, bin.byteOffset, bin.length).reduce( (accumulated, byte, i) => accumulated + byte * base ** (bitsInAByte * i), - 0 + 0, ); }; @@ -358,13 +358,13 @@ export const binToBigIntUintBE = (bin: Uint8Array, bytes = bin.length) => { const shift = BigInt(bitsInAByte); if (bin.length !== bytes) { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new TypeError(`Bin length must be ${bytes}.`); } return new Uint8Array(bin.buffer, bin.byteOffset, bin.length).reduce( // eslint-disable-next-line no-bitwise (accumulated, byte) => (accumulated << shift) | BigInt(byte), - 0n + 0n, ); }; @@ -413,13 +413,13 @@ export const binToBigIntUintLE = (bin: Uint8Array, bytes = bin.length) => { const bitsInAByte = 8; if (bin.length !== bytes) { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new TypeError(`Bin length must be ${bytes}.`); } return new Uint8Array(bin.buffer, bin.byteOffset, bin.length).reduceRight( // eslint-disable-next-line no-bitwise (accumulated, byte) => (accumulated << BigInt(bitsInAByte)) | BigInt(byte), - 0n + 0n, ); }; @@ -505,7 +505,7 @@ export enum CompactUintError { * `CompactUint` */ export const readCompactUint = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const { bin, index } = position; const prefix = bin[index]; @@ -518,7 +518,7 @@ export const readCompactUint = ( CompactUintError.insufficientBytes, `CompactUint prefix ${prefix} requires at least ${bytes} bytes. Remaining bytes: ${ bin.length - index - }` + }`, ); } const hasPrefix = bytes !== 1; @@ -548,19 +548,19 @@ export const bigIntToCompactUint = (value: bigint) => value <= BigInt(CompactUint.uint8MaxValue) ? Uint8Array.of(Number(value)) : value <= BigInt(CompactUint.uint16MaxValue) - ? Uint8Array.from([ - CompactUint.uint16Prefix, - ...numberToBinUint16LE(Number(value)), - ]) - : value <= BigInt(CompactUint.uint32MaxValue) - ? Uint8Array.from([ - CompactUint.uint32Prefix, - ...numberToBinUint32LE(Number(value)), - ]) - : Uint8Array.from([ - CompactUint.uint64Prefix, - ...bigIntToBinUint64LE(value), - ]); + ? Uint8Array.from([ + CompactUint.uint16Prefix, + ...numberToBinUint16LE(Number(value)), + ]) + : value <= BigInt(CompactUint.uint32MaxValue) + ? Uint8Array.from([ + CompactUint.uint32Prefix, + ...numberToBinUint32LE(Number(value)), + ]) + : Uint8Array.from([ + CompactUint.uint64Prefix, + ...bigIntToBinUint64LE(value), + ]); /** * Read a minimally-encoded `CompactUint` from the provided @@ -571,7 +571,7 @@ export const bigIntToCompactUint = (value: bigint) => * `CompactUint` */ export const readCompactUintMinimal = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const read = readCompactUint(position); if (typeof read === 'string') { @@ -584,7 +584,7 @@ export const readCompactUintMinimal = ( CompactUintError.nonMinimal, `Value: ${read.result.toString()}, encoded length: ${readLength}, canonical length: ${ canonicalEncoding.length - }` + }`, ); } return read; @@ -607,7 +607,7 @@ export const compactUintToBigInt = (bin: Uint8Array) => { if (read.position.index !== bin.length) { return formatError( CompactUintError.excessiveBytes, - `CompactUint ends at index ${read.position.index}, but input includes ${bin.length} bytes.` + `CompactUint ends at index ${read.position.index}, but input includes ${bin.length} bytes.`, ); } return read.result; diff --git a/src/lib/format/read.spec.ts b/src/lib/format/read.spec.ts index 2cebb044..228ad819 100644 --- a/src/lib/format/read.spec.ts +++ b/src/lib/format/read.spec.ts @@ -17,7 +17,7 @@ test('readMultiple', (t) => { Uint8Array.from([0]), Uint8Array.from([1, 2, 3]), ], - } + }, ); t.deepEqual( readMultiple({ bin: Uint8Array.from([0, 1, 2, 3, 4]), index: 0 }, [ @@ -26,7 +26,7 @@ test('readMultiple', (t) => { readBytes(3), readBytes(2), ]), - 'Error reading bytes: insufficient length. Provided length: 1' + 'Error reading bytes: insufficient length. Provided length: 1', ); }); @@ -34,39 +34,39 @@ test('readItemCount', (t) => { t.deepEqual( readItemCount( { bin: Uint8Array.from([0, 1, 2, 3, 4]), index: 0 }, - readBytes(2) + readBytes(2), ), { position: { bin: Uint8Array.from([0, 1, 2, 3, 4]), index: 1 }, result: [], - } + }, ); t.deepEqual( readItemCount( { bin: Uint8Array.from([1, 1, 2, 3, 4]), index: 0 }, - readBytes(2) + readBytes(2), ), { position: { bin: Uint8Array.from([1, 1, 2, 3, 4]), index: 3 }, result: [Uint8Array.from([1, 2])], - } + }, ); t.deepEqual( readItemCount( { bin: Uint8Array.from([2, 1, 2, 3, 4]), index: 0 }, - readBytes(2) + readBytes(2), ), { position: { bin: Uint8Array.from([2, 1, 2, 3, 4]), index: 5 }, result: [Uint8Array.from([1, 2]), Uint8Array.from([3, 4])], - } + }, ); t.deepEqual( readItemCount({ bin: Uint8Array.from([0xfd, 1]), index: 0 }, readBytes(2)), - 'Error reading item count. Error reading CompactUint: insufficient bytes. CompactUint prefix 253 requires at least 3 bytes. Remaining bytes: 2' + 'Error reading item count. Error reading CompactUint: insufficient bytes. CompactUint prefix 253 requires at least 3 bytes. Remaining bytes: 2', ); t.deepEqual( readItemCount({ bin: Uint8Array.from([1, 1]), index: 0 }, readBytes(2)), - 'Error reading item. Error reading bytes: insufficient length. Provided length: 1' + 'Error reading item. Error reading bytes: insufficient length. Provided length: 1', ); }); diff --git a/src/lib/format/read.ts b/src/lib/format/read.ts index 65f2f474..c39168ed 100644 --- a/src/lib/format/read.ts +++ b/src/lib/format/read.ts @@ -6,7 +6,7 @@ import { readCompactUintMinimal } from './number.js'; * `ReadPosition`s are the only input of Libauth's read functions, and each read * function returns a new `ReadPosition` after a successful result. */ -export interface ReadPosition { +export type ReadPosition = { /** * The `Uint8Array` from which bytes are being read. */ @@ -15,13 +15,13 @@ export interface ReadPosition { * The index at which the next byte should be read. */ index: number; -} +}; /** * The successful result of a read function, includes the result and the next * {@link ReadPosition}. */ -export interface ReadResult { +export type ReadResult = { /** * The new read position after the successfully-read bytes. */ @@ -30,7 +30,7 @@ export interface ReadResult { * The successfully-read value. */ result: Type; -} +}; /** * The return type of a read function that may fail. May be a {@link ReadResult} @@ -42,10 +42,10 @@ export type MaybeReadResult = ReadResult | string; * A function that reads some data beginning at a {@link ReadPosition}. */ export type ReadFunction = ( - position: ReadPosition + position: ReadPosition, ) => MaybeReadResult; -type ExtractReadFunctionResults[]> = { +type ExtractReadFunctionResults[]> = { [K in keyof T]: T[K] extends ReadFunction ? V : never; }; @@ -62,20 +62,20 @@ type ExtractReadFunctionResults[]> = { */ export const readMultiple = []>( position: ReadPosition, - readFunctions: [...ReadFunctionList] + readFunctions: [...ReadFunctionList], ): MaybeReadResult> => { // eslint-disable-next-line functional/no-let let nextPosition = position; const results = []; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const readFunction of readFunctions) { const out = readFunction(nextPosition); if (typeof out === 'string') { return out; } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data results.push(out.result); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements nextPosition = out.position; } return { @@ -99,7 +99,7 @@ export enum ReadItemCountError { */ export const readItemCount = ( position: ReadPosition, - readFunction: ReadFunction + readFunction: ReadFunction, ): MaybeReadResult => { const countRead = readCompactUintMinimal(position); if (typeof countRead === 'string') { @@ -108,15 +108,15 @@ export const readItemCount = ( // eslint-disable-next-line functional/no-let let nextPosition = countRead.position; const result: Type[] = []; - // eslint-disable-next-line functional/no-loop-statement, functional/no-let, no-plusplus + // eslint-disable-next-line functional/no-loop-statements, functional/no-let, no-plusplus for (let remaining = Number(countRead.result); remaining > 0; remaining--) { const read = readFunction(nextPosition); if (typeof read === 'string') { return formatError(ReadItemCountError.item, read); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data result.push(read.result); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements nextPosition = read.position; } return { position: nextPosition, result }; diff --git a/src/lib/format/time.spec.ts b/src/lib/format/time.spec.ts index 5f495b53..c9e99f33 100644 --- a/src/lib/format/time.spec.ts +++ b/src/lib/format/time.spec.ts @@ -1,4 +1,3 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { @@ -14,11 +13,13 @@ import { minimumLocktimeTimestamp, } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + test('dateToLocktime', (t) => { t.deepEqual(dateToLocktime(new Date('2019-10-13')), 1570924800); t.deepEqual( dateToLocktime(new Date('2107-01-01')), - LocktimeError.dateOutOfRange + LocktimeError.dateOutOfRange, ); }); @@ -26,7 +27,7 @@ test('dateToLocktimeBin', (t) => { t.deepEqual(dateToLocktimeBin(new Date('2019-10-13')), hexToBin('0069a25d')); t.deepEqual( dateToLocktimeBin(new Date('2107-01-01')), - LocktimeError.dateOutOfRange + LocktimeError.dateOutOfRange, ); }); @@ -37,7 +38,7 @@ test('parseLockTime', (t) => { t.deepEqual(decodeLocktime(hexToBin('00')), LocktimeError.incorrectLength); t.deepEqual( decodeLocktime(hexToBin('0000000000')), - LocktimeError.incorrectLength + LocktimeError.incorrectLength, ); }); @@ -50,7 +51,7 @@ testProp( }), ], (t, timestamp) => - t.deepEqual(dateToLocktime(locktimeToDate(timestamp) as Date), timestamp) + t.deepEqual(dateToLocktime(locktimeToDate(timestamp) as Date), timestamp), ); testProp( @@ -58,15 +59,15 @@ testProp( [fc.date({ max: maximumLocktimeDate, min: minimumLocktimeDate })], (t, date) => { const withSecondResolution = new Date( - Math.round(date.getTime() / 1000) * 1000 + Math.round(date.getTime() / 1000) * 1000, ); t.deepEqual( ( decodeLocktime( - dateToLocktimeBin(withSecondResolution) as Uint8Array + dateToLocktimeBin(withSecondResolution) as Uint8Array, ) as Date ).getTime(), - withSecondResolution.getTime() + withSecondResolution.getTime(), ); - } + }, ); diff --git a/src/lib/format/time.ts b/src/lib/format/time.ts index bd4c0bfc..386002af 100644 --- a/src/lib/format/time.ts +++ b/src/lib/format/time.ts @@ -19,7 +19,7 @@ export const maximumLocktimeTimestamp = 0xffffffff; * `locktime`. */ export const minimumLocktimeDate = new Date( - minimumLocktimeTimestamp * msPerLocktimeSecond + minimumLocktimeTimestamp * msPerLocktimeSecond, ); /** @@ -27,7 +27,7 @@ export const minimumLocktimeDate = new Date( * `locktime`. */ export const maximumLocktimeDate = new Date( - maximumLocktimeTimestamp * msPerLocktimeSecond + maximumLocktimeTimestamp * msPerLocktimeSecond, ); export enum LocktimeError { diff --git a/src/lib/format/type-utils.ts b/src/lib/format/type-utils.ts index 4903843d..1d623f30 100644 --- a/src/lib/format/type-utils.ts +++ b/src/lib/format/type-utils.ts @@ -8,52 +8,18 @@ export type PartialExactOptional = { [P in keyof T]?: T[P] | undefined; }; -export type ImmutablePrimitive = - // eslint-disable-next-line @typescript-eslint/ban-types - Function | boolean | number | string | null | undefined; -export type ImmutableArray = readonly Immutable[]; -export type ImmutableMap = ReadonlyMap, Immutable>; -export type ImmutableSet = ReadonlySet>; -export type ImmutableObject = { - readonly [K in keyof T]: Immutable; -}; -// Derived from: https://www.growingwiththeweb.com/2020/10/typescript-readonly-typed-arrays.html -export interface ImmutableUint8Array - extends Omit { - readonly [n: number]: number; -} - -/** - * A deep-readonly utility type. Supports objects, `Array`s, `Uint8Array`s, - * `Map`s, and `Set`s. - * - * Note: `Uint8Array` is the only supported `TypedArray`. - */ -// Derived from: https://github.com/microsoft/TypeScript/issues/13923#issuecomment-557509399 -export type Immutable = T extends ImmutablePrimitive - ? T - : T extends (infer U)[] - ? ImmutableArray - : T extends Uint8Array - ? ImmutableUint8Array - : T extends Map - ? ImmutableMap - : T extends Set - ? ImmutableSet - : ImmutableObject; - -type FunctionComparisonEqualsWrapped = T extends ( // eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-unused-vars - T extends {} ? infer R & {} : infer R +type FunctionComparisonEqualsWrapped = T extends ( // eslint-disable-next-line @typescript-eslint/ban-types + T extends Readonly<{}> ? infer R & Readonly<{}> : infer R ) ? { [P in keyof R]: R[P]; } : never; type FunctionComparisonEquals = (< - T + T, // eslint-disable-next-line @typescript-eslint/no-magic-numbers >() => T extends FunctionComparisonEqualsWrapped ? 1 : 2) extends < - T + T, // eslint-disable-next-line @typescript-eslint/no-magic-numbers >() => T extends FunctionComparisonEqualsWrapped ? 1 : 2 ? true @@ -61,7 +27,7 @@ type FunctionComparisonEquals = (< // eslint-disable-next-line @typescript-eslint/no-explicit-any type IsAny = FunctionComparisonEquals; -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions, functional/no-mixed-type +// eslint-disable-next-line functional/no-mixed-types type InvariantComparisonEqualsWrapped = { value: T; setValue: (value: T) => never; diff --git a/src/lib/format/utf8.spec.ts b/src/lib/format/utf8.spec.ts index a8b2a9f4..bfcbcf81 100644 --- a/src/lib/format/utf8.spec.ts +++ b/src/lib/format/utf8.spec.ts @@ -1,9 +1,10 @@ -import { testProp } from '@fast-check/ava'; import test from 'ava'; -import fc from 'fast-check'; import { binToUtf8, hexToBin, utf8ToBin } from '../lib.js'; +import { testProp } from '@fast-check/ava'; +import fc from 'fast-check'; + const maxUint8Number = 255; const fcUint8Array = (minLength: number, maxLength: number) => fc @@ -26,5 +27,5 @@ testProp( '[fast-check] utf8ToBin <-> binToUtf8', [fcUint8Array(0, testBinLength)], (t, input) => - t.deepEqual(binToUtf8(utf8ToBin(binToUtf8(input))), binToUtf8(input)) + t.deepEqual(binToUtf8(utf8ToBin(binToUtf8(input))), binToUtf8(input)), ); diff --git a/src/lib/format/utf8.ts b/src/lib/format/utf8.ts index 0d62e38b..d31b4fd3 100644 --- a/src/lib/format/utf8.ts +++ b/src/lib/format/utf8.ts @@ -12,3 +12,55 @@ const utf8Decoder = new TextDecoder(); * @param bytes - the Uint8Array to decode */ export const binToUtf8 = (bytes: Uint8Array) => utf8Decoder.decode(bytes); + +/** + * Normalize a string using Unicode Normalization Form KC (NFKC): compatibility + * decomposition, followed by canonical composition. NFKC is the preferred form + * for applications in which disambiguation between characters is critical. In + * Libauth, all message formats designed for transmission between trust centers + * are NFKC-normalized to hinder exploits in which lookalike characters are used + * to deceive counterparties. + * + * E.g.: + * ``` + * console.log(lossyNormalize('fitπŸš€πŸ‘«πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦')); // 'fitπŸš€πŸ‘«πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦' + * ``` + */ +export const lossyNormalize = (utf8: string) => utf8.normalize('NFKC'); + +/** + * Return the user-perceived character segments of the given string, e.g.: + * + * ```js + * const test = 'fitπŸš€πŸ‘«πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦'; + * console.log([...test]); // '["fi","t","πŸš€","πŸ‘«","πŸ‘¨","‍","πŸ‘©","‍","πŸ‘§","‍","πŸ‘¦"]' + * console.log(segment(test)); // '["fi","t","πŸš€","πŸ‘«","πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦"]' + * ``` + * + * Note, this utility segments the string into grapheme clusters using + * `Intl.Segmenter`, a TC39 proposal which reached stage 4 in 2022, and may not + * be supported in older environments. + * + * @param utf8 - the string for which to segment characters. + */ +export const segment = (utf8: string) => + [...new Intl.Segmenter('en', { granularity: 'grapheme' }).segment(utf8)].map( + (item) => item.segment, + ); + +/** + * Return the user-perceived character length of the given string, e.g.: + * + * ```js + * const test = 'fitπŸš€πŸ‘«πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦' + * console.log(test.length); // 17 + * console.log(length(test)); // 5 + * ``` + * + * Note, this utility segments the string into grapheme clusters using + * `Intl.Segmenter`, a TC39 proposal which reached stage 4 in 2022, and may not + * be supported in older environments. + * + * @param utf8 - the string for which to count the character length. + */ +export const length = (utf8: string) => segment(utf8).length; diff --git a/src/lib/key/hd-key.spec.ts b/src/lib/key/hd-key.spec.ts index 7eb6c991..238becf6 100644 --- a/src/lib/key/hd-key.spec.ts +++ b/src/lib/key/hd-key.spec.ts @@ -1,6 +1,4 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; -import bitcoreLibCash from 'bitcore-lib-cash'; import type { HdKeyParameters, @@ -36,6 +34,9 @@ import { validateSecp256k1PrivateKey, } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; +import bitcoreLibCash from 'bitcore-lib-cash'; + const seed = Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); const xprv = @@ -61,24 +62,24 @@ const crypto = { ripemd160, secp256k1, sha256, sha512 }; test('[crypto] deriveHdPrivateNodeFromSeed', (t) => { const valid = { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), valid: true, } as HdPrivateNodeValid; const invalid = { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, invalidPrivateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), parentFingerprint: hexToBin('00000000'), valid: false, @@ -94,15 +95,15 @@ test('[crypto] deriveHdPrivateNodeFromSeed', (t) => { test('[crypto] deriveHdPrivateNodeIdentifier', (t) => { const { node } = decodeHdPrivateKey( - xprv + xprv, ) as HdKeyParameters; t.deepEqual( deriveHdPrivateNodeIdentifier(node), - hexToBin('15c918d389673c6cd0660050f268a843361e1111') + hexToBin('15c918d389673c6cd0660050f268a843361e1111'), ); t.deepEqual( deriveHdPrivateNodeIdentifier(node, crypto), - hexToBin('15c918d389673c6cd0660050f268a843361e1111') + hexToBin('15c918d389673c6cd0660050f268a843361e1111'), ); }); @@ -110,11 +111,11 @@ test('[crypto] deriveHdPublicNodeIdentifier', (t) => { const { node } = decodeHdPublicKey(xpub) as HdKeyParameters; t.deepEqual( deriveHdPublicNodeIdentifier(node), - hexToBin('15c918d389673c6cd0660050f268a843361e1111') + hexToBin('15c918d389673c6cd0660050f268a843361e1111'), ); t.deepEqual( deriveHdPublicNodeIdentifier(node, crypto), - hexToBin('15c918d389673c6cd0660050f268a843361e1111') + hexToBin('15c918d389673c6cd0660050f268a843361e1111'), ); }); @@ -122,13 +123,13 @@ test('[crypto] decodeHdKey', (t) => { t.deepEqual(decodeHdKey(xprv), { node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), valid: true, }, @@ -137,13 +138,13 @@ test('[crypto] decodeHdKey', (t) => { t.deepEqual(decodeHdKey(xpub, crypto), { node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746', ), }, version: HdKeyVersion.mainnetPublicKey, @@ -156,9 +157,9 @@ test('[crypto] decodeHdKey: errors', (t) => { t.deepEqual( decodeHdKey( 'xpub661MyMwAqRbcEngHLkoUWCKMBMGeqdqCGkqtzrHaTZub9ALw2oRfHA6fQP5n5X9VHStaNTBYomkSb8BFhUGavwD3RG1qvMkEKceTavTp2Ta', - crypto + crypto, ), - HdKeyDecodingError.invalidChecksum + HdKeyDecodingError.invalidChecksum, ); }); @@ -167,13 +168,13 @@ test('[crypto] decodeHdPrivateKey', (t) => { network: 'mainnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), valid: true, }, @@ -182,13 +183,13 @@ test('[crypto] decodeHdPrivateKey', (t) => { network: 'testnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), valid: true, }, @@ -199,28 +200,28 @@ test('[crypto] decodeHdPrivateKey: errors', (t) => { t.deepEqual(decodeHdPrivateKey(xpub), HdKeyDecodingError.privateKeyExpected); t.deepEqual( decodeHdPrivateKey( - '1111111111111FF9QeH94hg7KAjgjUqkHUqbrw5wWQLoRNfRhB4cHUDCJxx2HfNb5qDiAjpbKjXeLJSknuzDmja42174H9Es1XbY24sZts9' + '1111111111111FF9QeH94hg7KAjgjUqkHUqbrw5wWQLoRNfRhB4cHUDCJxx2HfNb5qDiAjpbKjXeLJSknuzDmja42174H9Es1XbY24sZts9', ), - HdKeyDecodingError.unknownVersion + HdKeyDecodingError.unknownVersion, ); const xprvWith0FilledKey = 'xprv9s21ZrQH143K2JbpEjGU94NcdKSASB7LuXvJCTsxuENcGN1nVG7QjMnBZ6c54tCKNErugtr5mi7oyGaDVrYe4SE5u1GnzYHmjDKuKg4vuNm'; t.deepEqual( decodeHdPrivateKey(xprvWith0FilledKey), - HdKeyDecodingError.invalidPrivateNode + HdKeyDecodingError.invalidPrivateNode, ); const xprvWith255FilledKey = 'xprv9s21ZrQH143K2JbpEjGU94NcdKSASB7LuXvJCTsxuENcGN1nVG7QjMnBZ8YpF7eMDfY8piRngHjovbAzQyAMi94xgeLuEgyfisLHpC7G5ST'; t.deepEqual( decodeHdPrivateKey(xprvWith255FilledKey), - HdKeyDecodingError.invalidPrivateNode + HdKeyDecodingError.invalidPrivateNode, ); t.deepEqual( decodeHdPrivateKey( - 'xprv9s21ZrQH143K2JbpEjGU94NcdKSASB7LuXvJCTsxuENcGN1nVG7QjMnBhegPMjkj1oGSFcmBkMX3xdwcMy6NSgrHvmqJptpUW5xGjg7kifZ' + 'xprv9s21ZrQH143K2JbpEjGU94NcdKSASB7LuXvJCTsxuENcGN1nVG7QjMnBhegPMjkj1oGSFcmBkMX3xdwcMy6NSgrHvmqJptpUW5xGjg7kifZ', ), - HdKeyDecodingError.missingPrivateKeyPaddingByte + HdKeyDecodingError.missingPrivateKeyPaddingByte, ); }); @@ -229,13 +230,13 @@ test('[crypto] decodeHdPublicKey', (t) => { network: 'mainnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746', ), }, }); @@ -243,13 +244,13 @@ test('[crypto] decodeHdPublicKey', (t) => { network: 'testnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746', ), }, }); @@ -259,9 +260,9 @@ test('[crypto] decodeHdPublicKey: errors', (t) => { t.deepEqual(decodeHdPublicKey(xprv), HdKeyDecodingError.publicKeyExpected); t.deepEqual( decodeHdPublicKey( - '1111111111111FF9QeH94hg7KAjgjUqkHUqbrw5wWQLoRNfRhB4cHUDCJxx2HfNb5qDiAjpbKjXeLJSknuzDmja42174H9Es1XbY24sZts9' + '1111111111111FF9QeH94hg7KAjgjUqkHUqbrw5wWQLoRNfRhB4cHUDCJxx2HfNb5qDiAjpbKjXeLJSknuzDmja42174H9Es1XbY24sZts9', ), - HdKeyDecodingError.unknownVersion + HdKeyDecodingError.unknownVersion, ); }); @@ -271,18 +272,18 @@ test('[crypto] encodeHdPrivateKey', (t) => { network: 'mainnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), valid: true, }, }), - xprv + xprv, ); t.deepEqual( @@ -291,20 +292,20 @@ test('[crypto] encodeHdPrivateKey', (t) => { network: 'testnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), valid: true, }, }, - crypto + crypto, ), - tprv + tprv, ); }); @@ -314,17 +315,17 @@ test('[crypto] encodeHdPublicKey', (t) => { network: 'mainnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746', ), }, }), - xpub + xpub, ); t.deepEqual( encodeHdPublicKey( @@ -332,19 +333,19 @@ test('[crypto] encodeHdPublicKey', (t) => { network: 'testnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746', ), }, }, - crypto + crypto, ), - tpub + tpub, ); }); @@ -356,13 +357,13 @@ test('[crypto] deriveHdPublicNode', (t) => { } t.deepEqual(deriveHdPublicNode(privateParams.node), { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746', ), }); }); @@ -371,11 +372,11 @@ test('[crypto] deriveHdPrivateNodeChild', (t) => { const master = decodeHdPrivateKey(xprv); const hardenedIndex0Child = decodeHdPrivateKey( - 'xprv9u4S6TaiPQaF7FS24QFpRP6hjff4jXNwwYTkVNC6f6YzHj2a6G28aRN1D6Az82SxMeBivpVS3gDDXyQiu3RANTqWy34Zxi9JN76zSwkjqPF' + 'xprv9u4S6TaiPQaF7FS24QFpRP6hjff4jXNwwYTkVNC6f6YzHj2a6G28aRN1D6Az82SxMeBivpVS3gDDXyQiu3RANTqWy34Zxi9JN76zSwkjqPF', ); const index1GrandChild = decodeHdPrivateKey( - 'xprv9w8PdihBAeR4xgGYWWqBnmDTrpWEW1QjuYAUkR7A6X48q1iQVgN433aSFxQGgtureVz7cCyi5zfuMTtBF3AkanjtvNs9m8u2JobxNfphSi3' + 'xprv9w8PdihBAeR4xgGYWWqBnmDTrpWEW1QjuYAUkR7A6X48q1iQVgN433aSFxQGgtureVz7cCyi5zfuMTtBF3AkanjtvNs9m8u2JobxNfphSi3', ); if ( @@ -390,7 +391,7 @@ test('[crypto] deriveHdPrivateNodeChild', (t) => { const hardenedIndex0 = 0x80000000; const result0 = deriveHdPrivateNodeChild( master.node, - hardenedIndex0 + hardenedIndex0, ) as HdPrivateNodeValid; const result1 = deriveHdPrivateNodeChild(result0, 1, crypto); @@ -407,19 +408,19 @@ test('[crypto] deriveHdPrivateNodeChild', (t) => { test('[crypto] deriveHdPrivateNodeChild: errors', (t) => { const { node } = decodeHdPrivateKey( - xprv + xprv, ) as HdKeyParameters; const max = 0xffffffff; t.deepEqual( deriveHdPrivateNodeChild(node, max + 1), - HdNodeDerivationError.childIndexExceedsMaximum + HdNodeDerivationError.childIndexExceedsMaximum, ); }); test('[crypto] deriveHdPublicNodeChild', (t) => { const { node } = decodeHdPrivateKey( - xprv + xprv, ) as HdKeyParameters; const parentPublic = deriveHdPublicNode(node); @@ -428,19 +429,19 @@ test('[crypto] deriveHdPublicNodeChild', (t) => { const child = deriveHdPrivateNodeChild( node, - derivationIndex + derivationIndex, ) as HdPrivateNodeKnownParent; const expectedPublic = deriveHdPublicNode(child); t.deepEqual( deriveHdPublicNodeChild(parentPublic, derivationIndex), - expectedPublic + expectedPublic, ); t.deepEqual( deriveHdPublicNodeChild(parentPublic, derivationIndex, crypto), - expectedPublic + expectedPublic, ); }); @@ -449,27 +450,27 @@ test('[crypto] deriveHdPublicNodeChild: errors', (t) => { const hardened0 = 0x80000000; t.deepEqual( deriveHdPublicNodeChild(node, hardened0), - HdNodeDerivationError.hardenedDerivationRequiresPrivateNode + HdNodeDerivationError.hardenedDerivationRequiresPrivateNode, ); }); test('[crypto] deriveHdPath', (t) => { const { node: privateNode } = decodeHdPrivateKey( - xprv + xprv, ) as HdKeyParameters; const publicNode = deriveHdPublicNode(privateNode); t.deepEqual( deriveHdPath(privateNode, 'm') as HdPrivateNodeValid, - privateNode + privateNode, ); t.deepEqual( deriveHdPath(publicNode, 'M', crypto) as HdPublicNode, - publicNode + publicNode, ); t.deepEqual(deriveHdPath(privateNode, "m/0'/1"), { ...( decodeHdPrivateKey( - 'xprv9w8PdihBAeR4xgGYWWqBnmDTrpWEW1QjuYAUkR7A6X48q1iQVgN433aSFxQGgtureVz7cCyi5zfuMTtBF3AkanjtvNs9m8u2JobxNfphSi3' + 'xprv9w8PdihBAeR4xgGYWWqBnmDTrpWEW1QjuYAUkR7A6X48q1iQVgN433aSFxQGgtureVz7cCyi5zfuMTtBF3AkanjtvNs9m8u2JobxNfphSi3', ) as HdKeyParameters ).node, parentIdentifier: hexToBin('2f2bc501c943dd7f17904b612c090dd88270cc59'), @@ -477,98 +478,98 @@ test('[crypto] deriveHdPath', (t) => { t.deepEqual( deriveHdPath(publicNode, 'M/0/1/2/3'), deriveHdPublicNode( - deriveHdPath(privateNode, 'm/0/1/2/3') as HdPrivateNodeKnownParent - ) + deriveHdPath(privateNode, 'm/0/1/2/3') as HdPrivateNodeKnownParent, + ), ); t.deepEqual( deriveHdPath(privateNode, "m/0'/1'/2'/3'"), - deriveHdPath(privateNode, 'm/2147483648/2147483649/2147483650/2147483651') + deriveHdPath(privateNode, 'm/2147483648/2147483649/2147483650/2147483651'), ); }); test('[crypto] deriveHdPath: errors', (t) => { const { node: privateNode } = decodeHdPrivateKey( - xprv + xprv, ) as HdKeyParameters; const publicNode = deriveHdPublicNode(privateNode); t.deepEqual( deriveHdPath(privateNode, 'm/bad/1'), - HdNodeDerivationError.invalidDerivationPath + HdNodeDerivationError.invalidDerivationPath, ); t.deepEqual( deriveHdPath(privateNode, 'M'), - HdNodeDerivationError.invalidPrivateDerivationPrefix + HdNodeDerivationError.invalidPrivateDerivationPrefix, ); t.deepEqual( deriveHdPath(publicNode, 'm'), - HdNodeDerivationError.invalidPublicDerivationPrefix + HdNodeDerivationError.invalidPublicDerivationPrefix, ); t.deepEqual( deriveHdPath(privateNode, 'm/0/4294967296/0'), - HdNodeDerivationError.childIndexExceedsMaximum + HdNodeDerivationError.childIndexExceedsMaximum, ); t.deepEqual( deriveHdPath(publicNode, "M/0/0'/0"), - HdNodeDerivationError.hardenedDerivationRequiresPrivateNode + HdNodeDerivationError.hardenedDerivationRequiresPrivateNode, ); t.deepEqual( deriveHdPath(publicNode, 'M/0/2147483648/0'), - HdNodeDerivationError.hardenedDerivationRequiresPrivateNode + HdNodeDerivationError.hardenedDerivationRequiresPrivateNode, ); }); test('[crypto] crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode', (t) => { const { node: parentPrivateNode } = decodeHdPrivateKey( - xprv + xprv, ) as HdKeyParameters; const parentPublicNode = deriveHdPublicNode(parentPrivateNode); const nonHardenedChildNode = deriveHdPath( parentPrivateNode, - 'm/1234' + 'm/1234', ) as HdPrivateNodeKnownParent; const hardenedChildNode = deriveHdPath( parentPrivateNode, - "m/1234'" + "m/1234'", ) as HdPrivateNodeKnownParent; const hardenedChildPublicNode = deriveHdPublicNode(hardenedChildNode); const nonHardenedGrandchildNode = deriveHdPath( hardenedChildNode, - 'm/1234' + 'm/1234', ) as HdPrivateNodeKnownParent; t.deepEqual( crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( parentPublicNode, - nonHardenedChildNode + nonHardenedChildNode, ), - parentPrivateNode + parentPrivateNode, ); t.deepEqual( crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( hardenedChildPublicNode, nonHardenedGrandchildNode, - crypto + crypto, ), - hardenedChildNode + hardenedChildNode, ); t.deepEqual( crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( parentPublicNode, - hardenedChildNode + hardenedChildNode, ), - HdNodeCrackingError.cannotCrackHardenedDerivation + HdNodeCrackingError.cannotCrackHardenedDerivation, ); }); const bip32Vector = test.macro<[string, string, string, string]>({ - // eslint-disable-next-line complexity, max-params + // eslint-disable-next-line complexity, @typescript-eslint/max-params exec: (t, seedHex, path, hdPrivateKey, hdPublicKey) => { const master = deriveHdPrivateNodeFromSeed(hexToBin(seedHex)); @@ -598,7 +599,7 @@ const bip32Vector = test.macro<[string, string, string, string]>({ } t.deepEqual( childNode.parentIdentifier?.slice(0, fingerprintLength), - path === 'm' ? undefined : decodedPrivate.node.parentFingerprint + path === 'm' ? undefined : decodedPrivate.node.parentFingerprint, ); t.deepEqual(childNode, { ...decodedPrivate.node, @@ -613,7 +614,7 @@ const bip32Vector = test.macro<[string, string, string, string]>({ const publicNode = deriveHdPublicNode(childNode); t.deepEqual( publicNode.parentIdentifier?.slice(0, fingerprintLength), - path === 'm' ? undefined : decodedPublic.node.parentFingerprint + path === 'm' ? undefined : decodedPublic.node.parentFingerprint, ); t.deepEqual(publicNode, { ...decodedPublic.node, @@ -637,7 +638,7 @@ test( '000102030405060708090a0b0c0d0e0f', 'm', 'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi', - 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8' + 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8', ); test( @@ -646,7 +647,7 @@ test( '000102030405060708090a0b0c0d0e0f', "m/0'", 'xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7', - 'xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw' + 'xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw', ); test( @@ -655,7 +656,7 @@ test( '000102030405060708090a0b0c0d0e0f', "m/0'/1", 'xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs', - 'xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ' + 'xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ', ); test( @@ -664,7 +665,7 @@ test( '000102030405060708090a0b0c0d0e0f', "m/0'/1/2'", 'xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM', - 'xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5' + 'xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5', ); test( @@ -673,7 +674,7 @@ test( '000102030405060708090a0b0c0d0e0f', "m/0'/1/2'/2", 'xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334', - 'xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV' + 'xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV', ); test( @@ -682,7 +683,7 @@ test( '000102030405060708090a0b0c0d0e0f', "m/0'/1/2'/2/1000000000", 'xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76', - 'xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy' + 'xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy', ); test( @@ -691,7 +692,7 @@ test( 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542', 'm', 'xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U', - 'xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB' + 'xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB', ); test( @@ -700,7 +701,7 @@ test( 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542', 'm/0', 'xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt', - 'xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH' + 'xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH', ); test( @@ -709,7 +710,7 @@ test( 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542', "m/0/2147483647'", 'xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9', - 'xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a' + 'xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a', ); test( @@ -718,7 +719,7 @@ test( 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542', "m/0/2147483647'/1", 'xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef', - 'xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon' + 'xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon', ); test( @@ -727,7 +728,7 @@ test( 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542', "m/0/2147483647'/1/2147483646'", 'xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc', - 'xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL' + 'xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL', ); test( @@ -736,7 +737,7 @@ test( 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542', "m/0/2147483647'/1/2147483646'/2", 'xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j', - 'xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt' + 'xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt', ); test( @@ -745,7 +746,7 @@ test( '4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be', 'm', 'xprv9s21ZrQH143K25QhxbucbDDuQ4naNntJRi4KUfWT7xo4EKsHt2QJDu7KXp1A3u7Bi1j8ph3EGsZ9Xvz9dGuVrtHHs7pXeTzjuxBrCmmhgC6', - 'xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13' + 'xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13', ); test( @@ -754,7 +755,7 @@ test( '4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be', "m/0'", 'xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L', - 'xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y' + 'xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y', ); const fcBip32Path = () => @@ -767,9 +768,9 @@ const fcBip32Path = () => (array) => `m/${array .map((i) => - i > hardenedIndexOffset ? `${i - hardenedIndexOffset}'` : `${i}` + i > hardenedIndexOffset ? `${i - hardenedIndexOffset}'` : `${i}`, ) - .join('/')}` + .join('/')}`, ); testProp( @@ -797,7 +798,7 @@ testProp( t.deepEqual(resultPrv, bitcorePrv); t.deepEqual(resultPub, bitcorePub); }, - { numRuns: 10 } + { numRuns: 10 }, ); testProp( @@ -820,8 +821,8 @@ testProp( childIndex: number, parentFingerprint: Uint8Array, chainCode: Uint8Array, - publicKey: Uint8Array - // eslint-disable-next-line max-params + publicKey: Uint8Array, + // eslint-disable-next-line @typescript-eslint/max-params ) => { const encoded = encodeHdPublicKey({ network: mainnet ? 'mainnet' : 'testnet', @@ -836,10 +837,10 @@ testProp( t.deepEqual( encoded, encodeHdPublicKey( - decodeHdPublicKey(encoded) as HdKeyParameters - ) + decodeHdPublicKey(encoded) as HdKeyParameters, + ), ); - } + }, ); testProp( @@ -863,8 +864,8 @@ testProp( childIndex: number, parentFingerprint: Uint8Array, chainCode: Uint8Array, - privateKey: Uint8Array - // eslint-disable-next-line max-params + privateKey: Uint8Array, + // eslint-disable-next-line @typescript-eslint/max-params ) => { if (!validateSecp256k1PrivateKey(privateKey)) { t.pass(); @@ -884,10 +885,10 @@ testProp( t.deepEqual( encoded, encodeHdPrivateKey( - decodeHdPrivateKey(encoded) as HdKeyParameters - ) + decodeHdPrivateKey(encoded) as HdKeyParameters, + ), ); - } + }, ); testProp( @@ -908,8 +909,8 @@ testProp( childIndexes: number, parentFingerprint: Uint8Array, chainCode: Uint8Array, - privateKey: Uint8Array - // eslint-disable-next-line max-params + privateKey: Uint8Array, + // eslint-disable-next-line @typescript-eslint/max-params ) => { if (!validateSecp256k1PrivateKey(privateKey)) { t.pass(); @@ -928,19 +929,19 @@ testProp( }); const { node: parentPrivateNode } = decodeHdPrivateKey( - parentXprv + parentXprv, ) as HdKeyParameters; const parentPublicNode = deriveHdPublicNode(parentPrivateNode); const nonHardenedChildNode = deriveHdPrivateNodeChild( parentPrivateNode, - childIndexes + childIndexes, ) as HdPrivateNodeValid; const crackedParentNode = crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( parentPublicNode, - nonHardenedChildNode + nonHardenedChildNode, ) as HdPrivateNodeValid; const crackedXprv = encodeHdPrivateKey({ network: 'mainnet', @@ -948,5 +949,5 @@ testProp( }); t.deepEqual(parentXprv, crackedXprv); - } + }, ); diff --git a/src/lib/key/hd-key.ts b/src/lib/key/hd-key.ts index 414cb083..f0bb5406 100644 --- a/src/lib/key/hd-key.ts +++ b/src/lib/key/hd-key.ts @@ -14,10 +14,56 @@ import { binToBigIntUint256BE, flattenBinArray, numberToBinUint32BE, + utf8ToBin, } from '../format/format.js'; import type { Ripemd160, Secp256k1, Sha256, Sha512 } from '../lib.js'; -import { validateSecp256k1PrivateKey } from './key-utils.js'; +const enum Secp256k1Constants { + privateKeyLength = 32, +} + +/** + * Verify that a private key is valid for the Secp256k1 curve. Returns `true` + * for success, or `false` on failure. + * + * Private keys are 256-bit numbers encoded as a 32-byte, big-endian Uint8Array. + * Nearly every 256-bit number is a valid secp256k1 private key. Specifically, + * any 256-bit number greater than `0x01` and less than + * `0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140` + * is a valid private key. This range is part of the definition of the + * secp256k1 elliptic curve parameters. + * + * This method does not require a `Secp256k1` implementation. + */ +export const validateSecp256k1PrivateKey = (privateKey: Uint8Array) => { + if ( + privateKey.length !== Secp256k1Constants.privateKeyLength || + privateKey.every((value) => value === 0) + ) { + return false; + } + + /** + * The largest possible Secp256k1 private key – equal to the order of the + * Secp256k1 curve minus one. + */ + // prettier-ignore + const maximumSecp256k1PrivateKey = [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 186, 174, 220, 230, 175, 72, 160, 59, 191, 210, 94, 140, 208, 54, 65, 63]; // eslint-disable-line @typescript-eslint/no-magic-numbers + + const firstDifference = privateKey.findIndex( + (value, i) => value !== maximumSecp256k1PrivateKey[i], + ); + + if ( + firstDifference === -1 || + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + privateKey[firstDifference]! < maximumSecp256k1PrivateKey[firstDifference]! + ) { + return true; + } + + return false; +}; /** * The networks that can be referenced by an HD public or private key. @@ -27,14 +73,14 @@ export type HdKeyNetwork = 'mainnet' | 'testnet'; /** * The decoded contents of an HD public or private key. */ -export interface HdKeyParameters< - NodeType extends HdPrivateNodeValid | HdPublicNode -> { +export type HdKeyParameters< + NodeType extends HdPrivateNodeValid | HdPublicNode, +> = { node: NodeType; network: HdKeyNetwork; -} +}; -interface HdNodeBase { +type HdNodeBase = { /** * 32 bytes of additional entropy that can be used to derive HD child nodes. */ @@ -71,20 +117,20 @@ interface HdNodeBase { * might be unknown. */ parentIdentifier?: Uint8Array; -} +}; /** * A valid private node in a Hierarchical Deterministic (HD) key tree. This node * can be used to derive further nodes, or the private key can be used to * generate a wallet address. */ -export interface HdPrivateNodeValid extends HdNodeBase { +export type HdPrivateNodeValid = HdNodeBase & { /** * This {@link HdPrivateNode}'s 32-byte valid Secp256k1 private key. */ privateKey: Uint8Array; valid: true; -} +}; /** * An invalid private node in a Hierarchical Deterministic (HD) key tree. This @@ -97,7 +143,7 @@ export interface HdPrivateNodeValid extends HdNodeBase { * using the next child index. I.e. the node ultimately derived at the invalid * child index is a duplicate of the node derived at `index + 1`. */ -export interface HdPrivateNodeInvalid extends HdNodeBase { +export type HdPrivateNodeInvalid = HdNodeBase & { /** * The 32-byte derivation result that is not a valid Secp256k1 private key. * This is almost impossibly rare in a securely-random 32-byte Uint8Array, @@ -107,15 +153,15 @@ export interface HdPrivateNodeInvalid extends HdNodeBase { */ invalidPrivateKey: Uint8Array; valid: false; -} +}; /** * A valid HD private node for which the parent node is known (and * `parentIdentifier` is guaranteed to be defined). */ -export interface HdPrivateNodeKnownParent extends HdPrivateNodeValid { +export type HdPrivateNodeKnownParent = HdPrivateNodeValid & { parentIdentifier: Uint8Array; -} +}; /** * A private node in a Hierarchical Deterministic (HD) key tree. To confirm the @@ -132,29 +178,26 @@ export type HdPrivateNode = HdPrivateNodeInvalid | HdPrivateNodeValid; * Note, HD nodes are network-independent. A network is required only when * encoding the node as an HD key or using a derived public key in an address. */ -export interface HdPublicNode extends HdNodeBase { +export type HdPublicNode = HdNodeBase & { /** * This {@link HdPublicNode}'s valid 33-byte Secp256k1 compressed public key. */ publicKey: Uint8Array; -} +}; /** * An HD public node for which the parent node is known (and `parentIdentifier` * is guaranteed to be defined). */ -export interface HdPublicNodeKnownParent extends HdPublicNode { +export type HdPublicNodeKnownParent = HdPublicNode & { parentIdentifier: Uint8Array; -} +}; /** * The HMAC SHA-512 key used by BIP32, "Bitcoin seed" * (`utf8ToBin('Bitcoin seed')`) */ -const bip32HmacSha512Key = Uint8Array.from([ - // eslint-disable-next-line @typescript-eslint/no-magic-numbers - 66, 105, 116, 99, 111, 105, 110, 32, 115, 101, 101, 100, -]); +const bip32HmacSha512Key = utf8ToBin('Bitcoin seed'); const halfHmacSha512Length = 32; /** * Derive an {@link HdPrivateNode} from the provided seed following the BIP32 @@ -166,16 +209,21 @@ const halfHmacSha512Length = 32; * for validity, and will be assumed valid if `true` or invalid if `false` (this * is useful for testing) * @param crypto - an optional object containing an implementation of sha512 - * to use + * @param hmacSha512Key - the HMAC SHA-512 key to use (defaults the HMAC SHA-512 + * key used by BIP32, `utf8ToBin('Bitcoin seed')` */ export const deriveHdPrivateNodeFromSeed = < - AssumedValidity extends boolean | undefined + AssumedValidity extends boolean | undefined, >( seed: Uint8Array, assumeValidity?: AssumedValidity, - crypto: { sha512: { hash: Sha512['hash'] } } = { sha512: internalSha512 } + crypto: { sha512: { hash: Sha512['hash'] } } = { + sha512: internalSha512, + }, + hmacSha512Key = bip32HmacSha512Key, + // eslint-disable-next-line @typescript-eslint/max-params ) => { - const mac = hmacSha512(bip32HmacSha512Key, seed, crypto.sha512); + const mac = hmacSha512(hmacSha512Key, seed, crypto.sha512); const privateKey = mac.slice(0, halfHmacSha512Length); const chainCode = mac.slice(halfHmacSha512Length); const depth = 0; @@ -196,8 +244,8 @@ export const deriveHdPrivateNodeFromSeed = < ) as AssumedValidity extends true ? HdPrivateNodeValid : AssumedValidity extends false - ? HdPrivateNodeInvalid - : HdPrivateNode; + ? HdPrivateNodeInvalid + : HdPrivateNode; }; /** @@ -222,10 +270,10 @@ export const deriveHdPrivateNodeIdentifier = ( ripemd160: internalRipemd160, secp256k1: internalSecp256k1, sha256: internalSha256, - } + }, ) => { const publicKey = crypto.secp256k1.derivePublicKeyCompressed( - hdPrivateNode.privateKey + hdPrivateNode.privateKey, ); if (typeof publicKey === 'string') return publicKey; return crypto.ripemd160.hash(crypto.sha256.hash(publicKey)); @@ -245,7 +293,7 @@ export const deriveHdPublicNodeIdentifier = ( crypto: { ripemd160: { hash: Ripemd160['hash'] }; sha256: { hash: Sha256['hash'] }; - } = { ripemd160: internalRipemd160, sha256: internalSha256 } + } = { ripemd160: internalRipemd160, sha256: internalSha256 }, ) => crypto.ripemd160.hash(crypto.sha256.hash(node.publicKey)); /** @@ -315,7 +363,7 @@ export enum HdKeyDecodingError { // eslint-disable-next-line complexity export const decodeHdKey = ( hdKey: string, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, ) => { const decoded = base58ToBin(hdKey); if (decoded === BaseConversionError.unknownCharacter) @@ -342,14 +390,14 @@ export const decodeHdKey = ( const version = new DataView( decoded.buffer, decoded.byteOffset, - depthIndex + depthIndex, ).getUint32(0); const depth = decoded[depthIndex]; const parentFingerprint = decoded.slice(fingerprintIndex, childIndexIndex); const childIndex = new DataView( decoded.buffer, decoded.byteOffset + childIndexIndex, - decoded.byteOffset + chainCodeIndex + decoded.byteOffset + chainCodeIndex, ).getUint32(0); const chainCode = decoded.slice(chainCodeIndex, keyDataIndex); const keyData = decoded.slice(keyDataIndex, checksumIndex); @@ -419,7 +467,7 @@ export const decodeHdKey = ( */ export const decodeHdPrivateKey = ( hdPrivateKey: string, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, ) => { const decoded = decodeHdKey(hdPrivateKey, crypto); if (typeof decoded === 'string') return decoded; @@ -457,7 +505,7 @@ export const decodeHdPrivateKey = ( */ export const decodeHdPublicKey = ( hdPublicKey: string, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, ) => { const decoded = decodeHdKey(hdPublicKey, crypto); if (typeof decoded === 'string') return decoded; @@ -483,7 +531,7 @@ export const decodeHdPublicKey = ( */ export const hdPrivateKeyToIdentifier = ( hdPrivateKey: string, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, ) => { const privateKeyParams = decodeHdPrivateKey(hdPrivateKey, crypto); if (typeof privateKeyParams === 'string') { @@ -498,7 +546,7 @@ export const hdPrivateKeyToIdentifier = ( */ export const hdPublicKeyToIdentifier = ( hdPublicKey: string, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, ) => { const publicKeyParams = decodeHdPublicKey(hdPublicKey, crypto); if (typeof publicKeyParams === 'string') { @@ -508,22 +556,21 @@ export const hdPublicKeyToIdentifier = ( }; /** - * Encode an HD private key (as defined by BIP32) given a valid - * {@link HdPrivateNode} and network. + * Encode an HD private key (as defined by BIP32) payload (without the checksum) + * given a valid {@link HdPrivateNode} and network. * * @param keyParameters - a valid HD private node and the network for which to * encode the key * @param crypto - an optional object containing an implementation of sha256 * to use */ -export const encodeHdPrivateKey = ( +export const encodeHdPrivateKeyPayload = ( keyParameters: HdKeyParameters, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } ) => { const version = numberToBinUint32BE( keyParameters.network === 'mainnet' ? HdKeyVersion.mainnetPrivateKey - : HdKeyVersion.testnetPrivateKey + : HdKeyVersion.testnetPrivateKey, ); const depth = Uint8Array.of(keyParameters.node.depth); const childIndex = numberToBinUint32BE(keyParameters.node.childIndex); @@ -537,6 +584,23 @@ export const encodeHdPrivateKey = ( isPrivateKey, keyParameters.node.privateKey, ]); + return payload; +}; + +/** + * Encode an HD private key (as defined by BIP32) given a valid + * {@link HdPrivateNode} and network. + * + * @param keyParameters - a valid HD private node and the network for which to + * encode the key + * @param crypto - an optional object containing an implementation of sha256 + * to use + */ +export const encodeHdPrivateKey = ( + keyParameters: HdKeyParameters, + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, +) => { + const payload = encodeHdPrivateKeyPayload(keyParameters); const checksumLength = 4; const checksum = crypto.sha256 .hash(crypto.sha256.hash(payload)) @@ -554,12 +618,12 @@ export const encodeHdPrivateKey = ( */ export const encodeHdPublicKey = ( keyParameters: HdKeyParameters, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, ) => { const version = numberToBinUint32BE( keyParameters.network === 'mainnet' ? HdKeyVersion.mainnetPublicKey - : HdKeyVersion.testnetPublicKey + : HdKeyVersion.testnetPublicKey, ); const depth = Uint8Array.of(keyParameters.node.depth); const childIndex = numberToBinUint32BE(keyParameters.node.childIndex); @@ -593,14 +657,14 @@ export const encodeHdPublicKey = ( * compressed public key derivation to use */ export const deriveHdPublicNode = < - PrivateNode extends HdPrivateNodeValid = HdPrivateNodeValid + PrivateNode extends HdPrivateNodeValid = HdPrivateNodeValid, >( node: PrivateNode, crypto: { secp256k1: { derivePublicKeyCompressed: Secp256k1['derivePublicKeyCompressed']; }; - } = { secp256k1: internalSecp256k1 } + } = { secp256k1: internalSecp256k1 }, ) => ({ chainCode: node.chainCode, @@ -611,9 +675,9 @@ export const deriveHdPublicNode = < ? {} : { parentIdentifier: node.parentIdentifier }), publicKey: crypto.secp256k1.derivePublicKeyCompressed(node.privateKey), - } as PrivateNode extends HdPrivateNodeKnownParent + }) as PrivateNode extends HdPrivateNodeKnownParent ? HdPublicNodeKnownParent - : HdPublicNode); + : HdPublicNode; /** * An error in the derivation of child HD public or private nodes. @@ -666,7 +730,7 @@ export const deriveHdPrivateNodeChild = ( secp256k1: internalSecp256k1, sha256: internalSha256, sha512: internalSha512, - } + }, ): | HdNodeDerivationError.childIndexExceedsMaximum | HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm @@ -682,7 +746,7 @@ export const deriveHdPrivateNodeChild = ( const keyMaterial = useHardenedAlgorithm ? node.privateKey : (crypto.secp256k1.derivePublicKeyCompressed( - node.privateKey + node.privateKey, ) as Uint8Array); const serialization = Uint8Array.from([ @@ -698,7 +762,7 @@ export const deriveHdPrivateNodeChild = ( const nextPrivateKey = crypto.secp256k1.addTweakPrivateKey( node.privateKey, - tweakValue + tweakValue, ); if (typeof nextPrivateKey === 'string') { if (index === hardenedIndexOffset - 1) { @@ -761,7 +825,7 @@ export const deriveHdPublicNodeChild = ( secp256k1: internalSecp256k1, sha256: internalSha256, sha512: internalSha512, - } + }, ): | HdNodeDerivationError.hardenedDerivationRequiresPrivateNode | HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm @@ -783,7 +847,7 @@ export const deriveHdPublicNodeChild = ( const nextPublicKey = crypto.secp256k1.addTweakPublicKeyCompressed( node.publicKey, - tweakValue + tweakValue, ); if (typeof nextPublicKey === 'string') { if (index === hardenedIndexOffset - 1) { @@ -867,7 +931,7 @@ type ReductionResults = NodeType extends HdPrivateNodeValid */ // eslint-disable-next-line complexity export const deriveHdPath = < - NodeType extends HdPrivateNodeValid | HdPublicNode + NodeType extends HdPrivateNodeValid | HdPublicNode, >( node: NodeType, path: string, @@ -885,7 +949,7 @@ export const deriveHdPath = < secp256k1: internalSecp256k1, sha256: internalSha256, sha512: internalSha512, - } + }, ): | HdNodeDerivationError.invalidDerivationPath | HdNodeDerivationError.invalidPrivateDerivationPrefix @@ -915,7 +979,7 @@ export const deriveHdPath = < .map((index) => index.endsWith("'") ? parseInt(index.slice(0, -1), base) + hardenedIndexOffset - : parseInt(index, base) + : parseInt(index, base), ); return ( @@ -925,14 +989,14 @@ export const deriveHdPath = < typeof result === 'string' ? result : deriveHdPrivateNodeChild(result, nextIndex, crypto), - node as PrivateResults // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter + node as PrivateResults, // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter ) : indexes.reduce( (result, nextIndex) => typeof result === 'string' ? result : deriveHdPublicNodeChild(result, nextIndex, crypto), - node as PublicResults // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter + node as PublicResults, // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter ) ) as ReductionResults; }; @@ -968,11 +1032,11 @@ export enum HdNodeCrackingError { * * @param crypto - an optional object containing an implementation of sha512 */ export const crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode = < - PublicNode extends HdPublicNode = HdPublicNode + PublicNode extends HdPublicNode = HdPublicNode, >( parentPublicNode: PublicNode, childPrivateNode: { childIndex: number; privateKey: Uint8Array }, - crypto: { sha512: { hash: Sha512['hash'] } } = { sha512: internalSha512 } + crypto: { sha512: { hash: Sha512['hash'] } } = { sha512: internalSha512 }, ) => { const hardenedIndexOffset = 0x80000000; if (childPrivateNode.childIndex >= hardenedIndexOffset) { @@ -986,11 +1050,11 @@ export const crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode = < const derivation = hmacSha512( parentPublicNode.chainCode, serialization, - crypto.sha512 + crypto.sha512, ); const tweakValueLength = 32; const tweakValue = binToBigIntUint256BE( - derivation.slice(0, tweakValueLength) + derivation.slice(0, tweakValueLength), ); const childPrivateValue = binToBigIntUint256BE(childPrivateNode.privateKey); const secp256k1OrderN = @@ -999,7 +1063,7 @@ export const crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode = < const parentPrivateValue = trueMod( childPrivateValue - tweakValue, - secp256k1OrderN + secp256k1OrderN, ); const privateKey = bigIntToBinUint256BEClamped(parentPrivateValue); diff --git a/src/lib/key/key-utils.spec.ts b/src/lib/key/key-utils.spec.ts index 18646cf6..0cb3ada6 100644 --- a/src/lib/key/key-utils.spec.ts +++ b/src/lib/key/key-utils.spec.ts @@ -1,6 +1,5 @@ import { randomBytes } from 'crypto'; -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { @@ -10,6 +9,8 @@ import { validateSecp256k1PrivateKey, } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + const privateKeyLength = 32; const maximumUint8Value = 255; @@ -21,44 +22,44 @@ test('validateSecp256k1PrivateKey', (t) => { t.false( validateSecp256k1PrivateKey( hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ) - ) + '0000000000000000000000000000000000000000000000000000000000000000', + ), + ), ); t.true( validateSecp256k1PrivateKey( hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' - ) - ) + '0000000000000000000000000000000000000000000000000000000000000001', + ), + ), ); t.true( validateSecp256k1PrivateKey( hexToBin( - '00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' - ) - ) + '00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + ), + ), ); t.true( validateSecp256k1PrivateKey( hexToBin( - 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f' - ) - ) + 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f', + ), + ), ); t.false( validateSecp256k1PrivateKey( hexToBin( - 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140' - ) - ) + 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140', + ), + ), ); }); const secp256k1OrderNFFBytes = 15; const almostInvalid = Array(secp256k1OrderNFFBytes).fill( - maximumUint8Value + maximumUint8Value, ) as number[]; const theRest = privateKeyLength - almostInvalid.length; @@ -75,9 +76,9 @@ testProp( (t, input) => { t.deepEqual( validateSecp256k1PrivateKey(input), - secp256k1.validatePrivateKey(input) + secp256k1.validatePrivateKey(input), ); - } + }, ); test('generatePrivateKey: works', (t) => { diff --git a/src/lib/key/key-utils.ts b/src/lib/key/key-utils.ts index 5ef30a18..04056a41 100644 --- a/src/lib/key/key-utils.ts +++ b/src/lib/key/key-utils.ts @@ -1,78 +1,164 @@ -/** - * Verify that a private key is valid for the Secp256k1 curve. Returns `true` - * for success, or `false` on failure. - * - * Private keys are 256-bit numbers encoded as a 32-byte, big-endian Uint8Array. - * Nearly every 256-bit number is a valid secp256k1 private key. Specifically, - * any 256-bit number greater than `0x01` and less than - * `0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140` - * is a valid private key. This range is part of the definition of the - * secp256k1 elliptic curve parameters. - * - * This method does not require a `Secp256k1` implementation. - */ -export const validateSecp256k1PrivateKey = (privateKey: Uint8Array) => { - const privateKeyLength = 32; - if ( - privateKey.length !== privateKeyLength || - privateKey.every((value) => value === 0) - ) { - return false; - } +import { sha256 as internalSha256 } from '../crypto/crypto.js'; +import type { Sha256 } from '../lib.js'; - /** - * The largest possible Secp256k1 private key – equal to the order of the - * Secp256k1 curve minus one. - */ - // prettier-ignore - const maximumSecp256k1PrivateKey = [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 186, 174, 220, 230, 175, 72, 160, 59, 191, 210, 94, 140, 208, 54, 65, 63]; // eslint-disable-line @typescript-eslint/no-magic-numbers +import type { HdPrivateNode } from './hd-key.js'; +import { + deriveHdPrivateNodeFromSeed, + validateSecp256k1PrivateKey, +} from './hd-key.js'; - const firstDifference = privateKey.findIndex( - (value, i) => value !== maximumSecp256k1PrivateKey[i] - ); +const enum KeyUtilConstants { + privateKeyLength = 32, + privateKeyRequiredEntropyBits = 128, + utf8NumbersOffset = 48, +} - if ( - firstDifference === -1 || - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - privateKey[firstDifference]! < maximumSecp256k1PrivateKey[firstDifference]! - ) { - return true; - } - - return false; -}; +/** + * Generate a Uint8Array of the specified length containing a + * cryptographically-random series of bytes. + * @param length - the length of the Uint8Array to generate + */ +export const generateRandomBytes = (length: number) => + crypto.getRandomValues(new Uint8Array(length)); /** - * Securely generate a valid Secp256k1 private key given a secure source of - * randomness. - * - * **Node.js Usage** - * ```ts - * import { randomBytes } from 'crypto'; - * import { generatePrivateKey } from '@bitauth/libauth'; + * Securely generate a 32-byte, cryptographically random seed (Uint8Array) for + * use in HD Key derivation (see {@link deriveHdPrivateNodeFromSeed}). * - * const key = generatePrivateKey(() => randomBytes(32)); - * ``` + * To generate a single Secp256k1 private key, use {@link generatePrivateKey}. + */ +export const generateRandomSeed = () => + generateRandomBytes(KeyUtilConstants.privateKeyLength); + +/** + * Securely generate a valid Secp256k1 private key. * - * **Browser Usage** - * ```ts - * import { generatePrivateKey } from '@bitauth/libauth'; + * By default, this function uses `crypto.getRandomValues` to produce + * sufficiently-random key material, but another source of randomness may also + * be provided. * - * const key = generatePrivateKey(() => - * window.crypto.getRandomValues(new Uint8Array(32)) - * ); - * ``` + * To generate an HD Key, use {@link generateHdPrivateKey}. * * @param secureRandom - a method that returns a securely-random 32-byte * Uint8Array */ -export const generatePrivateKey = (secureRandom: () => Uint8Array) => { +export const generatePrivateKey = (secureRandom = generateRandomSeed) => { // eslint-disable-next-line functional/no-let, @typescript-eslint/init-declarations let maybeKey: Uint8Array; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements do { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements maybeKey = secureRandom(); } while (!validateSecp256k1PrivateKey(maybeKey)); return maybeKey; }; + +/** + * Securely generate a valid {@link HdPrivateNode}, returning both the source + * seed and the {@link HdPrivateNodeValid}. + * + * By default, this function uses `crypto.getRandomValues` to produce + * sufficiently-random key material, but another source of randomness may also + * be provided. + * + * To generate a single Secp256k1 private key, use {@link generatePrivateKey}. + */ +export const generateHdPrivateNode = (secureRandom = generateRandomSeed) => { + // eslint-disable-next-line functional/no-let, @typescript-eslint/init-declarations + let seed: Uint8Array; + // eslint-disable-next-line functional/no-let, @typescript-eslint/init-declarations + let hdPrivateNode: HdPrivateNode; + // eslint-disable-next-line functional/no-loop-statements + do { + // eslint-disable-next-line functional/no-expression-statements + seed = secureRandom(); + // eslint-disable-next-line functional/no-expression-statements + hdPrivateNode = deriveHdPrivateNodeFromSeed(seed); + } while (!hdPrivateNode.valid); + return { + hdPrivateNode, + seed, + }; +}; + +/* + * TODO: export const generateLibauthSecretKey = (secureRandom = generateRandomSeed) => { + * const { seed } = generateHdPrivateNode(secureRandom); + * return encodeLibauthSecretKey({ seed }); + * }; + */ + +/** + * Given the number of equally-likely results per event, return the Shannon + * entropy of the event in bits. + * + * @param possibleResults - the number of equally-likely results per event; + * e.g. for a coin, `2`, for dice, the number of faces (for a standard die, `6`) + */ +export const shannonEntropyPerEvent = (possibleResults: number) => + Math.log2(possibleResults); + +/** + * Given the number of equally-likely results per event, return the number of + * events required to achieve the required bits of Shannon entropy. + * entropy of the event in bits. + * + * For example, to compute the number of standard, 6-sided dice rolls required + * to generate a private key (with the recommended 128-bit entropy minimum), + * `minimumEventsPerEntropyBits(6)`. + * + * @param possibleResults - the number of equally-likely results per event; + * e.g. for a coin, `2`, for dice, the number of faces (for a standard die, `6`) + * @param requiredEntropyBits - the number of bits of entropy required. Defaults + * to `128`, the recommended value for all private key generation. + */ +export const minimumEventsPerEntropyBits = ( + possibleResults: number, + requiredEntropyBits = KeyUtilConstants.privateKeyRequiredEntropyBits, +) => Math.ceil(requiredEntropyBits / shannonEntropyPerEvent(possibleResults)); + +/** + * An error in the decoding of an HD public or private key. + */ +export enum DeterministicEntropyGenerationError { + insufficientEntropy = 'Deterministic entropy generation error: the provided list of events contains insufficient entropy.', +} + +/** + * Generate deterministic entropy by seeding SHA-256 with a list of random + * events like coin flips or dice rolls. For ease of verification, events are + * simply encoded as a string of utf8 numbers prior to SHA-256 hashing. For coin + * flips, use `0` ("heads") and `1` ("tails"); for dice, use the exposed number. + * + * @param possibleResults - the number of equally-likely results per event; + * e.g. for a coin, `2`, for dice, the number of faces (for a standard die, `6`) + * @param events - an array of numbers encoding the random events; for coin + * flips, use `0` ("heads") and `1` ("tails"); for dice, use the exposed number + * (e.g. `1` through `6`) + * @param requiredEntropyBits - the number of bits of entropy required. Defaults + * to `128`, the recommended value for all private key generation. + * @param crypto - an optional object containing an implementation of sha256 + * to use + */ +export const generateDeterministicEntropy = ( + possibleResults: number, + events: number[], + requiredEntropyBits = KeyUtilConstants.privateKeyRequiredEntropyBits, + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, + // eslint-disable-next-line @typescript-eslint/max-params +) => { + if ( + events.length < + minimumEventsPerEntropyBits(possibleResults, requiredEntropyBits) + ) { + return DeterministicEntropyGenerationError.insufficientEntropy; + } + const source = Uint8Array.from( + events.map((v) => v + KeyUtilConstants.utf8NumbersOffset), + ); + return crypto.sha256.hash(source); +}; + +// TODO: export const generateLibauthSecretKeyFromCoinFlips = () => {} + +// TODO: export const generateLibauthSecretKeyFromDiceRolls = () => {} diff --git a/src/lib/key/wallet-import-format.spec.ts b/src/lib/key/wallet-import-format.spec.ts index 3566209e..e17e4413 100644 --- a/src/lib/key/wallet-import-format.spec.ts +++ b/src/lib/key/wallet-import-format.spec.ts @@ -12,12 +12,12 @@ import { test('decodePrivateKeyWif: pass through errors', (t) => { t.deepEqual( decodePrivateKeyWif('not a key'), - Base58AddressError.unknownCharacter + Base58AddressError.unknownCharacter, ); }); const wifVectors = test.macro<[WalletImportFormatType, string, string]>({ - // eslint-disable-next-line max-params + // eslint-disable-next-line @typescript-eslint/max-params exec: (t, type, wif, key) => { t.deepEqual(encodePrivateKeyWif(hexToBin(key), type), wif); t.deepEqual(decodePrivateKeyWif(wif), { @@ -34,7 +34,7 @@ const wifVectors = test.macro<[WalletImportFormatType, string, string]>({ `encodePrivateKeyWif <-> decodePrivateKeyWif ${type} - ${base58.slice( 0, - 6 + 6, )}...`, }); @@ -42,33 +42,33 @@ test( wifVectors, 'mainnet', 'L1RrrnXkcKut5DEMwtDthjwRcTTwED36thyL1DebVrKuwvohjMNi', - '7d998b45c219a1e38e99e7cbd312ef67f77a455a9b50c730c27f02c6f730dfb4' + '7d998b45c219a1e38e99e7cbd312ef67f77a455a9b50c730c27f02c6f730dfb4', ); test( wifVectors, 'mainnet', 'KwV9KAfwbwt51veZWNscRTeZs9CKpojyu1MsPnaKTF5kz69H1UN2', - '07f0803fc5399e773555ab1e8939907e9badacc17ca129e67a2f5f2ff84351dd' + '07f0803fc5399e773555ab1e8939907e9badacc17ca129e67a2f5f2ff84351dd', ); test( wifVectors, 'testnet', 'cTpB4YiyKiBcPxnefsDpbnDxFDffjqJob8wGCEDXxgQ7zQoMXJdH', - 'b9f4892c9e8282028fea1d2667c4dc5213564d41fc5783896a0d843fc15089f3' + 'b9f4892c9e8282028fea1d2667c4dc5213564d41fc5783896a0d843fc15089f3', ); test( wifVectors, 'mainnetUncompressed', '5Kd3NBUAdUnhyzenEwVLy9pBKxSwXvE9FMPyR4UKZvpe6E3AgLr', - 'eddbdc1168f1daeadbd3e44c1e3f8f5a284c2029f78ad26af98583a499de5b19' + 'eddbdc1168f1daeadbd3e44c1e3f8f5a284c2029f78ad26af98583a499de5b19', ); test( wifVectors, 'testnetUncompressed', '9213qJab2HNEpMpYNBa7wHGFKKbkDn24jpANDs2huN3yi4J11ko', - '36cb93b9ab1bdabf7fb9f2c04f1b9cc879933530ae7842398eef5a63a56800c2' + '36cb93b9ab1bdabf7fb9f2c04f1b9cc879933530ae7842398eef5a63a56800c2', ); diff --git a/src/lib/key/wallet-import-format.ts b/src/lib/key/wallet-import-format.ts index 8a08a0c1..d715c5e3 100644 --- a/src/lib/key/wallet-import-format.ts +++ b/src/lib/key/wallet-import-format.ts @@ -56,7 +56,7 @@ export type WalletImportFormatType = export const encodePrivateKeyWif = ( privateKey: Uint8Array, type: WalletImportFormatType, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const compressedByte = 0x01; const mainnet = type === 'mainnet' || type === 'mainnetUncompressed'; @@ -69,7 +69,7 @@ export const encodePrivateKeyWif = ( ? Base58AddressFormatVersion.wif : Base58AddressFormatVersion.wifTestnet, payload, - sha256 + sha256, ); }; @@ -83,7 +83,7 @@ export const encodePrivateKeyWif = ( // eslint-disable-next-line complexity export const decodePrivateKeyWif = ( wifKey: string, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const compressedPayloadLength = 33; const decoded = decodeBase58AddressFormat(wifKey, sha256); @@ -99,8 +99,8 @@ export const decodePrivateKeyWif = ( ? 'mainnet' : 'mainnetUncompressed' : compressed - ? 'testnet' - : 'testnetUncompressed'; + ? 'testnet' + : 'testnetUncompressed'; return { privateKey, type }; }; diff --git a/src/lib/language/compile.spec.ts b/src/lib/language/compile.spec.ts index ee8f40cd..01f8776f 100644 --- a/src/lib/language/compile.spec.ts +++ b/src/lib/language/compile.spec.ts @@ -63,7 +63,7 @@ test('compileScript: clean errors on unexpected input', (t) => { }, ], success: false, - } + }, ); t.deepEqual(compileScript('t', {}, { scripts: { t: '"incomplete' } }), { errorType: 'parse', @@ -192,7 +192,7 @@ test('compileScriptContents: empty string', (t) => { }, ], success: true, - } + }, ); }); @@ -252,14 +252,14 @@ test('compileScriptContents: empty script (script with space)', (t) => { test('describeExpectedInput: handles EOF', (t) => { t.deepEqual( describeExpectedInput(['one thing', 'EOF']), - 'Encountered unexpected input while parsing script. Expected one thing or the end of the script.' + 'Encountered unexpected input while parsing script. Expected one thing or the end of the script.', ); }); test('describeExpectedInput: handles 2 options', (t) => { t.deepEqual( describeExpectedInput(['one thing', 'another thing']), - 'Encountered unexpected input while parsing script. Expected one thing or another thing.' + 'Encountered unexpected input while parsing script. Expected one thing or another thing.', ); }); @@ -353,7 +353,7 @@ test('compileScript: 0x51', (t) => { ], success: true, }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); @@ -487,7 +487,7 @@ test('compileScript: <1>', (t) => { ], success: true, }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); @@ -621,7 +621,7 @@ test('compileScript: <0xabcdef>', (t) => { ], success: true, }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); @@ -755,7 +755,7 @@ test('compileScript: <"abc πŸ‘">', (t) => { ], success: true, }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); @@ -831,7 +831,7 @@ test('compileScript: OP_1 OP_2 OP_ADD', (t) => { OP_ADD: Uint8Array.of(0x93), }, scripts: { t: 'OP_1 OP_2 OP_ADD' }, - } + }, ), { bytecode: Uint8Array.of(0x51, 0x52, 0x93), @@ -966,7 +966,7 @@ test('compileScript: OP_1 OP_2 OP_ADD', (t) => { }, ], success: true, - } + }, ); }); @@ -994,132 +994,212 @@ test('compileScript: variable and script inclusion', (t) => { type: 'AddressData', }, }, - } + }, ); - t.deepEqual(comp, { - bytecode: Uint8Array.of(0x51, 0x52, 0x93), - parse: { - end: { - column: 19, - line: 1, - offset: 18, - }, - name: 'Script', - start: { - column: 1, - line: 1, - offset: 0, - }, - value: [ - { - end: { - column: 12, - line: 1, - offset: 11, - }, - name: 'Identifier', - start: { - column: 1, - line: 1, - offset: 0, - }, - value: 'pushNumbers', + t.deepEqual( + comp, + { + bytecode: Uint8Array.of(0x51, 0x52, 0x93), + parse: { + end: { + column: 19, + line: 1, + offset: 18, }, - { - end: { - column: 19, - line: 1, - offset: 18, - }, - name: 'Identifier', - start: { - column: 13, - line: 1, - offset: 12, - }, - value: 'OP_ADD', + name: 'Script', + start: { + column: 1, + line: 1, + offset: 0, }, - ], - }, - reduce: { - bytecode: Uint8Array.of(0x51, 0x52, 0x93), - range: { - endColumn: 19, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - script: [ - { - bytecode: Uint8Array.of(0x51, 0x52), - range: { - endColumn: 12, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, + value: [ + { + end: { + column: 12, + line: 1, + offset: 11, + }, + name: 'Identifier', + start: { + column: 1, + line: 1, + offset: 0, + }, + value: 'pushNumbers', }, - }, - { - bytecode: Uint8Array.of(0x93), - range: { - endColumn: 19, - endLineNumber: 1, - startColumn: 13, - startLineNumber: 1, + { + end: { + column: 19, + line: 1, + offset: 18, + }, + name: 'Identifier', + start: { + column: 13, + line: 1, + offset: 12, + }, + value: 'OP_ADD', }, - }, - ], - }, - resolve: [ - { + ], + }, + reduce: { + bytecode: Uint8Array.of(0x51, 0x52, 0x93), range: { - endColumn: 12, + endColumn: 19, endLineNumber: 1, startColumn: 1, startLineNumber: 1, }, - script: 'pushNumbers', - source: [ + script: [ { - opcode: 'OP_1', + bytecode: Uint8Array.of(0x51, 0x52), range: { - endColumn: 5, + endColumn: 12, endLineNumber: 1, startColumn: 1, startLineNumber: 1, }, - type: 'bytecode', - value: Uint8Array.of(0x51), }, { + bytecode: Uint8Array.of(0x93), range: { - endColumn: 12, + endColumn: 19, endLineNumber: 1, - startColumn: 6, + startColumn: 13, startLineNumber: 1, }, - type: 'bytecode', - value: Uint8Array.of(0x52), - variable: 'varOp2', }, ], - type: 'bytecode', - value: Uint8Array.of(0x51, 0x52), }, - { - opcode: 'OP_ADD', - range: { - endColumn: 19, - endLineNumber: 1, - startColumn: 13, - startLineNumber: 1, + resolve: [ + { + range: { + endColumn: 12, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + script: 'pushNumbers', + source: { + bytecode: hexToBin('5152'), + parse: { + end: { + column: 12, + line: 1, + offset: 11, + }, + name: 'Script', + start: { + column: 1, + line: 1, + offset: 0, + }, + value: [ + { + end: { + column: 5, + line: 1, + offset: 4, + }, + name: 'Identifier', + start: { + column: 1, + line: 1, + offset: 0, + }, + value: 'OP_1', + }, + { + end: { + column: 12, + line: 1, + offset: 11, + }, + name: 'Identifier', + start: { + column: 6, + line: 1, + offset: 5, + }, + value: 'varOp2', + }, + ], + }, + reduce: { + bytecode: hexToBin('5152'), + range: { + endColumn: 12, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + script: [ + { + bytecode: hexToBin('51'), + range: { + endColumn: 5, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('52'), + range: { + endColumn: 12, + endLineNumber: 1, + startColumn: 6, + startLineNumber: 1, + }, + }, + ], + }, + resolve: [ + { + opcode: 'OP_1', + range: { + endColumn: 5, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + type: 'bytecode', + value: hexToBin('51'), + }, + { + range: { + endColumn: 12, + endLineNumber: 1, + startColumn: 6, + startLineNumber: 1, + }, + type: 'bytecode', + value: hexToBin('52'), + variable: 'varOp2', + }, + ], + success: true, + }, + type: 'bytecode', + value: Uint8Array.of(0x51, 0x52), }, - type: 'bytecode', - value: Uint8Array.of(0x93), - }, - ], - success: true, - }); + { + opcode: 'OP_ADD', + range: { + endColumn: 19, + endLineNumber: 1, + startColumn: 13, + startLineNumber: 1, + }, + type: 'bytecode', + value: Uint8Array.of(0x93), + }, + ], + success: true, + }, + stringifyTestVector(comp), + ); }); test('compileScript: comments', (t) => { @@ -1127,7 +1207,7 @@ test('compileScript: comments', (t) => { compileScript( 't', {}, - { scripts: { t: '// single-line\n /* multi-\nline */' } } + { scripts: { t: '// single-line\n /* multi-\nline */' } }, ), { bytecode: Uint8Array.of(), @@ -1226,6 +1306,6 @@ test('compileScript: comments', (t) => { }, ], success: true, - } + }, ); }); diff --git a/src/lib/language/compile.ts b/src/lib/language/compile.ts index 20a68b07..92568871 100644 --- a/src/lib/language/compile.ts +++ b/src/lib/language/compile.ts @@ -1,4 +1,5 @@ import type { + AnyCompilerConfiguration, AuthenticationProgramStateControlStack, AuthenticationProgramStateMinimum, AuthenticationProgramStateStack, @@ -7,7 +8,6 @@ import type { CompilationData, CompilationResult, CompilationResultSuccess, - CompilerConfiguration, } from '../lib.js'; import { compileScriptRaw, createEmptyRange } from './resolve.js'; @@ -26,11 +26,11 @@ export const compileScript = < AuthenticationProgramStateStack = AuthenticationProgramStateControlStack & AuthenticationProgramStateMinimum & AuthenticationProgramStateStack, - CompilationContext extends CompilationContextCommon = CompilationContextBCH + CompilationContext extends CompilationContextCommon = CompilationContextBCH, >( scriptId: string, data: CompilationData, - configuration: CompilerConfiguration + configuration: AnyCompilerConfiguration, ): CompilationResult => { const locktimeDisablingSequenceNumber = 0xffffffff; const lockTimeTypeBecomesTimestamp = 500000000; diff --git a/src/lib/language/language-types.ts b/src/lib/language/language-types.ts index 080d8473..bd4a6be4 100644 --- a/src/lib/language/language-types.ts +++ b/src/lib/language/language-types.ts @@ -4,23 +4,23 @@ import type { AuthenticationProgramStateStack, } from '../lib.js'; -export interface Range { +export type Range = { endColumn: number; endLineNumber: number; startColumn: number; startLineNumber: number; -} +}; -export interface SourcePosition { +export type SourcePosition = { column: number; line: number; offset: number; -} +}; -export interface MarkedNode { +export type MarkedNode = { end: SourcePosition; start: SourcePosition; -} +}; type StringSegmentType = | 'BigIntLiteral' @@ -32,80 +32,80 @@ type StringSegmentType = type RecursiveSegmentType = 'Evaluation' | 'Push'; -interface CashAssemblyLanguageSegment extends MarkedNode { +type CashAssemblyLanguageSegment = MarkedNode & { name: string; -} +}; -interface CashAssemblyStringSegment extends CashAssemblyLanguageSegment { +type CashAssemblyStringSegment = CashAssemblyLanguageSegment & { name: StringSegmentType; value: string; -} +}; -interface CashAssemblyRecursiveSegment extends CashAssemblyLanguageSegment { +type CashAssemblyRecursiveSegment = CashAssemblyLanguageSegment & { name: RecursiveSegmentType; value: CashAssemblyScriptSegment; -} +}; -export interface CashAssemblyScriptSegment extends CashAssemblyLanguageSegment { +export type CashAssemblyScriptSegment = CashAssemblyLanguageSegment & { name: 'Script'; value: (CashAssemblyRecursiveSegment | CashAssemblyStringSegment)[]; -} +}; export type ParseResult = | { expected: string[]; index: SourcePosition; status: false } | { status: true; value: CashAssemblyScriptSegment }; -interface ResolvedSegmentBase { +type ResolvedSegmentBase = { range: Range; type: string; -} +}; -export interface ResolvedSegmentPush extends ResolvedSegmentBase { +export type ResolvedSegmentPush = ResolvedSegmentBase & { type: 'push'; value: T; -} +}; -export interface ResolvedSegmentEvaluation extends ResolvedSegmentBase { +export type ResolvedSegmentEvaluation = ResolvedSegmentBase & { type: 'evaluation'; value: T; -} - -export interface ResolvedSegmentVariableBytecode - extends ResolvedSegmentBase, - ResolutionDebug, - ResolutionSignature { - type: 'bytecode'; - value: Uint8Array; - /** - * The full identifier (including any compilation operations) of the variable - * that resolved to this `value`, e.g. `my_key.signature.all_outputs` or - * `my_key.public_key`. - */ - variable: string; -} - -export interface ResolvedSegmentScriptBytecode extends ResolvedSegmentBase { - /** - * The full identifier of the script that resolved to this `value`. - */ - script: string; - /** - * The source {@link ResolvedScript} that was compiled to produce - * this `value`. - */ - source: ResolvedScript; - type: 'bytecode'; - value: Uint8Array; -} - -export interface ResolvedSegmentOpcodeBytecode extends ResolvedSegmentBase { +}; + +export type ResolvedSegmentVariableBytecode = ResolutionDebug & + ResolutionSignature & + ResolvedSegmentBase & { + type: 'bytecode'; + value: Uint8Array; + /** + * The full identifier (including any compilation operations) of the variable + * that resolved to this `value`, e.g. `my_key.signature.all_outputs` or + * `my_key.public_key`. + */ + variable: string; + }; + +export type ResolvedSegmentScriptBytecode = + ResolvedSegmentBase & { + /** + * The full identifier of the script that resolved to this `value`. + */ + script: string; + /** + * The source {@link ResolvedScript} that was compiled to produce + * this `value`. + */ + source: CompilationResultSuccess; + type: 'bytecode'; + value: Uint8Array; + }; + +export type ResolvedSegmentOpcodeBytecode = ResolvedSegmentBase & { /** * The identifier for this opcode, e.g. `OP_1` or `OP_CHECKSIG`. */ opcode: string; type: 'bytecode'; value: Uint8Array; -} +}; export type ResolvedSegmentLiteralType = | 'BigIntLiteral' @@ -113,25 +113,25 @@ export type ResolvedSegmentLiteralType = | 'HexLiteral' | 'UTF8Literal'; -export interface ResolvedSegmentLiteralBytecode extends ResolvedSegmentBase { +export type ResolvedSegmentLiteralBytecode = ResolvedSegmentBase & { literal: string; literalType: ResolvedSegmentLiteralType; type: 'bytecode'; value: Uint8Array; -} +}; -export type ResolvedSegmentBytecode = +export type ResolvedSegmentBytecode = | ResolvedSegmentLiteralBytecode | ResolvedSegmentOpcodeBytecode - | ResolvedSegmentScriptBytecode + | ResolvedSegmentScriptBytecode | ResolvedSegmentVariableBytecode; -export interface ResolvedSegmentComment extends ResolvedSegmentBase { +export type ResolvedSegmentComment = ResolvedSegmentBase & { type: 'comment'; value: string; -} +}; -export interface ResolvedSegmentError extends ResolvedSegmentBase { +export type ResolvedSegmentError = ResolvedSegmentBase & { type: 'error'; value: string; /** @@ -147,17 +147,16 @@ export interface ResolvedSegmentError extends ResolvedSegmentBase { * for the referenced variable is available in the compilation data. */ owningEntity?: string; -} +}; -export type ResolvedSegment = - | ResolvedSegmentBytecode +export type ResolvedSegment = + | ResolvedSegmentBytecode | ResolvedSegmentComment | ResolvedSegmentError - | ResolvedSegmentEvaluation - | ResolvedSegmentPush; + | ResolvedSegmentEvaluation> + | ResolvedSegmentPush>; -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface ResolvedScript extends Array {} +export type ResolvedScript = ResolvedSegment[]; export enum IdentifierResolutionType { opcode = 'opcode', @@ -171,7 +170,7 @@ export enum IdentifierResolutionErrorType { script = 'script', } -export interface ResolutionDebug { +export type ResolutionDebug = { /** * An additional, complex property that may be returned by custom * compiler operations. For use in extending the compiler to support @@ -179,9 +178,9 @@ export interface ResolutionDebug { * {@link CompilerOperationSuccessSignature}. */ debug?: unknown; -} +}; -export interface ResolutionSignature { +export type ResolutionSignature = { signature?: | { /** @@ -198,17 +197,19 @@ export interface ResolutionSignature { */ serialization: Uint8Array; }; -} +}; /** * A method that accepts a string and returns either the successfully resolved * bytecode or an error. The string will never be empty (`''`), so resolution * can skip checking the string's length. */ -export type IdentifierResolutionFunction = (identifier: string) => +export type IdentifierResolutionFunction = ( + identifier: string, +) => | { bytecode: Uint8Array; - source: ResolvedScript; + source: CompilationResultSuccess; status: true; type: IdentifierResolutionType.script; } @@ -249,30 +250,30 @@ export type IdentifierResolutionFunction = (identifier: string) => /** * The result of reducing a single CashAssembly script node. */ -export interface ScriptReductionTraceNode { +export type ScriptReductionTraceNode = { bytecode: Uint8Array; errors?: CompilationError[] | undefined; range: Range; -} -interface ScriptReductionTraceErrorNode extends ScriptReductionTraceNode { +}; +type ScriptReductionTraceErrorNode = ScriptReductionTraceNode & { errors: CompilationError[]; -} +}; -export interface ScriptReductionTraceScriptNode - extends ScriptReductionTraceNode { - script: ScriptReductionTraceChildNode[]; -} +export type ScriptReductionTraceScriptNode = + ScriptReductionTraceNode & { + script: ScriptReductionTraceChildNode[]; + }; -export interface ScriptReductionTracePushNode - extends ScriptReductionTraceNode { - push: ScriptReductionTraceScriptNode; -} +export type ScriptReductionTracePushNode = + ScriptReductionTraceNode & { + push: ScriptReductionTraceScriptNode; + }; -export interface ScriptReductionTraceEvaluationNode - extends ScriptReductionTraceNode { - trace: ProgramState[]; - source: ScriptReductionTraceScriptNode; -} +export type ScriptReductionTraceEvaluationNode = + ScriptReductionTraceNode & { + trace: ProgramState[]; + source: ScriptReductionTraceScriptNode; + }; export type ScriptReductionTraceChildNode = | ScriptReductionTraceErrorNode @@ -283,10 +284,10 @@ export type ScriptReductionTraceChildNode = /** * The ProgramState at a particular point in a sampled evaluation. */ -export interface TraceSample { +export type TraceSample = { range: Range; state: ProgramState; -} +}; /** * A group of instructions that when read together are not malformed (contain @@ -294,23 +295,23 @@ export interface TraceSample { * `0x03 'a' 'b' 'c'` would be malformed if not evaluated together, since the * `0x03` becomes `OP_PUSHBYTES_3`, and the UTF8 literals compile to `0x616263`. */ -export interface InstructionAggregation { +export type InstructionAggregation = { instructions: AuthenticationInstruction[]; lastIp: number; range: Range; -} +}; -export interface InstructionAggregationSuccess { +export type InstructionAggregationSuccess = { aggregations: InstructionAggregation[]; success: true; -} +}; -export interface InstructionAggregationError { +export type InstructionAggregationError = { aggregations: InstructionAggregation[]; remainingBytecode: Uint8Array; remainingRange: Range; success: false; -} +}; /** * An evaluation sample extracted from a script reduction trace – includes the @@ -318,7 +319,7 @@ export interface InstructionAggregationError { * that was evaluated, the range in the source script over which the * instruction was defined, and the resulting program state. */ -export interface EvaluationSample { +export type EvaluationSample = { /** * The range of the evaluation node in which this sample was generated. * @@ -357,23 +358,23 @@ export interface EvaluationSample { * The program state after the evaluation of this sample's `instruction`. */ state: ProgramState; -} +}; -export interface CompilationResultResolve { +export type CompilationResultResolve = { parse: CashAssemblyScriptSegment; - resolve: ResolvedScript; -} + resolve: ResolvedScript; +}; -export interface CompilationResultReduce - extends CompilationResultResolve { - reduce: ScriptReductionTraceScriptNode; -} +export type CompilationResultReduce = + CompilationResultResolve & { + reduce: ScriptReductionTraceScriptNode; + }; -export interface CompilationResultErrorBase { +export type CompilationResultErrorBase = { errors: CompilationError[]; errorType: 'parse' | 'reduce' | 'resolve'; success: false; -} +}; export type CompilationError = | CompilationErrorFatal @@ -381,11 +382,11 @@ export type CompilationError = /** * A compilation error from which it is not possible to recover. This includes - * problems with the authentication template, missing dependencies in the - * compiler configuration, and other errors that likely require meaningful + * problems with the wallet template, missing dependencies in the compiler + * configuration, and other errors that likely require meaningful * software changes. */ -export interface CompilationErrorFatal { +export type CompilationErrorFatal = { /** * A message describing the compilation error. */ @@ -395,7 +396,7 @@ export interface CompilationErrorFatal { * useful for highlighting/underlining the cause of the error in development. */ range: Range; -} +}; /** * A compilation error from which recovery can happen without template or @@ -407,7 +408,7 @@ export interface CompilationErrorFatal { * variables can be extracted and used to request action by the user or another * system. */ -export interface CompilationErrorRecoverable extends CompilationErrorFatal { +export type CompilationErrorRecoverable = CompilationErrorFatal & { /** * The variable ID of the variable that – if provided in the compilation data * – would resolve this error. @@ -418,58 +419,57 @@ export interface CompilationErrorRecoverable extends CompilationErrorFatal { * `missingIdentifier`. */ owningEntity: string; -} +}; -export interface CompilationResultParseError - extends CompilationResultErrorBase { +export type CompilationResultParseError = CompilationResultErrorBase & { /** * The `parse` stage produces only a single parse error at a time. */ errors: [CompilationError]; errorType: 'parse'; -} -export interface CompilationResultResolveError - extends CompilationResultResolve, - CompilationResultErrorBase { - errorType: 'resolve'; -} - -export interface CompilationResultReduceError - extends CompilationResultReduce, - CompilationResultErrorBase { - errorType: 'reduce'; -} +}; +export type CompilationResultResolveError = + CompilationResultErrorBase & + CompilationResultResolve & { + errorType: 'resolve'; + }; + +export type CompilationResultReduceError = + CompilationResultErrorBase & + CompilationResultReduce & { + errorType: 'reduce'; + }; export type CompilationResultError = | CompilationResultParseError | CompilationResultReduceError - | CompilationResultResolveError; - -export interface CompilationResultSuccess - extends CompilationResultReduce { - bytecode: Uint8Array; - success: true; - /** - * The transformation type of the resulting bytecode. - * - * Set to `p2sh20-locking` if the resulting bytecode was transformed into a - * P2SH20 locking script (`OP_HASH160 <$( OP_HASH160)> OP_EQUAL`). - * - * Set to `p2sh20-unlocking` if the resulting bytecode was transformed into a - * P2SH20 unlocking script (`result `). - * - * This property is not defined if the result was not transformed. - */ - transformed?: - | 'p2sh20-locking' - | 'p2sh20-unlocking' - | 'p2sh32-locking' - | 'p2sh32-unlocking'; -} + | CompilationResultResolveError; + +export type CompilationResultSuccess = + CompilationResultReduce & { + bytecode: Uint8Array; + success: true; + /** + * The transformation type of the resulting bytecode. + * + * Set to `p2sh20-locking` if the resulting bytecode was transformed into a + * P2SH20 locking script (`OP_HASH160 <$( OP_HASH160)> OP_EQUAL`). + * + * Set to `p2sh20-unlocking` if the resulting bytecode was transformed into a + * P2SH20 unlocking script (`result `). + * + * This property is not defined if the result was not transformed. + */ + transformed?: + | 'p2sh20-locking' + | 'p2sh20-unlocking' + | 'p2sh32-locking' + | 'p2sh32-unlocking'; + }; export type CompilationResult< ProgramState = AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, > = | CompilationResultError | CompilationResultSuccess; diff --git a/src/lib/language/language-utils.spec.ts b/src/lib/language/language-utils.spec.ts index 990adc78..46293e00 100644 --- a/src/lib/language/language-utils.spec.ts +++ b/src/lib/language/language-utils.spec.ts @@ -28,21 +28,21 @@ test('mergeRanges', (t) => { { endColumn: 3, endLineNumber: 1, startColumn: 0, startLineNumber: 1 }, { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 }, ]), - { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 } + { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 }, ); t.deepEqual( mergeRanges([ { endColumn: 4, endLineNumber: 0, startColumn: 0, startLineNumber: 0 }, { endColumn: 8, endLineNumber: 1, startColumn: 6, startLineNumber: 1 }, ]), - { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 } + { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 }, ); t.deepEqual( mergeRanges([ { endColumn: 1, endLineNumber: 1, startColumn: 5, startLineNumber: 0 }, { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 }, ]), - { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 } + { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 }, ); }); @@ -50,31 +50,31 @@ test('containsRange', (t) => { t.deepEqual( containsRange( { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 }, - { endColumn: 3, endLineNumber: 1, startColumn: 0, startLineNumber: 1 } + { endColumn: 3, endLineNumber: 1, startColumn: 0, startLineNumber: 1 }, ), - true + true, ); t.deepEqual( containsRange( { endColumn: 4, endLineNumber: 0, startColumn: 0, startLineNumber: 0 }, - { endColumn: 8, endLineNumber: 1, startColumn: 6, startLineNumber: 1 } + { endColumn: 8, endLineNumber: 1, startColumn: 6, startLineNumber: 1 }, ), - false + false, ); t.deepEqual( containsRange( { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 }, - { endColumn: 1, endLineNumber: 1, startColumn: 5, startLineNumber: 0 } + { endColumn: 1, endLineNumber: 1, startColumn: 5, startLineNumber: 0 }, ), - true + true, ); t.deepEqual( containsRange( { endColumn: 5, endLineNumber: 1, startColumn: 1, startLineNumber: 1 }, { endColumn: 5, endLineNumber: 1, startColumn: 1, startLineNumber: 1 }, - false + false, ), - true + true, ); }); @@ -83,13 +83,13 @@ test('compileCashAssembly', (t) => { t.deepEqual( successful, hexToBin('03010203'), - stringifyTestVector(successful) + stringifyTestVector(successful), ); const failed = compileCashAssembly(''); t.deepEqual( failed, 'CashAssembly compilation error: [1, 2]: Unknown identifier "bad".', - stringifyTestVector(failed) + stringifyTestVector(failed), ); }); @@ -167,7 +167,7 @@ test('extractBytecodeResolutions', (t) => { type: 'opcode', }, ], - stringifyTestVector(result) + stringifyTestVector(result), ); }); @@ -188,7 +188,7 @@ test('extractEvaluationSamples: empty trace', (t) => { samples: [], unmatchedStates: [], }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); @@ -590,7 +590,7 @@ test.failing('extractEvaluationSamples: documentation example', (t) => { }, }, ], - stringifyTestVector(nodes) + stringifyTestVector(nodes), ); t.deepEqual( @@ -981,7 +981,7 @@ test.failing('extractEvaluationSamples: documentation example', (t) => { ], }, ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + stringifyTestVector(traceWithUnlockingPhaseAndFinalState), ); t.deepEqual(extracted, { @@ -1118,7 +1118,7 @@ test('extractEvaluationSamples: error in initial validation', (t) => { }, }, ], - stringifyTestVector(nodes) + stringifyTestVector(nodes), ); t.deepEqual( @@ -1145,7 +1145,7 @@ test('extractEvaluationSamples: error in initial validation', (t) => { stack: [], }, ], - stringifyTestVector(trace) + stringifyTestVector(trace), ); t.deepEqual(extracted, { @@ -1179,7 +1179,7 @@ test.failing( return; } const program = createAuthenticationProgramEvaluationCommon( - result.bytecode + result.bytecode, ); const nodes = result.reduce.script; const evaluationRange = result.reduce.range; @@ -1335,7 +1335,7 @@ test.failing( ], }, ], - stringifyTestVector(nodes) + stringifyTestVector(nodes), ); t.deepEqual( @@ -1452,7 +1452,7 @@ test.failing( stack: [hexToBin('ab')], }, ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + stringifyTestVector(traceWithUnlockingPhaseAndFinalState), ); t.deepEqual( @@ -1487,9 +1487,9 @@ test.failing( ], unmatchedStates: [], }, - stringifyTestVector(extracted) + stringifyTestVector(extracted), ); - } + }, ); test('extractEvaluationSamples: node that closes an open sample with an error', (t) => { @@ -1526,7 +1526,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', }, { bytecode: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262', ), range: { endColumn: 614, @@ -1536,7 +1536,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', }, }, ], - stringifyTestVector(nodes) + stringifyTestVector(nodes), ); t.deepEqual( @@ -1564,7 +1564,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', }, { data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262', ), opcode: 77, }, @@ -1587,7 +1587,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', }, { data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262', ), opcode: 77, }, @@ -1612,7 +1612,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', }, { data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262', ), opcode: 77, }, @@ -1637,7 +1637,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', }, { data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262', ), opcode: 77, }, @@ -1651,7 +1651,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', stack: [hexToBin('')], }, ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + stringifyTestVector(traceWithUnlockingPhaseAndFinalState), ); t.deepEqual(extracted, { @@ -1678,7 +1678,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', evaluationRange, instruction: { data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262', ), opcode: 77, }, @@ -1751,7 +1751,7 @@ test('extractEvaluationSamples: error3 - error occurs, so final state is dropped }, }, ], - stringifyTestVector(nodes) + stringifyTestVector(nodes), ); t.deepEqual( @@ -1884,7 +1884,7 @@ test('extractEvaluationSamples: error3 - error occurs, so final state is dropped stack: [hexToBin('')], }, ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + stringifyTestVector(traceWithUnlockingPhaseAndFinalState), ); t.deepEqual( @@ -1912,7 +1912,7 @@ test('extractEvaluationSamples: error3 - error occurs, so final state is dropped ], unmatchedStates: [], }, - stringifyTestVector(extracted) + stringifyTestVector(extracted), ); }); @@ -1929,7 +1929,7 @@ test.failing( return; } const program = createAuthenticationProgramEvaluationCommon( - result.bytecode + result.bytecode, ); const nodes = result.reduce.script; const evaluationRange = result.reduce.range; @@ -2967,7 +2967,7 @@ test.failing( }, }, ], - stringifyTestVector(nodes) + stringifyTestVector(nodes), ); t.deepEqual( @@ -3070,7 +3070,7 @@ test.failing( stack: [hexToBin(''), hexToBin('616263')], }, ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + stringifyTestVector(traceWithUnlockingPhaseAndFinalState), ); t.deepEqual( @@ -4028,13 +4028,13 @@ test.failing( }, ], }, - stringifyTestVector(sampleResult) + stringifyTestVector(sampleResult), ); - } + }, ); const extractUnexecutedRangesMacro = test.macro<[string, Range[], boolean?]>({ - // eslint-disable-next-line max-params + // eslint-disable-next-line @typescript-eslint/max-params exec: (t, scriptId, ranges, specifyStart) => { const result = compiler.generateBytecode({ data: {}, @@ -4046,7 +4046,7 @@ const extractUnexecutedRangesMacro = test.macro<[string, Range[], boolean?]>({ return; } const testProgram = createAuthenticationProgramEvaluationCommon( - result.bytecode + result.bytecode, ); const nodes = result.reduce.script; const evaluationRange = result.reduce.range; @@ -4059,12 +4059,12 @@ const extractUnexecutedRangesMacro = test.macro<[string, Range[], boolean?]>({ }); const unexecutedRanges = extractUnexecutedRanges( samples, - specifyStart === undefined ? undefined : '1,1' + specifyStart === undefined ? undefined : '1,1', ); t.deepEqual( unexecutedRanges, ranges, - stringifyTestVector(unexecutedRanges) + stringifyTestVector(unexecutedRanges), ); }, title: (_, scriptId) => `extractUnexecutedRangesMacro: ${scriptId}`, @@ -4123,7 +4123,7 @@ test( startLineNumber: 21, }, ], - true + true, ); test(extractUnexecutedRangesMacro, 'unexecuted01', [ diff --git a/src/lib/language/language-utils.ts b/src/lib/language/language-utils.ts index 6d5ddfd0..f3004d69 100644 --- a/src/lib/language/language-utils.ts +++ b/src/lib/language/language-utils.ts @@ -48,7 +48,7 @@ export const mergeRanges = ( endLineNumber: 0, startColumn: 0, startLineNumber: 0, - } as Range + } as Range, ) => { const minimumRangesToMerge = 2; const unsortedMerged = @@ -63,18 +63,18 @@ export const mergeRanges = ( ...(range.endLineNumber > merged.endLineNumber ? pluckEndPosition(range) : range.endLineNumber === merged.endLineNumber && - range.endColumn > merged.endColumn - ? pluckEndPosition(range) - : pluckEndPosition(merged)), + range.endColumn > merged.endColumn + ? pluckEndPosition(range) + : pluckEndPosition(merged)), ...(range.startLineNumber < merged.startLineNumber ? pluckStartPosition(range) : range.startLineNumber === merged.startLineNumber && - range.startColumn < merged.startColumn - ? pluckStartPosition(range) - : pluckStartPosition(merged)), + range.startColumn < merged.startColumn + ? pluckStartPosition(range) + : pluckStartPosition(merged)), }), // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - ranges[0]! + ranges[0]!, ); return { ...pluckEndPosition(unsortedMerged), @@ -96,24 +96,24 @@ export const mergeRanges = ( export const containsRange = ( outerRange: Range, innerRange: Range, - exclusive = true + exclusive = true, ) => { const startsAfter = outerRange.startLineNumber < innerRange.startLineNumber ? true : outerRange.startLineNumber === innerRange.startLineNumber - ? exclusive - ? outerRange.startColumn < innerRange.startColumn - : outerRange.startColumn <= innerRange.startColumn - : false; + ? exclusive + ? outerRange.startColumn < innerRange.startColumn + : outerRange.startColumn <= innerRange.startColumn + : false; const endsBefore = outerRange.endLineNumber > innerRange.endLineNumber ? true : outerRange.endLineNumber === innerRange.endLineNumber - ? exclusive - ? outerRange.endColumn > innerRange.endColumn - : outerRange.endColumn >= innerRange.endColumn - : false; + ? exclusive + ? outerRange.endColumn > innerRange.endColumn + : outerRange.endColumn >= innerRange.endColumn + : false; return startsAfter && endsBefore; }; @@ -123,8 +123,8 @@ export const containsRange = ( * @param resolvedScript - the result of {@link resolveScript} from which to * extract errors */ -export const getResolutionErrors = ( - resolvedScript: ResolvedScript +export const getResolutionErrors = ( + resolvedScript: ResolvedScript, ): CompilationError[] => resolvedScript.reduce((errors, segment) => { switch (segment.type) { @@ -153,7 +153,7 @@ export const getResolutionErrors = ( /** * Verify that every error in the provided array can be resolved by providing * additional variables in the compilation data (rather than deeper issues, like - * problems with the authentication template or wallet implementation). + * problems with the wallet template or wallet implementation). * * Note, errors are only recoverable if the "entity ownership" of each missing * identifier is known (specified in `CompilationData`'s `entityOwnership`). @@ -161,10 +161,10 @@ export const getResolutionErrors = ( * @param errors - an array of compilation errors */ export const allErrorsAreRecoverable = ( - errors: CompilationError[] + errors: CompilationError[], ): errors is CompilationErrorRecoverable[] => errors.every( - (error) => 'missingIdentifier' in error && 'owningEntity' in error + (error) => 'missingIdentifier' in error && 'owningEntity' in error, ); /** @@ -172,18 +172,18 @@ export const allErrorsAreRecoverable = ( * or `opcode` property contains the full identifier that resolved * to `bytecode`. */ -export interface CashAssemblyResolution { +export type CashAssemblyResolution = { bytecode: Uint8Array; type: ResolvedSegmentLiteralType | 'opcode' | 'script' | 'variable'; text: string; -} +}; /** * Get an array of all resolutions used in a {@link ResolvedScript}. * @param resolvedScript - the resolved script to search */ -export const extractBytecodeResolutions = ( - resolvedScript: ResolvedScript +export const extractBytecodeResolutions = ( + resolvedScript: ResolvedScript, ): CashAssemblyResolution[] => // eslint-disable-next-line complexity resolvedScript.reduce((all, segment) => { @@ -205,7 +205,7 @@ export const extractBytecodeResolutions = ( if ('script' in segment) { return [ ...all, - ...extractBytecodeResolutions(segment.source), + ...extractBytecodeResolutions(segment.source.resolve), { bytecode: segment.value, text: segment.script, @@ -242,8 +242,8 @@ export const extractBytecodeResolutions = ( * * @param resolvedScript - the resolved script to search */ -export const extractResolvedVariableBytecodeMap = ( - resolvedScript: ResolvedScript +export const extractResolvedVariableBytecodeMap = ( + resolvedScript: ResolvedScript, ) => extractBytecodeResolutions(resolvedScript).reduce<{ [fullIdentifier: string]: Uint8Array; @@ -252,7 +252,7 @@ export const extractResolvedVariableBytecodeMap = ( resolution.type === 'variable' ? { ...all, [resolution.text]: resolution.bytecode } : all, - {} + {}, ); /** @@ -267,14 +267,14 @@ export const extractResolvedVariableBytecodeMap = ( * @param separator - the characters with which to join the formatted errors. */ export const stringifyErrors = (errors: CompilationError[], separator = '; ') => - `${errors + errors .map( (error) => - `[${error.range.startLineNumber}, ${error.range.startColumn}] ${error.error}` + `[${error.range.startLineNumber}, ${error.range.startColumn}] ${error.error}`, ) - .join(separator)}`; + .join(separator); -export interface SampleExtractionResult { +export type SampleExtractionResult = { /** * The samples successfully extracted from the provided `nodes` and `trace`. * @@ -299,7 +299,7 @@ export interface SampleExtractionResult { * returned in `unmatchedStates`. */ unmatchedStates: ProgramState[]; -} +}; /** * Extract a set of "evaluation samples" from the result of a CashAssembly @@ -461,7 +461,7 @@ export const extractEvaluationSamples = ({ let nextNode = 0; // eslint-disable-next-line functional/no-let, @typescript-eslint/init-declarations let incomplete: { bytecode: Uint8Array; range: Range } | undefined; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (nextState < traceWithoutFinalState.length && nextNode < nodes.length) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const currentNode = nodes[nextNode]!; @@ -495,7 +495,7 @@ export const extractEvaluationSamples = ({ const firstUnmatchedStateIndex = nextState + validInstructions.length; const matchingStates = traceWithoutFinalState.slice( nextState, - firstUnmatchedStateIndex + firstUnmatchedStateIndex, ); const pairedStates = validInstructions.map((instruction, index) => ({ instruction, @@ -511,9 +511,9 @@ export const extractEvaluationSamples = ({ }; const closesCurrentlyOpenSample = incomplete !== undefined; - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (closesCurrentlyOpenSample) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data samples.push({ evaluationRange, instruction: firstPairedState.instruction, @@ -524,7 +524,7 @@ export const extractEvaluationSamples = ({ } const firstUndefinedStateIndex = pairedStates.findIndex( - ({ state }) => state === undefined + ({ state }) => state === undefined, ); const sampleHasError = firstUndefinedStateIndex !== -1; const sampleClosingIndex = sampleHasError @@ -533,7 +533,7 @@ export const extractEvaluationSamples = ({ const closesASecondSample = !closesCurrentlyOpenSample || sampleClosingIndex > 0; - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (closesASecondSample) { const finalState = pairedStates[sampleClosingIndex] as { instruction: AuthenticationInstructionMaybeMalformed; @@ -542,12 +542,12 @@ export const extractEvaluationSamples = ({ const secondSamplePairsBegin = closesCurrentlyOpenSample ? 1 : 0; const internalStates = pairedStates.slice( secondSamplePairsBegin, - sampleClosingIndex + sampleClosingIndex, ) as { instruction: AuthenticationInstructionMaybeMalformed; state: ProgramState; }[]; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data samples.push({ evaluationRange, instruction: finalState.instruction, @@ -557,27 +557,27 @@ export const extractEvaluationSamples = ({ }); } - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements nextState = firstUnmatchedStateIndex; - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (authenticationInstructionIsMalformed(lastInstruction)) { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements incomplete = { bytecode: encodeAuthenticationInstructionMalformed(lastInstruction), range: currentNode.range, }; - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements } else { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements incomplete = undefined; } - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements } else { const lastInstruction = decoded[decoded.length - 1] as | AuthenticationInstructionMalformed | undefined; - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements incomplete = lastInstruction === undefined ? undefined @@ -587,7 +587,7 @@ export const extractEvaluationSamples = ({ range: mergedRange, }; } - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements nextNode += 1; } @@ -642,12 +642,12 @@ export const extractEvaluationSamplesRecursive = ({ }): SampleExtractionResult => { const extractEvaluations = ( node: ScriptReductionTraceChildNode, - depth = 1 + depth = 1, ): EvaluationSample[] => { if ('push' in node) { return node.push.script.reduce[]>( (all, childNode) => [...all, ...extractEvaluations(childNode, depth)], - [] + [], ); } if ('source' in node) { @@ -658,7 +658,7 @@ export const extractEvaluationSamplesRecursive = ({ ...all, ...extractEvaluations(childNode, depth + 1), ], - [] + [], ); const traceWithoutUnlockingPhase = node.trace.slice(1); const evaluationBeginToken = '$('; @@ -686,7 +686,7 @@ export const extractEvaluationSamplesRecursive = ({ const childSamples = nodes.reduce[]>( (all, node) => [...all, ...extractEvaluations(node)], - [] + [], ); const endingOrderedSamples = [...samples, ...childSamples].sort((a, b) => { @@ -703,7 +703,7 @@ export const extractEvaluationSamplesRecursive = ({ }; const stateIsExecuting = ( - state: AuthenticationProgramStateControlStack + state: AuthenticationProgramStateControlStack, ) => state.controlStack.every((item) => item !== false); /** @@ -735,10 +735,10 @@ const stateIsExecuting = ( * executing), defaults to `1,1` */ export const extractUnexecutedRanges = < - ProgramState extends AuthenticationProgramStateControlStack + ProgramState extends AuthenticationProgramStateControlStack, >( samples: EvaluationSample[], - evaluationBegins = '1,1' + evaluationBegins = '1,1', ) => { const reduced = samples.reduce<{ precedingStateSkipsByEvaluation: { @@ -778,7 +778,7 @@ export const extractUnexecutedRanges = < [evaluationBegins]: false, }, unexecutedRanges: [], - } + }, ); const canHaveContainedRanges = 2; @@ -794,7 +794,7 @@ export const extractUnexecutedRanges = < return [range, ...all]; }, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - [reduced.unexecutedRanges[reduced.unexecutedRanges.length - 1]!] + [reduced.unexecutedRanges[reduced.unexecutedRanges.length - 1]!], ); return containedRangesExcluded; }; @@ -825,9 +825,9 @@ export const summarizeDebugTrace = < AuthenticationProgramStateControlStack & AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack)[] + AuthenticationProgramStateStack)[], >( - trace: Trace + trace: Trace, ) => trace.reduce< { @@ -839,7 +839,7 @@ export const summarizeDebugTrace = < stack: string[]; }[] >( - // eslint-disable-next-line max-params + // eslint-disable-next-line @typescript-eslint/max-params (steps, state, stateIndex, states) => { const nextState = states[stateIndex + 1]; return nextState === undefined @@ -859,7 +859,7 @@ export const summarizeDebugTrace = < }, ]; }, - [] + [], ); /** @@ -877,7 +877,7 @@ export const stringifyDebugTraceSummary = ( /** * An opcode enum, e.g. {@link OpcodesBCH}. */ - opcodes: Readonly<{ [opcode: number]: string }>; + opcodes: { [opcode: number]: string }; /** * The width of the instruction column. */ @@ -885,7 +885,7 @@ export const stringifyDebugTraceSummary = ( } = { opcodes: OpcodesBCHCHIPs, padInstruction: 23, - } + }, ) => summary .map( @@ -905,6 +905,6 @@ export const stringifyDebugTraceSummary = ( ? '' : `| alt: ${line.alternateStack.join(' ')}` }` - }` + }`, ) .join('\n'); diff --git a/src/lib/language/parse.spec.ts b/src/lib/language/parse.spec.ts index 1d21777a..5b709d08 100644 --- a/src/lib/language/parse.spec.ts +++ b/src/lib/language/parse.spec.ts @@ -193,7 +193,7 @@ test('parseScript: BigIntLiteral', (t) => { ], }, }, - stringifyTestVector(allowed) + stringifyTestVector(allowed), ); const maybeUnexpected = parseScript('_1 1_'); @@ -259,7 +259,7 @@ test('parseScript: BigIntLiteral', (t) => { ], }, }, - stringifyTestVector(maybeUnexpected) + stringifyTestVector(maybeUnexpected), ); const errors = parseScript('-_1'); @@ -286,7 +286,7 @@ test('parseScript: BigIntLiteral', (t) => { }, status: false, }, - stringifyTestVector(errors) + stringifyTestVector(errors), ); }); @@ -392,6 +392,44 @@ test('parseScript: UTF8Literal', (t) => { }); }); +test('parseScript: always lossy-normalizes unicode characters before parsing', (t) => { + const normalized = parseScript('"fit"'); + const ligature = parseScript('"fit"'); + t.deepEqual(normalized, { + status: true, + value: { + end: { + column: 6, + line: 1, + offset: 5, + }, + name: 'Script', + start: { + column: 1, + line: 1, + offset: 0, + }, + value: [ + { + end: { + column: 6, + line: 1, + offset: 5, + }, + name: 'UTF8Literal', + start: { + column: 1, + line: 1, + offset: 0, + }, + value: 'fit', + }, + ], + }, + }); + t.deepEqual(ligature, normalized); +}); + test('parseScript: HexLiteral', (t) => { t.deepEqual(parseScript('0xdeadbeef'), { status: true, @@ -502,7 +540,7 @@ test('parseScript: HexLiteral', (t) => { ], }, }, - stringifyTestVector(allowed) + stringifyTestVector(allowed), ); const maybeUnexpected = parseScript('0x 0x0_ 0x0_11 0x0_1_ 0x_01'); t.deepEqual( @@ -665,7 +703,7 @@ test('parseScript: HexLiteral', (t) => { ], }, }, - stringifyTestVector(maybeUnexpected) + stringifyTestVector(maybeUnexpected), ); }); @@ -705,7 +743,7 @@ test('parseScript: BinaryLiteral', (t) => { ], }, }, - stringifyTestVector(b1) + stringifyTestVector(b1), ); const b010101 = parseScript('0b010101'); t.deepEqual( @@ -742,7 +780,7 @@ test('parseScript: BinaryLiteral', (t) => { ], }, }, - stringifyTestVector(b010101) + stringifyTestVector(b010101), ); const allowed = parseScript('0b0 0b1 0b111 0b0_0 0b0000_0000__0000_0000'); t.deepEqual( @@ -835,7 +873,7 @@ test('parseScript: BinaryLiteral', (t) => { ], }, }, - stringifyTestVector(allowed) + stringifyTestVector(allowed), ); const maybeUnexpected = parseScript('0b 0b_ 0b_1 0b1_'); t.deepEqual( @@ -970,7 +1008,7 @@ test('parseScript: BinaryLiteral', (t) => { ], }, }, - stringifyTestVector(maybeUnexpected) + stringifyTestVector(maybeUnexpected), ); }); @@ -1010,7 +1048,7 @@ test('parseScript: comments', (t) => { ], }, }, - stringifyTestVector(single) + stringifyTestVector(single), ); const multi = parseScript(`/* \nmulti-line\n comment\n */`); t.deepEqual( @@ -1047,7 +1085,7 @@ test('parseScript: comments', (t) => { ], }, }, - stringifyTestVector(multi) + stringifyTestVector(multi), ); const multiple = parseScript(`/* comment before */ OP_1 /* comment after */`); t.deepEqual( @@ -1112,7 +1150,7 @@ test('parseScript: comments', (t) => { ], }, }, - stringifyTestVector(multiple) + stringifyTestVector(multiple), ); }); @@ -2117,6 +2155,6 @@ test('parseScript: complex script', (t) => { ], }, }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); diff --git a/src/lib/language/parse.ts b/src/lib/language/parse.ts index ad2b96ec..e542631b 100644 --- a/src/lib/language/parse.ts +++ b/src/lib/language/parse.ts @@ -1,3 +1,4 @@ +import { lossyNormalize } from '../format/format.js'; import type { ParseResult } from '../lib.js'; import { P } from './parsimmon.js'; @@ -9,7 +10,7 @@ const cashAssemblyParser = P.createLanguage({ P.optWhitespace, r.expression.sepBy(P.optWhitespace), P.optWhitespace, - (_, expressions) => expressions + (_, expressions) => expressions, ).node('Script'), expression: (r) => P.alt( @@ -20,7 +21,7 @@ const cashAssemblyParser = P.createLanguage({ r.binary, r.hex, r.bigint, - r.identifier + r.identifier, ), comment: (r) => P.alt(r.singleLineComment, r.multiLineComment).node('Comment'), @@ -28,22 +29,22 @@ const cashAssemblyParser = P.createLanguage({ P.seqMap( P.string('//').desc("the start of a single-line comment ('//')"), P.regexp(/[^\n]*/u), - (__, comment) => comment.trim() + (__, comment) => comment.trim(), ), multiLineComment: () => P.seqMap( P.string('/*').desc("the start of a multi-line comment ('/*')"), P.regexp(/[\s\S]*?\*\//u).desc( - "the end of this multi-line comment ('*/')" + "the end of this multi-line comment ('*/')", ), - (__, comment) => comment.slice(0, -'*/'.length).trim() + (__, comment) => comment.slice(0, -'*/'.length).trim(), ), push: (r) => P.seqMap( P.string('<').desc("the start of a push statement ('<')"), r.script, P.string('>').desc("the end of this push statement ('>')"), - (_, push) => push + (_, push) => push, ).node('Push'), evaluation: (r) => P.seqMap( @@ -51,7 +52,7 @@ const cashAssemblyParser = P.createLanguage({ P.string('(').desc("the opening parenthesis of this evaluation ('(')"), r.script, P.string(')').desc("the closing parenthesis of this evaluation (')')"), - (_, __, evaluation) => evaluation + (_, __, evaluation) => evaluation, ).node('Evaluation'), identifier: () => P.regexp(/[a-zA-Z_][.a-zA-Z0-9_-]*/u) @@ -63,28 +64,28 @@ const cashAssemblyParser = P.createLanguage({ P.string('"').desc('a double quote (")'), P.regexp(/[^"]*/u), P.string('"').desc('a closing double quote (")'), - (__, literal) => literal + (__, literal) => literal, ), P.seqMap( P.string("'").desc("a single quote (')"), P.regexp(/[^']*/u), P.string("'").desc("a closing single quote (')"), - (__, literal) => literal - ) + (__, literal) => literal, + ), ).node('UTF8Literal'), hex: () => P.seqMap( P.string('0x').desc("a hex literal ('0x...')"), P.regexp(/[0-9a-f]_*(?:_*[0-9a-f]_*[0-9a-f]_*)*[0-9a-f]/iu).desc( - 'a valid hexadecimal string' + 'a valid hexadecimal string', ), - (__, literal) => literal + (__, literal) => literal, ).node('HexLiteral'), binary: () => P.seqMap( P.string('0b').desc("a binary literal ('0b...')"), P.regexp(/[01]+(?:[01_]*[01]+)*/iu).desc('a string of binary digits'), - (__, literal) => literal + (__, literal) => literal, ).node('BinaryLiteral'), bigint: () => P.regexp(/-?[0-9]+(?:[0-9_]*[0-9]+)*/u) @@ -94,4 +95,4 @@ const cashAssemblyParser = P.createLanguage({ /* eslint-enable sort-keys, @typescript-eslint/naming-convention, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ export const parseScript = (script: string) => - cashAssemblyParser.script.parse(script) as ParseResult; + cashAssemblyParser.script.parse(lossyNormalize(script)) as ParseResult; diff --git a/src/lib/language/parsimmon.ts b/src/lib/language/parsimmon.ts index fd609849..e1298278 100644 --- a/src/lib/language/parsimmon.ts +++ b/src/lib/language/parsimmon.ts @@ -2,44 +2,44 @@ * This file is derived from https://github.com/jneen/parsimmon and * https://github.com/DefinitelyTyped/DefinitelyTyped. */ -/* eslint-disable @typescript-eslint/unified-signatures, functional/no-method-signature, functional/no-throw-statement, functional/no-conditional-statement, @typescript-eslint/no-this-alias, consistent-this, @typescript-eslint/ban-ts-comment, prefer-spread, @typescript-eslint/restrict-template-expressions, func-names, @typescript-eslint/init-declarations, new-cap, @typescript-eslint/require-array-sort-compare, guard-for-in, no-plusplus, functional/no-let, functional/no-loop-statement, @typescript-eslint/prefer-for-of, @typescript-eslint/restrict-plus-operands, functional/immutable-data, @typescript-eslint/no-use-before-define, @typescript-eslint/strict-boolean-expressions, no-param-reassign, functional/no-expression-statement, functional/no-this-expression, @typescript-eslint/no-explicit-any, func-style, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return, @typescript-eslint/naming-convention, @typescript-eslint/method-signature-style, @typescript-eslint/no-confusing-void-expression, prefer-arrow-callback, functional/no-return-void, @typescript-eslint/no-unsafe-argument */ +/* eslint-disable @typescript-eslint/unified-signatures, functional/prefer-property-signatures, functional/no-throw-statements, functional/no-conditional-statements, @typescript-eslint/no-this-alias, consistent-this, @typescript-eslint/ban-ts-comment, prefer-spread, func-names, @typescript-eslint/init-declarations, new-cap, guard-for-in, no-plusplus, functional/no-let, functional/no-loop-statements, @typescript-eslint/prefer-for-of, functional/immutable-data, @typescript-eslint/no-use-before-define, @typescript-eslint/strict-boolean-expressions, no-param-reassign, functional/no-expression-statements, functional/no-this-expressions, @typescript-eslint/no-explicit-any, func-style, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return, @typescript-eslint/naming-convention, @typescript-eslint/method-signature-style, @typescript-eslint/no-confusing-void-expression, prefer-arrow-callback, functional/no-return-void, @typescript-eslint/no-unsafe-argument, functional/functional-parameters */ // cspell: ignore accum -interface Index { +type Index = { /** zero-based character offset */ offset: number; /** one-based line offset */ line: number; /** one-based column offset */ column: number; -} +}; -interface Mark { +type Mark = { start: Index; end: Index; value: T; -} +}; -interface Node extends Mark { +type Node = Mark & { name: Name; -} +}; type Result = Failure | Success; -interface Success { +type Success = { status: true; value: T; -} +}; -interface Failure { +type Failure = { status: false; expected: string[]; index: Index; -} +}; type TypedRule = { [P in keyof TLanguageSpec]: ( - r: TypedLanguage + r: TypedLanguage, ) => Parser; }; @@ -47,7 +47,7 @@ type TypedLanguage = { [P in keyof TLanguageSpec]: Parser; }; -interface Parser { +type Parser = { parse(input: string): Result; or(otherParser: Parser): Parser; then(call: (result: T) => Parser): Parser; @@ -59,7 +59,7 @@ interface Parser { node(name: Name): Parser>; desc(description: string[] | string): Parser; sepBy(separator: Parser): Parser; -} +}; function Parsimmon(action: any) { // @ts-expect-error @@ -185,20 +185,20 @@ function seqMap(p1: Parser, cb: (a1: T) => U): Parser; function seqMap( p1: Parser, p2: Parser, - cb: (a1: T, a2: U) => V + cb: (a1: T, a2: U) => V, ): Parser; function seqMap( p1: Parser, p2: Parser, p3: Parser, - cb: (a1: T, a2: U, a3: V) => W + cb: (a1: T, a2: U, a3: V) => W, ): Parser; function seqMap( p1: Parser, p2: Parser, p3: Parser, p4: Parser, - cb: (a1: T, a2: U, a3: V, a4: W) => X + cb: (a1: T, a2: U, a3: V, a4: W) => X, ): Parser; function seqMap( p1: Parser, @@ -206,7 +206,7 @@ function seqMap( p3: Parser, p4: Parser, p5: Parser, - cb: (a1: T, a2: U, a3: V, a4: W, a5: X) => Y + cb: (a1: T, a2: U, a3: V, a4: W, a5: X) => Y, ): Parser; function seqMap(...params: any[]) { const args = [].slice.call(params); @@ -299,7 +299,7 @@ _.many = function () { /* istanbul ignore if */ if (i === result.index) { throw new Error( 'infinite loop detected in .many() parser --- calling .many() on ' + - 'a parser that can accept zero characters is usually the cause' + 'a parser that can accept zero characters is usually the cause', ); } i = result.index; @@ -340,7 +340,7 @@ _.node = function (name: any) { start, value, }; - } + }, ); }; diff --git a/src/lib/language/reduce.spec.ts b/src/lib/language/reduce.spec.ts index bc81efe8..5cf82724 100644 --- a/src/lib/language/reduce.spec.ts +++ b/src/lib/language/reduce.spec.ts @@ -16,7 +16,7 @@ test('reduceScript: does not throw on empty array', (t) => { }, script: [], }, - stringify(reduced) + stringify(reduced), ); }); @@ -79,7 +79,7 @@ test('reduceScript: resolution error', (t) => { }, ], }, - stringify(reduced) + stringify(reduced), ); }); @@ -96,6 +96,6 @@ test('reduceScript: invalid ResolvedScript', (t) => { type: "uncaught because the consumer isn't using TypeScript" as 'error', value: 'Another kind of value', }, - ]) + ]), ); }); diff --git a/src/lib/language/reduce.ts b/src/lib/language/reduce.ts index 581c9181..47e10fd5 100644 --- a/src/lib/language/reduce.ts +++ b/src/lib/language/reduce.ts @@ -38,9 +38,9 @@ const emptyReductionTraceNode = (range: Range) => ({ export const verifyCashAssemblyEvaluationState = < ProgramState extends AuthenticationProgramStateControlStack & AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: ProgramState + state: ProgramState, ) => { if (state.error !== undefined) { return state.error; @@ -72,15 +72,15 @@ export const reduceScript = < AuthenticationProgramStateError & AuthenticationProgramStateStack, AuthenticationProgram, - ResolvedTransaction + ResolvedTransaction, >( - resolvedScript: ResolvedScript, + resolvedScript: ResolvedScript, vm?: AuthenticationVirtualMachine< ResolvedTransaction, AuthenticationProgram, ProgramState >, - createEvaluationProgram?: (instructions: Uint8Array) => AuthenticationProgram + createEvaluationProgram?: (instructions: Uint8Array) => AuthenticationProgram, ): ScriptReductionTraceScriptNode => { const script = resolvedScript.map< ScriptReductionTraceChildNode @@ -118,7 +118,7 @@ export const reduceScript = < const reductionTrace = reduceScript( segment.value, vm, - createEvaluationProgram + createEvaluationProgram, ); if (reductionTrace.errors !== undefined) { return { @@ -129,7 +129,7 @@ export const reduceScript = < }; } const trace = vm.debug( - createEvaluationProgram(reductionTrace.bytecode) + createEvaluationProgram(reductionTrace.bytecode), ); /** @@ -174,9 +174,11 @@ export const reduceScript = < }; default: - // eslint-disable-next-line functional/no-throw-statement, @typescript-eslint/no-throw-literal + // eslint-disable-next-line functional/no-throw-statements, @typescript-eslint/no-throw-literal throw new Error( - `"${(segment as { type: string }).type}" is not a known segment type.` + `"${ + (segment as { type: string }).type + }" is not a known segment type.`, ) as never; } }); @@ -190,14 +192,11 @@ export const reduceScript = < ranges: [...all.ranges, segment.range], ...(all.errors !== undefined || segment.errors !== undefined ? { - errors: [ - ...(all.errors === undefined ? [] : all.errors), - ...(segment.errors === undefined ? [] : segment.errors), - ], + errors: [...(all.errors ?? []), ...(segment.errors ?? [])], } : undefined), }), - { bytecode: [], ranges: [] } + { bytecode: [], ranges: [] }, ); return { @@ -208,7 +207,7 @@ export const reduceScript = < range: mergeRanges( reduction.ranges, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - resolvedScript.length === 0 ? undefined : resolvedScript[0]!.range + resolvedScript.length === 0 ? undefined : resolvedScript[0]!.range, ), script, }; diff --git a/src/lib/language/resolve.spec.ts b/src/lib/language/resolve.spec.ts index 9c490bb2..4d8681bf 100644 --- a/src/lib/language/resolve.spec.ts +++ b/src/lib/language/resolve.spec.ts @@ -58,7 +58,7 @@ test('resolveScriptSegment: error on unrecognized parse results', (t) => { type: 'error', value: 'Unrecognized segment: Unknown', }, - ] + ], ); }); @@ -68,7 +68,7 @@ test('resolveScriptSegment: marks unknown identifier types', (t) => { t.fail('Parse failed.'); return; } - const malformedResolver: IdentifierResolutionFunction = () => ({ + const malformedResolver: IdentifierResolutionFunction = () => ({ bytecode: Uint8Array.of(), status: true, type: 'unknown-type' as IdentifierResolutionType.variable, @@ -86,5 +86,5 @@ test('resolveScriptSegment: marks unknown identifier types', (t) => { unknown: 'some_identifier', value: Uint8Array.of(), }, - ] as unknown as ResolvedScript); + ] as unknown as ResolvedScript); }); diff --git a/src/lib/language/resolve.ts b/src/lib/language/resolve.ts index 41220262..d619d6a2 100644 --- a/src/lib/language/resolve.ts +++ b/src/lib/language/resolve.ts @@ -4,11 +4,9 @@ import type { AuthenticationProgramStateControlStack, AuthenticationProgramStateMinimum, AuthenticationProgramStateStack, - AuthenticationTemplateVariable, CashAssemblyScriptSegment, CompilationData, CompilationResultSuccess, - CompilerConfiguration, CompilerOperation, CompilerOperationResult, IdentifierResolutionFunction, @@ -16,6 +14,7 @@ import type { Range, ResolvedScript, ResolvedSegment, + WalletTemplateVariable, } from '../lib.js'; import { bigIntToVmNumber } from '../vm/vm.js'; @@ -38,12 +37,12 @@ const pluckRange = (node: MarkedNode): Range => ({ const removeNumericSeparators = (numericLiteral: string) => numericLiteral.replace(/_/gu, ''); -export const resolveScriptSegment = ( +export const resolveScriptSegment = ( segment: CashAssemblyScriptSegment, - resolveIdentifiers: IdentifierResolutionFunction -): ResolvedScript => { + resolveIdentifiers: IdentifierResolutionFunction, +): ResolvedScript => { // eslint-disable-next-line complexity - const resolved = segment.value.map((child) => { + const resolved = segment.value.map>((child) => { const range = pluckRange(child); switch (child.name) { case 'Identifier': { @@ -59,17 +58,17 @@ export const resolveScriptSegment = ( opcode: identifier, } : result.type === IdentifierResolutionType.variable - ? { - ...('debug' in result ? { debug: result.debug } : {}), - ...('signature' in result - ? { signature: result.signature } - : {}), - variable: identifier, - } - : // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - result.type === IdentifierResolutionType.script - ? { script: identifier, source: result.source } - : ({ unknown: identifier } as never)), + ? { + ...('debug' in result ? { debug: result.debug } : {}), + ...('signature' in result + ? { signature: result.signature } + : {}), + variable: identifier, + } + : // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + result.type === IdentifierResolutionType.script + ? { script: identifier, source: result.source } + : ({ unknown: identifier } as never)), } : { ...('debug' in result ? { debug: result.debug } : {}), @@ -157,7 +156,7 @@ export enum BuiltInVariables { const attemptCompilerOperation = < CompilationContext, - Configuration extends AnyCompilerConfiguration + Configuration extends AnyCompilerConfiguration, >({ data, configuration, @@ -182,7 +181,7 @@ const attemptCompilerOperation = < }): CompilerOperationResult => { if (matchingOperations === undefined) { return { - error: `The "${variableId}" variable type can not be resolved because the "${variableType}" operation has not been included in this compiler's CompilationEnvironment.`, + error: `The "${variableId}" variable type can not be resolved because the "${variableType}" operation has not been included in this compiler's configuration.`, status: 'error', }; } @@ -221,19 +220,19 @@ const attemptCompilerOperation = < */ export const resolveVariableIdentifier = < CompilationContext, - Environment extends AnyCompilerConfiguration + Configuration extends AnyCompilerConfiguration, >({ data, configuration, identifier, }: { data: CompilationData; - configuration: Environment; + configuration: Configuration; identifier: string; }): CompilerOperationResult => { const [variableId, operationId] = identifier.split('.') as [ string, - string | undefined + string | undefined, ]; switch (variableId) { @@ -269,7 +268,7 @@ export const resolveVariableIdentifier = < variableType: 'signingSerialization', }); default: { - const expectedVariable: AuthenticationTemplateVariable | undefined = + const expectedVariable: WalletTemplateVariable | undefined = configuration.variables?.[variableId]; if (expectedVariable === undefined) { @@ -323,9 +322,9 @@ export const describeExpectedInput = (expectedArray: string[]) => { */ const EOF = 'EOF'; const newArray = expectedArray.filter((value) => value !== EOF); - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (newArray.length !== expectedArray.length) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data newArray.push('the end of the script'); } const withoutLastElement = newArray.slice(0, newArray.length - 1); @@ -337,8 +336,8 @@ export const describeExpectedInput = (expectedArray: string[]) => { newArray.length >= arrayRequiresCommas ? withoutLastElement.join(', ').concat(`, or ${lastElement}`) : newArray.length === arrayRequiresOr - ? newArray.join(' or ') - : lastElement + ? newArray.join(' or ') + : lastElement }.`; }; @@ -359,14 +358,14 @@ export const compileScriptRaw = < AuthenticationProgramStateStack = AuthenticationProgramStateControlStack & AuthenticationProgramStateMinimum & AuthenticationProgramStateStack, - CompilationContext = unknown + CompilationContext = unknown, >({ data, configuration, scriptId, }: { data: CompilationData; - configuration: CompilerConfiguration; + configuration: AnyCompilerConfiguration; scriptId: string; }): CompilationResult => { const script = configuration.scripts[scriptId]; @@ -389,7 +388,7 @@ export const compileScriptRaw = < errors: [ { error: `A circular dependency was encountered: script "${scriptId}" relies on itself to be generated. (Source scripts: ${configuration.sourceScriptIds.join( - ' β†’ ' + ' β†’ ', )})`, range: createEmptyRange(), }, @@ -437,7 +436,7 @@ export const resolveScriptIdentifier = ({ /** * the provided {@link CompilerConfiguration} */ - configuration: CompilerConfiguration; + configuration: AnyCompilerConfiguration; }): CompilationResultSuccess | string | false => { if (configuration.scripts[identifier] === undefined) { return false; @@ -453,7 +452,7 @@ export const resolveScriptIdentifier = ({ } return `Compilation error in resolved script "${identifier}": ${stringifyErrors( - result.errors + result.errors, )}`; }; @@ -465,7 +464,7 @@ export const resolveScriptIdentifier = ({ * `IdentifierResolutionFunction` will be used. */ export const createIdentifierResolver = - ({ + ({ data, configuration, }: { @@ -478,10 +477,12 @@ export const createIdentifierResolver = * A snapshot of the configuration around `scriptId`, see * {@link CompilerConfiguration} for details */ - configuration: CompilerConfiguration; - }): IdentifierResolutionFunction => + configuration: AnyCompilerConfiguration; + }): IdentifierResolutionFunction => // eslint-disable-next-line complexity - (identifier: string): ReturnType => { + ( + identifier: string, + ): ReturnType> => { const opcodeResult: Uint8Array | undefined = configuration.opcodes?.[identifier]; if (opcodeResult !== undefined) { @@ -543,7 +544,7 @@ export const createIdentifierResolver = } : { bytecode: scriptResult.bytecode, - source: scriptResult.resolve, + source: scriptResult, status: true, type: IdentifierResolutionType.script, }; @@ -563,7 +564,7 @@ export const compileScriptContents = < ProgramState extends AuthenticationProgramStateControlStack & AuthenticationProgramStateStack = AuthenticationProgramStateControlStack & AuthenticationProgramStateStack, - CompilationContext = unknown + CompilationContext = unknown, >({ data, configuration, @@ -571,7 +572,7 @@ export const compileScriptContents = < }: { script: string; data: CompilationData; - configuration: CompilerConfiguration; + configuration: AnyCompilerConfiguration; }): CompilationResult => { const parseResult = parseScript(script); if (!parseResult.status) { @@ -606,7 +607,7 @@ export const compileScriptContents = < const reduction = reduceScript( resolvedScript, configuration.vm, - configuration.createAuthenticationProgram + configuration.createAuthenticationProgram, ); return { ...(reduction.errors === undefined diff --git a/src/lib/lib.ts b/src/lib/lib.ts index 24fe911c..fde4cae9 100644 --- a/src/lib/lib.ts +++ b/src/lib/lib.ts @@ -1,12 +1,13 @@ export * from './address/address.js'; export * from './bin/bin.js'; +export * from './compiler/compiler.js'; export * from './crypto/crypto.js'; +export * from './engine/engine.js'; export * from './format/format.js'; export * from './key/key.js'; export * from './language/language.js'; export * from './message/message.js'; export * from './schema/schema.js'; -export * from './compiler/compiler.js'; export * from './transaction/transaction.js'; export * from './vm/vm.js'; export * from './vmb-tests/vmb-tests.js'; diff --git a/src/lib/mappings.spec.ts b/src/lib/mappings.spec.ts index 6d3cfb74..e33ae1f5 100644 --- a/src/lib/mappings.spec.ts +++ b/src/lib/mappings.spec.ts @@ -68,6 +68,7 @@ import { SigningSerializationTypeBCH, } from './lib.js'; +/* eslint-disable @typescript-eslint/no-duplicate-type-constituents */ type TypeTests = | AssertTypesEqual< AuthenticationProgramStateBCH, @@ -83,6 +84,7 @@ type TypeTests = | AssertTypesEqual | AssertTypesEqual; // TODO: AssertTypesEqual` +/* eslint-enable @typescript-eslint/no-duplicate-type-constituents */ test('Libauth exposes all expected mappings', (t) => { const testTypes: TypeTests = true; @@ -90,15 +92,15 @@ test('Libauth exposes all expected mappings', (t) => { t.deepEqual(AuthenticationErrorBCH2023, AuthenticationErrorBCH); t.deepEqual( cloneAuthenticationProgramStateCommon, - cloneAuthenticationProgramStateBCH + cloneAuthenticationProgramStateBCH, ); t.deepEqual( cloneAuthenticationProgramState, - cloneAuthenticationProgramStateBCH + cloneAuthenticationProgramStateBCH, ); t.deepEqual( compilerConfigurationToCompilerBCH, - compilerConfigurationToCompiler + compilerConfigurationToCompiler, ); t.deepEqual(createInstructionSetBCH2023, createInstructionSetBCH); t.deepEqual(createVirtualMachineBCH2023, createVirtualMachineBCH); diff --git a/src/lib/message/read-components.ts b/src/lib/message/read-components.ts index 0b2ec312..b162efec 100644 --- a/src/lib/message/read-components.ts +++ b/src/lib/message/read-components.ts @@ -28,7 +28,7 @@ export const readBytes = /** * the {@link ReadPosition} at which to start reading the bytes. */ - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const nextPosition: ReadPosition = { bin: position.bin, @@ -38,7 +38,7 @@ export const readBytes = if (result.length !== length) { return formatError( ReadBytesError.insufficientLength, - `Provided length: ${result.length}` + `Provided length: ${result.length}`, ); } return { position: nextPosition, result }; @@ -56,7 +56,7 @@ export enum ReadUint32LEError { * @param position - the {@link ReadPosition} at which to start reading */ export const readUint32LE = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const nextPosition: ReadPosition = { bin: position.bin, @@ -66,7 +66,7 @@ export const readUint32LE = ( if (uint32LEBin.length !== ReadConstants.bytesPerUint32) { return formatError( ReadUint32LEError.insufficientBytes, - `Provided length: ${uint32LEBin.length}` + `Provided length: ${uint32LEBin.length}`, ); } const result = binToNumberUint32LE(uint32LEBin); @@ -85,7 +85,7 @@ export enum ReadUint64LEError { * {@link Output.valueSatoshis} */ export const readUint64LE = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const nextPosition: ReadPosition = { bin: position.bin, @@ -95,7 +95,7 @@ export const readUint64LE = ( if (uint64LEBin.length !== ReadConstants.bytesPerUint64) { return formatError( ReadUint64LEError.insufficientBytes, - `Provided length: ${uint64LEBin.length}` + `Provided length: ${uint64LEBin.length}`, ); } const result = binToBigIntUint64LE(uint64LEBin); @@ -119,7 +119,7 @@ export enum CompactUintPrefixedBinError { * `CompactUint`-prefixed bin (`Uint8Array`) */ export const readCompactUintPrefixedBin = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const read = readCompactUintMinimal(position); if (typeof read === 'string') { @@ -132,7 +132,7 @@ export const readCompactUintPrefixedBin = ( if (contents.length !== length) { return formatError( CompactUintPrefixedBinError.insufficientBytes, - `Required bytes: ${length}, remaining bytes: ${contents.length}` + `Required bytes: ${length}, remaining bytes: ${contents.length}`, ); } return { position: nextPosition, result: contents }; diff --git a/src/lib/message/transaction-encoding.spec.ts b/src/lib/message/transaction-encoding.spec.ts index b1786ced..571a169e 100644 --- a/src/lib/message/transaction-encoding.spec.ts +++ b/src/lib/message/transaction-encoding.spec.ts @@ -78,14 +78,14 @@ test('decodeTransaction', (t) => { * a148ca38 ← locktime (BinUint32LE) */ const tx = hexToBin( - '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38' + '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38', ); t.deepEqual(decodeTransactionCommon(tx), { inputs: [ { outpointIndex: 3, outpointTransactionHash: hexToBin( - '1eca9d89dfe01a50627c0d1e8befbe005234aefee08dfec1a380009b46f9162d' + '1eca9d89dfe01a50627c0d1e8befbe005234aefee08dfec1a380009b46f9162d', ), sequenceNumber: 4294967295, unlockingBytecode: hexToBin('6a0065525365'), @@ -93,7 +93,7 @@ test('decodeTransaction', (t) => { { outpointIndex: 3, outpointTransactionHash: hexToBin( - 'fd1718e192d832ce48fca0508084186bdd410f6a0b5d9bd8ddab8b5e339a4ad1' + 'fd1718e192d832ce48fca0508084186bdd410f6a0b5d9bd8ddab8b5e339a4ad1', ), sequenceNumber: 4079810175, unlockingBytecode: hexToBin('63acac0053520052'), @@ -101,7 +101,7 @@ test('decodeTransaction', (t) => { { outpointIndex: 2, outpointTransactionHash: hexToBin( - 'e023f2ebc7f212764f6e15556b26b586801a12503930e6d5ae0e184e06d930ad' + 'e023f2ebc7f212764f6e15556b26b586801a12503930e6d5ae0e184e06d930ad', ), sequenceNumber: 4294967295, unlockingBytecode: hexToBin('00'), @@ -109,7 +109,7 @@ test('decodeTransaction', (t) => { { outpointIndex: 1, outpointTransactionHash: hexToBin( - 'ba88ff9d44fd01d1c0c0a5b416e00e79b4824606a3a70f163159b5ce3aca7362' + 'ba88ff9d44fd01d1c0c0a5b416e00e79b4824606a3a70f163159b5ce3aca7362', ), sequenceNumber: 1025685667, unlockingBytecode: hexToBin('5351ac526a'), @@ -144,7 +144,7 @@ test('encodeTransaction', (t) => { { outpointIndex: 3, outpointTransactionHash: hexToBin( - '1eca9d89dfe01a50627c0d1e8befbe005234aefee08dfec1a380009b46f9162d' + '1eca9d89dfe01a50627c0d1e8befbe005234aefee08dfec1a380009b46f9162d', ), sequenceNumber: 4294967295, unlockingBytecode: hexToBin('6a0065525365'), @@ -152,7 +152,7 @@ test('encodeTransaction', (t) => { { outpointIndex: 3, outpointTransactionHash: hexToBin( - 'fd1718e192d832ce48fca0508084186bdd410f6a0b5d9bd8ddab8b5e339a4ad1' + 'fd1718e192d832ce48fca0508084186bdd410f6a0b5d9bd8ddab8b5e339a4ad1', ), sequenceNumber: 4079810175, unlockingBytecode: hexToBin('63acac0053520052'), @@ -160,7 +160,7 @@ test('encodeTransaction', (t) => { { outpointIndex: 2, outpointTransactionHash: hexToBin( - 'e023f2ebc7f212764f6e15556b26b586801a12503930e6d5ae0e184e06d930ad' + 'e023f2ebc7f212764f6e15556b26b586801a12503930e6d5ae0e184e06d930ad', ), sequenceNumber: 4294967295, unlockingBytecode: hexToBin('00'), @@ -168,7 +168,7 @@ test('encodeTransaction', (t) => { { outpointIndex: 1, outpointTransactionHash: hexToBin( - 'ba88ff9d44fd01d1c0c0a5b416e00e79b4824606a3a70f163159b5ce3aca7362' + 'ba88ff9d44fd01d1c0c0a5b416e00e79b4824606a3a70f163159b5ce3aca7362', ), sequenceNumber: 1025685667, unlockingBytecode: hexToBin('5351ac526a'), @@ -198,8 +198,8 @@ test('encodeTransaction', (t) => { t.deepEqual( encodeTransactionCommon(tx), hexToBin( - '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38' - ) + '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38', + ), ); }); @@ -209,15 +209,15 @@ test('decode and encode transaction', (t) => { t.deepEqual( hexToBin(tx), encodeTransactionCommon( - decodeTransactionCommon(hexToBin(tx)) as TransactionCommon - ) + decodeTransactionCommon(hexToBin(tx)) as TransactionCommon, + ), ); }); test('decodeTransaction: invalid', (t) => { t.deepEqual( decodeTransactionCommon(hexToBin('00')), - 'Error reading transaction. Error reading Uint32LE: requires 4 bytes. Provided length: 1' + 'Error reading transaction. Error reading Uint32LE: requires 4 bytes. Provided length: 1', ); }); @@ -237,22 +237,22 @@ test('hashTransaction, hashTransactionUiOrder, hashTransactionP2pOrder', (t) => t.deepEqual(hashTransactionP2pOrder(hexToBin(tx)), hexToBin(txId).reverse()); t.deepEqual( hashTransactionP2pOrder(hexToBin(tx), sha256), - hexToBin(txId).reverse() + hexToBin(txId).reverse(), ); t.deepEqual(hashTransaction(hexToBin(halTx)), halTxId); t.deepEqual(hashTransactionUiOrder(hexToBin(halTx)), hexToBin(halTxId)); t.deepEqual( hashTransactionUiOrder(hexToBin(halTx), sha256), - hexToBin(halTxId) + hexToBin(halTxId), ); t.deepEqual( hashTransactionP2pOrder(hexToBin(halTx)), - hexToBin(halTxId).reverse() + hexToBin(halTxId).reverse(), ); t.deepEqual( hashTransactionP2pOrder(hexToBin(halTx), sha256), - hexToBin(halTxId).reverse() + hexToBin(halTxId).reverse(), ); }); @@ -295,7 +295,7 @@ test('CashTokens: token-prefix-valid.json', (t) => { return t.fail( `${failMessage} Prefix "${prefixHex}" includes unexpected bytes. Bytes remaining after read: ${ decoded.position.bin.length - decoded.position.index - }, ` + }, `, ); } return t.deepEqual(decoded.result.token, token); diff --git a/src/lib/message/transaction-encoding.ts b/src/lib/message/transaction-encoding.ts index 975b10c2..c4a1e5b7 100644 --- a/src/lib/message/transaction-encoding.ts +++ b/src/lib/message/transaction-encoding.ts @@ -64,7 +64,7 @@ export enum TransactionDecodingError { * transaction output */ export const readTransactionInput = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const inputRead = readMultiple(position, [ readBytes(TransactionConstants.outpointTransactionHashLength), @@ -103,7 +103,7 @@ export const readTransactionInput = ( * * @param inputs - the set of inputs to encode */ -export const encodeTransactionInputs = (inputs: readonly Input[]) => +export const encodeTransactionInputs = (inputs: Input[]) => flattenBinArray([ bigIntToCompactUint(BigInt(inputs.length)), ...inputs.map(encodeTransactionInput), @@ -120,7 +120,7 @@ export const encodeTransactionInputs = (inputs: readonly Input[]) => * transaction inputs */ export const readTransactionInputs = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const inputsRead = readItemCount(position, readTransactionInput); if (typeof inputsRead === 'string') { @@ -185,19 +185,19 @@ export enum CashTokenDecodingError { * token amount. */ export const readTokenAmount = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const amountRead = readCompactUintMinimal(position); if (typeof amountRead === 'string') { return formatError( CashTokenDecodingError.invalidAmountEncoding, - amountRead + amountRead, ); } if (amountRead.result > maximumTokenAmount) { return formatError( CashTokenDecodingError.excessiveAmount, - `Encoded amount: ${amountRead.result}` + `Encoded amount: ${amountRead.result}`, ); } if (amountRead.result === 0n) { @@ -220,7 +220,7 @@ export const readTokenAmount = ( */ // eslint-disable-next-line complexity export const readTokenPrefix = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult<{ token?: NonNullable }> => { const { bin, index } = position; if (bin[index] !== CashTokens.PREFIX_TOKEN) { @@ -233,7 +233,7 @@ export const readTokenPrefix = ( CashTokens.minimumPrefixLength }. Missing bytes: ${ CashTokens.minimumPrefixLength - (bin.length - index) - }` + }`, ); } const category = bin @@ -245,14 +245,14 @@ export const readTokenPrefix = ( if ((prefixStructure & CashTokens.RESERVED_BIT) !== 0) { return formatError( CashTokenDecodingError.reservedBit, - `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}` + `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}`, ); } const nftCapabilityInt = tokenBitfield & CashTokens.nftCapabilityMask; if (nftCapabilityInt > CashTokens.maximumCapability) { return formatError( CashTokenDecodingError.invalidCapability, - `Capability value: ${nftCapabilityInt}` + `Capability value: ${nftCapabilityInt}`, ); } const capability = nftCapabilityNumberToLabel[nftCapabilityInt]!; // eslint-disable-line @typescript-eslint/no-non-null-assertion @@ -262,7 +262,7 @@ export const readTokenPrefix = ( if (hasCommitmentLength && !hasNft) { return formatError( CashTokenDecodingError.commitmentWithoutNft, - `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}` + `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}`, ); } const hasAmount = (prefixStructure & CashTokens.HAS_AMOUNT) !== 0; @@ -278,7 +278,7 @@ export const readTokenPrefix = ( if (typeof commitmentRead === 'string') { return formatError( CashTokenDecodingError.invalidCommitment, - commitmentRead + commitmentRead, ); } if (hasCommitmentLength && commitmentRead.result.length === 0) { @@ -304,13 +304,13 @@ export const readTokenPrefix = ( if (capability !== NonFungibleTokenCapability.none) { return formatError( CashTokenDecodingError.capabilityWithoutNft, - `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}` + `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}`, ); } if (!hasAmount) { return formatError( CashTokenDecodingError.noTokens, - `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}` + `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}`, ); } const amountRead = readTokenAmount(nextPosition); @@ -331,7 +331,7 @@ export const readTokenPrefix = ( * optional token prefix and locking bytecode */ export const readLockingBytecodeWithPrefix = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult<{ lockingBytecode: Uint8Array; token?: NonNullable; @@ -340,7 +340,7 @@ export const readLockingBytecodeWithPrefix = ( if (typeof bytecodeRead === 'string') { return formatError( TransactionDecodingError.lockingBytecodeLength, - bytecodeRead + bytecodeRead, ); } const { result: contents, position: nextPosition } = bytecodeRead; @@ -369,7 +369,7 @@ export const readLockingBytecodeWithPrefix = ( * transaction output */ export const readTransactionOutput = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const outputRead = readMultiple(position, [ readUint64LE, @@ -462,7 +462,7 @@ export const encodeTransactionOutput = (output: Output) => { * transaction outputs */ export const readTransactionOutputs = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const outputsRead = readItemCount(position, readTransactionOutput); if (typeof outputsRead === 'string') { @@ -480,7 +480,7 @@ export const readTransactionOutputs = ( * * @param outputs - the set of outputs to encode */ -export const encodeTransactionOutputs = (outputs: readonly Output[]) => +export const encodeTransactionOutputs = (outputs: Output[]) => flattenBinArray([ bigIntToCompactUint(BigInt(outputs.length)), ...outputs.map(encodeTransactionOutput), @@ -497,7 +497,7 @@ export const encodeTransactionOutputs = (outputs: readonly Output[]) => * {@link TransactionCommon} */ export const readTransactionCommon = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const transactionRead = readMultiple(position, [ readUint32LE, @@ -521,7 +521,7 @@ export const readTransactionCommon = ( export const readTransaction = readTransactionCommon; export const readTransactionOutputNonTokenAware = ( - pos: ReadPosition + pos: ReadPosition, ): MaybeReadResult => { const outputRead = readMultiple(pos, [ readUint64LE, @@ -541,7 +541,7 @@ export const readTransactionOutputNonTokenAware = ( }; export const readTransactionOutputsNonTokenAware = ( - pos: ReadPosition + pos: ReadPosition, ): MaybeReadResult => { const outputsRead = readItemCount(pos, readTransactionOutputNonTokenAware); if (typeof outputsRead === 'string') { @@ -564,7 +564,7 @@ export const readTransactionOutputsNonTokenAware = ( * {@link TransactionCommon} */ export const readTransactionNonTokenAware = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const transactionRead = readMultiple(position, [ readUint32LE, @@ -596,7 +596,7 @@ export const readTransactionNonTokenAware = ( * @param bin - the encoded transaction to decode */ export const decodeTransactionCommon = ( - bin: Uint8Array + bin: Uint8Array, ): TransactionCommon | string => { const transactionRead = readTransactionCommon({ bin, index: 0 }); if (typeof transactionRead === 'string') { @@ -609,7 +609,7 @@ export const decodeTransactionCommon = ( transactionRead.position.index - 1 }, leaving ${ bin.length - transactionRead.position.index - } remaining bytes.` + } remaining bytes.`, ); } return transactionRead.result; @@ -628,11 +628,11 @@ export const decodeTransaction = decodeTransactionBCH; * @param bin - the raw message to decode */ export const decodeTransactionUnsafeCommon = ( - bin: Uint8Array + bin: Uint8Array, ): TransactionCommon => { const result = decodeTransactionCommon(bin); if (typeof result === 'string') { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error(result); } return result; @@ -655,10 +655,13 @@ export const encodeTransactionCommon = (tx: TransactionCommon) => export const encodeTransactionBCH = encodeTransactionCommon; export const encodeTransaction = encodeTransactionBCH; +/** + * @deprecated use `structuredClone` instead + */ export const cloneTransactionInputsCommon = < - Transaction extends TransactionCommon + Transaction extends TransactionCommon, >( - inputs: Readonly['inputs'] + inputs: Transaction['inputs'], ) => inputs.map((input) => ({ outpointIndex: input.outpointIndex, @@ -667,10 +670,13 @@ export const cloneTransactionInputsCommon = < unlockingBytecode: input.unlockingBytecode.slice(), })); +/** + * @deprecated use `structuredClone` instead + */ export const cloneTransactionOutputsCommon = < - Transaction extends TransactionCommon + Transaction extends TransactionCommon, >( - outputs: Readonly['outputs'] + outputs: Transaction['outputs'], ) => outputs.map((output) => ({ lockingBytecode: output.lockingBytecode.slice(), @@ -693,8 +699,11 @@ export const cloneTransactionOutputsCommon = < valueSatoshis: output.valueSatoshis, })); +/** + * @deprecated use `structuredClone` instead + */ export const cloneTransactionCommon = ( - transaction: Readonly + transaction: Transaction, ) => ({ inputs: cloneTransactionInputsCommon(transaction.inputs), locktime: transaction.locktime, @@ -716,7 +725,7 @@ export const cloneTransactionCommon = ( */ export const hashTransactionP2pOrder = ( transaction: Uint8Array, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => hash256(transaction, sha256); /** @@ -733,7 +742,7 @@ export const hashTransactionP2pOrder = ( */ export const hashTransactionUiOrder = ( transaction: Uint8Array, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => hashTransactionP2pOrder(transaction, sha256).reverse(); /** @@ -754,18 +763,18 @@ export const hashTransaction = (transaction: Uint8Array) => * @param inputs - the series of inputs from which to extract the outpoints */ export const encodeTransactionOutpoints = ( - inputs: readonly { + inputs: { outpointIndex: number; outpointTransactionHash: Uint8Array; - }[] + }[], ) => flattenBinArray( inputs.map((i) => flattenBinArray([ i.outpointTransactionHash.slice().reverse(), numberToBinUint32LE(i.outpointIndex), - ]) - ) + ]), + ), ); /** @@ -775,9 +784,8 @@ export const encodeTransactionOutpoints = ( * * @param outputs - the array of outputs to encode */ -export const encodeTransactionOutputsForSigning = ( - outputs: readonly Output[] -) => flattenBinArray(outputs.map(encodeTransactionOutput)); +export const encodeTransactionOutputsForSigning = (outputs: Output[]) => + flattenBinArray(outputs.map(encodeTransactionOutput)); /** * Encode the sequence numbers of an array of transaction inputs for use in @@ -787,5 +795,5 @@ export const encodeTransactionOutputsForSigning = ( * numbers */ export const encodeTransactionInputSequenceNumbersForSigning = ( - inputs: readonly { sequenceNumber: number }[] + inputs: { sequenceNumber: number }[], ) => flattenBinArray(inputs.map((i) => numberToBinUint32LE(i.sequenceNumber))); diff --git a/src/lib/message/transaction-types.ts b/src/lib/message/transaction-types.ts index 225f00ab..2a298d4d 100644 --- a/src/lib/message/transaction-types.ts +++ b/src/lib/message/transaction-types.ts @@ -13,10 +13,10 @@ import type { * bytes ({@link Input.outpointTransactionHash}) - this allows for * JSON-compatible types to be used rather than the default `Uint8Array`. */ -export interface Input< +export type Input< Bytecode = Uint8Array, - ByteStringRepresentation = Uint8Array -> { + ByteStringRepresentation = Uint8Array, +> = { /** * The index of the output in the transaction from which this input is spent. * @@ -116,7 +116,7 @@ export interface Input< * A.K.A. `scriptSig` or "unlocking script" */ unlockingBytecode: Bytecode; -} +}; /** * The capability assigned to a particular non-fungible token. @@ -146,10 +146,11 @@ export enum NonFungibleTokenCapability { * - this allows for JSON-compatible types to be used rather than the * default `Uint8Array`. */ -export interface Output< +export type Output< Bytecode = Uint8Array, - ByteStringRepresentation = Uint8Array -> { + ByteStringRepresentation = Uint8Array, + NumericRepresentation = bigint, +> = { /** * The bytecode used to encumber this transaction output. To spend the output, * unlocking bytecode must be included in a transaction input that – when @@ -172,7 +173,7 @@ export interface Output< * maximum token amount (`9223372036854775807`), this value is encoded as * a `bigint`. */ - amount: bigint; + amount: NumericRepresentation; /** * The 32-byte ID of the token category to which the token(s) in this output * belong in big-endian byte order. This is the byte order typically seen in @@ -207,7 +208,7 @@ export interface Output< * (`9007199254740991`) is about 4 times larger than the maximum number of * satoshis that should ever exist. I.e. even if all satoshis were * consolidated into a single output, the transaction spending this output - * could still be defined with a numeric `satoshis` value. + * could still be defined with a numeric `valueSatoshis`. * * However, because the encoded output format for version 1 and 2 transactions * (used in both transaction encoding and signing serialization) uses a 64-bit @@ -228,8 +229,8 @@ export interface Output< * {@link valueSatoshisToBin} and {@link binToValueSatoshis}, * respectively. */ - valueSatoshis: bigint; -} + valueSatoshis: NumericRepresentation; +}; /** * The maximum uint64 value – an impossibly large, intentionally invalid value @@ -242,7 +243,7 @@ export const excessiveSatoshis = Uint8Array.from([255, 255, 255, 255, 255, 255, /** * Data type representing a transaction. */ -export interface TransactionCommon { +export type TransactionCommon = { /** * An array of inputs included in this transaction. * @@ -303,12 +304,9 @@ export interface TransactionCommon { * of `4294967295`. Since BIP68, most transactions use a version of `2`. */ version: number; -} +}; -export interface CompilationDirectiveLocking< - CompilerType, - CompilationDataType -> { +export type CompilationDirectiveLocking = { /** * The {@link Compiler} with which to generate bytecode. */ @@ -321,36 +319,34 @@ export interface CompilationDirectiveLocking< * The script ID to compile. */ script: string; -} +}; -export interface CompilationDirectiveUnlocking< - CompilerType, - CompilationDataType -> extends CompilationDirectiveLocking { - /** - * The `satoshis` value of the {@link Output} being spent by this input. - * Required for use in signing serializations. - */ - valueSatoshis: Output['valueSatoshis']; +export type CompilationDirectiveUnlocking = + CompilationDirectiveLocking & { + /** + * The value in satoshis of the {@link Output} being spent by this input. + * Required for use in signing serializations. + */ + valueSatoshis: Output['valueSatoshis']; - /** - * The CashToken contents of this input. This property is only defined if the - * input contains one or more tokens. For details, see - * `CHIP-2022-02-CashTokens`. - */ - token?: Output['token']; -} + /** + * The CashToken contents of this input. This property is only defined if the + * input contains one or more tokens. For details, see + * `CHIP-2022-02-CashTokens`. + */ + token?: Output['token']; + }; -export interface CompilationDirectiveUnlockingEstimate< +export type CompilationDirectiveUnlockingEstimate< CompilerType, - CompilationDataType -> extends CompilationDirectiveUnlocking { + CompilationDataType, +> = CompilationDirectiveUnlocking & { /** * The scenario ID that can be used to estimate the final size of this * unlocking script. This is required when using fee estimation. */ estimate: string; -} +}; /** * An input that may optionally use a {@link CompilationDirectiveUnlocking} as @@ -363,7 +359,7 @@ export interface CompilationDirectiveUnlockingEstimate< export type InputTemplate< CompilerType, RequireEstimate = false, - CompilationDataType = CompilationData + CompilationDataType = CompilationData, > = Input< | Uint8Array | (RequireEstimate extends true @@ -383,7 +379,7 @@ export type InputTemplate< export type OutputTemplate< CompilerType, EnableFeeEstimation = false, - CompilationDataType = CompilationData + CompilationDataType = CompilationData, > = Output< CompilationDirectiveLocking | Uint8Array, EnableFeeEstimation extends true ? Uint8Array | undefined : Uint8Array @@ -402,7 +398,7 @@ export type OutputTemplate< export type TransactionTemplate< CompilerType, EnableFeeEstimation = false, - CompilationDataType = CompilationData + CompilationDataType = CompilationData, > = TransactionCommon< InputTemplate, OutputTemplate @@ -442,7 +438,7 @@ export type TransactionTemplateEstimated = TransactionTemplate< * An error resulting from unsuccessful bytecode generation. Includes the * generation type (`locking` or `unlocking`), and the output or input index */ -export interface BytecodeGenerationErrorBase { +export type BytecodeGenerationErrorBase = { /** * The type of bytecode that was being generated when this error occurred. */ @@ -455,24 +451,24 @@ export interface BytecodeGenerationErrorBase { * If the error occurred after the `parse` stage, the resolved script is * provided for analysis or processing (e.g. `getResolvedBytecode`). */ - resolved?: ResolvedScript; + resolved?: ResolvedScript; /** * The compilation errors that occurred while generating this bytecode. */ errors: CompilationError[]; -} +}; -export interface BytecodeGenerationErrorLocking - extends BytecodeGenerationErrorBase { - type: 'locking'; -} +export type BytecodeGenerationErrorLocking = + BytecodeGenerationErrorBase & { + type: 'locking'; + }; -export interface BytecodeGenerationErrorUnlocking - extends BytecodeGenerationErrorBase { - type: 'unlocking'; -} +export type BytecodeGenerationErrorUnlocking = + BytecodeGenerationErrorBase & { + type: 'unlocking'; + }; -export interface BytecodeGenerationCompletionBase { +export type BytecodeGenerationCompletionBase = { /** * If `output`, this bytecode was generated for the output at `index` (a * `lockingBytecode`). If `input`, the bytecode was generated for the input at @@ -483,25 +479,25 @@ export interface BytecodeGenerationCompletionBase { * The index of the input or output for which this bytecode was generated. */ index: number; -} +}; -export interface BytecodeGenerationCompletionInput - extends BytecodeGenerationCompletionBase { - type: 'input'; - /** - * The successfully generated Input. - */ - input: Input; -} +export type BytecodeGenerationCompletionInput = + BytecodeGenerationCompletionBase & { + type: 'input'; + /** + * The successfully generated Input. + */ + input: Input; + }; -export interface BytecodeGenerationCompletionOutput - extends BytecodeGenerationCompletionBase { - type: 'output'; - /** - * The successfully generated Output. - */ - output: Output; -} +export type BytecodeGenerationCompletionOutput = + BytecodeGenerationCompletionBase & { + type: 'output'; + /** + * The successfully generated Output. + */ + output: Output; + }; /** * A successfully generated `lockingBytecode` (for an output) or @@ -516,16 +512,16 @@ export type BytecodeGenerationCompletion = | BytecodeGenerationCompletionInput | BytecodeGenerationCompletionOutput; -export interface TransactionGenerationSuccess { +export type TransactionGenerationSuccess = { success: true; transaction: TransactionCommon; -} +}; -export type TransactionGenerationError = +export type TransactionGenerationError = | { success: false; completions: BytecodeGenerationCompletionInput[]; - errors: BytecodeGenerationErrorUnlocking[]; + errors: BytecodeGenerationErrorUnlocking[]; /** * Error(s) occurred at the `input` stage of compilation, meaning the * `output` stage completed successfully. @@ -535,7 +531,7 @@ export type TransactionGenerationError = | { success: false; completions: BytecodeGenerationCompletionOutput[]; - errors: BytecodeGenerationErrorLocking[]; + errors: BytecodeGenerationErrorLocking[]; /** * Error(s) occurred at the `output` stage of compilation, so the `input` * stage never began. @@ -543,6 +539,6 @@ export type TransactionGenerationError = stage: 'outputs'; }; -export type TransactionGenerationAttempt = - | TransactionGenerationError +export type TransactionGenerationAttempt = + | TransactionGenerationError | TransactionGenerationSuccess; diff --git a/src/lib/schema/ajv/ajv-types.d.ts b/src/lib/schema/ajv/ajv-types.d.ts index 9d4c829f..9c62e39e 100644 --- a/src/lib/schema/ajv/ajv-types.d.ts +++ b/src/lib/schema/ajv/ajv-types.d.ts @@ -1,14 +1,14 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -export interface AjvError< +export type AjvError< Keyword = string, - Params = { [paramName: string]: number | string } -> { + Params = { [paramName: string]: number | string }, +> = { keyword: Keyword; instancePath: string; schemaPath: string; params: Params; message: string; -} +}; export type LibauthAjvError = | AjvError<'additionalProperties', { additionalProperty: string }> @@ -19,8 +19,8 @@ export type LibauthAjvError = * Note: these types cover only Libauth use cases; other `ajv` error types are * possible using other settings. */ -// eslint-disable-next-line functional/no-mixed-type -export interface AjvValidator { +// eslint-disable-next-line functional/no-mixed-types +export type AjvValidator = { ( data: unknown, dataCxt?: { @@ -28,7 +28,7 @@ export interface AjvValidator { parentData: any; parentDataProperty: any; rootData?: any; - } + }, ): data is T; errors?: LibauthAjvError[] | null; -} +}; diff --git a/src/lib/schema/ajv/ajv-utils.ts b/src/lib/schema/ajv/ajv-utils.ts index 424911fc..e501cce6 100644 --- a/src/lib/schema/ajv/ajv-utils.ts +++ b/src/lib/schema/ajv/ajv-utils.ts @@ -1,25 +1,35 @@ +import { lossyNormalize } from '../../format/format.js'; + import type { AjvValidator, LibauthAjvError } from './ajv-types.js'; -import AuthenticationTemplateValidator from './validate-authentication-template.js'; +import walletTemplateValidator from './validate-wallet-template.js'; const avjErrorsToDescription = (errors: LibauthAjvError[]): string => // TODO: translate instancePath errors.map((error) => `${error.instancePath}: ${error.message}`).join(','); +/** + * Given an untrusted JSON string or object and an AJV validator, verify that + * the untrusted value is of the expected shape. Note, this method first + * normalizes all characters in the input using `Normalization Form KC` + * (Compatibility Decomposition, followed by Canonical Composition). + */ export const ajvStandaloneJsonParse = ( untrustedJsonOrObject: unknown, - validator: AjvValidator + validator: AjvValidator, ) => { - // eslint-disable-next-line functional/no-try-statement + // eslint-disable-next-line functional/no-try-statements try { - const parsed = + const stringified = typeof untrustedJsonOrObject === 'string' - ? (JSON.parse(untrustedJsonOrObject) as unknown) - : untrustedJsonOrObject; + ? untrustedJsonOrObject + : JSON.stringify(untrustedJsonOrObject); + const normalized = lossyNormalize(stringified); + const parsed = JSON.parse(normalized) as unknown; if (validator(parsed)) { return parsed; } // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return avjErrorsToDescription(AuthenticationTemplateValidator.errors!); + return avjErrorsToDescription(walletTemplateValidator.errors!); } catch (e) { return `Invalid JSON. ${String(e)}`; } diff --git a/src/lib/schema/ajv/validate-authentication-template.d.ts b/src/lib/schema/ajv/validate-bcmr.d.ts similarity index 51% rename from src/lib/schema/ajv/validate-authentication-template.d.ts rename to src/lib/schema/ajv/validate-bcmr.d.ts index e03fe425..c9fed47a 100644 --- a/src/lib/schema/ajv/validate-authentication-template.d.ts +++ b/src/lib/schema/ajv/validate-bcmr.d.ts @@ -1,7 +1,7 @@ -import type { AuthenticationTemplate } from '../../lib.js'; +import type { MetadataRegistry } from '../../lib.js'; import type { AjvValidator } from './ajv-types.js'; -declare const validator: AjvValidator; +declare const validator: AjvValidator; // eslint-disable-next-line import/no-default-export export default validator; diff --git a/src/lib/schema/ajv/validate-bcmr.js b/src/lib/schema/ajv/validate-bcmr.js new file mode 100644 index 00000000..beb00041 --- /dev/null +++ b/src/lib/schema/ajv/validate-bcmr.js @@ -0,0 +1,6004 @@ +export default validate20; +const schema22 = { + $ref: '#/definitions/MetadataRegistry', + $schema: 'http://json-schema.org/draft-07/schema#', + definitions: { + ChainHistory: { + $ref: '#/definitions/RegistryTimestampKeyedValues', + description: + "A block height-keyed map of {@link ChainSnapshot } s documenting the evolution of a particular chain/network's identity. Like {@link IdentityHistory } , this structure allows wallets and other user interfaces to offer better experiences when a chain identity is rebranded, redenominated, or other important metadata is modified in a coordinated update.", + }, + ChainSnapshot: { + additionalProperties: false, + description: + "A snapshot of the metadata for a particular chain/network at a specific time. This allows for registries to provide similar metadata for each chain's native currency unit (name, description, symbol, icon, etc.) as can be provided for other registered tokens.", + properties: { + description: { + description: + 'A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details.', + }, + name: { + description: + 'The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.', + type: 'string', + }, + splitId: { + description: + "The split ID of this identity's chain of record.\n\nIf undefined, defaults to {@link MetadataRegistry.defaultChain } .", + type: 'string', + }, + status: { + description: + 'The status of this identity, must be `active`, `inactive`, or `burned`. If omitted, defaults to `active`.\n- Identities with an `active` status should be actively tracked by clients.\n- Identities with an `inactive` status may be considered for archival by clients and may be removed in future registry versions.\n- Identities with a `burned` status have been destroyed by setting the latest identity output to a data-carrier output (`OP_RETURN`), permanently terminating the authchain. Clients should archive burned identities and – if the burned identity represented a token type – consider burning any remaining tokens of that category to reclaim funds from those outputs.', + enum: ['active', 'burned', 'inactive'], + type: 'string', + }, + tags: { + description: + "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + items: { type: 'string' }, + type: 'array', + }, + token: { + additionalProperties: false, + description: + "A data structure indicating how the chain's native currency units should be displayed in user interfaces.", + properties: { + decimals: { + description: + 'An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this native currency.\n\nThis is the number of digits that can appear after the decimal separator in currency amounts. For a currency with a `symbol` of `SYMBOL` and a `decimals` of `2`, an amount of `12345` should be displayed as `123.45 SYMBOL`.\n\nIf omitted, defaults to `0`.', + type: 'number', + }, + symbol: { + description: + 'An abbreviation used to uniquely identity this native currency unit.\n\nSymbols must be comprised only of capital letters, numbers, and dashes (`-`). This can be validated with the regular expression: `/^[-A-Z0-9]+$/`.', + type: 'string', + }, + }, + required: ['symbol'], + type: 'object', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name', 'token'], + type: 'object', + }, + Extensions: { + additionalProperties: { + anyOf: [ + { type: 'string' }, + { additionalProperties: { type: 'string' }, type: 'object' }, + { + additionalProperties: { + additionalProperties: { type: 'string' }, + type: 'object', + }, + type: 'object', + }, + ], + }, + description: + "A mapping of extension identifiers to extension definitions. Extensions may be widely standardized or application-specific, and extension definitions must be either:\n\n- `string`s,\n- key-value mappings of `string`s, or\n- two-dimensional, key-value mappings of `string`s.\n\nThis limitation encourages safety and wider compatibility across implementations.\n\nTo encode an array, it is recommended that each value be assigned to a numeric key indicating the item's index (beginning at `0`). Numerically-indexed objects are often a more useful and resilient data-transfer format than simple arrays because they simplify difference-only transmission: only modified indexes need to be transferred, and shifts in item order must be explicit, simplifying merges of conflicting updates.\n\nFor encoding of more complex data, consider using base64 and/or string-encoded JSON.", + type: 'object', + }, + IdentityHistory: { + $ref: '#/definitions/RegistryTimestampKeyedValues', + description: + "A timestamp-keyed map of {@link IdentitySnapshot } s documenting the evolution of a particular identity. The current identity information is the snapshot associated with the latest timestamp reached. If no timestamp has yet been reached, the snapshot of the oldest timestamp is considered current. Future-dated timestamps indicate planned migrations.\n\nThis strategy allows wallets and other user interfaces to offer better experiences when an identity is rebranded, a token redenominated, or other important metadata is modified in a coordinated update. For example, a wallet may warn token holders of a forthcoming rebranding of fungible tokens they hold; after the change, the wallet may continue to offer prominent interface hints that the rebranded token identity was recently updated.\n\nTimestamps may be order by time via lexicographical sort. For determinism, it is recommended that implementations sort from newest to oldest in exported registry JSON files.\n\nIf the current snapshot's {@link IdentitySnapshot.migrated } isn't specified, the snapshot's index is a precise time at which the snapshot takes effect and clients should begin using the new information. If `migrated` is specified, the snapshot's index is the timestamp at which the transition is considered to begin, see {@link IdentitySnapshot.migrated } for details.\n\nEach timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nIn the case that an identity change occurs due to on-chain activity (e.g. an on-chain migration that is set to complete at a particular locktime value), registry-recorded timestamps reflect the real-world time at which the maintainer of the registry believes the on-chain activity to have actually occurred. Likewise, future-dated timestamps indicate a precise real-world time at which a snapshot is estimated to take effect, rather than the Median Time Past (BIP113) UNIX timestamp or another on-chain measurement of time.", + }, + IdentitySnapshot: { + additionalProperties: false, + description: + 'A snapshot of the metadata for a particular identity at a specific time.', + properties: { + description: { + description: + 'A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details.', + }, + migrated: { + description: + "The timestamp at which this identity snapshot is fully in effect. This value should only be provided if the snapshot takes effect over a period of time (e.g. an in-circulation token identity is gradually migrating to a new category). In these cases, clients should gradually migrate to using the new information beginning after the identity snapshot's timestamp and the `migrated` time.\n\nThis timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.", + type: 'string', + }, + name: { + description: + 'The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.', + type: 'string', + }, + splitId: { + description: + "The split ID of this identity's chain of record.\n\nIf undefined, defaults to {@link MetadataRegistry.defaultChain } .", + type: 'string', + }, + status: { + description: + 'The status of this identity, must be `active`, `inactive`, or `burned`. If omitted, defaults to `active`.\n- Identities with an `active` status should be actively tracked by clients.\n- Identities with an `inactive` status may be considered for archival by clients and may be removed in future registry versions.\n- Identities with a `burned` status have been destroyed by setting the latest identity output to a data-carrier output (`OP_RETURN`), permanently terminating the authchain. Clients should archive burned identities and – if the burned identity represented a token type – consider burning any remaining tokens of that category to reclaim funds from those outputs.', + enum: ['active', 'burned', 'inactive'], + type: 'string', + }, + tags: { + description: + "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + items: { type: 'string' }, + type: 'array', + }, + token: { + $ref: '#/definitions/TokenCategory', + description: + 'If this identity is a type of token, a data structure indicating how tokens should be understood and displayed in user interfaces. Omitted for non-token identities.', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name'], + type: 'object', + }, + MetadataRegistry: { + additionalProperties: false, + description: + 'A Bitcoin Cash Metadata Registry is an authenticated JSON file containing metadata about tokens, identities, contract applications, and other on-chain artifacts. BCMRs conform to the Bitcoin Cash Metadata Registry JSON Schema, and they can be published and maintained by any entity or individual.', + properties: { + $schema: { + description: + 'The schema used by this registry. Many JSON editors can automatically provide inline documentation and autocomplete support using the `$schema` property, so it is recommended that registries include it. E.g.: `https://cashtokens.org/bcmr-v2.schema.json`', + type: 'string', + }, + chains: { + additionalProperties: { $ref: '#/definitions/ChainHistory' }, + description: + 'A map of split IDs tracked by this registry to the {@link ChainHistory } for that chain/network.\n\nThe split ID of a chain is the block header hash (A.K.A. block ID) of the first unique block after the most recent tracked split – a split after which both resulting chains are considered notable or tracked by the registry. (For chains with no such splits, this is the ID of the genesis block.)\n\nNote, split ID is inherently a "relative" identifier. After a tracked split, both resulting chains will have a new split ID. However, if a wallet has not yet heard about a particular split, that wallet will continue to reference one of the resulting chains by its previous split ID, and the split-unaware wallet may create transactions that are valid on both chains (losing claimable value if the receivers of their transactions don\'t acknowledge transfers on both chains). When a registry trusted by the wallet notes the split in it\'s `chains` map, the wallet can represent the split in the user interface using the the latest {@link ChainSnapshot } for each chain and splitting coins prior to spending (by introducing post-split coins in each transaction).\n\nThis map may exclude the following well-known split IDs (all clients supporting any of these chains should build-in {@link ChainHistory } for those chains):\n\n- `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`: A.K.A. mainnet – the BCH side of the BCH/XEC split.\n- `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367`: A.K.A testnet4 – the test network on which CHIPs are activated simultaneously with mainnet (May 15 at 12 UTC).\n- `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727`: A.K.A. chipnet – the test network on which CHIPs are activated 6 months before mainnet (November 15 at 12 UTC).\n\nAll other split IDs referenced by this registry should be included in this map.', + type: 'object', + }, + defaultChain: { + description: + 'The split ID of the chain/network considered the "default" chain for this registry. Identities that do not specify a {@link IdentitySnapshot.splitId } are assumed to be set to this split ID. For a description of split IDs, see {@link MetadataRegistry.chains } .\n\nIf not provided, the `defaultChain` is `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`, the BCH side of the BCH/XEC split (mainnet). Common values include:\n- `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367` (testnet4)\n- `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727` (chipnet)', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `Registry` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `Registry`s include the `locale` extension. See https://github.com/bitjson/chip-bcmr#locales-extension for details.', + }, + identities: { + additionalProperties: { $ref: '#/definitions/IdentityHistory' }, + description: + "A mapping of authbases to the `IdentityHistory` for that identity.\n\nAn authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for which the zeroth-descendant transaction chain (ZDTC) authenticates and publishes an identity's claimed metadata.\n\nIdentities may represent metadata registries, specific types of tokens, companies, organizations, individuals, or other on-chain entities.", + type: 'object', + }, + latestRevision: { + description: + 'The timestamp of the latest revision made to this registry version. The timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.', + type: 'string', + }, + license: { + description: + 'The license under which this registry is published. This may be specified as either a SPDX short identifier (https://spdx.org/licenses/) or by including the full text of the license.\n\nCommon values include: - `CC0-1.0`: https://creativecommons.org/publicdomain/zero/1.0/ - `MIT`: https://opensource.org/licenses/MIT', + type: 'string', + }, + registryIdentity: { + anyOf: [ + { $ref: '#/definitions/OffChainRegistryIdentity' }, + { type: 'string' }, + ], + description: + "The identity information of this particular registry, provided as either an authbase (recommended) or an `IdentitySnapshot`.\n\nAn authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for which the zeroth-descendant transaction chain (ZDTC) authenticates and publishes all registry updates. If an authbase is provided, the registry's identity information can be found in `identities[authbase]`, and clients should immediately attempt to verify the registry's identity on-chain. (See https://github.com/bitjson/chip-bcmr#chain-resolved-registries)\n\nIf an `IdentitySnapshot` is provided directly, this registry does not support on-chain resolution/authentication, and the contained `IdentitySnapshot` can only be authenticated via DNS/HTTPS.", + }, + tags: { + additionalProperties: { $ref: '#/definitions/Tag' }, + description: + 'A map of registry-specific `Tag`s used by this registry to convey information about identities it tracks.\n\nTags allow registries to group identities into collections of related identities, marking characteristics or those identities. Tags are standardized within a registry and may represent either labels applied by that registry (e.g. `individual`, `organization`, `token`, `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, `decentralized-exchange`, `liquidity-provider`, `sidechain`, `sidechain-bridge`, etc.) or designations by external authorities (certification, membership, ownership, etc.) that are tracked by that registry.\n\nTags may be used by clients in search, discover, and filtering of identities, and they can also convey information like accreditation from investor protection organizations, public certifications by security or financial auditors, and other designations that signal legitimacy and value to users.', + type: 'object', + }, + version: { + additionalProperties: false, + description: + 'The version of this registry. Versioning adheres to Semantic Versioning (https://semver.org/).', + properties: { + major: { + description: + 'The major version is incremented when an identity is removed.', + type: 'number', + }, + minor: { + description: + 'The minor version is incremented when an identity is added or a new identity snapshot is added.', + type: 'number', + }, + patch: { + description: + 'The patch version is incremented when an existing identity or identity snapshot is modified (e.g. to correct an error or add a missing piece of information) or when other registry properties (e.g. registry `name`, `description`, `uris`, etc.) are modified.\n\nGenerally, substantive changes to an existing identity should be made using a new identity snapshot in a minor version upgrade – this allows clients to provide a better user experience by noting the change in relevant user interfaces.\n\nFor example, patch upgrades might include spelling corrections in an existing snapshot or the addition of an `icon` containing a higher-resolution version of an existing `icon` image. On the other hand, a rebranding in which the icon is substantially changed may warrant a new identity snapshot to be added in a minor version upgrade.', + type: 'number', + }, + }, + required: ['major', 'minor', 'patch'], + type: 'object', + }, + }, + required: ['version', 'latestRevision', 'registryIdentity'], + type: 'object', + }, + NftCategory: { + additionalProperties: false, + description: + 'A definition specifying the non-fungible token information for a token category.', + properties: { + description: { + description: + 'A string describing how this identity uses NFTs (for use in user interfaces). Descriptions longer than `160` characters may be elided in some interfaces.\n\nE.g.:\n- "ACME DEX NFT order receipts are issued when you place orders on the decentralized exchange. After orders are processed, order receipts can be redeemed for purchased tokens or sales proceeds.";\n- "ACME Game collectable NFTs unlock unique playable content, user avatars, and item skins in ACME Game Online."; etc.', + type: 'string', + }, + fields: { + $ref: '#/definitions/NftCategoryField', + description: + 'A mapping of field identifier to field definitions for the data fields that can appear in NFT commitments of this category.\n\nCategories including only sequential NFTs (where `parse.bytecode` is undefined) should omit `fields` (or set to `undefined`).', + }, + parse: { + anyOf: [ + { $ref: '#/definitions/ParsableNftCollection' }, + { $ref: '#/definitions/SequentialNftCollection' }, + ], + description: + 'Parsing and interpretation information for all NFTs of this category; this enables generalized wallets to parse and display detailed information about all NFTs held by the wallet, e.g. `BCH Pledged`, `Order Price`, `Seat Number`, `Asset Number`, `IPFS Content Identifier`, `HTTPS URL`, etc.\n\nParsing instructions are provided in the `bytecode` property, and the results are interpreted using the `types` property.', + }, + }, + required: ['parse'], + type: 'object', + }, + NftCategoryField: { + additionalProperties: { + additionalProperties: false, + properties: { + description: { + description: + 'A string describing how this identity uses NFTs (for use in user interfaces). Descriptions longer than `160` characters may be elided in some interfaces.\n\nE.g.:\n- `The BCH value pledged at the time this receipt was issued.`\n- `The number of tokens sold in this order.`\n- `The seat number associated with this ticket.`', + type: 'string', + }, + encoding: { + anyOf: [ + { + additionalProperties: false, + properties: { + type: { + enum: [ + 'binary', + 'boolean', + 'hex', + 'https-url', + 'ipfs-cid', + 'utf8', + 'locktime', + ], + type: 'string', + }, + }, + required: ['type'], + type: 'object', + }, + { + additionalProperties: false, + properties: { + aggregate: { + const: 'add', + description: + "The `aggregate` property indicates that aggregating this field from multiple NFTs is desirable in user interfaces. For example, for a field named `BCH Pledged` where `aggregate` is `add`, the client can display a `Total BCH Pledged` in any user interface listing more than one NFT.\n\nIf specified, clients should aggregate the field from all NFTs, of all NFT types within the category, within a particular view (e.g. NFTs held by a single wallet, NFTs existing in a single transaction's outputs, etc.) using the specified operation.\n\nNote, while aggregation could be performed using any commutative operation – multiplication, bitwise AND, bitwise OR, bitwise XOR, etc. – only `add` is currently supported.", + type: 'string', + }, + decimals: { + description: + 'An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this token field.\n\nThis is the number of digits that can appear after the decimal separator in amounts. For a field with a `decimals` of `2`, a value of `123456` should be displayed as `1234.56`.\n\nIf omitted, defaults to `0`.', + type: 'number', + }, + type: { const: 'number', type: 'string' }, + unit: { + description: + "The unit in which this field is denominated, taking the `decimals` value into account. If representing fungible token amount, this will often be the symbol of the represented token category.\n\nE.g. `BCH`, `sats`, `AcmeUSD`, etc.\n\nIf not provided, clients should not represent this field as having a unit beyond the field's `name`.", + type: 'string', + }, + }, + required: ['type'], + type: 'object', + }, + ], + description: + 'The expected encoding of this field when read from the parsing altstack (see {@link ParsableNftCollection } ). All encoding definitions must have a `type`, and some encoding definitions allow for additional hinting about display strategies in clients.\n\nEncoding types may be set to `binary`, `boolean`, `hex`, `number`, or `utf8`:\n\n- `binary` types should be displayed as binary literals (e.g. `0b0101`)\n- `boolean` types should be displayed as `true` if exactly `0x01` or `false` if exactly `0x00`. If a boolean value does not match one of these values, clients should represent the NFT as unable to be parsed (e.g. simply display the full `commitment`).\n- `hex` types should be displayed as hex literals (e.g.`0xabcd`).\n- `https-url` types are percent encoded with the `https://` prefix omitted; they may be displayed as URIs or as activatable links.\n- `ipfs-cid` types are binary-encoded IPFS Content Identifiers; they may be displayed as URIs or as activatable links.\n- `locktime` types are `OP_TXLOCKTIME` results: integers from `0` to `4294967295` (inclusive) where values less than `500000000` are understood to be a block height (the current block number in the chain, beginning from block `0`), and values greater than or equal to `500000000` are understood to be a Median Time Past (BIP113) UNIX timestamp. (Note, sequence age is not currently supported.)\n- `number` types should be displayed according the their configured `decimals` and `unit` values.\n- `utf8` types should be displayed as utf8 strings.', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of NFT field extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.', + }, + name: { + description: + 'The name of this field for use in interfaces. Names longer than `20` characters may be elided in some interfaces.\n\nE.g.:\n- `BCH Pledged`\n- `Tokens Sold`\n- `Settlement Locktime`\n- `Seat Number`,\n- `IPFS Content Identifier`\n- `HTTPS URL`', + type: 'string', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this NFT field. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.', + }, + }, + required: ['encoding'], + type: 'object', + }, + description: + 'A definition specifying a field that can be encoded in non-fungible tokens of a token category.', + type: 'object', + }, + NftType: { + additionalProperties: false, + description: 'A definition for one type of NFT within a token category.', + properties: { + description: { + description: + 'A string describing this NFT type for use in user interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- "Receipts issued by the exchange to record details about purchases. After settlement, these receipts are redeemed for the purchased tokens.";\n- "Receipts issued by the crowdfunding campaign to document the value of funds pledged. If the user decides to cancel their pledge before the campaign completes, these receipts can be redeemed for a full refund.";\n- "Tickets issued for events at ACME Stadium.";\n- Sealed ballots certified by ACME decentralized organization during the voting period. After the voting period ends, these ballots must be revealed to reclaim the tokens used for voting."', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of NFT type extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.', + }, + fields: { + description: + "A list of identifiers for fields contained in NFTs of this type. On successful parsing evaluations, the bottom item on the altstack indicates the matched NFT type, and the remaining altstack items represent NFT field contents in the order listed (where `fields[0]` is the second-to-bottom item, and the final item in `fields` is the top of the altstack).\n\nFields should be ordered by recommended importance from most important to least important; in user interfaces, clients should display fields at lower indexes more prominently than those at higher indexes, e.g. if some fields cannot be displayed in minimized interfaces, higher-importance fields can still be represented. (Note, this ordering is controlled by the bytecode specified in `token.nft.parse.bytecode`.)\n\nIf this is a sequential NFT, (the category's `parse.bytecode` is undefined), `fields` should be omitted or set to `undefined`.", + items: { type: 'string' }, + type: 'array', + }, + name: { + description: + 'The name of this NFT type for use in interfaces. Names longer than `20` characters may be elided in some interfaces.\n\nE.g. `Market Order Buys`, `Limit Order Sales`, `Pledge Receipts`, `ACME Stadium Tickets`, `Sealed Votes`, etc.', + type: 'string', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this NFT type. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.', + }, + }, + required: ['name'], + type: 'object', + }, + OffChainRegistryIdentity: { + additionalProperties: false, + description: + 'An identity representing a metadata registry that is not published on-chain and therefore has no authbase or trackable authchain.', + properties: { + description: { + description: + 'A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details.', + }, + name: { + description: + 'The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.', + type: 'string', + }, + tags: { + description: + "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + items: { type: 'string' }, + type: 'array', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name'], + type: 'object', + }, + ParsableNftCollection: { + additionalProperties: false, + description: + 'Interpretation information for a collection of parsable NFTs, a collection in which each NFT may include additional metadata fields beyond a sequential identifier within its on-chain commitment. Note that {@link ParsableNftCollection } s differ from {@link SequentialNftCollection } s in that parsable collections require a parsing `bytecode` with which to inspect each NFT commitment: the type of each NFT is indexed by the hex-encoded contents the bottom item on the altstack following the evaluation of the parsing bytecode.', + properties: { + bytecode: { + description: + "A segment of hex-encoded Bitcoin Cash VM bytecode that parses UTXOs holding NFTs of this category, identifies the NFT's type within the category, and returns a list of the NFT's field values via the altstack. If undefined, this NFT Category includes only sequential NFTs, with only an identifier and no NFT fields encoded in each NFT's on-chain commitment.\n\nThe parse `bytecode` is evaluated by instantiating and partially verifying a standardized NFT parsing transaction:\n- version: `2`\n- inputs: - 0: Spends the UTXO containing the NFT with an empty unlocking bytecode and sequence number of `0`. - 1: Spends index `0` of the empty hash outpoint, with locking bytecode set to `parse.bytecode`, unlocking bytecode `OP_1` (`0x51`) and sequence number `0`.\n- outputs: - 0: A locking bytecode of OP_RETURN (`0x6a`) and value of `0`.\n- locktime: `0`\n\nAfter input 1 of this NFT parsing transaction is evaluated, if the resulting stack is not valid (a single \"truthy\" element remaining on the stack) – or if the altstack is empty – parsing has failed and clients should represent the NFT as unable to be parsed (e.g. simply display the full `commitment` as a hex-encoded value in the user interface).\n\nOn successful parsing evaluations, the bottom item on the altstack indicates the type of the NFT according to the matching definition in `types`. If no match is found, clients should represent the NFT as unable to be parsed.\n\nFor example: `00d2517f7c6b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_1 OP_SPLIT OP_SWAP OP_TOALTSTACK OP_TOALTSTACK) splits the commitment after 1 byte, pushing the first byte to the altstack as an NFT type identifier and the remaining segment of the commitment as the first NFT field value.\n\nIf undefined (in a {@link SequentialNftCollection } ), this field could be considered to have a default value of `00d26b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_TOALTSTACK), which takes the full contents of the commitment as a fixed type index. As such, each index of the NFT category's `types` maps a precise commitment value to the metadata for NFTs with that particular commitment. E.g. an NFT with an empty commitment (VM number 0) maps to `types['']`, a commitment of `01` (hex) maps to `types['01']`, etc. This pattern is used for collections of sequential NFTs.", + type: 'string', + }, + types: { + additionalProperties: { + $ref: '#/definitions/NftType', + description: + 'A definitions for each type of NFT within the token category. Parsable NFT types are indexed by the hex-encoded value of the bottom altstack item following evaluation of `NftCategory.parse.bytecode`. The remaining altstack items are mapped to NFT fields according to the `fields` property of the matching NFT type.', + }, + description: + 'A mapping of hex-encoded values to definitions of possible NFT types in this category.', + type: 'object', + }, + }, + required: ['bytecode', 'types'], + type: 'object', + }, + 'RegistryTimestampKeyedValues': { + additionalProperties: { $ref: '#/definitions/ChainSnapshot' }, + description: + 'A field keyed by timestamps to document the evolution of the field. Each timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nFor example, to insert a new value: ```ts const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; ```', + type: 'object', + }, + 'RegistryTimestampKeyedValues': { + additionalProperties: { $ref: '#/definitions/IdentitySnapshot' }, + description: + 'A field keyed by timestamps to document the evolution of the field. Each timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nFor example, to insert a new value: ```ts const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; ```', + type: 'object', + }, + SequentialNftCollection: { + additionalProperties: false, + description: + 'Interpretation information for a collection of sequential NFTs, a collection in which each NFT includes only a sequential identifier within its on-chain commitment. Note that {@link SequentialNftCollection } s differ from {@link ParsableNftCollection } s in that sequential collections lack a parsing `bytecode` with which to inspect each NFT commitment: the type of each NFT is indexed by the full contents its commitment (interpreted as a positive VM integer in user interfaces).', + properties: { + types: { + additionalProperties: { + $ref: '#/definitions/NftType', + description: + 'Interpretation information for each type of NFT within the token category, indexed by commitment hex. For sequential NFTs, the on-chain commitment of each NFT is interpreted as a VM number to reference its particular NFT type in user interfaces. Issuing a sequential NFT with a negative or invalid VM number is discouraged, but clients may render the commitment of such NFTs in hex-encoded form, prefixed with `X`.', + }, + description: + 'A mapping of each NFT commitment (typically, a positive integer encoded as a VM number) to metadata for that NFT type in this category.', + type: 'object', + }, + }, + required: ['types'], + type: 'object', + }, + Tag: { + additionalProperties: false, + description: + 'Tags allow registries to classify and group identities by a variety of characteristics. Tags are standardized within a registry and may represent either labels applied by that registry or designations by external authorities (certification, membership, ownership, etc.) that are tracked by that registry.\n\nExamples of possible tags include: `individual`, `organization`, `token`, `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, `decentralized-exchange`, `liquidity-provider`, `sidechain`, `sidechain-bridge`, `acme-audited`, `acme-endorsed`, etc.\n\nTags may be used by clients in search, discovery, and filtering of identities, and they can also convey information like accreditation from investor protection organizations, public certifications by security or financial auditors, and other designations that signal integrity and value to users.', + properties: { + description: { + description: + 'A string describing this tag for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `An identity maintained by a single individual.`\n- `An identity representing a type of token.`\n- `An on-chain application that has passed security audits by ACME, Inc.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `Tag` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.', + }, + name: { + description: + 'The name of this tag for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g.:\n- `Individual`\n- `Token`\n- `Audited by ACME, Inc.`', + type: 'string', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this tag. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all tags:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name'], + type: 'object', + }, + TokenCategory: { + additionalProperties: false, + description: + "A definition specifying information about an identity's token category.", + properties: { + category: { + description: + "The current token category used by this identity. Often, this will be equal to the identity's authbase, but some token identities must migrate to new categories for technical reasons.", + type: 'string', + }, + decimals: { + description: + 'An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this token category.\n\nThis is the number of digits that can appear after the decimal separator in fungible token amounts. For a token category with a `symbol` of `SYMBOL` and a `decimals` of `2`, a fungible token amount of `12345` should be displayed as `123.45 SYMBOL`.\n\nIf omitted, defaults to `0`.', + type: 'number', + }, + nfts: { + $ref: '#/definitions/NftCategory', + description: + 'Display information for non-fungible tokens (NFTs) of this identity. Omitted for token categories without NFTs.', + }, + symbol: { + description: + 'An abbreviation used to uniquely identity this token category.\n\nSymbols must be comprised only of capital letters, numbers, and dashes (`-`). This can be validated with the regular expression: `/^[-A-Z0-9]+$/`.', + type: 'string', + }, + }, + required: ['category', 'symbol'], + type: 'object', + }, + URIs: { + additionalProperties: { type: 'string' }, + description: + 'A mapping of identifiers to URIs associated with an entity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix – e.g. `https://` or `ipfs://`., Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.', + type: 'object', + }, + }, +}; +const schema23 = { + additionalProperties: false, + description: + 'A Bitcoin Cash Metadata Registry is an authenticated JSON file containing metadata about tokens, identities, contract applications, and other on-chain artifacts. BCMRs conform to the Bitcoin Cash Metadata Registry JSON Schema, and they can be published and maintained by any entity or individual.', + properties: { + $schema: { + description: + 'The schema used by this registry. Many JSON editors can automatically provide inline documentation and autocomplete support using the `$schema` property, so it is recommended that registries include it. E.g.: `https://cashtokens.org/bcmr-v2.schema.json`', + type: 'string', + }, + chains: { + additionalProperties: { $ref: '#/definitions/ChainHistory' }, + description: + 'A map of split IDs tracked by this registry to the {@link ChainHistory } for that chain/network.\n\nThe split ID of a chain is the block header hash (A.K.A. block ID) of the first unique block after the most recent tracked split – a split after which both resulting chains are considered notable or tracked by the registry. (For chains with no such splits, this is the ID of the genesis block.)\n\nNote, split ID is inherently a "relative" identifier. After a tracked split, both resulting chains will have a new split ID. However, if a wallet has not yet heard about a particular split, that wallet will continue to reference one of the resulting chains by its previous split ID, and the split-unaware wallet may create transactions that are valid on both chains (losing claimable value if the receivers of their transactions don\'t acknowledge transfers on both chains). When a registry trusted by the wallet notes the split in it\'s `chains` map, the wallet can represent the split in the user interface using the the latest {@link ChainSnapshot } for each chain and splitting coins prior to spending (by introducing post-split coins in each transaction).\n\nThis map may exclude the following well-known split IDs (all clients supporting any of these chains should build-in {@link ChainHistory } for those chains):\n\n- `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`: A.K.A. mainnet – the BCH side of the BCH/XEC split.\n- `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367`: A.K.A testnet4 – the test network on which CHIPs are activated simultaneously with mainnet (May 15 at 12 UTC).\n- `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727`: A.K.A. chipnet – the test network on which CHIPs are activated 6 months before mainnet (November 15 at 12 UTC).\n\nAll other split IDs referenced by this registry should be included in this map.', + type: 'object', + }, + defaultChain: { + description: + 'The split ID of the chain/network considered the "default" chain for this registry. Identities that do not specify a {@link IdentitySnapshot.splitId } are assumed to be set to this split ID. For a description of split IDs, see {@link MetadataRegistry.chains } .\n\nIf not provided, the `defaultChain` is `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`, the BCH side of the BCH/XEC split (mainnet). Common values include:\n- `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367` (testnet4)\n- `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727` (chipnet)', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `Registry` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `Registry`s include the `locale` extension. See https://github.com/bitjson/chip-bcmr#locales-extension for details.', + }, + identities: { + additionalProperties: { $ref: '#/definitions/IdentityHistory' }, + description: + "A mapping of authbases to the `IdentityHistory` for that identity.\n\nAn authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for which the zeroth-descendant transaction chain (ZDTC) authenticates and publishes an identity's claimed metadata.\n\nIdentities may represent metadata registries, specific types of tokens, companies, organizations, individuals, or other on-chain entities.", + type: 'object', + }, + latestRevision: { + description: + 'The timestamp of the latest revision made to this registry version. The timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.', + type: 'string', + }, + license: { + description: + 'The license under which this registry is published. This may be specified as either a SPDX short identifier (https://spdx.org/licenses/) or by including the full text of the license.\n\nCommon values include: - `CC0-1.0`: https://creativecommons.org/publicdomain/zero/1.0/ - `MIT`: https://opensource.org/licenses/MIT', + type: 'string', + }, + registryIdentity: { + anyOf: [ + { $ref: '#/definitions/OffChainRegistryIdentity' }, + { type: 'string' }, + ], + description: + "The identity information of this particular registry, provided as either an authbase (recommended) or an `IdentitySnapshot`.\n\nAn authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for which the zeroth-descendant transaction chain (ZDTC) authenticates and publishes all registry updates. If an authbase is provided, the registry's identity information can be found in `identities[authbase]`, and clients should immediately attempt to verify the registry's identity on-chain. (See https://github.com/bitjson/chip-bcmr#chain-resolved-registries)\n\nIf an `IdentitySnapshot` is provided directly, this registry does not support on-chain resolution/authentication, and the contained `IdentitySnapshot` can only be authenticated via DNS/HTTPS.", + }, + tags: { + additionalProperties: { $ref: '#/definitions/Tag' }, + description: + 'A map of registry-specific `Tag`s used by this registry to convey information about identities it tracks.\n\nTags allow registries to group identities into collections of related identities, marking characteristics or those identities. Tags are standardized within a registry and may represent either labels applied by that registry (e.g. `individual`, `organization`, `token`, `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, `decentralized-exchange`, `liquidity-provider`, `sidechain`, `sidechain-bridge`, etc.) or designations by external authorities (certification, membership, ownership, etc.) that are tracked by that registry.\n\nTags may be used by clients in search, discover, and filtering of identities, and they can also convey information like accreditation from investor protection organizations, public certifications by security or financial auditors, and other designations that signal legitimacy and value to users.', + type: 'object', + }, + version: { + additionalProperties: false, + description: + 'The version of this registry. Versioning adheres to Semantic Versioning (https://semver.org/).', + properties: { + major: { + description: + 'The major version is incremented when an identity is removed.', + type: 'number', + }, + minor: { + description: + 'The minor version is incremented when an identity is added or a new identity snapshot is added.', + type: 'number', + }, + patch: { + description: + 'The patch version is incremented when an existing identity or identity snapshot is modified (e.g. to correct an error or add a missing piece of information) or when other registry properties (e.g. registry `name`, `description`, `uris`, etc.) are modified.\n\nGenerally, substantive changes to an existing identity should be made using a new identity snapshot in a minor version upgrade – this allows clients to provide a better user experience by noting the change in relevant user interfaces.\n\nFor example, patch upgrades might include spelling corrections in an existing snapshot or the addition of an `icon` containing a higher-resolution version of an existing `icon` image. On the other hand, a rebranding in which the icon is substantially changed may warrant a new identity snapshot to be added in a minor version upgrade.', + type: 'number', + }, + }, + required: ['major', 'minor', 'patch'], + type: 'object', + }, + }, + required: ['version', 'latestRevision', 'registryIdentity'], + type: 'object', +}; +const schema26 = { + additionalProperties: { + anyOf: [ + { type: 'string' }, + { additionalProperties: { type: 'string' }, type: 'object' }, + { + additionalProperties: { + additionalProperties: { type: 'string' }, + type: 'object', + }, + type: 'object', + }, + ], + }, + description: + "A mapping of extension identifiers to extension definitions. Extensions may be widely standardized or application-specific, and extension definitions must be either:\n\n- `string`s,\n- key-value mappings of `string`s, or\n- two-dimensional, key-value mappings of `string`s.\n\nThis limitation encourages safety and wider compatibility across implementations.\n\nTo encode an array, it is recommended that each value be assigned to a numeric key indicating the item's index (beginning at `0`). Numerically-indexed objects are often a more useful and resilient data-transfer format than simple arrays because they simplify difference-only transmission: only modified indexes need to be transferred, and shifts in item order must be explicit, simplifying merges of conflicting updates.\n\nFor encoding of more complex data, consider using base64 and/or string-encoded JSON.", + type: 'object', +}; +const func4 = Object.prototype.hasOwnProperty; +const schema24 = { + additionalProperties: { $ref: '#/definitions/ChainSnapshot' }, + description: + 'A field keyed by timestamps to document the evolution of the field. Each timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nFor example, to insert a new value: ```ts const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; ```', + type: 'object', +}; +const schema25 = { + additionalProperties: false, + description: + "A snapshot of the metadata for a particular chain/network at a specific time. This allows for registries to provide similar metadata for each chain's native currency unit (name, description, symbol, icon, etc.) as can be provided for other registered tokens.", + properties: { + description: { + description: + 'A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details.', + }, + name: { + description: + 'The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.', + type: 'string', + }, + splitId: { + description: + "The split ID of this identity's chain of record.\n\nIf undefined, defaults to {@link MetadataRegistry.defaultChain } .", + type: 'string', + }, + status: { + description: + 'The status of this identity, must be `active`, `inactive`, or `burned`. If omitted, defaults to `active`.\n- Identities with an `active` status should be actively tracked by clients.\n- Identities with an `inactive` status may be considered for archival by clients and may be removed in future registry versions.\n- Identities with a `burned` status have been destroyed by setting the latest identity output to a data-carrier output (`OP_RETURN`), permanently terminating the authchain. Clients should archive burned identities and – if the burned identity represented a token type – consider burning any remaining tokens of that category to reclaim funds from those outputs.', + enum: ['active', 'burned', 'inactive'], + type: 'string', + }, + tags: { + description: + "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + items: { type: 'string' }, + type: 'array', + }, + token: { + additionalProperties: false, + description: + "A data structure indicating how the chain's native currency units should be displayed in user interfaces.", + properties: { + decimals: { + description: + 'An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this native currency.\n\nThis is the number of digits that can appear after the decimal separator in currency amounts. For a currency with a `symbol` of `SYMBOL` and a `decimals` of `2`, an amount of `12345` should be displayed as `123.45 SYMBOL`.\n\nIf omitted, defaults to `0`.', + type: 'number', + }, + symbol: { + description: + 'An abbreviation used to uniquely identity this native currency unit.\n\nSymbols must be comprised only of capital letters, numbers, and dashes (`-`). This can be validated with the regular expression: `/^[-A-Z0-9]+$/`.', + type: 'string', + }, + }, + required: ['symbol'], + type: 'object', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name', 'token'], + type: 'object', +}; +const schema27 = { + additionalProperties: { type: 'string' }, + description: + 'A mapping of identifiers to URIs associated with an entity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix – e.g. `https://` or `ipfs://`., Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.', + type: 'object', +}; +function validate23( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if ( + (data.name === undefined && (missing0 = 'name')) || + (data.token === undefined && (missing0 = 'token')) + ) { + validate23.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'description' || + key0 === 'extensions' || + key0 === 'name' || + key0 === 'splitId' || + key0 === 'status' || + key0 === 'tags' || + key0 === 'token' || + key0 === 'uris' + ) + ) { + validate23.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate23.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extensions !== undefined) { + let data1 = data.extensions; + const _errs4 = errors; + const _errs5 = errors; + if (errors === _errs5) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + let data2 = data1[key1]; + const _errs8 = errors; + const _errs9 = errors; + let valid3 = false; + const _errs10 = errors; + if (typeof data2 !== 'string') { + const err0 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs10 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs12 = errors; + if (errors === _errs12) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key2 in data2) { + const _errs15 = errors; + if (typeof data2[key2] !== 'string') { + const err1 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } + var valid4 = _errs15 === errors; + if (!valid4) { + break; + } + } + } else { + const err2 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + } + var _valid0 = _errs12 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs17 = errors; + if (errors === _errs17) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key3 in data2) { + let data4 = data2[key3]; + const _errs20 = errors; + if (errors === _errs20) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key4 in data4) { + const _errs23 = errors; + if (typeof data4[key4] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid6 = _errs23 === errors; + if (!valid6) { + break; + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid5 = _errs20 === errors; + if (!valid5) { + break; + } + } + } else { + const err5 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + } + var _valid0 = _errs17 === errors; + valid3 = valid3 || _valid0; + } + } + if (!valid3) { + const err6 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + validate23.errors = vErrors; + return false; + } else { + errors = _errs9; + if (vErrors !== null) { + if (_errs9) { + vErrors.length = _errs9; + } else { + vErrors = null; + } + } + } + var valid2 = _errs8 === errors; + if (!valid2) { + break; + } + } + } else { + validate23.errors = [ + { + instancePath: instancePath + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs25 = errors; + if (typeof data.name !== 'string') { + validate23.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs25 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.splitId !== undefined) { + const _errs27 = errors; + if (typeof data.splitId !== 'string') { + validate23.errors = [ + { + instancePath: instancePath + '/splitId', + schemaPath: '#/properties/splitId/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs27 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.status !== undefined) { + let data8 = data.status; + const _errs29 = errors; + if (typeof data8 !== 'string') { + validate23.errors = [ + { + instancePath: instancePath + '/status', + schemaPath: '#/properties/status/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + if ( + !( + data8 === 'active' || + data8 === 'burned' || + data8 === 'inactive' + ) + ) { + validate23.errors = [ + { + instancePath: instancePath + '/status', + schemaPath: '#/properties/status/enum', + keyword: 'enum', + params: { + allowedValues: schema25.properties.status.enum, + }, + message: 'must be equal to one of the allowed values', + }, + ]; + return false; + } + var valid0 = _errs29 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.tags !== undefined) { + let data9 = data.tags; + const _errs31 = errors; + if (errors === _errs31) { + if (Array.isArray(data9)) { + var valid7 = true; + const len0 = data9.length; + for (let i0 = 0; i0 < len0; i0++) { + const _errs33 = errors; + if (typeof data9[i0] !== 'string') { + validate23.errors = [ + { + instancePath: instancePath + '/tags/' + i0, + schemaPath: '#/properties/tags/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid7 = _errs33 === errors; + if (!valid7) { + break; + } + } + } else { + validate23.errors = [ + { + instancePath: instancePath + '/tags', + schemaPath: '#/properties/tags/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid0 = _errs31 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.token !== undefined) { + let data11 = data.token; + const _errs35 = errors; + if (errors === _errs35) { + if ( + data11 && + typeof data11 == 'object' && + !Array.isArray(data11) + ) { + let missing1; + if ( + data11.symbol === undefined && + (missing1 = 'symbol') + ) { + validate23.errors = [ + { + instancePath: instancePath + '/token', + schemaPath: '#/properties/token/required', + keyword: 'required', + params: { missingProperty: missing1 }, + message: + "must have required property '" + + missing1 + + "'", + }, + ]; + return false; + } else { + const _errs37 = errors; + for (const key5 in data11) { + if ( + !(key5 === 'decimals' || key5 === 'symbol') + ) { + validate23.errors = [ + { + instancePath: instancePath + '/token', + schemaPath: + '#/properties/token/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key5 }, + message: + 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs37 === errors) { + if (data11.decimals !== undefined) { + let data12 = data11.decimals; + const _errs38 = errors; + if ( + !( + typeof data12 == 'number' && + isFinite(data12) + ) + ) { + validate23.errors = [ + { + instancePath: + instancePath + '/token/decimals', + schemaPath: + '#/properties/token/properties/decimals/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid8 = _errs38 === errors; + } else { + var valid8 = true; + } + if (valid8) { + if (data11.symbol !== undefined) { + const _errs40 = errors; + if (typeof data11.symbol !== 'string') { + validate23.errors = [ + { + instancePath: + instancePath + '/token/symbol', + schemaPath: + '#/properties/token/properties/symbol/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid8 = _errs40 === errors; + } else { + var valid8 = true; + } + } + } + } + } else { + validate23.errors = [ + { + instancePath: instancePath + '/token', + schemaPath: '#/properties/token/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs35 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.uris !== undefined) { + let data14 = data.uris; + const _errs42 = errors; + const _errs43 = errors; + if (errors === _errs43) { + if ( + data14 && + typeof data14 == 'object' && + !Array.isArray(data14) + ) { + for (const key6 in data14) { + const _errs46 = errors; + if (typeof data14[key6] !== 'string') { + validate23.errors = [ + { + instancePath: + instancePath + + '/uris/' + + key6 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/URIs/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid10 = _errs46 === errors; + if (!valid10) { + break; + } + } + } else { + validate23.errors = [ + { + instancePath: instancePath + '/uris', + schemaPath: '#/definitions/URIs/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs42 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } + } + } + } + } else { + validate23.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate23.errors = vErrors; + return errors === 0; +} +function validate22( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + for (const key0 in data) { + const _errs2 = errors; + if ( + !validate23(data[key0], { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data, + parentDataProperty: key0, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate23.errors + : vErrors.concat(validate23.errors); + errors = vErrors.length; + } + var valid0 = _errs2 === errors; + if (!valid0) { + break; + } + } + } else { + validate22.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate22.errors = vErrors; + return errors === 0; +} +const schema29 = { + additionalProperties: { $ref: '#/definitions/IdentitySnapshot' }, + description: + 'A field keyed by timestamps to document the evolution of the field. Each timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nFor example, to insert a new value: ```ts const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; ```', + type: 'object', +}; +const schema30 = { + additionalProperties: false, + description: + 'A snapshot of the metadata for a particular identity at a specific time.', + properties: { + description: { + description: + 'A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details.', + }, + migrated: { + description: + "The timestamp at which this identity snapshot is fully in effect. This value should only be provided if the snapshot takes effect over a period of time (e.g. an in-circulation token identity is gradually migrating to a new category). In these cases, clients should gradually migrate to using the new information beginning after the identity snapshot's timestamp and the `migrated` time.\n\nThis timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.", + type: 'string', + }, + name: { + description: + 'The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.', + type: 'string', + }, + splitId: { + description: + "The split ID of this identity's chain of record.\n\nIf undefined, defaults to {@link MetadataRegistry.defaultChain } .", + type: 'string', + }, + status: { + description: + 'The status of this identity, must be `active`, `inactive`, or `burned`. If omitted, defaults to `active`.\n- Identities with an `active` status should be actively tracked by clients.\n- Identities with an `inactive` status may be considered for archival by clients and may be removed in future registry versions.\n- Identities with a `burned` status have been destroyed by setting the latest identity output to a data-carrier output (`OP_RETURN`), permanently terminating the authchain. Clients should archive burned identities and – if the burned identity represented a token type – consider burning any remaining tokens of that category to reclaim funds from those outputs.', + enum: ['active', 'burned', 'inactive'], + type: 'string', + }, + tags: { + description: + "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + items: { type: 'string' }, + type: 'array', + }, + token: { + $ref: '#/definitions/TokenCategory', + description: + 'If this identity is a type of token, a data structure indicating how tokens should be understood and displayed in user interfaces. Omitted for non-token identities.', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name'], + type: 'object', +}; +const schema32 = { + additionalProperties: false, + description: + "A definition specifying information about an identity's token category.", + properties: { + category: { + description: + "The current token category used by this identity. Often, this will be equal to the identity's authbase, but some token identities must migrate to new categories for technical reasons.", + type: 'string', + }, + decimals: { + description: + 'An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this token category.\n\nThis is the number of digits that can appear after the decimal separator in fungible token amounts. For a token category with a `symbol` of `SYMBOL` and a `decimals` of `2`, a fungible token amount of `12345` should be displayed as `123.45 SYMBOL`.\n\nIf omitted, defaults to `0`.', + type: 'number', + }, + nfts: { + $ref: '#/definitions/NftCategory', + description: + 'Display information for non-fungible tokens (NFTs) of this identity. Omitted for token categories without NFTs.', + }, + symbol: { + description: + 'An abbreviation used to uniquely identity this token category.\n\nSymbols must be comprised only of capital letters, numbers, and dashes (`-`). This can be validated with the regular expression: `/^[-A-Z0-9]+$/`.', + type: 'string', + }, + }, + required: ['category', 'symbol'], + type: 'object', +}; +const schema33 = { + additionalProperties: false, + description: + 'A definition specifying the non-fungible token information for a token category.', + properties: { + description: { + description: + 'A string describing how this identity uses NFTs (for use in user interfaces). Descriptions longer than `160` characters may be elided in some interfaces.\n\nE.g.:\n- "ACME DEX NFT order receipts are issued when you place orders on the decentralized exchange. After orders are processed, order receipts can be redeemed for purchased tokens or sales proceeds.";\n- "ACME Game collectable NFTs unlock unique playable content, user avatars, and item skins in ACME Game Online."; etc.', + type: 'string', + }, + fields: { + $ref: '#/definitions/NftCategoryField', + description: + 'A mapping of field identifier to field definitions for the data fields that can appear in NFT commitments of this category.\n\nCategories including only sequential NFTs (where `parse.bytecode` is undefined) should omit `fields` (or set to `undefined`).', + }, + parse: { + anyOf: [ + { $ref: '#/definitions/ParsableNftCollection' }, + { $ref: '#/definitions/SequentialNftCollection' }, + ], + description: + 'Parsing and interpretation information for all NFTs of this category; this enables generalized wallets to parse and display detailed information about all NFTs held by the wallet, e.g. `BCH Pledged`, `Order Price`, `Seat Number`, `Asset Number`, `IPFS Content Identifier`, `HTTPS URL`, etc.\n\nParsing instructions are provided in the `bytecode` property, and the results are interpreted using the `types` property.', + }, + }, + required: ['parse'], + type: 'object', +}; +const schema34 = { + additionalProperties: { + additionalProperties: false, + properties: { + description: { + description: + 'A string describing how this identity uses NFTs (for use in user interfaces). Descriptions longer than `160` characters may be elided in some interfaces.\n\nE.g.:\n- `The BCH value pledged at the time this receipt was issued.`\n- `The number of tokens sold in this order.`\n- `The seat number associated with this ticket.`', + type: 'string', + }, + encoding: { + anyOf: [ + { + additionalProperties: false, + properties: { + type: { + enum: [ + 'binary', + 'boolean', + 'hex', + 'https-url', + 'ipfs-cid', + 'utf8', + 'locktime', + ], + type: 'string', + }, + }, + required: ['type'], + type: 'object', + }, + { + additionalProperties: false, + properties: { + aggregate: { + const: 'add', + description: + "The `aggregate` property indicates that aggregating this field from multiple NFTs is desirable in user interfaces. For example, for a field named `BCH Pledged` where `aggregate` is `add`, the client can display a `Total BCH Pledged` in any user interface listing more than one NFT.\n\nIf specified, clients should aggregate the field from all NFTs, of all NFT types within the category, within a particular view (e.g. NFTs held by a single wallet, NFTs existing in a single transaction's outputs, etc.) using the specified operation.\n\nNote, while aggregation could be performed using any commutative operation – multiplication, bitwise AND, bitwise OR, bitwise XOR, etc. – only `add` is currently supported.", + type: 'string', + }, + decimals: { + description: + 'An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this token field.\n\nThis is the number of digits that can appear after the decimal separator in amounts. For a field with a `decimals` of `2`, a value of `123456` should be displayed as `1234.56`.\n\nIf omitted, defaults to `0`.', + type: 'number', + }, + type: { const: 'number', type: 'string' }, + unit: { + description: + "The unit in which this field is denominated, taking the `decimals` value into account. If representing fungible token amount, this will often be the symbol of the represented token category.\n\nE.g. `BCH`, `sats`, `AcmeUSD`, etc.\n\nIf not provided, clients should not represent this field as having a unit beyond the field's `name`.", + type: 'string', + }, + }, + required: ['type'], + type: 'object', + }, + ], + description: + 'The expected encoding of this field when read from the parsing altstack (see {@link ParsableNftCollection } ). All encoding definitions must have a `type`, and some encoding definitions allow for additional hinting about display strategies in clients.\n\nEncoding types may be set to `binary`, `boolean`, `hex`, `number`, or `utf8`:\n\n- `binary` types should be displayed as binary literals (e.g. `0b0101`)\n- `boolean` types should be displayed as `true` if exactly `0x01` or `false` if exactly `0x00`. If a boolean value does not match one of these values, clients should represent the NFT as unable to be parsed (e.g. simply display the full `commitment`).\n- `hex` types should be displayed as hex literals (e.g.`0xabcd`).\n- `https-url` types are percent encoded with the `https://` prefix omitted; they may be displayed as URIs or as activatable links.\n- `ipfs-cid` types are binary-encoded IPFS Content Identifiers; they may be displayed as URIs or as activatable links.\n- `locktime` types are `OP_TXLOCKTIME` results: integers from `0` to `4294967295` (inclusive) where values less than `500000000` are understood to be a block height (the current block number in the chain, beginning from block `0`), and values greater than or equal to `500000000` are understood to be a Median Time Past (BIP113) UNIX timestamp. (Note, sequence age is not currently supported.)\n- `number` types should be displayed according the their configured `decimals` and `unit` values.\n- `utf8` types should be displayed as utf8 strings.', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of NFT field extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.', + }, + name: { + description: + 'The name of this field for use in interfaces. Names longer than `20` characters may be elided in some interfaces.\n\nE.g.:\n- `BCH Pledged`\n- `Tokens Sold`\n- `Settlement Locktime`\n- `Seat Number`,\n- `IPFS Content Identifier`\n- `HTTPS URL`', + type: 'string', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this NFT field. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.', + }, + }, + required: ['encoding'], + type: 'object', + }, + description: + 'A definition specifying a field that can be encoded in non-fungible tokens of a token category.', + type: 'object', +}; +function validate30( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + for (const key0 in data) { + let data0 = data[key0]; + const _errs2 = errors; + if (errors === _errs2) { + if (data0 && typeof data0 == 'object' && !Array.isArray(data0)) { + let missing0; + if (data0.encoding === undefined && (missing0 = 'encoding')) { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: '#/additionalProperties/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs4 = errors; + for (const key1 in data0) { + if ( + !( + key1 === 'description' || + key1 === 'encoding' || + key1 === 'extensions' || + key1 === 'name' || + key1 === 'uris' + ) + ) { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: '#/additionalProperties/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key1 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs4 === errors) { + if (data0.description !== undefined) { + const _errs5 = errors; + if (typeof data0.description !== 'string') { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/description', + schemaPath: + '#/additionalProperties/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid1 = _errs5 === errors; + } else { + var valid1 = true; + } + if (valid1) { + if (data0.encoding !== undefined) { + let data2 = data0.encoding; + const _errs7 = errors; + const _errs8 = errors; + let valid2 = false; + const _errs9 = errors; + if (errors === _errs9) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + let missing1; + if (data2.type === undefined && (missing1 = 'type')) { + const err0 = { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/0/required', + keyword: 'required', + params: { missingProperty: missing1 }, + message: + "must have required property '" + missing1 + "'", + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } else { + const _errs11 = errors; + for (const key2 in data2) { + if (!(key2 === 'type')) { + const err1 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/0/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key2 }, + message: 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + break; + } + } + if (_errs11 === errors) { + if (data2.type !== undefined) { + let data3 = data2.type; + if (typeof data3 !== 'string') { + const err2 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/type', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/0/properties/type/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + if ( + !( + data3 === 'binary' || + data3 === 'boolean' || + data3 === 'hex' || + data3 === 'https-url' || + data3 === 'ipfs-cid' || + data3 === 'utf8' || + data3 === 'locktime' + ) + ) { + const err3 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/type', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/0/properties/type/enum', + keyword: 'enum', + params: { + allowedValues: + schema34.additionalProperties.properties + .encoding.anyOf[0].properties.type.enum, + }, + message: + 'must be equal to one of the allowed values', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + } + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/0/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var _valid0 = _errs9 === errors; + valid2 = valid2 || _valid0; + if (!valid2) { + const _errs14 = errors; + if (errors === _errs14) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + let missing2; + if (data2.type === undefined && (missing2 = 'type')) { + const err5 = { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/required', + keyword: 'required', + params: { missingProperty: missing2 }, + message: + "must have required property '" + + missing2 + + "'", + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } else { + const _errs16 = errors; + for (const key3 in data2) { + if ( + !( + key3 === 'aggregate' || + key3 === 'decimals' || + key3 === 'type' || + key3 === 'unit' + ) + ) { + const err6 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key3 }, + message: + 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + break; + } + } + if (_errs16 === errors) { + if (data2.aggregate !== undefined) { + let data4 = data2.aggregate; + const _errs17 = errors; + if (typeof data4 !== 'string') { + const err7 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/aggregate', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/properties/aggregate/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err7]; + } else { + vErrors.push(err7); + } + errors++; + } + if ('add' !== data4) { + const err8 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/aggregate', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/properties/aggregate/const', + keyword: 'const', + params: { allowedValue: 'add' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err8]; + } else { + vErrors.push(err8); + } + errors++; + } + var valid4 = _errs17 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data2.decimals !== undefined) { + let data5 = data2.decimals; + const _errs19 = errors; + if ( + !( + typeof data5 == 'number' && + isFinite(data5) + ) + ) { + const err9 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/decimals', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/properties/decimals/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }; + if (vErrors === null) { + vErrors = [err9]; + } else { + vErrors.push(err9); + } + errors++; + } + var valid4 = _errs19 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data2.type !== undefined) { + let data6 = data2.type; + const _errs21 = errors; + if (typeof data6 !== 'string') { + const err10 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/type', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/properties/type/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err10]; + } else { + vErrors.push(err10); + } + errors++; + } + if ('number' !== data6) { + const err11 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/type', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/properties/type/const', + keyword: 'const', + params: { allowedValue: 'number' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err11]; + } else { + vErrors.push(err11); + } + errors++; + } + var valid4 = _errs21 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data2.unit !== undefined) { + const _errs23 = errors; + if (typeof data2.unit !== 'string') { + const err12 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/unit', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/properties/unit/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err12]; + } else { + vErrors.push(err12); + } + errors++; + } + var valid4 = _errs23 === errors; + } else { + var valid4 = true; + } + } + } + } + } + } + } else { + const err13 = { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err13]; + } else { + vErrors.push(err13); + } + errors++; + } + } + var _valid0 = _errs14 === errors; + valid2 = valid2 || _valid0; + } + if (!valid2) { + const err14 = { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err14]; + } else { + vErrors.push(err14); + } + errors++; + validate30.errors = vErrors; + return false; + } else { + errors = _errs8; + if (vErrors !== null) { + if (_errs8) { + vErrors.length = _errs8; + } else { + vErrors = null; + } + } + } + var valid1 = _errs7 === errors; + } else { + var valid1 = true; + } + if (valid1) { + if (data0.extensions !== undefined) { + let data8 = data0.extensions; + const _errs25 = errors; + const _errs26 = errors; + if (errors === _errs26) { + if ( + data8 && + typeof data8 == 'object' && + !Array.isArray(data8) + ) { + for (const key4 in data8) { + let data9 = data8[key4]; + const _errs29 = errors; + const _errs30 = errors; + let valid7 = false; + const _errs31 = errors; + if (typeof data9 !== 'string') { + const err15 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err15]; + } else { + vErrors.push(err15); + } + errors++; + } + var _valid1 = _errs31 === errors; + valid7 = valid7 || _valid1; + if (!valid7) { + const _errs33 = errors; + if (errors === _errs33) { + if ( + data9 && + typeof data9 == 'object' && + !Array.isArray(data9) + ) { + for (const key5 in data9) { + const _errs36 = errors; + if (typeof data9[key5] !== 'string') { + const err16 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key5 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err16]; + } else { + vErrors.push(err16); + } + errors++; + } + var valid8 = _errs36 === errors; + if (!valid8) { + break; + } + } + } else { + const err17 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err17]; + } else { + vErrors.push(err17); + } + errors++; + } + } + var _valid1 = _errs33 === errors; + valid7 = valid7 || _valid1; + if (!valid7) { + const _errs38 = errors; + if (errors === _errs38) { + if ( + data9 && + typeof data9 == 'object' && + !Array.isArray(data9) + ) { + for (const key6 in data9) { + let data11 = data9[key6]; + const _errs41 = errors; + if (errors === _errs41) { + if ( + data11 && + typeof data11 == 'object' && + !Array.isArray(data11) + ) { + for (const key7 in data11) { + const _errs44 = errors; + if ( + typeof data11[key7] !== 'string' + ) { + const err18 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key6 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key7 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err18]; + } else { + vErrors.push(err18); + } + errors++; + } + var valid10 = _errs44 === errors; + if (!valid10) { + break; + } + } + } else { + const err19 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key6 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err19]; + } else { + vErrors.push(err19); + } + errors++; + } + } + var valid9 = _errs41 === errors; + if (!valid9) { + break; + } + } + } else { + const err20 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err20]; + } else { + vErrors.push(err20); + } + errors++; + } + } + var _valid1 = _errs38 === errors; + valid7 = valid7 || _valid1; + } + } + if (!valid7) { + const err21 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err21]; + } else { + vErrors.push(err21); + } + errors++; + validate30.errors = vErrors; + return false; + } else { + errors = _errs30; + if (vErrors !== null) { + if (_errs30) { + vErrors.length = _errs30; + } else { + vErrors = null; + } + } + } + var valid6 = _errs29 === errors; + if (!valid6) { + break; + } + } + } else { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid1 = _errs25 === errors; + } else { + var valid1 = true; + } + if (valid1) { + if (data0.name !== undefined) { + const _errs46 = errors; + if (typeof data0.name !== 'string') { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/name', + schemaPath: + '#/additionalProperties/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid1 = _errs46 === errors; + } else { + var valid1 = true; + } + if (valid1) { + if (data0.uris !== undefined) { + let data14 = data0.uris; + const _errs48 = errors; + const _errs49 = errors; + if (errors === _errs49) { + if ( + data14 && + typeof data14 == 'object' && + !Array.isArray(data14) + ) { + for (const key8 in data14) { + const _errs52 = errors; + if (typeof data14[key8] !== 'string') { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/uris/' + + key8 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/URIs/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid12 = _errs52 === errors; + if (!valid12) { + break; + } + } + } else { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/uris', + schemaPath: '#/definitions/URIs/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid1 = _errs48 === errors; + } else { + var valid1 = true; + } + } + } + } + } + } + } + } else { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: '#/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs2 === errors; + if (!valid0) { + break; + } + } + } else { + validate30.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate30.errors = vErrors; + return errors === 0; +} +const schema37 = { + additionalProperties: false, + description: + 'Interpretation information for a collection of parsable NFTs, a collection in which each NFT may include additional metadata fields beyond a sequential identifier within its on-chain commitment. Note that {@link ParsableNftCollection } s differ from {@link SequentialNftCollection } s in that parsable collections require a parsing `bytecode` with which to inspect each NFT commitment: the type of each NFT is indexed by the hex-encoded contents the bottom item on the altstack following the evaluation of the parsing bytecode.', + properties: { + bytecode: { + description: + "A segment of hex-encoded Bitcoin Cash VM bytecode that parses UTXOs holding NFTs of this category, identifies the NFT's type within the category, and returns a list of the NFT's field values via the altstack. If undefined, this NFT Category includes only sequential NFTs, with only an identifier and no NFT fields encoded in each NFT's on-chain commitment.\n\nThe parse `bytecode` is evaluated by instantiating and partially verifying a standardized NFT parsing transaction:\n- version: `2`\n- inputs: - 0: Spends the UTXO containing the NFT with an empty unlocking bytecode and sequence number of `0`. - 1: Spends index `0` of the empty hash outpoint, with locking bytecode set to `parse.bytecode`, unlocking bytecode `OP_1` (`0x51`) and sequence number `0`.\n- outputs: - 0: A locking bytecode of OP_RETURN (`0x6a`) and value of `0`.\n- locktime: `0`\n\nAfter input 1 of this NFT parsing transaction is evaluated, if the resulting stack is not valid (a single \"truthy\" element remaining on the stack) – or if the altstack is empty – parsing has failed and clients should represent the NFT as unable to be parsed (e.g. simply display the full `commitment` as a hex-encoded value in the user interface).\n\nOn successful parsing evaluations, the bottom item on the altstack indicates the type of the NFT according to the matching definition in `types`. If no match is found, clients should represent the NFT as unable to be parsed.\n\nFor example: `00d2517f7c6b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_1 OP_SPLIT OP_SWAP OP_TOALTSTACK OP_TOALTSTACK) splits the commitment after 1 byte, pushing the first byte to the altstack as an NFT type identifier and the remaining segment of the commitment as the first NFT field value.\n\nIf undefined (in a {@link SequentialNftCollection } ), this field could be considered to have a default value of `00d26b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_TOALTSTACK), which takes the full contents of the commitment as a fixed type index. As such, each index of the NFT category's `types` maps a precise commitment value to the metadata for NFTs with that particular commitment. E.g. an NFT with an empty commitment (VM number 0) maps to `types['']`, a commitment of `01` (hex) maps to `types['01']`, etc. This pattern is used for collections of sequential NFTs.", + type: 'string', + }, + types: { + additionalProperties: { + $ref: '#/definitions/NftType', + description: + 'A definitions for each type of NFT within the token category. Parsable NFT types are indexed by the hex-encoded value of the bottom altstack item following evaluation of `NftCategory.parse.bytecode`. The remaining altstack items are mapped to NFT fields according to the `fields` property of the matching NFT type.', + }, + description: + 'A mapping of hex-encoded values to definitions of possible NFT types in this category.', + type: 'object', + }, + }, + required: ['bytecode', 'types'], + type: 'object', +}; +const schema38 = { + additionalProperties: false, + description: 'A definition for one type of NFT within a token category.', + properties: { + description: { + description: + 'A string describing this NFT type for use in user interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- "Receipts issued by the exchange to record details about purchases. After settlement, these receipts are redeemed for the purchased tokens.";\n- "Receipts issued by the crowdfunding campaign to document the value of funds pledged. If the user decides to cancel their pledge before the campaign completes, these receipts can be redeemed for a full refund.";\n- "Tickets issued for events at ACME Stadium.";\n- Sealed ballots certified by ACME decentralized organization during the voting period. After the voting period ends, these ballots must be revealed to reclaim the tokens used for voting."', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of NFT type extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.', + }, + fields: { + description: + "A list of identifiers for fields contained in NFTs of this type. On successful parsing evaluations, the bottom item on the altstack indicates the matched NFT type, and the remaining altstack items represent NFT field contents in the order listed (where `fields[0]` is the second-to-bottom item, and the final item in `fields` is the top of the altstack).\n\nFields should be ordered by recommended importance from most important to least important; in user interfaces, clients should display fields at lower indexes more prominently than those at higher indexes, e.g. if some fields cannot be displayed in minimized interfaces, higher-importance fields can still be represented. (Note, this ordering is controlled by the bytecode specified in `token.nft.parse.bytecode`.)\n\nIf this is a sequential NFT, (the category's `parse.bytecode` is undefined), `fields` should be omitted or set to `undefined`.", + items: { type: 'string' }, + type: 'array', + }, + name: { + description: + 'The name of this NFT type for use in interfaces. Names longer than `20` characters may be elided in some interfaces.\n\nE.g. `Market Order Buys`, `Limit Order Sales`, `Pledge Receipts`, `ACME Stadium Tickets`, `Sealed Votes`, etc.', + type: 'string', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this NFT type. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.', + }, + }, + required: ['name'], + type: 'object', +}; +function validate33( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.name === undefined && (missing0 = 'name')) { + validate33.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'description' || + key0 === 'extensions' || + key0 === 'fields' || + key0 === 'name' || + key0 === 'uris' + ) + ) { + validate33.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate33.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extensions !== undefined) { + let data1 = data.extensions; + const _errs4 = errors; + const _errs5 = errors; + if (errors === _errs5) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + let data2 = data1[key1]; + const _errs8 = errors; + const _errs9 = errors; + let valid3 = false; + const _errs10 = errors; + if (typeof data2 !== 'string') { + const err0 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs10 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs12 = errors; + if (errors === _errs12) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key2 in data2) { + const _errs15 = errors; + if (typeof data2[key2] !== 'string') { + const err1 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } + var valid4 = _errs15 === errors; + if (!valid4) { + break; + } + } + } else { + const err2 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + } + var _valid0 = _errs12 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs17 = errors; + if (errors === _errs17) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key3 in data2) { + let data4 = data2[key3]; + const _errs20 = errors; + if (errors === _errs20) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key4 in data4) { + const _errs23 = errors; + if (typeof data4[key4] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid6 = _errs23 === errors; + if (!valid6) { + break; + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid5 = _errs20 === errors; + if (!valid5) { + break; + } + } + } else { + const err5 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + } + var _valid0 = _errs17 === errors; + valid3 = valid3 || _valid0; + } + } + if (!valid3) { + const err6 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + validate33.errors = vErrors; + return false; + } else { + errors = _errs9; + if (vErrors !== null) { + if (_errs9) { + vErrors.length = _errs9; + } else { + vErrors = null; + } + } + } + var valid2 = _errs8 === errors; + if (!valid2) { + break; + } + } + } else { + validate33.errors = [ + { + instancePath: instancePath + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.fields !== undefined) { + let data6 = data.fields; + const _errs25 = errors; + if (errors === _errs25) { + if (Array.isArray(data6)) { + var valid7 = true; + const len0 = data6.length; + for (let i0 = 0; i0 < len0; i0++) { + const _errs27 = errors; + if (typeof data6[i0] !== 'string') { + validate33.errors = [ + { + instancePath: instancePath + '/fields/' + i0, + schemaPath: '#/properties/fields/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid7 = _errs27 === errors; + if (!valid7) { + break; + } + } + } else { + validate33.errors = [ + { + instancePath: instancePath + '/fields', + schemaPath: '#/properties/fields/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid0 = _errs25 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs29 = errors; + if (typeof data.name !== 'string') { + validate33.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs29 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.uris !== undefined) { + let data9 = data.uris; + const _errs31 = errors; + const _errs32 = errors; + if (errors === _errs32) { + if ( + data9 && + typeof data9 == 'object' && + !Array.isArray(data9) + ) { + for (const key5 in data9) { + const _errs35 = errors; + if (typeof data9[key5] !== 'string') { + validate33.errors = [ + { + instancePath: + instancePath + + '/uris/' + + key5.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/URIs/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid9 = _errs35 === errors; + if (!valid9) { + break; + } + } + } else { + validate33.errors = [ + { + instancePath: instancePath + '/uris', + schemaPath: '#/definitions/URIs/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs31 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } + } else { + validate33.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate33.errors = vErrors; + return errors === 0; +} +function validate32( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if ( + (data.bytecode === undefined && (missing0 = 'bytecode')) || + (data.types === undefined && (missing0 = 'types')) + ) { + validate32.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if (!(key0 === 'bytecode' || key0 === 'types')) { + validate32.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.bytecode !== undefined) { + const _errs2 = errors; + if (typeof data.bytecode !== 'string') { + validate32.errors = [ + { + instancePath: instancePath + '/bytecode', + schemaPath: '#/properties/bytecode/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.types !== undefined) { + let data1 = data.types; + const _errs4 = errors; + if (errors === _errs4) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + const _errs7 = errors; + if ( + !validate33(data1[key1], { + instancePath: + instancePath + + '/types/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data1, + parentDataProperty: key1, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate33.errors + : vErrors.concat(validate33.errors); + errors = vErrors.length; + } + var valid1 = _errs7 === errors; + if (!valid1) { + break; + } + } + } else { + validate32.errors = [ + { + instancePath: instancePath + '/types', + schemaPath: '#/properties/types/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + } + } + } + } else { + validate32.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate32.errors = vErrors; + return errors === 0; +} +const schema41 = { + additionalProperties: false, + description: + 'Interpretation information for a collection of sequential NFTs, a collection in which each NFT includes only a sequential identifier within its on-chain commitment. Note that {@link SequentialNftCollection } s differ from {@link ParsableNftCollection } s in that sequential collections lack a parsing `bytecode` with which to inspect each NFT commitment: the type of each NFT is indexed by the full contents its commitment (interpreted as a positive VM integer in user interfaces).', + properties: { + types: { + additionalProperties: { + $ref: '#/definitions/NftType', + description: + 'Interpretation information for each type of NFT within the token category, indexed by commitment hex. For sequential NFTs, the on-chain commitment of each NFT is interpreted as a VM number to reference its particular NFT type in user interfaces. Issuing a sequential NFT with a negative or invalid VM number is discouraged, but clients may render the commitment of such NFTs in hex-encoded form, prefixed with `X`.', + }, + description: + 'A mapping of each NFT commitment (typically, a positive integer encoded as a VM number) to metadata for that NFT type in this category.', + type: 'object', + }, + }, + required: ['types'], + type: 'object', +}; +function validate36( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.types === undefined && (missing0 = 'types')) { + validate36.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if (!(key0 === 'types')) { + validate36.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.types !== undefined) { + let data0 = data.types; + const _errs2 = errors; + if (errors === _errs2) { + if (data0 && typeof data0 == 'object' && !Array.isArray(data0)) { + for (const key1 in data0) { + const _errs5 = errors; + if ( + !validate33(data0[key1], { + instancePath: + instancePath + + '/types/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data0, + parentDataProperty: key1, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate33.errors + : vErrors.concat(validate33.errors); + errors = vErrors.length; + } + var valid1 = _errs5 === errors; + if (!valid1) { + break; + } + } + } else { + validate36.errors = [ + { + instancePath: instancePath + '/types', + schemaPath: '#/properties/types/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + } + } + } + } else { + validate36.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate36.errors = vErrors; + return errors === 0; +} +function validate29( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.parse === undefined && (missing0 = 'parse')) { + validate29.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !(key0 === 'description' || key0 === 'fields' || key0 === 'parse') + ) { + validate29.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate29.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.fields !== undefined) { + const _errs4 = errors; + if ( + !validate30(data.fields, { + instancePath: instancePath + '/fields', + parentData: data, + parentDataProperty: 'fields', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate30.errors + : vErrors.concat(validate30.errors); + errors = vErrors.length; + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.parse !== undefined) { + let data2 = data.parse; + const _errs5 = errors; + const _errs6 = errors; + let valid1 = false; + const _errs7 = errors; + if ( + !validate32(data2, { + instancePath: instancePath + '/parse', + parentData: data, + parentDataProperty: 'parse', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate32.errors + : vErrors.concat(validate32.errors); + errors = vErrors.length; + } + var _valid0 = _errs7 === errors; + valid1 = valid1 || _valid0; + if (!valid1) { + const _errs8 = errors; + if ( + !validate36(data2, { + instancePath: instancePath + '/parse', + parentData: data, + parentDataProperty: 'parse', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate36.errors + : vErrors.concat(validate36.errors); + errors = vErrors.length; + } + var _valid0 = _errs8 === errors; + valid1 = valid1 || _valid0; + } + if (!valid1) { + const err0 = { + instancePath: instancePath + '/parse', + schemaPath: '#/properties/parse/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + validate29.errors = vErrors; + return false; + } else { + errors = _errs6; + if (vErrors !== null) { + if (_errs6) { + vErrors.length = _errs6; + } else { + vErrors = null; + } + } + } + var valid0 = _errs5 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } else { + validate29.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate29.errors = vErrors; + return errors === 0; +} +function validate28( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if ( + (data.category === undefined && (missing0 = 'category')) || + (data.symbol === undefined && (missing0 = 'symbol')) + ) { + validate28.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'category' || + key0 === 'decimals' || + key0 === 'nfts' || + key0 === 'symbol' + ) + ) { + validate28.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.category !== undefined) { + const _errs2 = errors; + if (typeof data.category !== 'string') { + validate28.errors = [ + { + instancePath: instancePath + '/category', + schemaPath: '#/properties/category/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.decimals !== undefined) { + let data1 = data.decimals; + const _errs4 = errors; + if (!(typeof data1 == 'number' && isFinite(data1))) { + validate28.errors = [ + { + instancePath: instancePath + '/decimals', + schemaPath: '#/properties/decimals/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.nfts !== undefined) { + const _errs6 = errors; + if ( + !validate29(data.nfts, { + instancePath: instancePath + '/nfts', + parentData: data, + parentDataProperty: 'nfts', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate29.errors + : vErrors.concat(validate29.errors); + errors = vErrors.length; + } + var valid0 = _errs6 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.symbol !== undefined) { + const _errs7 = errors; + if (typeof data.symbol !== 'string') { + validate28.errors = [ + { + instancePath: instancePath + '/symbol', + schemaPath: '#/properties/symbol/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs7 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } else { + validate28.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate28.errors = vErrors; + return errors === 0; +} +function validate27( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.name === undefined && (missing0 = 'name')) { + validate27.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if (!func4.call(schema30.properties, key0)) { + validate27.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate27.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extensions !== undefined) { + let data1 = data.extensions; + const _errs4 = errors; + const _errs5 = errors; + if (errors === _errs5) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + let data2 = data1[key1]; + const _errs8 = errors; + const _errs9 = errors; + let valid3 = false; + const _errs10 = errors; + if (typeof data2 !== 'string') { + const err0 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs10 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs12 = errors; + if (errors === _errs12) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key2 in data2) { + const _errs15 = errors; + if (typeof data2[key2] !== 'string') { + const err1 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } + var valid4 = _errs15 === errors; + if (!valid4) { + break; + } + } + } else { + const err2 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + } + var _valid0 = _errs12 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs17 = errors; + if (errors === _errs17) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key3 in data2) { + let data4 = data2[key3]; + const _errs20 = errors; + if (errors === _errs20) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key4 in data4) { + const _errs23 = errors; + if (typeof data4[key4] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid6 = _errs23 === errors; + if (!valid6) { + break; + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid5 = _errs20 === errors; + if (!valid5) { + break; + } + } + } else { + const err5 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + } + var _valid0 = _errs17 === errors; + valid3 = valid3 || _valid0; + } + } + if (!valid3) { + const err6 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + validate27.errors = vErrors; + return false; + } else { + errors = _errs9; + if (vErrors !== null) { + if (_errs9) { + vErrors.length = _errs9; + } else { + vErrors = null; + } + } + } + var valid2 = _errs8 === errors; + if (!valid2) { + break; + } + } + } else { + validate27.errors = [ + { + instancePath: instancePath + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.migrated !== undefined) { + const _errs25 = errors; + if (typeof data.migrated !== 'string') { + validate27.errors = [ + { + instancePath: instancePath + '/migrated', + schemaPath: '#/properties/migrated/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs25 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs27 = errors; + if (typeof data.name !== 'string') { + validate27.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs27 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.splitId !== undefined) { + const _errs29 = errors; + if (typeof data.splitId !== 'string') { + validate27.errors = [ + { + instancePath: instancePath + '/splitId', + schemaPath: '#/properties/splitId/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs29 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.status !== undefined) { + let data9 = data.status; + const _errs31 = errors; + if (typeof data9 !== 'string') { + validate27.errors = [ + { + instancePath: instancePath + '/status', + schemaPath: '#/properties/status/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + if ( + !( + data9 === 'active' || + data9 === 'burned' || + data9 === 'inactive' + ) + ) { + validate27.errors = [ + { + instancePath: instancePath + '/status', + schemaPath: '#/properties/status/enum', + keyword: 'enum', + params: { + allowedValues: schema30.properties.status.enum, + }, + message: + 'must be equal to one of the allowed values', + }, + ]; + return false; + } + var valid0 = _errs31 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.tags !== undefined) { + let data10 = data.tags; + const _errs33 = errors; + if (errors === _errs33) { + if (Array.isArray(data10)) { + var valid7 = true; + const len0 = data10.length; + for (let i0 = 0; i0 < len0; i0++) { + const _errs35 = errors; + if (typeof data10[i0] !== 'string') { + validate27.errors = [ + { + instancePath: instancePath + '/tags/' + i0, + schemaPath: '#/properties/tags/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid7 = _errs35 === errors; + if (!valid7) { + break; + } + } + } else { + validate27.errors = [ + { + instancePath: instancePath + '/tags', + schemaPath: '#/properties/tags/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid0 = _errs33 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.token !== undefined) { + const _errs37 = errors; + if ( + !validate28(data.token, { + instancePath: instancePath + '/token', + parentData: data, + parentDataProperty: 'token', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate28.errors + : vErrors.concat(validate28.errors); + errors = vErrors.length; + } + var valid0 = _errs37 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.uris !== undefined) { + let data13 = data.uris; + const _errs38 = errors; + const _errs39 = errors; + if (errors === _errs39) { + if ( + data13 && + typeof data13 == 'object' && + !Array.isArray(data13) + ) { + for (const key5 in data13) { + const _errs42 = errors; + if (typeof data13[key5] !== 'string') { + validate27.errors = [ + { + instancePath: + instancePath + + '/uris/' + + key5 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/URIs/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid9 = _errs42 === errors; + if (!valid9) { + break; + } + } + } else { + validate27.errors = [ + { + instancePath: instancePath + '/uris', + schemaPath: '#/definitions/URIs/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs38 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } + } + } + } + } + } else { + validate27.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate27.errors = vErrors; + return errors === 0; +} +function validate26( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + for (const key0 in data) { + const _errs2 = errors; + if ( + !validate27(data[key0], { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data, + parentDataProperty: key0, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate27.errors + : vErrors.concat(validate27.errors); + errors = vErrors.length; + } + var valid0 = _errs2 === errors; + if (!valid0) { + break; + } + } + } else { + validate26.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate26.errors = vErrors; + return errors === 0; +} +const schema43 = { + additionalProperties: false, + description: + 'An identity representing a metadata registry that is not published on-chain and therefore has no authbase or trackable authchain.', + properties: { + description: { + description: + 'A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details.', + }, + name: { + description: + 'The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.', + type: 'string', + }, + tags: { + description: + "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + items: { type: 'string' }, + type: 'array', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name'], + type: 'object', +}; +function validate43( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.name === undefined && (missing0 = 'name')) { + validate43.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'description' || + key0 === 'extensions' || + key0 === 'name' || + key0 === 'tags' || + key0 === 'uris' + ) + ) { + validate43.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate43.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extensions !== undefined) { + let data1 = data.extensions; + const _errs4 = errors; + const _errs5 = errors; + if (errors === _errs5) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + let data2 = data1[key1]; + const _errs8 = errors; + const _errs9 = errors; + let valid3 = false; + const _errs10 = errors; + if (typeof data2 !== 'string') { + const err0 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs10 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs12 = errors; + if (errors === _errs12) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key2 in data2) { + const _errs15 = errors; + if (typeof data2[key2] !== 'string') { + const err1 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } + var valid4 = _errs15 === errors; + if (!valid4) { + break; + } + } + } else { + const err2 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + } + var _valid0 = _errs12 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs17 = errors; + if (errors === _errs17) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key3 in data2) { + let data4 = data2[key3]; + const _errs20 = errors; + if (errors === _errs20) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key4 in data4) { + const _errs23 = errors; + if (typeof data4[key4] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid6 = _errs23 === errors; + if (!valid6) { + break; + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid5 = _errs20 === errors; + if (!valid5) { + break; + } + } + } else { + const err5 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + } + var _valid0 = _errs17 === errors; + valid3 = valid3 || _valid0; + } + } + if (!valid3) { + const err6 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + validate43.errors = vErrors; + return false; + } else { + errors = _errs9; + if (vErrors !== null) { + if (_errs9) { + vErrors.length = _errs9; + } else { + vErrors = null; + } + } + } + var valid2 = _errs8 === errors; + if (!valid2) { + break; + } + } + } else { + validate43.errors = [ + { + instancePath: instancePath + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs25 = errors; + if (typeof data.name !== 'string') { + validate43.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs25 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.tags !== undefined) { + let data7 = data.tags; + const _errs27 = errors; + if (errors === _errs27) { + if (Array.isArray(data7)) { + var valid7 = true; + const len0 = data7.length; + for (let i0 = 0; i0 < len0; i0++) { + const _errs29 = errors; + if (typeof data7[i0] !== 'string') { + validate43.errors = [ + { + instancePath: instancePath + '/tags/' + i0, + schemaPath: '#/properties/tags/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid7 = _errs29 === errors; + if (!valid7) { + break; + } + } + } else { + validate43.errors = [ + { + instancePath: instancePath + '/tags', + schemaPath: '#/properties/tags/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid0 = _errs27 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.uris !== undefined) { + let data9 = data.uris; + const _errs31 = errors; + const _errs32 = errors; + if (errors === _errs32) { + if ( + data9 && + typeof data9 == 'object' && + !Array.isArray(data9) + ) { + for (const key5 in data9) { + const _errs35 = errors; + if (typeof data9[key5] !== 'string') { + validate43.errors = [ + { + instancePath: + instancePath + + '/uris/' + + key5.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/URIs/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid9 = _errs35 === errors; + if (!valid9) { + break; + } + } + } else { + validate43.errors = [ + { + instancePath: instancePath + '/uris', + schemaPath: '#/definitions/URIs/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs31 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } + } else { + validate43.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate43.errors = vErrors; + return errors === 0; +} +const schema46 = { + additionalProperties: false, + description: + 'Tags allow registries to classify and group identities by a variety of characteristics. Tags are standardized within a registry and may represent either labels applied by that registry or designations by external authorities (certification, membership, ownership, etc.) that are tracked by that registry.\n\nExamples of possible tags include: `individual`, `organization`, `token`, `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, `decentralized-exchange`, `liquidity-provider`, `sidechain`, `sidechain-bridge`, `acme-audited`, `acme-endorsed`, etc.\n\nTags may be used by clients in search, discovery, and filtering of identities, and they can also convey information like accreditation from investor protection organizations, public certifications by security or financial auditors, and other designations that signal integrity and value to users.', + properties: { + description: { + description: + 'A string describing this tag for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `An identity maintained by a single individual.`\n- `An identity representing a type of token.`\n- `An on-chain application that has passed security audits by ACME, Inc.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `Tag` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.', + }, + name: { + description: + 'The name of this tag for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g.:\n- `Individual`\n- `Token`\n- `Audited by ACME, Inc.`', + type: 'string', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this tag. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all tags:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name'], + type: 'object', +}; +function validate45( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.name === undefined && (missing0 = 'name')) { + validate45.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'description' || + key0 === 'extensions' || + key0 === 'name' || + key0 === 'uris' + ) + ) { + validate45.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate45.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extensions !== undefined) { + let data1 = data.extensions; + const _errs4 = errors; + const _errs5 = errors; + if (errors === _errs5) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + let data2 = data1[key1]; + const _errs8 = errors; + const _errs9 = errors; + let valid3 = false; + const _errs10 = errors; + if (typeof data2 !== 'string') { + const err0 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs10 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs12 = errors; + if (errors === _errs12) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key2 in data2) { + const _errs15 = errors; + if (typeof data2[key2] !== 'string') { + const err1 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } + var valid4 = _errs15 === errors; + if (!valid4) { + break; + } + } + } else { + const err2 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + } + var _valid0 = _errs12 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs17 = errors; + if (errors === _errs17) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key3 in data2) { + let data4 = data2[key3]; + const _errs20 = errors; + if (errors === _errs20) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key4 in data4) { + const _errs23 = errors; + if (typeof data4[key4] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid6 = _errs23 === errors; + if (!valid6) { + break; + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid5 = _errs20 === errors; + if (!valid5) { + break; + } + } + } else { + const err5 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + } + var _valid0 = _errs17 === errors; + valid3 = valid3 || _valid0; + } + } + if (!valid3) { + const err6 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + validate45.errors = vErrors; + return false; + } else { + errors = _errs9; + if (vErrors !== null) { + if (_errs9) { + vErrors.length = _errs9; + } else { + vErrors = null; + } + } + } + var valid2 = _errs8 === errors; + if (!valid2) { + break; + } + } + } else { + validate45.errors = [ + { + instancePath: instancePath + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs25 = errors; + if (typeof data.name !== 'string') { + validate45.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs25 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.uris !== undefined) { + let data7 = data.uris; + const _errs27 = errors; + const _errs28 = errors; + if (errors === _errs28) { + if ( + data7 && + typeof data7 == 'object' && + !Array.isArray(data7) + ) { + for (const key5 in data7) { + const _errs31 = errors; + if (typeof data7[key5] !== 'string') { + validate45.errors = [ + { + instancePath: + instancePath + + '/uris/' + + key5.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/URIs/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid8 = _errs31 === errors; + if (!valid8) { + break; + } + } + } else { + validate45.errors = [ + { + instancePath: instancePath + '/uris', + schemaPath: '#/definitions/URIs/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs27 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } else { + validate45.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate45.errors = vErrors; + return errors === 0; +} +function validate21( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if ( + (data.version === undefined && (missing0 = 'version')) || + (data.latestRevision === undefined && (missing0 = 'latestRevision')) || + (data.registryIdentity === undefined && (missing0 = 'registryIdentity')) + ) { + validate21.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if (!func4.call(schema23.properties, key0)) { + validate21.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.$schema !== undefined) { + const _errs2 = errors; + if (typeof data.$schema !== 'string') { + validate21.errors = [ + { + instancePath: instancePath + '/$schema', + schemaPath: '#/properties/%24schema/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.chains !== undefined) { + let data1 = data.chains; + const _errs4 = errors; + if (errors === _errs4) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + const _errs7 = errors; + if ( + !validate22(data1[key1], { + instancePath: + instancePath + + '/chains/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data1, + parentDataProperty: key1, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate22.errors + : vErrors.concat(validate22.errors); + errors = vErrors.length; + } + var valid1 = _errs7 === errors; + if (!valid1) { + break; + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/chains', + schemaPath: '#/properties/chains/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.defaultChain !== undefined) { + const _errs8 = errors; + if (typeof data.defaultChain !== 'string') { + validate21.errors = [ + { + instancePath: instancePath + '/defaultChain', + schemaPath: '#/properties/defaultChain/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs8 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extensions !== undefined) { + let data4 = data.extensions; + const _errs10 = errors; + const _errs11 = errors; + if (errors === _errs11) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key2 in data4) { + let data5 = data4[key2]; + const _errs14 = errors; + const _errs15 = errors; + let valid4 = false; + const _errs16 = errors; + if (typeof data5 !== 'string') { + const err0 = { + instancePath: + instancePath + + '/extensions/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs16 === errors; + valid4 = valid4 || _valid0; + if (!valid4) { + const _errs18 = errors; + if (errors === _errs18) { + if ( + data5 && + typeof data5 == 'object' && + !Array.isArray(data5) + ) { + for (const key3 in data5) { + const _errs21 = errors; + if (typeof data5[key3] !== 'string') { + const err1 = { + instancePath: + instancePath + + '/extensions/' + + key2 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } + var valid5 = _errs21 === errors; + if (!valid5) { + break; + } + } + } else { + const err2 = { + instancePath: + instancePath + + '/extensions/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + } + var _valid0 = _errs18 === errors; + valid4 = valid4 || _valid0; + if (!valid4) { + const _errs23 = errors; + if (errors === _errs23) { + if ( + data5 && + typeof data5 == 'object' && + !Array.isArray(data5) + ) { + for (const key4 in data5) { + let data7 = data5[key4]; + const _errs26 = errors; + if (errors === _errs26) { + if ( + data7 && + typeof data7 == 'object' && + !Array.isArray(data7) + ) { + for (const key5 in data7) { + const _errs29 = errors; + if (typeof data7[key5] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/extensions/' + + key2 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key5 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid7 = _errs29 === errors; + if (!valid7) { + break; + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/extensions/' + + key2 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid6 = _errs26 === errors; + if (!valid6) { + break; + } + } + } else { + const err5 = { + instancePath: + instancePath + + '/extensions/' + + key2 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + } + var _valid0 = _errs23 === errors; + valid4 = valid4 || _valid0; + } + } + if (!valid4) { + const err6 = { + instancePath: + instancePath + + '/extensions/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + validate21.errors = vErrors; + return false; + } else { + errors = _errs15; + if (vErrors !== null) { + if (_errs15) { + vErrors.length = _errs15; + } else { + vErrors = null; + } + } + } + var valid3 = _errs14 === errors; + if (!valid3) { + break; + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs10 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.identities !== undefined) { + let data9 = data.identities; + const _errs31 = errors; + if (errors === _errs31) { + if ( + data9 && + typeof data9 == 'object' && + !Array.isArray(data9) + ) { + for (const key6 in data9) { + const _errs34 = errors; + if ( + !validate26(data9[key6], { + instancePath: + instancePath + + '/identities/' + + key6.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data9, + parentDataProperty: key6, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate26.errors + : vErrors.concat(validate26.errors); + errors = vErrors.length; + } + var valid8 = _errs34 === errors; + if (!valid8) { + break; + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/identities', + schemaPath: '#/properties/identities/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs31 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.latestRevision !== undefined) { + const _errs35 = errors; + if (typeof data.latestRevision !== 'string') { + validate21.errors = [ + { + instancePath: instancePath + '/latestRevision', + schemaPath: '#/properties/latestRevision/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs35 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.license !== undefined) { + const _errs37 = errors; + if (typeof data.license !== 'string') { + validate21.errors = [ + { + instancePath: instancePath + '/license', + schemaPath: '#/properties/license/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs37 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.registryIdentity !== undefined) { + let data13 = data.registryIdentity; + const _errs39 = errors; + const _errs40 = errors; + let valid9 = false; + const _errs41 = errors; + if ( + !validate43(data13, { + instancePath: instancePath + '/registryIdentity', + parentData: data, + parentDataProperty: 'registryIdentity', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate43.errors + : vErrors.concat(validate43.errors); + errors = vErrors.length; + } + var _valid1 = _errs41 === errors; + valid9 = valid9 || _valid1; + if (!valid9) { + const _errs42 = errors; + if (typeof data13 !== 'string') { + const err7 = { + instancePath: + instancePath + '/registryIdentity', + schemaPath: + '#/properties/registryIdentity/anyOf/1/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err7]; + } else { + vErrors.push(err7); + } + errors++; + } + var _valid1 = _errs42 === errors; + valid9 = valid9 || _valid1; + } + if (!valid9) { + const err8 = { + instancePath: instancePath + '/registryIdentity', + schemaPath: '#/properties/registryIdentity/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err8]; + } else { + vErrors.push(err8); + } + errors++; + validate21.errors = vErrors; + return false; + } else { + errors = _errs40; + if (vErrors !== null) { + if (_errs40) { + vErrors.length = _errs40; + } else { + vErrors = null; + } + } + } + var valid0 = _errs39 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.tags !== undefined) { + let data14 = data.tags; + const _errs44 = errors; + if (errors === _errs44) { + if ( + data14 && + typeof data14 == 'object' && + !Array.isArray(data14) + ) { + for (const key7 in data14) { + const _errs47 = errors; + if ( + !validate45(data14[key7], { + instancePath: + instancePath + + '/tags/' + + key7 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + parentData: data14, + parentDataProperty: key7, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate45.errors + : vErrors.concat(validate45.errors); + errors = vErrors.length; + } + var valid10 = _errs47 === errors; + if (!valid10) { + break; + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/tags', + schemaPath: '#/properties/tags/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs44 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.version !== undefined) { + let data16 = data.version; + const _errs48 = errors; + if (errors === _errs48) { + if ( + data16 && + typeof data16 == 'object' && + !Array.isArray(data16) + ) { + let missing1; + if ( + (data16.major === undefined && + (missing1 = 'major')) || + (data16.minor === undefined && + (missing1 = 'minor')) || + (data16.patch === undefined && + (missing1 = 'patch')) + ) { + validate21.errors = [ + { + instancePath: instancePath + '/version', + schemaPath: + '#/properties/version/required', + keyword: 'required', + params: { missingProperty: missing1 }, + message: + "must have required property '" + + missing1 + + "'", + }, + ]; + return false; + } else { + const _errs50 = errors; + for (const key8 in data16) { + if ( + !( + key8 === 'major' || + key8 === 'minor' || + key8 === 'patch' + ) + ) { + validate21.errors = [ + { + instancePath: + instancePath + '/version', + schemaPath: + '#/properties/version/additionalProperties', + keyword: 'additionalProperties', + params: { + additionalProperty: key8, + }, + message: + 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs50 === errors) { + if (data16.major !== undefined) { + let data17 = data16.major; + const _errs51 = errors; + if ( + !( + typeof data17 == 'number' && + isFinite(data17) + ) + ) { + validate21.errors = [ + { + instancePath: + instancePath + '/version/major', + schemaPath: + '#/properties/version/properties/major/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid11 = _errs51 === errors; + } else { + var valid11 = true; + } + if (valid11) { + if (data16.minor !== undefined) { + let data18 = data16.minor; + const _errs53 = errors; + if ( + !( + typeof data18 == 'number' && + isFinite(data18) + ) + ) { + validate21.errors = [ + { + instancePath: + instancePath + + '/version/minor', + schemaPath: + '#/properties/version/properties/minor/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid11 = _errs53 === errors; + } else { + var valid11 = true; + } + if (valid11) { + if (data16.patch !== undefined) { + let data19 = data16.patch; + const _errs55 = errors; + if ( + !( + typeof data19 == 'number' && + isFinite(data19) + ) + ) { + validate21.errors = [ + { + instancePath: + instancePath + + '/version/patch', + schemaPath: + '#/properties/version/properties/patch/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid11 = _errs55 === errors; + } else { + var valid11 = true; + } + } + } + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/version', + schemaPath: '#/properties/version/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs48 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } + } + } + } + } + } + } else { + validate21.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate21.errors = vErrors; + return errors === 0; +} +function validate20( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if ( + !validate21(data, { + instancePath, + parentData, + parentDataProperty, + rootData, + }) + ) { + vErrors = + vErrors === null ? validate21.errors : vErrors.concat(validate21.errors); + errors = vErrors.length; + } + validate20.errors = vErrors; + return errors === 0; +} diff --git a/src/lib/schema/ajv/validate-wallet-template.d.ts b/src/lib/schema/ajv/validate-wallet-template.d.ts new file mode 100644 index 00000000..75542399 --- /dev/null +++ b/src/lib/schema/ajv/validate-wallet-template.d.ts @@ -0,0 +1,7 @@ +import type { WalletTemplate } from '../../lib.js'; + +import type { AjvValidator } from './ajv-types.js'; + +declare const validator: AjvValidator; +// eslint-disable-next-line import/no-default-export +export default validator; diff --git a/src/lib/schema/ajv/validate-authentication-template.js b/src/lib/schema/ajv/validate-wallet-template.js similarity index 91% rename from src/lib/schema/ajv/validate-authentication-template.js rename to src/lib/schema/ajv/validate-wallet-template.js index ae53a16d..a111ba86 100644 --- a/src/lib/schema/ajv/validate-authentication-template.js +++ b/src/lib/schema/ajv/validate-wallet-template.js @@ -1,29 +1,45 @@ export default validate20; const schema22 = { - $ref: '#/definitions/AuthenticationTemplate', + $ref: '#/definitions/WalletTemplate', $schema: 'http://json-schema.org/draft-07/schema#', definitions: { - AuthenticationTemplate: { + AuthenticationVirtualMachineIdentifier: { + description: + "Allowable identifiers for authentication virtual machine versions. The `BCH` prefix identifies the Bitcoin Cash network, the `XEC` prefix identifies the eCash network, the `BSV` prefix identifies the Bitcoin SV network, and the `BTC` prefix identifies the Bitcoin Core network. VM versions are named according to the date they were deployed on the indicated network.\n\nFor each network prefix, a `_SPEC` VM version is reserved to indicate that the template requires a custom, not-yet-deployed VM version (e.g. one or more CHIPs). By convention, templates marked for `_SPEC` VMs should indicate their requirements in the template description. After deployment of the `_SPEC` VM, when template compatibility is verified, the template's `supported` array should be updated to indicate compatibility with the live VM version.", + enum: [ + 'BCH_2020_05', + 'BCH_2021_05', + 'BCH_2022_05', + 'BCH_2023_05', + 'BCH_SPEC', + 'BSV_2020_02', + 'BSV_SPEC', + 'BTC_2017_08', + 'BTC_SPEC', + 'XEC_2020_05', + 'XEC_SPEC', + ], + type: 'string', + }, + WalletTemplate: { additionalProperties: false, description: - 'An `AuthenticationTemplate` (A.K.A. `CashAssembly Template`) specifies a set of locking scripts, unlocking scripts, and other information required to use a certain authentication scheme. Templates fully describe wallets and protocols in a way that can be shared between software clients.', + 'A `WalletTemplate` specifies a set of locking scripts, unlocking scripts, and other information required to use a certain wallet protocol. Templates fully describe wallet protocols in a way that can be shared between software clients.', properties: { $schema: { description: - 'The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/authentication-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.', + 'The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/wallet-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.', type: 'string', }, description: { description: - 'An optionally multi-line, free-form, human-readable description for this authentication template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.', + 'An optionally multi-line, free-form, human-readable description for this wallet template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.\n\nDescriptions have no length limit, but in user interfaces with limited space, they should be hidden beyond the first newline character or `140` characters until revealed by the user (e.g. by hiding the remaining description until the user activates a "show more" link).', type: 'string', }, entities: { - additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateEntity', - }, + additionalProperties: { $ref: '#/definitions/WalletTemplateEntity' }, description: - 'A map of entities defined in this authentication template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.', + 'A map of entities defined in this wallet template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.', type: 'object', }, name: { @@ -33,23 +49,23 @@ const schema22 = { }, scenarios: { additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateScenario', + $ref: '#/definitions/WalletTemplateScenario', }, description: - 'A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for authentication templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.', + 'A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for wallet templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.', type: 'object', }, scripts: { additionalProperties: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateScript' }, - { $ref: '#/definitions/AuthenticationTemplateScriptLocking' }, - { $ref: '#/definitions/AuthenticationTemplateScriptTested' }, - { $ref: '#/definitions/AuthenticationTemplateScriptUnlocking' }, + { $ref: '#/definitions/WalletTemplateScript' }, + { $ref: '#/definitions/WalletTemplateScriptLocking' }, + { $ref: '#/definitions/WalletTemplateScriptTested' }, + { $ref: '#/definitions/WalletTemplateScriptUnlocking' }, ], }, description: - 'A map of scripts used in this authentication template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.', + 'A map of scripts used in this wallet template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.', type: 'object', }, supported: { @@ -63,40 +79,35 @@ const schema22 = { version: { const: 0, description: - 'A number identifying the format of this AuthenticationTemplate. Currently, this implementation requires `version` be set to `0`.', + 'A number identifying the format of this WalletTemplate. Currently, this implementation requires `version` be set to `0`.', type: 'number', }, }, required: ['entities', 'scripts', 'supported', 'version'], type: 'object', }, - AuthenticationTemplateAddressData: { + WalletTemplateAddressData: { additionalProperties: false, properties: { description: { description: - 'A single-line, human readable description for this address data.', + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, name: { description: - 'A single-line, Title Case, human-readable name for this address data.', - type: 'string', - }, - type: { - const: 'AddressData', - description: - '`AddressData` is the most low-level variable type. It must be collected and stored each time a script is generated (usually, a locking script). `AddressData` can include any type of data, and can be used in any way.\n\nFor more persistent data, use `WalletData`.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, + type: { const: 'AddressData', type: 'string' }, }, required: ['type'], type: 'object', }, - AuthenticationTemplateEntity: { + WalletTemplateEntity: { additionalProperties: false, description: - 'An object describing the configuration for a particular entity within an authentication template.', + 'An object describing the configuration for a particular entity within an wallet template.', properties: { description: { description: @@ -116,7 +127,7 @@ const schema22 = { }, variables: { additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateVariable', + $ref: '#/definitions/WalletTemplateVariable', }, description: "A map of variables that must be provided by this entity for use in the template's scripts. Some variables are required before locking script generation, while some variables can or must be resolved only before unlocking script generation.\n\nObject keys are used as variable identifiers, and by convention, should use `snake_case`.", @@ -125,7 +136,7 @@ const schema22 = { }, type: 'object', }, - AuthenticationTemplateHdKey: { + WalletTemplateHdKey: { additionalProperties: false, properties: { addressOffset: { @@ -135,7 +146,7 @@ const schema22 = { }, description: { description: - 'A single-line, human readable description for this HD key.', + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, hdPublicKeyDerivationPath: { @@ -145,9 +156,14 @@ const schema22 = { }, name: { description: - 'A single-line, Title Case, human-readable name for this HD key.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, + neverSignTwice: { + description: + 'If set to `true`, indicates that this key should never be used to sign two different messages.\n\nThis is useful for contracts that use zero-confirmation escrow systems to guarantee against double-spend attempts. By indicating that the user could be subjected to losses if a key were used in multiple signatures, templates can ensure that wallet implementations apply appropriate safeguards around use of the key.\n\nDefaults to `false`.', + type: 'boolean', + }, privateDerivationPath: { description: "The derivation path used to derive this `HdKey` from the owning entity's HD private key. By default, `m/i`.\n\nThis path uses the notation specified in BIP32 and the `i` character to represent the location of the `addressIndex`:\n\nThe first character must be `m` (private derivation), followed by sets of `/` and a number representing the child index used in the derivation at that depth. Hardened derivation is represented by a trailing `'`, and hardened child indexes are represented with the hardened index offset (`2147483648`) subtracted. The `i` character is replaced with the value of `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is followed by `'`, the hardened index offset is added (`2147483648`) and hardened derivation is used.\n\nFor example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in the following order:\n\n`derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)`\n\nBecause hardened derivation requires knowledge of the private key, `HdKey` variables with `derivationPath`s that include hardened derivation cannot use HD public derivation (the `hdPublicKeys` property in `CompilationData`). Instead, compilation requires the respective HD private key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public key (`CompilationData.hdKeys.derivedPublicKeys`).", @@ -158,46 +174,41 @@ const schema22 = { "The derivation path used to derive this `HdKey`'s public key from the owning entity's HD public key. If not set, the public equivalent of `privateDerivationPath` is used. For the `privateDerivationPath` default of `m/i`, this is `M/i`.\n\nIf `privateDerivationPath` uses hardened derivation for some levels, but later derivation levels use non-hardened derivation, `publicDerivationPath` can be used to specify a public derivation path beginning from `hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a non-hardened segment of `privateDerivationPath` that follows `hdPublicKeyDerivationPath`).\n\nThe first character must be `M` (public derivation), followed by sets of `/` and a number representing the child index used in the non-hardened derivation at that depth.\n\nFor example, if `privateDerivationPath` is `m/0'/i`, it is not possible to derive the equivalent public key with only the HD public key `M`. (The path \"`M/0'/i`\" is impossible.) However, given the HD public key for `m/0'`, it is possible to derive the public key of `m/0'/i` for any `i`. In this case, `hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath` would be the remaining `M/i`.", type: 'string', }, - type: { - const: 'HdKey', - description: - 'The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key generation and mapping in a standard way. For greater control, use `Key`.', - type: 'string', - }, + type: { const: 'HdKey', type: 'string' }, }, required: ['type'], type: 'object', }, - AuthenticationTemplateKey: { + WalletTemplateKey: { additionalProperties: false, properties: { description: { description: - 'A single-line, human readable description for this key.', + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, name: { description: - 'A single-line, Title Case, human-readable name for this key.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, - type: { - const: 'Key', + neverSignTwice: { description: - 'The `Key` type provides fine-grained control over key generation and mapping. Most templates should instead use `HdKey`.\n\nAny HD (Hierarchical-Deterministic) derivation must be completed outside of the templating system and provided at the time of use.', - type: 'string', + 'If set to `true`, indicates that this key should never be used to sign two different messages.\n\nThis is useful for contracts that use zero-confirmation escrow systems to guarantee against double-spend attempts. By indicating that the user could be subjected to losses if a key were used in multiple signatures, templates can ensure that wallet implementations apply appropriate safeguards around use of the key.\n\nDefaults to `false`.', + type: 'boolean', }, + type: { const: 'Key', type: 'string' }, }, required: ['type'], type: 'object', }, - AuthenticationTemplateScenario: { + WalletTemplateScenario: { additionalProperties: false, description: - 'An object describing the configuration for a particular scenario within an authentication template.', + 'An object describing the configuration for a particular scenario within an wallet template.', properties: { data: { - $ref: '#/definitions/AuthenticationTemplateScenarioData', + $ref: '#/definitions/WalletTemplateScenarioData', description: "An object defining the data to use while compiling this scenario. The properties specified here are used to extend the existing scenario data based on this scenario's `extends` property.\n\nEach property is extended individually – to unset a previously-set property, the property must be individually overridden in this object.", }, @@ -219,9 +230,7 @@ const schema22 = { sourceOutputs: { description: 'The list of source outputs (a.k.a. UTXOs) to use when generating the compilation context for this scenario.\n\nThe `sourceOutputs` property must have the same length as `transaction.inputs`, and each source output must be ordered to match the index of the input that spends it.\n\nTo be valid the `sourceOutputs` property must have exactly one source output with `lockingBytecode` set to `["slot"]` – the output at the same index as the `["slot"]` input in `transaction.inputs`.\n\nIf undefined, defaults to `[{ "lockingBytecode": ["slot"] }]`.', - items: { - $ref: '#/definitions/AuthenticationTemplateScenarioSourceOutput', - }, + items: { $ref: '#/definitions/WalletTemplateScenarioSourceOutput' }, type: 'array', }, transaction: { @@ -232,9 +241,7 @@ const schema22 = { inputs: { description: 'The list of inputs to use when generating the transaction for this scenario.\n\nTo be valid the `inputs` property must have exactly one input with `unlockingBytecode` set to `["slot"]`. This is the input in which the unlocking script under test will be placed.\n\nIf undefined, inherits the default scenario `inputs` value: `[{ "unlockingBytecode": ["slot"] }]`.', - items: { - $ref: '#/definitions/AuthenticationTemplateScenarioInput', - }, + items: { $ref: '#/definitions/WalletTemplateScenarioInput' }, type: 'array', }, locktime: { @@ -246,7 +253,7 @@ const schema22 = { description: 'The list of outputs to use when generating the transaction for this scenario.\n\nIf undefined, defaults to `[{ "lockingBytecode": {} }]`.', items: { - $ref: '#/definitions/AuthenticationTemplateScenarioTransactionOutput', + $ref: '#/definitions/WalletTemplateScenarioTransactionOutput', }, type: 'array', }, @@ -261,14 +268,14 @@ const schema22 = { }, type: 'object', }, - AuthenticationTemplateScenarioBytecode: { + WalletTemplateScenarioBytecode: { anyOf: [ { type: 'string' }, { additionalProperties: false, properties: { overrides: { - $ref: '#/definitions/AuthenticationTemplateScenarioData', + $ref: '#/definitions/WalletTemplateScenarioData', description: 'Scenario data that extends the scenario\'s top-level `data` during script compilation.\n\nEach property is extended individually – to modify a property set by the top-level scenario `data`, the new value must be listed here.\n\nDefaults to `{}` for `sourceOutputs` and `transaction.inputs`; defaults to `{ "hdKeys": { "addressIndex": 1 } }` for `transaction.outputs`.', }, @@ -290,9 +297,9 @@ const schema22 = { }, ], description: - 'A type that describes the configuration for a particular locking or unlocking bytecode within an authentication template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`.', + 'A type that describes the configuration for a particular locking or unlocking bytecode within a wallet template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`.', }, - AuthenticationTemplateScenarioData: { + WalletTemplateScenarioData: { additionalProperties: false, description: 'An object defining the data to use while compiling a scenario.', @@ -355,10 +362,10 @@ const schema22 = { }, type: 'object', }, - AuthenticationTemplateScenarioInput: { + WalletTemplateScenarioInput: { additionalProperties: false, description: - 'An example input used to define a scenario for an authentication template.', + 'An example input used to define a scenario for a wallet template.', properties: { outpointIndex: { description: @@ -377,7 +384,7 @@ const schema22 = { }, unlockingBytecode: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateScenarioBytecode' }, + { $ref: '#/definitions/WalletTemplateScenarioBytecode' }, { items: { const: 'slot', type: 'string' }, maxItems: 1, @@ -386,18 +393,18 @@ const schema22 = { }, ], description: - 'The `unlockingBytecode` value of this input for this scenario. This must be either `["slot"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `AuthenticationTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `["slot"]` for exactly one input in the scenario.\n\nDefaults to `["slot"]`.', + 'The `unlockingBytecode` value of this input for this scenario. This must be either `["slot"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `WalletTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `["slot"]` for exactly one input in the scenario.\n\nDefaults to `["slot"]`.', }, }, type: 'object', }, - 'AuthenticationTemplateScenarioOutput': { + 'WalletTemplateScenarioOutput': { additionalProperties: false, description: - 'An example output used to define a scenario for an authentication template.', + 'An example output used to define a scenario for a wallet template.', properties: { lockingBytecode: { - $ref: '#/definitions/AuthenticationTemplateScenarioBytecode', + $ref: '#/definitions/WalletTemplateScenarioBytecode', description: 'The locking bytecode used to encumber this output.\n\n`lockingBytecode` values may be provided as a hexadecimal-encoded string or as an object describing the required compilation. If undefined, defaults to `{}`, which uses the default values for `script` and `overrides`, respectively.\n\nOnly source outputs may specify a `lockingBytecode` of `["slot"]`; this identifies the source output in which the locking script under test will be placed. (To be valid, every scenario\'s `sourceOutputs` property must have exactly one source output slot and one input slot at the same index.)', }, @@ -446,14 +453,14 @@ const schema22 = { }, type: 'object', }, - 'AuthenticationTemplateScenarioOutput': { + 'WalletTemplateScenarioOutput': { additionalProperties: false, description: - 'An example output used to define a scenario for an authentication template.', + 'An example output used to define a scenario for a wallet template.', properties: { lockingBytecode: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateScenarioBytecode' }, + { $ref: '#/definitions/WalletTemplateScenarioBytecode' }, { items: { const: 'slot', type: 'string' }, maxItems: 1, @@ -509,20 +516,19 @@ const schema22 = { }, type: 'object', }, - AuthenticationTemplateScenarioSourceOutput: { - $ref: '#/definitions/AuthenticationTemplateScenarioOutput', - description: - 'A source output used by an authentication template scenario.', + WalletTemplateScenarioSourceOutput: { + $ref: '#/definitions/WalletTemplateScenarioOutput', + description: 'A source output used by a wallet template scenario.', }, - AuthenticationTemplateScenarioTransactionOutput: { - $ref: '#/definitions/AuthenticationTemplateScenarioOutput', + WalletTemplateScenarioTransactionOutput: { + $ref: '#/definitions/WalletTemplateScenarioOutput', description: - 'A transaction output used to define an authentication template scenario transaction.', + 'A transaction output used to define a wallet template scenario transaction.', }, - AuthenticationTemplateScript: { + WalletTemplateScript: { additionalProperties: false, description: - 'An object describing the configuration for a particular script within an authentication template.', + 'An object describing the configuration for a particular script within an wallet template.', properties: { name: { description: @@ -537,7 +543,7 @@ const schema22 = { required: ['script'], type: 'object', }, - AuthenticationTemplateScriptLocking: { + WalletTemplateScriptLocking: { additionalProperties: false, properties: { lockingType: { @@ -559,7 +565,7 @@ const schema22 = { required: ['lockingType', 'script'], type: 'object', }, - AuthenticationTemplateScriptTest: { + WalletTemplateScriptTest: { additionalProperties: false, properties: { check: { @@ -599,7 +605,7 @@ const schema22 = { required: ['check'], type: 'object', }, - AuthenticationTemplateScriptTested: { + WalletTemplateScriptTested: { additionalProperties: false, properties: { name: { @@ -618,7 +624,7 @@ const schema22 = { }, tests: { additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateScriptTest', + $ref: '#/definitions/WalletTemplateScriptTest', }, description: 'One or more tests that can be used during development and during template validation to confirm the correctness of this tested script.', @@ -628,7 +634,7 @@ const schema22 = { required: ['script', 'tests'], type: 'object', }, - AuthenticationTemplateScriptUnlocking: { + WalletTemplateScriptUnlocking: { additionalProperties: false, properties: { ageLock: { @@ -638,7 +644,7 @@ const schema22 = { }, estimate: { description: - 'The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it\'s possible for wallet software to compute an "estimated transaction", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction\'s change output(s). Because estimate scenarios provide "estimated" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `AuthenticationTemplateScenario.extends` for details.', + 'The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it\'s possible for wallet software to compute an "estimated transaction", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction\'s change output(s). Because estimate scenarios provide "estimated" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `WalletTemplateScenario.extends` for details.', type: 'string', }, fails: { @@ -683,78 +689,53 @@ const schema22 = { required: ['script', 'unlocks'], type: 'object', }, - AuthenticationTemplateVariable: { + WalletTemplateVariable: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateAddressData' }, - { $ref: '#/definitions/AuthenticationTemplateHdKey' }, - { $ref: '#/definitions/AuthenticationTemplateKey' }, - { $ref: '#/definitions/AuthenticationTemplateWalletData' }, + { $ref: '#/definitions/WalletTemplateAddressData' }, + { $ref: '#/definitions/WalletTemplateHdKey' }, + { $ref: '#/definitions/WalletTemplateKey' }, + { $ref: '#/definitions/WalletTemplateWalletData' }, ], }, - AuthenticationTemplateWalletData: { + WalletTemplateWalletData: { additionalProperties: false, properties: { description: { description: - 'A single-line, human readable description for this wallet data.', + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, name: { description: - 'A single-line, Title Case, human-readable name for this wallet data.', - type: 'string', - }, - type: { - const: 'WalletData', - description: - 'The `WalletData` type provides a static piece of data that should be collected once and stored at the time of wallet creation. `WalletData` should be persistent for the life of the wallet, rather than changing from locking script to locking script.\n\nFor address-specific data, use `AddressData`.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, + type: { const: 'WalletData', type: 'string' }, }, required: ['type'], type: 'object', }, - AuthenticationVirtualMachineIdentifier: { - description: - "Allowable identifiers for authentication virtual machine versions. The `BCH` prefix identifies the Bitcoin Cash network, the `XEC` prefix identifies the eCash network, the `BSV` prefix identifies the Bitcoin SV network, and the `BTC` prefix identifies the Bitcoin Core network. VM versions are named according to the date they were deployed on the indicated network.\n\nFor each network prefix, a `_SPEC` VM version is reserved to indicate that the template requires a custom, not-yet-deployed VM version (e.g. one or more CHIPs). By convention, templates marked for `_SPEC` VMs should indicate their requirements in the template description. After deployment of the `_SPEC` VM, when template compatibility is verified, the template's `supported` array should be updated to indicate compatibility with the live VM version.", - enum: [ - 'BCH_2020_05', - 'BCH_2021_05', - 'BCH_2022_05', - 'BCH_2023_05', - 'BCH_SPEC', - 'BSV_2020_02', - 'BSV_SPEC', - 'BTC_2017_08', - 'BTC_SPEC', - 'XEC_2020_05', - 'XEC_SPEC', - ], - type: 'string', - }, }, }; const schema23 = { additionalProperties: false, description: - 'An `AuthenticationTemplate` (A.K.A. `CashAssembly Template`) specifies a set of locking scripts, unlocking scripts, and other information required to use a certain authentication scheme. Templates fully describe wallets and protocols in a way that can be shared between software clients.', + 'A `WalletTemplate` specifies a set of locking scripts, unlocking scripts, and other information required to use a certain wallet protocol. Templates fully describe wallet protocols in a way that can be shared between software clients.', properties: { $schema: { description: - 'The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/authentication-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.', + 'The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/wallet-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.', type: 'string', }, description: { description: - 'An optionally multi-line, free-form, human-readable description for this authentication template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.', + 'An optionally multi-line, free-form, human-readable description for this wallet template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.\n\nDescriptions have no length limit, but in user interfaces with limited space, they should be hidden beyond the first newline character or `140` characters until revealed by the user (e.g. by hiding the remaining description until the user activates a "show more" link).', type: 'string', }, entities: { - additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateEntity', - }, + additionalProperties: { $ref: '#/definitions/WalletTemplateEntity' }, description: - 'A map of entities defined in this authentication template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.', + 'A map of entities defined in this wallet template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.', type: 'object', }, name: { @@ -763,24 +744,22 @@ const schema23 = { type: 'string', }, scenarios: { - additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateScenario', - }, + additionalProperties: { $ref: '#/definitions/WalletTemplateScenario' }, description: - 'A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for authentication templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.', + 'A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for wallet templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.', type: 'object', }, scripts: { additionalProperties: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateScript' }, - { $ref: '#/definitions/AuthenticationTemplateScriptLocking' }, - { $ref: '#/definitions/AuthenticationTemplateScriptTested' }, - { $ref: '#/definitions/AuthenticationTemplateScriptUnlocking' }, + { $ref: '#/definitions/WalletTemplateScript' }, + { $ref: '#/definitions/WalletTemplateScriptLocking' }, + { $ref: '#/definitions/WalletTemplateScriptTested' }, + { $ref: '#/definitions/WalletTemplateScriptUnlocking' }, ], }, description: - 'A map of scripts used in this authentication template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.', + 'A map of scripts used in this wallet template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.', type: 'object', }, supported: { @@ -792,7 +771,7 @@ const schema23 = { version: { const: 0, description: - 'A number identifying the format of this AuthenticationTemplate. Currently, this implementation requires `version` be set to `0`.', + 'A number identifying the format of this WalletTemplate. Currently, this implementation requires `version` be set to `0`.', type: 'number', }, }, @@ -802,7 +781,7 @@ const schema23 = { const schema37 = { additionalProperties: false, description: - 'An object describing the configuration for a particular script within an authentication template.', + 'An object describing the configuration for a particular script within an wallet template.', properties: { name: { description: @@ -849,7 +828,7 @@ const schema41 = { }, estimate: { description: - 'The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it\'s possible for wallet software to compute an "estimated transaction", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction\'s change output(s). Because estimate scenarios provide "estimated" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `AuthenticationTemplateScenario.extends` for details.', + 'The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it\'s possible for wallet software to compute an "estimated transaction", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction\'s change output(s). Because estimate scenarios provide "estimated" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `WalletTemplateScenario.extends` for details.', type: 'string', }, fails: { @@ -915,7 +894,7 @@ const schema42 = { const schema24 = { additionalProperties: false, description: - 'An object describing the configuration for a particular entity within an authentication template.', + 'An object describing the configuration for a particular entity within an wallet template.', properties: { description: { description: @@ -934,9 +913,7 @@ const schema24 = { type: 'array', }, variables: { - additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateVariable', - }, + additionalProperties: { $ref: '#/definitions/WalletTemplateVariable' }, description: "A map of variables that must be provided by this entity for use in the template's scripts. Some variables are required before locking script generation, while some variables can or must be resolved only before unlocking script generation.\n\nObject keys are used as variable identifiers, and by convention, should use `snake_case`.", type: 'object', @@ -946,10 +923,10 @@ const schema24 = { }; const schema25 = { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateAddressData' }, - { $ref: '#/definitions/AuthenticationTemplateHdKey' }, - { $ref: '#/definitions/AuthenticationTemplateKey' }, - { $ref: '#/definitions/AuthenticationTemplateWalletData' }, + { $ref: '#/definitions/WalletTemplateAddressData' }, + { $ref: '#/definitions/WalletTemplateHdKey' }, + { $ref: '#/definitions/WalletTemplateKey' }, + { $ref: '#/definitions/WalletTemplateWalletData' }, ], }; const schema26 = { @@ -957,20 +934,15 @@ const schema26 = { properties: { description: { description: - 'A single-line, human readable description for this address data.', + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, name: { description: - 'A single-line, Title Case, human-readable name for this address data.', - type: 'string', - }, - type: { - const: 'AddressData', - description: - '`AddressData` is the most low-level variable type. It must be collected and stored each time a script is generated (usually, a locking script). `AddressData` can include any type of data, and can be used in any way.\n\nFor more persistent data, use `WalletData`.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, + type: { const: 'AddressData', type: 'string' }, }, required: ['type'], type: 'object', @@ -984,7 +956,8 @@ const schema27 = { type: 'number', }, description: { - description: 'A single-line, human readable description for this HD key.', + description: + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, hdPublicKeyDerivationPath: { @@ -994,9 +967,14 @@ const schema27 = { }, name: { description: - 'A single-line, Title Case, human-readable name for this HD key.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, + neverSignTwice: { + description: + 'If set to `true`, indicates that this key should never be used to sign two different messages.\n\nThis is useful for contracts that use zero-confirmation escrow systems to guarantee against double-spend attempts. By indicating that the user could be subjected to losses if a key were used in multiple signatures, templates can ensure that wallet implementations apply appropriate safeguards around use of the key.\n\nDefaults to `false`.', + type: 'boolean', + }, privateDerivationPath: { description: "The derivation path used to derive this `HdKey` from the owning entity's HD private key. By default, `m/i`.\n\nThis path uses the notation specified in BIP32 and the `i` character to represent the location of the `addressIndex`:\n\nThe first character must be `m` (private derivation), followed by sets of `/` and a number representing the child index used in the derivation at that depth. Hardened derivation is represented by a trailing `'`, and hardened child indexes are represented with the hardened index offset (`2147483648`) subtracted. The `i` character is replaced with the value of `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is followed by `'`, the hardened index offset is added (`2147483648`) and hardened derivation is used.\n\nFor example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in the following order:\n\n`derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)`\n\nBecause hardened derivation requires knowledge of the private key, `HdKey` variables with `derivationPath`s that include hardened derivation cannot use HD public derivation (the `hdPublicKeys` property in `CompilationData`). Instead, compilation requires the respective HD private key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public key (`CompilationData.hdKeys.derivedPublicKeys`).", @@ -1007,12 +985,7 @@ const schema27 = { "The derivation path used to derive this `HdKey`'s public key from the owning entity's HD public key. If not set, the public equivalent of `privateDerivationPath` is used. For the `privateDerivationPath` default of `m/i`, this is `M/i`.\n\nIf `privateDerivationPath` uses hardened derivation for some levels, but later derivation levels use non-hardened derivation, `publicDerivationPath` can be used to specify a public derivation path beginning from `hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a non-hardened segment of `privateDerivationPath` that follows `hdPublicKeyDerivationPath`).\n\nThe first character must be `M` (public derivation), followed by sets of `/` and a number representing the child index used in the non-hardened derivation at that depth.\n\nFor example, if `privateDerivationPath` is `m/0'/i`, it is not possible to derive the equivalent public key with only the HD public key `M`. (The path \"`M/0'/i`\" is impossible.) However, given the HD public key for `m/0'`, it is possible to derive the public key of `m/0'/i` for any `i`. In this case, `hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath` would be the remaining `M/i`.", type: 'string', }, - type: { - const: 'HdKey', - description: - 'The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key generation and mapping in a standard way. For greater control, use `Key`.', - type: 'string', - }, + type: { const: 'HdKey', type: 'string' }, }, required: ['type'], type: 'object', @@ -1021,20 +994,21 @@ const schema28 = { additionalProperties: false, properties: { description: { - description: 'A single-line, human readable description for this key.', + description: + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, name: { description: - 'A single-line, Title Case, human-readable name for this key.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, - type: { - const: 'Key', + neverSignTwice: { description: - 'The `Key` type provides fine-grained control over key generation and mapping. Most templates should instead use `HdKey`.\n\nAny HD (Hierarchical-Deterministic) derivation must be completed outside of the templating system and provided at the time of use.', - type: 'string', + 'If set to `true`, indicates that this key should never be used to sign two different messages.\n\nThis is useful for contracts that use zero-confirmation escrow systems to guarantee against double-spend attempts. By indicating that the user could be subjected to losses if a key were used in multiple signatures, templates can ensure that wallet implementations apply appropriate safeguards around use of the key.\n\nDefaults to `false`.', + type: 'boolean', }, + type: { const: 'Key', type: 'string' }, }, required: ['type'], type: 'object', @@ -1044,27 +1018,22 @@ const schema29 = { properties: { description: { description: - 'A single-line, human readable description for this wallet data.', + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, name: { description: - 'A single-line, Title Case, human-readable name for this wallet data.', - type: 'string', - }, - type: { - const: 'WalletData', - description: - 'The `WalletData` type provides a static piece of data that should be collected once and stored at the time of wallet creation. `WalletData` should be persistent for the life of the wallet, rather than changing from locking script to locking script.\n\nFor address-specific data, use `AddressData`.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, + type: { const: 'WalletData', type: 'string' }, }, required: ['type'], type: 'object', }; function validate23( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -1078,8 +1047,7 @@ function validate23( if (data.type === undefined && (missing0 = 'type')) { const err0 = { instancePath, - schemaPath: - '#/definitions/AuthenticationTemplateAddressData/required', + schemaPath: '#/definitions/WalletTemplateAddressData/required', keyword: 'required', params: { missingProperty: missing0 }, message: "must have required property '" + missing0 + "'", @@ -1097,7 +1065,7 @@ function validate23( const err1 = { instancePath, schemaPath: - '#/definitions/AuthenticationTemplateAddressData/additionalProperties', + '#/definitions/WalletTemplateAddressData/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key0 }, message: 'must NOT have additional properties', @@ -1118,7 +1086,7 @@ function validate23( const err2 = { instancePath: instancePath + '/description', schemaPath: - '#/definitions/AuthenticationTemplateAddressData/properties/description/type', + '#/definitions/WalletTemplateAddressData/properties/description/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1141,7 +1109,7 @@ function validate23( const err3 = { instancePath: instancePath + '/name', schemaPath: - '#/definitions/AuthenticationTemplateAddressData/properties/name/type', + '#/definitions/WalletTemplateAddressData/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1165,7 +1133,7 @@ function validate23( const err4 = { instancePath: instancePath + '/type', schemaPath: - '#/definitions/AuthenticationTemplateAddressData/properties/type/type', + '#/definitions/WalletTemplateAddressData/properties/type/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1181,7 +1149,7 @@ function validate23( const err5 = { instancePath: instancePath + '/type', schemaPath: - '#/definitions/AuthenticationTemplateAddressData/properties/type/const', + '#/definitions/WalletTemplateAddressData/properties/type/const', keyword: 'const', params: { allowedValue: 'AddressData' }, message: 'must be equal to constant', @@ -1204,7 +1172,7 @@ function validate23( } else { const err6 = { instancePath, - schemaPath: '#/definitions/AuthenticationTemplateAddressData/type', + schemaPath: '#/definitions/WalletTemplateAddressData/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -1228,7 +1196,7 @@ function validate23( if (data.type === undefined && (missing1 = 'type')) { const err7 = { instancePath, - schemaPath: '#/definitions/AuthenticationTemplateHdKey/required', + schemaPath: '#/definitions/WalletTemplateHdKey/required', keyword: 'required', params: { missingProperty: missing1 }, message: "must have required property '" + missing1 + "'", @@ -1248,6 +1216,7 @@ function validate23( key1 === 'description' || key1 === 'hdPublicKeyDerivationPath' || key1 === 'name' || + key1 === 'neverSignTwice' || key1 === 'privateDerivationPath' || key1 === 'publicDerivationPath' || key1 === 'type' @@ -1256,7 +1225,7 @@ function validate23( const err8 = { instancePath, schemaPath: - '#/definitions/AuthenticationTemplateHdKey/additionalProperties', + '#/definitions/WalletTemplateHdKey/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key1 }, message: 'must NOT have additional properties', @@ -1278,7 +1247,7 @@ function validate23( const err9 = { instancePath: instancePath + '/addressOffset', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/addressOffset/type', + '#/definitions/WalletTemplateHdKey/properties/addressOffset/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -1301,7 +1270,7 @@ function validate23( const err10 = { instancePath: instancePath + '/description', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/description/type', + '#/definitions/WalletTemplateHdKey/properties/description/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1324,7 +1293,7 @@ function validate23( const err11 = { instancePath: instancePath + '/hdPublicKeyDerivationPath', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/hdPublicKeyDerivationPath/type', + '#/definitions/WalletTemplateHdKey/properties/hdPublicKeyDerivationPath/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1347,7 +1316,7 @@ function validate23( const err12 = { instancePath: instancePath + '/name', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/name/type', + '#/definitions/WalletTemplateHdKey/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1364,16 +1333,16 @@ function validate23( var valid4 = true; } if (valid4) { - if (data.privateDerivationPath !== undefined) { + if (data.neverSignTwice !== undefined) { const _errs23 = errors; - if (typeof data.privateDerivationPath !== 'string') { + if (typeof data.neverSignTwice !== 'boolean') { const err13 = { - instancePath: instancePath + '/privateDerivationPath', + instancePath: instancePath + '/neverSignTwice', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/privateDerivationPath/type', + '#/definitions/WalletTemplateHdKey/properties/neverSignTwice/type', keyword: 'type', - params: { type: 'string' }, - message: 'must be string', + params: { type: 'boolean' }, + message: 'must be boolean', }; if (vErrors === null) { vErrors = [err13]; @@ -1387,14 +1356,14 @@ function validate23( var valid4 = true; } if (valid4) { - if (data.publicDerivationPath !== undefined) { + if (data.privateDerivationPath !== undefined) { const _errs25 = errors; - if (typeof data.publicDerivationPath !== 'string') { + if (typeof data.privateDerivationPath !== 'string') { const err14 = { instancePath: - instancePath + '/publicDerivationPath', + instancePath + '/privateDerivationPath', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/publicDerivationPath/type', + '#/definitions/WalletTemplateHdKey/properties/privateDerivationPath/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1411,14 +1380,14 @@ function validate23( var valid4 = true; } if (valid4) { - if (data.type !== undefined) { - let data9 = data.type; + if (data.publicDerivationPath !== undefined) { const _errs27 = errors; - if (typeof data9 !== 'string') { + if (typeof data.publicDerivationPath !== 'string') { const err15 = { - instancePath: instancePath + '/type', + instancePath: + instancePath + '/publicDerivationPath', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/type/type', + '#/definitions/WalletTemplateHdKey/properties/publicDerivationPath/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1430,26 +1399,51 @@ function validate23( } errors++; } - if ('HdKey' !== data9) { - const err16 = { - instancePath: instancePath + '/type', - schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/type/const', - keyword: 'const', - params: { allowedValue: 'HdKey' }, - message: 'must be equal to constant', - }; - if (vErrors === null) { - vErrors = [err16]; - } else { - vErrors.push(err16); - } - errors++; - } var valid4 = _errs27 === errors; } else { var valid4 = true; } + if (valid4) { + if (data.type !== undefined) { + let data10 = data.type; + const _errs29 = errors; + if (typeof data10 !== 'string') { + const err16 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/WalletTemplateHdKey/properties/type/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err16]; + } else { + vErrors.push(err16); + } + errors++; + } + if ('HdKey' !== data10) { + const err17 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/WalletTemplateHdKey/properties/type/const', + keyword: 'const', + params: { allowedValue: 'HdKey' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err17]; + } else { + vErrors.push(err17); + } + errors++; + } + var valid4 = _errs29 === errors; + } else { + var valid4 = true; + } + } } } } @@ -1459,17 +1453,17 @@ function validate23( } } } else { - const err17 = { + const err18 = { instancePath, - schemaPath: '#/definitions/AuthenticationTemplateHdKey/type', + schemaPath: '#/definitions/WalletTemplateHdKey/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', }; if (vErrors === null) { - vErrors = [err17]; + vErrors = [err18]; } else { - vErrors.push(err17); + vErrors.push(err18); } errors++; } @@ -1477,122 +1471,110 @@ function validate23( var _valid0 = _errs11 === errors; valid0 = valid0 || _valid0; if (!valid0) { - const _errs29 = errors; - const _errs30 = errors; - if (errors === _errs30) { + const _errs31 = errors; + const _errs32 = errors; + if (errors === _errs32) { if (data && typeof data == 'object' && !Array.isArray(data)) { let missing2; if (data.type === undefined && (missing2 = 'type')) { - const err18 = { + const err19 = { instancePath, - schemaPath: '#/definitions/AuthenticationTemplateKey/required', + schemaPath: '#/definitions/WalletTemplateKey/required', keyword: 'required', params: { missingProperty: missing2 }, message: "must have required property '" + missing2 + "'", }; if (vErrors === null) { - vErrors = [err18]; + vErrors = [err19]; } else { - vErrors.push(err18); + vErrors.push(err19); } errors++; } else { - const _errs32 = errors; + const _errs34 = errors; for (const key2 in data) { if ( - !(key2 === 'description' || key2 === 'name' || key2 === 'type') + !( + key2 === 'description' || + key2 === 'name' || + key2 === 'neverSignTwice' || + key2 === 'type' + ) ) { - const err19 = { + const err20 = { instancePath, schemaPath: - '#/definitions/AuthenticationTemplateKey/additionalProperties', + '#/definitions/WalletTemplateKey/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key2 }, message: 'must NOT have additional properties', }; if (vErrors === null) { - vErrors = [err19]; + vErrors = [err20]; } else { - vErrors.push(err19); + vErrors.push(err20); } errors++; break; } } - if (_errs32 === errors) { + if (_errs34 === errors) { if (data.description !== undefined) { - const _errs33 = errors; + const _errs35 = errors; if (typeof data.description !== 'string') { - const err20 = { + const err21 = { instancePath: instancePath + '/description', schemaPath: - '#/definitions/AuthenticationTemplateKey/properties/description/type', + '#/definitions/WalletTemplateKey/properties/description/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', }; if (vErrors === null) { - vErrors = [err20]; + vErrors = [err21]; } else { - vErrors.push(err20); + vErrors.push(err21); } errors++; } - var valid6 = _errs33 === errors; + var valid6 = _errs35 === errors; } else { var valid6 = true; } if (valid6) { if (data.name !== undefined) { - const _errs35 = errors; + const _errs37 = errors; if (typeof data.name !== 'string') { - const err21 = { + const err22 = { instancePath: instancePath + '/name', schemaPath: - '#/definitions/AuthenticationTemplateKey/properties/name/type', + '#/definitions/WalletTemplateKey/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', }; if (vErrors === null) { - vErrors = [err21]; + vErrors = [err22]; } else { - vErrors.push(err21); + vErrors.push(err22); } errors++; } - var valid6 = _errs35 === errors; + var valid6 = _errs37 === errors; } else { var valid6 = true; } if (valid6) { - if (data.type !== undefined) { - let data12 = data.type; - const _errs37 = errors; - if (typeof data12 !== 'string') { - const err22 = { - instancePath: instancePath + '/type', - schemaPath: - '#/definitions/AuthenticationTemplateKey/properties/type/type', - keyword: 'type', - params: { type: 'string' }, - message: 'must be string', - }; - if (vErrors === null) { - vErrors = [err22]; - } else { - vErrors.push(err22); - } - errors++; - } - if ('Key' !== data12) { + if (data.neverSignTwice !== undefined) { + const _errs39 = errors; + if (typeof data.neverSignTwice !== 'boolean') { const err23 = { - instancePath: instancePath + '/type', + instancePath: instancePath + '/neverSignTwice', schemaPath: - '#/definitions/AuthenticationTemplateKey/properties/type/const', - keyword: 'const', - params: { allowedValue: 'Key' }, - message: 'must be equal to constant', + '#/definitions/WalletTemplateKey/properties/neverSignTwice/type', + keyword: 'type', + params: { type: 'boolean' }, + message: 'must be boolean', }; if (vErrors === null) { vErrors = [err23]; @@ -1601,55 +1583,95 @@ function validate23( } errors++; } - var valid6 = _errs37 === errors; + var valid6 = _errs39 === errors; } else { var valid6 = true; } + if (valid6) { + if (data.type !== undefined) { + let data14 = data.type; + const _errs41 = errors; + if (typeof data14 !== 'string') { + const err24 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/WalletTemplateKey/properties/type/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err24]; + } else { + vErrors.push(err24); + } + errors++; + } + if ('Key' !== data14) { + const err25 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/WalletTemplateKey/properties/type/const', + keyword: 'const', + params: { allowedValue: 'Key' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err25]; + } else { + vErrors.push(err25); + } + errors++; + } + var valid6 = _errs41 === errors; + } else { + var valid6 = true; + } + } } } } } } else { - const err24 = { + const err26 = { instancePath, - schemaPath: '#/definitions/AuthenticationTemplateKey/type', + schemaPath: '#/definitions/WalletTemplateKey/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', }; if (vErrors === null) { - vErrors = [err24]; + vErrors = [err26]; } else { - vErrors.push(err24); + vErrors.push(err26); } errors++; } } - var _valid0 = _errs29 === errors; + var _valid0 = _errs31 === errors; valid0 = valid0 || _valid0; if (!valid0) { - const _errs39 = errors; - const _errs40 = errors; - if (errors === _errs40) { + const _errs43 = errors; + const _errs44 = errors; + if (errors === _errs44) { if (data && typeof data == 'object' && !Array.isArray(data)) { let missing3; if (data.type === undefined && (missing3 = 'type')) { - const err25 = { + const err27 = { instancePath, - schemaPath: - '#/definitions/AuthenticationTemplateWalletData/required', + schemaPath: '#/definitions/WalletTemplateWalletData/required', keyword: 'required', params: { missingProperty: missing3 }, message: "must have required property '" + missing3 + "'", }; if (vErrors === null) { - vErrors = [err25]; + vErrors = [err27]; } else { - vErrors.push(err25); + vErrors.push(err27); } errors++; } else { - const _errs42 = errors; + const _errs46 = errors; for (const key3 in data) { if ( !( @@ -1658,106 +1680,106 @@ function validate23( key3 === 'type' ) ) { - const err26 = { + const err28 = { instancePath, schemaPath: - '#/definitions/AuthenticationTemplateWalletData/additionalProperties', + '#/definitions/WalletTemplateWalletData/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key3 }, message: 'must NOT have additional properties', }; if (vErrors === null) { - vErrors = [err26]; + vErrors = [err28]; } else { - vErrors.push(err26); + vErrors.push(err28); } errors++; break; } } - if (_errs42 === errors) { + if (_errs46 === errors) { if (data.description !== undefined) { - const _errs43 = errors; + const _errs47 = errors; if (typeof data.description !== 'string') { - const err27 = { + const err29 = { instancePath: instancePath + '/description', schemaPath: - '#/definitions/AuthenticationTemplateWalletData/properties/description/type', + '#/definitions/WalletTemplateWalletData/properties/description/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', }; if (vErrors === null) { - vErrors = [err27]; + vErrors = [err29]; } else { - vErrors.push(err27); + vErrors.push(err29); } errors++; } - var valid8 = _errs43 === errors; + var valid8 = _errs47 === errors; } else { var valid8 = true; } if (valid8) { if (data.name !== undefined) { - const _errs45 = errors; + const _errs49 = errors; if (typeof data.name !== 'string') { - const err28 = { + const err30 = { instancePath: instancePath + '/name', schemaPath: - '#/definitions/AuthenticationTemplateWalletData/properties/name/type', + '#/definitions/WalletTemplateWalletData/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', }; if (vErrors === null) { - vErrors = [err28]; + vErrors = [err30]; } else { - vErrors.push(err28); + vErrors.push(err30); } errors++; } - var valid8 = _errs45 === errors; + var valid8 = _errs49 === errors; } else { var valid8 = true; } if (valid8) { if (data.type !== undefined) { - let data15 = data.type; - const _errs47 = errors; - if (typeof data15 !== 'string') { - const err29 = { + let data17 = data.type; + const _errs51 = errors; + if (typeof data17 !== 'string') { + const err31 = { instancePath: instancePath + '/type', schemaPath: - '#/definitions/AuthenticationTemplateWalletData/properties/type/type', + '#/definitions/WalletTemplateWalletData/properties/type/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', }; if (vErrors === null) { - vErrors = [err29]; + vErrors = [err31]; } else { - vErrors.push(err29); + vErrors.push(err31); } errors++; } - if ('WalletData' !== data15) { - const err30 = { + if ('WalletData' !== data17) { + const err32 = { instancePath: instancePath + '/type', schemaPath: - '#/definitions/AuthenticationTemplateWalletData/properties/type/const', + '#/definitions/WalletTemplateWalletData/properties/type/const', keyword: 'const', params: { allowedValue: 'WalletData' }, message: 'must be equal to constant', }; if (vErrors === null) { - vErrors = [err30]; + vErrors = [err32]; } else { - vErrors.push(err30); + vErrors.push(err32); } errors++; } - var valid8 = _errs47 === errors; + var valid8 = _errs51 === errors; } else { var valid8 = true; } @@ -1766,28 +1788,28 @@ function validate23( } } } else { - const err31 = { + const err33 = { instancePath, - schemaPath: '#/definitions/AuthenticationTemplateWalletData/type', + schemaPath: '#/definitions/WalletTemplateWalletData/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', }; if (vErrors === null) { - vErrors = [err31]; + vErrors = [err33]; } else { - vErrors.push(err31); + vErrors.push(err33); } errors++; } } - var _valid0 = _errs39 === errors; + var _valid0 = _errs43 === errors; valid0 = valid0 || _valid0; } } } if (!valid0) { - const err32 = { + const err34 = { instancePath, schemaPath: '#/anyOf', keyword: 'anyOf', @@ -1795,9 +1817,9 @@ function validate23( message: 'must match a schema in anyOf', }; if (vErrors === null) { - vErrors = [err32]; + vErrors = [err34]; } else { - vErrors.push(err32); + vErrors.push(err34); } errors++; validate23.errors = vErrors; @@ -1817,7 +1839,7 @@ function validate23( } function validate22( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -2002,10 +2024,10 @@ function validate22( const schema30 = { additionalProperties: false, description: - 'An object describing the configuration for a particular scenario within an authentication template.', + 'An object describing the configuration for a particular scenario within an wallet template.', properties: { data: { - $ref: '#/definitions/AuthenticationTemplateScenarioData', + $ref: '#/definitions/WalletTemplateScenarioData', description: "An object defining the data to use while compiling this scenario. The properties specified here are used to extend the existing scenario data based on this scenario's `extends` property.\n\nEach property is extended individually – to unset a previously-set property, the property must be individually overridden in this object.", }, @@ -2027,9 +2049,7 @@ const schema30 = { sourceOutputs: { description: 'The list of source outputs (a.k.a. UTXOs) to use when generating the compilation context for this scenario.\n\nThe `sourceOutputs` property must have the same length as `transaction.inputs`, and each source output must be ordered to match the index of the input that spends it.\n\nTo be valid the `sourceOutputs` property must have exactly one source output with `lockingBytecode` set to `["slot"]` – the output at the same index as the `["slot"]` input in `transaction.inputs`.\n\nIf undefined, defaults to `[{ "lockingBytecode": ["slot"] }]`.', - items: { - $ref: '#/definitions/AuthenticationTemplateScenarioSourceOutput', - }, + items: { $ref: '#/definitions/WalletTemplateScenarioSourceOutput' }, type: 'array', }, transaction: { @@ -2040,7 +2060,7 @@ const schema30 = { inputs: { description: 'The list of inputs to use when generating the transaction for this scenario.\n\nTo be valid the `inputs` property must have exactly one input with `unlockingBytecode` set to `["slot"]`. This is the input in which the unlocking script under test will be placed.\n\nIf undefined, inherits the default scenario `inputs` value: `[{ "unlockingBytecode": ["slot"] }]`.', - items: { $ref: '#/definitions/AuthenticationTemplateScenarioInput' }, + items: { $ref: '#/definitions/WalletTemplateScenarioInput' }, type: 'array', }, locktime: { @@ -2052,7 +2072,7 @@ const schema30 = { description: 'The list of outputs to use when generating the transaction for this scenario.\n\nIf undefined, defaults to `[{ "lockingBytecode": {} }]`.', items: { - $ref: '#/definitions/AuthenticationTemplateScenarioTransactionOutput', + $ref: '#/definitions/WalletTemplateScenarioTransactionOutput', }, type: 'array', }, @@ -2132,11 +2152,11 @@ const schema31 = { const schema32 = { additionalProperties: false, description: - 'An example output used to define a scenario for an authentication template.', + 'An example output used to define a scenario for a wallet template.', properties: { lockingBytecode: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateScenarioBytecode' }, + { $ref: '#/definitions/WalletTemplateScenarioBytecode' }, { items: { const: 'slot', type: 'string' }, maxItems: 1, @@ -2199,7 +2219,7 @@ const schema33 = { additionalProperties: false, properties: { overrides: { - $ref: '#/definitions/AuthenticationTemplateScenarioData', + $ref: '#/definitions/WalletTemplateScenarioData', description: 'Scenario data that extends the scenario\'s top-level `data` during script compilation.\n\nEach property is extended individually – to modify a property set by the top-level scenario `data`, the new value must be listed here.\n\nDefaults to `{}` for `sourceOutputs` and `transaction.inputs`; defaults to `{ "hdKeys": { "addressIndex": 1 } }` for `transaction.outputs`.', }, @@ -2221,11 +2241,11 @@ const schema33 = { }, ], description: - 'A type that describes the configuration for a particular locking or unlocking bytecode within an authentication template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`.', + 'A type that describes the configuration for a particular locking or unlocking bytecode within a wallet template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`.', }; function validate28( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -2293,7 +2313,7 @@ function validate28( const err2 = { instancePath: instancePath + '/overrides', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/additionalProperties', + '#/definitions/WalletTemplateScenarioData/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key1 }, message: 'must NOT have additional properties', @@ -2326,7 +2346,7 @@ function validate28( '/overrides/bytecode/' + key2.replace(/~/g, '~0').replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/bytecode/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/bytecode/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -2347,7 +2367,7 @@ function validate28( const err4 = { instancePath: instancePath + '/overrides/bytecode', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/bytecode/type', + '#/definitions/WalletTemplateScenarioData/properties/bytecode/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2373,7 +2393,7 @@ function validate28( instancePath: instancePath + '/overrides/currentBlockHeight', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/currentBlockHeight/type', + '#/definitions/WalletTemplateScenarioData/properties/currentBlockHeight/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -2398,7 +2418,7 @@ function validate28( instancePath: instancePath + '/overrides/currentBlockTime', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/currentBlockTime/type', + '#/definitions/WalletTemplateScenarioData/properties/currentBlockTime/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -2437,7 +2457,7 @@ function validate28( instancePath: instancePath + '/overrides/hdKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/additionalProperties', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key3 }, message: @@ -2467,7 +2487,7 @@ function validate28( instancePath + '/overrides/hdKeys/addressIndex', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/addressIndex/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/addressIndex/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -2504,7 +2524,7 @@ function validate28( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -2527,7 +2547,7 @@ function validate28( instancePath + '/overrides/hdKeys/hdPrivateKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2567,7 +2587,7 @@ function validate28( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -2590,7 +2610,7 @@ function validate28( instancePath + '/overrides/hdKeys/hdPublicKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2615,7 +2635,7 @@ function validate28( instancePath: instancePath + '/overrides/hdKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2649,7 +2669,7 @@ function validate28( instancePath: instancePath + '/overrides/keys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/additionalProperties', + '#/definitions/WalletTemplateScenarioData/properties/keys/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key6 }, message: @@ -2687,7 +2707,7 @@ function validate28( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/properties/privateKeys/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/keys/properties/privateKeys/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -2710,7 +2730,7 @@ function validate28( instancePath + '/overrides/keys/privateKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/properties/privateKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/keys/properties/privateKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2730,7 +2750,7 @@ function validate28( instancePath: instancePath + '/overrides/keys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/type', + '#/definitions/WalletTemplateScenarioData/properties/keys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2755,8 +2775,7 @@ function validate28( } else { const err18 = { instancePath: instancePath + '/overrides', - schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/type', + schemaPath: '#/definitions/WalletTemplateScenarioData/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2976,7 +2995,7 @@ function validate28( } function validate27( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -3416,7 +3435,7 @@ function validate27( const schema35 = { additionalProperties: false, description: - 'An example input used to define a scenario for an authentication template.', + 'An example input used to define a scenario for a wallet template.', properties: { outpointIndex: { description: @@ -3435,7 +3454,7 @@ const schema35 = { }, unlockingBytecode: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateScenarioBytecode' }, + { $ref: '#/definitions/WalletTemplateScenarioBytecode' }, { items: { const: 'slot', type: 'string' }, maxItems: 1, @@ -3444,14 +3463,14 @@ const schema35 = { }, ], description: - 'The `unlockingBytecode` value of this input for this scenario. This must be either `["slot"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `AuthenticationTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `["slot"]` for exactly one input in the scenario.\n\nDefaults to `["slot"]`.', + 'The `unlockingBytecode` value of this input for this scenario. This must be either `["slot"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `WalletTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `["slot"]` for exactly one input in the scenario.\n\nDefaults to `["slot"]`.', }, }, type: 'object', }; function validate31( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -3717,10 +3736,10 @@ function validate31( const schema36 = { additionalProperties: false, description: - 'An example output used to define a scenario for an authentication template.', + 'An example output used to define a scenario for a wallet template.', properties: { lockingBytecode: { - $ref: '#/definitions/AuthenticationTemplateScenarioBytecode', + $ref: '#/definitions/WalletTemplateScenarioBytecode', description: 'The locking bytecode used to encumber this output.\n\n`lockingBytecode` values may be provided as a hexadecimal-encoded string or as an object describing the required compilation. If undefined, defaults to `{}`, which uses the default values for `script` and `overrides`, respectively.\n\nOnly source outputs may specify a `lockingBytecode` of `["slot"]`; this identifies the source output in which the locking script under test will be placed. (To be valid, every scenario\'s `sourceOutputs` property must have exactly one source output slot and one input slot at the same index.)', }, @@ -3771,7 +3790,7 @@ const schema36 = { }; function validate34( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -4080,7 +4099,7 @@ function validate34( } function validate26( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -4133,7 +4152,7 @@ function validate26( { instancePath: instancePath + '/data', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/additionalProperties', + '#/definitions/WalletTemplateScenarioData/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key1 }, message: 'must NOT have additional properties', @@ -4163,7 +4182,7 @@ function validate26( '/data/bytecode/' + key2.replace(/~/g, '~0').replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/bytecode/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/bytecode/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -4181,7 +4200,7 @@ function validate26( { instancePath: instancePath + '/data/bytecode', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/bytecode/type', + '#/definitions/WalletTemplateScenarioData/properties/bytecode/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4204,7 +4223,7 @@ function validate26( instancePath: instancePath + '/data/currentBlockHeight', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/currentBlockHeight/type', + '#/definitions/WalletTemplateScenarioData/properties/currentBlockHeight/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -4226,7 +4245,7 @@ function validate26( instancePath: instancePath + '/data/currentBlockTime', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/currentBlockTime/type', + '#/definitions/WalletTemplateScenarioData/properties/currentBlockTime/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -4261,7 +4280,7 @@ function validate26( { instancePath: instancePath + '/data/hdKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/additionalProperties', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key3 }, message: @@ -4285,7 +4304,7 @@ function validate26( instancePath + '/data/hdKeys/addressIndex', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/addressIndex/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/addressIndex/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -4319,7 +4338,7 @@ function validate26( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -4339,7 +4358,7 @@ function validate26( instancePath + '/data/hdKeys/hdPrivateKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4374,7 +4393,7 @@ function validate26( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -4394,7 +4413,7 @@ function validate26( instancePath + '/data/hdKeys/hdPublicKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4415,7 +4434,7 @@ function validate26( { instancePath: instancePath + '/data/hdKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4445,7 +4464,7 @@ function validate26( { instancePath: instancePath + '/data/keys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/additionalProperties', + '#/definitions/WalletTemplateScenarioData/properties/keys/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key6 }, message: @@ -4478,7 +4497,7 @@ function validate26( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/properties/privateKeys/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/keys/properties/privateKeys/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -4498,7 +4517,7 @@ function validate26( instancePath + '/data/keys/privateKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/properties/privateKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/keys/properties/privateKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4514,7 +4533,7 @@ function validate26( { instancePath: instancePath + '/data/keys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/type', + '#/definitions/WalletTemplateScenarioData/properties/keys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4536,8 +4555,7 @@ function validate26( validate26.errors = [ { instancePath: instancePath + '/data', - schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/type', + schemaPath: '#/definitions/WalletTemplateScenarioData/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4901,9 +4919,7 @@ const schema39 = { type: 'string', }, tests: { - additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateScriptTest', - }, + additionalProperties: { $ref: '#/definitions/WalletTemplateScriptTest' }, description: 'One or more tests that can be used during development and during template validation to confirm the correctness of this tested script.', type: 'object', @@ -4954,7 +4970,7 @@ const schema40 = { }; function validate38( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -5090,7 +5106,7 @@ function validate38( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/required', + '#/definitions/WalletTemplateScriptTest/required', keyword: 'required', params: { missingProperty: missing1 }, message: @@ -5122,7 +5138,7 @@ function validate38( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/additionalProperties', + '#/definitions/WalletTemplateScriptTest/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key2 }, message: @@ -5147,7 +5163,7 @@ function validate38( .replace(/\//g, '~1') + '/check', schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/check/type', + '#/definitions/WalletTemplateScriptTest/properties/check/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5181,7 +5197,7 @@ function validate38( '/fails/' + i0, schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/fails/items/type', + '#/definitions/WalletTemplateScriptTest/properties/fails/items/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5205,7 +5221,7 @@ function validate38( .replace(/\//g, '~1') + '/fails', schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/fails/type', + '#/definitions/WalletTemplateScriptTest/properties/fails/type', keyword: 'type', params: { type: 'array' }, message: 'must be array', @@ -5240,7 +5256,7 @@ function validate38( '/invalid/' + i1, schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/invalid/items/type', + '#/definitions/WalletTemplateScriptTest/properties/invalid/items/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5264,7 +5280,7 @@ function validate38( .replace(/\//g, '~1') + '/invalid', schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/invalid/type', + '#/definitions/WalletTemplateScriptTest/properties/invalid/type', keyword: 'type', params: { type: 'array' }, message: 'must be array', @@ -5291,7 +5307,7 @@ function validate38( .replace(/\//g, '~1') + '/name', schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/name/type', + '#/definitions/WalletTemplateScriptTest/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5329,12 +5345,12 @@ function validate38( .replace(/~/g, '~0') .replace( /\//g, - '~1' + '~1', ) + '/passes/' + i2, schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/passes/items/type', + '#/definitions/WalletTemplateScriptTest/properties/passes/items/type', keyword: 'type', params: { type: 'string', @@ -5360,7 +5376,7 @@ function validate38( .replace(/\//g, '~1') + '/passes', schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/passes/type', + '#/definitions/WalletTemplateScriptTest/properties/passes/type', keyword: 'type', params: { type: 'array' }, message: 'must be array', @@ -5389,7 +5405,7 @@ function validate38( .replace(/\//g, '~1') + '/setup', schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/setup/type', + '#/definitions/WalletTemplateScriptTest/properties/setup/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5416,7 +5432,7 @@ function validate38( '/tests/' + key1.replace(/~/g, '~0').replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/type', + '#/definitions/WalletTemplateScriptTest/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -5471,7 +5487,7 @@ function validate38( const func4 = Object.prototype.hasOwnProperty; function validate21( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -5717,7 +5733,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScript/required', + '#/definitions/WalletTemplateScript/required', keyword: 'required', params: { missingProperty: missing1 }, message: @@ -5745,7 +5761,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScript/additionalProperties', + '#/definitions/WalletTemplateScript/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key4 }, message: @@ -5773,7 +5789,7 @@ function validate21( .replace(/\//g, '~1') + '/name', schemaPath: - '#/definitions/AuthenticationTemplateScript/properties/name/type', + '#/definitions/WalletTemplateScript/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5802,7 +5818,7 @@ function validate21( .replace(/\//g, '~1') + '/script', schemaPath: - '#/definitions/AuthenticationTemplateScript/properties/script/type', + '#/definitions/WalletTemplateScript/properties/script/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5830,7 +5846,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScript/type', + '#/definitions/WalletTemplateScript/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -5869,7 +5885,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/required', + '#/definitions/WalletTemplateScriptLocking/required', keyword: 'required', params: { missingProperty: missing2 }, message: @@ -5901,7 +5917,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/additionalProperties', + '#/definitions/WalletTemplateScriptLocking/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key5 }, message: @@ -5930,7 +5946,7 @@ function validate21( .replace(/\//g, '~1') + '/lockingType', schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/properties/lockingType/type', + '#/definitions/WalletTemplateScriptLocking/properties/lockingType/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5958,7 +5974,7 @@ function validate21( .replace(/\//g, '~1') + '/lockingType', schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/properties/lockingType/enum', + '#/definitions/WalletTemplateScriptLocking/properties/lockingType/enum', keyword: 'enum', params: { allowedValues: @@ -5992,7 +6008,7 @@ function validate21( .replace(/\//g, '~1') + '/name', schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/properties/name/type', + '#/definitions/WalletTemplateScriptLocking/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -6023,7 +6039,7 @@ function validate21( .replace(/\//g, '~1') + '/script', schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/properties/script/type', + '#/definitions/WalletTemplateScriptLocking/properties/script/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -6052,7 +6068,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/type', + '#/definitions/WalletTemplateScriptLocking/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -6114,7 +6130,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/required', + '#/definitions/WalletTemplateScriptUnlocking/required', keyword: 'required', params: { missingProperty: missing3 }, message: @@ -6134,7 +6150,7 @@ function validate21( if ( !func4.call( schema41.properties, - key6 + key6, ) ) { const err13 = { @@ -6145,7 +6161,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/additionalProperties', + '#/definitions/WalletTemplateScriptUnlocking/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key6, @@ -6177,7 +6193,7 @@ function validate21( .replace(/\//g, '~1') + '/ageLock', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/ageLock/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/ageLock/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -6209,7 +6225,7 @@ function validate21( .replace(/\//g, '~1') + '/estimate', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/estimate/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/estimate/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -6250,16 +6266,16 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/fails/' + i0, schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/fails/items/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/fails/items/type', keyword: 'type', params: { type: 'string', @@ -6289,11 +6305,11 @@ function validate21( .replace(/~/g, '~0') .replace( /\//g, - '~1' + '~1', ) + '/fails', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/fails/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/fails/type', keyword: 'type', params: { type: 'array' }, message: 'must be array', @@ -6339,16 +6355,16 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/invalid/' + i1, schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/invalid/items/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/invalid/items/type', keyword: 'type', params: { type: 'string', @@ -6380,11 +6396,11 @@ function validate21( .replace(/~/g, '~0') .replace( /\//g, - '~1' + '~1', ) + '/invalid', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/invalid/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/invalid/type', keyword: 'type', params: { type: 'array', @@ -6422,11 +6438,11 @@ function validate21( .replace(/~/g, '~0') .replace( /\//g, - '~1' + '~1', ) + '/name', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/name/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/name/type', keyword: 'type', params: { type: 'string', @@ -6478,16 +6494,16 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/passes/' + i2, schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/passes/items/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/passes/items/type', keyword: 'type', params: { type: 'string', @@ -6503,7 +6519,7 @@ function validate21( ]; } else { vErrors.push( - err21 + err21, ); } errors++; @@ -6523,15 +6539,15 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/passes', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/passes/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/passes/type', keyword: 'type', params: { type: 'array', @@ -6571,15 +6587,15 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/script', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/script/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/script/type', keyword: 'type', params: { type: 'string', @@ -6621,15 +6637,15 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/timeLockType', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/timeLockType/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/timeLockType/type', keyword: 'type', params: { type: 'string', @@ -6643,7 +6659,7 @@ function validate21( vErrors = [err24]; } else { vErrors.push( - err24 + err24, ); } errors++; @@ -6663,15 +6679,15 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/timeLockType', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/timeLockType/enum', + '#/definitions/WalletTemplateScriptUnlocking/properties/timeLockType/enum', keyword: 'enum', params: { allowedValues: @@ -6689,7 +6705,7 @@ function validate21( vErrors = [err25]; } else { vErrors.push( - err25 + err25, ); } errors++; @@ -6717,15 +6733,15 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/unlocks', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/unlocks/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/unlocks/type', keyword: 'type', params: { type: 'string', @@ -6741,7 +6757,7 @@ function validate21( ]; } else { vErrors.push( - err26 + err26, ); } errors++; @@ -6771,7 +6787,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/type', + '#/definitions/WalletTemplateScriptUnlocking/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -6978,7 +6994,7 @@ function validate21( } function validate20( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; diff --git a/src/lib/schema/bcmr.schema.json b/src/lib/schema/bcmr.schema.json new file mode 100644 index 00000000..01b3cb96 --- /dev/null +++ b/src/lib/schema/bcmr.schema.json @@ -0,0 +1,493 @@ +{ + "$ref": "#/definitions/MetadataRegistry", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "ChainHistory": { + "$ref": "#/definitions/RegistryTimestampKeyedValues", + "description": "A block height-keyed map of {@link ChainSnapshot } s documenting the evolution of a particular chain/network's identity. Like {@link IdentityHistory } , this structure allows wallets and other user interfaces to offer better experiences when a chain identity is rebranded, redenominated, or other important metadata is modified in a coordinated update." + }, + "ChainSnapshot": { + "additionalProperties": false, + "description": "A snapshot of the metadata for a particular chain/network at a specific time. This allows for registries to provide similar metadata for each chain's native currency unit (name, description, symbol, icon, etc.) as can be provided for other registered tokens.", + "properties": { + "description": { + "description": "A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`", + "type": "string" + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details." + }, + "name": { + "description": "The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.", + "type": "string" + }, + "splitId": { + "description": "The split ID of this identity's chain of record.\n\nIf undefined, defaults to {@link MetadataRegistry.defaultChain } .", + "type": "string" + }, + "status": { + "description": "The status of this identity, must be `active`, `inactive`, or `burned`. If omitted, defaults to `active`.\n- Identities with an `active` status should be actively tracked by clients.\n- Identities with an `inactive` status may be considered for archival by clients and may be removed in future registry versions.\n- Identities with a `burned` status have been destroyed by setting the latest identity output to a data-carrier output (`OP_RETURN`), permanently terminating the authchain. Clients should archive burned identities and – if the burned identity represented a token type – consider burning any remaining tokens of that category to reclaim funds from those outputs.", + "enum": ["active", "burned", "inactive"], + "type": "string" + }, + "tags": { + "description": "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + "items": { + "type": "string" + }, + "type": "array" + }, + "token": { + "additionalProperties": false, + "description": "A data structure indicating how the chain's native currency units should be displayed in user interfaces.", + "properties": { + "decimals": { + "description": "An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this native currency.\n\nThis is the number of digits that can appear after the decimal separator in currency amounts. For a currency with a `symbol` of `SYMBOL` and a `decimals` of `2`, an amount of `12345` should be displayed as `123.45 SYMBOL`.\n\nIf omitted, defaults to `0`.", + "type": "number" + }, + "symbol": { + "description": "An abbreviation used to uniquely identity this native currency unit.\n\nSymbols must be comprised only of capital letters, numbers, and dashes (`-`). This can be validated with the regular expression: `/^[-A-Z0-9]+$/`.", + "type": "string" + } + }, + "required": ["symbol"], + "type": "object" + }, + "uris": { + "$ref": "#/definitions/URIs", + "description": "A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`." + } + }, + "required": ["name", "token"], + "type": "object" + }, + "Extensions": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "additionalProperties": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "object" + } + ] + }, + "description": "A mapping of extension identifiers to extension definitions. Extensions may be widely standardized or application-specific, and extension definitions must be either:\n\n- `string`s,\n- key-value mappings of `string`s, or\n- two-dimensional, key-value mappings of `string`s.\n\nThis limitation encourages safety and wider compatibility across implementations.\n\nTo encode an array, it is recommended that each value be assigned to a numeric key indicating the item's index (beginning at `0`). Numerically-indexed objects are often a more useful and resilient data-transfer format than simple arrays because they simplify difference-only transmission: only modified indexes need to be transferred, and shifts in item order must be explicit, simplifying merges of conflicting updates.\n\nFor encoding of more complex data, consider using base64 and/or string-encoded JSON.", + "type": "object" + }, + "IdentityHistory": { + "$ref": "#/definitions/RegistryTimestampKeyedValues", + "description": "A timestamp-keyed map of {@link IdentitySnapshot } s documenting the evolution of a particular identity. The current identity information is the snapshot associated with the latest timestamp reached. If no timestamp has yet been reached, the snapshot of the oldest timestamp is considered current. Future-dated timestamps indicate planned migrations.\n\nThis strategy allows wallets and other user interfaces to offer better experiences when an identity is rebranded, a token redenominated, or other important metadata is modified in a coordinated update. For example, a wallet may warn token holders of a forthcoming rebranding of fungible tokens they hold; after the change, the wallet may continue to offer prominent interface hints that the rebranded token identity was recently updated.\n\nTimestamps may be order by time via lexicographical sort. For determinism, it is recommended that implementations sort from newest to oldest in exported registry JSON files.\n\nIf the current snapshot's {@link IdentitySnapshot.migrated } isn't specified, the snapshot's index is a precise time at which the snapshot takes effect and clients should begin using the new information. If `migrated` is specified, the snapshot's index is the timestamp at which the transition is considered to begin, see {@link IdentitySnapshot.migrated } for details.\n\nEach timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nIn the case that an identity change occurs due to on-chain activity (e.g. an on-chain migration that is set to complete at a particular locktime value), registry-recorded timestamps reflect the real-world time at which the maintainer of the registry believes the on-chain activity to have actually occurred. Likewise, future-dated timestamps indicate a precise real-world time at which a snapshot is estimated to take effect, rather than the Median Time Past (BIP113) UNIX timestamp or another on-chain measurement of time." + }, + "IdentitySnapshot": { + "additionalProperties": false, + "description": "A snapshot of the metadata for a particular identity at a specific time.", + "properties": { + "description": { + "description": "A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`", + "type": "string" + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details." + }, + "migrated": { + "description": "The timestamp at which this identity snapshot is fully in effect. This value should only be provided if the snapshot takes effect over a period of time (e.g. an in-circulation token identity is gradually migrating to a new category). In these cases, clients should gradually migrate to using the new information beginning after the identity snapshot's timestamp and the `migrated` time.\n\nThis timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.", + "type": "string" + }, + "name": { + "description": "The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.", + "type": "string" + }, + "splitId": { + "description": "The split ID of this identity's chain of record.\n\nIf undefined, defaults to {@link MetadataRegistry.defaultChain } .", + "type": "string" + }, + "status": { + "description": "The status of this identity, must be `active`, `inactive`, or `burned`. If omitted, defaults to `active`.\n- Identities with an `active` status should be actively tracked by clients.\n- Identities with an `inactive` status may be considered for archival by clients and may be removed in future registry versions.\n- Identities with a `burned` status have been destroyed by setting the latest identity output to a data-carrier output (`OP_RETURN`), permanently terminating the authchain. Clients should archive burned identities and – if the burned identity represented a token type – consider burning any remaining tokens of that category to reclaim funds from those outputs.", + "enum": ["active", "burned", "inactive"], + "type": "string" + }, + "tags": { + "description": "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + "items": { + "type": "string" + }, + "type": "array" + }, + "token": { + "$ref": "#/definitions/TokenCategory", + "description": "If this identity is a type of token, a data structure indicating how tokens should be understood and displayed in user interfaces. Omitted for non-token identities." + }, + "uris": { + "$ref": "#/definitions/URIs", + "description": "A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`." + } + }, + "required": ["name"], + "type": "object" + }, + "MetadataRegistry": { + "additionalProperties": false, + "description": "A Bitcoin Cash Metadata Registry is an authenticated JSON file containing metadata about tokens, identities, contract applications, and other on-chain artifacts. BCMRs conform to the Bitcoin Cash Metadata Registry JSON Schema, and they can be published and maintained by any entity or individual.", + "properties": { + "$schema": { + "description": "The schema used by this registry. Many JSON editors can automatically provide inline documentation and autocomplete support using the `$schema` property, so it is recommended that registries include it. E.g.: `https://cashtokens.org/bcmr-v2.schema.json`", + "type": "string" + }, + "chains": { + "additionalProperties": { + "$ref": "#/definitions/ChainHistory" + }, + "description": "A map of split IDs tracked by this registry to the {@link ChainHistory } for that chain/network.\n\nThe split ID of a chain is the block header hash (A.K.A. block ID) of the first unique block after the most recent tracked split – a split after which both resulting chains are considered notable or tracked by the registry. (For chains with no such splits, this is the ID of the genesis block.)\n\nNote, split ID is inherently a \"relative\" identifier. After a tracked split, both resulting chains will have a new split ID. However, if a wallet has not yet heard about a particular split, that wallet will continue to reference one of the resulting chains by its previous split ID, and the split-unaware wallet may create transactions that are valid on both chains (losing claimable value if the receivers of their transactions don't acknowledge transfers on both chains). When a registry trusted by the wallet notes the split in it's `chains` map, the wallet can represent the split in the user interface using the the latest {@link ChainSnapshot } for each chain and splitting coins prior to spending (by introducing post-split coins in each transaction).\n\nThis map may exclude the following well-known split IDs (all clients supporting any of these chains should build-in {@link ChainHistory } for those chains):\n\n- `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`: A.K.A. mainnet – the BCH side of the BCH/XEC split.\n- `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367`: A.K.A testnet4 – the test network on which CHIPs are activated simultaneously with mainnet (May 15 at 12 UTC).\n- `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727`: A.K.A. chipnet – the test network on which CHIPs are activated 6 months before mainnet (November 15 at 12 UTC).\n\nAll other split IDs referenced by this registry should be included in this map.", + "type": "object" + }, + "defaultChain": { + "description": "The split ID of the chain/network considered the \"default\" chain for this registry. Identities that do not specify a {@link IdentitySnapshot.splitId } are assumed to be set to this split ID. For a description of split IDs, see {@link MetadataRegistry.chains } .\n\nIf not provided, the `defaultChain` is `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`, the BCH side of the BCH/XEC split (mainnet). Common values include:\n- `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367` (testnet4)\n- `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727` (chipnet)", + "type": "string" + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of `Registry` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `Registry`s include the `locale` extension. See https://github.com/bitjson/chip-bcmr#locales-extension for details." + }, + "identities": { + "additionalProperties": { + "$ref": "#/definitions/IdentityHistory" + }, + "description": "A mapping of authbases to the `IdentityHistory` for that identity.\n\nAn authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for which the zeroth-descendant transaction chain (ZDTC) authenticates and publishes an identity's claimed metadata.\n\nIdentities may represent metadata registries, specific types of tokens, companies, organizations, individuals, or other on-chain entities.", + "type": "object" + }, + "latestRevision": { + "description": "The timestamp of the latest revision made to this registry version. The timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.", + "type": "string" + }, + "license": { + "description": "The license under which this registry is published. This may be specified as either a SPDX short identifier (https://spdx.org/licenses/) or by including the full text of the license.\n\nCommon values include: - `CC0-1.0`: https://creativecommons.org/publicdomain/zero/1.0/ - `MIT`: https://opensource.org/licenses/MIT", + "type": "string" + }, + "registryIdentity": { + "anyOf": [ + { + "$ref": "#/definitions/OffChainRegistryIdentity" + }, + { + "type": "string" + } + ], + "description": "The identity information of this particular registry, provided as either an authbase (recommended) or an `IdentitySnapshot`.\n\nAn authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for which the zeroth-descendant transaction chain (ZDTC) authenticates and publishes all registry updates. If an authbase is provided, the registry's identity information can be found in `identities[authbase]`, and clients should immediately attempt to verify the registry's identity on-chain. (See https://github.com/bitjson/chip-bcmr#chain-resolved-registries)\n\nIf an `IdentitySnapshot` is provided directly, this registry does not support on-chain resolution/authentication, and the contained `IdentitySnapshot` can only be authenticated via DNS/HTTPS." + }, + "tags": { + "additionalProperties": { + "$ref": "#/definitions/Tag" + }, + "description": "A map of registry-specific `Tag`s used by this registry to convey information about identities it tracks.\n\nTags allow registries to group identities into collections of related identities, marking characteristics or those identities. Tags are standardized within a registry and may represent either labels applied by that registry (e.g. `individual`, `organization`, `token`, `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, `decentralized-exchange`, `liquidity-provider`, `sidechain`, `sidechain-bridge`, etc.) or designations by external authorities (certification, membership, ownership, etc.) that are tracked by that registry.\n\nTags may be used by clients in search, discover, and filtering of identities, and they can also convey information like accreditation from investor protection organizations, public certifications by security or financial auditors, and other designations that signal legitimacy and value to users.", + "type": "object" + }, + "version": { + "additionalProperties": false, + "description": "The version of this registry. Versioning adheres to Semantic Versioning (https://semver.org/).", + "properties": { + "major": { + "description": "The major version is incremented when an identity is removed.", + "type": "number" + }, + "minor": { + "description": "The minor version is incremented when an identity is added or a new identity snapshot is added.", + "type": "number" + }, + "patch": { + "description": "The patch version is incremented when an existing identity or identity snapshot is modified (e.g. to correct an error or add a missing piece of information) or when other registry properties (e.g. registry `name`, `description`, `uris`, etc.) are modified.\n\nGenerally, substantive changes to an existing identity should be made using a new identity snapshot in a minor version upgrade – this allows clients to provide a better user experience by noting the change in relevant user interfaces.\n\nFor example, patch upgrades might include spelling corrections in an existing snapshot or the addition of an `icon` containing a higher-resolution version of an existing `icon` image. On the other hand, a rebranding in which the icon is substantially changed may warrant a new identity snapshot to be added in a minor version upgrade.", + "type": "number" + } + }, + "required": ["major", "minor", "patch"], + "type": "object" + } + }, + "required": ["version", "latestRevision", "registryIdentity"], + "type": "object" + }, + "NftCategory": { + "additionalProperties": false, + "description": "A definition specifying the non-fungible token information for a token category.", + "properties": { + "description": { + "description": "A string describing how this identity uses NFTs (for use in user interfaces). Descriptions longer than `160` characters may be elided in some interfaces.\n\nE.g.:\n- \"ACME DEX NFT order receipts are issued when you place orders on the decentralized exchange. After orders are processed, order receipts can be redeemed for purchased tokens or sales proceeds.\";\n- \"ACME Game collectable NFTs unlock unique playable content, user avatars, and item skins in ACME Game Online.\"; etc.", + "type": "string" + }, + "fields": { + "$ref": "#/definitions/NftCategoryField", + "description": "A mapping of field identifier to field definitions for the data fields that can appear in NFT commitments of this category.\n\nCategories including only sequential NFTs (where `parse.bytecode` is undefined) should omit `fields` (or set to `undefined`)." + }, + "parse": { + "anyOf": [ + { + "$ref": "#/definitions/ParsableNftCollection" + }, + { + "$ref": "#/definitions/SequentialNftCollection" + } + ], + "description": "Parsing and interpretation information for all NFTs of this category; this enables generalized wallets to parse and display detailed information about all NFTs held by the wallet, e.g. `BCH Pledged`, `Order Price`, `Seat Number`, `Asset Number`, `IPFS Content Identifier`, `HTTPS URL`, etc.\n\nParsing instructions are provided in the `bytecode` property, and the results are interpreted using the `types` property." + } + }, + "required": ["parse"], + "type": "object" + }, + "NftCategoryField": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "description": { + "description": "A string describing how this identity uses NFTs (for use in user interfaces). Descriptions longer than `160` characters may be elided in some interfaces.\n\nE.g.:\n- `The BCH value pledged at the time this receipt was issued.`\n- `The number of tokens sold in this order.`\n- `The seat number associated with this ticket.`", + "type": "string" + }, + "encoding": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "type": { + "enum": [ + "binary", + "boolean", + "hex", + "https-url", + "ipfs-cid", + "utf8", + "locktime" + ], + "type": "string" + } + }, + "required": ["type"], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "aggregate": { + "const": "add", + "description": "The `aggregate` property indicates that aggregating this field from multiple NFTs is desirable in user interfaces. For example, for a field named `BCH Pledged` where `aggregate` is `add`, the client can display a `Total BCH Pledged` in any user interface listing more than one NFT.\n\nIf specified, clients should aggregate the field from all NFTs, of all NFT types within the category, within a particular view (e.g. NFTs held by a single wallet, NFTs existing in a single transaction's outputs, etc.) using the specified operation.\n\nNote, while aggregation could be performed using any commutative operation – multiplication, bitwise AND, bitwise OR, bitwise XOR, etc. – only `add` is currently supported.", + "type": "string" + }, + "decimals": { + "description": "An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this token field.\n\nThis is the number of digits that can appear after the decimal separator in amounts. For a field with a `decimals` of `2`, a value of `123456` should be displayed as `1234.56`.\n\nIf omitted, defaults to `0`.", + "type": "number" + }, + "type": { + "const": "number", + "type": "string" + }, + "unit": { + "description": "The unit in which this field is denominated, taking the `decimals` value into account. If representing fungible token amount, this will often be the symbol of the represented token category.\n\nE.g. `BCH`, `sats`, `AcmeUSD`, etc.\n\nIf not provided, clients should not represent this field as having a unit beyond the field's `name`.", + "type": "string" + } + }, + "required": ["type"], + "type": "object" + } + ], + "description": "The expected encoding of this field when read from the parsing altstack (see {@link ParsableNftCollection } ). All encoding definitions must have a `type`, and some encoding definitions allow for additional hinting about display strategies in clients.\n\nEncoding types may be set to `binary`, `boolean`, `hex`, `number`, or `utf8`:\n\n- `binary` types should be displayed as binary literals (e.g. `0b0101`)\n- `boolean` types should be displayed as `true` if exactly `0x01` or `false` if exactly `0x00`. If a boolean value does not match one of these values, clients should represent the NFT as unable to be parsed (e.g. simply display the full `commitment`).\n- `hex` types should be displayed as hex literals (e.g.`0xabcd`).\n- `https-url` types are percent encoded with the `https://` prefix omitted; they may be displayed as URIs or as activatable links.\n- `ipfs-cid` types are binary-encoded IPFS Content Identifiers; they may be displayed as URIs or as activatable links.\n- `locktime` types are `OP_TXLOCKTIME` results: integers from `0` to `4294967295` (inclusive) where values less than `500000000` are understood to be a block height (the current block number in the chain, beginning from block `0`), and values greater than or equal to `500000000` are understood to be a Median Time Past (BIP113) UNIX timestamp. (Note, sequence age is not currently supported.)\n- `number` types should be displayed according the their configured `decimals` and `unit` values.\n- `utf8` types should be displayed as utf8 strings." + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of NFT field extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific." + }, + "name": { + "description": "The name of this field for use in interfaces. Names longer than `20` characters may be elided in some interfaces.\n\nE.g.:\n- `BCH Pledged`\n- `Tokens Sold`\n- `Settlement Locktime`\n- `Seat Number`,\n- `IPFS Content Identifier`\n- `HTTPS URL`", + "type": "string" + }, + "uris": { + "$ref": "#/definitions/URIs", + "description": "A mapping of identifiers to URIs associated with this NFT field. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified." + } + }, + "required": ["encoding"], + "type": "object" + }, + "description": "A definition specifying a field that can be encoded in non-fungible tokens of a token category.", + "type": "object" + }, + "NftType": { + "additionalProperties": false, + "description": "A definition for one type of NFT within a token category.", + "properties": { + "description": { + "description": "A string describing this NFT type for use in user interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- \"Receipts issued by the exchange to record details about purchases. After settlement, these receipts are redeemed for the purchased tokens.\";\n- \"Receipts issued by the crowdfunding campaign to document the value of funds pledged. If the user decides to cancel their pledge before the campaign completes, these receipts can be redeemed for a full refund.\";\n- \"Tickets issued for events at ACME Stadium.\";\n- Sealed ballots certified by ACME decentralized organization during the voting period. After the voting period ends, these ballots must be revealed to reclaim the tokens used for voting.\"", + "type": "string" + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of NFT type extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific." + }, + "fields": { + "description": "A list of identifiers for fields contained in NFTs of this type. On successful parsing evaluations, the bottom item on the altstack indicates the matched NFT type, and the remaining altstack items represent NFT field contents in the order listed (where `fields[0]` is the second-to-bottom item, and the final item in `fields` is the top of the altstack).\n\nFields should be ordered by recommended importance from most important to least important; in user interfaces, clients should display fields at lower indexes more prominently than those at higher indexes, e.g. if some fields cannot be displayed in minimized interfaces, higher-importance fields can still be represented. (Note, this ordering is controlled by the bytecode specified in `token.nft.parse.bytecode`.)\n\nIf this is a sequential NFT, (the category's `parse.bytecode` is undefined), `fields` should be omitted or set to `undefined`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "description": "The name of this NFT type for use in interfaces. Names longer than `20` characters may be elided in some interfaces.\n\nE.g. `Market Order Buys`, `Limit Order Sales`, `Pledge Receipts`, `ACME Stadium Tickets`, `Sealed Votes`, etc.", + "type": "string" + }, + "uris": { + "$ref": "#/definitions/URIs", + "description": "A mapping of identifiers to URIs associated with this NFT type. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified." + } + }, + "required": ["name"], + "type": "object" + }, + "OffChainRegistryIdentity": { + "additionalProperties": false, + "description": "An identity representing a metadata registry that is not published on-chain and therefore has no authbase or trackable authchain.", + "properties": { + "description": { + "description": "A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`", + "type": "string" + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details." + }, + "name": { + "description": "The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.", + "type": "string" + }, + "tags": { + "description": "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + "items": { + "type": "string" + }, + "type": "array" + }, + "uris": { + "$ref": "#/definitions/URIs", + "description": "A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`." + } + }, + "required": ["name"], + "type": "object" + }, + "ParsableNftCollection": { + "additionalProperties": false, + "description": "Interpretation information for a collection of parsable NFTs, a collection in which each NFT may include additional metadata fields beyond a sequential identifier within its on-chain commitment. Note that {@link ParsableNftCollection } s differ from {@link SequentialNftCollection } s in that parsable collections require a parsing `bytecode` with which to inspect each NFT commitment: the type of each NFT is indexed by the hex-encoded contents the bottom item on the altstack following the evaluation of the parsing bytecode.", + "properties": { + "bytecode": { + "description": "A segment of hex-encoded Bitcoin Cash VM bytecode that parses UTXOs holding NFTs of this category, identifies the NFT's type within the category, and returns a list of the NFT's field values via the altstack. If undefined, this NFT Category includes only sequential NFTs, with only an identifier and no NFT fields encoded in each NFT's on-chain commitment.\n\nThe parse `bytecode` is evaluated by instantiating and partially verifying a standardized NFT parsing transaction:\n- version: `2`\n- inputs: - 0: Spends the UTXO containing the NFT with an empty unlocking bytecode and sequence number of `0`. - 1: Spends index `0` of the empty hash outpoint, with locking bytecode set to `parse.bytecode`, unlocking bytecode `OP_1` (`0x51`) and sequence number `0`.\n- outputs: - 0: A locking bytecode of OP_RETURN (`0x6a`) and value of `0`.\n- locktime: `0`\n\nAfter input 1 of this NFT parsing transaction is evaluated, if the resulting stack is not valid (a single \"truthy\" element remaining on the stack) – or if the altstack is empty – parsing has failed and clients should represent the NFT as unable to be parsed (e.g. simply display the full `commitment` as a hex-encoded value in the user interface).\n\nOn successful parsing evaluations, the bottom item on the altstack indicates the type of the NFT according to the matching definition in `types`. If no match is found, clients should represent the NFT as unable to be parsed.\n\nFor example: `00d2517f7c6b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_1 OP_SPLIT OP_SWAP OP_TOALTSTACK OP_TOALTSTACK) splits the commitment after 1 byte, pushing the first byte to the altstack as an NFT type identifier and the remaining segment of the commitment as the first NFT field value.\n\nIf undefined (in a {@link SequentialNftCollection } ), this field could be considered to have a default value of `00d26b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_TOALTSTACK), which takes the full contents of the commitment as a fixed type index. As such, each index of the NFT category's `types` maps a precise commitment value to the metadata for NFTs with that particular commitment. E.g. an NFT with an empty commitment (VM number 0) maps to `types['']`, a commitment of `01` (hex) maps to `types['01']`, etc. This pattern is used for collections of sequential NFTs.", + "type": "string" + }, + "types": { + "additionalProperties": { + "$ref": "#/definitions/NftType", + "description": "A definitions for each type of NFT within the token category. Parsable NFT types are indexed by the hex-encoded value of the bottom altstack item following evaluation of `NftCategory.parse.bytecode`. The remaining altstack items are mapped to NFT fields according to the `fields` property of the matching NFT type." + }, + "description": "A mapping of hex-encoded values to definitions of possible NFT types in this category.", + "type": "object" + } + }, + "required": ["bytecode", "types"], + "type": "object" + }, + "RegistryTimestampKeyedValues": { + "additionalProperties": { + "$ref": "#/definitions/ChainSnapshot" + }, + "description": "A field keyed by timestamps to document the evolution of the field. Each timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nFor example, to insert a new value: ```ts const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; ```", + "type": "object" + }, + "RegistryTimestampKeyedValues": { + "additionalProperties": { + "$ref": "#/definitions/IdentitySnapshot" + }, + "description": "A field keyed by timestamps to document the evolution of the field. Each timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nFor example, to insert a new value: ```ts const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; ```", + "type": "object" + }, + "SequentialNftCollection": { + "additionalProperties": false, + "description": "Interpretation information for a collection of sequential NFTs, a collection in which each NFT includes only a sequential identifier within its on-chain commitment. Note that {@link SequentialNftCollection } s differ from {@link ParsableNftCollection } s in that sequential collections lack a parsing `bytecode` with which to inspect each NFT commitment: the type of each NFT is indexed by the full contents its commitment (interpreted as a positive VM integer in user interfaces).", + "properties": { + "types": { + "additionalProperties": { + "$ref": "#/definitions/NftType", + "description": "Interpretation information for each type of NFT within the token category, indexed by commitment hex. For sequential NFTs, the on-chain commitment of each NFT is interpreted as a VM number to reference its particular NFT type in user interfaces. Issuing a sequential NFT with a negative or invalid VM number is discouraged, but clients may render the commitment of such NFTs in hex-encoded form, prefixed with `X`." + }, + "description": "A mapping of each NFT commitment (typically, a positive integer encoded as a VM number) to metadata for that NFT type in this category.", + "type": "object" + } + }, + "required": ["types"], + "type": "object" + }, + "Tag": { + "additionalProperties": false, + "description": "Tags allow registries to classify and group identities by a variety of characteristics. Tags are standardized within a registry and may represent either labels applied by that registry or designations by external authorities (certification, membership, ownership, etc.) that are tracked by that registry.\n\nExamples of possible tags include: `individual`, `organization`, `token`, `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, `decentralized-exchange`, `liquidity-provider`, `sidechain`, `sidechain-bridge`, `acme-audited`, `acme-endorsed`, etc.\n\nTags may be used by clients in search, discovery, and filtering of identities, and they can also convey information like accreditation from investor protection organizations, public certifications by security or financial auditors, and other designations that signal integrity and value to users.", + "properties": { + "description": { + "description": "A string describing this tag for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `An identity maintained by a single individual.`\n- `An identity representing a type of token.`\n- `An on-chain application that has passed security audits by ACME, Inc.`", + "type": "string" + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of `Tag` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific." + }, + "name": { + "description": "The name of this tag for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g.:\n- `Individual`\n- `Token`\n- `Audited by ACME, Inc.`", + "type": "string" + }, + "uris": { + "$ref": "#/definitions/URIs", + "description": "A mapping of identifiers to URIs associated with this tag. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all tags:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`." + } + }, + "required": ["name"], + "type": "object" + }, + "TokenCategory": { + "additionalProperties": false, + "description": "A definition specifying information about an identity's token category.", + "properties": { + "category": { + "description": "The current token category used by this identity. Often, this will be equal to the identity's authbase, but some token identities must migrate to new categories for technical reasons.", + "type": "string" + }, + "decimals": { + "description": "An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this token category.\n\nThis is the number of digits that can appear after the decimal separator in fungible token amounts. For a token category with a `symbol` of `SYMBOL` and a `decimals` of `2`, a fungible token amount of `12345` should be displayed as `123.45 SYMBOL`.\n\nIf omitted, defaults to `0`.", + "type": "number" + }, + "nfts": { + "$ref": "#/definitions/NftCategory", + "description": "Display information for non-fungible tokens (NFTs) of this identity. Omitted for token categories without NFTs." + }, + "symbol": { + "description": "An abbreviation used to uniquely identity this token category.\n\nSymbols must be comprised only of capital letters, numbers, and dashes (`-`). This can be validated with the regular expression: `/^[-A-Z0-9]+$/`.", + "type": "string" + } + }, + "required": ["category", "symbol"], + "type": "object" + }, + "URIs": { + "additionalProperties": { + "type": "string" + }, + "description": "A mapping of identifiers to URIs associated with an entity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix – e.g. `https://` or `ipfs://`., Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.", + "type": "object" + } + } +} diff --git a/src/lib/schema/bcmr.spec.ts b/src/lib/schema/bcmr.spec.ts new file mode 100644 index 00000000..9302bd74 --- /dev/null +++ b/src/lib/schema/bcmr.spec.ts @@ -0,0 +1,14 @@ +import test from 'ava'; + +import type { MetadataRegistry } from '../lib.js'; +import { importMetadataRegistry } from '../lib.js'; + +test('importMetadataRegistry: accepts templates as either JSON strings or pre-parsed objects', (t) => { + const registry: MetadataRegistry = { + latestRevision: '', + registryIdentity: { name: '' }, + version: { major: 0, minor: 0, patch: 0 }, + }; + t.deepEqual(registry, importMetadataRegistry(registry)); + t.deepEqual(registry, importMetadataRegistry(JSON.stringify(registry))); +}); diff --git a/src/lib/schema/bcmr.ts b/src/lib/schema/bcmr.ts new file mode 100644 index 00000000..a0555157 --- /dev/null +++ b/src/lib/schema/bcmr.ts @@ -0,0 +1,34 @@ +import type { MetadataRegistry } from '../lib.js'; + +import { ajvStandaloneJsonParse } from './ajv/ajv-utils.js'; +// eslint-disable-next-line import/no-internal-modules +import walletTemplateValidator from './ajv/validate-bcmr.js'; + +/** + * Safely parse and validate a Bitcoin Cash Metadata Registry (BCMR), returning + * either an error message as a string or a valid {@link MetadataRegistry}. The + * registry may be provided either as an untrusted JSON string or as a + * pre-parsed object. + * + * This method validates both the structure and the contents of a registry: + * - All properties and sub-properties are verified to be of the expected type. + * - The registry contains no unknown properties. + * + * @param untrustedJsonOrObject - the JSON string or object to validate as + * metadata registry + */ +export const importMetadataRegistry = ( + untrustedJsonOrObject: unknown, +): MetadataRegistry | string => { + const errorPrefix = `Metadata Registry import failed:`; + const registry = ajvStandaloneJsonParse( + untrustedJsonOrObject, + walletTemplateValidator, + ); + if (typeof registry === 'string') { + return `${errorPrefix}${registry}`; + } + + // TODO: additional validation? + return registry; +}; diff --git a/src/lib/schema/fixtures/bcmr/bcmr.art-collection.json b/src/lib/schema/fixtures/bcmr/bcmr.art-collection.json new file mode 100644 index 00000000..5140f76a --- /dev/null +++ b/src/lib/schema/fixtures/bcmr/bcmr.art-collection.json @@ -0,0 +1,72 @@ +{ + "$schema": "https://cashtokens.org/bcmr-v2.schema.json", + "version": { "major": 1, "minor": 1, "patch": 0 }, + "latestRevision": "2023-04-14T00:00:17.720Z", + "registryIdentity": { + "name": "Example.com Token Registry", + "description": "An example registry demonstrating how the issuer of a non-fungible token (NFT) art collection might publish information about the collection.", + "uris": { + "icon": "https://example.com/registry-icon.svg", + "web": "https://example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json" + } + }, + "identities": { + "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c": { + "2023-01-13T00:00:00.000Z": { + "name": "Example NFT Collection", + "description": "This is a short description of the collection; in most interfaces, it will be hidden beyond 140 characters or the first newline character.\n\nThis sentence should be hidden in user interfaces with limited space.\n\nThis collection defines metadata for 3 sequential NFTs, Example #0 (XAMPLZ-0), Example #1 (XAMPLZ-1), and Example #2 (XAMPLZ-2). Note that the 'icon' for each NFT is published via IPFS, so clients may download each icon by querying IPFS or by using an IPFS HTTP Gateway.", + "token": { + "category": "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c", + "symbol": "XAMPLZ", + "nfts": { + "parse": { + "types": { + "": { + "name": "Example #0", + "description": "An NFT of this category with a zero-length on-chain commitment (VM number 0). Where appropriate, user interfaces may display the ticker symbol of NFTs matching this type as XAMPLZ-0.\n\nIn this example, the art represented by this NFT has a square aspect ratio and uses the SVG format, so the same URI can be used for both the 'icon' and 'image' URIs. For NFTs that represent art in raster formats other aspect ratios, the 'icon' URI should point to a 400px by 400px or SVG icon representing the NFT.", + "uris": { + "icon": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/0.svg", + "image": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/0.svg", + "web": "https://example.com/xamplz/0/details" + } + }, + "01": { + "name": "Example #1", + "description": "An NFT of this category with an on-chain commitment of 0x01 (VM number 1). Where appropriate, user interfaces may display the ticker symbol of NFTs matching this type as XAMPLZ-1.", + "uris": { + "icon": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/1.svg", + "image": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/1.svg", + "web": "https://example.com/xamplz/1/details", + "custom-uri-identifier": "protocol://data-for-some-protocol" + } + }, + "02": { + "name": "Example #2", + "description": "An NFT of this category with an on-chain commitment of 0x02 (VM number 2). Where appropriate, user interfaces may display the ticker symbol of NFTs matching this type as XAMPLZ-2.", + "uris": { + "icon": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/2.svg", + "image": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/2.svg", + "web": "https://example.com/another/path", + "another-uri-identifier": "protocol://data-for-that-protocol" + } + } + } + } + } + }, + "uris": { + "icon": "https://example.com/xamplz-icon.svg", + "web": "https://example.com/about-xamplz-nfts", + "blog": "https://blog.example.com/", + "chat": "https://chat.example.com/", + "forum": "https://forum.example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json", + "support": "https://support.example.com/", + "custom-uri-identifier": "protocol://connection-info-for-some-protocol" + } + } + } + }, + "license": "CC0-1.0" +} diff --git a/src/lib/schema/fixtures/bcmr/bcmr.decentralized-application.json b/src/lib/schema/fixtures/bcmr/bcmr.decentralized-application.json new file mode 100644 index 00000000..7595035e --- /dev/null +++ b/src/lib/schema/fixtures/bcmr/bcmr.decentralized-application.json @@ -0,0 +1,67 @@ +{ + "$schema": "https://cashtokens.org/bcmr-v2.schema.json", + "version": { "major": 1, "minor": 1, "patch": 0 }, + "latestRevision": "2023-04-14T00:00:17.720Z", + "registryIdentity": { + "name": "Example.com Token Registry", + "description": "An example demonstrating how a metadata registry might publish information about a decentralized application.", + "uris": { + "icon": "https://example.com/registry-icon.svg", + "web": "https://example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json" + } + }, + "identities": { + "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c": { + "2023-01-13T00:00:00.000Z": { + "name": "Crowdfunding Campaign: Example", + "description": "This is a short description of the decentralized application; in most interfaces, it will be hidden beyond 140 characters or the first newline character.\n\nThis sentence should be hidden in user interfaces with limited space.\n\nThis crowdfunding campaign instance has a distinct name and symbol (CFC2023XAMPL) to make it easily distinguishable from other crowdfunding campaigns published using the same contracts.\n\nThis application uses only one type of parsable NFT, 'Pledge Receipt's, so the 'parse.bytecode' (OP_0 OP_TOALTSTACK OP_0 OP_UTXOTOKENCOMMITMENT OP_TOALTSTACK) doesn't require any OP_IF/ENDIF branches; an empty altstack item is pushed to indicate the NFT type (''), and the remaining portion of the commitment is pushed as the only field (Pledge Value).", + "token": { + "category": "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c", + "symbol": "CFC2023XAMPL", + "nfts": { + "description": "Example Crowdfunding Campaign issues your wallet a receipt (NFT) when you make a pledge. Should you decide to cancel your pledge before the campaign completes, this receipt can be redeemed with the on-chain contract to receive a refund.", + "fields": { + "pledgeValue": { + "name": "Pledge Value", + "description": "The value pledged to the campaign in Bitcoin Cash.\n\nThis example demonstrates the additional capabilities of the 'number' encoding; clients are informed that pledge value can be aggregated (by addition) in views containing multiple NFTs to provide useful information to the user. For example, if the wallet holds two NFTs with Pledge Values of 123456 and 654321, the wallet can display a total of the user's pledges to this campaign: 0.00777777 BCH.", + "encoding": { + "type": "number", + "aggregate": "add", + "decimals": 8, + "unit": "BCH" + } + } + }, + "parse": { + "bytecode": "006b00cf6b", + "types": { + "": { + "name": "Pledge Receipt", + "description": "An NFT of this category with a zero-length on-chain commitment (VM number 0). Where appropriate, user interfaces may display the ticker symbol of NFTs matching this type as CFC2023XAMPL-0.\n\nPledge Receipts are the only type of NFT demonstrated in this example, and they contain only one field: pledgeValue.", + "fields": ["pledgeValue"], + "uris": { + "icon": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/0.svg", + "web": "https://example.com/campaign", + "custom-uri-identifier": "protocol://data-for-some-protocol" + } + } + } + } + } + }, + "uris": { + "icon": "https://example.com/campaign-icon.svg", + "web": "https://example.com/about-campaign", + "blog": "https://blog.example.com/", + "chat": "https://chat.example.com/", + "forum": "https://forum.example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json", + "support": "https://support.example.com/", + "custom-uri-identifier": "protocol://connection-info-for-some-protocol" + } + } + } + }, + "license": "CC0-1.0" +} diff --git a/src/lib/schema/fixtures/bcmr/bcmr.fungible-token.json b/src/lib/schema/fixtures/bcmr/bcmr.fungible-token.json new file mode 100644 index 00000000..2ff5a82e --- /dev/null +++ b/src/lib/schema/fixtures/bcmr/bcmr.fungible-token.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://cashtokens.org/bcmr-v2.schema.json", + "version": { "major": 1, "minor": 1, "patch": 0 }, + "latestRevision": "2023-04-14T00:00:17.720Z", + "registryIdentity": { + "name": "Example.com Token Registry", + "description": "An example registry demonstrating how the issuer of a single kind of fungible token might publish information about the token.", + "uris": { + "icon": "https://example.com/registry-icon.svg", + "web": "https://example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json" + } + }, + "identities": { + "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c": { + "2023-01-13T00:00:00.000Z": { + "name": "Example Asset", + "description": "This is a short description of Example Asset. In most interfaces, it will be hidden beyond 140 characters or the first newline character.\n\nThis sentence should be hidden in user interfaces with limited space.\n\nNote that this snapshot was introduced on 2023-1-13, but the 'migrated' property indicates that the migration took place over the following month. During that month, most clients should have warned users about the upcoming change, referring users to the 'migrate' URI for information about the change. (Some clients may also offer clients the option to dismiss the migration period and immediately show the new metadata.) At 0 UTC on 2023-2-13, all clients should have switched their default display for this token to use the new metadata, i.e. ticker symbol XAMPL, with 6 decimal places. After the migrated timestamp, old metadata should only be displayed when providing historical context.", + "token": { + "category": "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c", + "decimals": 6, + "symbol": "XAMPL" + }, + "migrated": "2023-02-13T00:00:00.000Z", + "uris": { + "icon": "https://example.com/xampl-icon.svg", + "web": "https://example.com/about-xampl", + "migrate": "https://blog.example.com/example-asset-is-now-XAMPL", + "blog": "https://blog.example.com/", + "chat": "https://chat.example.com/", + "forum": "https://forum.example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json", + "support": "https://support.example.com/", + "custom-uri-identifier": "protocol://connection-info-for-some-protocol" + } + }, + "2023-01-03T00:00:00.000Z": { + "name": "Example Asset", + "description": "This is a record of an older entry for the token identity. The token was rebranded (from EXAMPLE to XAMPL) and redenominated (from 8 to 6 decimals), but the existing token category was not modified: users were not required to trade their original EXAMPLE tokens for the redenominated XAMPL tokens, their wallets simply updated the way tokens are displayed using the new metadata. Note, this entry has likely been updated by the issuer to provide useful historical information rather than attempting to preserve the precise contents of the old snapshot; the 'web' URI links to a blog post about XAMPL's re-denomination/re-brand, and outdated URI information is excluded. There may have been metadata updates published between this snapshot and the latest snapshot, but they've been excluded because registries should strive to present a useful history of only meaningful changes to identities. This information can be used in user interfaces to improve continuity following metadata updates or to offer historical context.", + "token": { + "category": "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c", + "decimals": 8, + "symbol": "EXAMPLE" + }, + "uris": { + "icon": "https://example.com/old-example-asset-icon.png", + "web": "https://blog.example.com/example-asset-is-now-XAMPL" + } + } + } + }, + "license": "CC0-1.0" +} diff --git a/src/lib/schema/fixtures/bcmr/bcmr.payouts-or-dividends.json b/src/lib/schema/fixtures/bcmr/bcmr.payouts-or-dividends.json new file mode 100644 index 00000000..7e043da7 --- /dev/null +++ b/src/lib/schema/fixtures/bcmr/bcmr.payouts-or-dividends.json @@ -0,0 +1,75 @@ +{ + "$schema": "https://cashtokens.org/bcmr-v2.schema.json", + "version": { "major": 1, "minor": 1, "patch": 0 }, + "latestRevision": "2023-04-14T00:00:17.720Z", + "registryIdentity": { + "name": "Example.com Token Registry", + "description": "An example demonstrating how a registry might publish information about fungible tokens that receive on-chain payouts or dividends, either from off-chain activities (e.g. equity or debt instruments) or as part of an on-chain mechanism (e.g. payouts from a decentralized application or sidechain).\n\nDescriptions below are written from the perspective of a client reading this registry shortly after its 'lastRevision' timestamp on 2023-04-14.", + "uris": { + "icon": "https://example.com/registry-icon.svg", + "web": "https://example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json" + } + }, + "identities": { + "978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1": { + "2023-06-30T00:00:00.000Z": { + "name": "Example Payout Shares", + "description": "This is a description of Example Payout Shares. In most interfaces, it will be hidden beyond 140 characters or the first newline character.\n\nThis sentence should be hidden in user interfaces with limited space.\n\nThis asset entitles holders to on-chain payouts of some kind. For example, they may be shares of a company, interest-paying debt, or utility tokens of a decentralized application where holders have performed some service to the protocol (e.g. sidechain validation, liquidity provision, etc.).\n\nNote that this particular identity snapshot has not yet come into effect (assuming the client is reading the registry shortly after its 'lastRevision' timestamp on 2023-04-14); the next identity snapshot contains the current information for the identity. Instead, this snapshot indicates an update to the identity expected to happen in the future: a payout for 2023Q2, where token holders will trade in fungible tokens of the 2023Q2 category for a quarterly payout and receive an equivalent number of fungible tokens of the new, 2023Q3 category listed in this snapshot.", + "migrated": "2023-07-01T00:00:00.000Z", + "token": { + "category": "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c", + "decimals": 6, + "symbol": "XAMPL-23Q3" + }, + "uris": { + "icon": "https://example.com/asset-icon.svg", + "web": "https://example.com/", + "migrate": "https://app.example.com/payouts/2023Q2", + "blog": "https://blog.example.com/", + "chat": "https://chat.example.com/", + "forum": "https://forum.example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json", + "support": "https://support.example.com/", + "custom-uri-identifier": "protocol://connection-info-for-some-protocol" + } + }, + "2023-03-31T00:00:00.000Z": { + "name": "Example Payout Shares", + "description": "The current identity snapshot for this token identity (assuming the client is reading the registry shortly after its 'lastRevision' timestamp on 2023-04-14). Note that as of now, tokens of this category (b1a35ca...) should be listed by the client simply by base symbol: XAMPL. When the next snapshot's initial timestamp is reached (2023-06-30) their full symbol should be displayed, XAMPL-23Q2, as the latest category for this token identity will become XAMPL-23Q3 (89cad9...), and only tokens of that category should be referred to using the base symbol. Holders of XAMPL-23Q2 can refer to the 'migrate' URI in the next snapshot for information about acquiring the new XAMPL tokens (XAMPL-23Q3) and their 2nd quarterly payout by trading in their XAMPL-23Q2 fungible tokens.", + "migrated": "2023-04-01T00:00:00.000Z", + "token": { + "category": "b1a35cadd5ddb1bd18787eeb99ee061f34b946f0db375d84caadd8ab621c10f5", + "decimals": 6, + "symbol": "XAMPL-23Q2" + }, + "uris": { + "icon": "https://example.com/asset-icon.svg", + "web": "https://example.com/", + "migrate": "https://app.example.com/payouts/2023Q1", + "blog": "https://blog.example.com/", + "chat": "https://chat.example.com/", + "forum": "https://forum.example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json", + "support": "https://support.example.com/", + "custom-uri-identifier": "protocol://connection-info-for-some-protocol" + } + }, + "2022-12-31T00:00:00.000Z": { + "name": "Example Payout Shares (2023Q1)", + "description": "Payout shares for Example Protocol for the first quarter of 2023. These shares can be redeemed with the on-chain payout system to receive the payout and the new tokens for 2023Q2. See the linked website for details.\n\nExample note: this asset (XAMPL-23Q1, 978306...) will still be held in wallets that have not yet redeemed the 2023Q1 payout. Because the payout is held by an on-chain covenant, it's safe to delay redemption indefinitely, as funds (and the new, XAMPL-23Q2 tokens) will remain in the covenant until fully claimed by existing XAMPL-23Q1 holders. Some holders may leave XAMPL-23Q1 tokens in long-term vaults for many quarters before withdrawing, redeeming all payouts, and depositing the latest XAMPL tokens back in such vaults.", + "migrated": "2023-01-01T00:00:00.000Z", + "token": { + "category": "978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1", + "decimals": 6, + "symbol": "XAMPL-23Q1" + }, + "uris": { + "icon": "https://example.com/asset-icon-pending-payout.svg", + "web": "https://blog.example.com/payout-2023Q1" + } + } + } + }, + "license": "CC0-1.0" +} diff --git a/src/lib/schema/schema.ts b/src/lib/schema/schema.ts index 14f4ffdb..12cde3fa 100644 --- a/src/lib/schema/schema.ts +++ b/src/lib/schema/schema.ts @@ -1 +1,2 @@ -export * from './authentication-template.js'; +export * from './bcmr.js'; +export * from './wallet-template.js'; diff --git a/src/lib/schema/authentication-template.schema.json b/src/lib/schema/wallet-template.schema.json similarity index 87% rename from src/lib/schema/authentication-template.schema.json rename to src/lib/schema/wallet-template.schema.json index 282e3315..f2322cfb 100644 --- a/src/lib/schema/authentication-template.schema.json +++ b/src/lib/schema/wallet-template.schema.json @@ -1,24 +1,41 @@ { - "$ref": "#/definitions/AuthenticationTemplate", + "$ref": "#/definitions/WalletTemplate", "$schema": "http://json-schema.org/draft-07/schema#", "definitions": { - "AuthenticationTemplate": { + "AuthenticationVirtualMachineIdentifier": { + "description": "Allowable identifiers for authentication virtual machine versions. The `BCH` prefix identifies the Bitcoin Cash network, the `XEC` prefix identifies the eCash network, the `BSV` prefix identifies the Bitcoin SV network, and the `BTC` prefix identifies the Bitcoin Core network. VM versions are named according to the date they were deployed on the indicated network.\n\nFor each network prefix, a `_SPEC` VM version is reserved to indicate that the template requires a custom, not-yet-deployed VM version (e.g. one or more CHIPs). By convention, templates marked for `_SPEC` VMs should indicate their requirements in the template description. After deployment of the `_SPEC` VM, when template compatibility is verified, the template's `supported` array should be updated to indicate compatibility with the live VM version.", + "enum": [ + "BCH_2020_05", + "BCH_2021_05", + "BCH_2022_05", + "BCH_2023_05", + "BCH_SPEC", + "BSV_2020_02", + "BSV_SPEC", + "BTC_2017_08", + "BTC_SPEC", + "XEC_2020_05", + "XEC_SPEC" + ], + "type": "string" + }, + "WalletTemplate": { "additionalProperties": false, - "description": "An `AuthenticationTemplate` (A.K.A. `CashAssembly Template`) specifies a set of locking scripts, unlocking scripts, and other information required to use a certain authentication scheme. Templates fully describe wallets and protocols in a way that can be shared between software clients.", + "description": "A `WalletTemplate` specifies a set of locking scripts, unlocking scripts, and other information required to use a certain wallet protocol. Templates fully describe wallet protocols in a way that can be shared between software clients.", "properties": { "$schema": { - "description": "The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/authentication-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.", + "description": "The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/wallet-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.", "type": "string" }, "description": { - "description": "An optionally multi-line, free-form, human-readable description for this authentication template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.", + "description": "An optionally multi-line, free-form, human-readable description for this wallet template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.\n\nDescriptions have no length limit, but in user interfaces with limited space, they should be hidden beyond the first newline character or `140` characters until revealed by the user (e.g. by hiding the remaining description until the user activates a \"show more\" link).", "type": "string" }, "entities": { "additionalProperties": { - "$ref": "#/definitions/AuthenticationTemplateEntity" + "$ref": "#/definitions/WalletTemplateEntity" }, - "description": "A map of entities defined in this authentication template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.", + "description": "A map of entities defined in this wallet template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.", "type": "object" }, "name": { @@ -27,29 +44,29 @@ }, "scenarios": { "additionalProperties": { - "$ref": "#/definitions/AuthenticationTemplateScenario" + "$ref": "#/definitions/WalletTemplateScenario" }, - "description": "A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for authentication templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.", + "description": "A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for wallet templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.", "type": "object" }, "scripts": { "additionalProperties": { "anyOf": [ { - "$ref": "#/definitions/AuthenticationTemplateScript" + "$ref": "#/definitions/WalletTemplateScript" }, { - "$ref": "#/definitions/AuthenticationTemplateScriptLocking" + "$ref": "#/definitions/WalletTemplateScriptLocking" }, { - "$ref": "#/definitions/AuthenticationTemplateScriptTested" + "$ref": "#/definitions/WalletTemplateScriptTested" }, { - "$ref": "#/definitions/AuthenticationTemplateScriptUnlocking" + "$ref": "#/definitions/WalletTemplateScriptUnlocking" } ] }, - "description": "A map of scripts used in this authentication template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.", + "description": "A map of scripts used in this wallet template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.", "type": "object" }, "supported": { @@ -61,36 +78,35 @@ }, "version": { "const": 0, - "description": "A number identifying the format of this AuthenticationTemplate. Currently, this implementation requires `version` be set to `0`.", + "description": "A number identifying the format of this WalletTemplate. Currently, this implementation requires `version` be set to `0`.", "type": "number" } }, "required": ["entities", "scripts", "supported", "version"], "type": "object" }, - "AuthenticationTemplateAddressData": { + "WalletTemplateAddressData": { "additionalProperties": false, "properties": { "description": { - "description": "A single-line, human readable description for this address data.", + "description": "A single-line, human readable description for this variable (for use in user interfaces).", "type": "string" }, "name": { - "description": "A single-line, Title Case, human-readable name for this address data.", + "description": "A single-line, Title Case, human-readable name for this variable (for use in user interfaces).", "type": "string" }, "type": { "const": "AddressData", - "description": "`AddressData` is the most low-level variable type. It must be collected and stored each time a script is generated (usually, a locking script). `AddressData` can include any type of data, and can be used in any way.\n\nFor more persistent data, use `WalletData`.", "type": "string" } }, "required": ["type"], "type": "object" }, - "AuthenticationTemplateEntity": { + "WalletTemplateEntity": { "additionalProperties": false, - "description": "An object describing the configuration for a particular entity within an authentication template.", + "description": "An object describing the configuration for a particular entity within an wallet template.", "properties": { "description": { "description": "An optionally multi-line, free-form, human-readable description for this entity (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.", @@ -109,7 +125,7 @@ }, "variables": { "additionalProperties": { - "$ref": "#/definitions/AuthenticationTemplateVariable" + "$ref": "#/definitions/WalletTemplateVariable" }, "description": "A map of variables that must be provided by this entity for use in the template's scripts. Some variables are required before locking script generation, while some variables can or must be resolved only before unlocking script generation.\n\nObject keys are used as variable identifiers, and by convention, should use `snake_case`.", "type": "object" @@ -117,7 +133,7 @@ }, "type": "object" }, - "AuthenticationTemplateHdKey": { + "WalletTemplateHdKey": { "additionalProperties": false, "properties": { "addressOffset": { @@ -125,7 +141,7 @@ "type": "number" }, "description": { - "description": "A single-line, human readable description for this HD key.", + "description": "A single-line, human readable description for this variable (for use in user interfaces).", "type": "string" }, "hdPublicKeyDerivationPath": { @@ -133,9 +149,13 @@ "type": "string" }, "name": { - "description": "A single-line, Title Case, human-readable name for this HD key.", + "description": "A single-line, Title Case, human-readable name for this variable (for use in user interfaces).", "type": "string" }, + "neverSignTwice": { + "description": "If set to `true`, indicates that this key should never be used to sign two different messages.\n\nThis is useful for contracts that use zero-confirmation escrow systems to guarantee against double-spend attempts. By indicating that the user could be subjected to losses if a key were used in multiple signatures, templates can ensure that wallet implementations apply appropriate safeguards around use of the key.\n\nDefaults to `false`.", + "type": "boolean" + }, "privateDerivationPath": { "description": "The derivation path used to derive this `HdKey` from the owning entity's HD private key. By default, `m/i`.\n\nThis path uses the notation specified in BIP32 and the `i` character to represent the location of the `addressIndex`:\n\nThe first character must be `m` (private derivation), followed by sets of `/` and a number representing the child index used in the derivation at that depth. Hardened derivation is represented by a trailing `'`, and hardened child indexes are represented with the hardened index offset (`2147483648`) subtracted. The `i` character is replaced with the value of `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is followed by `'`, the hardened index offset is added (`2147483648`) and hardened derivation is used.\n\nFor example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in the following order:\n\n`derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)`\n\nBecause hardened derivation requires knowledge of the private key, `HdKey` variables with `derivationPath`s that include hardened derivation cannot use HD public derivation (the `hdPublicKeys` property in `CompilationData`). Instead, compilation requires the respective HD private key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public key (`CompilationData.hdKeys.derivedPublicKeys`).", "type": "string" @@ -146,39 +166,41 @@ }, "type": { "const": "HdKey", - "description": "The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key generation and mapping in a standard way. For greater control, use `Key`.", "type": "string" } }, "required": ["type"], "type": "object" }, - "AuthenticationTemplateKey": { + "WalletTemplateKey": { "additionalProperties": false, "properties": { "description": { - "description": "A single-line, human readable description for this key.", + "description": "A single-line, human readable description for this variable (for use in user interfaces).", "type": "string" }, "name": { - "description": "A single-line, Title Case, human-readable name for this key.", + "description": "A single-line, Title Case, human-readable name for this variable (for use in user interfaces).", "type": "string" }, + "neverSignTwice": { + "description": "If set to `true`, indicates that this key should never be used to sign two different messages.\n\nThis is useful for contracts that use zero-confirmation escrow systems to guarantee against double-spend attempts. By indicating that the user could be subjected to losses if a key were used in multiple signatures, templates can ensure that wallet implementations apply appropriate safeguards around use of the key.\n\nDefaults to `false`.", + "type": "boolean" + }, "type": { "const": "Key", - "description": "The `Key` type provides fine-grained control over key generation and mapping. Most templates should instead use `HdKey`.\n\nAny HD (Hierarchical-Deterministic) derivation must be completed outside of the templating system and provided at the time of use.", "type": "string" } }, "required": ["type"], "type": "object" }, - "AuthenticationTemplateScenario": { + "WalletTemplateScenario": { "additionalProperties": false, - "description": "An object describing the configuration for a particular scenario within an authentication template.", + "description": "An object describing the configuration for a particular scenario within an wallet template.", "properties": { "data": { - "$ref": "#/definitions/AuthenticationTemplateScenarioData", + "$ref": "#/definitions/WalletTemplateScenarioData", "description": "An object defining the data to use while compiling this scenario. The properties specified here are used to extend the existing scenario data based on this scenario's `extends` property.\n\nEach property is extended individually – to unset a previously-set property, the property must be individually overridden in this object." }, "description": { @@ -196,7 +218,7 @@ "sourceOutputs": { "description": "The list of source outputs (a.k.a. UTXOs) to use when generating the compilation context for this scenario.\n\nThe `sourceOutputs` property must have the same length as `transaction.inputs`, and each source output must be ordered to match the index of the input that spends it.\n\nTo be valid the `sourceOutputs` property must have exactly one source output with `lockingBytecode` set to `[\"slot\"]` – the output at the same index as the `[\"slot\"]` input in `transaction.inputs`.\n\nIf undefined, defaults to `[{ \"lockingBytecode\": [\"slot\"] }]`.", "items": { - "$ref": "#/definitions/AuthenticationTemplateScenarioSourceOutput" + "$ref": "#/definitions/WalletTemplateScenarioSourceOutput" }, "type": "array" }, @@ -207,7 +229,7 @@ "inputs": { "description": "The list of inputs to use when generating the transaction for this scenario.\n\nTo be valid the `inputs` property must have exactly one input with `unlockingBytecode` set to `[\"slot\"]`. This is the input in which the unlocking script under test will be placed.\n\nIf undefined, inherits the default scenario `inputs` value: `[{ \"unlockingBytecode\": [\"slot\"] }]`.", "items": { - "$ref": "#/definitions/AuthenticationTemplateScenarioInput" + "$ref": "#/definitions/WalletTemplateScenarioInput" }, "type": "array" }, @@ -218,7 +240,7 @@ "outputs": { "description": "The list of outputs to use when generating the transaction for this scenario.\n\nIf undefined, defaults to `[{ \"lockingBytecode\": {} }]`.", "items": { - "$ref": "#/definitions/AuthenticationTemplateScenarioTransactionOutput" + "$ref": "#/definitions/WalletTemplateScenarioTransactionOutput" }, "type": "array" }, @@ -232,7 +254,7 @@ }, "type": "object" }, - "AuthenticationTemplateScenarioBytecode": { + "WalletTemplateScenarioBytecode": { "anyOf": [ { "type": "string" @@ -241,7 +263,7 @@ "additionalProperties": false, "properties": { "overrides": { - "$ref": "#/definitions/AuthenticationTemplateScenarioData", + "$ref": "#/definitions/WalletTemplateScenarioData", "description": "Scenario data that extends the scenario's top-level `data` during script compilation.\n\nEach property is extended individually – to modify a property set by the top-level scenario `data`, the new value must be listed here.\n\nDefaults to `{}` for `sourceOutputs` and `transaction.inputs`; defaults to `{ \"hdKeys\": { \"addressIndex\": 1 } }` for `transaction.outputs`." }, "script": { @@ -265,9 +287,9 @@ "type": "object" } ], - "description": "A type that describes the configuration for a particular locking or unlocking bytecode within an authentication template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: [\"copy\"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: [\"copy\"], overrides: { \"hdKeys\": { \"addressIndex\": 1 } } }`." + "description": "A type that describes the configuration for a particular locking or unlocking bytecode within a wallet template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: [\"copy\"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: [\"copy\"], overrides: { \"hdKeys\": { \"addressIndex\": 1 } } }`." }, - "AuthenticationTemplateScenarioData": { + "WalletTemplateScenarioData": { "additionalProperties": false, "description": "An object defining the data to use while compiling a scenario.", "properties": { @@ -328,9 +350,9 @@ }, "type": "object" }, - "AuthenticationTemplateScenarioInput": { + "WalletTemplateScenarioInput": { "additionalProperties": false, - "description": "An example input used to define a scenario for an authentication template.", + "description": "An example input used to define a scenario for a wallet template.", "properties": { "outpointIndex": { "description": "The index of the output in the transaction from which this input is spent.\n\nIf undefined, this defaults to the same index as the input itself (so that by default, every outpoint in the produced transaction is different, even if an empty `outpointTransactionHash` is used for each transaction).", @@ -347,7 +369,7 @@ "unlockingBytecode": { "anyOf": [ { - "$ref": "#/definitions/AuthenticationTemplateScenarioBytecode" + "$ref": "#/definitions/WalletTemplateScenarioBytecode" }, { "items": { @@ -359,17 +381,17 @@ "type": "array" } ], - "description": "The `unlockingBytecode` value of this input for this scenario. This must be either `[\"slot\"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `AuthenticationTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `[\"slot\"]` for exactly one input in the scenario.\n\nDefaults to `[\"slot\"]`." + "description": "The `unlockingBytecode` value of this input for this scenario. This must be either `[\"slot\"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `WalletTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `[\"slot\"]` for exactly one input in the scenario.\n\nDefaults to `[\"slot\"]`." } }, "type": "object" }, - "AuthenticationTemplateScenarioOutput": { + "WalletTemplateScenarioOutput": { "additionalProperties": false, - "description": "An example output used to define a scenario for an authentication template.", + "description": "An example output used to define a scenario for a wallet template.", "properties": { "lockingBytecode": { - "$ref": "#/definitions/AuthenticationTemplateScenarioBytecode", + "$ref": "#/definitions/WalletTemplateScenarioBytecode", "description": "The locking bytecode used to encumber this output.\n\n`lockingBytecode` values may be provided as a hexadecimal-encoded string or as an object describing the required compilation. If undefined, defaults to `{}`, which uses the default values for `script` and `overrides`, respectively.\n\nOnly source outputs may specify a `lockingBytecode` of `[\"slot\"]`; this identifies the source output in which the locking script under test will be placed. (To be valid, every scenario's `sourceOutputs` property must have exactly one source output slot and one input slot at the same index.)" }, "token": { @@ -410,14 +432,14 @@ }, "type": "object" }, - "AuthenticationTemplateScenarioOutput": { + "WalletTemplateScenarioOutput": { "additionalProperties": false, - "description": "An example output used to define a scenario for an authentication template.", + "description": "An example output used to define a scenario for a wallet template.", "properties": { "lockingBytecode": { "anyOf": [ { - "$ref": "#/definitions/AuthenticationTemplateScenarioBytecode" + "$ref": "#/definitions/WalletTemplateScenarioBytecode" }, { "items": { @@ -469,17 +491,17 @@ }, "type": "object" }, - "AuthenticationTemplateScenarioSourceOutput": { - "$ref": "#/definitions/AuthenticationTemplateScenarioOutput", - "description": "A source output used by an authentication template scenario." + "WalletTemplateScenarioSourceOutput": { + "$ref": "#/definitions/WalletTemplateScenarioOutput", + "description": "A source output used by a wallet template scenario." }, - "AuthenticationTemplateScenarioTransactionOutput": { - "$ref": "#/definitions/AuthenticationTemplateScenarioOutput", - "description": "A transaction output used to define an authentication template scenario transaction." + "WalletTemplateScenarioTransactionOutput": { + "$ref": "#/definitions/WalletTemplateScenarioOutput", + "description": "A transaction output used to define a wallet template scenario transaction." }, - "AuthenticationTemplateScript": { + "WalletTemplateScript": { "additionalProperties": false, - "description": "An object describing the configuration for a particular script within an authentication template.", + "description": "An object describing the configuration for a particular script within an wallet template.", "properties": { "name": { "description": "A single-line, human-readable name for this script (for use in user interfaces).", @@ -493,7 +515,7 @@ "required": ["script"], "type": "object" }, - "AuthenticationTemplateScriptLocking": { + "WalletTemplateScriptLocking": { "additionalProperties": false, "properties": { "lockingType": { @@ -513,7 +535,7 @@ "required": ["lockingType", "script"], "type": "object" }, - "AuthenticationTemplateScriptTest": { + "WalletTemplateScriptTest": { "additionalProperties": false, "properties": { "check": { @@ -553,7 +575,7 @@ "required": ["check"], "type": "object" }, - "AuthenticationTemplateScriptTested": { + "WalletTemplateScriptTested": { "additionalProperties": false, "properties": { "name": { @@ -570,7 +592,7 @@ }, "tests": { "additionalProperties": { - "$ref": "#/definitions/AuthenticationTemplateScriptTest" + "$ref": "#/definitions/WalletTemplateScriptTest" }, "description": "One or more tests that can be used during development and during template validation to confirm the correctness of this tested script.", "type": "object" @@ -579,7 +601,7 @@ "required": ["script", "tests"], "type": "object" }, - "AuthenticationTemplateScriptUnlocking": { + "WalletTemplateScriptUnlocking": { "additionalProperties": false, "properties": { "ageLock": { @@ -587,7 +609,7 @@ "type": "string" }, "estimate": { - "description": "The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it's possible for wallet software to compute an \"estimated transaction\", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction's change output(s). Because estimate scenarios provide \"estimated\" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `AuthenticationTemplateScenario.extends` for details.", + "description": "The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it's possible for wallet software to compute an \"estimated transaction\", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction's change output(s). Because estimate scenarios provide \"estimated\" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `WalletTemplateScenario.extends` for details.", "type": "string" }, "fails": { @@ -632,58 +654,40 @@ "required": ["script", "unlocks"], "type": "object" }, - "AuthenticationTemplateVariable": { + "WalletTemplateVariable": { "anyOf": [ { - "$ref": "#/definitions/AuthenticationTemplateAddressData" + "$ref": "#/definitions/WalletTemplateAddressData" }, { - "$ref": "#/definitions/AuthenticationTemplateHdKey" + "$ref": "#/definitions/WalletTemplateHdKey" }, { - "$ref": "#/definitions/AuthenticationTemplateKey" + "$ref": "#/definitions/WalletTemplateKey" }, { - "$ref": "#/definitions/AuthenticationTemplateWalletData" + "$ref": "#/definitions/WalletTemplateWalletData" } ] }, - "AuthenticationTemplateWalletData": { + "WalletTemplateWalletData": { "additionalProperties": false, "properties": { "description": { - "description": "A single-line, human readable description for this wallet data.", + "description": "A single-line, human readable description for this variable (for use in user interfaces).", "type": "string" }, "name": { - "description": "A single-line, Title Case, human-readable name for this wallet data.", + "description": "A single-line, Title Case, human-readable name for this variable (for use in user interfaces).", "type": "string" }, "type": { "const": "WalletData", - "description": "The `WalletData` type provides a static piece of data that should be collected once and stored at the time of wallet creation. `WalletData` should be persistent for the life of the wallet, rather than changing from locking script to locking script.\n\nFor address-specific data, use `AddressData`.", "type": "string" } }, "required": ["type"], "type": "object" - }, - "AuthenticationVirtualMachineIdentifier": { - "description": "Allowable identifiers for authentication virtual machine versions. The `BCH` prefix identifies the Bitcoin Cash network, the `XEC` prefix identifies the eCash network, the `BSV` prefix identifies the Bitcoin SV network, and the `BTC` prefix identifies the Bitcoin Core network. VM versions are named according to the date they were deployed on the indicated network.\n\nFor each network prefix, a `_SPEC` VM version is reserved to indicate that the template requires a custom, not-yet-deployed VM version (e.g. one or more CHIPs). By convention, templates marked for `_SPEC` VMs should indicate their requirements in the template description. After deployment of the `_SPEC` VM, when template compatibility is verified, the template's `supported` array should be updated to indicate compatibility with the live VM version.", - "enum": [ - "BCH_2020_05", - "BCH_2021_05", - "BCH_2022_05", - "BCH_2023_05", - "BCH_SPEC", - "BSV_2020_02", - "BSV_SPEC", - "BTC_2017_08", - "BTC_SPEC", - "XEC_2020_05", - "XEC_SPEC" - ], - "type": "string" } } } diff --git a/src/lib/schema/authentication-template.spec.ts b/src/lib/schema/wallet-template.spec.ts similarity index 88% rename from src/lib/schema/authentication-template.spec.ts rename to src/lib/schema/wallet-template.spec.ts index dc84f682..8480a1b9 100644 --- a/src/lib/schema/authentication-template.spec.ts +++ b/src/lib/schema/wallet-template.spec.ts @@ -1,60 +1,56 @@ /* eslint-disable max-lines */ import test from 'ava'; -import type { AuthenticationTemplate } from '../lib.js'; -import { - BuiltInVariables, - importAuthenticationTemplate, - stringify, -} from '../lib.js'; +import type { WalletTemplate } from '../lib.js'; +import { BuiltInVariables, importWalletTemplate, stringify } from '../lib.js'; -test('importAuthenticationTemplate: accepts templates as either JSON strings or pre-parsed objects', (t) => { - const template: AuthenticationTemplate = { +test('importWalletTemplate: accepts templates as either JSON strings or pre-parsed objects', (t) => { + const template: WalletTemplate = { entities: {}, scripts: { a: { script: '' } }, supported: ['BCH_2022_05'], version: 0, }; - t.deepEqual(template, importAuthenticationTemplate(template)); - t.deepEqual(template, importAuthenticationTemplate(JSON.stringify(template))); + t.deepEqual(template, importWalletTemplate(template)); + t.deepEqual(template, importWalletTemplate(JSON.stringify(template))); }); const testValidation = test.macro< - [unknown, ReturnType] + [unknown, ReturnType] >({ exec: (t, input, expected) => { - const result = importAuthenticationTemplate(input); + const result = importWalletTemplate(input); t.deepEqual(result, expected, stringify(result)); }, - title: (title) => `importAuthenticationTemplate: ${title ?? '?'}`, + title: (title) => `importWalletTemplate: ${title ?? '?'}`, }); test.failing( 'must be an object', testValidation, 'a string', - 'A valid authentication template must be an object.' + 'A valid wallet template must be an object.', ); test.failing( 'must be version 0', testValidation, { version: 1 }, - 'Only version 0 authentication templates are currently supported.' + 'Only version 0 wallet templates are currently supported.', ); test.failing( 'must provide a "supported" property', testValidation, { supported: 42, version: 0 }, - 'Version 0 authentication templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.' + 'Version 0 wallet templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.', ); test.failing( 'must use only known virtual machine identifiers in "supported"', testValidation, { supported: ['not supported'], version: 0 }, - 'Version 0 authentication templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.' + 'Version 0 wallet templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.', ); test.failing( @@ -62,42 +58,42 @@ test.failing( testValidation, // eslint-disable-next-line no-sparse-arrays { supported: ['BCH_2020_05', , 'BCH_2020_11_SPEC'], version: 0 }, - 'Version 0 authentication templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.' + 'Version 0 wallet templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.', ); test.failing( '"$schema" must be a string (if present)', testValidation, { $schema: 42, supported: ['BCH_SPEC'], version: 0 }, - 'The "$schema" property of an authentication template must be a string.' + 'The "$schema" property of a wallet template must be a string.', ); test.failing( '"name" must be a string (if present)', testValidation, { name: 42, supported: ['BCH_SPEC'], version: 0 }, - 'The "name" property of an authentication template must be a string.' + 'The "name" property of a wallet template must be a string.', ); test.failing( '"description" must be a string (if present)', testValidation, { description: 42, supported: ['BCH_SPEC'], version: 0 }, - 'The "description" property of an authentication template must be a string.' + 'The "description" property of a wallet template must be a string.', ); test.failing( '"entities" must be a an object', testValidation, { entities: 42, scripts: {}, supported: ['BCH_SPEC'], version: 0 }, - 'The "entities" property of an authentication template must be an object.' + 'The "entities" property of a wallet template must be an object.', ); test.failing( '"scripts" must be a an object', testValidation, { entities: {}, scripts: 42, supported: ['BCH_SPEC'], version: 0 }, - 'The "scripts" property of an authentication template must be an object.' + 'The "scripts" property of a wallet template must be an object.', ); test.failing( @@ -110,7 +106,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "scenarios" property of an authentication template must be an object.' + 'If defined, the "scenarios" property of a wallet template must be an object.', ); test.failing( @@ -123,7 +119,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'All authentication template scripts must be objects, but the following scripts are not objects: "a".' + 'All wallet template scripts must be objects, but the following scripts are not objects: "a".', ); test.failing( @@ -136,7 +132,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "script" property of script "a" must be a string.' + 'The "script" property of script "a" must be a string.', ); test.failing( @@ -149,7 +145,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "script" property of unlocking script "a" must be a string.' + 'The "script" property of unlocking script "a" must be a string.', ); test.failing( @@ -162,7 +158,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "unlocks" property of unlocking script "a" must be a string.' + 'The "unlocks" property of unlocking script "a" must be a string.', ); test.failing( @@ -175,7 +171,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The following locking scripts (referenced in "unlocks" properties) were not provided: "b".' + 'The following locking scripts (referenced in "unlocks" properties) were not provided: "b".', ); test.failing( @@ -191,7 +187,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "timeLockType" property of unlocking script "a" must be either "timestamp" or "height".' + 'If defined, the "timeLockType" property of unlocking script "a" must be either "timestamp" or "height".', ); test.failing( @@ -207,7 +203,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of unlocking script "a" must be a string.' + 'If defined, the "name" property of unlocking script "a" must be a string.', ); test.failing( @@ -223,7 +219,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "ageLock" property of unlocking script "a" must be a string.' + 'If defined, the "ageLock" property of unlocking script "a" must be a string.', ); test.failing( @@ -239,7 +235,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "estimate" property of unlocking script "a" must be a string.' + 'If defined, the "estimate" property of unlocking script "a" must be a string.', ); test.failing( @@ -255,7 +251,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "passes" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "passes" property of unlocking script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -271,7 +267,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "fails" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "fails" property of unlocking script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -287,7 +283,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "invalid" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "invalid" property of unlocking script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -304,7 +300,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "passes" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "passes" property of unlocking script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -320,7 +316,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "fails" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "fails" property of unlocking script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -336,7 +332,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "invalid" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "invalid" property of unlocking script "a" must be an array containing only scenario identifiers (strings).', ); test( @@ -361,7 +357,7 @@ test( }, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -374,7 +370,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "lockingType" property of locking script "b" must be either "standard" or "p2sh20".' + 'The "lockingType" property of locking script "b" must be either "standard" or "p2sh20".', ); test.failing( @@ -387,7 +383,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "script" property of locking script "b" must be a string.' + 'The "script" property of locking script "b" must be a string.', ); test.failing( @@ -403,7 +399,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of locking script "b" must be a string.' + 'If defined, the "name" property of locking script "b" must be a string.', ); test.failing( @@ -418,7 +414,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "script" property of tested script "a" must be a string.' + 'The "script" property of tested script "a" must be a string.', ); test.failing( @@ -433,7 +429,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of tested script "a" must be a string.' + 'If defined, the "name" property of tested script "a" must be a string.', ); test.failing( @@ -448,7 +444,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "tests" property of tested script "a" must be an array.' + 'If defined, the "tests" property of tested script "a" must be an array.', ); test.failing( @@ -463,7 +459,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "check" properties of all tests in tested script "a" must be a strings.' + 'The "check" properties of all tests in tested script "a" must be a strings.', ); test.failing( @@ -478,7 +474,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" properties of all tests in tested script "a" must be strings.' + 'If defined, the "name" properties of all tests in tested script "a" must be strings.', ); test.failing( @@ -493,7 +489,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "setup" properties of all tests in tested script "a" must be strings.' + 'If defined, the "setup" properties of all tests in tested script "a" must be strings.', ); test.failing( @@ -508,7 +504,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "passes" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "passes" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -523,7 +519,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "fails" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "fails" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -538,7 +534,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "invalid" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "invalid" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -553,7 +549,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "pushed" property of tested script "a" must be a boolean value.' + 'If defined, the "pushed" property of tested script "a" must be a boolean value.', ); test( @@ -610,7 +606,7 @@ test( }, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -626,7 +622,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'Locking and unlocking scripts may not have tests, but the following scripts include a "tests" property: "a", "b"' + 'Locking and unlocking scripts may not have tests, but the following scripts include a "tests" property: "a", "b"', ); test.failing( @@ -639,7 +635,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of script "a" must be a string.' + 'If defined, the "name" property of script "a" must be a string.', ); test.failing( @@ -652,7 +648,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'All authentication template entities must be objects, but the following entities are not objects: "e".' + 'All wallet template entities must be objects, but the following entities are not objects: "e".', ); test.failing( @@ -665,7 +661,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "description" property of entity "e" must be a string.' + 'If defined, the "description" property of entity "e" must be a string.', ); test.failing( @@ -678,7 +674,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of entity "e" must be a string.' + 'If defined, the "name" property of entity "e" must be a string.', ); test.failing( @@ -691,7 +687,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "scripts" property of entity "e" must be an array containing only script identifiers (strings).' + 'If defined, the "scripts" property of entity "e" must be an array containing only script identifiers (strings).', ); test.failing( @@ -705,7 +701,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "scripts" property of entity "e" must be an array containing only script identifiers (strings).' + 'If defined, the "scripts" property of entity "e" must be an array containing only script identifiers (strings).', ); test.failing( @@ -718,7 +714,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "variables" property of entity "e" must be an object.' + 'If defined, the "variables" property of entity "e" must be an object.', ); test.failing( @@ -731,7 +727,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'All authentication template variables must be objects, but the following variables owned by entity "e" are not objects: "v".' + 'All wallet template variables must be objects, but the following variables owned by entity "e" are not objects: "v".', ); test.failing( @@ -744,7 +740,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "type" property of variable "v" must be a valid authentication template variable type. Available types are: "AddressData", "HdKey", "Key", "WalletData".' + 'The "type" property of variable "v" must be a valid wallet template variable type. Available types are: "AddressData", "HdKey", "Key", "WalletData".', ); test.failing( @@ -759,7 +755,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "description" property of variable "v" must be a string.' + 'If defined, the "description" property of variable "v" must be a string.', ); test.failing( @@ -774,7 +770,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of variable "v" must be a string.' + 'If defined, the "name" property of variable "v" must be a string.', ); test.failing( @@ -789,7 +785,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "addressOffset" property of HdKey "v" must be a number.' + 'If defined, the "addressOffset" property of HdKey "v" must be a number.', ); test.failing( @@ -804,7 +800,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "hdPublicKeyDerivationPath" property of HdKey "v" must be a string.' + 'If defined, the "hdPublicKeyDerivationPath" property of HdKey "v" must be a string.', ); test.failing( @@ -819,7 +815,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "privateDerivationPath" property of HdKey "v" must be a string.' + 'If defined, the "privateDerivationPath" property of HdKey "v" must be a string.', ); test.failing( @@ -834,7 +830,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "publicDerivationPath" property of HdKey "v" must be a string.' + 'If defined, the "publicDerivationPath" property of HdKey "v" must be a string.', ); test.failing( @@ -849,7 +845,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "privateDerivationPath" property of HdKey "v" must be a valid private derivation path, but the provided value is "m". A valid path must begin with "m" and include only "/", "\'", a single "i" address index character, and numbers.' + 'If defined, the "privateDerivationPath" property of HdKey "v" must be a valid private derivation path, but the provided value is "m". A valid path must begin with "m" and include only "/", "\'", a single "i" address index character, and numbers.', ); test.failing( @@ -866,7 +862,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "hdPublicKeyDerivationPath" property of an HdKey must be a valid private derivation path for the HdKey\'s HD public node, but the provided value for HdKey "v" is "M/0". A valid path must begin with "m" and include only "/", "\'", and numbers (the "i" character cannot be used in "hdPublicKeyDerivationPath").' + 'If defined, the "hdPublicKeyDerivationPath" property of an HdKey must be a valid private derivation path for the HdKey\'s HD public node, but the provided value for HdKey "v" is "M/0". A valid path must begin with "m" and include only "/", "\'", and numbers (the "i" character cannot be used in "hdPublicKeyDerivationPath").', ); test.failing( @@ -883,7 +879,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "publicDerivationPath" property of HdKey "v" must be a valid public derivation path, but the current value is "m/0". Public derivation paths must begin with "M" and include only "/", a single "i" address index character, and numbers. If the "privateDerivationPath" uses hardened derivation, the "publicDerivationPath" should be set to enable public derivation from the "hdPublicKeyDerivationPath".' + 'The "publicDerivationPath" property of HdKey "v" must be a valid public derivation path, but the current value is "m/0". Public derivation paths must begin with "M" and include only "/", a single "i" address index character, and numbers. If the "privateDerivationPath" uses hardened derivation, the "publicDerivationPath" should be set to enable public derivation from the "hdPublicKeyDerivationPath".', ); test.failing( @@ -908,7 +904,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "privateDerivationPath" property of HdKey "v" is "m/2\'/i", but the implied private derivation path of "hdPublicKeyDerivationPath" and "publicDerivationPath" is "m/1\'/i". The "publicDerivationPath" property must be set to allow for public derivation of the same HD node derived by "privateDerivationPath" beginning from the HD public key derived at "hdPublicKeyDerivationPath".' + 'The "privateDerivationPath" property of HdKey "v" is "m/2\'/i", but the implied private derivation path of "hdPublicKeyDerivationPath" and "publicDerivationPath" is "m/1\'/i". The "publicDerivationPath" property must be set to allow for public derivation of the same HD node derived by "privateDerivationPath" beginning from the HD public key derived at "hdPublicKeyDerivationPath".', ); test( @@ -927,7 +923,7 @@ test( scripts: { a: { script: '' } }, supported: ['BCH_SPEC'], version: 0, - } + }, ); test( @@ -970,7 +966,7 @@ test( scripts: { a: { script: '' } }, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -983,7 +979,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'All authentication template scenarios must be objects, but the following scenarios are not objects: "a".' + 'All wallet template scenarios must be objects, but the following scenarios are not objects: "a".', ); test.failing( @@ -996,7 +992,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of scenario "a" must be a string.' + 'If defined, the "name" property of scenario "a" must be a string.', ); test.failing( @@ -1009,7 +1005,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "description" property of scenario "a" must be a string.' + 'If defined, the "description" property of scenario "a" must be a string.', ); test.failing( @@ -1022,7 +1018,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "extends" property of scenario "a" must be a string.' + 'If defined, the "extends" property of scenario "a" must be a string.', ); test.failing( @@ -1035,7 +1031,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, each scenario ID referenced by another scenario\'s "extends" property must exist. Unknown scenario IDs: "c", "d".' + 'If defined, each scenario ID referenced by another scenario\'s "extends" property must exist. Unknown scenario IDs: "c", "d".', ); test.failing( @@ -1048,7 +1044,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).' + 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).', ); test.failing( @@ -1061,7 +1057,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).' + 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).', ); test.failing( @@ -1074,7 +1070,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).' + 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).', ); test( @@ -1097,7 +1093,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1110,7 +1106,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data" property of scenario "a" must be an object.' + 'If defined, the "data" property of scenario "a" must be an object.', ); test( @@ -1129,7 +1125,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1142,7 +1138,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.bytecode" property of scenario "a" must be an object, and each value must be a string.' + 'If defined, the "data.bytecode" property of scenario "a" must be an object, and each value must be a string.', ); test( @@ -1161,7 +1157,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1174,7 +1170,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).' + 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).', ); test.failing( @@ -1187,7 +1183,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).' + 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).', ); test.failing( @@ -1200,7 +1196,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).' + 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).', ); test.failing( @@ -1213,7 +1209,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).' + 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).', ); test( @@ -1232,7 +1228,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1245,7 +1241,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "currentBlockTime" property of scenario "a" must be a positive integer from 500,000,000 to 4,294,967,295 (inclusive).' + 'If defined, the "currentBlockTime" property of scenario "a" must be a positive integer from 500,000,000 to 4,294,967,295 (inclusive).', ); test( @@ -1264,7 +1260,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1277,7 +1273,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys" property of scenario "a" must be an object.' + 'If defined, the "data.hdKeys" property of scenario "a" must be an object.', ); test.failing( @@ -1290,7 +1286,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).' + 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).', ); test.failing( @@ -1303,7 +1299,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).' + 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).', ); test.failing( @@ -1316,7 +1312,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).' + 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).', ); test.failing( @@ -1329,7 +1325,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).' + 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).', ); test.failing( @@ -1342,7 +1338,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.hdPublicKeys" property of scenario "a" must be an object, and each value must be a string.' + 'If defined, the "data.hdKeys.hdPublicKeys" property of scenario "a" must be an object, and each value must be a string.', ); test.failing( @@ -1355,7 +1351,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.hdPublicKeys" property of scenario "a" must be an object, and each value must be a string.' + 'If defined, the "data.hdKeys.hdPublicKeys" property of scenario "a" must be an object, and each value must be a string.', ); test.failing( @@ -1368,7 +1364,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.hdPrivateKeys" property of scenario "a" must be an object, and each value must be a string.' + 'If defined, the "data.hdKeys.hdPrivateKeys" property of scenario "a" must be an object, and each value must be a string.', ); test.failing( @@ -1381,7 +1377,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.hdPrivateKeys" property of scenario "a" must be an object, and each value must be a string.' + 'If defined, the "data.hdKeys.hdPrivateKeys" property of scenario "a" must be an object, and each value must be a string.', ); test( @@ -1426,7 +1422,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1439,7 +1435,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.keys" property of scenario "a" must be an object.' + 'If defined, the "data.keys" property of scenario "a" must be an object.', ); test( @@ -1458,7 +1454,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1471,7 +1467,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.keys.privateKeys" property of scenario "a" must be an object, and each value must be a 32-byte, hexadecimal-encoded private key.' + 'If defined, the "data.keys.privateKeys" property of scenario "a" must be an object, and each value must be a 32-byte, hexadecimal-encoded private key.', ); test.failing( @@ -1484,7 +1480,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.keys.privateKeys" property of scenario "a" must be an object, and each value must be a 32-byte, hexadecimal-encoded private key.' + 'If defined, the "data.keys.privateKeys" property of scenario "a" must be an object, and each value must be a 32-byte, hexadecimal-encoded private key.', ); test( @@ -1523,7 +1519,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1536,7 +1532,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "transaction" property of scenario "a" must be an object.' + 'If defined, the "transaction" property of scenario "a" must be an object.', ); test( @@ -1555,7 +1551,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1568,7 +1564,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "locktime" property of scenario "a" must be an integer between 0 and 4,294,967,295 (inclusive).' + 'If defined, the "locktime" property of scenario "a" must be an integer between 0 and 4,294,967,295 (inclusive).', ); test( @@ -1587,7 +1583,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1600,7 +1596,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "version" property of scenario "a" must be an integer between 0 and 4,294,967,295 (inclusive).' + 'If defined, the "version" property of scenario "a" must be an integer between 0 and 4,294,967,295 (inclusive).', ); test( @@ -1619,7 +1615,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1632,7 +1628,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "transaction.inputs" array of scenario "a" must have exactly one input under test (an "unlockingBytecode" set to "null").' + 'If defined, the "transaction.inputs" array of scenario "a" must have exactly one input under test (an "unlockingBytecode" set to "null").', ); test.failing( @@ -1648,7 +1644,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "transaction.inputs" property of scenario "a" must be an array of scenario input objects.' + 'If defined, the "transaction.inputs" property of scenario "a" must be an array of scenario input objects.', ); test.failing( @@ -1667,7 +1663,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "outpointIndex" property of input 0 in scenario "a" must be a positive integer.' + 'If defined, the "outpointIndex" property of input 0 in scenario "a" must be a positive integer.', ); test.failing( @@ -1686,7 +1682,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "outpointTransactionHash" property of input 0 in scenario "a" must be a 32-byte, hexadecimal-encoded hash (string).' + 'If defined, the "outpointTransactionHash" property of input 0 in scenario "a" must be a 32-byte, hexadecimal-encoded hash (string).', ); test.failing( @@ -1707,7 +1703,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "outpointTransactionHash" property of input 0 in scenario "a" must be a 32-byte, hexadecimal-encoded hash (string).' + 'If defined, the "outpointTransactionHash" property of input 0 in scenario "a" must be a 32-byte, hexadecimal-encoded hash (string).', ); test.failing( @@ -1726,7 +1722,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "sequenceNumber" property of input 0 in scenario "a" must be a number between 0 and 4294967295 (inclusive).' + 'If defined, the "sequenceNumber" property of input 0 in scenario "a" must be a number between 0 and 4294967295 (inclusive).', ); test.failing( @@ -1745,7 +1741,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "unlockingBytecode" property of input 0 in scenario "a" must be either a null value or a hexadecimal-encoded string.' + 'If defined, the "unlockingBytecode" property of input 0 in scenario "a" must be either a null value or a hexadecimal-encoded string.', ); test( @@ -1794,7 +1790,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1813,7 +1809,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "transaction.outputs" property of scenario "a" must be have at least one output.' + 'If defined, the "transaction.outputs" property of scenario "a" must be have at least one output.', ); test.failing( @@ -1829,7 +1825,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "transaction.outputs" property of scenario "a" must be an array of scenario output objects.' + 'If defined, the "transaction.outputs" property of scenario "a" must be an array of scenario output objects.', ); test.failing( @@ -1848,7 +1844,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "lockingBytecode" property of output 0 in scenario "a" must be a string or an object.' + 'If defined, the "lockingBytecode" property of output 0 in scenario "a" must be a string or an object.', ); test.failing( @@ -1867,7 +1863,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If the "lockingBytecode" property of output 0 in scenario "a" is a string, it must be a valid, hexadecimal-encoded locking bytecode.' + 'If the "lockingBytecode" property of output 0 in scenario "a" is a string, it must be a valid, hexadecimal-encoded locking bytecode.', ); test.failing( @@ -1886,7 +1882,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "script" property of output 0 in scenario "a" must be a hexadecimal-encoded string or "null".' + 'If defined, the "script" property of output 0 in scenario "a" must be a hexadecimal-encoded string or "null".', ); test.failing( @@ -1905,7 +1901,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "overrides" property of output 0 in scenario "a" must be an object.' + 'If defined, the "overrides" property of output 0 in scenario "a" must be an object.', ); test.failing( @@ -1924,7 +1920,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "valueSatoshis" property of output 0 in scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).' + 'If defined, the "valueSatoshis" property of output 0 in scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).', ); test( @@ -1983,7 +1979,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1995,7 +1991,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'Built-in identifiers may not be re-used by any entity, variable, script, or scenario. The following built-in identifiers are re-used: "current_block_height", "signing_serialization".' + 'Built-in identifiers may not be re-used by any entity, variable, script, or scenario. The following built-in identifiers are re-used: "current_block_height", "signing_serialization".', ); test.failing( @@ -2008,7 +2004,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The ID of each entity, variable, script, and scenario in an authentication template must be unique. The following IDs are re-used: "b", "d".' + 'The ID of each entity, variable, script, and scenario in a wallet template must be unique. The following IDs are re-used: "b", "d".', ); test.failing( @@ -2020,7 +2016,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'Only known scripts may be assigned to entities. The following script IDs are not provided in this template: "b", "c".' + 'Only known scripts may be assigned to entities. The following script IDs are not provided in this template: "b", "c".', ); test.failing( @@ -2054,7 +2050,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'Only known scenarios may be referenced by scripts. The following scenario IDs are not provided in this template: "s1", "s2", "s3", "s4", "s5", "s6", "s7".' + 'Only known scenarios may be referenced by scripts. The following scenario IDs are not provided in this template: "s1", "s2", "s3", "s4", "s5", "s6", "s7".', ); test.failing( @@ -2093,5 +2089,5 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'Only known entities may be referenced by hdKeys properties within scenarios. The following entity IDs are not provided in this template: "c", "d", "e", "f".' + 'Only known entities may be referenced by hdKeys properties within scenarios. The following entity IDs are not provided in this template: "c", "d", "e", "f".', ); diff --git a/src/lib/schema/authentication-template.ts b/src/lib/schema/wallet-template.ts similarity index 59% rename from src/lib/schema/authentication-template.ts rename to src/lib/schema/wallet-template.ts index 5b17becb..3dff5715 100644 --- a/src/lib/schema/authentication-template.ts +++ b/src/lib/schema/wallet-template.ts @@ -1,12 +1,12 @@ -import type { AuthenticationTemplate } from '../lib.js'; +import type { WalletTemplate } from '../lib.js'; import { ajvStandaloneJsonParse } from './ajv/ajv-utils.js'; // eslint-disable-next-line import/no-internal-modules -import AuthenticationTemplateValidator from './ajv/validate-authentication-template.js'; +import walletTemplateValidator from './ajv/validate-wallet-template.js'; /** - * Safely parse and validate an authentication template, returning either an - * error message as a string or a valid {@link AuthenticationTemplate}. The + * Safely parse and validate a wallet template, returning either an + * error message as a string or a valid {@link WalletTemplate}. The * template may be provided either as an untrusted JSON string or as a * pre-parsed object. * @@ -19,19 +19,19 @@ import AuthenticationTemplateValidator from './ajv/validate-authentication-templ * - The derivation paths of each HdKey are validated against each other. * * This method does not validate the CashAssembly contents of scripts (by - * attempting compilation, evaluating {@link AuthenticationTemplateScriptTest}s, + * attempting compilation, evaluating {@link WalletTemplateScriptTest}s, * or testing scenario generation). * - * @param untrustedJsonOrObject - the JSON string or object to validate as an - * authentication template + * @param untrustedJsonOrObject - the JSON string or object to validate as a + * wallet template */ -export const importAuthenticationTemplate = ( - untrustedJsonOrObject: unknown -): AuthenticationTemplate | string => { - const errorPrefix = `Authentication template import failed:`; - const template = ajvStandaloneJsonParse( +export const importWalletTemplate = ( + untrustedJsonOrObject: unknown, +): WalletTemplate | string => { + const errorPrefix = `Wallet template import failed:`; + const template = ajvStandaloneJsonParse( untrustedJsonOrObject, - AuthenticationTemplateValidator + walletTemplateValidator, ); if (typeof template === 'string') { return `${errorPrefix}${template}`; diff --git a/src/lib/transaction/estimate-transaction.ts b/src/lib/transaction/estimate-transaction.ts index 1918680b..4ee05d0c 100644 --- a/src/lib/transaction/estimate-transaction.ts +++ b/src/lib/transaction/estimate-transaction.ts @@ -35,10 +35,11 @@ export const estimateTransaction = < unknown, AnyCompilerConfiguration, unknown - > + >, + ProgramState, >( - template: Readonly> -): TransactionGenerationAttempt => + template: TransactionTemplateEstimated, +): TransactionGenerationAttempt => // TODO: estimateTransaction typeof template === 'object' ? { completions: [], errors: [], stage: 'inputs', success: false } diff --git a/src/lib/transaction/fixtures/generate-templates.spec.helper.ts b/src/lib/transaction/fixtures/generate-templates.spec.helper.ts index d458d5ea..def8d741 100644 --- a/src/lib/transaction/fixtures/generate-templates.spec.helper.ts +++ b/src/lib/transaction/fixtures/generate-templates.spec.helper.ts @@ -1,16 +1,16 @@ -/* eslint-disable no-console, functional/no-expression-statement */ -import { authenticationTemplateP2pkh, stringify } from '../../lib.js'; +/* eslint-disable no-console, functional/no-expression-statements */ +import { stringify, walletTemplateP2pkh } from '../../lib.js'; import { twoOfTwoRecoverable } from './template.2-of-2-recoverable.spec.helper.js'; import { twoOfThree } from './template.2-of-3.spec.helper.js'; -import { cashChannels } from './template.cash-channels.spec.helper.js'; +import { cashChannels } from './template.cash-channels-v1.spec.helper.js'; import { sigOfSig } from './template.sig-of-sig.spec.helper.js'; // eslint-disable-next-line complexity, functional/no-return-void const printTemplate = (template: string) => { switch (template) { case 'p2pkh': - console.log(stringify(authenticationTemplateP2pkh)); + console.log(stringify(walletTemplateP2pkh)); return; case '2-of-3': console.log(stringify(twoOfThree)); @@ -21,7 +21,7 @@ const printTemplate = (template: string) => { case 'sig-of-sig': console.log(stringify(sigOfSig)); return; - case 'cash-channels': + case 'cash-channels-v1': console.log(stringify(cashChannels)); return; diff --git a/src/lib/transaction/fixtures/template.2-of-2-recoverable.spec.helper.ts b/src/lib/transaction/fixtures/template.2-of-2-recoverable.spec.helper.ts index fba3f7c3..3186860e 100644 --- a/src/lib/transaction/fixtures/template.2-of-2-recoverable.spec.helper.ts +++ b/src/lib/transaction/fixtures/template.2-of-2-recoverable.spec.helper.ts @@ -1,12 +1,12 @@ /* eslint-disable camelcase, @typescript-eslint/naming-convention */ -import type { AuthenticationTemplate } from '../../lib.js'; +import type { WalletTemplate } from '../../lib.js'; import { CompilerDefaults } from '../../lib.js'; const secondsIn30Days = 2592000; -export const twoOfTwoRecoverable: AuthenticationTemplate = { +export const twoOfTwoRecoverable: WalletTemplate = { ...{ name: '2-of-2 Recoverable Vault' }, - $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', + $schema: 'https://libauth.org/schemas/wallet-template-v0.schema.json', description: 'A 2-of-2 wallet, which after a specified delay, can be recovered by either of the original two keys and a signature from a trusted user (e.g. an attorney).\n\nIn this implementation, all wallet addresses become recoverable at the same time. To "bump" the recovery time to a later date, create a new wallet and transfer the funds.\n\nThis scheme is described in more detail in BIP-65.', entities: { diff --git a/src/lib/transaction/fixtures/template.2-of-3.spec.helper.ts b/src/lib/transaction/fixtures/template.2-of-3.spec.helper.ts index 5eca05d2..0e5148f1 100644 --- a/src/lib/transaction/fixtures/template.2-of-3.spec.helper.ts +++ b/src/lib/transaction/fixtures/template.2-of-3.spec.helper.ts @@ -1,14 +1,11 @@ /* eslint-disable camelcase, @typescript-eslint/naming-convention */ -import type { - AuthenticationTemplate, - AuthenticationTemplateEntity, -} from '../../lib.js'; +import type { WalletTemplate, WalletTemplateEntity } from '../../lib.js'; const createSigner = ( name: string, signerIndex: string, - scripts: string[] -): AuthenticationTemplateEntity => ({ + scripts: string[], +): WalletTemplateEntity => ({ name, scripts: ['lock', ...scripts], variables: { [`key${signerIndex}`]: { type: 'HdKey' } }, @@ -18,9 +15,9 @@ const createSigner = ( * 2-of-3 P2SH * This is a mostly-hard-coded 2-of-3 example. A more general function could be written to generate m-of-n wallets */ -export const twoOfThree: AuthenticationTemplate = { +export const twoOfThree: WalletTemplate = { ...{ name: '2-of-3 Multisig' }, - $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', + $schema: 'https://libauth.org/schemas/wallet-template-v0.schema.json', entities: { signer_1: createSigner('Signer 1', '1', ['1_and_2', '1_and_3']), signer_2: createSigner('Signer 2', '2', ['1_and_2', '2_and_3']), diff --git a/src/lib/transaction/fixtures/template.cash-channels.spec.helper.ts b/src/lib/transaction/fixtures/template.cash-channels-v1.spec.helper.ts similarity index 94% rename from src/lib/transaction/fixtures/template.cash-channels.spec.helper.ts rename to src/lib/transaction/fixtures/template.cash-channels-v1.spec.helper.ts index 187acc5a..60702532 100644 --- a/src/lib/transaction/fixtures/template.cash-channels.spec.helper.ts +++ b/src/lib/transaction/fixtures/template.cash-channels-v1.spec.helper.ts @@ -1,8 +1,8 @@ /* eslint-disable camelcase, @typescript-eslint/naming-convention */ -import type { AuthenticationTemplate } from '../../lib.js'; +import type { WalletTemplate } from '../../lib.js'; -export const cashChannels: AuthenticationTemplate = { - $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', +export const cashChannels: WalletTemplate = { + $schema: 'https://libauth.org/schemas/wallet-template-v0.schema.json', description: '**Noncustodial, Privacy-Preserving, Flexibly-Denominated, Recurring Payments for Bitcoin Cash**\n\nA single-key channel that allows the owner to preauthorize any number of future payments to a receiver.\n\nEach authorization specifies a payment value, payment time, channel and payment identification information, and maximum satoshi value. When the payment time for an authorization is reached, the receiver can create a single transaction to withdraw the authorized amount to their own wallet, sending the change back to the channel. Beyond initially signing authorizations, the owner does not need to participate in executing authorized payments.\n\nThe channel does not need to hold a balance to preauthorize transactions – much like a debit account, the owner only needs to ensure that the wallet contains adequate funds to satisfy upcoming payments.\n\nChannel payments can be denominated in any asset. If the channel is denominated in an asset other than BCH, the precise payment amount is determined by a Rate Oracle, an entity partially-trusted with determining the current value of the denominating asset. (If the value of the denominating asset rises dramatically in terms of BCH, the Owner must sign a new authorization with a larger maximum authorized satoshi value.)\n \nThis wallet is entirely noncustodial: at any time, the owner can withdraw their funds to end the arrangement.\n\nIn normal use, the owner should create a unique channel for each Receiver. This provides better privacy (receivers can not determine the payment amounts or frequency of payments to other receivers) and better security (misbehaving receivers can not disrupt upcoming payments to other receivers).\n\nImplementation note: a single authorization can be used to withdraw from any channel UTXO. In most cases, authorizations are meant to be used only once, so wallets should never hold more than one unspent UTXO per channel. To β€œtop up” the wallet, the existing UTXO should be spent back to itself, adding funds as necessary.', entities: { @@ -29,14 +29,10 @@ export const cashChannels: AuthenticationTemplate = { name: 'Maximum Authorized Satoshis', type: 'AddressData', }, - owner: { - description: '', - name: "Owner's Key", - type: 'Key', - }, + owner: { description: '', name: "Owner's Key", type: 'Key' }, payment_number: { description: - 'The sequence number of this payment, used as an identifier for an authorization. Authorizations must be used in order, and this number should be incremented by one for each authorization signed.\n\nEncoded as a VM Number between 0 and 65534, e.g. `42`.', + 'The sequence number of this payment, used as an identifier for an authorization. Authorizations must be used in order, and this number should be incremented by one for each authorization signed.\n\nEncoded as a VM Number between 0 and 32767, e.g. `42`.', name: 'Payment Number', type: 'AddressData', }, @@ -85,9 +81,7 @@ export const cashChannels: AuthenticationTemplate = { description: 'An example of successful payment authorization execution.', extends: 'before_payment_time', name: '$10.00 USD – After Payment Time', - transaction: { - locktime: 1580515200, - }, + transaction: { locktime: 1580515200 }, }, before_payment_time: { data: { @@ -99,26 +93,20 @@ export const cashChannels: AuthenticationTemplate = { payment_satoshis: '10000', payment_time: '1580515200', }, - hdKeys: { - addressIndex: 0, - }, + hdKeys: { addressIndex: 0 }, }, description: 'An example attempting to execute a payment authorization before the payment time authorized by the owner. The authorization is for "1000" in asset "USD" (described in cents, so $10.00 USD), and it authorizes a payment of a maximum of 10500 satoshis. The hypothetical UTXO being spent has a value of 20000 satoshis.', name: '$10.00 USD – Before Payment Time', - sourceOutputs: [{ valueSatoshis: 20000 }], + sourceOutputs: [{ lockingBytecode: ['slot'], valueSatoshis: 20000 }], transaction: { locktime: 1577836800, outputs: [ { lockingBytecode: { overrides: { - bytecode: { - payment_number: '3', - }, - hdKeys: { - addressIndex: 0, - }, + bytecode: { payment_number: '3' }, + hdKeys: { addressIndex: 0 }, }, }, valueSatoshis: 10000, @@ -127,11 +115,7 @@ export const cashChannels: AuthenticationTemplate = { }, }, exceeds_maximum_payment_number: { - data: { - bytecode: { - payment_number: '65536', - }, - }, + data: { bytecode: { payment_number: '32768' } }, description: 'An example scenario where the payment number exceeds the maximum uint16 value.', name: 'Payment Number Exceeds Maximum', @@ -141,13 +125,7 @@ export const cashChannels: AuthenticationTemplate = { "A scenario for testing all bytecode values. Because this scenario doesn't require compiling the script under test for its outputs, errors are a little easier to debug.", extends: 'after_payment_time', name: 'Test Bytecode Values', - transaction: { - outputs: [ - { - lockingBytecode: '', - }, - ], - }, + transaction: { outputs: [{ lockingBytecode: '' }] }, }, }, scripts: { @@ -243,12 +221,13 @@ export const cashChannels: AuthenticationTemplate = { name: 'Payment Number Padded', pushed: true, script: - '$(\n \n OP_DUP <65534> OP_LESSTHANOREQUAL OP_VERIFY\n <2> OP_NUM2BIN\n)\n\n\n<1>', + '$(\n \n OP_DUP <0> OP_GREATERTHAN OP_VERIFY OP_DUP <0xff7f> OP_LESSTHANOREQUAL OP_VERIFY\n <2> OP_NUM2BIN\n)', tests: { - requires_uint16: { - check: '<0x0200>\nOP_EQUAL', - fails: ['exceeds_maximum_payment_number'], - name: 'Requires Uint16', + is_2_bytes: { + check: + 'OP_SIZE <2> OP_EQUALVERIFY\nOP_BIN2NUM \nOP_EQUAL', + invalid: ['exceeds_maximum_payment_number'], + name: 'Is 2 Bytes', passes: ['before_payment_time'], }, }, diff --git a/src/lib/transaction/fixtures/template.sig-of-sig.spec.helper.ts b/src/lib/transaction/fixtures/template.sig-of-sig.spec.helper.ts index 454ded9e..29b16628 100644 --- a/src/lib/transaction/fixtures/template.sig-of-sig.spec.helper.ts +++ b/src/lib/transaction/fixtures/template.sig-of-sig.spec.helper.ts @@ -1,7 +1,7 @@ /* eslint-disable camelcase, @typescript-eslint/naming-convention */ -import type { AuthenticationTemplate } from '../../lib.js'; +import type { WalletTemplate } from '../../lib.js'; -export const sigOfSig: AuthenticationTemplate = { +export const sigOfSig: WalletTemplate = { ...{ name: 'Sig-of-Sig Vault (2-of-2)', }, diff --git a/src/lib/transaction/fixtures/templates/2-of-2-recoverable.json b/src/lib/transaction/fixtures/templates/2-of-2-recoverable.json index a6e1d2b9..7def2f6d 100644 --- a/src/lib/transaction/fixtures/templates/2-of-2-recoverable.json +++ b/src/lib/transaction/fixtures/templates/2-of-2-recoverable.json @@ -1,6 +1,6 @@ { "name": "2-of-2 Recoverable Vault", - "$schema": "https://bitauth.com/schemas/authentication-template-v0.schema.json", + "$schema": "https://libauth.org/schemas/wallet-template-v0.schema.json", "description": "A 2-of-2 wallet, which after a specified delay, can be recovered by either of the original two keys and a signature from a trusted user (e.g. an attorney).\n\nIn this implementation, all wallet addresses become recoverable at the same time. To \"bump\" the recovery time to a later date, create a new wallet and transfer the funds.\n\nThis scheme is described in more detail in BIP-65.", "entities": { "signer_1": { diff --git a/src/lib/transaction/fixtures/templates/2-of-3.json b/src/lib/transaction/fixtures/templates/2-of-3.json index 02421097..bcdddc2b 100644 --- a/src/lib/transaction/fixtures/templates/2-of-3.json +++ b/src/lib/transaction/fixtures/templates/2-of-3.json @@ -1,6 +1,6 @@ { "name": "2-of-3 Multisig", - "$schema": "https://bitauth.com/schemas/authentication-template-v0.schema.json", + "$schema": "https://libauth.org/schemas/wallet-template-v0.schema.json", "entities": { "signer_1": { "name": "Signer 1", diff --git a/src/lib/transaction/fixtures/templates/cash-channels.json b/src/lib/transaction/fixtures/templates/cash-channels-v1.json similarity index 97% rename from src/lib/transaction/fixtures/templates/cash-channels.json rename to src/lib/transaction/fixtures/templates/cash-channels-v1.json index 3f70c9c7..567e4c19 100644 --- a/src/lib/transaction/fixtures/templates/cash-channels.json +++ b/src/lib/transaction/fixtures/templates/cash-channels-v1.json @@ -1,5 +1,5 @@ { - "$schema": "https://bitauth.com/schemas/authentication-template-v0.schema.json", + "$schema": "https://libauth.org/schemas/wallet-template-v0.schema.json", "description": "**Noncustodial, Privacy-Preserving, Flexibly-Denominated, Recurring Payments for Bitcoin Cash**\n\nA single-key channel that allows the owner to preauthorize any number of future payments to a receiver.\n\nEach authorization specifies a payment value, payment time, channel and payment identification information, and maximum satoshi value. When the payment time for an authorization is reached, the receiver can create a single transaction to withdraw the authorized amount to their own wallet, sending the change back to the channel. Beyond initially signing authorizations, the owner does not need to participate in executing authorized payments.\n\nThe channel does not need to hold a balance to preauthorize transactions – much like a debit account, the owner only needs to ensure that the wallet contains adequate funds to satisfy upcoming payments.\n\nChannel payments can be denominated in any asset. If the channel is denominated in an asset other than BCH, the precise payment amount is determined by a Rate Oracle, an entity partially-trusted with determining the current value of the denominating asset. (If the value of the denominating asset rises dramatically in terms of BCH, the Owner must sign a new authorization with a larger maximum authorized satoshi value.)\n \nThis wallet is entirely noncustodial: at any time, the owner can withdraw their funds to end the arrangement.\n\nIn normal use, the owner should create a unique channel for each Receiver. This provides better privacy (receivers can not determine the payment amounts or frequency of payments to other receivers) and better security (misbehaving receivers can not disrupt upcoming payments to other receivers).\n\nImplementation note: a single authorization can be used to withdraw from any channel UTXO. In most cases, authorizations are meant to be used only once, so wallets should never hold more than one unspent UTXO per channel. To β€œtop up” the wallet, the existing UTXO should be spent back to itself, adding funds as necessary.", "entities": { "owner_entity": { @@ -27,7 +27,7 @@ "type": "Key" }, "payment_number": { - "description": "The sequence number of this payment, used as an identifier for an authorization. Authorizations must be used in order, and this number should be incremented by one for each authorization signed.\n\nEncoded as a VM Number between 0 and 65534, e.g. `42`.", + "description": "The sequence number of this payment, used as an identifier for an authorization. Authorizations must be used in order, and this number should be incremented by one for each authorization signed.\n\nEncoded as a VM Number between 0 and 32767, e.g. `42`.", "name": "Payment Number", "type": "AddressData" }, @@ -94,6 +94,7 @@ "name": "$10.00 USD – Before Payment Time", "sourceOutputs": [ { + "lockingBytecode": ["slot"], "valueSatoshis": 20000 } ], @@ -119,7 +120,7 @@ "exceeds_maximum_payment_number": { "data": { "bytecode": { - "payment_number": "65536" + "payment_number": "32768" } }, "description": "An example scenario where the payment number exceeds the maximum uint16 value.", @@ -218,12 +219,12 @@ "payment_number_padded": { "name": "Payment Number Padded", "pushed": true, - "script": "$(\n \n OP_DUP <65534> OP_LESSTHANOREQUAL OP_VERIFY\n <2> OP_NUM2BIN\n)\n\n\n<1>", + "script": "$(\n \n OP_DUP <0> OP_GREATERTHAN OP_VERIFY OP_DUP <0xff7f> OP_LESSTHANOREQUAL OP_VERIFY\n <2> OP_NUM2BIN\n)", "tests": { - "requires_uint16": { - "check": "<0x0200>\nOP_EQUAL", - "fails": ["exceeds_maximum_payment_number"], - "name": "Requires Uint16", + "is_2_bytes": { + "check": "OP_SIZE <2> OP_EQUALVERIFY\nOP_BIN2NUM \nOP_EQUAL", + "invalid": ["exceeds_maximum_payment_number"], + "name": "Is 2 Bytes", "passes": ["before_payment_time"] } } diff --git a/src/lib/transaction/fixtures/templates/p2pkh.json b/src/lib/transaction/fixtures/templates/p2pkh.json index 0889ee5c..405e56cd 100644 --- a/src/lib/transaction/fixtures/templates/p2pkh.json +++ b/src/lib/transaction/fixtures/templates/p2pkh.json @@ -1,6 +1,6 @@ { - "$schema": "https://bitauth.com/schemas/authentication-template-v0.schema.json", - "description": "A standard single-factor authentication template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions. Because the template uses a Hierarchical Deterministic (HD) key, it also supports watch-only clients.", + "$schema": "https://libauth.org/schemas/wallet-template-v0.schema.json", + "description": "A standard single-factor wallet template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions. Because the template uses a Hierarchical Deterministic (HD) key, it also supports watch-only clients.", "entities": { "owner": { "description": "The individual who can spend from this wallet.", diff --git a/src/lib/transaction/generate-transaction.spec.ts b/src/lib/transaction/generate-transaction.spec.ts index f88fc8d4..aa6ea7f4 100644 --- a/src/lib/transaction/generate-transaction.spec.ts +++ b/src/lib/transaction/generate-transaction.spec.ts @@ -2,13 +2,13 @@ import test from 'ava'; import { privkey } from '../compiler/compiler-bch/compiler-bch.e2e.spec.helper.js'; import { - authenticationTemplateToCompilerBCH, CashAddressNetworkPrefix, decodeTransaction, generateTransaction, hexToBin, - importAuthenticationTemplate, + importWalletTemplate, lockingBytecodeToCashAddress, + walletTemplateToCompilerBCH, } from '../lib.js'; const maybeP2pkhTemplate: unknown = { @@ -46,14 +46,14 @@ const maybeP2pkhTemplate: unknown = { }; test('createCompilerBCH: generateTransaction', (t) => { - const p2pkhTemplate = importAuthenticationTemplate(maybeP2pkhTemplate); + const p2pkhTemplate = importWalletTemplate(maybeP2pkhTemplate); if (typeof p2pkhTemplate === 'string') { t.fail(p2pkhTemplate); return; } - const p2pkh = authenticationTemplateToCompilerBCH(p2pkhTemplate); + const p2pkh = walletTemplateToCompilerBCH(p2pkhTemplate); const lockingBytecode = p2pkh.generateBytecode({ data: { keys: { privateKeys: { owner: privkey } } }, scriptId: 'lock', @@ -68,13 +68,13 @@ test('createCompilerBCH: generateTransaction', (t) => { t.deepEqual( lockingBytecodeToCashAddress( lockingBytecode.bytecode, - CashAddressNetworkPrefix.testnet + CashAddressNetworkPrefix.testnet, ), - 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ); const utxoOutpointTransactionHash = hexToBin( - '68127de83d2ab77d7f5fd8d2ac6181d94473c0cbb2d0776084bf28884f6ecd77' + '68127de83d2ab77d7f5fd8d2ac6181d94473c0cbb2d0776084bf28884f6ecd77', ); const valueSatoshis = 1000000; @@ -117,8 +117,8 @@ test('createCompilerBCH: generateTransaction', (t) => { success: true, transaction: decodeTransaction( hexToBin( - '020000000177cd6e4f8828bf846077d0b2cbc07344d98161acd2d85f7f7db72a3de87d1268010000006441f87a1dc0fb4a30443fdfcc678e713d99cffb963bd52b497377e81abe2cc2b5ac6e9837fab0a23f4d05fd06b80e7673a68bfa8d2f66b7ec5537e88696d7bae1b841210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '020000000177cd6e4f8828bf846077d0b2cbc07344d98161acd2d85f7f7db72a3de87d1268010000006441f87a1dc0fb4a30443fdfcc678e713d99cffb963bd52b497377e81abe2cc2b5ac6e9837fab0a23f4d05fd06b80e7673a68bfa8d2f66b7ec5537e88696d7bae1b841210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ), }); }); diff --git a/src/lib/transaction/generate-transaction.ts b/src/lib/transaction/generate-transaction.ts index 80bfe59b..736f2efb 100644 --- a/src/lib/transaction/generate-transaction.ts +++ b/src/lib/transaction/generate-transaction.ts @@ -26,7 +26,7 @@ import type { } from '../lib.js'; const returnFailedCompilationDirective = < - Type extends 'locking' | 'unlocking' + Type extends 'locking' | 'unlocking', >({ index, result, @@ -36,7 +36,7 @@ const returnFailedCompilationDirective = < result: | CompilationResultParseError | CompilationResultReduceError - | CompilationResultResolveError; + | CompilationResultResolveError; type: Type; }) => ({ errors: result.errors.map((error) => ({ @@ -54,17 +54,18 @@ export const compileOutputTemplate = < unknown, AnyCompilerConfiguration, unknown - > + >, + ProgramState, >({ outputTemplate, index, }: { outputTemplate: OutputTemplate; index: number; -}): BytecodeGenerationErrorLocking | Output => { +}): BytecodeGenerationErrorLocking | Output => { if ('script' in outputTemplate.lockingBytecode) { const directive = outputTemplate.lockingBytecode; - const data = directive.data === undefined ? {} : directive.data; + const data = directive.data ?? {}; const result = directive.compiler.generateBytecode({ data, debug: true, @@ -95,7 +96,8 @@ export const compileInputTemplate = < AnyCompilerConfiguration, unknown >, - CompilationContext extends CompilationContextBCH = CompilationContextBCH + ProgramState, + CompilationContext extends CompilationContextBCH = CompilationContextBCH, >({ inputTemplate, index, @@ -105,13 +107,13 @@ export const compileInputTemplate = < inputTemplate: InputTemplate; index: number; outputs: Output[]; - template: Readonly>; -}): BytecodeGenerationErrorUnlocking | Input => { + template: TransactionTemplateFixed; +}): BytecodeGenerationErrorUnlocking | Input => { if ('script' in inputTemplate.unlockingBytecode) { const directive = inputTemplate.unlockingBytecode; // TODO: workaround, replace by migrating to PST format const sourceOutputs = []; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data sourceOutputs[index] = { lockingBytecode: Uint8Array.of(), ...(inputTemplate.unlockingBytecode.token === undefined @@ -169,31 +171,35 @@ export const compileInputTemplate = < */ export const generateTransaction = < // eslint-disable-next-line @typescript-eslint/no-explicit-any - CompilerType extends Compiler, any> + CompilerType extends Compiler, any>, + ProgramState, >( - template: Readonly> -): TransactionGenerationAttempt => { + template: TransactionTemplateFixed, +): TransactionGenerationAttempt => { const outputResults = template.outputs.map((outputTemplate, index) => compileOutputTemplate({ index, outputTemplate, - }) + }), ); const outputCompilationErrors = outputResults.filter( - (result): result is BytecodeGenerationErrorLocking => 'errors' in result + (result): result is BytecodeGenerationErrorLocking => + 'errors' in result, ); if (outputCompilationErrors.length > 0) { const outputCompletions = outputResults - .map( - (result, index) => - 'lockingBytecode' in result - ? { index, output: result, type: 'output' } - : result + .map< + | BytecodeGenerationCompletionOutput + | BytecodeGenerationErrorLocking + >((result, index) => + 'lockingBytecode' in result + ? { index, output: result, type: 'output' } + : result, ) .filter( (result): result is BytecodeGenerationCompletionOutput => - 'output' in result + 'output' in result, ); return { completions: outputCompletions, @@ -210,24 +216,26 @@ export const generateTransaction = < inputTemplate, outputs, template, - }) + }), ); const inputCompilationErrors = inputResults.filter( - (result): result is BytecodeGenerationErrorUnlocking => 'errors' in result + (result): result is BytecodeGenerationErrorUnlocking => + 'errors' in result, ); if (inputCompilationErrors.length > 0) { const inputCompletions = inputResults .map< - BytecodeGenerationCompletionInput | BytecodeGenerationErrorUnlocking + | BytecodeGenerationCompletionInput + | BytecodeGenerationErrorUnlocking >((result, index) => 'unlockingBytecode' in result ? { index, input: result, type: 'input' } - : result + : result, ) .filter( (result): result is BytecodeGenerationCompletionInput => - 'input' in result + 'input' in result, ); return { completions: inputCompletions, @@ -257,17 +265,19 @@ export const generateTransaction = < * @param transactionGenerationError - a transaction generation attempt where * `success` is `false` */ -export const extractResolvedVariables = ( - transactionGenerationError: TransactionGenerationError +export const extractResolvedVariables = ( + transactionGenerationError: TransactionGenerationError, ) => - (transactionGenerationError.errors as BytecodeGenerationErrorBase[]).reduce<{ + ( + transactionGenerationError.errors as BytecodeGenerationErrorBase[] + ).reduce<{ [fullIdentifier: string]: Uint8Array; }>( (all, error) => error.resolved === undefined ? all : { ...all, ...extractResolvedVariableBytecodeMap(error.resolved) }, - {} + {}, ); /** @@ -284,11 +294,11 @@ export const extractResolvedVariables = ( * @param transactionGenerationError - a transaction generation result where * `success` is `false` */ -export const extractMissingVariables = ( - transactionGenerationError: TransactionGenerationError +export const extractMissingVariables = ( + transactionGenerationError: TransactionGenerationError, ) => { const allErrors = ( - transactionGenerationError.errors as BytecodeGenerationErrorBase[] + transactionGenerationError.errors as BytecodeGenerationErrorBase[] ).reduce((all, error) => [...all, ...error.errors], []); if (!allErrorsAreRecoverable(allErrors)) { @@ -300,7 +310,7 @@ export const extractMissingVariables = ( ...all, [error.missingIdentifier]: error.owningEntity, }), - {} + {}, ); }; @@ -331,13 +341,14 @@ export const extractMissingVariables = ( * The first compilation must use only trusted compilation data */ export const safelyExtendCompilationData = < - CompilationContext = CompilationContextBCH + ProgramState, + CompilationContext = CompilationContextBCH, >( - transactionGenerationError: TransactionGenerationError, + transactionGenerationError: TransactionGenerationError, trustedCompilationData: CompilationData, untrustedResolutions: { [providedByEntityId: string]: ReturnType; - } + }, ): CompilationData | false => { const missing = extractMissingVariables(transactionGenerationError); if (missing === false) return false; diff --git a/src/lib/transaction/transaction-e2e.2-of-2-recoverable.spec.ts b/src/lib/transaction/transaction-e2e.2-of-2-recoverable.spec.ts index 38489342..1b18cdbd 100644 --- a/src/lib/transaction/transaction-e2e.2-of-2-recoverable.spec.ts +++ b/src/lib/transaction/transaction-e2e.2-of-2-recoverable.spec.ts @@ -8,7 +8,6 @@ import type { TransactionCommon, } from '../lib.js'; import { - authenticationTemplateToCompilerBCH, CashAddressNetworkPrefix, compileCashAssembly, createVirtualMachineBCH, @@ -18,9 +17,10 @@ import { extractMissingVariables, generateTransaction, hexToBin, - importAuthenticationTemplate, + importWalletTemplate, lockingBytecodeToCashAddress, stringify, + walletTemplateToCompilerBCH, } from '../lib.js'; import { @@ -37,7 +37,7 @@ const vm = createVirtualMachineBCH(); // eslint-disable-next-line complexity test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { - const template = importAuthenticationTemplate(twoOfTwoRecoverableJson); + const template = importWalletTemplate(twoOfTwoRecoverableJson); if (typeof template === 'string') { t.fail(template); return; @@ -53,12 +53,12 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { }; const creationDate = dateToLocktime( - new Date('2020-01-01T00:00:00.000Z') + new Date('2020-01-01T00:00:00.000Z'), ) as number; const threeMonths = 60 * 60 * 24 * 90; const locktimeFourMonthsLater = dateToLocktime( - new Date('2020-04-01T00:00:00.000Z') + new Date('2020-04-01T00:00:00.000Z'), ) as number; const lockingData: CompilationData = { @@ -70,7 +70,7 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { }; const lockingScript = 'lock'; - const compiler = authenticationTemplateToCompilerBCH(template); + const compiler = walletTemplateToCompilerBCH(template); const lockingBytecode = compiler.generateBytecode({ data: lockingData, scriptId: lockingScript, @@ -84,7 +84,7 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { const address = lockingBytecodeToCashAddress( lockingBytecode.bytecode, - CashAddressNetworkPrefix.testnet + CashAddressNetworkPrefix.testnet, ); t.deepEqual(address, 'bchtest:pz8p649zg3a492hxy86sh0ccvc7sptrlx5cp3eapah'); @@ -106,7 +106,7 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { const input1 = { outpointIndex: 0, outpointTransactionHash: hexToBin( - '6168cbf5d24784df4fef46e1e5cfacaee14cda4c29dd8114b9cfc44972aea46a' + '6168cbf5d24784df4fef46e1e5cfacaee14cda4c29dd8114b9cfc44972aea46a', ), sequenceNumber: 0, unlockingBytecode: { @@ -122,7 +122,7 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { const input2 = { outpointIndex: 1, outpointTransactionHash: hexToBin( - '0ce50e17e71dadd8ba59e89a291cf3082862b32b229c5fbfc8dee3288165d97c' + '0ce50e17e71dadd8ba59e89a291cf3082862b32b229c5fbfc8dee3288165d97c', ), sequenceNumber: 0, unlockingBytecode: { @@ -189,10 +189,10 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { t.deepEqual(signer1Attempt.completions, []); const expectedSigner1SignatureInput1 = hexToBin( - '304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b41' + '304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b41', ); const expectedSigner1SignatureInput2 = hexToBin( - '3044022028141930f622819de84cf1a1b42fc2ea15c56bafd45e768c72fd84b4d0fe5b7e022066f659c79e6d8b6c53561be0b472bbeb355ffa443828fd8fb083148ffd26e8c841' + '3044022028141930f622819de84cf1a1b42fc2ea15c56bafd45e768c72fd84b4d0fe5b7e022066f659c79e6d8b6c53561be0b472bbeb355ffa443828fd8fb083148ffd26e8c841', ); /** @@ -288,13 +288,13 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { input: { ...input1, unlockingBytecode: hexToBin( - '0047304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b4147304402207d987a4d736fb6abb5f90109da05411e515c212c3b2c8527d15e8d863fe83957022004ad83f50e7b1ae87665c211717caca4b9e9714cd2d27bc4759cf6482394c9f641004c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae' + '0047304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b4147304402207d987a4d736fb6abb5f90109da05411e515c212c3b2c8527d15e8d863fe83957022004ad83f50e7b1ae87665c211717caca4b9e9714cd2d27bc4759cf6482394c9f641004c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae', ), }, type: 'input', }, ], - stringify(signer2Attempt2.completions) + stringify(signer2Attempt2.completions), ); const completedInput1 = ( @@ -377,12 +377,12 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { * tx: e6c808adcb3cfc06461e962373659554bf6c447ea7b25ac503ff429e21050755 */ hexToBin( - '02000000026aa4ae7249c4cfb91481dd294cda4ce1aeaccfe5e146ef4fdf8447d2f5cb686100000000fd09010047304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b4147304402207d987a4d736fb6abb5f90109da05411e515c212c3b2c8527d15e8d863fe83957022004ad83f50e7b1ae87665c211717caca4b9e9714cd2d27bc4759cf6482394c9f641004c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae000000007cd9658128e3dec8bf5f9c222bb3622808f31c299ae859bad8ad1de7170ee50c01000000fd0a0100473044022028141930f622819de84cf1a1b42fc2ea15c56bafd45e768c72fd84b4d0fe5b7e022066f659c79e6d8b6c53561be0b472bbeb355ffa443828fd8fb083148ffd26e8c841483045022100d62f54380b58b99677467a4016fceffd1cd85adabe6d2ffffab61a7e599dc5d302207a43e7809e5afae5069cef08d5f4960adcb9d245d295bbdf6bb8ab9a9056d11441514c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae000000000100000000000000000d6a0b68656c6c6f20776f726c6480d9835e' - ) + '02000000026aa4ae7249c4cfb91481dd294cda4ce1aeaccfe5e146ef4fdf8447d2f5cb686100000000fd09010047304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b4147304402207d987a4d736fb6abb5f90109da05411e515c212c3b2c8527d15e8d863fe83957022004ad83f50e7b1ae87665c211717caca4b9e9714cd2d27bc4759cf6482394c9f641004c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae000000007cd9658128e3dec8bf5f9c222bb3622808f31c299ae859bad8ad1de7170ee50c01000000fd0a0100473044022028141930f622819de84cf1a1b42fc2ea15c56bafd45e768c72fd84b4d0fe5b7e022066f659c79e6d8b6c53561be0b472bbeb355ffa443828fd8fb083148ffd26e8c841483045022100d62f54380b58b99677467a4016fceffd1cd85adabe6d2ffffab61a7e599dc5d302207a43e7809e5afae5069cef08d5f4960adcb9d245d295bbdf6bb8ab9a9056d11441514c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae000000000100000000000000000d6a0b68656c6c6f20776f726c6480d9835e', + ), ) as TransactionCommon, }, `${stringify(successfulCompilation)} - ${stringify( - encodeTransactionCommon(successfulCompilation.transaction) - )}` + encodeTransactionCommon(successfulCompilation.transaction), + )}`, ); }); diff --git a/src/lib/transaction/transaction-e2e.2-of-3.spec.ts b/src/lib/transaction/transaction-e2e.2-of-3.spec.ts index bc5af85c..c861483e 100644 --- a/src/lib/transaction/transaction-e2e.2-of-3.spec.ts +++ b/src/lib/transaction/transaction-e2e.2-of-3.spec.ts @@ -4,7 +4,6 @@ import test from 'ava'; import type { CompilationData, TransactionCommon } from '../lib.js'; import { - authenticationTemplateToCompilerBCH, CashAddressNetworkPrefix, createVirtualMachineBCH, decodeTransactionCommon, @@ -13,10 +12,11 @@ import { extractResolvedVariables, generateTransaction, hexToBin, - importAuthenticationTemplate, + importWalletTemplate, lockingBytecodeToCashAddress, safelyExtendCompilationData, stringify, + walletTemplateToCompilerBCH, } from '../lib.js'; import { @@ -32,7 +32,7 @@ const vm = createVirtualMachineBCH(); // eslint-disable-next-line complexity test('transaction e2e tests: 2-of-3 multisig', (t) => { - const template = importAuthenticationTemplate(twoOfThreeJson); + const template = importWalletTemplate(twoOfThreeJson); if (typeof template === 'string') { t.fail(template); return; @@ -52,7 +52,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { }; const lockingScript = 'lock'; - const compiler = authenticationTemplateToCompilerBCH(template); + const compiler = walletTemplateToCompilerBCH(template); const lockingBytecode = compiler.generateBytecode({ data: lockingData, scriptId: lockingScript, @@ -66,7 +66,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { const address = lockingBytecodeToCashAddress( lockingBytecode.bytecode, - CashAddressNetworkPrefix.testnet + CashAddressNetworkPrefix.testnet, ); t.deepEqual(address, 'bchtest:pplldqjpjaj0058xma6csnpgxd9ew2vxgv26n639yk'); @@ -80,7 +80,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { const input1 = { outpointIndex: 1, outpointTransactionHash: hexToBin( - '3423be78a1976b4ae3516cda594577df004663ff24f1beb9d5bb63056b1b0a60' + '3423be78a1976b4ae3516cda594577df004663ff24f1beb9d5bb63056b1b0a60', ), sequenceNumber: 0, unlockingBytecode: { @@ -141,7 +141,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { const signer1ResolvedVariables = extractResolvedVariables(signer1Attempt); const expectedSigner1Signature = hexToBin( - '304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c7653041' + '304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c7653041', ); t.deepEqual( @@ -149,7 +149,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { { 'key1.signature.all_outputs': expectedSigner1Signature, }, - stringify(signer1ResolvedVariables) + stringify(signer1ResolvedVariables), ); const signer3UnlockingData: CompilationData = { @@ -186,7 +186,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { signer3UnlockingData, { signer_1: signer1ResolvedVariables, - } + }, ) as CompilationData; t.deepEqual( @@ -197,7 +197,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { 'key1.signature.all_outputs': expectedSigner1Signature, }, }, - stringify(signer3UnlockingDataWithMissingVariables) + stringify(signer3UnlockingDataWithMissingVariables), ); const successfulCompilation = generateTransaction({ @@ -232,12 +232,12 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { * tx: c903aba46b4069e485b51292fd68eefdc95110fb95461b118c650fb454c34a9c */ hexToBin( - '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ) as TransactionCommon, }, `${stringify(successfulCompilation)} - ${stringify( - encodeTransactionCommon(successfulCompilation.transaction) - )}` + encodeTransactionCommon(successfulCompilation.transaction), + )}`, ); }); diff --git a/src/lib/transaction/transaction-e2e.p2pkh.spec.ts b/src/lib/transaction/transaction-e2e.p2pkh.spec.ts index f420efec..49e36f8b 100644 --- a/src/lib/transaction/transaction-e2e.p2pkh.spec.ts +++ b/src/lib/transaction/transaction-e2e.p2pkh.spec.ts @@ -2,13 +2,13 @@ import test from 'ava'; import type { CompilationData, TransactionCommon } from '../lib.js'; import { - authenticationTemplateToCompilerBCH, CashAddressNetworkPrefix, decodeTransactionCommon, generateTransaction, hexToBin, - importAuthenticationTemplate, + importWalletTemplate, lockingBytecodeToCashAddress, + walletTemplateToCompilerBCH, } from '../lib.js'; import { @@ -17,8 +17,8 @@ import { p2pkhJson, } from './transaction-e2e.spec.helper.js'; -test('transaction e2e tests: P2PKH (authenticationTemplateP2pkhHd)', (t) => { - const template = importAuthenticationTemplate(p2pkhJson); +test('transaction e2e tests: P2PKH (walletTemplateP2pkhHd)', (t) => { + const template = importWalletTemplate(p2pkhJson); if (typeof template === 'string') { t.fail(template); return; @@ -40,7 +40,7 @@ test('transaction e2e tests: P2PKH (authenticationTemplateP2pkhHd)', (t) => { hdKeys: { addressIndex: 0, hdPrivateKeys: { owner: hdPrivateKey } }, }; - const compiler = authenticationTemplateToCompilerBCH(template); + const compiler = walletTemplateToCompilerBCH(template); const lockingBytecode = compiler.generateBytecode({ data: lockingData, scriptId: lockingScript, @@ -55,13 +55,13 @@ test('transaction e2e tests: P2PKH (authenticationTemplateP2pkhHd)', (t) => { t.deepEqual( lockingBytecodeToCashAddress( lockingBytecode.bytecode, - CashAddressNetworkPrefix.testnet + CashAddressNetworkPrefix.testnet, ), - 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ); const utxoOutpointTransactionHash = hexToBin( - '68127de83d2ab77d7f5fd8d2ac6181d94473c0cbb2d0776084bf28884f6ecd77' + '68127de83d2ab77d7f5fd8d2ac6181d94473c0cbb2d0776084bf28884f6ecd77', ); const satoshis = 1000000; @@ -99,8 +99,8 @@ test('transaction e2e tests: P2PKH (authenticationTemplateP2pkhHd)', (t) => { success: true, transaction: decodeTransactionCommon( hexToBin( - '020000000177cd6e4f8828bf846077d0b2cbc07344d98161acd2d85f7f7db72a3de87d1268010000006441f87a1dc0fb4a30443fdfcc678e713d99cffb963bd52b497377e81abe2cc2b5ac6e9837fab0a23f4d05fd06b80e7673a68bfa8d2f66b7ec5537e88696d7bae1b841210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '020000000177cd6e4f8828bf846077d0b2cbc07344d98161acd2d85f7f7db72a3de87d1268010000006441f87a1dc0fb4a30443fdfcc678e713d99cffb963bd52b497377e81abe2cc2b5ac6e9837fab0a23f4d05fd06b80e7673a68bfa8d2f66b7ec5537e88696d7bae1b841210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ) as TransactionCommon, }); }); diff --git a/src/lib/transaction/transaction-e2e.sig-of-sig.spec.ts b/src/lib/transaction/transaction-e2e.sig-of-sig.spec.ts index 433bfd40..2f4e69a5 100644 --- a/src/lib/transaction/transaction-e2e.sig-of-sig.spec.ts +++ b/src/lib/transaction/transaction-e2e.sig-of-sig.spec.ts @@ -4,7 +4,6 @@ import test from 'ava'; import type { CompilationData, TransactionCommon } from '../lib.js'; import { - authenticationTemplateToCompilerBCH, CashAddressNetworkPrefix, createVirtualMachineBCH, decodeTransactionCommon, @@ -13,9 +12,10 @@ import { extractResolvedVariables, generateTransaction, hexToBin, - importAuthenticationTemplate, + importWalletTemplate, lockingBytecodeToCashAddress, stringify, + walletTemplateToCompilerBCH, } from '../lib.js'; import { @@ -30,7 +30,7 @@ const vm = createVirtualMachineBCH(); // eslint-disable-next-line complexity test('transaction e2e tests: Sig-of-Sig Example', (t) => { - const template = importAuthenticationTemplate(sigOfSigJson); + const template = importWalletTemplate(sigOfSigJson); if (typeof template === 'string') { t.fail(stringify(template)); return; @@ -49,7 +49,7 @@ test('transaction e2e tests: Sig-of-Sig Example', (t) => { }; const lockingScript = 'lock'; - const compiler = authenticationTemplateToCompilerBCH(template); + const compiler = walletTemplateToCompilerBCH(template); const lockingBytecode = compiler.generateBytecode({ data: lockingData, scriptId: lockingScript, @@ -63,7 +63,7 @@ test('transaction e2e tests: Sig-of-Sig Example', (t) => { const address = lockingBytecodeToCashAddress( lockingBytecode.bytecode, - CashAddressNetworkPrefix.testnet + CashAddressNetworkPrefix.testnet, ); t.deepEqual(address, 'bchtest:ppcvyjuqwhuz06np4us443l26dzck305psl0dw6as9'); @@ -77,7 +77,7 @@ test('transaction e2e tests: Sig-of-Sig Example', (t) => { const input = { outpointIndex: 1, outpointTransactionHash: hexToBin( - '1a3c3f950738c23de2461f04b2acd4dfb6b6eb80daeb457f24a6084c45c7da01' + '1a3c3f950738c23de2461f04b2acd4dfb6b6eb80daeb457f24a6084c45c7da01', ), sequenceNumber: 0, unlockingBytecode: { @@ -136,24 +136,24 @@ test('transaction e2e tests: Sig-of-Sig Example', (t) => { { 'second.data_signature.first_signature': 'signer_2', }, - stringify(signer1MissingVariables) + stringify(signer1MissingVariables), ); const signer1ResolvedVariables = extractResolvedVariables(signer1Attempt); const expectedSigner1Signature = hexToBin( - '30440220097cf5732181c1b398909993b4e7794d6f1dc2d40fa803e4e92665e929ce75d40220208df3ba16d67f20f3063bde3234a131845f21a724ef29dad5086d75d76385ec41' + '30440220097cf5732181c1b398909993b4e7794d6f1dc2d40fa803e4e92665e929ce75d40220208df3ba16d67f20f3063bde3234a131845f21a724ef29dad5086d75d76385ec41', ); t.deepEqual( signer1ResolvedVariables, { 'first.public_key': hexToBin( - '0349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e46588' + '0349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e46588', ), 'first.signature.all_outputs': expectedSigner1Signature, }, - stringify(signer1ResolvedVariables) + stringify(signer1ResolvedVariables), ); /** @@ -227,12 +227,12 @@ test('transaction e2e tests: Sig-of-Sig Example', (t) => { */ transaction: decodeTransactionCommon( hexToBin( - '020000000101dac7454c08a6247f45ebda80ebb6b6dfd4acb2041f46e23dc23807953f3c1a01000000f04730440220097cf5732181c1b398909993b4e7794d6f1dc2d40fa803e4e92665e929ce75d40220208df3ba16d67f20f3063bde3234a131845f21a724ef29dad5086d75d76385ec41210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e4658846304402201673c0f6e8741bf2fd259411c212a2d7e326fe4c238118c0dbcab662ef439de10220259d9cf3414f662b83f5d7210e5b5890cdb64ee7e36f2187e6377c9e88a484613e52792102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b8469545bb76a91433c4f1d1e60cbe8eda7cf976752bbb313780c7db88ac000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '020000000101dac7454c08a6247f45ebda80ebb6b6dfd4acb2041f46e23dc23807953f3c1a01000000f04730440220097cf5732181c1b398909993b4e7794d6f1dc2d40fa803e4e92665e929ce75d40220208df3ba16d67f20f3063bde3234a131845f21a724ef29dad5086d75d76385ec41210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e4658846304402201673c0f6e8741bf2fd259411c212a2d7e326fe4c238118c0dbcab662ef439de10220259d9cf3414f662b83f5d7210e5b5890cdb64ee7e36f2187e6377c9e88a484613e52792102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b8469545bb76a91433c4f1d1e60cbe8eda7cf976752bbb313780c7db88ac000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ) as TransactionCommon, }, `${stringify(successfulCompilation)} - ${stringify( - encodeTransactionCommon(successfulCompilation.transaction) - )}` + encodeTransactionCommon(successfulCompilation.transaction), + )}`, ); }); diff --git a/src/lib/transaction/transaction-e2e.spec.helper.ts b/src/lib/transaction/transaction-e2e.spec.helper.ts index a101b48e..f54b2bbe 100644 --- a/src/lib/transaction/transaction-e2e.spec.helper.ts +++ b/src/lib/transaction/transaction-e2e.spec.helper.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-internal-modules */ import twoOfTwoRecoverableJson from './fixtures/templates/2-of-2-recoverable.json' assert { type: 'json' }; import twoOfThreeJson from './fixtures/templates/2-of-3.json' assert { type: 'json' }; -import cashChannelsJson from './fixtures/templates/cash-channels.json' assert { type: 'json' }; +import cashChannelsJson from './fixtures/templates/cash-channels-v1.json' assert { type: 'json' }; import p2pkhJson from './fixtures/templates/p2pkh.json' assert { type: 'json' }; import sigOfSigJson from './fixtures/templates/sig-of-sig.json' assert { type: 'json' }; diff --git a/src/lib/transaction/transaction-e2e.templates.spec.ts b/src/lib/transaction/transaction-e2e.templates.spec.ts index 95a3a928..8fb5e6b2 100644 --- a/src/lib/transaction/transaction-e2e.templates.spec.ts +++ b/src/lib/transaction/transaction-e2e.templates.spec.ts @@ -1,10 +1,10 @@ import test from 'ava'; -import { authenticationTemplateP2pkh } from '../lib.js'; +import { walletTemplateP2pkh } from '../lib.js'; import { twoOfTwoRecoverable } from './fixtures/template.2-of-2-recoverable.spec.helper.js'; import { twoOfThree } from './fixtures/template.2-of-3.spec.helper.js'; -import { cashChannels } from './fixtures/template.cash-channels.spec.helper.js'; +import { cashChannels } from './fixtures/template.cash-channels-v1.spec.helper.js'; import { sigOfSig } from './fixtures/template.sig-of-sig.spec.helper.js'; import { cashChannelsJson, @@ -19,32 +19,32 @@ const ignoreDefault = (anything: object) => ({ default: true, }); -test('example authentication templates are updated', (t) => { +test('example wallet templates are updated', (t) => { const solution = 'Run "yarn gen:templates" to correct this issue. (Note: watch tasks don\'t always update cached JSON imports when the source file changes. You may need to restart tsc.)'; t.deepEqual( ignoreDefault(twoOfTwoRecoverable), ignoreDefault(twoOfTwoRecoverableJson), - `Inconsistency in twoOfTwoRecoverableJson. ${solution}` + `Inconsistency in twoOfTwoRecoverableJson. ${solution}`, ); t.deepEqual( ignoreDefault(twoOfThree), ignoreDefault(twoOfThreeJson), - `Inconsistency in twoOfThreeJson. ${solution}` + `Inconsistency in twoOfThreeJson. ${solution}`, ); t.deepEqual( ignoreDefault(cashChannels), ignoreDefault(cashChannelsJson), - `Inconsistency in cashChannelsJson. ${solution}` + `Inconsistency in cashChannelsJson. ${solution}`, ); t.deepEqual( - ignoreDefault(authenticationTemplateP2pkh), + ignoreDefault(walletTemplateP2pkh), ignoreDefault(p2pkhJson), - `Inconsistency in p2pkhJson. ${solution}` + `Inconsistency in p2pkhJson. ${solution}`, ); t.deepEqual( ignoreDefault(sigOfSig), ignoreDefault(sigOfSigJson), - `Inconsistency in sigOfSigJson. ${solution}` + `Inconsistency in sigOfSigJson. ${solution}`, ); }); diff --git a/src/lib/vm/instruction-sets/bch/2022/bch-2022-instruction-set.ts b/src/lib/vm/instruction-sets/bch/2022/bch-2022-instruction-set.ts index f8845ea2..1a666a37 100644 --- a/src/lib/vm/instruction-sets/bch/2022/bch-2022-instruction-set.ts +++ b/src/lib/vm/instruction-sets/bch/2022/bch-2022-instruction-set.ts @@ -170,7 +170,7 @@ export const createInstructionSetBCH2022 = ( secp256k1: internalSecp256k1, sha1: internalSha1, sha256: internalSha256, - } + }, ): InstructionSet< ResolvedTransactionBCH, AuthenticationProgramBCH, @@ -201,31 +201,31 @@ export const createInstructionSetBCH2022 = ( if (unlockingBytecode.length > ConsensusBCH.maximumBytecodeLength) { return applyError( initialState, - `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH.maximumBytecodeLength} bytes).` + `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH.maximumBytecodeLength} bytes).`, ); } if (authenticationInstructionsAreMalformed(unlockingInstructions)) { return applyError( initialState, - AuthenticationErrorCommon.malformedUnlockingBytecode + AuthenticationErrorCommon.malformedUnlockingBytecode, ); } if (!isPushOnly(unlockingBytecode)) { return applyError( initialState, - AuthenticationErrorCommon.requiresPushOnly + AuthenticationErrorCommon.requiresPushOnly, ); } if (lockingBytecode.length > ConsensusBCH.maximumBytecodeLength) { return applyError( initialState, - AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking + AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking, ); } if (authenticationInstructionsAreMalformed(lockingInstructions)) { return applyError( initialState, - AuthenticationErrorCommon.malformedLockingBytecode + AuthenticationErrorCommon.malformedLockingBytecode, ); } const unlockingResult = stateEvaluate(initialState); @@ -235,7 +235,7 @@ export const createInstructionSetBCH2022 = ( if (unlockingResult.controlStack.length !== 0) { return applyError( initialState, - AuthenticationErrorCommon.nonEmptyControlStack + AuthenticationErrorCommon.nonEmptyControlStack, ); } const lockingResult = stateEvaluate( @@ -243,7 +243,7 @@ export const createInstructionSetBCH2022 = ( instructions: lockingInstructions, program, stack: unlockingResult.stack, - }) + }), ); if (!isPayToScriptHash20(lockingBytecode)) { return lockingResult; @@ -267,7 +267,7 @@ export const createInstructionSetBCH2022 = ( instructions: p2shInstructions, program, stack: p2shStack, - }) + }), ); }, every: (state) => @@ -276,11 +276,11 @@ export const createInstructionSetBCH2022 = ( ConsensusBCH.maximumStackDepth ? applyError(state, AuthenticationErrorCommon.exceededMaximumStackDepth) : state.operationCount > ConsensusBCH.maximumOperationCount - ? applyError( - state, - AuthenticationErrorCommon.exceededMaximumOperationCount - ) - : state, + ? applyError( + state, + AuthenticationErrorCommon.exceededMaximumOperationCount, + ) + : state, operations: { [OpcodesBCH.OP_0]: conditionallyPush, [OpcodesBCH.OP_PUSHBYTES_1]: conditionallyPush, @@ -457,35 +457,35 @@ export const createInstructionSetBCH2022 = ( [OpcodesBCH.OP_MAX]: conditionallyEvaluate(opMax), [OpcodesBCH.OP_WITHIN]: conditionallyEvaluate(opWithin), [OpcodesBCH.OP_RIPEMD160]: conditionallyEvaluate( - opRipemd160({ ripemd160 }) + opRipemd160({ ripemd160 }), ), [OpcodesBCH.OP_SHA1]: conditionallyEvaluate(opSha1({ sha1 })), [OpcodesBCH.OP_SHA256]: conditionallyEvaluate(opSha256({ sha256 })), [OpcodesBCH.OP_HASH160]: conditionallyEvaluate( - opHash160({ ripemd160, sha256 }) + opHash160({ ripemd160, sha256 }), ), [OpcodesBCH.OP_HASH256]: conditionallyEvaluate(opHash256({ sha256 })), [OpcodesBCH.OP_CODESEPARATOR]: conditionallyEvaluate(opCodeSeparator), [OpcodesBCH.OP_CHECKSIG]: conditionallyEvaluate( - opCheckSig({ secp256k1, sha256 }) + opCheckSig({ secp256k1, sha256 }), ), [OpcodesBCH.OP_CHECKSIGVERIFY]: conditionallyEvaluate( - opCheckSigVerify({ secp256k1, sha256 }) + opCheckSigVerify({ secp256k1, sha256 }), ), [OpcodesBCH.OP_CHECKMULTISIG]: conditionallyEvaluate( - opCheckMultiSig({ secp256k1, sha256 }) + opCheckMultiSig({ secp256k1, sha256 }), ), [OpcodesBCH.OP_CHECKMULTISIGVERIFY]: conditionallyEvaluate( - opCheckMultiSigVerify({ secp256k1, sha256 }) + opCheckMultiSigVerify({ secp256k1, sha256 }), ), ...(standard ? { [OpcodesBCH.OP_NOP1]: conditionallyEvaluate(opNopDisallowed), [OpcodesBCH.OP_CHECKLOCKTIMEVERIFY]: conditionallyEvaluate( - opCheckLockTimeVerify + opCheckLockTimeVerify, ), [OpcodesBCH.OP_CHECKSEQUENCEVERIFY]: conditionallyEvaluate( - opCheckSequenceVerify + opCheckSequenceVerify, ), [OpcodesBCH.OP_NOP4]: conditionallyEvaluate(opNopDisallowed), [OpcodesBCH.OP_NOP5]: conditionallyEvaluate(opNopDisallowed), @@ -498,10 +498,10 @@ export const createInstructionSetBCH2022 = ( : { [OpcodesBCH.OP_NOP1]: conditionallyEvaluate(opNop), [OpcodesBCH.OP_CHECKLOCKTIMEVERIFY]: conditionallyEvaluate( - opCheckLockTimeVerify + opCheckLockTimeVerify, ), [OpcodesBCH.OP_CHECKSEQUENCEVERIFY]: conditionallyEvaluate( - opCheckSequenceVerify + opCheckSequenceVerify, ), [OpcodesBCH.OP_NOP4]: conditionallyEvaluate(opNop), [OpcodesBCH.OP_NOP5]: conditionallyEvaluate(opNop), @@ -512,10 +512,10 @@ export const createInstructionSetBCH2022 = ( [OpcodesBCH.OP_NOP10]: conditionallyEvaluate(opNop), }), [OpcodesBCH.OP_CHECKDATASIG]: conditionallyEvaluate( - opCheckDataSig({ secp256k1, sha256 }) + opCheckDataSig({ secp256k1, sha256 }), ), [OpcodesBCH.OP_CHECKDATASIGVERIFY]: conditionallyEvaluate( - opCheckDataSigVerify({ secp256k1, sha256 }) + opCheckDataSigVerify({ secp256k1, sha256 }), ), [OpcodesBCH.OP_REVERSEBYTES]: conditionallyEvaluate(opReverseBytes), [OpcodesBCH.OP_INPUTINDEX]: conditionallyEvaluate(opInputIndex), @@ -532,12 +532,12 @@ export const createInstructionSetBCH2022 = ( [OpcodesBCH.OP_OUTPOINTINDEX]: conditionallyEvaluate(opOutpointIndex), [OpcodesBCH.OP_INPUTBYTECODE]: conditionallyEvaluate(opInputBytecode), [OpcodesBCH.OP_INPUTSEQUENCENUMBER]: conditionallyEvaluate( - opInputSequenceNumber + opInputSequenceNumber, ), [OpcodesBCH.OP_OUTPUTVALUE]: conditionallyEvaluate(opOutputValue), [OpcodesBCH.OP_OUTPUTBYTECODE]: conditionallyEvaluate(opOutputBytecode), - } + }, ), }, success: (state: AuthenticationProgramStateBCH) => { @@ -588,7 +588,7 @@ export const createInstructionSetBCH2022 = ( return `Transaction exceeds maximum standard size: this transaction is ${transactionSize} bytes, but the maximum standard transaction size is ${ConsensusBCH.maximumStandardTransactionSize} bytes.`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, output] of sourceOutputs.entries()) { if (!isStandardOutputBytecode(output.lockingBytecode)) { return `Standard transactions may only spend standard output types, but source output ${index} is non-standard.`; @@ -597,15 +597,15 @@ export const createInstructionSetBCH2022 = ( // eslint-disable-next-line functional/no-let let totalArbitraryDataBytes = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, output] of transaction.outputs.entries()) { if (!isStandardOutputBytecode(output.lockingBytecode)) { return `Standard transactions may only create standard output types, but transaction output ${index} is non-standard.`; } - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (isArbitraryDataOutput(output.lockingBytecode)) { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements totalArbitraryDataBytes += output.lockingBytecode.length + 1; } /* @@ -619,7 +619,7 @@ export const createInstructionSetBCH2022 = ( return `Standard transactions may carry no more than ${ConsensusBCH.maximumDataCarrierBytes} bytes in arbitrary data outputs; this transaction includes ${totalArbitraryDataBytes} bytes of arbitrary data.`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, input] of transaction.inputs.entries()) { if ( input.unlockingBytecode.length > @@ -633,7 +633,7 @@ export const createInstructionSetBCH2022 = ( } } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const index of transaction.inputs.keys()) { const state = evaluate({ inputIndex: index, diff --git a/src/lib/vm/instruction-sets/bch/2022/bch-2022-types.ts b/src/lib/vm/instruction-sets/bch/2022/bch-2022-types.ts index e5b6e691..3c4d6f2e 100644 --- a/src/lib/vm/instruction-sets/bch/2022/bch-2022-types.ts +++ b/src/lib/vm/instruction-sets/bch/2022/bch-2022-types.ts @@ -29,11 +29,11 @@ export type AuthenticationVirtualMachineBCH = AuthenticationVirtualMachine< >; export type TransactionBCH< InputType = Input, - OutputType = Output + OutputType = Output, > = TransactionCommon; export type Transaction< InputType = Input, - OutputType = Output + OutputType = Output, > = TransactionBCH; export type CompilationContextBCH = CompilationContext< TransactionBCH> @@ -55,7 +55,7 @@ export const createTestAuthenticationProgramBCH = ({ { outpointIndex: 0xffffffff, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000', ), sequenceNumber: 0xffffffff, unlockingBytecode: Uint8Array.of(0, 0), @@ -70,7 +70,7 @@ export const createTestAuthenticationProgramBCH = ({ { outpointIndex: 0, outpointTransactionHash: hashTransactionP2pOrder( - encodeTransactionCommon(testFundingTransaction) + encodeTransactionCommon(testFundingTransaction), ), sequenceNumber: 0xffffffff, diff --git a/src/lib/vm/instruction-sets/bch/2023/bch-2023-consensus.ts b/src/lib/vm/instruction-sets/bch/2023/bch-2023-consensus.ts index 457ddc87..7cf6d168 100644 --- a/src/lib/vm/instruction-sets/bch/2023/bch-2023-consensus.ts +++ b/src/lib/vm/instruction-sets/bch/2023/bch-2023-consensus.ts @@ -54,6 +54,7 @@ export enum ConsensusBCH2023 { * A.K.A. `MAXIMUM_ELEMENT_SIZE_64_BIT` */ maximumVmNumberLength = 8, + // eslint-disable-next-line @typescript-eslint/no-mixed-enums minVmNumber = '-9223372036854775807', maxVmNumber = '9223372036854775807', schnorrSignatureLength = 64, diff --git a/src/lib/vm/instruction-sets/bch/2023/bch-2023-crypto.ts b/src/lib/vm/instruction-sets/bch/2023/bch-2023-crypto.ts index bc5250b5..3451e0c6 100644 --- a/src/lib/vm/instruction-sets/bch/2023/bch-2023-crypto.ts +++ b/src/lib/vm/instruction-sets/bch/2023/bch-2023-crypto.ts @@ -41,7 +41,7 @@ export const opCheckSigBCH2023 = verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ): Operation => (s: State) => // eslint-disable-next-line complexity @@ -49,38 +49,38 @@ export const opCheckSigBCH2023 = if (!isValidPublicKeyEncoding(publicKey)) { return applyError( state, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } if ( !isValidSignatureEncodingBCHTransaction( bitcoinEncodedSignature, - SigningSerializationTypesBCH2023 + SigningSerializationTypesBCH2023, ) ) { return applyError( state, AuthenticationErrorCommon.invalidSignatureEncoding, `Transaction signature (including signing serialization): ${binToHex( - bitcoinEncodedSignature - )}` + bitcoinEncodedSignature, + )}`, ); } const coveredBytecode = encodeAuthenticationInstructions( - state.instructions + state.instructions, ).subarray(state.lastCodeSeparator + 1); const { signingSerializationType, signature } = decodeBitcoinSignature( - bitcoinEncodedSignature + bitcoinEncodedSignature, ); const serialization = generateSigningSerializationBCH( state.program, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const digest = hash256(serialization, sha256); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.signedMessages.push({ digest, serialization }); const useSchnorr = @@ -109,7 +109,7 @@ export const opCheckMultiSigBCH2023 = secp256k1: { verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ) => (s: State) => useOneVmNumber(s, (state, publicKeysValue) => { @@ -118,26 +118,26 @@ export const opCheckMultiSigBCH2023 = if (potentialPublicKeys < 0) { return applyError( state, - AuthenticationErrorCommon.invalidNaturalNumber + AuthenticationErrorCommon.invalidNaturalNumber, ); } if (potentialPublicKeys > Multisig.maximumPublicKeys) { return applyError( state, - AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount + AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount, ); } const publicKeys = // eslint-disable-next-line functional/immutable-data potentialPublicKeys > 0 ? state.stack.splice(-potentialPublicKeys) : []; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.operationCount += potentialPublicKeys; return state.operationCount > ConsensusCommon.maximumOperationCount ? applyError( state, - AuthenticationErrorCommon.exceededMaximumOperationCount + AuthenticationErrorCommon.exceededMaximumOperationCount, ) : useOneVmNumber( state, @@ -148,14 +148,14 @@ export const opCheckMultiSigBCH2023 = if (requiredApprovingPublicKeys < 0) { return applyError( nextState, - AuthenticationErrorCommon.invalidNaturalNumber + AuthenticationErrorCommon.invalidNaturalNumber, ); } if (requiredApprovingPublicKeys > potentialPublicKeys) { return applyError( nextState, - AuthenticationErrorCommon.insufficientPublicKeys + AuthenticationErrorCommon.insufficientPublicKeys, ); } @@ -172,18 +172,18 @@ export const opCheckMultiSigBCH2023 = if (protocolBugValue.length !== 0) { return applyError( finalState, - AuthenticationErrorCommon.invalidProtocolBugValue + AuthenticationErrorCommon.invalidProtocolBugValue, ); } const coveredBytecode = encodeAuthenticationInstructions( - finalState.instructions + finalState.instructions, ).subarray(finalState.lastCodeSeparator + 1); let approvingPublicKeys = 0; // eslint-disable-line functional/no-let let remainingSignatures = signatures.length; // eslint-disable-line functional/no-let let remainingPublicKeys = publicKeys.length; // eslint-disable-line functional/no-let - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while ( remainingSignatures > 0 && remainingPublicKeys > 0 && @@ -200,22 +200,22 @@ export const opCheckMultiSigBCH2023 = if (!isValidPublicKeyEncoding(publicKey)) { return applyError( finalState, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } if ( !isValidSignatureEncodingBCHTransaction( bitcoinEncodedSignature, - SigningSerializationTypesBCH2023 + SigningSerializationTypesBCH2023, ) ) { return applyError( finalState, AuthenticationErrorCommon.invalidSignatureEncoding, `Transaction signature (including signing serialization type): ${binToHex( - bitcoinEncodedSignature - )}` + bitcoinEncodedSignature, + )}`, ); } @@ -225,11 +225,11 @@ export const opCheckMultiSigBCH2023 = const serialization = generateSigningSerializationBCH( state.program, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const digest = hash256(serialization, sha256); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data finalState.signedMessages.push({ digest, serialization }); if ( @@ -238,22 +238,22 @@ export const opCheckMultiSigBCH2023 = ) { return applyError( finalState, - AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig + AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig, ); } const signed = secp256k1.verifySignatureDERLowS( signature, publicKey, - digest + digest, ); - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (signed) { - approvingPublicKeys += 1; // eslint-disable-line functional/no-expression-statement - remainingSignatures -= 1; // eslint-disable-line functional/no-expression-statement + approvingPublicKeys += 1; // eslint-disable-line functional/no-expression-statements + remainingSignatures -= 1; // eslint-disable-line functional/no-expression-statements } - remainingPublicKeys -= 1; // eslint-disable-line functional/no-expression-statement + remainingPublicKeys -= 1; // eslint-disable-line functional/no-expression-statements } const success = @@ -265,19 +265,19 @@ export const opCheckMultiSigBCH2023 = ) { return applyError( finalState, - AuthenticationErrorCommon.nonNullSignatureFailure + AuthenticationErrorCommon.nonNullSignatureFailure, ); } return pushToStack(finalState, booleanToVmNumber(success)); - } + }, ); - } + }, ); }); export const opCheckSigVerifyBCH2023 = < - State extends AuthenticationProgramStateCommon + State extends AuthenticationProgramStateCommon, >( { secp256k1, @@ -288,12 +288,12 @@ export const opCheckSigVerifyBCH2023 = < verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ): Operation => combineOperations(opCheckSigBCH2023({ secp256k1, sha256 }), opVerify); export const opCheckMultiSigVerifyBCH2023 = < - State extends AuthenticationProgramStateCommon + State extends AuthenticationProgramStateCommon, >({ secp256k1, sha256, @@ -305,5 +305,5 @@ export const opCheckMultiSigVerifyBCH2023 = < }): Operation => combineOperations( opCheckMultiSigBCH2023({ secp256k1, sha256 }), - opVerify + opVerify, ); diff --git a/src/lib/vm/instruction-sets/bch/2023/bch-2023-instruction-set.ts b/src/lib/vm/instruction-sets/bch/2023/bch-2023-instruction-set.ts index afebdf11..b1cd9721 100644 --- a/src/lib/vm/instruction-sets/bch/2023/bch-2023-instruction-set.ts +++ b/src/lib/vm/instruction-sets/bch/2023/bch-2023-instruction-set.ts @@ -188,7 +188,7 @@ export const createInstructionSetBCH2023 = ( secp256k1: internalSecp256k1, sha1: internalSha1, sha256: internalSha256, - } + }, ): InstructionSet< ResolvedTransactionBCH, AuthenticationProgramBCH, @@ -219,31 +219,31 @@ export const createInstructionSetBCH2023 = ( if (unlockingBytecode.length > ConsensusBCH2023.maximumBytecodeLength) { return applyError( initialState, - `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH2023.maximumBytecodeLength} bytes).` + `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH2023.maximumBytecodeLength} bytes).`, ); } if (authenticationInstructionsAreMalformed(unlockingInstructions)) { return applyError( initialState, - AuthenticationErrorCommon.malformedUnlockingBytecode + AuthenticationErrorCommon.malformedUnlockingBytecode, ); } if (!isPushOnly(unlockingBytecode)) { return applyError( initialState, - AuthenticationErrorCommon.requiresPushOnly + AuthenticationErrorCommon.requiresPushOnly, ); } if (lockingBytecode.length > ConsensusBCH2023.maximumBytecodeLength) { return applyError( initialState, - AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking + AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking, ); } if (authenticationInstructionsAreMalformed(lockingInstructions)) { return applyError( initialState, - AuthenticationErrorCommon.malformedLockingBytecode + AuthenticationErrorCommon.malformedLockingBytecode, ); } const unlockingResult = stateEvaluate(initialState); @@ -253,7 +253,7 @@ export const createInstructionSetBCH2023 = ( if (unlockingResult.controlStack.length !== 0) { return applyError( initialState, - AuthenticationErrorCommon.nonEmptyControlStack + AuthenticationErrorCommon.nonEmptyControlStack, ); } const lockingResult = stateEvaluate( @@ -261,7 +261,7 @@ export const createInstructionSetBCH2023 = ( instructions: lockingInstructions, program, stack: unlockingResult.stack, - }) + }), ); const p2sh20 = isPayToScriptHash20(lockingBytecode); @@ -288,7 +288,7 @@ export const createInstructionSetBCH2023 = ( instructions: p2shInstructions, program, stack: p2shStack, - }) + }), ); }, every: (state) => @@ -297,11 +297,11 @@ export const createInstructionSetBCH2023 = ( ConsensusBCH2023.maximumStackDepth ? applyError(state, AuthenticationErrorCommon.exceededMaximumStackDepth) : state.operationCount > ConsensusBCH2023.maximumOperationCount - ? applyError( - state, - AuthenticationErrorCommon.exceededMaximumOperationCount - ) - : state, + ? applyError( + state, + AuthenticationErrorCommon.exceededMaximumOperationCount, + ) + : state, operations: { [OpcodesBCH2023.OP_0]: conditionallyPush, [OpcodesBCH2023.OP_PUSHBYTES_1]: conditionallyPush, @@ -383,7 +383,7 @@ export const createInstructionSetBCH2023 = ( [OpcodesBCH2023.OP_PUSHDATA_2]: conditionallyPush, [OpcodesBCH2023.OP_PUSHDATA_4]: conditionallyPush, [OpcodesBCH2023.OP_1NEGATE]: conditionallyEvaluate( - pushNumberOperation(-1) + pushNumberOperation(-1), ), [OpcodesBCH2023.OP_RESERVED]: conditionallyEvaluate(reservedOperation), [OpcodesBCH2023.OP_1]: conditionallyEvaluate(pushNumberOperation(1)), @@ -483,41 +483,41 @@ export const createInstructionSetBCH2023 = ( [OpcodesBCH2023.OP_MAX]: conditionallyEvaluate(opMax), [OpcodesBCH2023.OP_WITHIN]: conditionallyEvaluate(opWithin), [OpcodesBCH2023.OP_RIPEMD160]: conditionallyEvaluate( - opRipemd160({ ripemd160 }) + opRipemd160({ ripemd160 }), ), [OpcodesBCH2023.OP_SHA1]: conditionallyEvaluate(opSha1({ sha1 })), [OpcodesBCH2023.OP_SHA256]: conditionallyEvaluate( - opSha256({ sha256 }) + opSha256({ sha256 }), ), [OpcodesBCH2023.OP_HASH160]: conditionallyEvaluate( - opHash160({ ripemd160, sha256 }) + opHash160({ ripemd160, sha256 }), ), [OpcodesBCH2023.OP_HASH256]: conditionallyEvaluate( - opHash256({ sha256 }) + opHash256({ sha256 }), ), [OpcodesBCH2023.OP_CODESEPARATOR]: conditionallyEvaluate(opCodeSeparator), [OpcodesBCH2023.OP_CHECKSIG]: conditionallyEvaluate( - opCheckSigBCH2023({ secp256k1, sha256 }) + opCheckSigBCH2023({ secp256k1, sha256 }), ), [OpcodesBCH2023.OP_CHECKSIGVERIFY]: conditionallyEvaluate( - opCheckSigVerifyBCH2023({ secp256k1, sha256 }) + opCheckSigVerifyBCH2023({ secp256k1, sha256 }), ), [OpcodesBCH2023.OP_CHECKMULTISIG]: conditionallyEvaluate( - opCheckMultiSigBCH2023({ secp256k1, sha256 }) + opCheckMultiSigBCH2023({ secp256k1, sha256 }), ), [OpcodesBCH2023.OP_CHECKMULTISIGVERIFY]: conditionallyEvaluate( - opCheckMultiSigVerifyBCH2023({ secp256k1, sha256 }) + opCheckMultiSigVerifyBCH2023({ secp256k1, sha256 }), ), ...(standard ? { [OpcodesBCH2023.OP_NOP1]: conditionallyEvaluate(opNopDisallowed), [OpcodesBCH2023.OP_CHECKLOCKTIMEVERIFY]: conditionallyEvaluate( - opCheckLockTimeVerify + opCheckLockTimeVerify, ), [OpcodesBCH2023.OP_CHECKSEQUENCEVERIFY]: conditionallyEvaluate( - opCheckSequenceVerify + opCheckSequenceVerify, ), [OpcodesBCH2023.OP_NOP4]: conditionallyEvaluate(opNopDisallowed), @@ -537,10 +537,10 @@ export const createInstructionSetBCH2023 = ( : { [OpcodesBCH2023.OP_NOP1]: conditionallyEvaluate(opNop), [OpcodesBCH2023.OP_CHECKLOCKTIMEVERIFY]: conditionallyEvaluate( - opCheckLockTimeVerify + opCheckLockTimeVerify, ), [OpcodesBCH2023.OP_CHECKSEQUENCEVERIFY]: conditionallyEvaluate( - opCheckSequenceVerify + opCheckSequenceVerify, ), [OpcodesBCH2023.OP_NOP4]: conditionallyEvaluate(opNop), [OpcodesBCH2023.OP_NOP5]: conditionallyEvaluate(opNop), @@ -551,10 +551,10 @@ export const createInstructionSetBCH2023 = ( [OpcodesBCH2023.OP_NOP10]: conditionallyEvaluate(opNop), }), [OpcodesBCH2023.OP_CHECKDATASIG]: conditionallyEvaluate( - opCheckDataSig({ secp256k1, sha256 }) + opCheckDataSig({ secp256k1, sha256 }), ), [OpcodesBCH2023.OP_CHECKDATASIGVERIFY]: conditionallyEvaluate( - opCheckDataSigVerify({ secp256k1, sha256 }) + opCheckDataSigVerify({ secp256k1, sha256 }), ), [OpcodesBCH2023.OP_REVERSEBYTES]: conditionallyEvaluate(opReverseBytes), @@ -577,7 +577,7 @@ export const createInstructionSetBCH2023 = ( [OpcodesBCH2023.OP_INPUTBYTECODE]: conditionallyEvaluate(opInputBytecode), [OpcodesBCH2023.OP_INPUTSEQUENCENUMBER]: conditionallyEvaluate( - opInputSequenceNumber + opInputSequenceNumber, ), [OpcodesBCH2023.OP_OUTPUTVALUE]: conditionallyEvaluate(opOutputValue), [OpcodesBCH2023.OP_OUTPUTBYTECODE]: @@ -585,19 +585,19 @@ export const createInstructionSetBCH2023 = ( [OpcodesBCH2023.OP_UTXOTOKENCATEGORY]: conditionallyEvaluate(opUtxoTokenCategory), [OpcodesBCH2023.OP_UTXOTOKENCOMMITMENT]: conditionallyEvaluate( - opUtxoTokenCommitment + opUtxoTokenCommitment, ), [OpcodesBCH2023.OP_UTXOTOKENAMOUNT]: conditionallyEvaluate(opUtxoTokenAmount), [OpcodesBCH2023.OP_OUTPUTTOKENCATEGORY]: conditionallyEvaluate( - opOutputTokenCategory + opOutputTokenCategory, ), [OpcodesBCH2023.OP_OUTPUTTOKENCOMMITMENT]: conditionallyEvaluate( - opOutputTokenCommitment + opOutputTokenCommitment, ), [OpcodesBCH2023.OP_OUTPUTTOKENAMOUNT]: conditionallyEvaluate(opOutputTokenAmount), - } + }, ), }, success: (state: AuthenticationProgramStateBCH) => { @@ -639,11 +639,11 @@ export const createInstructionSetBCH2023 = ( const inputValue = sourceOutputs.reduce( (sum, utxo) => sum + utxo.valueSatoshis, - 0n + 0n, ); const outputValue = transaction.outputs.reduce( (sum, output) => sum + output.valueSatoshis, - 0n + 0n, ); if (outputValue > inputValue) { return `Unable to verify transaction: the sum of transaction outputs exceeds the sum of transaction inputs. Input value: ${inputValue}, output value: ${outputValue}`; @@ -652,11 +652,11 @@ export const createInstructionSetBCH2023 = ( const outpointList = transaction.inputs.map( (input) => `outpointTransactionHash: ${binToHex( - input.outpointTransactionHash - )}, outpointIndex: ${input.outpointIndex}` + input.outpointTransactionHash, + )}, outpointIndex: ${input.outpointIndex}`, ); const firstDuplicate = outpointList.find( - (outpoint, index) => outpointList.lastIndexOf(outpoint) !== index + (outpoint, index) => outpointList.lastIndexOf(outpoint) !== index, ); /** * This check isn't strictly necessary to perform in the VM (assuming the @@ -678,7 +678,7 @@ export const createInstructionSetBCH2023 = ( return `Transaction exceeds maximum standard size: this transaction is ${transactionSize} bytes, but the maximum standard transaction size is ${ConsensusBCH2023.maximumStandardTransactionSize} bytes.`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, output] of sourceOutputs.entries()) { if (!isStandardOutputBytecode2023(output.lockingBytecode)) { return `Standard transactions may only spend standard output types, but source output ${index} is non-standard.`; @@ -687,19 +687,19 @@ export const createInstructionSetBCH2023 = ( // eslint-disable-next-line functional/no-let let totalArbitraryDataBytes = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, output] of transaction.outputs.entries()) { if (!isStandardOutputBytecode2023(output.lockingBytecode)) { return `Standard transactions may only create standard output types, but transaction output ${index} is non-standard.`; } - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (isArbitraryDataOutput(output.lockingBytecode)) { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements totalArbitraryDataBytes += output.lockingBytecode.length + 1; } if (isDustOutput(output)) { return `Standard transactions may not have dust outputs, but transaction output ${index} is a dust output. Output ${index} must have a value of at least ${getDustThreshold( - output + output, )} satoshis. Current value: ${output.valueSatoshis}`; } } @@ -709,7 +709,7 @@ export const createInstructionSetBCH2023 = ( return `Standard transactions may carry no more than ${ConsensusBCH2023.maximumDataCarrierBytes} bytes in arbitrary data outputs; this transaction includes ${totalArbitraryDataBytes} bytes of arbitrary data.`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, input] of transaction.inputs.entries()) { if ( input.unlockingBytecode.length > @@ -725,13 +725,13 @@ export const createInstructionSetBCH2023 = ( const tokenValidationResult = verifyTransactionTokens( transaction, - sourceOutputs + sourceOutputs, ); if (tokenValidationResult !== true) { return tokenValidationResult; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const index of transaction.inputs.keys()) { const state = evaluate({ inputIndex: index, diff --git a/src/lib/vm/instruction-sets/bch/2023/bch-2023-tokens.ts b/src/lib/vm/instruction-sets/bch/2023/bch-2023-tokens.ts index 1eb8bd2a..5c80cf5c 100644 --- a/src/lib/vm/instruction-sets/bch/2023/bch-2023-tokens.ts +++ b/src/lib/vm/instruction-sets/bch/2023/bch-2023-tokens.ts @@ -30,21 +30,21 @@ export const extractGenesisCategories = (inputs: Input[]) => input.outpointIndex === 0 ? [...agg, binToHex(input.outpointTransactionHash)] : agg, - [] + [], ); -interface ImmutableToken { +type ImmutableToken = { categoryHex: string; commitmentHex: string; -} +}; -interface FungibleTokensByCategory { +type FungibleTokensByCategory = { [categoryHex: string]: bigint; -} +}; -interface MutableTokensByCategory { +type MutableTokensByCategory = { [categoryHex: string]: number; -} +}; /** * Given the resolved list of a transaction's source outputs – the Unspent @@ -100,7 +100,7 @@ export const extractSourceOutputTokenData = (sourceOutputs: Output[]) => availableMutableTokensByCategory: {} as MutableTokensByCategory, availableSumsByCategory: {} as FungibleTokensByCategory, inputMintingCategories: [] as string[], - } + }, ); /** @@ -112,7 +112,7 @@ export const extractSourceOutputTokenData = (sourceOutputs: Output[]) => * `outputSumsByCategory`. See CHIP-2022-02-CashTokens for details. */ export const extractTransactionOutputTokenData = ( - outputs: Transaction['outputs'] + outputs: Transaction['outputs'], ) => outputs.reduce( // eslint-disable-next-line complexity @@ -157,7 +157,7 @@ export const extractTransactionOutputTokenData = ( outputMintingCategories: [] as string[], outputMutableTokensByCategory: {} as MutableTokensByCategory, outputSumsByCategory: {} as FungibleTokensByCategory, - } + }, ); /** @@ -171,13 +171,13 @@ export const extractTransactionOutputTokenData = ( // eslint-disable-next-line complexity export const verifyTransactionTokens = ( transaction: Transaction, - sourceOutputs: Output[] + sourceOutputs: Output[], ) => { const excessiveCommitment = [...sourceOutputs, ...transaction.outputs].find( (output) => output.token?.nft?.commitment !== undefined && output.token.nft.commitment.length > - ConsensusBCH2023.maximumCommitmentLength + ConsensusBCH2023.maximumCommitmentLength, ); if (excessiveCommitment !== undefined) { return `Transaction violates token validation: a token commitment exceeds the consensus limit of ${ @@ -206,13 +206,13 @@ export const verifyTransactionTokens = ( ]; const missingMintingCategory = outputMintingCategories.find( - (category) => !availableMintingCategories.includes(category) + (category) => !availableMintingCategories.includes(category), ); if (missingMintingCategory !== undefined) { return `Transaction violates token validation: the transaction outputs include a minting token that is not substantiated by the transaction's inputs. Invalid output minting token category: ${missingMintingCategory}`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [categoryHex, sum] of Object.entries(outputSumsByCategory)) { if (sum > BigInt(ConsensusBCH2023.maxVmNumber)) { return `Transaction violates token validation: the transaction outputs include a sum of fungible tokens for a category exceeding the maximum supply (${ @@ -233,7 +233,7 @@ export const verifyTransactionTokens = ( } const remainingMutableTokens = Object.entries( - outputMutableTokensByCategory + outputMutableTokensByCategory, ).reduce((agg, [categoryHex, sum]) => { if (availableMintingCategories.includes(categoryHex)) { return agg; @@ -241,7 +241,7 @@ export const verifyTransactionTokens = ( return { ...agg, [categoryHex]: (agg[categoryHex] ?? 0) - sum }; }, availableMutableTokensByCategory); - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [categoryHex, sum] of Object.entries(remainingMutableTokens)) { if (sum < 0) { return `Transaction violates token validation: the transaction creates more mutable tokens than are available for a category without a matching minting token. Category: ${categoryHex}, excess mutable tokens: ${ @@ -259,7 +259,7 @@ export const verifyTransactionTokens = ( const firstMatch = availableImmutableTokens.findIndex( (available) => available.categoryHex === categoryHex && - available.commitmentHex === commitmentHex + available.commitmentHex === commitmentHex, ); if (firstMatch === -1) { return { @@ -267,14 +267,14 @@ export const verifyTransactionTokens = ( unmatchedImmutableTokens: [...agg.unmatchedImmutableTokens, token], }; } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data agg.availableImmutableTokens.splice(firstMatch, 1); return agg; }, { availableImmutableTokens, unmatchedImmutableTokens: [] as ImmutableToken[], - } + }, ); const requiredMutableTokens = unmatchedImmutableTokens.reduce( @@ -282,10 +282,10 @@ export const verifyTransactionTokens = ( ...agg, [token.categoryHex]: (agg[token.categoryHex] ?? 0) + 1, }), - {} + {}, ); - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [categoryHex, required] of Object.entries(requiredMutableTokens)) { const available = remainingMutableTokens[categoryHex] ?? 0; if (available < required) { @@ -304,10 +304,10 @@ const enum Constants { export const pushTokenExtendedCategory = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( state: State, - utxo: Output + utxo: Output, ) => { const { token } = utxo; if (token === undefined) { @@ -317,8 +317,8 @@ export const pushTokenExtendedCategory = < token.nft?.capability === 'minting' ? [Constants.mintingCapabilityByte] : token.nft?.capability === 'mutable' - ? [Constants.mutableCapabilityByte] - : []; + ? [Constants.mutableCapabilityByte] + : []; const extendedCategory = flattenBinArray([ token.category.slice().reverse(), Uint8Array.from(capabilityByte), @@ -332,10 +332,10 @@ type TokenOpState = AuthenticationProgramStateError & export const pushTokenCommitment = ( state: State, - utxo: Output + utxo: Output, ) => { const { token } = utxo; - if (token === undefined || token.nft === undefined) { + if (token?.nft === undefined) { return pushToStackVmNumber(state, 0n); } return pushToStackChecked(state, token.nft.commitment); @@ -343,7 +343,7 @@ export const pushTokenCommitment = ( export const pushTokenAmount = ( state: State, - utxo: Output + utxo: Output, ) => { const { token } = utxo; if (token === undefined) { @@ -354,36 +354,36 @@ export const pushTokenAmount = ( export const opUtxoTokenCategory = (state: State) => useTransactionUtxo(state, (nextState, [utxo]) => - pushTokenExtendedCategory(nextState, utxo) + pushTokenExtendedCategory(nextState, utxo), ); export const opUtxoTokenCommitment = ( - state: State + state: State, ) => useTransactionUtxo(state, (nextState, [utxo]) => - pushTokenCommitment(nextState, utxo) + pushTokenCommitment(nextState, utxo), ); export const opUtxoTokenAmount = (state: State) => useTransactionUtxo(state, (nextState, [utxo]) => - pushTokenAmount(nextState, utxo) + pushTokenAmount(nextState, utxo), ); export const opOutputTokenCategory = ( - state: State + state: State, ) => useTransactionOutput(state, (nextState, [output]) => - pushTokenExtendedCategory(nextState, output) + pushTokenExtendedCategory(nextState, output), ); export const opOutputTokenCommitment = ( - state: State + state: State, ) => useTransactionOutput(state, (nextState, [output]) => - pushTokenCommitment(nextState, output) + pushTokenCommitment(nextState, output), ); export const opOutputTokenAmount = (state: State) => useTransactionOutput(state, (nextState, [output]) => - pushTokenAmount(nextState, output) + pushTokenAmount(nextState, output), ); diff --git a/src/lib/vm/instruction-sets/bch/chips/bch-chips-crypto.ts b/src/lib/vm/instruction-sets/bch/chips/bch-chips-crypto.ts index 2c661559..3bf62f69 100644 --- a/src/lib/vm/instruction-sets/bch/chips/bch-chips-crypto.ts +++ b/src/lib/vm/instruction-sets/bch/chips/bch-chips-crypto.ts @@ -62,11 +62,11 @@ export const hashDigestIterations = (messageLength: number) => */ export const incrementHashDigestIterations = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateResourceLimitsBCHCHIPs + AuthenticationProgramStateResourceLimitsBCHCHIPs, >( state: State, messageLength: number, - operation: (nextState: State) => State + operation: (nextState: State) => State, ) => { const requiredTotalIterations = state.hashDigestIterations + hashDigestIterations(messageLength); @@ -74,7 +74,7 @@ export const incrementHashDigestIterations = < return applyError( state, AuthenticationErrorBCHCHIPs.excessiveHashing, - `Required cumulative iterations: ${requiredTotalIterations}` + `Required cumulative iterations: ${requiredTotalIterations}`, ); } return operation(state); @@ -85,19 +85,19 @@ export const opRipemd160ChipLimits = State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & AuthenticationProgramStateResourceLimitsBCHCHIPs & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { ripemd160, }: { ripemd160: { hash: Ripemd160['hash'] }; - } = { ripemd160: internalRipemd160 } + } = { ripemd160: internalRipemd160 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => incrementHashDigestIterations(nextState, value.length, (finalState) => - pushToStack(finalState, ripemd160.hash(value)) - ) + pushToStack(finalState, ripemd160.hash(value)), + ), ); export const opSha1ChipLimits = @@ -105,19 +105,19 @@ export const opSha1ChipLimits = State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & AuthenticationProgramStateResourceLimitsBCHCHIPs & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { sha1, }: { sha1: { hash: Sha1['hash'] }; - } = { sha1: internalSha1 } + } = { sha1: internalSha1 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => incrementHashDigestIterations(nextState, value.length, (finalState) => - pushToStack(finalState, sha1.hash(value)) - ) + pushToStack(finalState, sha1.hash(value)), + ), ); export const opSha256ChipLimits = @@ -125,7 +125,7 @@ export const opSha256ChipLimits = State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & AuthenticationProgramStateResourceLimitsBCHCHIPs & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { sha256, @@ -133,13 +133,13 @@ export const opSha256ChipLimits = sha256: { hash: Sha256['hash']; }; - } = { sha256: internalSha256 } + } = { sha256: internalSha256 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => incrementHashDigestIterations(nextState, value.length, (finalState) => - pushToStack(finalState, sha256.hash(value)) - ) + pushToStack(finalState, sha256.hash(value)), + ), ); export const opHash160ChipLimits = @@ -147,7 +147,7 @@ export const opHash160ChipLimits = State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & AuthenticationProgramStateResourceLimitsBCHCHIPs & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { ripemd160, @@ -155,13 +155,13 @@ export const opHash160ChipLimits = }: { sha256: { hash: Sha256['hash'] }; ripemd160: { hash: Ripemd160['hash'] }; - } = { ripemd160: internalRipemd160, sha256: internalSha256 } + } = { ripemd160: internalRipemd160, sha256: internalSha256 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => incrementHashDigestIterations(nextState, value.length, (finalState) => - pushToStack(finalState, ripemd160.hash(sha256.hash(value))) - ) + pushToStack(finalState, ripemd160.hash(sha256.hash(value))), + ), ); export const opHash256ChipLimits = @@ -169,7 +169,7 @@ export const opHash256ChipLimits = State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & AuthenticationProgramStateResourceLimitsBCHCHIPs & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { sha256, @@ -177,13 +177,13 @@ export const opHash256ChipLimits = sha256: { hash: Sha256['hash']; }; - } = { sha256: internalSha256 } + } = { sha256: internalSha256 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => incrementHashDigestIterations(nextState, value.length, (finalState) => - pushToStack(finalState, hash256(value, sha256)) - ) + pushToStack(finalState, hash256(value, sha256)), + ), ); export const opCheckSigChipLimits = @@ -197,7 +197,7 @@ export const opCheckSigChipLimits = verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ): Operation => (s: State) => // eslint-disable-next-line complexity @@ -205,34 +205,34 @@ export const opCheckSigChipLimits = if (!isValidPublicKeyEncoding(publicKey)) { return applyError( state, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } if ( !isValidSignatureEncodingBCHTransaction( bitcoinEncodedSignature, - SigningSerializationTypesBCH2023 + SigningSerializationTypesBCH2023, ) ) { return applyError( state, AuthenticationErrorCommon.invalidSignatureEncoding, `Transaction signature (including signing serialization type): ${binToHex( - bitcoinEncodedSignature - )}` + bitcoinEncodedSignature, + )}`, ); } const coveredBytecode = encodeAuthenticationInstructions( - state.instructions + state.instructions, ).subarray(state.lastCodeSeparator + 1); const { signingSerializationType, signature } = decodeBitcoinSignature( - bitcoinEncodedSignature + bitcoinEncodedSignature, ); const serialization = generateSigningSerializationBCH( state.program, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const requiredTotalIterations = state.hashDigestIterations + hashDigestIterations(serialization.length); @@ -242,12 +242,12 @@ export const opCheckSigChipLimits = return applyError( state, AuthenticationErrorBCHCHIPs.excessiveHashing, - `Required cumulative iterations: ${requiredTotalIterations}` + `Required cumulative iterations: ${requiredTotalIterations}`, ); } const digest = hash256(serialization, sha256); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.signedMessages.push({ digest, serialization }); const useSchnorr = @@ -276,7 +276,7 @@ export const opCheckMultiSigChipLimits = secp256k1: { verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ) => (s: State) => useOneVmNumber(s, (state, publicKeysValue) => { @@ -285,13 +285,13 @@ export const opCheckMultiSigChipLimits = if (potentialPublicKeys < 0) { return applyError( state, - AuthenticationErrorCommon.invalidNaturalNumber + AuthenticationErrorCommon.invalidNaturalNumber, ); } if (potentialPublicKeys > Multisig.maximumPublicKeys) { return applyError( state, - AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount + AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount, ); } const publicKeys = @@ -307,14 +307,14 @@ export const opCheckMultiSigChipLimits = if (requiredApprovingPublicKeys < 0) { return applyError( nextState, - AuthenticationErrorCommon.invalidNaturalNumber + AuthenticationErrorCommon.invalidNaturalNumber, ); } if (requiredApprovingPublicKeys > potentialPublicKeys) { return applyError( nextState, - AuthenticationErrorCommon.insufficientPublicKeys + AuthenticationErrorCommon.insufficientPublicKeys, ); } @@ -331,18 +331,18 @@ export const opCheckMultiSigChipLimits = if (protocolBugValue.length !== 0) { return applyError( finalState, - AuthenticationErrorCommon.invalidProtocolBugValue + AuthenticationErrorCommon.invalidProtocolBugValue, ); } const coveredBytecode = encodeAuthenticationInstructions( - finalState.instructions + finalState.instructions, ).subarray(finalState.lastCodeSeparator + 1); let approvingPublicKeys = 0; // eslint-disable-line functional/no-let let remainingSignatures = signatures.length; // eslint-disable-line functional/no-let let remainingPublicKeys = publicKeys.length; // eslint-disable-line functional/no-let - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while ( remainingSignatures > 0 && remainingPublicKeys > 0 && @@ -359,22 +359,22 @@ export const opCheckMultiSigChipLimits = if (!isValidPublicKeyEncoding(publicKey)) { return applyError( finalState, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } if ( !isValidSignatureEncodingBCHTransaction( bitcoinEncodedSignature, - SigningSerializationTypesBCH2023 + SigningSerializationTypesBCH2023, ) ) { return applyError( finalState, AuthenticationErrorCommon.invalidSignatureEncoding, `Transaction signature (including signing serialization type): ${binToHex( - bitcoinEncodedSignature - )}` + bitcoinEncodedSignature, + )}`, ); } @@ -384,7 +384,7 @@ export const opCheckMultiSigChipLimits = const serialization = generateSigningSerializationBCH( state.program, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const requiredTotalIterations = state.hashDigestIterations + @@ -396,12 +396,12 @@ export const opCheckMultiSigChipLimits = return applyError( state, AuthenticationErrorBCHCHIPs.excessiveHashing, - `Required cumulative iterations: ${requiredTotalIterations}` + `Required cumulative iterations: ${requiredTotalIterations}`, ); } const digest = hash256(serialization, sha256); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data finalState.signedMessages.push({ digest, serialization }); if ( @@ -409,22 +409,22 @@ export const opCheckMultiSigChipLimits = ) { return applyError( finalState, - AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig + AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig, ); } const signed = secp256k1.verifySignatureDERLowS( signature, publicKey, - digest + digest, ); - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (signed) { - approvingPublicKeys += 1; // eslint-disable-line functional/no-expression-statement - remainingSignatures -= 1; // eslint-disable-line functional/no-expression-statement + approvingPublicKeys += 1; // eslint-disable-line functional/no-expression-statements + remainingSignatures -= 1; // eslint-disable-line functional/no-expression-statements } - remainingPublicKeys -= 1; // eslint-disable-line functional/no-expression-statement + remainingPublicKeys -= 1; // eslint-disable-line functional/no-expression-statements } const success = @@ -436,19 +436,19 @@ export const opCheckMultiSigChipLimits = ) { return applyError( finalState, - AuthenticationErrorCommon.nonNullSignatureFailure + AuthenticationErrorCommon.nonNullSignatureFailure, ); } return pushToStack(finalState, booleanToVmNumber(success)); - } + }, ); - } + }, ); }); export const opCheckSigVerifyChipLimits = < - State extends AuthenticationProgramStateBCHCHIPs + State extends AuthenticationProgramStateBCHCHIPs, >( { secp256k1, @@ -459,15 +459,15 @@ export const opCheckSigVerifyChipLimits = < verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ): Operation => combineOperations( opCheckSigChipLimits({ secp256k1, sha256 }), - opVerify + opVerify, ); export const opCheckMultiSigVerifyChipLimits = < - State extends AuthenticationProgramStateBCHCHIPs + State extends AuthenticationProgramStateBCHCHIPs, >({ secp256k1, sha256, @@ -479,7 +479,7 @@ export const opCheckMultiSigVerifyChipLimits = < }): Operation => combineOperations( opCheckMultiSigChipLimits({ secp256k1, sha256 }), - opVerify + opVerify, ); export const opCheckDataSigChipLimits = @@ -487,7 +487,7 @@ export const opCheckDataSigChipLimits = State extends AuthenticationProgramStateError & AuthenticationProgramStateResourceLimitsBCHCHIPs & AuthenticationProgramStateSignatureAnalysis & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >({ secp256k1, sha256, @@ -505,13 +505,13 @@ export const opCheckDataSigChipLimits = return applyError( nextState, AuthenticationErrorCommon.invalidSignatureEncoding, - `Data signature: ${binToHex(signature)}` + `Data signature: ${binToHex(signature)}`, ); } if (!isValidPublicKeyEncoding(publicKey)) { return applyError( nextState, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } const requiredTotalIterations = @@ -522,12 +522,12 @@ export const opCheckDataSigChipLimits = return applyError( state, AuthenticationErrorBCHCHIPs.excessiveHashing, - `Required cumulative iterations: ${requiredTotalIterations}` + `Required cumulative iterations: ${requiredTotalIterations}`, ); } const digest = sha256.hash(message); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.signedMessages.push({ digest, message }); const useSchnorr = @@ -539,7 +539,7 @@ export const opCheckDataSigChipLimits = return !success && signature.length !== 0 ? applyError( nextState, - AuthenticationErrorCommon.nonNullSignatureFailure + AuthenticationErrorCommon.nonNullSignatureFailure, ) : pushToStack(nextState, booleanToVmNumber(success)); }); @@ -548,7 +548,7 @@ export const opCheckDataSigVerifyChipLimits = < State extends AuthenticationProgramStateError & AuthenticationProgramStateResourceLimitsBCHCHIPs & AuthenticationProgramStateSignatureAnalysis & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { secp256k1, @@ -559,9 +559,9 @@ export const opCheckDataSigVerifyChipLimits = < verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ) => combineOperations( opCheckDataSigChipLimits({ secp256k1, sha256 }), - opVerify + opVerify, ); diff --git a/src/lib/vm/instruction-sets/bch/chips/bch-chips-instruction-set.ts b/src/lib/vm/instruction-sets/bch/chips/bch-chips-instruction-set.ts index 3fb57b80..8503e3f7 100644 --- a/src/lib/vm/instruction-sets/bch/chips/bch-chips-instruction-set.ts +++ b/src/lib/vm/instruction-sets/bch/chips/bch-chips-instruction-set.ts @@ -187,7 +187,7 @@ export const createInstructionSetBCHCHIPs = ( secp256k1: internalSecp256k1, sha1: internalSha1, sha256: internalSha256, - } + }, ): InstructionSet< ResolvedTransactionBCH, AuthenticationProgramBCH, @@ -219,31 +219,31 @@ export const createInstructionSetBCHCHIPs = ( if (unlockingBytecode.length > ConsensusBCH.maximumBytecodeLength) { return applyError( initialState, - `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH.maximumBytecodeLength} bytes).` + `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH.maximumBytecodeLength} bytes).`, ); } if (authenticationInstructionsAreMalformed(unlockingInstructions)) { return applyError( initialState, - AuthenticationErrorCommon.malformedUnlockingBytecode + AuthenticationErrorCommon.malformedUnlockingBytecode, ); } if (!isPushOnly(unlockingBytecode)) { return applyError( initialState, - AuthenticationErrorCommon.requiresPushOnly + AuthenticationErrorCommon.requiresPushOnly, ); } if (lockingBytecode.length > ConsensusBCH.maximumBytecodeLength) { return applyError( initialState, - AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking + AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking, ); } if (authenticationInstructionsAreMalformed(lockingInstructions)) { return applyError( initialState, - AuthenticationErrorCommon.malformedLockingBytecode + AuthenticationErrorCommon.malformedLockingBytecode, ); } const unlockingResult = stateEvaluate(initialState); @@ -253,7 +253,7 @@ export const createInstructionSetBCHCHIPs = ( if (unlockingResult.controlStack.length !== 0) { return applyError( initialState, - AuthenticationErrorCommon.nonEmptyControlStack + AuthenticationErrorCommon.nonEmptyControlStack, ); } const lockingResult = stateEvaluate( @@ -261,7 +261,7 @@ export const createInstructionSetBCHCHIPs = ( instructions: lockingInstructions, program, stack: unlockingResult.stack, - }) + }), ); if (!isPayToScriptHash20(lockingBytecode)) { return lockingResult; @@ -285,7 +285,7 @@ export const createInstructionSetBCHCHIPs = ( instructions: p2shInstructions, program, stack: p2shStack, - }) + }), ); }, every: (state) => { @@ -295,7 +295,7 @@ export const createInstructionSetBCHCHIPs = ( ) { return applyError( state, - AuthenticationErrorCommon.exceededMaximumStackDepth + AuthenticationErrorCommon.exceededMaximumStackDepth, ); } return state; @@ -381,58 +381,58 @@ export const createInstructionSetBCHCHIPs = ( [OpcodesBCHCHIPs.OP_PUSHDATA_2]: conditionallyPush, [OpcodesBCHCHIPs.OP_PUSHDATA_4]: conditionallyPush, [OpcodesBCHCHIPs.OP_1NEGATE]: conditionallyEvaluateChipLoops( - pushNumberOperation(-1) + pushNumberOperation(-1), ), [OpcodesBCHCHIPs.OP_RESERVED]: conditionallyEvaluateChipLoops(reservedOperation), [OpcodesBCHCHIPs.OP_1]: conditionallyEvaluateChipLoops( - pushNumberOperation(1) + pushNumberOperation(1), ), /* eslint-disable @typescript-eslint/no-magic-numbers */ [OpcodesBCHCHIPs.OP_2]: conditionallyEvaluateChipLoops( - pushNumberOperation(2) + pushNumberOperation(2), ), [OpcodesBCHCHIPs.OP_3]: conditionallyEvaluateChipLoops( - pushNumberOperation(3) + pushNumberOperation(3), ), [OpcodesBCHCHIPs.OP_4]: conditionallyEvaluateChipLoops( - pushNumberOperation(4) + pushNumberOperation(4), ), [OpcodesBCHCHIPs.OP_5]: conditionallyEvaluateChipLoops( - pushNumberOperation(5) + pushNumberOperation(5), ), [OpcodesBCHCHIPs.OP_6]: conditionallyEvaluateChipLoops( - pushNumberOperation(6) + pushNumberOperation(6), ), [OpcodesBCHCHIPs.OP_7]: conditionallyEvaluateChipLoops( - pushNumberOperation(7) + pushNumberOperation(7), ), [OpcodesBCHCHIPs.OP_8]: conditionallyEvaluateChipLoops( - pushNumberOperation(8) + pushNumberOperation(8), ), [OpcodesBCHCHIPs.OP_9]: conditionallyEvaluateChipLoops( - pushNumberOperation(9) + pushNumberOperation(9), ), [OpcodesBCHCHIPs.OP_10]: conditionallyEvaluateChipLoops( - pushNumberOperation(10) + pushNumberOperation(10), ), [OpcodesBCHCHIPs.OP_11]: conditionallyEvaluateChipLoops( - pushNumberOperation(11) + pushNumberOperation(11), ), [OpcodesBCHCHIPs.OP_12]: conditionallyEvaluateChipLoops( - pushNumberOperation(12) + pushNumberOperation(12), ), [OpcodesBCHCHIPs.OP_13]: conditionallyEvaluateChipLoops( - pushNumberOperation(13) + pushNumberOperation(13), ), [OpcodesBCHCHIPs.OP_14]: conditionallyEvaluateChipLoops( - pushNumberOperation(14) + pushNumberOperation(14), ), [OpcodesBCHCHIPs.OP_15]: conditionallyEvaluateChipLoops( - pushNumberOperation(15) + pushNumberOperation(15), ), [OpcodesBCHCHIPs.OP_16]: conditionallyEvaluateChipLoops( - pushNumberOperation(16) + pushNumberOperation(16), ), /* eslint-enable @typescript-eslint/no-magic-numbers */ @@ -518,33 +518,33 @@ export const createInstructionSetBCHCHIPs = ( [OpcodesBCHCHIPs.OP_MAX]: conditionallyEvaluateChipLoops(opMax), [OpcodesBCHCHIPs.OP_WITHIN]: conditionallyEvaluateChipLoops(opWithin), [OpcodesBCHCHIPs.OP_RIPEMD160]: conditionallyEvaluateChipLoops( - opRipemd160({ ripemd160 }) + opRipemd160({ ripemd160 }), ), [OpcodesBCHCHIPs.OP_SHA1]: conditionallyEvaluateChipLoops( - opSha1({ sha1 }) + opSha1({ sha1 }), ), [OpcodesBCHCHIPs.OP_SHA256]: conditionallyEvaluateChipLoops( - opSha256({ sha256 }) + opSha256({ sha256 }), ), [OpcodesBCHCHIPs.OP_HASH160]: conditionallyEvaluateChipLoops( - opHash160({ ripemd160, sha256 }) + opHash160({ ripemd160, sha256 }), ), [OpcodesBCHCHIPs.OP_HASH256]: conditionallyEvaluateChipLoops( - opHash256({ sha256 }) + opHash256({ sha256 }), ), [OpcodesBCHCHIPs.OP_CODESEPARATOR]: conditionallyEvaluateChipLoops(opCodeSeparator), [OpcodesBCHCHIPs.OP_CHECKSIG]: conditionallyEvaluateChipLoops( - opCheckSigChipLimits({ secp256k1, sha256 }) + opCheckSigChipLimits({ secp256k1, sha256 }), ), [OpcodesBCHCHIPs.OP_CHECKSIGVERIFY]: conditionallyEvaluateChipLoops( - opCheckSigVerifyChipLimits({ secp256k1, sha256 }) + opCheckSigVerifyChipLimits({ secp256k1, sha256 }), ), [OpcodesBCHCHIPs.OP_CHECKMULTISIG]: conditionallyEvaluateChipLoops( - opCheckMultiSigChipLimits({ secp256k1, sha256 }) + opCheckMultiSigChipLimits({ secp256k1, sha256 }), ), [OpcodesBCHCHIPs.OP_CHECKMULTISIGVERIFY]: conditionallyEvaluateChipLoops( - opCheckMultiSigVerifyChipLimits({ secp256k1, sha256 }) + opCheckMultiSigVerifyChipLimits({ secp256k1, sha256 }), ), ...(standard ? { @@ -584,10 +584,10 @@ export const createInstructionSetBCHCHIPs = ( [OpcodesBCHCHIPs.OP_NOP10]: conditionallyEvaluateChipLoops(opNop), }), [OpcodesBCHCHIPs.OP_CHECKDATASIG]: conditionallyEvaluateChipLoops( - opCheckDataSig({ secp256k1, sha256 }) + opCheckDataSig({ secp256k1, sha256 }), ), [OpcodesBCHCHIPs.OP_CHECKDATASIGVERIFY]: conditionallyEvaluateChipLoops( - opCheckDataSigVerify({ secp256k1, sha256 }) + opCheckDataSigVerify({ secp256k1, sha256 }), ), [OpcodesBCHCHIPs.OP_REVERSEBYTES]: conditionallyEvaluateChipLoops(opReverseBytes), @@ -614,7 +614,7 @@ export const createInstructionSetBCHCHIPs = ( [OpcodesBCHCHIPs.OP_INPUTBYTECODE]: conditionallyEvaluateChipLoops(opInputBytecode), [OpcodesBCHCHIPs.OP_INPUTSEQUENCENUMBER]: conditionallyEvaluateChipLoops( - opInputSequenceNumber + opInputSequenceNumber, ), [OpcodesBCHCHIPs.OP_OUTPUTVALUE]: conditionallyEvaluateChipLoops(opOutputValue), @@ -623,12 +623,12 @@ export const createInstructionSetBCHCHIPs = ( [OpcodesBCHCHIPs.OP_UTXOTOKENCATEGORY]: conditionallyEvaluateChipLoops(opUtxoTokenCategory), [OpcodesBCHCHIPs.OP_UTXOTOKENCOMMITMENT]: conditionallyEvaluateChipLoops( - opUtxoTokenCommitment + opUtxoTokenCommitment, ), [OpcodesBCHCHIPs.OP_UTXOTOKENAMOUNT]: conditionallyEvaluateChipLoops(opUtxoTokenAmount), [OpcodesBCHCHIPs.OP_OUTPUTTOKENCATEGORY]: conditionallyEvaluateChipLoops( - opOutputTokenCategory + opOutputTokenCategory, ), [OpcodesBCHCHIPs.OP_OUTPUTTOKENCOMMITMENT]: conditionallyEvaluateChipLoops(opOutputTokenCommitment), @@ -683,7 +683,7 @@ export const createInstructionSetBCHCHIPs = ( return `Transaction exceeds maximum standard size: this transaction is ${transactionSize} bytes, but the maximum standard transaction size is ${ConsensusBCH.maximumStandardTransactionSize} bytes.`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, output] of sourceOutputs.entries()) { if (!isStandardOutputBytecode(output.lockingBytecode)) { return `Standard transactions may only spend standard output types, but source output ${index} is non-standard.`; @@ -692,15 +692,15 @@ export const createInstructionSetBCHCHIPs = ( // eslint-disable-next-line functional/no-let let totalArbitraryDataBytes = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, output] of transaction.outputs.entries()) { if (!isStandardOutputBytecode(output.lockingBytecode)) { return `Standard transactions may only create standard output types, but transaction output ${index} is non-standard.`; } - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (isArbitraryDataOutput(output.lockingBytecode)) { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements totalArbitraryDataBytes += output.lockingBytecode.length + 1; } /* @@ -714,7 +714,7 @@ export const createInstructionSetBCHCHIPs = ( return `Standard transactions may carry no more than ${ConsensusBCH.maximumDataCarrierBytes} bytes in arbitrary data outputs; this transaction includes ${totalArbitraryDataBytes} bytes of arbitrary data.`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, input] of transaction.inputs.entries()) { if ( input.unlockingBytecode.length > @@ -728,7 +728,7 @@ export const createInstructionSetBCHCHIPs = ( } } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const index of transaction.inputs.keys()) { const state = evaluate({ inputIndex: index, diff --git a/src/lib/vm/instruction-sets/bch/chips/bch-chips-loops.ts b/src/lib/vm/instruction-sets/bch/chips/bch-chips-loops.ts index 5eb82fe7..6e312db2 100644 --- a/src/lib/vm/instruction-sets/bch/chips/bch-chips-loops.ts +++ b/src/lib/vm/instruction-sets/bch/chips/bch-chips-loops.ts @@ -21,9 +21,9 @@ import { import { AuthenticationErrorBCHCHIPs } from './bch-chips-errors.js'; const executionIsActive = < - State extends AuthenticationProgramStateControlStackCHIPs + State extends AuthenticationProgramStateControlStackCHIPs, >( - state: State + state: State, ) => state.controlStack.every((item) => item !== false); /** @@ -32,7 +32,7 @@ const executionIsActive = < */ export const conditionallyEvaluateChipLoops = ( - operation: Operation + operation: Operation, ): Operation => (state: State) => executionIsActive(state) ? operation(state) : state; @@ -40,10 +40,10 @@ export const conditionallyEvaluateChipLoops = export const undefinedOperationChipLoops = conditionallyEvaluateChipLoops( < State extends AuthenticationProgramStateControlStackCHIPs & - AuthenticationProgramStateError + AuthenticationProgramStateError, >( - state: State - ) => applyError(state, AuthenticationErrorCommon.unknownOpcode) + state: State, + ) => applyError(state, AuthenticationErrorCommon.unknownOpcode), ); export const pushOperationChipLoops = @@ -51,9 +51,9 @@ export const pushOperationChipLoops = State extends AuthenticationProgramStateControlStackCHIPs & AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - maximumPushSize = ConsensusCommon.maximumStackItemLength + maximumPushSize = ConsensusCommon.maximumStackItemLength as number, ): Operation => (state: State) => { const instruction = state.instructions[ @@ -62,13 +62,13 @@ export const pushOperationChipLoops = return instruction.data.length > maximumPushSize ? applyError( state, - `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${instruction.data.length} bytes.` + `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${instruction.data.length} bytes.`, ) : executionIsActive(state) - ? isMinimalDataPush(instruction.opcode, instruction.data) - ? pushToStack(state, instruction.data) - : applyError(state, AuthenticationErrorCommon.nonMinimalPush) - : state; + ? isMinimalDataPush(instruction.opcode, instruction.data) + ? pushToStack(state, instruction.data) + : applyError(state, AuthenticationErrorCommon.nonMinimalPush) + : state; }; /** @@ -77,12 +77,12 @@ export const pushOperationChipLoops = * @param data - the value to push to the stack */ export const pushToControlStackChipLoops = < - State extends AuthenticationProgramStateControlStackCHIPs + State extends AuthenticationProgramStateControlStackCHIPs, >( state: State, - value: boolean | number + value: boolean | number, ) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.controlStack.push(value); return state; }; @@ -90,13 +90,13 @@ export const pushToControlStackChipLoops = < export const opIfChipLoops = < State extends AuthenticationProgramStateControlStackCHIPs & AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => { if (executionIsActive(state)) { return useOneStackItem(state, (nextState, [item]) => - pushToControlStackChipLoops(nextState, stackItemIsTruthy(item)) + pushToControlStackChipLoops(nextState, stackItemIsTruthy(item)), ); } return pushToControlStackChipLoops(state, false); @@ -105,13 +105,13 @@ export const opIfChipLoops = < export const opNotIfChipLoops = < State extends AuthenticationProgramStateControlStackCHIPs & AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => { if (executionIsActive(state)) { return useOneStackItem(state, (nextState, [item]) => - pushToControlStackChipLoops(nextState, !stackItemIsTruthy(item)) + pushToControlStackChipLoops(nextState, !stackItemIsTruthy(item)), ); } return pushToControlStackChipLoops(state, false); @@ -119,9 +119,9 @@ export const opNotIfChipLoops = < export const opEndIfChipLoops = < State extends AuthenticationProgramStateControlStackCHIPs & - AuthenticationProgramStateError + AuthenticationProgramStateError, >( - state: State + state: State, ) => { // eslint-disable-next-line functional/immutable-data const element = state.controlStack.pop(); @@ -133,37 +133,37 @@ export const opEndIfChipLoops = < export const opElseChipLoops = < State extends AuthenticationProgramStateControlStackCHIPs & - AuthenticationProgramStateError + AuthenticationProgramStateError, >( - state: State + state: State, ) => { const top = state.controlStack[state.controlStack.length - 1]; if (typeof top !== 'boolean') { return applyError(state, AuthenticationErrorCommon.unexpectedElse); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.controlStack[state.controlStack.length - 1] = !top; return state; }; export const opBegin = ( - state: State + state: State, ) => pushToControlStackChipLoops(state, state.ip); export const opUntil = ( - state: State + state: State, ) => { // eslint-disable-next-line functional/immutable-data const controlValue = state.controlStack.pop(); if (typeof controlValue !== 'number') { return applyError(state, AuthenticationErrorBCHCHIPs.unexpectedUntil); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.repeatedBytes += encodeAuthenticationInstructions( - state.instructions.slice(controlValue, state.ip) + state.instructions.slice(controlValue, state.ip), ).length; const activeBytecodeLength = encodeAuthenticationInstructions( - state.instructions + state.instructions, ).length; if ( state.repeatedBytes + activeBytecodeLength > @@ -172,14 +172,14 @@ export const opUntil = ( return applyError( state, AuthenticationErrorBCHCHIPs.excessiveLooping, - `Repeated bytes: ${state.repeatedBytes}; active bytecode length: ${activeBytecodeLength}` + `Repeated bytes: ${state.repeatedBytes}; active bytecode length: ${activeBytecodeLength}`, ); } return useOneStackItem(state, (nextState, [item]) => { if (item.length === 1 && item[0] === 1) { return nextState; } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.ip = controlValue - 1; return nextState; }); diff --git a/src/lib/vm/instruction-sets/bch/chips/bch-chips-types.ts b/src/lib/vm/instruction-sets/bch/chips/bch-chips-types.ts index 19f9a52e..68e502bc 100644 --- a/src/lib/vm/instruction-sets/bch/chips/bch-chips-types.ts +++ b/src/lib/vm/instruction-sets/bch/chips/bch-chips-types.ts @@ -31,7 +31,7 @@ export enum ConsensusBCHCHIPs { export type AuthenticationProgramStateControlStackCHIPs = AuthenticationProgramStateControlStack; -export interface AuthenticationProgramStateResourceLimitsBCHCHIPs { +export type AuthenticationProgramStateResourceLimitsBCHCHIPs = { /** * An unsigned integer counter used by `OP_UNTIL` to prevent excessive use of * loops. @@ -42,18 +42,18 @@ export interface AuthenticationProgramStateResourceLimitsBCHCHIPs { * iterations that required during this evaluation. */ hashDigestIterations: number; -} +}; -export interface AuthenticationProgramStateBCHCHIPs - extends AuthenticationProgramStateMinimum, - AuthenticationProgramStateStack, - AuthenticationProgramStateAlternateStack, - AuthenticationProgramStateControlStackCHIPs, - AuthenticationProgramStateError, - AuthenticationProgramStateCodeSeparator, - AuthenticationProgramStateSignatureAnalysis, - AuthenticationProgramStateTransactionContext, - AuthenticationProgramStateResourceLimitsBCHCHIPs {} +export type AuthenticationProgramStateBCHCHIPs = + AuthenticationProgramStateAlternateStack & + AuthenticationProgramStateCodeSeparator & + AuthenticationProgramStateControlStackCHIPs & + AuthenticationProgramStateError & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateResourceLimitsBCHCHIPs & + AuthenticationProgramStateSignatureAnalysis & + AuthenticationProgramStateStack & + AuthenticationProgramStateTransactionContext; export type AuthenticationVirtualMachineBCHCHIPs = AuthenticationVirtualMachine< ResolvedTransactionBCH, @@ -61,10 +61,13 @@ export type AuthenticationVirtualMachineBCHCHIPs = AuthenticationVirtualMachine< AuthenticationProgramStateBCHCHIPs >; +/** + * @deprecated use `structuredClone` instead + */ export const cloneAuthenticationProgramStateBCHCHIPs = < - State extends AuthenticationProgramStateBCHCHIPs + State extends AuthenticationProgramStateBCHCHIPs, >( - state: Readonly + state: State, ) => ({ ...(state.error === undefined ? {} : { error: state.error }), alternateStack: cloneStack(state.alternateStack), @@ -89,8 +92,8 @@ export const createAuthenticationProgramStateBCHCHIPs = ({ instructions, stack, }: { - program: Readonly; - instructions: readonly AuthenticationInstruction[]; + program: AuthenticationProgramCommon; + instructions: AuthenticationInstruction[]; stack: Uint8Array[]; }): AuthenticationProgramStateBCHCHIPs => ({ alternateStack: [], diff --git a/src/lib/vm/instruction-sets/btc/btc-types.ts b/src/lib/vm/instruction-sets/btc/btc-types.ts index 44a4e740..c24cada7 100644 --- a/src/lib/vm/instruction-sets/btc/btc-types.ts +++ b/src/lib/vm/instruction-sets/btc/btc-types.ts @@ -1,9 +1,8 @@ import type { AuthenticationProgramStateCommon } from '../../../lib.js'; -export interface SegWitState { - readonly witnessBytecode: Uint8Array; -} +export type SegWitState = { + witnessBytecode: Uint8Array; +}; -export interface AuthenticationProgramStateBTC - extends AuthenticationProgramStateCommon, - SegWitState {} +export type AuthenticationProgramStateBTC = AuthenticationProgramStateCommon & + SegWitState; diff --git a/src/lib/vm/instruction-sets/common/arithmetic.ts b/src/lib/vm/instruction-sets/common/arithmetic.ts index 2577f40d..5f8c2a10 100644 --- a/src/lib/vm/instruction-sets/common/arithmetic.ts +++ b/src/lib/vm/instruction-sets/common/arithmetic.ts @@ -20,247 +20,247 @@ import { export const op1Add = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, [value]) => - pushToStackVmNumberChecked(nextState, value + 1n) + pushToStackVmNumberChecked(nextState, value + 1n), ); export const op1Sub = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, [value]) => - pushToStack(nextState, bigIntToVmNumber(value - 1n)) + pushToStack(nextState, bigIntToVmNumber(value - 1n)), ); export const opNegate = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, [value]) => - pushToStack(nextState, bigIntToVmNumber(-value)) + pushToStack(nextState, bigIntToVmNumber(-value)), ); export const opAbs = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, [value]) => - pushToStack(nextState, bigIntToVmNumber(value < 0 ? -value : value)) + pushToStack(nextState, bigIntToVmNumber(value < 0 ? -value : value)), ); export const opNot = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, [value]) => pushToStack( nextState, - value === 0n ? bigIntToVmNumber(1n) : bigIntToVmNumber(0n) - ) + value === 0n ? bigIntToVmNumber(1n) : bigIntToVmNumber(0n), + ), ); export const op0NotEqual = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, [value]) => pushToStack( nextState, - value === 0n ? bigIntToVmNumber(0n) : bigIntToVmNumber(1n) - ) + value === 0n ? bigIntToVmNumber(0n) : bigIntToVmNumber(1n), + ), ); export const opAdd = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStackVmNumberChecked(nextState, firstValue + secondValue) + pushToStackVmNumberChecked(nextState, firstValue + secondValue), ); export const opSub = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, bigIntToVmNumber(firstValue - secondValue)) + pushToStack(nextState, bigIntToVmNumber(firstValue - secondValue)), ); export const opBoolAnd = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - booleanToVmNumber(firstValue !== 0n && secondValue !== 0n) - ) + booleanToVmNumber(firstValue !== 0n && secondValue !== 0n), + ), ); export const opBoolOr = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - booleanToVmNumber(firstValue !== 0n || secondValue !== 0n) - ) + booleanToVmNumber(firstValue !== 0n || secondValue !== 0n), + ), ); export const opNumEqual = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToVmNumber(firstValue === secondValue)) + pushToStack(nextState, booleanToVmNumber(firstValue === secondValue)), ); export const opNumEqualVerify = combineOperations(opNumEqual, opVerify); export const opNumNotEqual = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToVmNumber(firstValue !== secondValue)) + pushToStack(nextState, booleanToVmNumber(firstValue !== secondValue)), ); export const opLessThan = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToVmNumber(firstValue < secondValue)) + pushToStack(nextState, booleanToVmNumber(firstValue < secondValue)), ); export const opLessThanOrEqual = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToVmNumber(firstValue <= secondValue)) + pushToStack(nextState, booleanToVmNumber(firstValue <= secondValue)), ); export const opGreaterThan = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToVmNumber(firstValue > secondValue)) + pushToStack(nextState, booleanToVmNumber(firstValue > secondValue)), ); export const opGreaterThanOrEqual = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToVmNumber(firstValue >= secondValue)) + pushToStack(nextState, booleanToVmNumber(firstValue >= secondValue)), ); export const opMin = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - bigIntToVmNumber(firstValue < secondValue ? firstValue : secondValue) - ) + bigIntToVmNumber(firstValue < secondValue ? firstValue : secondValue), + ), ); export const opMax = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - bigIntToVmNumber(firstValue > secondValue ? firstValue : secondValue) - ) + bigIntToVmNumber(firstValue > secondValue ? firstValue : secondValue), + ), ); export const opWithin = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useThreeVmNumbers(state, (nextState, [firstValue, secondValue, thirdValue]) => pushToStack( nextState, - booleanToVmNumber(secondValue <= firstValue && firstValue < thirdValue) - ) + booleanToVmNumber(secondValue <= firstValue && firstValue < thirdValue), + ), ); export const opMul = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStackVmNumberChecked(nextState, firstValue * secondValue) + pushToStackVmNumberChecked(nextState, firstValue * secondValue), ); export const opDiv = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => secondValue === 0n ? applyError(nextState, AuthenticationErrorCommon.divisionByZero) - : pushToStack(nextState, bigIntToVmNumber(firstValue / secondValue)) + : pushToStack(nextState, bigIntToVmNumber(firstValue / secondValue)), ); export const opMod = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => secondValue === 0n ? applyError(nextState, AuthenticationErrorCommon.divisionByZero) - : pushToStack(nextState, bigIntToVmNumber(firstValue % secondValue)) + : pushToStack(nextState, bigIntToVmNumber(firstValue % secondValue)), ); diff --git a/src/lib/vm/instruction-sets/common/bitwise.ts b/src/lib/vm/instruction-sets/common/bitwise.ts index ee46a9ba..64a2c9de 100644 --- a/src/lib/vm/instruction-sets/common/bitwise.ts +++ b/src/lib/vm/instruction-sets/common/bitwise.ts @@ -16,12 +16,12 @@ import { booleanToVmNumber } from './instruction-sets-utils.js'; export const opEqual = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [element1, element2]) => - pushToStack(nextState, booleanToVmNumber(binsAreEqual(element1, element2))) + pushToStack(nextState, booleanToVmNumber(binsAreEqual(element1, element2))), ); export const opEqualVerify = combineOperations(opEqual, opVerify); @@ -29,9 +29,9 @@ export const opEqualVerify = combineOperations(opEqual, opVerify); export const bitwiseOperation = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - combine: (a: Uint8Array, b: Uint8Array) => Uint8Array + combine: (a: Uint8Array, b: Uint8Array) => Uint8Array, ): Operation => (state: State) => useTwoStackItems(state, (nextState, [a, b]) => @@ -39,30 +39,30 @@ export const bitwiseOperation = ? pushToStack(nextState, combine(a, b)) : applyError( nextState, - AuthenticationErrorCommon.mismatchedBitwiseOperandLength - ) + AuthenticationErrorCommon.mismatchedBitwiseOperandLength, + ), ); // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion export const opAnd = bitwiseOperation((a, b) => a.map((v, i) => v & b[i]!)) as < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => State; // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion export const opOr = bitwiseOperation((a, b) => a.map((v, i) => v | b[i]!)) as < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => State; // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion export const opXor = bitwiseOperation((a, b) => a.map((v, i) => v ^ b[i]!)) as < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => State; diff --git a/src/lib/vm/instruction-sets/common/combinators.ts b/src/lib/vm/instruction-sets/common/combinators.ts index 4b3f3dda..285a8418 100644 --- a/src/lib/vm/instruction-sets/common/combinators.ts +++ b/src/lib/vm/instruction-sets/common/combinators.ts @@ -16,18 +16,18 @@ import { export const incrementOperationCount = ( - operation: Operation + operation: Operation, ): Operation => (state: State) => { const nextState = operation(state); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.operationCount += 1; return nextState; }; export const conditionallyEvaluate = ( - operation: Operation + operation: Operation, ): Operation => (state: State) => state.controlStack.every((item) => item) ? operation(state) : state; @@ -41,7 +41,7 @@ export const conditionallyEvaluate = */ export const mapOverOperations = ( combinators: ((operation: Operation) => Operation)[], - operationMap: InstructionSetOperationMapping + operationMap: InstructionSetOperationMapping, ) => Object.keys(operationMap).reduce>( (result, opcode) => ({ @@ -49,10 +49,10 @@ export const mapOverOperations = ( [opcode]: combinators.reduce>( (op, combinator) => combinator(op), // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - operationMap[Number(opcode)]! + operationMap[Number(opcode)]!, ), }), - {} + {}, ); /** @@ -60,10 +60,10 @@ export const mapOverOperations = ( */ export const useOneStackItem = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, - operation: (nextState: State, [value]: [Uint8Array]) => State + operation: (nextState: State, [value]: [Uint8Array]) => State, ) => { // eslint-disable-next-line functional/immutable-data const item = state.stack.pop(); @@ -75,39 +75,39 @@ export const useOneStackItem = < export const useTwoStackItems = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: ( nextState: State, - [valueTop, valueTwo]: [Uint8Array, Uint8Array] - ) => State + [valueTop, valueTwo]: [Uint8Array, Uint8Array], + ) => State, ) => useOneStackItem(state, (nextState, [valueTwo]) => useOneStackItem(nextState, (lastState, [valueTop]) => - operation(lastState, [valueTop, valueTwo]) - ) + operation(lastState, [valueTop, valueTwo]), + ), ); export const useThreeStackItems = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: ( nextState: State, - [valueTop, valueTwo, valueThree]: [Uint8Array, Uint8Array, Uint8Array] - ) => State + [valueTop, valueTwo, valueThree]: [Uint8Array, Uint8Array, Uint8Array], + ) => State, ) => useOneStackItem(state, (nextState, [valueThree]) => useTwoStackItems(nextState, (lastState, [valueTop, valueTwo]) => - operation(lastState, [valueTop, valueTwo, valueThree]) - ) + operation(lastState, [valueTop, valueTwo, valueThree]), + ), ); export const useFourStackItems = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: ( @@ -116,19 +116,19 @@ export const useFourStackItems = < Uint8Array, Uint8Array, Uint8Array, - Uint8Array - ] - ) => State + Uint8Array, + ], + ) => State, ) => useTwoStackItems(state, (nextState, [valueThree, valueFour]) => useTwoStackItems(nextState, (lastState, [valueTop, valueTwo]) => - operation(lastState, [valueTop, valueTwo, valueThree, valueFour]) - ) + operation(lastState, [valueTop, valueTwo, valueThree, valueFour]), + ), ); export const useSixStackItems = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: ( @@ -139,9 +139,9 @@ export const useSixStackItems = < Uint8Array, Uint8Array, Uint8Array, - Uint8Array - ] - ) => State + Uint8Array, + ], + ) => State, ) => useFourStackItems( state, @@ -154,15 +154,15 @@ export const useSixStackItems = < valueFour, valueFive, valueSix, - ]) - ) + ]), + ), ); const typicalMaximumVmNumberByteLength = 8; export const useOneVmNumber = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: (nextState: State, [value]: [bigint]) => State, @@ -175,7 +175,7 @@ export const useOneVmNumber = < } = { maximumVmNumberByteLength: typicalMaximumVmNumberByteLength, requireMinimalEncoding: true, - } + }, ) => useOneStackItem(state, (nextState, [item]) => { const value = vmNumberToBigInt(item, { @@ -190,12 +190,12 @@ export const useOneVmNumber = < export const useTwoVmNumbers = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: ( nextState: State, - [firstValue, secondValue]: [bigint, bigint] + [firstValue, secondValue]: [bigint, bigint], ) => State, { maximumVmNumberByteLength = typicalMaximumVmNumberByteLength, @@ -206,7 +206,7 @@ export const useTwoVmNumbers = < } = { maximumVmNumberByteLength: typicalMaximumVmNumberByteLength, requireMinimalEncoding: true, - } + }, ) => useOneVmNumber( state, @@ -218,22 +218,22 @@ export const useTwoVmNumbers = < { maximumVmNumberByteLength, requireMinimalEncoding, - } + }, ), { maximumVmNumberByteLength, requireMinimalEncoding, - } + }, ); export const useThreeVmNumbers = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: ( nextState: State, - [firstValue, secondValue, thirdValue]: [bigint, bigint, bigint] + [firstValue, secondValue, thirdValue]: [bigint, bigint, bigint], ) => State, { maximumVmNumberByteLength = typicalMaximumVmNumberByteLength, @@ -244,7 +244,7 @@ export const useThreeVmNumbers = < } = { maximumVmNumberByteLength: typicalMaximumVmNumberByteLength, requireMinimalEncoding: true, - } + }, ) => useTwoVmNumbers( state, @@ -256,12 +256,12 @@ export const useThreeVmNumbers = < { maximumVmNumberByteLength, requireMinimalEncoding, - } + }, ), { maximumVmNumberByteLength, requireMinimalEncoding, - } + }, ); /** @@ -271,9 +271,10 @@ export const useThreeVmNumbers = < */ export const pushToStack = ( state: State, + // eslint-disable-next-line functional/functional-parameters ...data: Uint8Array[] ) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.stack.push(...data); return state; }; @@ -286,19 +287,19 @@ export const pushToStack = ( */ export const pushToStackChecked = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, item: Uint8Array, - maximumLength = ConsensusCommon.maximumStackItemLength + maximumLength = ConsensusCommon.maximumStackItemLength as number, ) => { if (item.length > maximumLength) { return applyError( state, - `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${item.length} bytes.` + `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${item.length} bytes.`, ); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.stack.push(item); return state; }; @@ -310,10 +311,10 @@ export const pushToStackChecked = < */ export const pushToStackVmNumber = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, - vmNumber: bigint + vmNumber: bigint, ) => pushToStack(state, bigIntToVmNumber(vmNumber)); /** @@ -324,13 +325,13 @@ export const pushToStackVmNumber = < */ export const pushToStackVmNumberChecked = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, vmNumber: bigint, minVmNumber = BigInt(ConsensusCommon.minVmNumber), - maxVmNumber = BigInt(ConsensusCommon.maxVmNumber) - // eslint-disable-next-line max-params + maxVmNumber = BigInt(ConsensusCommon.maxVmNumber), + // eslint-disable-next-line @typescript-eslint/max-params ) => { if (vmNumber > maxVmNumber || vmNumber < minVmNumber) { return applyError(state, AuthenticationErrorCommon.overflowsVmNumberRange); @@ -341,7 +342,7 @@ export const pushToStackVmNumberChecked = < export const combineOperations = ( firstOperation: Operation, - secondOperation: Operation + secondOperation: Operation, ) => (state: State) => secondOperation(firstOperation(state)); diff --git a/src/lib/vm/instruction-sets/common/common-types.ts b/src/lib/vm/instruction-sets/common/common-types.ts index fea0288d..95ce890d 100644 --- a/src/lib/vm/instruction-sets/common/common-types.ts +++ b/src/lib/vm/instruction-sets/common/common-types.ts @@ -24,19 +24,19 @@ import { cloneAuthenticationInstruction } from './instruction-sets-utils.js'; export const undefinedOperation = conditionallyEvaluate( < State extends AuthenticationProgramStateControlStack & - AuthenticationProgramStateError + AuthenticationProgramStateError, >( - state: State - ) => applyError(state, AuthenticationErrorCommon.unknownOpcode) + state: State, + ) => applyError(state, AuthenticationErrorCommon.unknownOpcode), ); export const checkLimitsCommon = < State extends AuthenticationProgramStateAlternateStack & AuthenticationProgramStateError & - AuthenticationProgramStateStack & { operationCount: number } + AuthenticationProgramStateStack & { operationCount: number }, >( - operation: Operation + operation: Operation, ): Operation => (state: State) => { const nextState = operation(state); @@ -44,17 +44,20 @@ export const checkLimitsCommon = ConsensusCommon.maximumStackDepth ? applyError( nextState, - AuthenticationErrorCommon.exceededMaximumStackDepth + AuthenticationErrorCommon.exceededMaximumStackDepth, ) : nextState.operationCount > ConsensusCommon.maximumOperationCount - ? applyError( - nextState, - AuthenticationErrorCommon.exceededMaximumOperationCount - ) - : nextState; + ? applyError( + nextState, + AuthenticationErrorCommon.exceededMaximumOperationCount, + ) + : nextState; }; -export const cloneStack = (stack: readonly Readonly[]) => +/** + * @deprecated use `structuredClone` instead + */ +export const cloneStack = (stack: Uint8Array[]) => stack.map((item) => item.slice()); export const createAuthenticationProgramStateCommon = ({ @@ -62,8 +65,8 @@ export const createAuthenticationProgramStateCommon = ({ instructions, stack, }: { - program: Readonly; - instructions: readonly AuthenticationInstruction[]; + program: AuthenticationProgramCommon; + instructions: AuthenticationInstruction[]; stack: Uint8Array[]; }): AuthenticationProgramStateCommon => ({ alternateStack: [], @@ -78,20 +81,26 @@ export const createAuthenticationProgramStateCommon = ({ stack, }); +/** + * @deprecated use `structuredClone` instead + */ export const cloneAuthenticationProgramCommon = < - Program extends AuthenticationProgramCommon + Program extends AuthenticationProgramCommon, >( - program: Readonly + program: Program, ) => ({ inputIndex: program.inputIndex, sourceOutputs: cloneTransactionOutputsCommon(program.sourceOutputs), transaction: cloneTransactionCommon(program.transaction), }); +/** + * @deprecated use `structuredClone` instead + */ export const cloneAuthenticationProgramStateCommon = < - State extends AuthenticationProgramStateCommon + State extends AuthenticationProgramStateCommon, >( - state: Readonly + state: State, ) => ({ ...(state.error === undefined ? {} : { error: state.error }), alternateStack: cloneStack(state.alternateStack), @@ -111,8 +120,14 @@ export const cloneAuthenticationProgramStateCommon = < stack: cloneStack(state.stack), }); +/** + * @deprecated use `structuredClone` instead + */ export const cloneAuthenticationProgramStateBCH = cloneAuthenticationProgramStateCommon; +/** + * @deprecated use `structuredClone` instead + */ export const cloneAuthenticationProgramState = cloneAuthenticationProgramStateBCH; @@ -126,13 +141,13 @@ export const cloneAuthenticationProgramState = * provided in anticipation of a future signing serialization algorithm that * supports committing to UTXO bytecode values. */ -export interface CompilationContext< - TransactionType extends TransactionCommon> -> { +export type CompilationContext< + TransactionType extends TransactionCommon>, +> = { inputIndex: number; sourceOutputs: Output[]; transaction: TransactionType; -} +}; export type CompilationContextCommon = CompilationContext< TransactionCommon> @@ -178,16 +193,13 @@ export const createCompilationContextCommonTesting = ({ unlockingBytecode: undefined, }, ], - locktime: locktime === undefined ? 0 : locktime, - outputs: - outputs === undefined - ? [ - { - lockingBytecode: Uint8Array.from([]), - valueSatoshis: 0xffffffffffffffffn, - }, - ] - : outputs, - version: version === undefined ? 0 : version, + locktime: locktime ?? 0, + outputs: outputs ?? [ + { + lockingBytecode: Uint8Array.from([]), + valueSatoshis: 0xffffffffffffffffn, + }, + ], + version: version ?? 0, }, }); diff --git a/src/lib/vm/instruction-sets/common/consensus.ts b/src/lib/vm/instruction-sets/common/consensus.ts index fc226792..b304f18d 100644 --- a/src/lib/vm/instruction-sets/common/consensus.ts +++ b/src/lib/vm/instruction-sets/common/consensus.ts @@ -48,6 +48,7 @@ export enum ConsensusCommon { * A.K.A. `MAXIMUM_ELEMENT_SIZE_64_BIT` */ maximumVmNumberLength = 8, + // eslint-disable-next-line @typescript-eslint/no-mixed-enums minVmNumber = '-9223372036854775807', maxVmNumber = '9223372036854775807', schnorrSignatureLength = 64, diff --git a/src/lib/vm/instruction-sets/common/crypto.ts b/src/lib/vm/instruction-sets/common/crypto.ts index e3f93d02..afac5090 100644 --- a/src/lib/vm/instruction-sets/common/crypto.ts +++ b/src/lib/vm/instruction-sets/common/crypto.ts @@ -46,41 +46,41 @@ export const opRipemd160 = < State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { ripemd160, }: { ripemd160: { hash: Ripemd160['hash'] }; - } = { ripemd160: internalRipemd160 } + } = { ripemd160: internalRipemd160 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, ripemd160.hash(value)) + pushToStack(nextState, ripemd160.hash(value)), ); export const opSha1 = < State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { sha1, }: { sha1: { hash: Sha1['hash'] }; - } = { sha1: internalSha1 } + } = { sha1: internalSha1 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, sha1.hash(value)) + pushToStack(nextState, sha1.hash(value)), ); export const opSha256 = < State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { sha256, @@ -88,18 +88,18 @@ export const opSha256 = sha256: { hash: Sha256['hash']; }; - } = { sha256: internalSha256 } + } = { sha256: internalSha256 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, sha256.hash(value)) + pushToStack(nextState, sha256.hash(value)), ); export const opHash160 = < State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { ripemd160, @@ -107,18 +107,18 @@ export const opHash160 = }: { sha256: { hash: Sha256['hash'] }; ripemd160: { hash: Ripemd160['hash'] }; - } = { ripemd160: internalRipemd160, sha256: internalSha256 } + } = { ripemd160: internalRipemd160, sha256: internalSha256 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, ripemd160.hash(sha256.hash(value))) + pushToStack(nextState, ripemd160.hash(sha256.hash(value))), ); export const opHash256 = < State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { sha256, @@ -126,21 +126,21 @@ export const opHash256 = sha256: { hash: Sha256['hash']; }; - } = { sha256: internalSha256 } + } = { sha256: internalSha256 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, hash256(value, sha256)) + pushToStack(nextState, hash256(value, sha256)), ); export const opCodeSeparator = < State extends AuthenticationProgramStateMinimum & { lastCodeSeparator: number; - } + }, >( - state: State + state: State, ) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.lastCodeSeparator = state.ip; return state; }; @@ -156,7 +156,7 @@ export const opCheckSig = verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ): Operation => (s: State) => // eslint-disable-next-line complexity @@ -164,38 +164,38 @@ export const opCheckSig = if (!isValidPublicKeyEncoding(publicKey)) { return applyError( state, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } if ( !isValidSignatureEncodingBCHTransaction( bitcoinEncodedSignature, - SigningSerializationTypesBCH + SigningSerializationTypesBCH, ) ) { return applyError( state, AuthenticationErrorCommon.invalidSignatureEncoding, `Transaction signature (including signing serialization): ${binToHex( - bitcoinEncodedSignature - )}` + bitcoinEncodedSignature, + )}`, ); } const coveredBytecode = encodeAuthenticationInstructions( - state.instructions + state.instructions, ).subarray(state.lastCodeSeparator + 1); const { signingSerializationType, signature } = decodeBitcoinSignature( - bitcoinEncodedSignature + bitcoinEncodedSignature, ); const serialization = generateSigningSerializationBCH( state.program, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const digest = hash256(serialization, sha256); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.signedMessages.push({ digest, serialization }); const useSchnorr = @@ -224,7 +224,7 @@ export const opCheckMultiSig = secp256k1: { verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ) => (s: State) => useOneVmNumber(s, (state, publicKeysValue) => { @@ -233,26 +233,26 @@ export const opCheckMultiSig = if (potentialPublicKeys < 0) { return applyError( state, - AuthenticationErrorCommon.invalidNaturalNumber + AuthenticationErrorCommon.invalidNaturalNumber, ); } if (potentialPublicKeys > Multisig.maximumPublicKeys) { return applyError( state, - AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount + AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount, ); } const publicKeys = // eslint-disable-next-line functional/immutable-data potentialPublicKeys > 0 ? state.stack.splice(-potentialPublicKeys) : []; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.operationCount += potentialPublicKeys; return state.operationCount > ConsensusCommon.maximumOperationCount ? applyError( state, - AuthenticationErrorCommon.exceededMaximumOperationCount + AuthenticationErrorCommon.exceededMaximumOperationCount, ) : useOneVmNumber( state, @@ -263,14 +263,14 @@ export const opCheckMultiSig = if (requiredApprovingPublicKeys < 0) { return applyError( nextState, - AuthenticationErrorCommon.invalidNaturalNumber + AuthenticationErrorCommon.invalidNaturalNumber, ); } if (requiredApprovingPublicKeys > potentialPublicKeys) { return applyError( nextState, - AuthenticationErrorCommon.insufficientPublicKeys + AuthenticationErrorCommon.insufficientPublicKeys, ); } @@ -287,18 +287,18 @@ export const opCheckMultiSig = if (protocolBugValue.length !== 0) { return applyError( finalState, - AuthenticationErrorCommon.invalidProtocolBugValue + AuthenticationErrorCommon.invalidProtocolBugValue, ); } const coveredBytecode = encodeAuthenticationInstructions( - finalState.instructions + finalState.instructions, ).subarray(finalState.lastCodeSeparator + 1); let approvingPublicKeys = 0; // eslint-disable-line functional/no-let let remainingSignatures = signatures.length; // eslint-disable-line functional/no-let let remainingPublicKeys = publicKeys.length; // eslint-disable-line functional/no-let - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while ( remainingSignatures > 0 && remainingPublicKeys > 0 && @@ -315,22 +315,22 @@ export const opCheckMultiSig = if (!isValidPublicKeyEncoding(publicKey)) { return applyError( finalState, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } if ( !isValidSignatureEncodingBCHTransaction( bitcoinEncodedSignature, - SigningSerializationTypesBCH + SigningSerializationTypesBCH, ) ) { return applyError( finalState, AuthenticationErrorCommon.invalidSignatureEncoding, `Transaction signature (including signing serialization type): ${binToHex( - bitcoinEncodedSignature - )}` + bitcoinEncodedSignature, + )}`, ); } @@ -340,11 +340,11 @@ export const opCheckMultiSig = const serialization = generateSigningSerializationBCH( state.program, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const digest = hash256(serialization, sha256); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data finalState.signedMessages.push({ digest, serialization }); if ( @@ -353,22 +353,22 @@ export const opCheckMultiSig = ) { return applyError( finalState, - AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig + AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig, ); } const signed = secp256k1.verifySignatureDERLowS( signature, publicKey, - digest + digest, ); - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (signed) { - approvingPublicKeys += 1; // eslint-disable-line functional/no-expression-statement - remainingSignatures -= 1; // eslint-disable-line functional/no-expression-statement + approvingPublicKeys += 1; // eslint-disable-line functional/no-expression-statements + remainingSignatures -= 1; // eslint-disable-line functional/no-expression-statements } - remainingPublicKeys -= 1; // eslint-disable-line functional/no-expression-statement + remainingPublicKeys -= 1; // eslint-disable-line functional/no-expression-statements } const success = @@ -380,19 +380,19 @@ export const opCheckMultiSig = ) { return applyError( finalState, - AuthenticationErrorCommon.nonNullSignatureFailure + AuthenticationErrorCommon.nonNullSignatureFailure, ); } return pushToStack(finalState, booleanToVmNumber(success)); - } + }, ); - } + }, ); }); export const opCheckSigVerify = < - State extends AuthenticationProgramStateCommon + State extends AuthenticationProgramStateCommon, >( { secp256k1, @@ -403,12 +403,12 @@ export const opCheckSigVerify = < verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ): Operation => combineOperations(opCheckSig({ secp256k1, sha256 }), opVerify); export const opCheckMultiSigVerify = < - State extends AuthenticationProgramStateCommon + State extends AuthenticationProgramStateCommon, >({ secp256k1, sha256, @@ -435,7 +435,7 @@ export const opCheckDataSig = < State extends AuthenticationProgramStateError & AuthenticationProgramStateSignatureAnalysis & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >({ secp256k1, sha256, @@ -453,18 +453,18 @@ export const opCheckDataSig = return applyError( nextState, AuthenticationErrorCommon.invalidSignatureEncoding, - `Data signature: ${binToHex(signature)}` + `Data signature: ${binToHex(signature)}`, ); } if (!isValidPublicKeyEncoding(publicKey)) { return applyError( nextState, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } const digest = sha256.hash(message); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.signedMessages.push({ digest, message }); const useSchnorr = @@ -476,7 +476,7 @@ export const opCheckDataSig = return !success && signature.length !== 0 ? applyError( nextState, - AuthenticationErrorCommon.nonNullSignatureFailure + AuthenticationErrorCommon.nonNullSignatureFailure, ) : pushToStack(nextState, booleanToVmNumber(success)); }); @@ -484,7 +484,7 @@ export const opCheckDataSig = export const opCheckDataSigVerify = < State extends AuthenticationProgramStateError & AuthenticationProgramStateSignatureAnalysis & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { secp256k1, @@ -495,12 +495,12 @@ export const opCheckDataSigVerify = < verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ) => combineOperations(opCheckDataSig({ secp256k1, sha256 }), opVerify); export const opReverseBytes = ( - state: State + state: State, ) => useOneStackItem(state, (nextState, [item]) => - pushToStack(nextState, item.slice().reverse()) + pushToStack(nextState, item.slice().reverse()), ); diff --git a/src/lib/vm/instruction-sets/common/encoding.ts b/src/lib/vm/instruction-sets/common/encoding.ts index 1dee21df..a0c38e52 100644 --- a/src/lib/vm/instruction-sets/common/encoding.ts +++ b/src/lib/vm/instruction-sets/common/encoding.ts @@ -5,7 +5,7 @@ const enum ASN1 { integerTagType = 0x02, } -/* eslint-disable @typescript-eslint/no-duplicate-enum-values, @typescript-eslint/prefer-literal-enum-member, @typescript-eslint/restrict-plus-operands */ +/* eslint-disable @typescript-eslint/no-duplicate-enum-values, @typescript-eslint/prefer-literal-enum-member */ const enum DER { minimumLength = 8, maximumLength = 72, @@ -26,7 +26,7 @@ const enum DER { integerMetadataBytes + minimumSValueBytes, } -/* eslint-enable @typescript-eslint/no-duplicate-enum-values, @typescript-eslint/prefer-literal-enum-member, @typescript-eslint/restrict-plus-operands */ +/* eslint-enable @typescript-eslint/no-duplicate-enum-values, @typescript-eslint/prefer-literal-enum-member */ const enum Mask { negative = 0x80, @@ -39,7 +39,7 @@ const isNegative = (value: number | undefined) => const hasUnnecessaryPadding = ( length: number | undefined, firstByte: number | undefined, - secondByte: number | undefined + secondByte: number | undefined, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion ) => length! > 1 && firstByte === 0 && !isNegative(secondByte); @@ -47,8 +47,8 @@ const isValidInteger = ( signature: Uint8Array, tagIndex: number, length: number, - valueIndex: number - // eslint-disable-next-line max-params + valueIndex: number, + // eslint-disable-next-line @typescript-eslint/max-params ) => signature[tagIndex] === ASN1.integerTagType && length !== 0 && @@ -56,7 +56,7 @@ const isValidInteger = ( !hasUnnecessaryPadding( length, signature[valueIndex], - signature[valueIndex + 1] + signature[valueIndex + 1], ); /** @@ -103,9 +103,9 @@ export const isValidSignatureEncodingDER = (signature: Uint8Array) => { signature, DER.rTagIndex, rLength, - DER.rValueIndex + DER.rValueIndex, ); - const sTagIndex = DER.rValueIndex + rLength; // eslint-disable-line @typescript-eslint/restrict-plus-operands + const sTagIndex = DER.rValueIndex + rLength; const sLengthIndex = sTagIndex + 1; const sLength = signature[sLengthIndex]; if (sLength === undefined) { @@ -133,17 +133,17 @@ export const isValidSignatureEncodingDER = (signature: Uint8Array) => { */ export const isValidSignatureEncodingBCHTransaction = ( transactionSignature: Uint8Array, - validSigningSerializationTypes: number[] + validSigningSerializationTypes: number[], ) => transactionSignature.length === 0 || (validSigningSerializationTypes.includes( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - transactionSignature[transactionSignature.length - 1]! + transactionSignature[transactionSignature.length - 1]!, ) && (transactionSignature.length === ConsensusCommon.schnorrSignatureLength + 1 || isValidSignatureEncodingDER( - transactionSignature.slice(0, transactionSignature.length - 1) + transactionSignature.slice(0, transactionSignature.length - 1), ))); /** diff --git a/src/lib/vm/instruction-sets/common/errors.ts b/src/lib/vm/instruction-sets/common/errors.ts index 56708bd1..feb36698 100644 --- a/src/lib/vm/instruction-sets/common/errors.ts +++ b/src/lib/vm/instruction-sets/common/errors.ts @@ -66,11 +66,8 @@ export enum AuthenticationErrorCommon { export const applyError = ( state: State, errorType: string, - errorDetails?: string + errorDetails?: string, ): State => ({ ...state, - error: - state.error === undefined - ? formatError(errorType, errorDetails) - : state.error, + error: state.error ?? formatError(errorType, errorDetails), }); diff --git a/src/lib/vm/instruction-sets/common/flow-control.ts b/src/lib/vm/instruction-sets/common/flow-control.ts index a9d3c71f..d4cb5c0e 100644 --- a/src/lib/vm/instruction-sets/common/flow-control.ts +++ b/src/lib/vm/instruction-sets/common/flow-control.ts @@ -10,41 +10,41 @@ import { stackItemIsTruthy } from './instruction-sets-utils.js'; export const opVerify = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneStackItem(state, (nextState, [item]) => stackItemIsTruthy(item) ? nextState - : applyError(nextState, AuthenticationErrorCommon.failedVerify) + : applyError(nextState, AuthenticationErrorCommon.failedVerify), ); export const reservedOperation = < - State extends AuthenticationProgramStateError + State extends AuthenticationProgramStateError, >( - state: State + state: State, ) => applyError(state, AuthenticationErrorCommon.calledReserved); export const opReturn = ( - state: State + state: State, ) => applyError(state, AuthenticationErrorCommon.calledReturn); export const opIf = < State extends AuthenticationProgramStateControlStack & AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => { if (state.controlStack.every((item) => item)) { return useOneStackItem(state, (nextState, [item]) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.controlStack.push(stackItemIsTruthy(item)); return state; }); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.controlStack.push(false); return state; }; @@ -57,27 +57,27 @@ export const opIf = < export const opNotIf = < State extends AuthenticationProgramStateControlStack & AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => { if (state.controlStack.every((item) => item)) { return useOneStackItem(state, (nextState, [item]) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.controlStack.push(!stackItemIsTruthy(item)); return state; }); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.controlStack.push(false); return state; }; export const opEndIf = < State extends AuthenticationProgramStateControlStack & - AuthenticationProgramStateError + AuthenticationProgramStateError, >( - state: State + state: State, ) => { // eslint-disable-next-line functional/immutable-data const element = state.controlStack.pop(); @@ -89,15 +89,15 @@ export const opEndIf = < export const opElse = < State extends AuthenticationProgramStateControlStack & - AuthenticationProgramStateError + AuthenticationProgramStateError, >( - state: State + state: State, ) => { const top = state.controlStack[state.controlStack.length - 1]; if (top === undefined) { return applyError(state, AuthenticationErrorCommon.unexpectedElse); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.controlStack[state.controlStack.length - 1] = !top; return state; }; diff --git a/src/lib/vm/instruction-sets/common/format.ts b/src/lib/vm/instruction-sets/common/format.ts index bf99fb55..0272195e 100644 --- a/src/lib/vm/instruction-sets/common/format.ts +++ b/src/lib/vm/instruction-sets/common/format.ts @@ -17,26 +17,26 @@ import { bigIntToVmNumber } from './instruction-sets-utils.js'; export const opCat = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [a, b]) => - pushToStackChecked(nextState, flattenBinArray([a, b])) + pushToStackChecked(nextState, flattenBinArray([a, b])), ); export const opSplit = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, value) => { const index = Number(value); return useOneStackItem(nextState, (finalState, [item]) => index < 0 || index > item.length ? applyError(finalState, AuthenticationErrorCommon.invalidSplitIndex) - : pushToStack(finalState, item.slice(0, index), item.slice(index)) + : pushToStack(finalState, item.slice(0, index), item.slice(index)), ); }); @@ -50,40 +50,40 @@ const enum Constants { */ export const padMinimallyEncodedVmNumber = ( vmNumber: Uint8Array, - length: number + length: number, ) => { // eslint-disable-next-line functional/no-let let signBit = Constants.positiveSign; - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (vmNumber.length > 0) { - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, @typescript-eslint/no-non-null-assertion + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, @typescript-eslint/no-non-null-assertion signBit = vmNumber[vmNumber.length - 1]! & Constants.negativeSign; - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, functional/immutable-data vmNumber[vmNumber.length - 1] &= Constants.negativeSign - 1; } const result = Array.from(vmNumber); - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (result.length < length - 1) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data result.push(0); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data result.push(signBit); return Uint8Array.from(result); }; export const opNum2Bin = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, value) => { const targetLength = Number(value); return targetLength > ConsensusCommon.maximumStackItemLength ? applyError( nextState, - `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${targetLength} bytes.` + `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${targetLength} bytes.`, ) : useOneVmNumber( nextState, @@ -92,29 +92,29 @@ export const opNum2Bin = < return minimallyEncoded.length > targetLength ? applyError( finalState, - AuthenticationErrorCommon.insufficientLength + AuthenticationErrorCommon.insufficientLength, ) : minimallyEncoded.length === targetLength - ? pushToStack(finalState, minimallyEncoded) - : pushToStack( - finalState, - padMinimallyEncodedVmNumber(minimallyEncoded, targetLength) - ); + ? pushToStack(finalState, minimallyEncoded) + : pushToStack( + finalState, + padMinimallyEncodedVmNumber(minimallyEncoded, targetLength), + ); }, { maximumVmNumberByteLength: // TODO: is this right? ConsensusCommon.maximumStackItemLength as number, requireMinimalEncoding: false, - } + }, ); }); export const opBin2Num = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, @@ -123,7 +123,7 @@ export const opBin2Num = < return minimallyEncoded.length > ConsensusCommon.maximumVmNumberLength ? applyError( nextState, - AuthenticationErrorCommon.exceededMaximumVmNumberLength + AuthenticationErrorCommon.exceededMaximumVmNumberLength, ) : pushToStack(nextState, minimallyEncoded); }, @@ -132,5 +132,5 @@ export const opBin2Num = < maximumVmNumberByteLength: ConsensusCommon.maximumStackItemLength as number, requireMinimalEncoding: false, - } + }, ); diff --git a/src/lib/vm/instruction-sets/common/inspection.ts b/src/lib/vm/instruction-sets/common/inspection.ts index cd7c9754..e3f3f466 100644 --- a/src/lib/vm/instruction-sets/common/inspection.ts +++ b/src/lib/vm/instruction-sets/common/inspection.ts @@ -20,9 +20,9 @@ import { encodeAuthenticationInstructions } from './instruction-sets-utils.js'; export const opInputIndex = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => pushToStackVmNumberChecked(state, BigInt(state.program.inputIndex)); export const opActiveBytecode = < @@ -30,76 +30,76 @@ export const opActiveBytecode = < AuthenticationProgramStateError & AuthenticationProgramStateMinimum & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => pushToStackChecked( state, encodeAuthenticationInstructions( - state.instructions.slice(state.lastCodeSeparator + 1) - ) + state.instructions.slice(state.lastCodeSeparator + 1), + ), ); export const opTxVersion = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => pushToStackVmNumberChecked( state, - BigInt(int32UnsignedToSigned(state.program.transaction.version)) + BigInt(int32UnsignedToSigned(state.program.transaction.version)), ); export const opTxInputCount = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => pushToStackVmNumberChecked( state, - BigInt(state.program.transaction.inputs.length) + BigInt(state.program.transaction.inputs.length), ); export const opTxOutputCount = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => pushToStackVmNumberChecked( state, - BigInt(state.program.transaction.outputs.length) + BigInt(state.program.transaction.outputs.length), ); export const opTxLocktime = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => pushToStackVmNumberChecked(state, BigInt(state.program.transaction.locktime)); export const useTransactionUtxo = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( state: State, - operation: (nextState: State, [utxo]: [Output]) => State + operation: (nextState: State, [utxo]: [Output]) => State, ) => useOneVmNumber(state, (nextState, [index]) => { const utxo = nextState.program.sourceOutputs[Number(index)]; if (utxo === undefined) { return applyError( nextState, - AuthenticationErrorCommon.invalidTransactionUtxoIndex + AuthenticationErrorCommon.invalidTransactionUtxoIndex, ); } return operation(state, [utxo]); @@ -108,39 +108,39 @@ export const useTransactionUtxo = < export const opUtxoValue = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionUtxo(state, (nextState, [utxo]) => - pushToStackVmNumberChecked(nextState, utxo.valueSatoshis) + pushToStackVmNumberChecked(nextState, utxo.valueSatoshis), ); export const opUtxoBytecode = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionUtxo(state, (nextState, [utxo]) => - pushToStackChecked(nextState, utxo.lockingBytecode.slice()) + pushToStackChecked(nextState, utxo.lockingBytecode.slice()), ); export const useTransactionInput = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( state: State, - operation: (nextState: State, [input]: [Input]) => State + operation: (nextState: State, [input]: [Input]) => State, ) => useOneVmNumber(state, (nextState, [index]) => { const input = nextState.program.transaction.inputs[Number(index)]; if (input === undefined) { return applyError( nextState, - AuthenticationErrorCommon.invalidTransactionInputIndex + AuthenticationErrorCommon.invalidTransactionInputIndex, ); } return operation(state, [input]); @@ -149,64 +149,64 @@ export const useTransactionInput = < export const opOutpointTxHash = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionInput(state, (nextState, [input]) => pushToStackChecked( nextState, - input.outpointTransactionHash.slice().reverse() - ) + input.outpointTransactionHash.slice().reverse(), + ), ); export const opOutpointIndex = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionInput(state, (nextState, [input]) => - pushToStackVmNumberChecked(nextState, BigInt(input.outpointIndex)) + pushToStackVmNumberChecked(nextState, BigInt(input.outpointIndex)), ); export const opInputBytecode = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionInput(state, (nextState, [input]) => - pushToStackChecked(nextState, input.unlockingBytecode.slice()) + pushToStackChecked(nextState, input.unlockingBytecode.slice()), ); export const opInputSequenceNumber = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionInput(state, (nextState, [input]) => - pushToStackVmNumberChecked(nextState, BigInt(input.sequenceNumber)) + pushToStackVmNumberChecked(nextState, BigInt(input.sequenceNumber)), ); export const useTransactionOutput = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( state: State, - operation: (nextState: State, [output]: [Output]) => State + operation: (nextState: State, [output]: [Output]) => State, ) => useOneVmNumber(state, (nextState, [index]) => { const input = nextState.program.transaction.outputs[Number(index)]; if (input === undefined) { return applyError( nextState, - AuthenticationErrorCommon.invalidTransactionOutputIndex + AuthenticationErrorCommon.invalidTransactionOutputIndex, ); } return operation(state, [input]); @@ -215,21 +215,21 @@ export const useTransactionOutput = < export const opOutputValue = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionOutput(state, (nextState, [output]) => - pushToStackVmNumberChecked(nextState, output.valueSatoshis) + pushToStackVmNumberChecked(nextState, output.valueSatoshis), ); export const opOutputBytecode = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionOutput(state, (nextState, [output]) => - pushToStackChecked(nextState, output.lockingBytecode.slice()) + pushToStackChecked(nextState, output.lockingBytecode.slice()), ); diff --git a/src/lib/vm/instruction-sets/common/instruction-sets-types.ts b/src/lib/vm/instruction-sets/common/instruction-sets-types.ts index 10922ed0..9f66e6e6 100644 --- a/src/lib/vm/instruction-sets/common/instruction-sets-types.ts +++ b/src/lib/vm/instruction-sets/common/instruction-sets-types.ts @@ -2,27 +2,27 @@ * A well-formed "push" authentication instruction (`OP_PUSHBYTES*` or * `OP_PUSHDATA*`). */ -export interface AuthenticationInstructionPush { +export type AuthenticationInstructionPush = { /** * The data to be pushed to the stack. */ - readonly data: Uint8Array; + data: Uint8Array; /** * The opcode used to push this data. */ - readonly opcode: number; -} + opcode: number; +}; /** * An authentication instruction indicating an operation (as opposed to a * {@link AuthenticationInstructionPush}). */ -export interface AuthenticationInstructionOperation { +export type AuthenticationInstructionOperation = { /** * The opcode of this instruction's operation. */ - readonly opcode: number; -} + opcode: number; +}; /** * A well-formed instruction used by an {@link AuthenticationVirtualMachine}. @@ -44,38 +44,38 @@ type Uint32Bytes = 4; * A malformed `OP_PUSHDATA*` authentication instruction in which the length * byte is incomplete (the bytecode ends before enough bytes can be read). */ -export interface AuthenticationInstructionPushMalformedLength { +export type AuthenticationInstructionPushMalformedLength = { /** * The expected number of length bytes (`length.length`) for this * `OP_PUSHDATA*` operation. */ - readonly expectedLengthBytes: Uint8Bytes | Uint16Bytes | Uint32Bytes; + expectedLengthBytes: Uint8Bytes | Uint16Bytes | Uint32Bytes; /** * The length `Uint8Array` provided. This instruction is malformed because the * length of this `Uint8Array` is shorter than the `expectedLengthBytes`. */ - readonly length: Uint8Array; - readonly malformed: true; - readonly opcode: number; -} + length: Uint8Array; + malformed: true; + opcode: number; +}; /** * A malformed "push" authentication instruction in which the pushed data is * incomplete (the bytecode ends before enough bytes can be read). */ -export interface AuthenticationInstructionPushMalformedData { +export type AuthenticationInstructionPushMalformedData = { /** * The data `Uint8Array` provided. This instruction is malformed because the * length of this `Uint8Array` is shorter than the `expectedDataBytes`. */ - readonly data: Uint8Array; + data: Uint8Array; /** * The expected number of `data` bytes for this push operation. */ - readonly expectedDataBytes: number; - readonly malformed: true; - readonly opcode: number; -} + expectedDataBytes: number; + malformed: true; + opcode: number; +}; /** * A malformed authentication instruction (the bytecode ends before enough bytes @@ -101,7 +101,7 @@ export type AuthenticationInstructionMaybeMalformed = export type AuthenticationInstructionsMalformed = [ ...AuthenticationInstruction[], - AuthenticationInstructionMalformed + AuthenticationInstructionMalformed, ]; /** diff --git a/src/lib/vm/instruction-sets/common/instruction-sets-utils.spec.ts b/src/lib/vm/instruction-sets/common/instruction-sets-utils.spec.ts index 578317f7..39feea1d 100644 --- a/src/lib/vm/instruction-sets/common/instruction-sets-utils.spec.ts +++ b/src/lib/vm/instruction-sets/common/instruction-sets-utils.spec.ts @@ -1,4 +1,3 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import type { @@ -26,11 +25,12 @@ import { range, } from '../../../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + test('Each Opcodes enum contains a single instruction for 0-255', (t) => { const expected = range(256); - const names = (keys: readonly string[]) => - keys.filter((k) => isNaN(parseInt(k, 10))); - const numbers = (keys: readonly string[]) => + const names = (keys: string[]) => keys.filter((k) => isNaN(parseInt(k, 10))); + const numbers = (keys: string[]) => keys.map((k) => parseInt(k, 10)).filter((k) => !isNaN(k)); const bch = Object.keys(OpcodesBCH2022); @@ -53,10 +53,10 @@ test('Each Opcodes enum contains a single instruction for 0-255', (t) => { * - element 3 - `length`, hex-encoded (if present) * - element 4 - `expectedLengthBytes`, hex-encoded (if present) */ -type CommonScriptParseAndAsmTests = Readonly<{ +type CommonScriptParseAndAsmTests = { [scriptHex: string]: { - readonly asm: string; - readonly parse: ( + asm: string; + parse: ( | [number, string, number, string, number] | [number, string, number] | [number, string] @@ -64,7 +64,7 @@ type CommonScriptParseAndAsmTests = Readonly<{ | [number] )[]; }; -}>; +}; const defToFixtures = (tests: CommonScriptParseAndAsmTests) => Object.entries(tests).map((entry) => { @@ -190,15 +190,15 @@ const disassemble = test.macro< t.deepEqual( disassembleAuthenticationInstructionsMaybeMalformed( OpcodesBCH2022, - input + input, ), - expected + expected, ); }, title: (title) => `disassemble script: ${title ?? ''}`.trim(), }); -const encode = test.macro<[readonly AuthenticationInstruction[], Uint8Array]>({ +const encode = test.macro<[AuthenticationInstruction[], Uint8Array]>({ exec: (t, input, expected) => { t.deepEqual(encodeAuthenticationInstructions(input), expected); }, @@ -211,7 +211,7 @@ const reEncode = test.macro< exec: (t, input, expected) => { t.deepEqual( encodeAuthenticationInstructionsMaybeMalformed(input), - expected + expected, ); }, title: (title) => `re-encode parsed script: ${title ?? ''}`.trim(), @@ -284,9 +284,9 @@ test('disassembleBytecode', (t) => { t.deepEqual( disassembleBytecode( TestOpcodes, - Uint8Array.from([0, 81, 82, 83, 81, 82, 83]) + Uint8Array.from([0, 81, 82, 83, 81, 82, 83]), ), - 'OP_PUSH_EMPTY OP_A OP_B OP_C OP_A OP_B OP_C' + 'OP_PUSH_EMPTY OP_A OP_B OP_C OP_A OP_B OP_C', ); }); @@ -294,9 +294,9 @@ test('assembleBytecode', (t) => { t.deepEqual( assembleBytecode( generateBytecodeMap(TestOpcodes), - 'OP_PUSH_EMPTY OP_A OP_B OP_C OP_A OP_B OP_C' + 'OP_PUSH_EMPTY OP_A OP_B OP_C OP_A OP_B OP_C', ), - { bytecode: Uint8Array.from([0, 81, 82, 83, 81, 82, 83]), success: true } + { bytecode: Uint8Array.from([0, 81, 82, 83, 81, 82, 83]), success: true }, ); }); @@ -337,16 +337,16 @@ testProp( ) as AuthenticationInstruction[]; const minimalPush = instructions.map((instruction) => [OpcodesBCH2022.OP_PUSHDATA_2, OpcodesBCH2022.OP_PUSHDATA_4].includes( - instruction.opcode + instruction.opcode, ) ? { opcode: OpcodesBCH2022.OP_1 } : instruction.opcode === OpcodesBCH2022.OP_PUSHDATA_1 && - (instruction as AuthenticationInstructionPush).data.length < 76 - ? { - data: new Uint8Array(76), - opcode: OpcodesBCH2022.OP_PUSHDATA_1, - } - : instruction + (instruction as AuthenticationInstructionPush).data.length < 76 + ? { + data: new Uint8Array(76), + opcode: OpcodesBCH2022.OP_PUSHDATA_1, + } + : instruction, ); const encoded = encodeAuthenticationInstructions(minimalPush); @@ -357,7 +357,7 @@ testProp( return; } t.deepEqual(encoded, reassembled.bytecode); - } + }, ); testProp( @@ -372,16 +372,16 @@ testProp( ) as AuthenticationInstruction[]; const minimalPush = instructions.map((instruction) => [OpcodesBTC.OP_PUSHDATA_2, OpcodesBTC.OP_PUSHDATA_4].includes( - instruction.opcode + instruction.opcode, ) ? { opcode: OpcodesBTC.OP_1 } : instruction.opcode === OpcodesBTC.OP_PUSHDATA_1 && - (instruction as AuthenticationInstructionPush).data.length < 76 - ? { - data: new Uint8Array(76), - opcode: OpcodesBTC.OP_PUSHDATA_1, - } - : instruction + (instruction as AuthenticationInstructionPush).data.length < 76 + ? { + data: new Uint8Array(76), + opcode: OpcodesBTC.OP_PUSHDATA_1, + } + : instruction, ); const encoded = encodeAuthenticationInstructions(minimalPush); @@ -392,5 +392,5 @@ testProp( return; } t.deepEqual(encoded, reassembled.bytecode); - } + }, ); diff --git a/src/lib/vm/instruction-sets/common/instruction-sets-utils.ts b/src/lib/vm/instruction-sets/common/instruction-sets-utils.ts index 113bd8e3..a1d68b05 100644 --- a/src/lib/vm/instruction-sets/common/instruction-sets-utils.ts +++ b/src/lib/vm/instruction-sets/common/instruction-sets-utils.ts @@ -30,7 +30,7 @@ import { OpcodesBTC } from '../btc/btc-opcodes.js'; * @param instruction - the instruction to check */ export const authenticationInstructionIsMalformed = ( - instruction: AuthenticationInstructionMaybeMalformed + instruction: AuthenticationInstructionMaybeMalformed, ): instruction is AuthenticationInstructionMalformed => 'malformed' in instruction; @@ -40,14 +40,14 @@ export const authenticationInstructionIsMalformed = ( * @param instructions - the array of instructions to check */ export const authenticationInstructionsAreMalformed = ( - instructions: AuthenticationInstructionsMaybeMalformed + instructions: AuthenticationInstructionsMaybeMalformed, ): instructions is AuthenticationInstructionsMalformed => instructions.length > 0 && // eslint-disable-next-line @typescript-eslint/no-non-null-assertion authenticationInstructionIsMalformed(instructions[instructions.length - 1]!); export const authenticationInstructionsArePushInstructions = ( - instructions: AuthenticationInstructions + instructions: AuthenticationInstructions, ): instructions is AuthenticationInstructionPush[] => instructions.every((instruction) => 'data' in instruction); @@ -69,15 +69,15 @@ const uint32Bytes = 4; export const decodeLittleEndianNumber = ( bytecode: Uint8Array, index: number, - length: typeof uint8Bytes | typeof uint16Bytes | typeof uint32Bytes + length: typeof uint8Bytes | typeof uint16Bytes | typeof uint32Bytes, ) => { const view = new DataView(bytecode.buffer, index, length); const readAsLittleEndian = true; return length === uint8Bytes ? view.getUint8(0) : length === uint16Bytes - ? view.getUint16(0, readAsLittleEndian) - : view.getUint32(0, readAsLittleEndian); + ? view.getUint16(0, readAsLittleEndian) + : view.getUint32(0, readAsLittleEndian); }; /** @@ -86,13 +86,13 @@ export const decodeLittleEndianNumber = ( * @param opcode - an opcode between 0x00 and 0xff */ export const opcodeToPushLength = ( - opcode: number + opcode: number, ): typeof uint8Bytes | typeof uint16Bytes | typeof uint32Bytes | 0 => ({ [CommonPushOpcodes.OP_PUSHDATA_1]: uint8Bytes as typeof uint8Bytes, [CommonPushOpcodes.OP_PUSHDATA_2]: uint16Bytes as typeof uint16Bytes, [CommonPushOpcodes.OP_PUSHDATA_4]: uint32Bytes as typeof uint32Bytes, - }[opcode] ?? 0); + })[opcode] ?? 0; /** * Decode one instruction from the provided virtual machine bytecode. @@ -113,7 +113,7 @@ export const opcodeToPushLength = ( // eslint-disable-next-line complexity export const decodeAuthenticationInstruction = ( bytecode: Uint8Array, - index: number + index: number, ): { instruction: AuthenticationInstructionMaybeMalformed; nextIndex: number; @@ -168,9 +168,11 @@ export const decodeAuthenticationInstruction = ( /** * @param instruction - the {@link AuthenticationInstruction} to clone. * @returns A copy of the provided {@link AuthenticationInstruction}. + * + * @deprecated use `structuredClone` instead */ export const cloneAuthenticationInstruction = ( - instruction: Readonly + instruction: AuthenticationInstruction, ): AuthenticationInstruction => ({ ...('data' in instruction ? { data: instruction.data } : {}), opcode: instruction.opcode, @@ -189,17 +191,17 @@ export const decodeAuthenticationInstructions = (bytecode: Uint8Array) => { const instructions = [] as AuthenticationInstructionsMaybeMalformed; // eslint-disable-next-line functional/no-let let i = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (i < bytecode.length) { const { instruction, nextIndex } = decodeAuthenticationInstruction( bytecode, - i + i, ); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements i = nextIndex; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data (instructions as AuthenticationInstruction[]).push( - instruction as AuthenticationInstruction + instruction as AuthenticationInstruction, ); } return instructions; @@ -216,7 +218,7 @@ const formatAsmPushHex = (data: Uint8Array) => const formatMissingBytesAsm = (missing: number) => `[missing ${missing} byte${missing === 1 ? '' : 's'}]`; const hasMalformedLength = ( - instruction: AuthenticationInstructionMalformed + instruction: AuthenticationInstructionMalformed, ): instruction is AuthenticationInstructionPushMalformedLength => 'length' in instruction; const isPushData = (pushOpcode: number) => @@ -229,20 +231,20 @@ const isPushData = (pushOpcode: number) => * disassemble */ export const disassembleAuthenticationInstructionMalformed = ( - opcodes: Readonly<{ [opcode: number]: string }>, - instruction: AuthenticationInstructionMalformed + opcodes: { [opcode: number]: string }, + instruction: AuthenticationInstructionMalformed, ): string => `${opcodes[instruction.opcode] ?? 'OP_UNKNOWN'} ${ hasMalformedLength(instruction) ? `${formatAsmPushHex(instruction.length)}${formatMissingBytesAsm( - instruction.expectedLengthBytes - instruction.length.length + instruction.expectedLengthBytes - instruction.length.length, )}` : `${ isPushData(instruction.opcode) ? `${instruction.expectedDataBytes} ` : '' }${formatAsmPushHex(instruction.data)}${formatMissingBytesAsm( - instruction.expectedDataBytes - instruction.data.length + instruction.expectedDataBytes - instruction.data.length, )}` }`; @@ -253,8 +255,8 @@ export const disassembleAuthenticationInstructionMalformed = ( * @param instruction - the instruction to disassemble */ export const disassembleAuthenticationInstruction = ( - opcodes: Readonly<{ [opcode: number]: string }>, - instruction: AuthenticationInstruction + opcodes: { [opcode: number]: string }, + instruction: AuthenticationInstruction, ): string => `${opcodes[instruction.opcode] ?? 'OP_UNKNOWN'}${ 'data' in instruction && isMultiWordPush(instruction.opcode) @@ -272,8 +274,8 @@ export const disassembleAuthenticationInstruction = ( * @param instruction - the instruction to disassemble */ export const disassembleAuthenticationInstructionMaybeMalformed = ( - opcodes: Readonly<{ [opcode: number]: string }>, - instruction: AuthenticationInstructionMaybeMalformed + opcodes: { [opcode: number]: string }, + instruction: AuthenticationInstructionMaybeMalformed, ): string => authenticationInstructionIsMalformed(instruction) ? disassembleAuthenticationInstructionMalformed(opcodes, instruction) @@ -292,12 +294,12 @@ export const disassembleAuthenticationInstructionMaybeMalformed = ( * @param instructions - the array of instructions to disassemble */ export const disassembleAuthenticationInstructionsMaybeMalformed = ( - opcodes: Readonly<{ [opcode: number]: string }>, - instructions: readonly AuthenticationInstructionMaybeMalformed[] + opcodes: { [opcode: number]: string }, + instructions: AuthenticationInstructionMaybeMalformed[], ): string => instructions .map((instruction) => - disassembleAuthenticationInstructionMaybeMalformed(opcodes, instruction) + disassembleAuthenticationInstructionMaybeMalformed(opcodes, instruction), ) .join(' '); @@ -310,12 +312,12 @@ export const disassembleAuthenticationInstructionsMaybeMalformed = ( * @param bytecode - the authentication bytecode to disassemble */ export const disassembleBytecode = ( - opcodes: Readonly<{ [opcode: number]: string }>, - bytecode: Uint8Array + opcodes: { [opcode: number]: string }, + bytecode: Uint8Array, ) => disassembleAuthenticationInstructionsMaybeMalformed( opcodes, - decodeAuthenticationInstructions(bytecode) + decodeAuthenticationInstructions(bytecode), ); /** @@ -329,7 +331,7 @@ export const disassembleBytecode = ( export const disassembleBytecodeBCH = (bytecode: Uint8Array) => disassembleAuthenticationInstructionsMaybeMalformed( OpcodesBCH, - decodeAuthenticationInstructions(bytecode) + decodeAuthenticationInstructions(bytecode), ); /** @@ -343,7 +345,7 @@ export const disassembleBytecodeBCH = (bytecode: Uint8Array) => export const disassembleBytecodeBTC = (bytecode: Uint8Array) => disassembleAuthenticationInstructionsMaybeMalformed( OpcodesBTC, - decodeAuthenticationInstructions(bytecode) + decodeAuthenticationInstructions(bytecode), ); /** @@ -354,26 +356,26 @@ export const disassembleBytecodeBTC = (bytecode: Uint8Array) => export const generateBytecodeMap = (opcodes: { [opcode: string]: unknown }) => Object.entries(opcodes) .filter<[string, number]>( - (entry): entry is [string, number] => typeof entry[1] === 'number' + (entry): entry is [string, number] => typeof entry[1] === 'number', ) .reduce<{ [opcode: string]: Uint8Array }>( (identifiers, pair) => ({ ...identifiers, [pair[0]]: Uint8Array.of(pair[1]), }), - {} + {}, ); const getInstructionLengthBytes = ( - instruction: AuthenticationInstructionPush + instruction: AuthenticationInstructionPush, ) => { const { opcode } = instruction; const expectedLength = opcodeToPushLength(opcode); return expectedLength === uint8Bytes ? Uint8Array.of(instruction.data.length) : expectedLength === uint16Bytes - ? numberToBinUint16LE(instruction.data.length) - : numberToBinUint32LE(instruction.data.length); + ? numberToBinUint16LE(instruction.data.length) + : numberToBinUint32LE(instruction.data.length); }; /** @@ -381,7 +383,7 @@ const getInstructionLengthBytes = ( * @param instruction - the instruction to encode */ export const encodeAuthenticationInstruction = ( - instruction: AuthenticationInstruction + instruction: AuthenticationInstruction, ) => Uint8Array.from([ instruction.opcode, @@ -400,7 +402,7 @@ export const encodeAuthenticationInstruction = ( * @param instruction - the {@link AuthenticationInstructionMalformed} to encode */ export const encodeAuthenticationInstructionMalformed = ( - instruction: AuthenticationInstructionMalformed + instruction: AuthenticationInstructionMalformed, ) => { const { opcode } = instruction; @@ -414,8 +416,8 @@ export const encodeAuthenticationInstructionMalformed = ( ...(opcode === CommonPushOpcodes.OP_PUSHDATA_1 ? Uint8Array.of(instruction.expectedDataBytes) : opcode === CommonPushOpcodes.OP_PUSHDATA_2 - ? numberToBinUint16LE(instruction.expectedDataBytes) - : numberToBinUint32LE(instruction.expectedDataBytes)), + ? numberToBinUint16LE(instruction.expectedDataBytes) + : numberToBinUint32LE(instruction.expectedDataBytes)), ...instruction.data, ]); } @@ -429,7 +431,7 @@ export const encodeAuthenticationInstructionMalformed = ( * to encode */ export const encodeAuthenticationInstructionMaybeMalformed = ( - instruction: AuthenticationInstructionMaybeMalformed + instruction: AuthenticationInstructionMaybeMalformed, ): Uint8Array => authenticationInstructionIsMalformed(instruction) ? encodeAuthenticationInstructionMalformed(instruction) @@ -440,7 +442,7 @@ export const encodeAuthenticationInstructionMaybeMalformed = ( * @param instructions - the array of valid instructions to encode */ export const encodeAuthenticationInstructions = ( - instructions: readonly AuthenticationInstruction[] + instructions: AuthenticationInstruction[], ) => flattenBinArray(instructions.map(encodeAuthenticationInstruction)); /** @@ -449,10 +451,10 @@ export const encodeAuthenticationInstructions = ( * {@link AuthenticationInstructionMaybeMalformed}s to encode */ export const encodeAuthenticationInstructionsMaybeMalformed = ( - instructions: readonly AuthenticationInstructionMaybeMalformed[] + instructions: AuthenticationInstructionMaybeMalformed[], ) => flattenBinArray( - instructions.map(encodeAuthenticationInstructionMaybeMalformed) + instructions.map(encodeAuthenticationInstructionMaybeMalformed), ); export enum VmNumberError { @@ -461,7 +463,7 @@ export enum VmNumberError { } export const isVmNumberError = ( - value: VmNumberError | bigint + value: VmNumberError | bigint, ): value is VmNumberError => value === VmNumberError.outOfRange || value === VmNumberError.requiresMinimal; @@ -504,7 +506,7 @@ export const vmNumberToBigInt = ( } = { maximumVmNumberByteLength: typicalMaximumVmNumberByteLength, requireMinimalEncoding: true, - } + }, ): VmNumberError | bigint => { if (bytes.length === 0) { return 0n; @@ -532,9 +534,9 @@ export const vmNumberToBigInt = ( const signFlippingByte = 0x80; // eslint-disable-next-line functional/no-let let result = 0n; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let byte = 0; byte < bytes.length; byte++) { - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, @typescript-eslint/no-non-null-assertion + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, @typescript-eslint/no-non-null-assertion result |= BigInt(bytes[byte]!) << BigInt(byte * bitsPerByte); } @@ -568,22 +570,22 @@ export const bigIntToVmNumber = (integer: bigint): Uint8Array => { const bitsPerByte = 8; // eslint-disable-next-line functional/no-let let remaining = isNegative ? -integer : integer; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (remaining > 0) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data, no-bitwise + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data, no-bitwise bytes.push(Number(remaining & BigInt(byteStates))); - // eslint-disable-next-line functional/no-expression-statement, no-bitwise + // eslint-disable-next-line functional/no-expression-statements, no-bitwise remaining >>= BigInt(bitsPerByte); } const signFlippingByte = 0x80; - // eslint-disable-next-line no-bitwise, functional/no-conditional-statement, @typescript-eslint/no-non-null-assertion + // eslint-disable-next-line no-bitwise, functional/no-conditional-statements, @typescript-eslint/no-non-null-assertion if ((bytes[bytes.length - 1]! & signFlippingByte) > 0) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data bytes.push(isNegative ? signFlippingByte : 0x00); - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements } else if (isNegative) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data, no-bitwise + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data, no-bitwise bytes[bytes.length - 1] |= signFlippingByte; } return new Uint8Array(bytes); @@ -599,7 +601,7 @@ export const bigIntToVmNumber = (integer: bigint): Uint8Array => { */ export const stackItemIsTruthy = (item: Uint8Array) => { const signFlippingByte = 0x80; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let i = 0; i < item.length; i++) { if (item[i] !== 0) { if (i === item.length - 1 && item[i] === signFlippingByte) { @@ -651,7 +653,7 @@ export const isPushOperation = (opcode: number) => opcode <= Opcodes.OP_16; export const isPushOnly = (bytecode: Uint8Array) => { const instructions = decodeAuthenticationInstructions(bytecode); return instructions.every((instruction) => - isPushOperation(instruction.opcode) + isPushOperation(instruction.opcode), ); }; @@ -707,6 +709,17 @@ export const getMinimumFee = (length: bigint, feeRateSatsPerKb: bigint) => { return truncated === 0n ? 1n : truncated; }; +export const getDustThresholdForLength = ( + outputLength: number, + dustRelayFeeSatPerKb = BigInt(Dust.standardDustRelayFee), +) => { + const expectedTotalLength = outputLength + Dust.p2pkhInputLength; + return ( + BigInt(Dust.minimumFeeMultiple) * + getMinimumFee(BigInt(expectedTotalLength), dustRelayFeeSatPerKb) + ); +}; + /** * Given an {@link Output} and (optionally) a dust relay fee in * satoshis-per-kilobyte, return the minimum satoshi value for this output to @@ -738,17 +751,13 @@ export const getMinimumFee = (length: bigint, feeRateSatsPerKb: bigint) => { */ export const getDustThreshold = ( output: Output, - dustRelayFeeSatPerKb = BigInt(Dust.standardDustRelayFee) + dustRelayFeeSatPerKb = BigInt(Dust.standardDustRelayFee), ) => { if (isArbitraryDataOutput(output.lockingBytecode)) { return 0n; } const encodedOutputLength = encodeTransactionOutput(output).length; - const expectedTotalLength = encodedOutputLength + Dust.p2pkhInputLength; - return ( - BigInt(Dust.minimumFeeMultiple) * - getMinimumFee(BigInt(expectedTotalLength), dustRelayFeeSatPerKb) - ); + return getDustThresholdForLength(encodedOutputLength, dustRelayFeeSatPerKb); }; /** @@ -761,7 +770,7 @@ export const getDustThreshold = ( */ export const isDustOutput = ( output: Output, - dustRelayFeeSatPerKb = BigInt(Dust.standardDustRelayFee) + dustRelayFeeSatPerKb = BigInt(Dust.standardDustRelayFee), ) => output.valueSatoshis < getDustThreshold(output, dustRelayFeeSatPerKb); const enum PublicKey { @@ -836,7 +845,7 @@ export const isSimpleMultisig = (lockingBytecode: Uint8Array) => { */ const n = pushNumberOpcodeToNumber( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - instructions[lastIndex - 1]!.opcode + instructions[lastIndex - 1]!.opcode, ); if (n === false || m === false) { @@ -845,7 +854,7 @@ export const isSimpleMultisig = (lockingBytecode: Uint8Array) => { const publicKeyInstructions = instructions.slice( Multisig.keyStart, - Multisig.keyEnd + Multisig.keyEnd, ); if (!authenticationInstructionsArePushInstructions(publicKeyInstructions)) { @@ -853,7 +862,7 @@ export const isSimpleMultisig = (lockingBytecode: Uint8Array) => { } const publicKeys = publicKeyInstructions.map( - (instruction) => instruction.data + (instruction) => instruction.data, ); if (publicKeys.some((key) => !isValidPublicKeyEncoding(key))) { diff --git a/src/lib/vm/instruction-sets/common/nop.ts b/src/lib/vm/instruction-sets/common/nop.ts index d977c6cc..a1d584a7 100644 --- a/src/lib/vm/instruction-sets/common/nop.ts +++ b/src/lib/vm/instruction-sets/common/nop.ts @@ -5,7 +5,7 @@ import { applyError, AuthenticationErrorCommon } from './errors.js'; export const opNop = (state: State) => state; export const opNopDisallowed = ( - state: State + state: State, ) => applyError(state, AuthenticationErrorCommon.calledUpgradableNop); /** @@ -13,7 +13,7 @@ export const opNopDisallowed = ( * bytecode, even within an unexecuted branch. */ export const disabledOperation = < - State extends AuthenticationProgramStateError + State extends AuthenticationProgramStateError, >( - state: State + state: State, ) => applyError(state, AuthenticationErrorCommon.unknownOpcode); diff --git a/src/lib/vm/instruction-sets/common/push.spec.ts b/src/lib/vm/instruction-sets/common/push.spec.ts index 1f5095cb..36be23a7 100644 --- a/src/lib/vm/instruction-sets/common/push.spec.ts +++ b/src/lib/vm/instruction-sets/common/push.spec.ts @@ -53,39 +53,39 @@ test('prefixDataPush', (t) => { }); t.deepEqual( encodeDataPush( - Uint8Array.from(range(PushOperationConstants.maximumPushData1Size)) + Uint8Array.from(range(PushOperationConstants.maximumPushData1Size)), ), Uint8Array.from([ PushOperationConstants.OP_PUSHDATA_1, 0xff, ...range(PushOperationConstants.maximumPushData1Size), - ]) + ]), ); t.deepEqual( encodeDataPush( - Uint8Array.from(range(PushOperationConstants.maximumPushData1Size + 1)) + Uint8Array.from(range(PushOperationConstants.maximumPushData1Size + 1)), ), Uint8Array.from([ PushOperationConstants.OP_PUSHDATA_2, 0, 1, ...range(PushOperationConstants.maximumPushData1Size + 1), - ]) + ]), ); t.deepEqual( encodeDataPush( - Uint8Array.from(range(PushOperationConstants.maximumPushData2Size)) + Uint8Array.from(range(PushOperationConstants.maximumPushData2Size)), ), Uint8Array.from([ PushOperationConstants.OP_PUSHDATA_2, 0xff, 0xff, ...range(PushOperationConstants.maximumPushData2Size), - ]) + ]), ); t.deepEqual( encodeDataPush( - Uint8Array.from(range(PushOperationConstants.maximumPushData2Size + 1)) + Uint8Array.from(range(PushOperationConstants.maximumPushData2Size + 1)), ), Uint8Array.from([ PushOperationConstants.OP_PUSHDATA_4, @@ -94,6 +94,6 @@ test('prefixDataPush', (t) => { 1, 0, ...range(PushOperationConstants.maximumPushData2Size + 1), - ]) + ]), ); }); diff --git a/src/lib/vm/instruction-sets/common/push.ts b/src/lib/vm/instruction-sets/common/push.ts index 0149419a..0e804eda 100644 --- a/src/lib/vm/instruction-sets/common/push.ts +++ b/src/lib/vm/instruction-sets/common/push.ts @@ -87,33 +87,33 @@ export const encodeDataPush = (data: Uint8Array) => ? data.length === 0 ? Uint8Array.of(0) : data.length === 1 - ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - data[0] !== 0 && data[0]! <= PushOperationConstants.pushNumberOpcodes - ? Uint8Array.of( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - data[0]! + PushOperationConstants.pushNumberOpcodesOffset - ) - : data[0] === PushOperationConstants.negativeOne - ? Uint8Array.of(PushOperationConstants.OP_1NEGATE) - : Uint8Array.from([1, ...data]) - : Uint8Array.from([data.length, ...data]) + ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data[0] !== 0 && data[0]! <= PushOperationConstants.pushNumberOpcodes + ? Uint8Array.of( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data[0]! + PushOperationConstants.pushNumberOpcodesOffset, + ) + : data[0] === PushOperationConstants.negativeOne + ? Uint8Array.of(PushOperationConstants.OP_1NEGATE) + : Uint8Array.from([1, ...data]) + : Uint8Array.from([data.length, ...data]) : data.length <= PushOperationConstants.maximumPushData1Size - ? Uint8Array.from([ - PushOperationConstants.OP_PUSHDATA_1, - data.length, - ...data, - ]) - : data.length <= PushOperationConstants.maximumPushData2Size - ? Uint8Array.from([ - PushOperationConstants.OP_PUSHDATA_2, - ...numberToBinUint16LE(data.length), - ...data, - ]) - : Uint8Array.from([ - PushOperationConstants.OP_PUSHDATA_4, - ...numberToBinUint32LE(data.length), - ...data, - ]); + ? Uint8Array.from([ + PushOperationConstants.OP_PUSHDATA_1, + data.length, + ...data, + ]) + : data.length <= PushOperationConstants.maximumPushData2Size + ? Uint8Array.from([ + PushOperationConstants.OP_PUSHDATA_2, + ...numberToBinUint16LE(data.length), + ...data, + ]) + : Uint8Array.from([ + PushOperationConstants.OP_PUSHDATA_4, + ...numberToBinUint32LE(data.length), + ...data, + ]); /** * Returns true if the provided `data` is minimally-encoded by the provided @@ -155,9 +155,9 @@ export const isMinimalDataPush = (opcode: number, data: Uint8Array) => { }; const executionIsActive = < - State extends AuthenticationProgramStateControlStack + State extends AuthenticationProgramStateControlStack, >( - state: State + state: State, ) => state.controlStack.every((item) => item); // TODO: add tests that verify the order of operations below (are non-minimal pushes OK inside unexecuted conditionals?) @@ -167,9 +167,9 @@ export const pushOperation = State extends AuthenticationProgramStateControlStack & AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - maximumPushSize = ConsensusCommon.maximumStackItemLength + maximumPushSize = ConsensusCommon.maximumStackItemLength as number, ): Operation => (state: State) => { const instruction = state.instructions[ @@ -178,13 +178,13 @@ export const pushOperation = return instruction.data.length > maximumPushSize ? applyError( state, - `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${instruction.data.length} bytes.` + `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${instruction.data.length} bytes.`, ) : executionIsActive(state) - ? isMinimalDataPush(instruction.opcode, instruction.data) - ? pushToStack(state, instruction.data) - : applyError(state, AuthenticationErrorCommon.nonMinimalPush) - : state; + ? isMinimalDataPush(instruction.opcode, instruction.data) + ? pushToStack(state, instruction.data) + : applyError(state, AuthenticationErrorCommon.nonMinimalPush) + : state; }; /** @@ -193,9 +193,9 @@ export const pushOperation = */ export const pushNumberOperation = < ProgramState extends AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - number: number + number: number, ) => { const value = bigIntToVmNumber(BigInt(number)); return (state: ProgramState) => pushToStack(state, value); diff --git a/src/lib/vm/instruction-sets/common/signing-serialization.spec.ts b/src/lib/vm/instruction-sets/common/signing-serialization.spec.ts index 21a66e2b..d77675ed 100644 --- a/src/lib/vm/instruction-sets/common/signing-serialization.spec.ts +++ b/src/lib/vm/instruction-sets/common/signing-serialization.spec.ts @@ -30,7 +30,7 @@ const tests = Object.values(sighashTests) * algorithm. If the legacy algorithm is implemented, we can re-enable the * rest of these tests. */ - !isLegacySigningSerialization(expectation.signingSerializationType) + !isLegacySigningSerialization(expectation.signingSerializationType), ); /** @@ -42,12 +42,12 @@ const pendingTests = tests; pendingTests.map((expectation, currentTest) => { test.skip(`[signing-serialization tests] sighash.json ${currentTest}/${pendingTests.length} (#${expectation.testIndex})`, (t) => { const tx = decodeTransactionUnsafeCommon( - hexToBin(expectation.transactionHex) + hexToBin(expectation.transactionHex), ); const lockingBytecode = hexToBin(expectation.scriptHex); const signingSerializationType = numberToBinInt32TwosCompliment( - expectation.signingSerializationType + expectation.signingSerializationType, ); const sourceOutputs = []; sourceOutputs[expectation.inputIndex] = { @@ -81,7 +81,7 @@ pendingTests.map((expectation, currentTest) => { t.deepEqual( digest, hexToBin(expectation.signingSerializationBCHDigestHex).reverse(), - `failed serialization: ${binToHex(serialization)}` + `failed serialization: ${binToHex(serialization)}`, ); }); return undefined; diff --git a/src/lib/vm/instruction-sets/common/signing-serialization.ts b/src/lib/vm/instruction-sets/common/signing-serialization.ts index 1203936e..fc2d8831 100644 --- a/src/lib/vm/instruction-sets/common/signing-serialization.ts +++ b/src/lib/vm/instruction-sets/common/signing-serialization.ts @@ -84,7 +84,7 @@ const match = (type: Uint8Array, flag: SigningSerializationFlag) => const equals = ( type: Uint8Array, - flag: SigningSerializationFlag + flag: SigningSerializationFlag, // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion ) => (type[0]! & Internal.mask5Bits) === flag; @@ -120,7 +120,7 @@ export const hashPrevouts = ( */ transactionOutpoints: Uint8Array; }, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => shouldSerializeSingleInput(signingSerializationType) ? emptyHash() @@ -144,7 +144,7 @@ export const hashUtxos = ( */ transactionUtxos: Uint8Array; }, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => shouldSerializeUtxos(signingSerializationType) ? hash256(transactionUtxos, sha256) @@ -168,7 +168,7 @@ export const hashSequence = ( */ transactionSequenceNumbers: Uint8Array; }, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => !shouldSerializeSingleInput(signingSerializationType) && !shouldSerializeCorrespondingOutput(signingSerializationType) && @@ -199,16 +199,16 @@ export const hashOutputs = ( */ correspondingOutput: Uint8Array | undefined; }, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => !shouldSerializeCorrespondingOutput(signingSerializationType) && !shouldSerializeNoOutputs(signingSerializationType) ? hash256(transactionOutputs, sha256) : shouldSerializeCorrespondingOutput(signingSerializationType) - ? correspondingOutput === undefined - ? emptyHash() - : hash256(correspondingOutput, sha256) - : emptyHash(); + ? correspondingOutput === undefined + ? emptyHash() + : hash256(correspondingOutput, sha256) + : emptyHash(); /** * Encode the signature-protected properties of a transaction following the @@ -312,7 +312,7 @@ export const encodeSigningSerializationBCH = ( */ forkId?: Uint8Array; }, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => flattenBinArray([ numberToBinUint32LE(version), @@ -323,7 +323,7 @@ export const encodeSigningSerializationBCH = ( signingSerializationType, transactionSequenceNumbers, }, - sha256 + sha256, ), outpointTransactionHash.slice().reverse(), numberToBinUint32LE(outpointIndex), @@ -338,7 +338,7 @@ export const encodeSigningSerializationBCH = ( signingSerializationType, transactionOutputs, }, - sha256 + sha256, ), numberToBinUint32LE(locktime), signingSerializationType, @@ -349,102 +349,102 @@ export const encodeSigningSerializationBCH = ( * The signing serialization components that are shared between all of the * inputs in a transaction. */ -export interface SigningSerializationTransactionComponentsBCH { +export type SigningSerializationTransactionComponentsBCH = { /** * A time or block height at which the transaction is considered valid (and * can be added to the block chain). This allows signers to create time-locked * transactions that may only become valid in the future. */ - readonly locktime: number; + locktime: number; /** * A.K.A. the serialization for {@link hashPrevouts} * * The signing serialization of all input outpoints. (See BIP143 or Bitcoin * Cash's Replay Protected Sighash spec for details.) */ - readonly transactionOutpoints: Uint8Array; + transactionOutpoints: Uint8Array; /* * A.K.A. the serialization for {@link hashOutputs} with `SIGHASH_ALL` * * The signing serialization of output amounts and locking scripts. (See * BIP143 or Bitcoin Cash's Replay Protected Sighash spec for details.) */ - readonly transactionOutputs: Uint8Array; + transactionOutputs: Uint8Array; /* * A.K.A. the serialization for {@link hashSequence} * * The signing serialization of all input sequence numbers. (See BIP143 or * Bitcoin Cash's Replay Protected Sighash spec for details.) */ - readonly transactionSequenceNumbers: Uint8Array; + transactionSequenceNumbers: Uint8Array; /** * A.K.A. the serialization for {@link hashUtxos} * * The signing serialization of all UTXOs spent by the transaction's inputs * (concatenated in input order). */ - readonly transactionUtxos: Uint8Array; + transactionUtxos: Uint8Array; /** * The transaction's version. */ - readonly version: number; -} + version: number; +}; /** * All signing serialization components for a particular transaction input. */ -export interface SigningSerializationComponentsBCH - extends SigningSerializationTransactionComponentsBCH { - /* - * A.K.A. the serialization for {@link hashOutputs} with `SIGHASH_SINGLE` - * - * The signing serialization of the output at the same index as this input. If - * this input's index is larger than the total number of outputs (such that - * there is no corresponding output), this should be `undefined`. (See BIP143 - * or Bitcoin Cash's Replay Protected Sighash spec for details.) - */ - readonly correspondingOutput: Uint8Array | undefined; - /** - * The index (within the previous transaction) of the outpoint being spent by - * this input. - */ - readonly outpointIndex: number; - /** - * The hash/ID of the transaction from which the outpoint being spent by this - * input originated. - */ - readonly outpointTransactionHash: Uint8Array; - /** - * The 8-byte `Uint64LE`-encoded value of the output being spent in satoshis - * (see {@link bigIntToBinUint64LE}). - */ - readonly outputValue: Uint8Array; - /** - * The encoded token prefix of the output being spent - * (see {@link encodeTokenPrefix}). - * - * If the output includes no tokens, a zero-length Uint8Array. - */ - readonly outputTokenPrefix: Uint8Array; - /** - * The `sequenceNumber` associated with the input being validated. See - * {@link Input.sequenceNumber} for details. - */ - readonly sequenceNumber: number; -} +export type SigningSerializationComponentsBCH = + SigningSerializationTransactionComponentsBCH & { + /* + * A.K.A. the serialization for {@link hashOutputs} with `SIGHASH_SINGLE` + * + * The signing serialization of the output at the same index as this input. If + * this input's index is larger than the total number of outputs (such that + * there is no corresponding output), this should be `undefined`. (See BIP143 + * or Bitcoin Cash's Replay Protected Sighash spec for details.) + */ + correspondingOutput: Uint8Array | undefined; + /** + * The index (within the previous transaction) of the outpoint being spent by + * this input. + */ + outpointIndex: number; + /** + * The hash/ID of the transaction from which the outpoint being spent by this + * input originated. + */ + outpointTransactionHash: Uint8Array; + /** + * The 8-byte `Uint64LE`-encoded value of the output being spent in satoshis + * (see {@link bigIntToBinUint64LE}). + */ + outputValue: Uint8Array; + /** + * The encoded token prefix of the output being spent + * (see {@link encodeTokenPrefix}). + * + * If the output includes no tokens, a zero-length Uint8Array. + */ + outputTokenPrefix: Uint8Array; + /** + * The `sequenceNumber` associated with the input being validated. See + * {@link Input.sequenceNumber} for details. + */ + sequenceNumber: number; + }; /** * Generate the encoded components of a BCH signing serialization from * compilation context. */ export const generateSigningSerializationComponentsBCH = ( - context: CompilationContextBCH + context: CompilationContextBCH, ): SigningSerializationComponentsBCH => ({ correspondingOutput: context.inputIndex < context.transaction.outputs.length ? encodeTransactionOutput( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - context.transaction.outputs[context.inputIndex]! + context.transaction.outputs[context.inputIndex]!, ) : undefined, locktime: context.transaction.locktime, @@ -455,21 +455,21 @@ export const generateSigningSerializationComponentsBCH = ( context.transaction.inputs[context.inputIndex]!.outpointTransactionHash, outputTokenPrefix: encodeTokenPrefix( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - context.sourceOutputs[context.inputIndex]!.token + context.sourceOutputs[context.inputIndex]!.token, ), outputValue: valueSatoshisToBin( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - context.sourceOutputs[context.inputIndex]!.valueSatoshis + context.sourceOutputs[context.inputIndex]!.valueSatoshis, ), sequenceNumber: // eslint-disable-next-line @typescript-eslint/no-non-null-assertion context.transaction.inputs[context.inputIndex]!.sequenceNumber, transactionOutpoints: encodeTransactionOutpoints(context.transaction.inputs), transactionOutputs: encodeTransactionOutputsForSigning( - context.transaction.outputs + context.transaction.outputs, ), transactionSequenceNumbers: encodeTransactionInputSequenceNumbersForSigning( - context.transaction.inputs + context.transaction.inputs, ), transactionUtxos: encodeTransactionOutputsForSigning(context.sourceOutputs), version: context.transaction.version, @@ -499,7 +499,7 @@ export const generateSigningSerializationBCH = ( */ signingSerializationType: Uint8Array; }, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => encodeSigningSerializationBCH( { @@ -507,7 +507,7 @@ export const generateSigningSerializationBCH = ( coveredBytecode, signingSerializationType, }, - sha256 + sha256, ); /** @@ -515,7 +515,7 @@ export const generateSigningSerializationBCH = ( * serialization algorithm to use */ export const isLegacySigningSerialization = ( - signingSerializationType: number + signingSerializationType: number, ) => { // eslint-disable-next-line no-bitwise, @typescript-eslint/no-magic-numbers const forkValue = signingSerializationType >> 8; diff --git a/src/lib/vm/instruction-sets/common/stack.ts b/src/lib/vm/instruction-sets/common/stack.ts index 040fe303..43f58030 100644 --- a/src/lib/vm/instruction-sets/common/stack.ts +++ b/src/lib/vm/instruction-sets/common/stack.ts @@ -21,12 +21,12 @@ import { export const opToAltStack = < State extends AuthenticationProgramStateAlternateStack & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneStackItem(state, (nextState, [item]) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.alternateStack.push(item); return nextState; }); @@ -34,9 +34,9 @@ export const opToAltStack = < export const opFromAltStack = < State extends AuthenticationProgramStateAlternateStack & AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => { // eslint-disable-next-line functional/immutable-data const item = state.alternateStack.pop(); @@ -47,85 +47,85 @@ export const opFromAltStack = < }; export const op2Drop = ( - state: State + state: State, ) => useTwoStackItems(state, (nextState) => nextState); export const op2Dup = ( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [a, b]) => - pushToStack(nextState, a, b, a.slice(), b.slice()) + pushToStack(nextState, a, b, a.slice(), b.slice()), ); export const op3Dup = ( - state: State + state: State, ) => useThreeStackItems(state, (nextState, [a, b, c]) => - pushToStack(nextState, a, b, c, a.slice(), b.slice(), c.slice()) + pushToStack(nextState, a, b, c, a.slice(), b.slice(), c.slice()), ); export const op2Over = ( - state: State + state: State, ) => useFourStackItems(state, (nextState, [a, b, c, d]) => - pushToStack(nextState, a, b, c, d, a.slice(), b.slice()) + pushToStack(nextState, a, b, c, d, a.slice(), b.slice()), ); export const op2Rot = ( - state: State + state: State, ) => useSixStackItems(state, (nextState, [a, b, c, d, e, f]) => - pushToStack(nextState, c, d, e, f, a, b) + pushToStack(nextState, c, d, e, f, a, b), ); export const op2Swap = ( - state: State + state: State, ) => useFourStackItems(state, (nextState, [a, b, c, d]) => - pushToStack(nextState, c, d, a, b) + pushToStack(nextState, c, d, a, b), ); export const opIfDup = ( - state: State + state: State, ) => useOneStackItem(state, (nextState, [item]) => pushToStack( nextState, - ...(stackItemIsTruthy(item) ? [item, item.slice()] : [item]) - ) + ...(stackItemIsTruthy(item) ? [item, item.slice()] : [item]), + ), ); export const opDepth = ( - state: State + state: State, ) => pushToStack(state, bigIntToVmNumber(BigInt(state.stack.length))); export const opDrop = ( - state: State + state: State, ) => useOneStackItem(state, (nextState) => nextState); export const opDup = ( - state: State + state: State, ) => useOneStackItem(state, (nextState, [item]) => - pushToStack(nextState, item, item.slice()) + pushToStack(nextState, item, item.slice()), ); export const opNip = ( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [, b]) => pushToStack(nextState, b)); export const opOver = ( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [a, b]) => - pushToStack(nextState, a, b, a.slice()) + pushToStack(nextState, a, b, a.slice()), ); export const opPick = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, depth) => { const item = nextState.stack[nextState.stack.length - 1 - Number(depth)]; @@ -137,9 +137,9 @@ export const opPick = < export const opRoll = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, depth) => { const index = nextState.stack.length - 1 - Number(depth); @@ -152,27 +152,27 @@ export const opRoll = < }); export const opRot = ( - state: State + state: State, ) => useThreeStackItems(state, (nextState, [a, b, c]) => - pushToStack(nextState, b, c, a) + pushToStack(nextState, b, c, a), ); export const opSwap = ( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [a, b]) => pushToStack(nextState, b, a)); export const opTuck = ( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [a, b]) => - pushToStack(nextState, b.slice(), a, b) + pushToStack(nextState, b.slice(), a, b), ); export const opSize = ( - state: State + state: State, ) => useOneStackItem(state, (nextState, [item]) => - pushToStack(nextState, item, bigIntToVmNumber(BigInt(item.length))) + pushToStack(nextState, item, bigIntToVmNumber(BigInt(item.length))), ); diff --git a/src/lib/vm/instruction-sets/common/time.ts b/src/lib/vm/instruction-sets/common/time.ts index 9760dce4..8ad1ab7c 100644 --- a/src/lib/vm/instruction-sets/common/time.ts +++ b/src/lib/vm/instruction-sets/common/time.ts @@ -27,10 +27,10 @@ const enum Constants { export const useLocktime = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, - operation: (nextState: State, locktime: number) => State + operation: (nextState: State, locktime: number) => State, ) => { const item = state.stack[state.stack.length - 1]; if (item === undefined) { @@ -52,7 +52,7 @@ export const useLocktime = < const locktimeTypesAreCompatible = ( locktime: number, - requiredLocktime: number + requiredLocktime: number, ) => (locktime < Constants.locktimeThreshold && requiredLocktime < Constants.locktimeThreshold) || @@ -62,26 +62,26 @@ const locktimeTypesAreCompatible = ( export const opCheckLockTimeVerify = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useLocktime(state, (nextState, requiredLocktime) => { if ( !locktimeTypesAreCompatible( nextState.program.transaction.locktime, - requiredLocktime + requiredLocktime, ) ) { return applyError( nextState, - AuthenticationErrorCommon.incompatibleLocktimeType + AuthenticationErrorCommon.incompatibleLocktimeType, ); } if (requiredLocktime > nextState.program.transaction.locktime) { return applyError( nextState, - AuthenticationErrorCommon.unsatisfiedLocktime + AuthenticationErrorCommon.unsatisfiedLocktime, ); } const { sequenceNumber } = @@ -99,9 +99,9 @@ const includesFlag = (value: number, flag: number) => (value & flag) !== 0; export const opCheckSequenceVerify = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useLocktime( state, @@ -112,7 +112,7 @@ export const opCheckSequenceVerify = < nextState.program.transaction.inputs[nextState.program.inputIndex]!; const sequenceLocktimeDisabled = includesFlag( requiredSequence, - Constants.sequenceLocktimeDisableFlag + Constants.sequenceLocktimeDisableFlag, ); if (sequenceLocktimeDisabled) { return nextState; @@ -124,14 +124,14 @@ export const opCheckSequenceVerify = < ) { return applyError( nextState, - AuthenticationErrorCommon.checkSequenceUnavailable + AuthenticationErrorCommon.checkSequenceUnavailable, ); } if (includesFlag(sequenceNumber, Constants.sequenceLocktimeDisableFlag)) { return applyError( nextState, - AuthenticationErrorCommon.unmatchedSequenceDisable + AuthenticationErrorCommon.unmatchedSequenceDisable, ); } @@ -141,7 +141,7 @@ export const opCheckSequenceVerify = < ) { return applyError( nextState, - AuthenticationErrorCommon.incompatibleSequenceType + AuthenticationErrorCommon.incompatibleSequenceType, ); } @@ -153,10 +153,10 @@ export const opCheckSequenceVerify = < ) { return applyError( nextState, - AuthenticationErrorCommon.unsatisfiedSequenceNumber + AuthenticationErrorCommon.unsatisfiedSequenceNumber, ); } return nextState; - } + }, ); diff --git a/src/lib/vm/instruction-sets/common/types.spec.ts b/src/lib/vm/instruction-sets/common/types.spec.ts index f2d1ff4e..b856a050 100644 --- a/src/lib/vm/instruction-sets/common/types.spec.ts +++ b/src/lib/vm/instruction-sets/common/types.spec.ts @@ -11,7 +11,7 @@ import { } from '../../../lib.js'; // Derived from https://github.com/bitcoinjs/bitcoinjs-lib -const minimallyEncodedVmNumbers: readonly [string, bigint][] = [ +const minimallyEncodedVmNumbers: [string, bigint][] = [ /* spell-checker:disable */ ['', 0n], ['01', 1n], @@ -63,7 +63,7 @@ const minimallyEncodedVmNumbers: readonly [string, bigint][] = [ /* spell-checker:enable */ ]; -const nonMinimallyEncodedVmNumbers: readonly [string, bigint][] = [ +const nonMinimallyEncodedVmNumbers: [string, bigint][] = [ ['00', 0n], ['0000', 0n], ['80', 0n], @@ -75,7 +75,7 @@ const nonMinimallyEncodedVmNumbers: readonly [string, bigint][] = [ ['abcdef4280', -1123012011n], ]; -const equivalentVmNumbers: readonly [string, string][] = [ +const equivalentVmNumbers: [string, string][] = [ ['01020380', '010283'], ['0102030480', '01020384'], ['abcdef4280', 'abcdefc2'], @@ -88,14 +88,14 @@ test('decodeVmNumber', (t) => { vmNumberToBigInt(hexToBin(pair[0]), { requireMinimalEncoding: true, }), - pair[1] + pair[1], ); t.deepEqual( vmNumberToBigInt(hexToBin(pair[0]), { maximumVmNumberByteLength: 4, requireMinimalEncoding: true, }), - pair[1] + pair[1], ); return undefined; }); @@ -106,24 +106,24 @@ test('decodeVmNumber', (t) => { maximumVmNumberByteLength: 5, requireMinimalEncoding: false, }), - pair[1] + pair[1], ); return undefined; - } + }, ); nonMinimallyEncodedVmNumbers.map((pair) => { t.deepEqual( vmNumberToBigInt(hexToBin(pair[0]), { maximumVmNumberByteLength: 5, }), - VmNumberError.requiresMinimal + VmNumberError.requiresMinimal, ); t.deepEqual( vmNumberToBigInt(hexToBin(pair[0]), { maximumVmNumberByteLength: 5, requireMinimalEncoding: true, }), - VmNumberError.requiresMinimal + VmNumberError.requiresMinimal, ); return undefined; }); @@ -136,7 +136,7 @@ test('decodeVmNumber', (t) => { vmNumberToBigInt(hexToBin(pair[1]), { maximumVmNumberByteLength: 5, requireMinimalEncoding: true, - }) + }), ); return undefined; }); @@ -144,13 +144,13 @@ test('decodeVmNumber', (t) => { vmNumberToBigInt(hexToBin('abcdef1234'), { maximumVmNumberByteLength: 4, }), - VmNumberError.outOfRange + VmNumberError.outOfRange, ); t.deepEqual( vmNumberToBigInt(hexToBin('abcdef1234'), { maximumVmNumberByteLength: 5, }), - 223656005035n + 223656005035n, ); }); diff --git a/src/lib/vm/instruction-sets/xec/fixtures/satoshi-client/bitcoin-satoshi-utils.ts b/src/lib/vm/instruction-sets/xec/fixtures/satoshi-client/bitcoin-satoshi-utils.ts index bfc44110..b7b00ea7 100644 --- a/src/lib/vm/instruction-sets/xec/fixtures/satoshi-client/bitcoin-satoshi-utils.ts +++ b/src/lib/vm/instruction-sets/xec/fixtures/satoshi-client/bitcoin-satoshi-utils.ts @@ -11,14 +11,14 @@ import { import { OpcodesXEC } from '../../xec-opcodes.js'; export const bitcoinSatoshiOpcodes = Object.entries( - generateBytecodeMap(OpcodesXEC) -).reduce>( + generateBytecodeMap(OpcodesXEC), +).reduce<{ [opcode: string]: Uint8Array }>( (acc, cur) => ({ ...acc, [cur[0].slice('OP_'.length)]: cur[1] }), { PUSHDATA1: Uint8Array.of(OpcodesXEC.OP_PUSHDATA_1), // eslint-disable-line @typescript-eslint/naming-convention PUSHDATA2: Uint8Array.of(OpcodesXEC.OP_PUSHDATA_2), // eslint-disable-line @typescript-eslint/naming-convention PUSHDATA4: Uint8Array.of(OpcodesXEC.OP_PUSHDATA_4), // eslint-disable-line @typescript-eslint/naming-convention - } + }, ); /** @@ -46,9 +46,8 @@ export const assembleBitcoinSatoshiScript = (satoshiScript: string) => token.startsWith('0x') ? hexToBin(token.slice('0x'.length)) : token.startsWith("'") - ? encodeDataPush(utf8ToBin(token.slice(1, token.length - 1))) - : bitcoinSatoshiOpcodes[token] === undefined - ? encodeDataPush(bigIntToVmNumber(BigInt(token))) - : bitcoinSatoshiOpcodes[token] - ) as Uint8Array[] + ? encodeDataPush(utf8ToBin(token.slice(1, token.length - 1))) + : bitcoinSatoshiOpcodes[token] ?? + encodeDataPush(bigIntToVmNumber(BigInt(token))), + ), ); diff --git a/src/lib/vm/instruction-sets/xec/xec-instruction-set.ts b/src/lib/vm/instruction-sets/xec/xec-instruction-set.ts index f7e3ea62..2e650bb1 100644 --- a/src/lib/vm/instruction-sets/xec/xec-instruction-set.ts +++ b/src/lib/vm/instruction-sets/xec/xec-instruction-set.ts @@ -53,7 +53,7 @@ import { * nodes will refuse to relay them. (Default: `true`) */ export const createInstructionSetXEC = ( - standard = true + standard = true, ): InstructionSet< ResolvedTransactionBCH, AuthenticationProgramBCH, @@ -95,7 +95,7 @@ export const createInstructionSetXEC = ( [OpcodesBCH2022.OP_MIN]: opMin4Byte, [OpcodesBCH2022.OP_MAX]: opMax4Byte, [OpcodesBCH2022.OP_WITHIN]: opWithin4Byte, - } + }, ), [OpcodesBCH2022.OP_INPUTINDEX]: undefinedOperation, [OpcodesBCH2022.OP_ACTIVEBYTECODE]: undefinedOperation, diff --git a/src/lib/vm/instruction-sets/xec/xec-vm-number-operations.ts b/src/lib/vm/instruction-sets/xec/xec-vm-number-operations.ts index ed415e56..2c879ad1 100644 --- a/src/lib/vm/instruction-sets/xec/xec-vm-number-operations.ts +++ b/src/lib/vm/instruction-sets/xec/xec-vm-number-operations.ts @@ -23,9 +23,9 @@ const maximumVmNumberByteLength = ConsensusXEC.maximumVmNumberLength; export const opPick4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, depth) => { const item = nextState.stack[nextState.stack.length - 1 - Number(depth)]; @@ -37,9 +37,9 @@ export const opPick4Byte = < export const opRoll4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, depth) => { const index = nextState.stack.length - 1 - Number(depth); @@ -52,9 +52,9 @@ export const opRoll4Byte = < export const opSplit4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, @@ -63,24 +63,24 @@ export const opSplit4Byte = < return useOneStackItem(nextState, (finalState, [item]) => index < 0 || index > item.length ? applyError(finalState, AuthenticationErrorCommon.invalidSplitIndex) - : pushToStack(finalState, item.slice(0, index), item.slice(index)) + : pushToStack(finalState, item.slice(0, index), item.slice(index)), ); }, - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opNum2Bin4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, value) => { const targetLength = Number(value); return targetLength > ConsensusXEC.maximumStackItemLength ? applyError( nextState, - AuthenticationErrorCommon.exceededMaximumStackItemLength + AuthenticationErrorCommon.exceededMaximumStackItemLength, ) : useOneVmNumber( nextState, @@ -89,27 +89,27 @@ export const opNum2Bin4Byte = < return minimallyEncoded.length > targetLength ? applyError( finalState, - AuthenticationErrorCommon.insufficientLength + AuthenticationErrorCommon.insufficientLength, ) : minimallyEncoded.length === targetLength - ? pushToStack(finalState, minimallyEncoded) - : pushToStack( - finalState, - padMinimallyEncodedVmNumber(minimallyEncoded, targetLength) - ); + ? pushToStack(finalState, minimallyEncoded) + : pushToStack( + finalState, + padMinimallyEncodedVmNumber(minimallyEncoded, targetLength), + ); }, { maximumVmNumberByteLength: ConsensusXEC.maximumStackItemLength, requireMinimalEncoding: false, - } + }, ); }); export const opBin2Num4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, @@ -118,130 +118,130 @@ export const opBin2Num4Byte = < return minimallyEncoded.length > ConsensusXEC.maximumVmNumberLength ? applyError( nextState, - AuthenticationErrorCommon.exceededMaximumVmNumberLength + AuthenticationErrorCommon.exceededMaximumVmNumberLength, ) : pushToStack(nextState, minimallyEncoded); }, { maximumVmNumberByteLength: ConsensusXEC.maximumStackItemLength, requireMinimalEncoding: false, - } + }, ); export const op1Add4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, (nextState, [value]) => pushToStack(nextState, bigIntToVmNumber(value + 1n)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const op1Sub4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, (nextState, [value]) => pushToStack(nextState, bigIntToVmNumber(value - 1n)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opNegate4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, (nextState, [value]) => pushToStack(nextState, bigIntToVmNumber(-value)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opAbs4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, (nextState, [value]) => pushToStack(nextState, bigIntToVmNumber(value < 0 ? -value : value)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opNot4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, (nextState, [value]) => pushToStack( nextState, - value === 0n ? bigIntToVmNumber(1n) : bigIntToVmNumber(0n) + value === 0n ? bigIntToVmNumber(1n) : bigIntToVmNumber(0n), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const op0NotEqual4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, (nextState, [value]) => pushToStack( nextState, - value === 0n ? bigIntToVmNumber(0n) : bigIntToVmNumber(1n) + value === 0n ? bigIntToVmNumber(0n) : bigIntToVmNumber(1n), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opAdd4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, bigIntToVmNumber(firstValue + secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opSub4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, bigIntToVmNumber(firstValue - secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opDiv4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, @@ -249,14 +249,14 @@ export const opDiv4Byte = < b === 0n ? applyError(nextState, AuthenticationErrorCommon.divisionByZero) : pushToStack(nextState, bigIntToVmNumber(a / b)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opMod4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, @@ -264,168 +264,168 @@ export const opMod4Byte = < b === 0n ? applyError(nextState, AuthenticationErrorCommon.divisionByZero) : pushToStack(nextState, bigIntToVmNumber(a % b)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opBoolAnd4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - booleanToVmNumber(firstValue !== 0n && secondValue !== 0n) + booleanToVmNumber(firstValue !== 0n && secondValue !== 0n), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opBoolOr4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - booleanToVmNumber(firstValue !== 0n || secondValue !== 0n) + booleanToVmNumber(firstValue !== 0n || secondValue !== 0n), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opNumEqual4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, booleanToVmNumber(firstValue === secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opNumEqualVerify4Byte = combineOperations( opNumEqual4Byte, - opVerify + opVerify, ); export const opNumNotEqual4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, booleanToVmNumber(firstValue !== secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opLessThan4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, booleanToVmNumber(firstValue < secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opLessThanOrEqual4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, booleanToVmNumber(firstValue <= secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opGreaterThan4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, booleanToVmNumber(firstValue > secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opGreaterThanOrEqual4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, booleanToVmNumber(firstValue >= secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opMin4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - bigIntToVmNumber(firstValue < secondValue ? firstValue : secondValue) + bigIntToVmNumber(firstValue < secondValue ? firstValue : secondValue), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opMax4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - bigIntToVmNumber(firstValue > secondValue ? firstValue : secondValue) + bigIntToVmNumber(firstValue > secondValue ? firstValue : secondValue), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opWithin4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useThreeVmNumbers( state, (nextState, [firstValue, secondValue, thirdValue]) => pushToStack( nextState, - booleanToVmNumber(secondValue <= firstValue && firstValue < thirdValue) + booleanToVmNumber(secondValue <= firstValue && firstValue < thirdValue), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); diff --git a/src/lib/vm/instruction-sets/xec/xec.script-tests.spec.ts b/src/lib/vm/instruction-sets/xec/xec.script-tests.spec.ts index 1eb15917..6a6acf79 100644 --- a/src/lib/vm/instruction-sets/xec/xec.script-tests.spec.ts +++ b/src/lib/vm/instruction-sets/xec/xec.script-tests.spec.ts @@ -103,11 +103,10 @@ pendingTests.map((expectation) => { pendingTests.length } - "${elide(expectation.unlockingBytecodeText, 100)}" | "${elide( expectation.lockingBytecodeText, - 100 + 100, )}" ${ expectation.expectedError === false ? 'passes' : expectation.expectedError } ${expectation.message === undefined ? '' : ` # ${expectation.message}`}`; - // eslint-disable-next-line functional/no-conditional-statement if (expectation.flags.failRequiresReview) { test.todo(`Review failure: ${description}`); } @@ -116,10 +115,10 @@ pendingTests.map((expectation) => { // eslint-disable-next-line complexity (t) => { const unlockingBytecode = assembleBitcoinSatoshiScript( - expectation.unlockingBytecodeText + expectation.unlockingBytecodeText, ); const lockingBytecode = assembleBitcoinSatoshiScript( - expectation.lockingBytecodeText + expectation.lockingBytecodeText, ); const vm = expectation.flags.useStrict ? vmStandard : vmNonStandard; const program = createTestAuthenticationProgramBCH({ @@ -142,7 +141,7 @@ pendingTests.map((expectation) => { t.log('result:', stringify(result)); t.log( 'debug:', - stringifyDebugTraceSummary(summarizeDebugTrace(vm.debug(program))) + stringifyDebugTraceSummary(summarizeDebugTrace(vm.debug(program))), ); if (expectation.expectedError === false) { t.fail('Expected a valid state, but this result is invalid.'); @@ -152,7 +151,7 @@ pendingTests.map((expectation) => { return; } t.pass(); - } + }, ); return undefined; }); diff --git a/src/lib/vm/instruction-sets/xec/xec.spec.ts b/src/lib/vm/instruction-sets/xec/xec.spec.ts index 39f27a9a..f052eecf 100644 --- a/src/lib/vm/instruction-sets/xec/xec.spec.ts +++ b/src/lib/vm/instruction-sets/xec/xec.spec.ts @@ -32,7 +32,7 @@ test('[BCH VM] vm.stateEvaluate: OP_2 OP_2 OP_ADD', (t) => { OpcodesBCH2022.OP_2, OpcodesBCH2022.OP_2, OpcodesBCH2022.OP_ADD, - ]) + ]), ), program, stack: [], @@ -70,7 +70,7 @@ test('[BCH VM] vm.stateDebug: OP_2 OP_2 OP_ADD', (t) => { OpcodesBCH2022.OP_2, OpcodesBCH2022.OP_2, OpcodesBCH2022.OP_ADD, - ]) + ]), ), program, stack: [], @@ -176,7 +176,7 @@ test('[BCH VM] vm.stateStep through: OP_2 OP_2 OP_ADD', (t) => { OpcodesBCH2022.OP_2, OpcodesBCH2022.OP_2, OpcodesBCH2022.OP_ADD, - ]) + ]), ), program, stack: [], @@ -456,8 +456,8 @@ test('verifyTransaction', (t) => { const valueSatoshis = 10000; const transaction = decodeTransactionCommon( hexToBin( - '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ); if (typeof transaction === 'string') { t.fail(transaction); @@ -467,7 +467,7 @@ test('verifyTransaction', (t) => { const sourceOutputs: Output[] = [ { lockingBytecode: hexToBin( - 'a9147ff682419764f7d0e6df75884c28334b9729864387' + 'a9147ff682419764f7d0e6df75884c28334b9729864387', ), valueSatoshis: BigInt(valueSatoshis), }, @@ -482,8 +482,8 @@ test('verifyTransaction: ', (t) => { const valueSatoshis = 10000; const transaction = decodeTransactionCommon( hexToBin( - '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ); if (typeof transaction === 'string') { t.fail(transaction); @@ -493,7 +493,7 @@ test('verifyTransaction: ', (t) => { const sourceOutputs: Output[] = [ { lockingBytecode: hexToBin( - 'a9147ff682419764f7d0e6df75884c28334b9729864387' + 'a9147ff682419764f7d0e6df75884c28334b9729864387', ), valueSatoshis: BigInt(valueSatoshis), }, @@ -507,8 +507,8 @@ test('verifyTransaction: incorrect spentOutputs length', (t) => { const vm = createVirtualMachineXEC(); const transaction = decodeTransactionCommon( hexToBin( - '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ); if (typeof transaction === 'string') { t.fail(transaction); @@ -521,7 +521,7 @@ test('verifyTransaction: incorrect spentOutputs length', (t) => { t.deepEqual( result, 'Unable to verify transaction: a single spent output must be provided for each transaction input.', - stringify(result) + stringify(result), ); }); @@ -530,8 +530,8 @@ test('verifyTransaction: invalid input', (t) => { const valueSatoshis = 10000; const transaction = decodeTransactionCommon( hexToBin( - '0100000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '0100000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ); if (typeof transaction === 'string') { t.fail(transaction); @@ -541,7 +541,7 @@ test('verifyTransaction: invalid input', (t) => { const sourceOutputs: Output[] = [ { lockingBytecode: hexToBin( - 'a9147ff682419764f7d0e6df75884c28334b9729864387' + 'a9147ff682419764f7d0e6df75884c28334b9729864387', ), valueSatoshis: BigInt(valueSatoshis), }, @@ -551,6 +551,6 @@ test('verifyTransaction: invalid input', (t) => { t.deepEqual( result, 'Error in evaluating input index 0: Program failed a signature verification with a non-null signature (violating the "NULLFAIL" rule).', - stringify(result) + stringify(result), ); }); diff --git a/src/lib/vm/virtual-machine.spec.ts b/src/lib/vm/virtual-machine.spec.ts index 6f980d80..e20ba895 100644 --- a/src/lib/vm/virtual-machine.spec.ts +++ b/src/lib/vm/virtual-machine.spec.ts @@ -25,20 +25,19 @@ const enum SimpleError { FAIL = 'The top stack item must be a 1.', } -interface SimpleResolvedTransaction { - transaction: { instructions: readonly AuthenticationInstruction[] }; -} +type SimpleResolvedTransaction = { + transaction: { instructions: AuthenticationInstruction[] }; +}; -interface SimpleProgram { - instructions: readonly AuthenticationInstruction[]; -} +type SimpleProgram = { + instructions: AuthenticationInstruction[]; +}; -interface SimpleProgramState - extends AuthenticationProgramStateMinimum, - AuthenticationProgramStateStack { - repeated?: true; - error?: string; -} +type SimpleProgramState = AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack & { + repeated?: true; + error?: string; + }; const simpleInstructionSet: InstructionSet< SimpleResolvedTransaction, @@ -105,11 +104,8 @@ const simpleInstructionSet: InstructionSet< }, }, success: (state) => - state.error === undefined - ? state.stack[state.stack.length - 1] === 1 - ? true - : SimpleError.FAIL - : state.error, + state.error ?? + (state.stack[state.stack.length - 1] === 1 || SimpleError.FAIL), undefined: (state) => { state.error = SimpleError.UNDEFINED; return state; @@ -118,7 +114,7 @@ const simpleInstructionSet: InstructionSet< const result = success( evaluate({ instructions: resolvedTransaction.transaction.instructions, - }) + }), ); return typeof result === 'string' ? result : true; }, @@ -126,7 +122,7 @@ const simpleInstructionSet: InstructionSet< const vm = createAuthenticationVirtualMachine(simpleInstructionSet); -const instructions: readonly AuthenticationInstruction[] = [ +const instructions: AuthenticationInstruction[] = [ { opcode: SimpleOps.OP_0 }, { opcode: SimpleOps.OP_INCREMENT }, { opcode: SimpleOps.OP_INCREMENT }, @@ -135,12 +131,12 @@ const instructions: readonly AuthenticationInstruction[] = [ { opcode: SimpleOps.OP_ADD }, ]; -const instructionsFail1: readonly AuthenticationInstruction[] = [ +const instructionsFail1: AuthenticationInstruction[] = [ { opcode: SimpleOps.OP_0 }, { opcode: SimpleOps.OP_DECREMENT }, ]; -const instructionsFail2: readonly AuthenticationInstruction[] = [ +const instructionsFail2: AuthenticationInstruction[] = [ { opcode: SimpleOps.OP_0 }, { opcode: SimpleOps.OP_INCREMENT }, { opcode: SimpleOps.OP_INCREMENT }, @@ -207,14 +203,14 @@ test('vm.verify with a simple instruction set (success)', (t) => { test('vm.verify with a simple instruction set (failure 1)', (t) => { t.deepEqual( vm.verify({ transaction: { instructions: instructionsFail1 } }), - SimpleError.FAIL + SimpleError.FAIL, ); }); test('vm.verify with a simple instruction set (failure 2)', (t) => { t.deepEqual( vm.verify({ transaction: { instructions: instructionsFail2 } }), - SimpleError.EXCESSIVE + SimpleError.EXCESSIVE, ); }); @@ -251,7 +247,7 @@ test('vm.stateStepMutate does not clone (mutating the original state)', (t) => { test('vm.stateSuccess is available', (t) => { t.deepEqual( vm.stateSuccess({ instructions: instructionsFail1, ip: 0, stack: [2] }), - SimpleError.FAIL + SimpleError.FAIL, ); }); @@ -266,12 +262,12 @@ test('vm.stateClone is available', (t) => { instructions, ip: 0, stack: [1, 2, 3], - } + }, ); }); test('vm can control the instruction pointer', (t) => { - const repeated: readonly AuthenticationInstruction[] = [ + const repeated: AuthenticationInstruction[] = [ { opcode: SimpleOps.OP_0 }, { opcode: SimpleOps.OP_INCREMENT }, { opcode: SimpleOps.OP_REPEAT }, diff --git a/src/lib/vm/virtual-machine.ts b/src/lib/vm/virtual-machine.ts index 60e8c04d..f414c54c 100644 --- a/src/lib/vm/virtual-machine.ts +++ b/src/lib/vm/virtual-machine.ts @@ -20,9 +20,9 @@ export type Operation = (state: ProgramState) => ProgramState; * Test a program state, returning an error message. */ export type TestState = (state: ProgramState) => string | true; -export interface InstructionSetOperationMapping { +export type InstructionSetOperationMapping = { [opcode: number]: Operation; -} +}; /** * An {@link InstructionSet} is a mapping of methods that define the operation @@ -37,11 +37,11 @@ export interface InstructionSetOperationMapping { * based on its opcode. Any opcodes that are unassigned by the instruction set * will use the `undefined` operation. */ -export interface InstructionSet< +export type InstructionSet< ResolvedTransaction, AuthenticationProgram, - ProgramState -> { + ProgramState, +> = { /** * Take a `ProgramState` and return a new copy of that `ProgramState`. * @@ -49,6 +49,8 @@ export interface InstructionSet< * This method is used internally by `stateEvaluate`, `stateStep`, and * `stateDebug` to prevent the {@link AuthenticationVirtualMachine} from * mutating an input when mutation is not desirable. + * + * @deprecated use `structuredClone` instead */ clone: Operation; @@ -97,7 +99,7 @@ export interface InstructionSet< */ evaluate: ( program: AuthenticationProgram, - stateEvaluate: (state: Readonly) => ProgramState + stateEvaluate: (state: ProgramState) => ProgramState, ) => ProgramState; /** @@ -151,20 +153,20 @@ export interface InstructionSet< */ verify: ( resolvedTransaction: ResolvedTransaction, - evaluate: (program: Readonly) => ProgramState, - success: (state: ProgramState) => string | true + evaluate: (program: AuthenticationProgram) => ProgramState, + success: (state: ProgramState) => string | true, ) => string | true; -} +}; /** * A set of pure-functions allowing transactions and their authentication * programs to be evaluated and inspected. */ -export interface AuthenticationVirtualMachine< +export type AuthenticationVirtualMachine< ResolvedTransaction, AuthenticationProgram, - ProgramState -> { + ProgramState, +> = { /** * Debug a program by fully evaluating it, cloning and adding each * intermediate `ProgramState` to the returned array. The first `ProgramState` @@ -195,24 +197,26 @@ export interface AuthenticationVirtualMachine< * * @param state - the {@link AuthenticationProgram} to debug */ - debug: (program: Readonly) => ProgramState[]; + debug: (program: AuthenticationProgram) => ProgramState[]; /** * Fully evaluate a program, returning the resulting `ProgramState`. * * @param state - the {@link AuthenticationProgram} to evaluate */ - evaluate: (program: Readonly) => ProgramState; + evaluate: (program: AuthenticationProgram) => ProgramState; /** * Clone the provided ProgramState. + * + * @deprecated use `structuredClone` instead */ - stateClone: (state: Readonly) => ProgramState; + stateClone: (state: ProgramState) => ProgramState; /** * Test the ProgramState to determine if execution should continue. */ - stateContinue: (state: Readonly) => boolean; + stateContinue: (state: ProgramState) => boolean; /** * Return an array of program states by fully evaluating `state`, cloning and @@ -225,7 +229,7 @@ export interface AuthenticationVirtualMachine< * machine and cannot produce a final result. In most cases, `debug` is the * proper method to debug a program. */ - stateDebug: (state: Readonly) => ProgramState[]; + stateDebug: (state: ProgramState) => ProgramState[]; /** * Return a new program state by cloning and fully evaluating `state`. @@ -240,14 +244,14 @@ export interface AuthenticationVirtualMachine< * * @param state - the program state to evaluate */ - stateEvaluate: (state: Readonly) => ProgramState; + stateEvaluate: (state: ProgramState) => ProgramState; /** * Clones and return a new program state advanced by one step. * * @param state - the program state to advance */ - stateStep: (state: Readonly) => ProgramState; + stateStep: (state: ProgramState) => ProgramState; /** * A faster, less-safe version of `step` that directly modifies the provided @@ -294,7 +298,7 @@ export interface AuthenticationVirtualMachine< * and BIP112 for details.) */ verify: (resolvedTransaction: ResolvedTransaction) => string | true; -} +}; /** * Create an {@link AuthenticationVirtualMachine} to evaluate authentication @@ -304,30 +308,30 @@ export interface AuthenticationVirtualMachine< export const createAuthenticationVirtualMachine = < ResolvedTransaction = ResolvedTransactionCommon, AuthenticationProgram = AuthenticationProgramCommon, - ProgramState extends AuthenticationProgramStateMinimum = AuthenticationProgramStateCommon + ProgramState extends + AuthenticationProgramStateMinimum = AuthenticationProgramStateCommon, >( instructionSet: InstructionSet< ResolvedTransaction, AuthenticationProgram, ProgramState - > + >, ): AuthenticationVirtualMachine< ResolvedTransaction, AuthenticationProgram, ProgramState > => { const availableOpcodes = 256; - const operators = range(availableOpcodes).map((codepoint) => - instructionSet.operations[codepoint] === undefined - ? instructionSet.undefined - : instructionSet.operations[codepoint] + const operators = range(availableOpcodes).map( + (codepoint) => + instructionSet.operations[codepoint] ?? instructionSet.undefined, ); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const getCodepoint = (state: ProgramState) => state.instructions[state.ip]!; const after = (state: ProgramState) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.ip += 1; return state; }; @@ -352,11 +356,11 @@ export const createAuthenticationVirtualMachine = < */ const untilComplete = ( state: ProgramState, - stepFunction: (state: ProgramState) => ProgramState + stepFunction: (state: ProgramState) => ProgramState, ) => { - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (stateContinue(state)) { - // eslint-disable-next-line functional/no-expression-statement, no-param-reassign + // eslint-disable-next-line functional/no-expression-statements, no-param-reassign state = stepFunction(state); } return state; @@ -375,12 +379,12 @@ export const createAuthenticationVirtualMachine = < const stateDebug = (state: ProgramState) => { const trace: ProgramState[] = []; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data trace.push(state); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements untilComplete(state, (currentState: ProgramState) => { const nextState = stateDebugStep(currentState); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data trace.push(nextState); return nextState; }); @@ -396,7 +400,7 @@ export const createAuthenticationVirtualMachine = < const results: ProgramState[] = []; const proxyDebug = (state: ProgramState) => { const debugResult = stateDebug(state); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data results.push(...debugResult); return debugResult[debugResult.length - 1] ?? state; }; diff --git a/src/lib/vm/vm-types.ts b/src/lib/vm/vm-types.ts index 57be8722..e12c9cef 100644 --- a/src/lib/vm/vm-types.ts +++ b/src/lib/vm/vm-types.ts @@ -4,39 +4,37 @@ import type { TransactionCommon, } from '../lib.js'; -export interface AuthenticationProgramStateMinimum { +export type AuthenticationProgramStateMinimum = { /** * The full list of instructions to be evaluated by the virtual machine. */ - readonly instructions: readonly AuthenticationInstruction[]; + instructions: AuthenticationInstruction[]; /** * Instruction Pointer – the array index of `instructions` that will be read * to identify the next instruction. Once `ip` exceeds the last index of * `instructions` (`ip === instructions.length`), evaluation is complete. */ ip: number; -} +}; -export interface AuthenticationProgramStateStack { +export type AuthenticationProgramStateStack = { /** * The stack is the primary workspace of the virtual machine. Most virtual * machine operations create, read, update, or delete bytecode values * held on the stack. */ stack: StackType[]; -} +}; -export interface AuthenticationProgramStateAlternateStack< - StackType = Uint8Array -> { +export type AuthenticationProgramStateAlternateStack = { /** * The "alternate stack" is separate stack on which `OP_TOALTSTACK` and * `OP_FROMALTSTACK` operate in bitcoin virtual machines. */ alternateStack: StackType[]; -} +}; -export interface AuthenticationProgramStateControlStack { +export type AuthenticationProgramStateControlStack = { /** * An array of boolean values representing the current execution status of the * program. This allows the state to track nested conditional branches. @@ -51,33 +49,33 @@ export interface AuthenticationProgramStateControlStack { * A.K.A. `vfExec` in the C++ implementation. */ controlStack: ItemType[]; -} +}; -export interface AuthenticationProgramStateError { +export type AuthenticationProgramStateError = { /** * If present, the error returned by the most recent virtual machine * operation. */ error?: string; -} +}; /** * A complete view of the information necessary to validate a transaction. */ -export interface ResolvedTransactionCommon { +export type ResolvedTransactionCommon = { sourceOutputs: Output[]; transaction: TransactionCommon; -} +}; /** * A complete view of the information necessary to validate a specified input in * a transaction. */ -export interface AuthenticationProgramCommon extends ResolvedTransactionCommon { +export type AuthenticationProgramCommon = ResolvedTransactionCommon & { inputIndex: number; -} +}; -export interface AuthenticationProgramStateCodeSeparator { +export type AuthenticationProgramStateCodeSeparator = { /** * The `lastCodeSeparator` indicates the index of the most recently executed * `OP_CODESEPARATOR` instruction. In each of the signing serialization @@ -90,9 +88,9 @@ export interface AuthenticationProgramStateCodeSeparator { * array is included in the signing serialization. */ lastCodeSeparator: number; -} +}; -export interface AuthenticationProgramStateSignatureAnalysis { +export type AuthenticationProgramStateSignatureAnalysis = { /** * An array of the `Uint8Array` values used in signature verification over the * course of this program. Each raw signing serialization and data signature @@ -131,24 +129,24 @@ export interface AuthenticationProgramStateSignatureAnalysis { message: Uint8Array; } )[]; -} +}; -export interface AuthenticationProgramStateResourceLimits { +export type AuthenticationProgramStateResourceLimits = { operationCount: number; signatureOperationsCount: number; -} +}; -export interface AuthenticationProgramStateTransactionContext { - program: Readonly; -} +export type AuthenticationProgramStateTransactionContext = { + program: AuthenticationProgramCommon; +}; -export interface AuthenticationProgramStateCommon - extends AuthenticationProgramStateMinimum, - AuthenticationProgramStateStack, - AuthenticationProgramStateAlternateStack, - AuthenticationProgramStateControlStack, - AuthenticationProgramStateError, - AuthenticationProgramStateCodeSeparator, - AuthenticationProgramStateSignatureAnalysis, - AuthenticationProgramStateResourceLimits, - AuthenticationProgramStateTransactionContext {} +export type AuthenticationProgramStateCommon = + AuthenticationProgramStateAlternateStack & + AuthenticationProgramStateCodeSeparator & + AuthenticationProgramStateControlStack & + AuthenticationProgramStateError & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateResourceLimits & + AuthenticationProgramStateSignatureAnalysis & + AuthenticationProgramStateStack & + AuthenticationProgramStateTransactionContext; diff --git a/src/lib/vmb-tests/bch-vmb-test-mixins.ts b/src/lib/vmb-tests/bch-vmb-test-mixins.ts index 007e55c0..b2ec010d 100644 --- a/src/lib/vmb-tests/bch-vmb-test-mixins.ts +++ b/src/lib/vmb-tests/bch-vmb-test-mixins.ts @@ -1,61 +1,61 @@ import type { - AuthenticationTemplateScenario, - AuthenticationTemplateScenarioInput, - AuthenticationTemplateScenarioSourceOutput, - AuthenticationTemplateScenarioTransactionOutput, + WalletTemplateScenario, + WalletTemplateScenarioInput, + WalletTemplateScenarioSourceOutput, + WalletTemplateScenarioTransactionOutput, } from '../lib.js'; -export const simpleP2pkhOutput: AuthenticationTemplateScenarioSourceOutput = { +export const simpleP2pkhOutput: WalletTemplateScenarioSourceOutput = { lockingBytecode: { script: 'lockP2pkh' }, valueSatoshis: 10_000, }; -export const simpleP2pkhInput: AuthenticationTemplateScenarioInput = { +export const simpleP2pkhInput: WalletTemplateScenarioInput = { unlockingBytecode: { script: 'unlockP2pkh' }, }; -export const emptyP2sh20Output: AuthenticationTemplateScenarioSourceOutput = { +export const emptyP2sh20Output: WalletTemplateScenarioSourceOutput = { lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000, }; -export const emptyP2sh20Input: AuthenticationTemplateScenarioInput = { +export const emptyP2sh20Input: WalletTemplateScenarioInput = { unlockingBytecode: { script: 'unlockEmptyP2sh20' }, }; -export const vmbTestOutput: AuthenticationTemplateScenarioTransactionOutput = { +export const vmbTestOutput: WalletTemplateScenarioTransactionOutput = { lockingBytecode: { script: 'vmbTestNullData' }, valueSatoshis: 0, }; -export const slotOutput: AuthenticationTemplateScenarioSourceOutput = { +export const slotOutput: WalletTemplateScenarioSourceOutput = { lockingBytecode: ['slot'], valueSatoshis: 10_000, }; -export const slotInput: AuthenticationTemplateScenarioInput = { +export const slotInput: WalletTemplateScenarioInput = { unlockingBytecode: ['slot'], }; -export const slot0Scenario: AuthenticationTemplateScenario = { +export const slot0Scenario: WalletTemplateScenario = { sourceOutputs: [slotOutput, simpleP2pkhOutput], transaction: { inputs: [slotInput, simpleP2pkhInput], outputs: [vmbTestOutput], }, }; -export const slot1Scenario: AuthenticationTemplateScenario = { +export const slot1Scenario: WalletTemplateScenario = { sourceOutputs: [simpleP2pkhOutput, slotOutput], transaction: { inputs: [simpleP2pkhInput, slotInput], outputs: [vmbTestOutput], }, }; -export const slot2Scenario: AuthenticationTemplateScenario = { +export const slot2Scenario: WalletTemplateScenario = { sourceOutputs: [simpleP2pkhOutput, simpleP2pkhOutput, slotOutput], transaction: { inputs: [simpleP2pkhInput, simpleP2pkhInput, slotInput], outputs: [vmbTestOutput], }, }; -export const slot9Scenario: AuthenticationTemplateScenario = { +export const slot9Scenario: WalletTemplateScenario = { sourceOutputs: [ simpleP2pkhOutput, simpleP2pkhOutput, diff --git a/src/lib/vmb-tests/bch-vmb-test-utils.spec.ts b/src/lib/vmb-tests/bch-vmb-test-utils.spec.ts index 51b77ae5..52978f61 100644 --- a/src/lib/vmb-tests/bch-vmb-test-utils.spec.ts +++ b/src/lib/vmb-tests/bch-vmb-test-utils.spec.ts @@ -59,6 +59,6 @@ test('vmbTestGroupToVmbTests', (t) => { ], ], - `Stringified test vector:\n${stringifyTestVector(result)}` + `Stringified test vector:\n${stringifyTestVector(result)}`, ); }); diff --git a/src/lib/vmb-tests/bch-vmb-test-utils.ts b/src/lib/vmb-tests/bch-vmb-test-utils.ts index 530d1318..4658237d 100644 --- a/src/lib/vmb-tests/bch-vmb-test-utils.ts +++ b/src/lib/vmb-tests/bch-vmb-test-utils.ts @@ -3,13 +3,10 @@ */ import { encodeBech32, regroupBits } from '../address/address.js'; import { createCompilerBCH } from '../compiler/compiler-bch/compiler-bch.js'; -import { authenticationTemplateToCompilerConfiguration } from '../compiler/compiler-utils.js'; +import { walletTemplateToCompilerConfiguration } from '../compiler/compiler-utils.js'; import { sha256 } from '../crypto/crypto.js'; import { binToHex, flattenBinArray } from '../format/format.js'; -import type { - AuthenticationTemplate, - AuthenticationTemplateScenario, -} from '../lib.js'; +import type { WalletTemplate, WalletTemplateScenario } from '../lib.js'; import { encodeTransaction, encodeTransactionOutputs, @@ -71,7 +68,7 @@ export type VmbTestMasterBCH = [ * * This field is left undefined for `inputIndex`s of `0` (the default). */ - inputIndex?: number + inputIndex?: number, ]; export type VmbTest = [ @@ -81,7 +78,7 @@ export type VmbTest = [ redeemOrLockingScriptAsm: string, testTransactionHex: string, sourceOutputsHex: string, - inputIndex?: number + inputIndex?: number, ]; /** @@ -152,9 +149,8 @@ const testSetOverrideListBCH = [ ] as const; type TestSetOverrideListBCH = (typeof testSetOverrideListBCH)[number]; -// eslint-disable-next-line @typescript-eslint/no-unused-vars const testList = (_list: Readonly[]>) => 0; -// eslint-disable-next-line functional/no-expression-statement +// eslint-disable-next-line functional/no-expression-statements testList(testSetOverrideListBCH); type TestPlan = { @@ -715,16 +711,16 @@ export type VmbTestDefinition = [ /** * A scenario that extends the default scenario for use with this test. */ - scenario?: AuthenticationTemplateScenario, + scenario?: WalletTemplateScenario, /** * An additional mapping of scripts to make available during scenario * generation. */ - additionalScripts?: AuthenticationTemplate['scripts'] + additionalScripts?: WalletTemplate['scripts'], ]; export type VmbTestDefinitionGroup = [ groupDescription: string, - tests: VmbTestDefinition[] + tests: VmbTestDefinition[], ]; /** @@ -734,7 +730,7 @@ export type VmbTestDefinitionGroup = [ const defaultShortIdLength = 5; const planTestsBCH = ( - labels?: readonly string[] + labels?: readonly string[], // eslint-disable-next-line @typescript-eslint/no-non-null-assertion ) => supportedTestSetOverridesBCH[(labels ?? []).join(',')]!; @@ -745,7 +741,7 @@ const planTestsBCH = ( export const vmbTestDefinitionToVmbTests = ( testDefinition: VmbTestDefinition, groupName = '', - shortIdLength = defaultShortIdLength + shortIdLength = defaultShortIdLength, ): VmbTestMasterBCH[] => { const [ unlockingScript, @@ -761,7 +757,7 @@ export const vmbTestDefinitionToVmbTests = ( const scenarioDefinition = { extends: 'vmb_default', ...scenarioOverride }; - const configuration = authenticationTemplateToCompilerConfiguration({ + const configuration = walletTemplateToCompilerConfiguration({ entities: { tester: { variables: { key1: { type: 'HdKey' } } } }, scenarios: { [scenarioId]: scenarioDefinition, @@ -816,25 +812,25 @@ export const vmbTestDefinitionToVmbTests = ( }[planItem.mode], }); if (typeof result === 'string') { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error(`Error while generating "${description}" - ${result}`); } if (typeof result.scenario === 'string') { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error( - `Error while generating "${description}" - ${result.scenario}` + `Error while generating "${description}" - ${result.scenario}`, ); } const encodedTx = encodeTransaction(result.scenario.program.transaction); const encodedSourceOutputs = encodeTransactionOutputs( - result.scenario.program.sourceOutputs + result.scenario.program.sourceOutputs, ); const shortId = encodeBech32( regroupBits({ bin: sha256.hash(flattenBinArray([encodedTx, encodedSourceOutputs])), resultWordLength: 5, sourceWordLength: 8, - }) as number[] + }) as number[], ).slice(0, shortIdLength); const testCase = [ @@ -859,7 +855,7 @@ export const vmbTestDefinitionToVmbTests = ( export const vmbTestGroupToVmbTests = (testGroup: VmbTestDefinitionGroup) => testGroup[1].map((testDefinition) => - vmbTestDefinitionToVmbTests(testDefinition, testGroup[0]) + vmbTestDefinitionToVmbTests(testDefinition, testGroup[0]), ); /** @@ -883,7 +879,7 @@ export const vmbTestGroupToVmbTests = (testGroup: VmbTestDefinitionGroup) => * separate files). */ export const vmbTestPartitionMasterTestList = ( - masterTestList: VmbTestMasterBCH[] + masterTestList: VmbTestMasterBCH[], ) => masterTestList.reduce<{ [key in TestSetIdBCH]?: VmbTest[]; @@ -909,9 +905,9 @@ export const vmbTestPartitionMasterTestList = ( ...(inputIndex === undefined ? [] : [inputIndex]), ] as VmbTest; - // eslint-disable-next-line functional/no-return-void, functional/no-expression-statement + // eslint-disable-next-line functional/no-return-void, functional/no-expression-statements testSets.forEach((testSet) => { - // eslint-disable-next-line functional/immutable-data, functional/no-expression-statement + // eslint-disable-next-line functional/immutable-data, functional/no-expression-statements accumulatedTestSets[testSet] = [ ...(accumulatedTestSets[testSet] ?? []), withoutSets, diff --git a/src/lib/vmb-tests/bch-vmb-test.spec.helper.ts b/src/lib/vmb-tests/bch-vmb-test.spec.helper.ts index 2d230c93..47767c22 100644 --- a/src/lib/vmb-tests/bch-vmb-test.spec.helper.ts +++ b/src/lib/vmb-tests/bch-vmb-test.spec.helper.ts @@ -1,4 +1,4 @@ -/* eslint-disable no-console, functional/no-expression-statement, @typescript-eslint/no-non-null-assertion */ +/* eslint-disable no-console, functional/no-expression-statements, @typescript-eslint/no-non-null-assertion */ import type { Output, ReadResult, Transaction } from '../lib.js'; import { createVirtualMachineBCH2022, @@ -31,13 +31,14 @@ const vms = { const isVm = (vmId: string): vmId is keyof typeof vms => Object.keys(vms).includes(vmId); +// cspell:ignore crzlx const usageInfo = ` This script runs a single VMB test on the requested VM, logging the results and debugging information. Use the "-v" flag to output the full debug trace. Available VMs: ${Object.keys(vms).join(', ')} Usage: yarn test:unit:vmb_test [-v] -E.g.: yarn test:unit:vmb_test bch_2022_standard 9046t +E.g.: yarn test:unit:vmb_test bch_2023_standard crzlx `; const [, , vmId, testId, useVerbose] = process.argv; @@ -64,7 +65,7 @@ const testDefinition = ( testTransactionHex: string, sourceOutputsHex: string, testSets: string[], - inputIndex?: number + inputIndex?: number, ][] ).find(([shortId]) => shortId === testId); @@ -114,7 +115,7 @@ const unexpectedFailingIndexDebugTrace = : undefined; const isP2sh20 = isPayToScriptHash20( - sourceOutputs[testedIndex]!.lockingBytecode + sourceOutputs[testedIndex]!.lockingBytecode, ); const verbose = ` @@ -168,7 +169,7 @@ Note: an unexpected index is failing; the input index under test is ${testedInde Evaluation at failing index (${failingIndex!}): ${stringifyDebugTraceSummary( - summarizeDebugTrace(unexpectedFailingIndexDebugTrace) + summarizeDebugTrace(unexpectedFailingIndexDebugTrace), )} ` } diff --git a/src/lib/vmb-tests/bch-vmb-tests-invalid.spec.helper.ts b/src/lib/vmb-tests/bch-vmb-tests-invalid.spec.helper.ts index e7ef8bda..db267a7d 100644 --- a/src/lib/vmb-tests/bch-vmb-tests-invalid.spec.helper.ts +++ b/src/lib/vmb-tests/bch-vmb-tests-invalid.spec.helper.ts @@ -1,4 +1,4 @@ -/* eslint-disable functional/no-expression-statement */ +/* eslint-disable functional/no-expression-statements */ /** * This script produces a `*reasons.json` file for every VMB test that is * expected to fail. Run it with: `yarn gen:vmb-tests`. @@ -32,10 +32,10 @@ const writeReasonsFile = ( }: { supportsTokens: boolean; vm: AuthenticationVirtualMachineBCH | AuthenticationVirtualMachineBCHCHIPs; - } + }, ) => { const vmbTests = JSON.parse( - readFileSync(invalidJsonPath, { encoding: 'utf8' }) + readFileSync(invalidJsonPath, { encoding: 'utf8' }), ) as VmbTest[]; const getReason = ({ sourceOutputsHex, @@ -66,7 +66,7 @@ const writeReasonsFile = ( [shortId]: getReason({ sourceOutputsHex, txHex }), }; }, - {} + {}, ); writeFileSync(reasonsPath, JSON.stringify(reasons), { encoding: 'utf8' }); }; @@ -77,40 +77,40 @@ const rel = (path: string) => resolve(basePath, path); writeReasonsFile( rel('./bch_vmb_tests_2022_invalid.json'), rel('./bch_vmb_tests_2022_invalid_reasons.json'), - { supportsTokens: false, vm: createVirtualMachineBCH2022(false) } + { supportsTokens: false, vm: createVirtualMachineBCH2022(false) }, ); writeReasonsFile( rel('./bch_vmb_tests_2022_nonstandard.json'), rel('./bch_vmb_tests_2022_nonstandard_reasons.json'), - { supportsTokens: false, vm: createVirtualMachineBCH2022(true) } + { supportsTokens: false, vm: createVirtualMachineBCH2022(true) }, ); writeReasonsFile( rel('./CHIPs/bch_vmb_tests_before_chip_cashtokens_invalid.json'), rel('./CHIPs/bch_vmb_tests_before_chip_cashtokens_invalid_reasons.json'), - { supportsTokens: false, vm: createVirtualMachineBCH2022(false) } + { supportsTokens: false, vm: createVirtualMachineBCH2022(false) }, ); writeReasonsFile( rel('./CHIPs/bch_vmb_tests_before_chip_cashtokens_nonstandard.json'), rel('./CHIPs/bch_vmb_tests_before_chip_cashtokens_nonstandard_reasons.json'), - { supportsTokens: false, vm: createVirtualMachineBCH2022(true) } + { supportsTokens: false, vm: createVirtualMachineBCH2022(true) }, ); writeReasonsFile( rel('./CHIPs/bch_vmb_tests_chip_cashtokens_invalid.json'), rel('./CHIPs/bch_vmb_tests_chip_cashtokens_invalid_reasons.json'), - { supportsTokens: true, vm: createVirtualMachineBCH2023(false) } + { supportsTokens: true, vm: createVirtualMachineBCH2023(false) }, ); writeReasonsFile( rel('./CHIPs/bch_vmb_tests_chip_cashtokens_nonstandard.json'), rel('./CHIPs/bch_vmb_tests_chip_cashtokens_nonstandard_reasons.json'), - { supportsTokens: true, vm: createVirtualMachineBCH2023(true) } + { supportsTokens: true, vm: createVirtualMachineBCH2023(true) }, ); writeReasonsFile( rel('./CHIPs/bch_vmb_tests_chip_loops_invalid.json'), rel('./CHIPs/bch_vmb_tests_chip_loops_invalid_reasons.json'), - { supportsTokens: true, vm: createVirtualMachineBCHCHIPs(false) } + { supportsTokens: true, vm: createVirtualMachineBCHCHIPs(false) }, ); writeReasonsFile( rel('./CHIPs/bch_vmb_tests_chip_loops_nonstandard.json'), rel('./CHIPs/bch_vmb_tests_chip_loops_nonstandard_reasons.json'), - { supportsTokens: true, vm: createVirtualMachineBCHCHIPs(true) } + { supportsTokens: true, vm: createVirtualMachineBCHCHIPs(true) }, ); diff --git a/src/lib/vmb-tests/bch-vmb-tests.cashtokens.ts b/src/lib/vmb-tests/bch-vmb-tests.cashtokens.ts index d56c4bd6..8d6421ba 100644 --- a/src/lib/vmb-tests/bch-vmb-tests.cashtokens.ts +++ b/src/lib/vmb-tests/bch-vmb-tests.cashtokens.ts @@ -5365,8 +5365,8 @@ export const cashTokenTestDefinitionsBCH: VmbTestDefinitionGroup = [ cashAssemblyToBin( `OP_RETURN <0x${range(479) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), token: { amount: 253 }, valueSatoshis: 1_000, @@ -5390,8 +5390,8 @@ export const cashTokenTestDefinitionsBCH: VmbTestDefinitionGroup = [ cashAssemblyToBin( `OP_RETURN <0x${range(480) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), token: { amount: 253 }, valueSatoshis: 1_000, @@ -5429,8 +5429,8 @@ export const cashTokenTestDefinitionsBCH: VmbTestDefinitionGroup = [ cashAssemblyToBin( `OP_RETURN <0x${range(516) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), token: { amount: 253 }, valueSatoshis: 1_000, @@ -5454,8 +5454,8 @@ export const cashTokenTestDefinitionsBCH: VmbTestDefinitionGroup = [ cashAssemblyToBin( `OP_RETURN <0x${range(517) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), token: { amount: 253 }, valueSatoshis: 1_000, diff --git a/src/lib/vmb-tests/bch-vmb-tests.live.spec.helper.ts b/src/lib/vmb-tests/bch-vmb-tests.live.spec.helper.ts index eef531f4..5b48774d 100644 --- a/src/lib/vmb-tests/bch-vmb-tests.live.spec.helper.ts +++ b/src/lib/vmb-tests/bch-vmb-tests.live.spec.helper.ts @@ -1,4 +1,4 @@ -/* eslint-disable no-console, functional/no-expression-statement */ +/* eslint-disable no-console, functional/no-expression-statements */ // TODO: finish this simple wallet CLI @@ -7,7 +7,6 @@ import { writeFileSync } from 'node:fs'; import { resolve } from 'node:path'; import { - authenticationTemplateToCompilerConfiguration, binsAreEqual, binToHex, cashAddressToLockingBytecode, @@ -25,6 +24,7 @@ import { lockingBytecodeToBase58Address, lockingBytecodeToCashAddress, stringify, + walletTemplateToCompilerConfiguration, } from '../lib.js'; const usageInfo = ` @@ -66,7 +66,7 @@ const fundingAddressIndex = 0; if (arg1 === 'private') { if (arg2 !== undefined && !isHex(arg2)) { console.log( - 'Seed must be hex encoded. To use a random seed, omit this option.' + 'Seed must be hex encoded. To use a random seed, omit this option.', ); process.exit(1); } @@ -76,7 +76,7 @@ if (arg1 === 'private') { const node = deriveHdPrivateNodeFromSeed(seed); if (!node.valid) { console.log( - `Tell everyone you found an invalid HD seed 🀯: ${binToHex(seed)}` + `Tell everyone you found an invalid HD seed 🀯: ${binToHex(seed)}`, ); process.exit(1); } @@ -120,11 +120,11 @@ if (arg1 === 'address') { }; const legacyAddress = lockingBytecodeToBase58Address( bytecode, - 'mainnet' + 'mainnet', ) as string; const copayAddress = lockingBytecodeToBase58Address( bytecode, - 'copayBCH' + 'copayBCH', ) as string; console.log(` Derived address index ${fundingAddressIndex} from key ID: ${binToHex(keyId)}. @@ -149,7 +149,7 @@ if (arg1 !== 'generate') { } if (arg2 === undefined || arg3 === undefined) { console.log( - 'Required arguments for "generate": ' + 'Required arguments for "generate": ', ); console.log(usageInfo); process.exit(1); @@ -168,10 +168,10 @@ const fundingLockingBytecode = hdPrivateKeyToP2pkhLockingBytecode({ }); const fundingAddress = lockingBytecodeToCashAddress( fundingLockingBytecode, - 'bitcoincash' + 'bitcoincash', ) as string; const fundingUtxoIndex = fundingTransaction.outputs.findIndex((output) => - binsAreEqual(output.lockingBytecode, fundingLockingBytecode) + binsAreEqual(output.lockingBytecode, fundingLockingBytecode), ); if (fundingUtxoIndex === -1) { @@ -179,7 +179,7 @@ if (fundingUtxoIndex === -1) { `The provided funding transaction does not have an output which pays to address index ${fundingAddressIndex} of the provided HD private key. Is this the correct transaction? Expected locking bytecode: ${binToHex(fundingLockingBytecode)} CashAddress: ${fundingAddress} -` +`, ); process.exit(1); } @@ -192,7 +192,7 @@ const outputAddress = 'bitcoincash:qq2pq6z974lrdq8s0zkrl79efs3xap98fqvz9f30fl'; const outputLockingBytecode = cashAddressToLockingBytecode(outputAddress); if (typeof outputLockingBytecode === 'string') { console.log( - `The output address "${outputAddress}" is invalid: ${outputLockingBytecode}` + `The output address "${outputAddress}" is invalid: ${outputLockingBytecode}`, ); process.exit(1); } @@ -201,7 +201,7 @@ const fundingUtxoValue = Number(fundingUtxo.valueSatoshis); const expectedInputTransactionSizeBytes = 1000; const setupOutputValue = fundingUtxoValue - expectedInputTransactionSizeBytes; const finalOutputValue = setupOutputValue - expectedInputTransactionSizeBytes; -const configuration = authenticationTemplateToCompilerConfiguration({ +const configuration = walletTemplateToCompilerConfiguration({ entities: { owner: { variables: { key: { type: 'HdKey' } } } }, scenarios: { setupTx: { @@ -266,7 +266,7 @@ if (typeof setupTx === 'string') { } if (typeof setupTx.scenario === 'string') { console.log( - `Error while generating setupTransaction.scenario - ${setupTx.scenario}` + `Error while generating setupTransaction.scenario - ${setupTx.scenario}`, ); process.exit(1); } diff --git a/src/lib/vmb-tests/bch-vmb-tests.signing-serialization.ts b/src/lib/vmb-tests/bch-vmb-tests.signing-serialization.ts index c0f6d6fd..208992cb 100644 --- a/src/lib/vmb-tests/bch-vmb-tests.signing-serialization.ts +++ b/src/lib/vmb-tests/bch-vmb-tests.signing-serialization.ts @@ -2,7 +2,7 @@ * See `bch-vmb-tests.ts` for details about modifying this file. */ -import type { AuthenticationTemplateScenario, VmbTestDefinition, VmbTestDefinitionGroup } from '../lib.js'; +import type { VmbTestDefinition, VmbTestDefinitionGroup, WalletTemplateScenario } from '../lib.js'; import { emptyP2sh20Input, emptyP2sh20Output, simpleP2pkhInput, simpleP2pkhOutput } from './bch-vmb-test-mixins.js'; @@ -46,7 +46,7 @@ const verifyAlgorithm = algorithms.map((algorithm) => [ { sourceOutputs: [{ lockingBytecode: ['slot'], valueSatoshis: 10_000 }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }], outputs: [{ lockingBytecode: { script: 'vmbTestNullData' }, valueSatoshis: 0 }] } }, ]); -const changeScenario = (testDefinitions: VmbTestDefinition[], appendDescription: string, newScenario: AuthenticationTemplateScenario) => testDefinitions.map(([unlockingScript, redeemOrLockingScript, testDescription, testSetOverrideLabels]) => [unlockingScript, redeemOrLockingScript, `${testDescription}${appendDescription}`, testSetOverrideLabels, newScenario]); +const changeScenario = (testDefinitions: VmbTestDefinition[], appendDescription: string, newScenario: WalletTemplateScenario) => testDefinitions.map(([unlockingScript, redeemOrLockingScript, testDescription, testSetOverrideLabels]) => [unlockingScript, redeemOrLockingScript, `${testDescription}${appendDescription}`, testSetOverrideLabels, newScenario]); const verifyAlgorithmWithP2pkhInput = changeScenario(verifyAlgorithm, ' (with P2PKH input)', { sourceOutputs: [simpleP2pkhOutput, { lockingBytecode: ['slot'], valueSatoshis: 10_000 }], transaction: { inputs: [simpleP2pkhInput, { unlockingBytecode: ['slot'] }], outputs: [{ lockingBytecode: { script: 'vmbTestNullData' }, valueSatoshis: 0 }] } }); diff --git a/src/lib/vmb-tests/bch-vmb-tests.spec.helper.ts b/src/lib/vmb-tests/bch-vmb-tests.spec.helper.ts index 28d2ca6e..75f9e98e 100644 --- a/src/lib/vmb-tests/bch-vmb-tests.spec.helper.ts +++ b/src/lib/vmb-tests/bch-vmb-tests.spec.helper.ts @@ -1,4 +1,4 @@ -/* eslint-disable functional/no-expression-statement */ +/* eslint-disable functional/no-expression-statements */ /** * This script generates all bch_vmb_tests, run it with: `yarn gen:vmb-tests`. @@ -15,7 +15,7 @@ import { vmbTestsBCH } from './bch-vmb-tests.js'; */ const [, , outputDir] = process.argv; if (outputDir === undefined) { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error('Script requires an output directory.'); } const outputAbsolutePath = resolve(outputDir); @@ -25,7 +25,7 @@ const allTestCases = vmbTestsBCH.flat(testGroupsAndTypes); writeFileSync( `${outputAbsolutePath}/bch_vmb_tests.json`, JSON.stringify(allTestCases), - { encoding: 'utf8' } + { encoding: 'utf8' }, ); const partitionedTestCases = vmbTestPartitionMasterTestList(allTestCases); diff --git a/src/lib/vmb-tests/bch-vmb-tests.spec.ts b/src/lib/vmb-tests/bch-vmb-tests.spec.ts index 20557113..9f6e4031 100644 --- a/src/lib/vmb-tests/bch-vmb-tests.spec.ts +++ b/src/lib/vmb-tests/bch-vmb-tests.spec.ts @@ -68,16 +68,16 @@ test('bch_vmb_tests.json is up to date and contains no test ID collisions', (t) t.deepEqual( allTestCases, vmbTestsBCHJson, - 'New test definitions were added to `bch-vmb.tests.ts`, but the generated tests were not updated. Run "yarn gen:vmb-tests" to correct this issue. (Note: tsc watch tasks don\'t always update cached JSON imports when the source file changes. You may need to restart tsc to clear this error after re-generating tests.)' + 'New test definitions were added to `bch-vmb.tests.ts`, but the generated tests were not updated. Run "yarn gen:vmb-tests" to correct this issue. (Note: tsc watch tasks don\'t always update cached JSON imports when the source file changes. You may need to restart tsc to clear this error after re-generating tests.)', ); const testCaseIds = allTestCases.map((testCase) => testCase[0]); const descriptions = allTestCases.map((testCase) => testCase[1]); const idDup = testCaseIds.findIndex( - (id, i) => testCaseIds.lastIndexOf(id) !== i + (id, i) => testCaseIds.lastIndexOf(id) !== i, ); const descDup = descriptions.findIndex( - (desc, i) => descriptions.lastIndexOf(desc) !== i + (desc, i) => descriptions.lastIndexOf(desc) !== i, ); /* eslint-disable @typescript-eslint/no-non-null-assertion */ @@ -139,16 +139,18 @@ const testVm = ({ supportsTokens ? readTransactionCommon : readTransactionNonTokenAware )({ bin: hexToBin(txHex), index: 0 }); if (typeof sourceOutputsRead === 'string') { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions expectedToSucceed ? t.fail(sourceOutputsRead) : t.pass(); return; } if (typeof transactionRead === 'string') { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions expectedToSucceed ? t.fail(transactionRead) : t.pass(); return; } const sourceOutputs = sourceOutputsRead.result; const transaction = transactionRead.result; - if (debug !== undefined) debugger; // eslint-disable-line functional/no-conditional-statement, no-debugger + if (debug !== undefined) debugger; // eslint-disable-line no-debugger const result = vm.verify({ sourceOutputs, transaction }); const moreDetails = `For more detailed debugging information, run: "yarn test:unit:vmb_test ${vmName} ${shortId} -v"`; const logDebugInfo = () => { @@ -165,10 +167,10 @@ const testVm = ({ evaluateResult, debugResult[debugResult.length - 1], `vm.evaluate and the final result of vm.debug differ: is something being unexpectedly mutated? evaluateResult:\n\n${stringify( - evaluateResult + evaluateResult, )}\n\nFinal debugResult:\n\n${stringify( - debugResult[debugResult.length - 1] - )}` + debugResult[debugResult.length - 1], + )}`, ); t.log(stringifyDebugTraceSummary(summarizeDebugTrace(debugResult))); t.log(moreDetails); @@ -181,7 +183,7 @@ const testVm = ({ Number(failingIndex) !== testedIndex ) { t.fail( - `An unexpected input index caused VMB test "${shortId}" to fail for ${vmName}: the input index under test is ${testedIndex}, but input index ${failingIndex} failed. Error: ${result}` + `An unexpected input index caused VMB test "${shortId}" to fail for ${vmName}: the input index under test is ${testedIndex}, but input index ${failingIndex} failed. Error: ${result}`, ); t.log( `Failing input at index ${failingIndex}:`, @@ -191,23 +193,23 @@ const testVm = ({ inputIndex: Number(failingIndex), sourceOutputs, transaction, - }) as AuthenticationProgramStateCommon[] - ) - ) + }) as AuthenticationProgramStateCommon[], + ), + ), ); t.log(moreDetails); return; } logDebugInfo(); t.fail( - `VMB test "${shortId}" - "${description}" - for ${vmName} is expected to succeed but failed. Error: ${result}` + `VMB test "${shortId}" - "${description}" - for ${vmName} is expected to succeed but failed. Error: ${result}`, ); return; } if (!expectedToSucceed && typeof result !== 'string') { logDebugInfo(); t.fail( - `VMB test "${shortId}" - "${description}" - for ${vmName} is expected to fail but succeeded.` + `VMB test "${shortId}" - "${description}" - for ${vmName} is expected to fail but succeeded.`, ); return; } @@ -216,7 +218,7 @@ const testVm = ({ title: ( // eslint-disable-next-line @typescript-eslint/default-param-last caseNumberOfCaseCount = '(unknown/unknown)', - [shortId, description] + [shortId, description], ) => `[vmb_tests] [${vmName}] ${shortId} ${caseNumberOfCaseCount}: ${description}`, }); @@ -226,26 +228,26 @@ const testVm = ({ (debug === undefined ? test : vmName === debug.vmName && debug.testId === testCase[0] - ? test - : test.skip)( + ? test + : test.skip)( `(${index + 1}/${expectedPass.length + expectedFail.length} valid)`, runCase, testCase, - true + true, ); }); expectedFail.forEach((testCase, index) => { (debug === undefined ? test : vmName === debug.vmName && debug.testId === testCase[0] - ? test - : test.skip)( + ? test + : test.skip)( `(${expectedPass.length + index + 1}/${ expectedPass.length + expectedFail.length } invalid)`, runCase, testCase, - false + false, ); }); }; diff --git a/src/lib/vmb-tests/bch-vmb-tests.ts b/src/lib/vmb-tests/bch-vmb-tests.ts index 966b4b28..3430c536 100644 --- a/src/lib/vmb-tests/bch-vmb-tests.ts +++ b/src/lib/vmb-tests/bch-vmb-tests.ts @@ -778,8 +778,8 @@ export const vmbTestDefinitionsBCH: VmbTestDefinitionGroup[] = [ cashAssemblyToBin( `OP_RETURN <0x${range(516) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), }, ], @@ -801,8 +801,8 @@ export const vmbTestDefinitionsBCH: VmbTestDefinitionGroup[] = [ cashAssemblyToBin( `OP_RETURN <0x${range(517) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), }, ], @@ -822,8 +822,8 @@ export const vmbTestDefinitionsBCH: VmbTestDefinitionGroup[] = [ cashAssemblyToBin( `OP_RETURN <0x${range(516) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), }, ], @@ -843,8 +843,8 @@ export const vmbTestDefinitionsBCH: VmbTestDefinitionGroup[] = [ cashAssemblyToBin( `OP_RETURN <0x${range(517) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), }, ], diff --git a/src/types/bcrypto.d.ts b/src/types/bcrypto.d.ts deleted file mode 100644 index f7c2069d..00000000 --- a/src/types/bcrypto.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -// used in tests and benchmarks -declare module 'bcrypto' { - const thingsBitcoinTsTestsUse: { - RIPEMD160: BcryptoHashMethod; - SHA1: BcryptoHashMethod; - SHA256: BcryptoHashMethod; - SHA512: BcryptoHashMethod; - }; - export = thingsBitcoinTsTestsUse; - - interface BcryptoHashMethod { - digest: (input: Buffer) => Buffer; - } -} diff --git a/src/types/bitcore-lib-cash.d.ts b/src/types/bitcore-lib-cash.d.ts index 815f9785..8f4b1aa2 100644 --- a/src/types/bitcore-lib-cash.d.ts +++ b/src/types/bitcore-lib-cash.d.ts @@ -2,5 +2,6 @@ declare module 'bitcore-lib-cash' { // eslint-disable-next-line @typescript-eslint/no-explicit-any const whatever: any; - export = whatever; + // eslint-disable-next-line import/no-default-export + export default whatever; } diff --git a/src/types/chuhai.d.ts b/src/types/chuhai.d.ts index dea26133..72356827 100644 --- a/src/types/chuhai.d.ts +++ b/src/types/chuhai.d.ts @@ -3,31 +3,31 @@ declare module 'chuhai' { function suite(implementation: (s: Helper) => void): Promise; function suite( name: string, - implementation: (s: Helper) => void + implementation: (s: Helper) => void, ): Promise; // eslint-disable-next-line import/no-default-export export default suite; } -interface Helper { +type Helper = { cycle: (implementation: () => void) => void; bench: ( name: string, implementation: Benchmark, - opts?: BenchmarkOptions + opts?: BenchmarkOptions, ) => void; burn: ( name: string, implementation: Benchmark, - opts?: BenchmarkOptions + opts?: BenchmarkOptions, ) => void; // eslint-disable-next-line @typescript-eslint/no-explicit-any set: (key: string, value: any) => void; -} +}; type Benchmark = (deferred: { resolve: () => void }) => void; -interface BenchmarkOptions { +type BenchmarkOptions = { async?: boolean; defer?: boolean; -} +}; diff --git a/src/types/rollup-plugin-alias.d.ts b/src/types/rollup-plugin-alias.d.ts index cac423b1..6a96771e 100644 --- a/src/types/rollup-plugin-alias.d.ts +++ b/src/types/rollup-plugin-alias.d.ts @@ -6,6 +6,6 @@ declare module '@rollup/plugin-alias' { export default alias; } -interface RollupPluginAliasOptions { - readonly entries: Readonly<{ [key: string]: string }>; -} +type RollupPluginAliasOptions = { + entries: { [key: string]: string }; +}; diff --git a/src/types/secp256k1.d.ts b/src/types/secp256k1.d.ts index 23c8ff8d..4fae29a3 100644 --- a/src/types/secp256k1.d.ts +++ b/src/types/secp256k1.d.ts @@ -2,5 +2,6 @@ declare module 'secp256k1' { // eslint-disable-next-line @typescript-eslint/no-explicit-any const whatever: any; - export = whatever; + // eslint-disable-next-line import/no-default-export + export default whatever; } diff --git a/tsconfig.json b/tsconfig.json index e2827505..51e3c910 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "es2020", - "module": "esnext", + "target": "es2022", + "module": "nodenext", "moduleResolution": "nodenext", "rootDir": "src", "outDir": "build", @@ -20,7 +20,7 @@ "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, // "exactOptionalPropertyTypes": true /* Enforce difference between `undefined` and optional properties */, // TODO: enable exactOptionalPropertyTypes, possibly waiting on https://github.com/microsoft/TypeScript/issues/46969#issuecomment-984083995 (or a `RequiredExactOptional` to match `PartialExactOptional`) - "noUncheckedIndexedAccess": true /* Require checking that an indexed access is not undefined */, // TODO: enable noUncheckedIndexedAccess + "noUncheckedIndexedAccess": true /* Require checking that an indexed access is not undefined */, "noPropertyAccessFromIndexSignature": true /* Disallow dot syntax for fields which are not defined */, /* Debugging Options */ "traceResolution": false /* Report module resolution log messages. */, diff --git a/yarn.lock b/yarn.lock index 0be19f81..8cd450a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,77 +2,85 @@ # Manual changes might be lost - proceed with caution! __metadata: - version: 6 - cacheKey: 8 + version: 8 + cacheKey: 10 -"@ava/typescript@npm:^3.0.1": - version: 3.0.1 - resolution: "@ava/typescript@npm:3.0.1" +"@aashutoshrathi/word-wrap@npm:^1.2.3": + version: 1.2.6 + resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" + checksum: 6eebd12a5cd03cee38fcb915ef9f4ea557df6a06f642dfc7fe8eb4839eb5c9ca55a382f3604d52c14200b0c214c12af5e1f23d2a6d8e23ef2d016b105a9d6c0a + languageName: node + linkType: hard + +"@ava/typescript@npm:^4.1.0": + version: 4.1.0 + resolution: "@ava/typescript@npm:4.1.0" dependencies: - escape-string-regexp: ^5.0.0 - execa: ^5.1.1 - checksum: 3075ad519e18d6daa0e0696d44716d31bda8f6cdaad70e3da9639d39b4d1807045995d4c8688cd06698586da38f184b47c054d28d873dac3a89364c309dee982 + escape-string-regexp: "npm:^5.0.0" + execa: "npm:^7.1.1" + checksum: 85079207b9cdbb082e7a9f7e2e14605cdd273d5835da77f8228f90bdeb8ab24d8ae0fd132c51b3e983ada8d3ba0059032c0a593fde33da41192a209d0319d109 languageName: node linkType: hard "@babel/code-frame@npm:^7.0.0": - version: 7.18.6 - resolution: "@babel/code-frame@npm:7.18.6" + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" dependencies: - "@babel/highlight": ^7.18.6 - checksum: 195e2be3172d7684bf95cff69ae3b7a15a9841ea9d27d3c843662d50cdd7d6470fd9c8e64be84d031117e4a4083486effba39f9aef6bbb2c89f7f21bcfba33ba + "@babel/highlight": "npm:^7.23.4" + chalk: "npm:^2.4.2" + checksum: 44e58529c9d93083288dc9e649c553c5ba997475a7b0758cc3ddc4d77b8a7d985dbe78cc39c9bbc61f26d50af6da1ddf0a3427eae8cc222a9370619b671ed8f5 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.19.4": - version: 7.19.4 - resolution: "@babel/helper-string-parser@npm:7.19.4" - checksum: b2f8a3920b30dfac81ec282ac4ad9598ea170648f8254b10f475abe6d944808fb006aab325d3eb5a8ad3bea8dfa888cfa6ef471050dae5748497c110ec060943 +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: c352082474a2ee1d2b812bd116a56b2e8b38065df9678a32a535f151ec6f58e54633cc778778374f10544b930703cca6ddf998803888a636afa27e2658068a9c languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": - version: 7.19.1 - resolution: "@babel/helper-validator-identifier@npm:7.19.1" - checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: df882d2675101df2d507b95b195ca2f86a3ef28cb711c84f37e79ca23178e13b9f0d8b522774211f51e40168bf5142be4c1c9776a150cddb61a0d5bf3e95750b languageName: node linkType: hard -"@babel/highlight@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/highlight@npm:7.18.6" +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" dependencies: - "@babel/helper-validator-identifier": ^7.18.6 - chalk: ^2.0.0 - js-tokens: ^4.0.0 - checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 + "@babel/helper-validator-identifier": "npm:^7.22.20" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + checksum: 62fef9b5bcea7131df4626d009029b1ae85332042f4648a4ce6e740c3fd23112603c740c45575caec62f260c96b11054d3be5987f4981a5479793579c3aac71f languageName: node linkType: hard -"@babel/parser@npm:^7.0.0": - version: 7.20.7 - resolution: "@babel/parser@npm:7.20.7" +"@babel/parser@npm:^7.0.0, @babel/parser@npm:^7.21.4": + version: 7.23.6 + resolution: "@babel/parser@npm:7.23.6" bin: parser: ./bin/babel-parser.js - checksum: 25b5266e3bd4be837092685f6b7ef886f1308ff72659a24342eb646ae5014f61ed1771ce8fc20636c890fcae19304fc72c069564ca6075207b7fbf3f75367275 + checksum: 6be3a63d3c9d07b035b5a79c022327cb7e16cbd530140ecb731f19a650c794c315a72c699a22413ebeafaff14aa8f53435111898d59e01a393d741b85629fa7d languageName: node linkType: hard "@babel/types@npm:^7.8.3": - version: 7.20.7 - resolution: "@babel/types@npm:7.20.7" + version: 7.23.6 + resolution: "@babel/types@npm:7.23.6" dependencies: - "@babel/helper-string-parser": ^7.19.4 - "@babel/helper-validator-identifier": ^7.19.1 - to-fast-properties: ^2.0.0 - checksum: b39af241f0b72bba67fd6d0d23914f6faec8c0eba8015c181cbd5ea92e59fc91a52a1ab490d3520c7dbd19ddb9ebb76c476308f6388764f16d8201e37fae6811 + "@babel/helper-string-parser": "npm:^7.23.4" + "@babel/helper-validator-identifier": "npm:^7.22.20" + to-fast-properties: "npm:^2.0.0" + checksum: 07e70bb94d30b0231396b5e9a7726e6d9227a0a62e0a6830c0bd3232f33b024092e3d5a7d1b096a65bbf2bb43a9ab4c721bf618e115bfbb87b454fa060f88cbf languageName: node linkType: hard "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" - checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 + checksum: 1a1f0e356a3bb30b5f1ced6f79c413e6ebacf130421f15fac5fcd8be5ddf98aedb4404d7f5624e3285b700e041f9ef938321f3ca4d359d5b716f96afa120d88d languageName: node linkType: hard @@ -80,333 +88,371 @@ __metadata: version: 0.0.0-use.local resolution: "@bitauth/libauth@workspace:." dependencies: - "@ava/typescript": ^3.0.1 - "@fast-check/ava": ^1.1.3 - "@microsoft/api-documenter": ^7.19.27 - "@microsoft/api-extractor": ^7.33.7 - "@rollup/plugin-alias": ^4.0.2 - "@rollup/plugin-commonjs": ^22.0.2 - "@rollup/plugin-node-resolve": ^15.0.1 - "@types/elliptic": ^6.4.14 - "@types/express": ^4.17.15 - "@typescript-eslint/eslint-plugin": ^5.48.1 - "@typescript-eslint/parser": ^5.48.1 - ajv-cli: ^5.0.0 - asmcrypto.js: ^2.3.2 - ava: ^5.1.0 - bcrypto: ^5.4.0 - bitcore-lib-cash: ^8.25.40 - c8: ^7.12.0 - chuhai: ^1.2.0 - cpy-cli: ^4.2.0 - cspell: ^6.18.1 - cz-conventional-changelog: ^3.3.0 - elliptic: ^6.5.4 - eslint: 8.31.0 - eslint-config-bitauth: ^3.1.2 - eslint-config-prettier: ^8.6.0 - eslint-plugin-eslint-comments: ^3.2.0 - eslint-plugin-functional: ^4.4.1 - eslint-plugin-import: ^2.26.0 - eslint-plugin-prettier: ^4.2.1 - eslint-plugin-tsdoc: ^0.2.17 - express: ^4.18.2 - fast-check: ^3.5.0 - hash.js: ^1.1.7 - madge: ^5.0.1 - open-cli: ^7.1.0 - prettier: ^2.8.2 - puppeteer: ^19.5.0 - rollup: ^2.79.1 - secp256k1: ^4.0.3 - source-map-support: ^0.5.21 - standard-version: ^9.5.0 - ts-json-schema-generator: ^1.2.0 - typedoc: ^0.23.24 - typescript: ^4.9.4 + "@ava/typescript": "npm:^4.1.0" + "@fast-check/ava": "npm:^1.2.1" + "@microsoft/api-documenter": "npm:^7.23.16" + "@microsoft/api-extractor": "npm:^7.39.1" + "@playwright/test": "npm:^1.40.1" + "@rollup/plugin-alias": "npm:^5.1.0" + "@rollup/plugin-commonjs": "npm:^25.0.7" + "@rollup/plugin-node-resolve": "npm:^15.2.3" + "@types/elliptic": "npm:^6.4.18" + "@types/express": "npm:^4.17.21" + "@types/node": "npm:^20.10.6" + "@typescript-eslint/eslint-plugin": "npm:^6.18.1" + "@typescript-eslint/parser": "npm:^6.17.0" + ajv-cli: "npm:^5.0.0" + asmcrypto.js: "npm:^2.3.2" + ava: "npm:^6.0.1" + bitcore-lib-cash: "npm:^10.0.23" + c8: "npm:^9.0.0" + chuhai: "npm:^1.2.0" + cpy-cli: "npm:^5.0.0" + cspell: "npm:^8.3.2" + cz-conventional-changelog: "npm:^3.3.0" + elliptic: "npm:^6.5.4" + eslint: "npm:8.56.0" + eslint-config-bitauth: "npm:5.0.0" + eslint-config-prettier: "npm:^9.1.0" + eslint-plugin-eslint-comments: "npm:^3.2.0" + eslint-plugin-functional: "npm:^6.0.0" + eslint-plugin-import: "npm:^2.29.1" + eslint-plugin-tsdoc: "npm:^0.2.17" + express: "npm:^4.18.2" + fast-check: "npm:^3.15.0" + hash.js: "npm:^1.1.7" + madge: "npm:^6.1.0" + open-cli: "npm:^8.0.0" + prettier: "npm:^3.1.1" + rollup: "npm:^4.9.2" + secp256k1: "npm:^5.0.0" + source-map-support: "npm:^0.5.21" + standard-version: "npm:^9.5.0" + ts-json-schema-generator: "npm:^1.5.0" + typedoc: "npm:^0.25.6" + typescript: "npm:^5.3.3" languageName: unknown linkType: soft -"@commitlint/config-validator@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/config-validator@npm:17.4.0" +"@commitlint/config-validator@npm:^18.4.4": + version: 18.4.4 + resolution: "@commitlint/config-validator@npm:18.4.4" dependencies: - "@commitlint/types": ^17.4.0 - ajv: ^8.11.0 - checksum: 4e8885cf8f35a6dbff7b504cabadf2c38bba3b05dc78b40a0403e9a06cc14cf3d29e088b76a19d5f7510e09132f4070c35a586b0e6e52590c1a7b1dfd47982c4 + "@commitlint/types": "npm:^18.4.4" + ajv: "npm:^8.11.0" + checksum: 6712b83a12750182ad5d35dd9f9767908df93d950b703c51edf812433249041565aba148221d06f3afd6ac6030d0ddd5d6628c76504c6b01596ac1cd6dd3001c languageName: node linkType: hard -"@commitlint/execute-rule@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/execute-rule@npm:17.4.0" - checksum: 17d8e56ab00bd45fdecb0ed33186d2020ce261250d6a516204b6509610b75af8c930e7226b1111af3de298db32a7e4d0ba2c9cc7ed67db5ba5159eeed634f067 +"@commitlint/execute-rule@npm:^18.4.4": + version: 18.4.4 + resolution: "@commitlint/execute-rule@npm:18.4.4" + checksum: f09d966479a7d7521e095b1a78ae8b357a722e4fe62250a4c4a6834825fff3ccaad3991be0bc2c6ed3c88adfa3e5a3f57d794cabb5d0b84228ebc3b0926d4ce1 languageName: node linkType: hard "@commitlint/load@npm:>6.1.1": - version: 17.4.1 - resolution: "@commitlint/load@npm:17.4.1" - dependencies: - "@commitlint/config-validator": ^17.4.0 - "@commitlint/execute-rule": ^17.4.0 - "@commitlint/resolve-extends": ^17.4.0 - "@commitlint/types": ^17.4.0 - "@types/node": "*" - chalk: ^4.1.0 - cosmiconfig: ^8.0.0 - cosmiconfig-typescript-loader: ^4.0.0 - lodash.isplainobject: ^4.0.6 - lodash.merge: ^4.6.2 - lodash.uniq: ^4.5.0 - resolve-from: ^5.0.0 - ts-node: ^10.8.1 - typescript: ^4.6.4 - checksum: 17bc9f2e339da480740138bb1f56d6a5c36ec6d70844a605f09b5ffcbe0bb18fd3ab0ad09d40ba3cfd095f26b0b3cf78a02d7b73d5980d9e58dbdcdfaeb252a2 + version: 18.4.4 + resolution: "@commitlint/load@npm:18.4.4" + dependencies: + "@commitlint/config-validator": "npm:^18.4.4" + "@commitlint/execute-rule": "npm:^18.4.4" + "@commitlint/resolve-extends": "npm:^18.4.4" + "@commitlint/types": "npm:^18.4.4" + chalk: "npm:^4.1.0" + cosmiconfig: "npm:^8.3.6" + cosmiconfig-typescript-loader: "npm:^5.0.0" + lodash.isplainobject: "npm:^4.0.6" + lodash.merge: "npm:^4.6.2" + lodash.uniq: "npm:^4.5.0" + resolve-from: "npm:^5.0.0" + checksum: 2643f6fdd7f79fc82c14ce88809b69af69c72757e30902ed79d2c26f90035edebf5d5bd10319362e14f7c85dbe36961cb28bc9e376a93e7c83822f24aa37a5a3 + languageName: node + linkType: hard + +"@commitlint/resolve-extends@npm:^18.4.4": + version: 18.4.4 + resolution: "@commitlint/resolve-extends@npm:18.4.4" + dependencies: + "@commitlint/config-validator": "npm:^18.4.4" + "@commitlint/types": "npm:^18.4.4" + import-fresh: "npm:^3.0.0" + lodash.mergewith: "npm:^4.6.2" + resolve-from: "npm:^5.0.0" + resolve-global: "npm:^1.0.0" + checksum: b48946fa43cb63149d1771d28d1bdfe81a5b13f5223dbf6958edbe0bcf9635364ba1f07e16a3592069dba4c864a7a403e41af708367472b0d2fd5c9ed38d0997 + languageName: node + linkType: hard + +"@commitlint/types@npm:^18.4.4": + version: 18.4.4 + resolution: "@commitlint/types@npm:18.4.4" + dependencies: + chalk: "npm:^4.1.0" + checksum: bda09adc5f4a7d460120891ad85d2950cb3db17ee9ecf93b820c4782c5a9f8cb235b28fb559a3c4f38fbb5ada43b50bab4c2ee1eb87853be4febbcd8da30fd1f + languageName: node + linkType: hard + +"@cspell/cspell-bundled-dicts@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/cspell-bundled-dicts@npm:8.3.2" + dependencies: + "@cspell/dict-ada": "npm:^4.0.2" + "@cspell/dict-aws": "npm:^4.0.1" + "@cspell/dict-bash": "npm:^4.1.3" + "@cspell/dict-companies": "npm:^3.0.29" + "@cspell/dict-cpp": "npm:^5.0.10" + "@cspell/dict-cryptocurrencies": "npm:^5.0.0" + "@cspell/dict-csharp": "npm:^4.0.2" + "@cspell/dict-css": "npm:^4.0.12" + "@cspell/dict-dart": "npm:^2.0.3" + "@cspell/dict-django": "npm:^4.1.0" + "@cspell/dict-docker": "npm:^1.1.7" + "@cspell/dict-dotnet": "npm:^5.0.0" + "@cspell/dict-elixir": "npm:^4.0.3" + "@cspell/dict-en-common-misspellings": "npm:^2.0.0" + "@cspell/dict-en-gb": "npm:1.1.33" + "@cspell/dict-en_us": "npm:^4.3.13" + "@cspell/dict-filetypes": "npm:^3.0.3" + "@cspell/dict-fonts": "npm:^4.0.0" + "@cspell/dict-fsharp": "npm:^1.0.1" + "@cspell/dict-fullstack": "npm:^3.1.5" + "@cspell/dict-gaming-terms": "npm:^1.0.4" + "@cspell/dict-git": "npm:^3.0.0" + "@cspell/dict-golang": "npm:^6.0.5" + "@cspell/dict-haskell": "npm:^4.0.1" + "@cspell/dict-html": "npm:^4.0.5" + "@cspell/dict-html-symbol-entities": "npm:^4.0.0" + "@cspell/dict-java": "npm:^5.0.6" + "@cspell/dict-k8s": "npm:^1.0.2" + "@cspell/dict-latex": "npm:^4.0.0" + "@cspell/dict-lorem-ipsum": "npm:^4.0.0" + "@cspell/dict-lua": "npm:^4.0.3" + "@cspell/dict-makefile": "npm:^1.0.0" + "@cspell/dict-node": "npm:^4.0.3" + "@cspell/dict-npm": "npm:^5.0.14" + "@cspell/dict-php": "npm:^4.0.5" + "@cspell/dict-powershell": "npm:^5.0.3" + "@cspell/dict-public-licenses": "npm:^2.0.5" + "@cspell/dict-python": "npm:^4.1.11" + "@cspell/dict-r": "npm:^2.0.1" + "@cspell/dict-ruby": "npm:^5.0.2" + "@cspell/dict-rust": "npm:^4.0.1" + "@cspell/dict-scala": "npm:^5.0.0" + "@cspell/dict-software-terms": "npm:^3.3.15" + "@cspell/dict-sql": "npm:^2.1.3" + "@cspell/dict-svelte": "npm:^1.0.2" + "@cspell/dict-swift": "npm:^2.0.1" + "@cspell/dict-typescript": "npm:^3.1.2" + "@cspell/dict-vue": "npm:^3.0.0" + checksum: e0138b44326b2bd11a2fe6e1c6583bd46d025c7089f8ada20e2b1f190eece5398737cb8f7eca0c330ff8b8fd9b39de41eeaa98bee38264f07cb7e336b851540e + languageName: node + linkType: hard + +"@cspell/cspell-json-reporter@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/cspell-json-reporter@npm:8.3.2" + dependencies: + "@cspell/cspell-types": "npm:8.3.2" + checksum: 25926f8cfef378dbce59f140d9f383db4598222a3de5f2a0a6840e225d694afce2c069498668304f4ec39e58f5570887ef0d31f45824ca16b0fc31f20180352e + languageName: node + linkType: hard + +"@cspell/cspell-pipe@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/cspell-pipe@npm:8.3.2" + checksum: 46dd1cb76c861d65dd485346bf5b02e0d747d0e9de9032ddc006af3dc7ee53c7170443a3b28dbdac80c93688fbeee325328eaafdf2fa17168971d5a54b422eb5 languageName: node linkType: hard -"@commitlint/resolve-extends@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/resolve-extends@npm:17.4.0" +"@cspell/cspell-resolver@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/cspell-resolver@npm:8.3.2" dependencies: - "@commitlint/config-validator": ^17.4.0 - "@commitlint/types": ^17.4.0 - import-fresh: ^3.0.0 - lodash.mergewith: ^4.6.2 - resolve-from: ^5.0.0 - resolve-global: ^1.0.0 - checksum: 44d77c343c519f92d3f595508c7f8b07df4a33880ab3c32631cf77101c51bf444e1b03d50505f68ce677ff62729e9e44e81bb1fec8b6d87b831d6137f3d5c5a8 + global-directory: "npm:^4.0.1" + checksum: fe723a1b8407b4168f6262cd30a97ad04eb5eb40f4cac3a11c6bf674ed67cc08525b0282b95edbcaf1d014dec3880f6f01b3f49e4319ade5b8e169f0a910f8d1 languageName: node linkType: hard -"@commitlint/types@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/types@npm:17.4.0" - dependencies: - chalk: ^4.1.0 - checksum: 58e1743780a0d76b380dc6ebfe6deb530ed5a7ee82d746d73586fe5186c84bf7e07aa0ca0523ca910915d573ed522c2b7b7037c11c9ea49c8a9d90c2b8c48173 +"@cspell/cspell-service-bus@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/cspell-service-bus@npm:8.3.2" + checksum: 9bec7ddafcd8acab743248eb547fa5a84cf5363b0d0da354fdb2a0a6268a516b3600c7034ea71b6fca1c2517818f939876d961a4a3fc73a175eb62f5cbb6b7ae languageName: node linkType: hard -"@cspell/cspell-bundled-dicts@npm:6.18.1": - version: 6.18.1 - resolution: "@cspell/cspell-bundled-dicts@npm:6.18.1" - dependencies: - "@cspell/dict-ada": ^4.0.1 - "@cspell/dict-aws": ^3.0.0 - "@cspell/dict-bash": ^4.1.1 - "@cspell/dict-companies": ^3.0.5 - "@cspell/dict-cpp": ^4.0.1 - "@cspell/dict-cryptocurrencies": ^3.0.1 - "@cspell/dict-csharp": ^4.0.2 - "@cspell/dict-css": ^4.0.1 - "@cspell/dict-dart": ^2.0.1 - "@cspell/dict-django": ^4.0.1 - "@cspell/dict-docker": ^1.1.4 - "@cspell/dict-dotnet": ^4.0.1 - "@cspell/dict-elixir": ^4.0.1 - "@cspell/dict-en-gb": 1.1.33 - "@cspell/dict-en_us": ^4.1.2 - "@cspell/dict-filetypes": ^3.0.0 - "@cspell/dict-fonts": ^3.0.0 - "@cspell/dict-fullstack": ^3.0.0 - "@cspell/dict-gaming-terms": ^1.0.3 - "@cspell/dict-git": ^2.0.0 - "@cspell/dict-golang": ^5.0.1 - "@cspell/dict-haskell": ^4.0.1 - "@cspell/dict-html": ^4.0.2 - "@cspell/dict-html-symbol-entities": ^4.0.0 - "@cspell/dict-java": ^5.0.3 - "@cspell/dict-k8s": ^1.0.0 - "@cspell/dict-latex": ^3.1.0 - "@cspell/dict-lorem-ipsum": ^3.0.0 - "@cspell/dict-lua": ^3.0.0 - "@cspell/dict-node": ^4.0.2 - "@cspell/dict-npm": ^5.0.2 - "@cspell/dict-php": ^3.0.4 - "@cspell/dict-powershell": ^3.0.0 - "@cspell/dict-public-licenses": ^2.0.1 - "@cspell/dict-python": ^4.0.1 - "@cspell/dict-r": ^2.0.1 - "@cspell/dict-ruby": ^3.0.0 - "@cspell/dict-rust": ^3.0.0 - "@cspell/dict-scala": ^3.0.0 - "@cspell/dict-software-terms": ^3.0.7 - "@cspell/dict-sql": ^2.0.1 - "@cspell/dict-svelte": ^1.0.1 - "@cspell/dict-swift": ^2.0.1 - "@cspell/dict-typescript": ^3.1.0 - "@cspell/dict-vue": ^3.0.0 - checksum: 97346d8091df27ce4e0b0cd709f4d0442ed1fc4340c3cd0a7f5aca130f7c08b31be5ea7299411c89caf89ca784452144e91804e477770d5c49c7301f78b5d268 - languageName: node - linkType: hard - -"@cspell/cspell-pipe@npm:6.18.1": - version: 6.18.1 - resolution: "@cspell/cspell-pipe@npm:6.18.1" - checksum: 5df235dddf07468f5c0af2612401ff5157892b4b5b95500befbf08f2b729ae3d6b6dd12127d2af29278db7520aefbed375fdf32ff4f2b205a945a6a1e4d75a79 - languageName: node +"@cspell/cspell-types@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/cspell-types@npm:8.3.2" + checksum: 4ec8d4deeadeb0f5447dd67d0281dc60eea7ab7782eecb9ec03d5f7bdc5682262cf1b7f6d36ab851627d2b9f589db1f4a76361dc4186a714896f04edfa397eeb + languageName: node linkType: hard -"@cspell/cspell-service-bus@npm:6.18.1": - version: 6.18.1 - resolution: "@cspell/cspell-service-bus@npm:6.18.1" - checksum: 4128a57a259db57fdfd5e024446bce284e3ad936654b1f7fd4a356bfb8f644dbe3b722bbb70712b14be9f9aa96b7de78b756aadf64c5af8363bff68b65f1adf3 +"@cspell/dict-ada@npm:^4.0.2": + version: 4.0.2 + resolution: "@cspell/dict-ada@npm:4.0.2" + checksum: 31b0f0f6b9b324e8d3be4074302ddc9a7e968833d79c0a9f7899de9138b386bd6dcad3f63afdb1d42e87838bba5881c7b7f2b0916621fb1e64c7fdb6a572afe5 languageName: node linkType: hard -"@cspell/cspell-types@npm:6.18.1": - version: 6.18.1 - resolution: "@cspell/cspell-types@npm:6.18.1" - checksum: d4b0dfa0d749a630f31ec0a88be79bbba9587a3a97139b83d818f479f90e835ba4d78fb72b8a7812821cc7b9085837ebc279e5512aa22505ef040ad161485de4 +"@cspell/dict-aws@npm:^4.0.1": + version: 4.0.1 + resolution: "@cspell/dict-aws@npm:4.0.1" + checksum: 513b7822d03a6995aab3397f39d38d836c20544ca2ccb3f380248da8b69ccc3b9c8698453340e647c739e875e6c90b06ccf05813a448655258769d9f56f43ac8 languageName: node linkType: hard -"@cspell/dict-ada@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-ada@npm:4.0.1" - checksum: 3422487c8decf01d9dd14e666dcbe29557d730085f60fcd859d03fc5c177359d12df19171368cd105dad29f315d0decfa56f29eeb7c594a300d47c65805c4349 +"@cspell/dict-bash@npm:^4.1.3": + version: 4.1.3 + resolution: "@cspell/dict-bash@npm:4.1.3" + checksum: 4ba66c76c144d4c7ea1dd0fb92dfb0d7fd1e43a106a73fc7e9010b4a5c276aa4ef791c7161f56bf911356e3667ba043ee63271c1ffc485d9f8712553770e3ea9 languageName: node linkType: hard -"@cspell/dict-aws@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-aws@npm:3.0.0" - checksum: d06284d5cc438c18175c26e4f5d450f3235d603dbc989fa2d7515bb01d1c7a8b303ce054d532ca4f814fc6cd7c65ef9558d46bf5bacb06d35504b3c259ebe95c +"@cspell/dict-companies@npm:^3.0.29": + version: 3.0.29 + resolution: "@cspell/dict-companies@npm:3.0.29" + checksum: 39cee440f8b8cb2d68ee94bf058f1a92e748db927928d4209d0cf20ff0a9e2ea31b6f4b7128d64285930d768af73a10299dad984e83d36865fa49f46d5979f8b languageName: node linkType: hard -"@cspell/dict-bash@npm:^4.1.1": - version: 4.1.1 - resolution: "@cspell/dict-bash@npm:4.1.1" - checksum: 5b6fbb597c53fa6b9957213aa77688c6e0231f8d59eed02f0eecda456f3606855fc0f4c0c5121a909e9055c164de83e3f151b32a9abd1ccd4a161634ffee6691 +"@cspell/dict-cpp@npm:^5.0.10": + version: 5.1.1 + resolution: "@cspell/dict-cpp@npm:5.1.1" + checksum: 55787408539438ace8257e3f3928aab2a03a2ce08b25868675d18f2d26028ed18fb395ba76d195e533ecb6daafb45ff0703c401498b60a2f1769efbd35871cc9 languageName: node linkType: hard -"@cspell/dict-companies@npm:^3.0.5": - version: 3.0.6 - resolution: "@cspell/dict-companies@npm:3.0.6" - checksum: b56d20632f2e953c2b1a199701b4af4c1b5c5d6ea56c889b68bbac8f3e8f8645eb0386b3198274f14491fccf9608586ebdbe94c0835723934966682ffdc0c8f7 +"@cspell/dict-cryptocurrencies@npm:^5.0.0": + version: 5.0.0 + resolution: "@cspell/dict-cryptocurrencies@npm:5.0.0" + checksum: 116e7f117b59ea4c9fa7ae1c3b47fc963e050448d43e059fb93731a256881ee262420edd5b9701ffe88af3d5e95b0337fc99b4dde1b0283ee0aaed45b23e281e languageName: node linkType: hard -"@cspell/dict-cpp@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-cpp@npm:4.0.1" - checksum: 53db5515d046bc1be80031f82be801edb9c349a5487f894db7fc54d45a86142f01476b35fe8453605a3402ba6dd850353bf628eba8223fbac8d6f9e7d002827e +"@cspell/dict-csharp@npm:^4.0.2": + version: 4.0.2 + resolution: "@cspell/dict-csharp@npm:4.0.2" + checksum: d2ecb2aada51c5f0d6d557fd4f0c6eddb5b299e0955e066c49cd2afe96a1c6fe0afde699fdb885dd3183603a1efbd1d793b6a490b8d039256445b4b154b7375b languageName: node linkType: hard -"@cspell/dict-cryptocurrencies@npm:^3.0.1": - version: 3.0.1 - resolution: "@cspell/dict-cryptocurrencies@npm:3.0.1" - checksum: 5d646f569e8dc5998de8a508ff3de39db5f5a5db0a846ee4fc750ea3880080d922d5c28fdce38f93910eaacde2723e2fe4c305d50b3f9d53b817ce33a3bed66a +"@cspell/dict-css@npm:^4.0.12": + version: 4.0.12 + resolution: "@cspell/dict-css@npm:4.0.12" + checksum: da812243c92ef07082334d512561606f178e003fa50324332c322655fab0982ed1bea055d75a348b37cea71fbe652224dcfff14dc445d26530cfa3c491b2b324 languageName: node linkType: hard -"@cspell/dict-csharp@npm:^4.0.2": - version: 4.0.2 - resolution: "@cspell/dict-csharp@npm:4.0.2" - checksum: d2ecb2aada51c5f0d6d557fd4f0c6eddb5b299e0955e066c49cd2afe96a1c6fe0afde699fdb885dd3183603a1efbd1d793b6a490b8d039256445b4b154b7375b +"@cspell/dict-dart@npm:^2.0.3": + version: 2.0.3 + resolution: "@cspell/dict-dart@npm:2.0.3" + checksum: 66bfcfa029baacd0b14b3ff5b6ab7597cf9459f77185d88b25123b42a4babb66df6786806843f1b6506c335326100599a2e1db6e6104e66bd021ede9ccb3cec4 languageName: node linkType: hard -"@cspell/dict-css@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-css@npm:4.0.1" - checksum: 8d072f1f6ba91c1549c745b7b4714e7bf3d133ce1886b9c040d989188db917890d5ae12067f09558f3a037586911ae9bced59c91b8daeef3d7c04fd1367d80d2 +"@cspell/dict-data-science@npm:^1.0.11": + version: 1.0.11 + resolution: "@cspell/dict-data-science@npm:1.0.11" + checksum: 513f8f416f584f46576d45be23a4aa354e46d244f10a3d466222ffc13afe475e676639e4a24ab3a1ba157239f9ce23f7eef59c9f4c7a877a044db3a6344b18c6 languageName: node linkType: hard -"@cspell/dict-dart@npm:^2.0.1": - version: 2.0.1 - resolution: "@cspell/dict-dart@npm:2.0.1" - checksum: 6536a47450ebcbaad90253802791e69567565ecab89d0eb00d8be8b8b2d94d3971fcd92c6e013e25e0f06e1994591fb5ae6b5674798d74e3f449ffa1ea556f3e +"@cspell/dict-django@npm:^4.1.0": + version: 4.1.0 + resolution: "@cspell/dict-django@npm:4.1.0" + checksum: d64b830ab761f3610ca5eb81b06447c91a64b988bc3e40bac214fc611de498fa019e1cd76f6f21254ad2d3bfaeb3d10248481f0a02711d6a3ed715df062b2ba6 languageName: node linkType: hard -"@cspell/dict-django@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-django@npm:4.0.1" - checksum: 1954c4b96c05bb2c6aad3a76dcd9963912ed177c49d2bcfb10992af83143c1d644f4306d79acb175eda7767a75444007c9c4d94ba10245aeb256613ae10f0306 +"@cspell/dict-docker@npm:^1.1.7": + version: 1.1.7 + resolution: "@cspell/dict-docker@npm:1.1.7" + checksum: 307f8b5132edca7cd291ba0ab6ed88f8787df984d6a42401b12a0da1ecb935d50af3a108ede885ce5bede96c445acdc88bb9ea8396de151c565a90a3bf66853e languageName: node linkType: hard -"@cspell/dict-docker@npm:^1.1.4": - version: 1.1.5 - resolution: "@cspell/dict-docker@npm:1.1.5" - checksum: a983e3587cbe6f741dfbf40c509ca06d9489f1fb64f902128f9d738acb747b3a8651a73d256f2a7ef7750a54897eb76776403a47e4b55d84d785c7efa3a90e5e +"@cspell/dict-dotnet@npm:^5.0.0": + version: 5.0.0 + resolution: "@cspell/dict-dotnet@npm:5.0.0" + checksum: 470e74c26821426c0136e1f05c37be8a8231565c47d31b37049ba2b3030191359bdbc683e1e7948b6b8a7c570dd82f5fb2fe218ed9b824af29fd5560cf4826c7 languageName: node linkType: hard -"@cspell/dict-dotnet@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-dotnet@npm:4.0.1" - checksum: 176b25bc36ea4407439852be685a421d0ea0be19d8c4eb48b897a1aa2bdde3f71731b94f33b6ae1260546260343d7ee1f2c1c1087848cd2ceac0c635c009e370 +"@cspell/dict-elixir@npm:^4.0.3": + version: 4.0.3 + resolution: "@cspell/dict-elixir@npm:4.0.3" + checksum: f084449b2de5a2fa08076ac699c6073beaa4bb43796a662d681ea8fe5cba31f9efe718f3f98ef432ba75d4ea574316de34ab8422f79f4f2022cfddee7a7b8653 languageName: node linkType: hard -"@cspell/dict-elixir@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-elixir@npm:4.0.1" - checksum: 080a71b4c3ffa98dafbad851aed31fe2f58c3cb1ca5f3cf7eee1f203168c2f9440076c2fe5970fd92a968af3f36255a3e633aa5962a32bba16c4b7095a0ef0bf +"@cspell/dict-en-common-misspellings@npm:^2.0.0": + version: 2.0.0 + resolution: "@cspell/dict-en-common-misspellings@npm:2.0.0" + checksum: 487dc7a1c74793fd9c8362e44313c27f69b6617c9287f171fdaf9e7b94c6a73a61cde88eadd120bf4bec85647c81e949332a6816b88e3a430e32aa59414ef509 languageName: node linkType: hard "@cspell/dict-en-gb@npm:1.1.33": version: 1.1.33 resolution: "@cspell/dict-en-gb@npm:1.1.33" - checksum: 09a9e7a3ee4cad75c87cc7adf6b5981b3ec52d4e3707e8de2e1a2a55cd5c8539057a7742d9c7035e23eb0aeff80a95b9599696c7192c9b3b9d8f14440fe01938 + checksum: 72db891c955ce9b24ba756c1baad41e92854a85fe326699f9ab328358b02a76d57b65d26d02afa050c4f96668a51c1dab6fce7eaad51c70c113588bbc2b46756 languageName: node linkType: hard -"@cspell/dict-en_us@npm:^4.1.2": - version: 4.1.4 - resolution: "@cspell/dict-en_us@npm:4.1.4" - checksum: ada32bcf6083e9f4d9a33f517fc7b8bf4fefd73f93f07acb430956be357fa35d79f3d5eee642de272a00d2b1ab76cec2db3aafd7a4108d1329f6324b5a2391fc +"@cspell/dict-en_us@npm:^4.3.13": + version: 4.3.13 + resolution: "@cspell/dict-en_us@npm:4.3.13" + checksum: c6eddfa685eafde33ad53e3c0ca2f50a106dfcd9f7b42f1a10b95a72b5917bd3ab93514afc6ee57db3e7f5e2fee65134f8a8445ea85baba52dfde5358dd570f1 languageName: node linkType: hard -"@cspell/dict-filetypes@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-filetypes@npm:3.0.0" - checksum: 8afd0785583f913c8d6ad1a2b56a527600258b291fc6ed8e83f543ba70a5273095195495601aca7d80fdeb17cab6a10e8a8aa44bea3083962cd42af130260d8a +"@cspell/dict-filetypes@npm:^3.0.3": + version: 3.0.3 + resolution: "@cspell/dict-filetypes@npm:3.0.3" + checksum: 22c38a0b2e98d6223b364ddb5948d14bf6427c8286d4ddb111d5da9bdd4c47ddc0c9199a575c314142da9aefcaa5777a4ea33ac07f239cb4b9b303e4bd888aa1 languageName: node linkType: hard -"@cspell/dict-fonts@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-fonts@npm:3.0.0" - checksum: 3cd3574c2f32d761775ddd1bb68360488f400cf310c0499e6fac53641596a51708719e57426c97e183b528ad142ee04c90af93bb38a016ceecb921d76a00e9d9 +"@cspell/dict-fonts@npm:^4.0.0": + version: 4.0.0 + resolution: "@cspell/dict-fonts@npm:4.0.0" + checksum: 894a31f3df8e3a43a3dcf13e1706eb94cb5e83bd6d2aa26b0e9fc79c2de304eb5e9118eec4dff6a673e2a3243c842ca694c8e0f3c0ad78301004f983acf53832 languageName: node linkType: hard -"@cspell/dict-fullstack@npm:^3.0.0": - version: 3.0.1 - resolution: "@cspell/dict-fullstack@npm:3.0.1" - checksum: 05a50b9dc7d0634c78a49cc79cc3955f1d50ac982b0a24cd3af7093ad20c6b87866164a70c1cd3704a3111e260583bab7cfe9fea080f8f52e12c5a09323358ab +"@cspell/dict-fsharp@npm:^1.0.1": + version: 1.0.1 + resolution: "@cspell/dict-fsharp@npm:1.0.1" + checksum: ce0df20704bf95d1fe434d2889cc764279cbce2b057fc5247be1ccaf7a8cc57372de3da2cdab6643b3df5221119716929b2e2aaad3f60533dcf0bd3c7d892fab languageName: node linkType: hard -"@cspell/dict-gaming-terms@npm:^1.0.3": +"@cspell/dict-fullstack@npm:^3.1.5": + version: 3.1.5 + resolution: "@cspell/dict-fullstack@npm:3.1.5" + checksum: 01c98a3408d4bf4832f1f110252399e663ce869bb097d681558828bb0e22725c7fe7b43077aa57afc2c3158515eaa744074826c020825af5856a0950219785a6 + languageName: node + linkType: hard + +"@cspell/dict-gaming-terms@npm:^1.0.4": version: 1.0.4 resolution: "@cspell/dict-gaming-terms@npm:1.0.4" checksum: 3e57f5567747a8598b3e4de4f63a3b8090cccf7688f3e91f0a9e005e916645db1224ea600afd5b497b7e8c6a1f9291dfd4cb932278dfd423657107203a2ace0b languageName: node linkType: hard -"@cspell/dict-git@npm:^2.0.0": - version: 2.0.0 - resolution: "@cspell/dict-git@npm:2.0.0" - checksum: eb3985f1f8717ad4e41e146f1b011e0476d7625ab1ebee55364575b727323300773a89a8dd5a20466c74c57b7d2678e0c92446453bd484a44203be737bc07964 +"@cspell/dict-git@npm:^3.0.0": + version: 3.0.0 + resolution: "@cspell/dict-git@npm:3.0.0" + checksum: 97b6da58c93108bae0867515f790d84728f0bce580cc8ad6f0f5f63b2c81eaf6d084d543d99b693ff4d7fbea2413ff068c3e4811fc107820d243da2c06d381fa languageName: node linkType: hard -"@cspell/dict-golang@npm:^5.0.1": - version: 5.0.1 - resolution: "@cspell/dict-golang@npm:5.0.1" - checksum: 5a82060a2cc87a129174c648e2b52db8af4b9de25d5c18d138299dba3c2783003c68883d5dc9623bca2eb7e35d95783d1af3f0fd5b577a965de934deb36e8578 +"@cspell/dict-golang@npm:^6.0.5": + version: 6.0.5 + resolution: "@cspell/dict-golang@npm:6.0.5" + checksum: d83917190e8a6230cebcb95c384c5114cb291c52ff51f9871197914fb6f7aaf83ad5ce4ba5a0a00dad7e8edb36c5654631b8ca9ccd4ebab7d0439b64b5773d57 languageName: node linkType: hard @@ -424,87 +470,96 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-html@npm:^4.0.2": - version: 4.0.2 - resolution: "@cspell/dict-html@npm:4.0.2" - checksum: f4967d362a661408fcfc284292dd64280e4abda06ded0da95a5083473ea921043718b1694e9f0cec852d90e750d7d495fd639a57ce0d1dbd7097bb92c3b3e1b0 +"@cspell/dict-html@npm:^4.0.5": + version: 4.0.5 + resolution: "@cspell/dict-html@npm:4.0.5" + checksum: 8801b7f77910f6a269efc652c88ecc3299cabedec03566ad6fb661845fdf9a4950bd7a2cdd1216dde982eddc9caf9ec00c6917ac90707fabb7686d02b30b0a5c languageName: node linkType: hard -"@cspell/dict-java@npm:^5.0.3": - version: 5.0.4 - resolution: "@cspell/dict-java@npm:5.0.4" - checksum: 1bbb0acc81a6af5a8e0e0e09768b1b52bfac7412e02292b6dd663949cdf33d7245e0a4018148a7d10aae8e5436714191809623a342e7cb1d42a8484dba85d8f7 +"@cspell/dict-java@npm:^5.0.6": + version: 5.0.6 + resolution: "@cspell/dict-java@npm:5.0.6" + checksum: 0029545c95beb0c3e8dd416671242083734a74af639244556fc72dc323e450ffdf7234afa7e24d15307f57dd4c8f47e7f0acef12eb30df4014b81b2939df5596 languageName: node linkType: hard -"@cspell/dict-k8s@npm:^1.0.0": - version: 1.0.0 - resolution: "@cspell/dict-k8s@npm:1.0.0" - checksum: ef6d12cfd81b41c843773f61fc923a0a48b18d871ae0b8e9cd7e1bca28fba543c4bcd6964b34e2ac760336a86abdf7c8bc81a7b94bfdb274e39244a5c016fc3c +"@cspell/dict-k8s@npm:^1.0.2": + version: 1.0.2 + resolution: "@cspell/dict-k8s@npm:1.0.2" + checksum: 502910d441f8f15ca2e0865287d5a831bb198e3276b4975ea492337e9847e0625b2216fb9618b228c4e10c6f8d732822956dbe5442da97739021807e247cd686 languageName: node linkType: hard -"@cspell/dict-latex@npm:^3.1.0": - version: 3.1.0 - resolution: "@cspell/dict-latex@npm:3.1.0" - checksum: 90dafd4c1d0f9a9bd9e36734e624ca3d891023a5477ca9df62037a4297c8f751be5b33cbf4def9356d8bcec65a4e1ae89862d80ebe30675e91d10d69e0852de6 +"@cspell/dict-latex@npm:^4.0.0": + version: 4.0.0 + resolution: "@cspell/dict-latex@npm:4.0.0" + checksum: 7e7a520196d143d0a3185689d09d84bf1e23b5328dfc78187c4e4ab264bd49c3dd695eb92f8d582583e5bc26bcab4ed0976b310b56a000af81d88a7acdea7f8c languageName: node linkType: hard -"@cspell/dict-lorem-ipsum@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-lorem-ipsum@npm:3.0.0" - checksum: 145a79ec536bee3ec515b189be3f4a5347a28c563060ac5da6f6783a288e63cb0662fc918be008e1a377bdeb48cfa7a2aa1f9e9f8aef6371109f95f4b049731d +"@cspell/dict-lorem-ipsum@npm:^4.0.0": + version: 4.0.0 + resolution: "@cspell/dict-lorem-ipsum@npm:4.0.0" + checksum: d3575fb7b9684480192d2cd647484312c555f3d1215d6b35371b70de3ecde4273010e5916cc2d130ff1e1223a1a49f75825651671a76d3dabdec98acf67a3902 languageName: node linkType: hard -"@cspell/dict-lua@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-lua@npm:3.0.0" - checksum: 42a09b245cf7e6d4e67f8e7ab644479fe58116056952d1b963c7f9263ae6e11d39b1a0ba4381947ea628622172a383cec4e24a8f78c0123d46fdc2bc3b32483d +"@cspell/dict-lua@npm:^4.0.3": + version: 4.0.3 + resolution: "@cspell/dict-lua@npm:4.0.3" + checksum: eee20135a4f0620302c5feeb50485f59af93c24b64eb2081a9e2096a106ce33ae565d6d92607582b44c9f17c8a091d82fbcb443ebae9b77f8512b0d66a703c3b languageName: node linkType: hard -"@cspell/dict-node@npm:^4.0.2": - version: 4.0.2 - resolution: "@cspell/dict-node@npm:4.0.2" - checksum: 7a63ee44c4c493b429c821eb9e5fdcd1d0f549a2ada64d8ce3f7f0a88e2d26f82daada8801ee6f09a582502a1500d63985aa47204757b39014dff747211539d5 +"@cspell/dict-makefile@npm:^1.0.0": + version: 1.0.0 + resolution: "@cspell/dict-makefile@npm:1.0.0" + checksum: f0cac4caf31e27accd5df5e0c2f53097cccbbd085126c4b4ecc08be2a32bd7f89fe6b052e9eae4ec99843175cafa94561868271fb53c5389f27cc078565b5123 languageName: node linkType: hard -"@cspell/dict-npm@npm:^5.0.2": - version: 5.0.3 - resolution: "@cspell/dict-npm@npm:5.0.3" - checksum: f250a7d67436f23965c04028eb39395595574ef4a2250c0c30ee736b32fb583ad285d0dc383cb2ac1a9a941caaa329eeb4f2e04fe6e253e6196746d77a980880 +"@cspell/dict-node@npm:^4.0.3": + version: 4.0.3 + resolution: "@cspell/dict-node@npm:4.0.3" + checksum: ed2884b7da7474535d85b23a2f80576fbce5682b609bd7f21a7d0f316ac385532838b80900be1af461fa6a20b8020c6054ca1323504e301b4fc72d66b77550eb languageName: node linkType: hard -"@cspell/dict-php@npm:^3.0.4": - version: 3.0.4 - resolution: "@cspell/dict-php@npm:3.0.4" - checksum: ba3dcb8afcf214e331d1ee26c61130efb6192aaf62d24655582edf23d543605d42818fb146a3b13ae203a1b70b362d3f9f5c0e793984dafb3156aff979aa6a35 +"@cspell/dict-npm@npm:^5.0.14": + version: 5.0.14 + resolution: "@cspell/dict-npm@npm:5.0.14" + checksum: 8f273d530741a2caf64b4541cb7e3bcedae34fb52a79de28b190e533235897a706256db64dbced977f4c126ecf381248ac7f6818f34ea0176963e1c02dc58529 languageName: node linkType: hard -"@cspell/dict-powershell@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-powershell@npm:3.0.0" - checksum: 6ca16d5cb67bc8a26b1c9c52859218af5341cee68c8b5270ac79d9504ec529f24d33e4691fe0a14acb948f9910db7d8006f6c58321eab988c24f7cad6aeaebf9 +"@cspell/dict-php@npm:^4.0.5": + version: 4.0.5 + resolution: "@cspell/dict-php@npm:4.0.5" + checksum: f278e0d4729efd55b1f9ca7ca8da9eb6208528d29bf91a51de6fd74e75b779bc10c2c44034370149f6765dfbade0723ae41507f4bdafb85b7802b30477682200 languageName: node linkType: hard -"@cspell/dict-public-licenses@npm:^2.0.1": - version: 2.0.1 - resolution: "@cspell/dict-public-licenses@npm:2.0.1" - checksum: ce563b482df6f931290c0ba752417aedc993a173ae896002a4a30de9cd68418fa6a01664fe61239423388de09f17d8f68430f3ff95979a7e6e2090987aa7d968 +"@cspell/dict-powershell@npm:^5.0.3": + version: 5.0.3 + resolution: "@cspell/dict-powershell@npm:5.0.3" + checksum: 18eac3be8545b3df110bf867bd6285b11d7e67da037e00c9bc1376c5e322092bc1d925375a09df8b7420a6a35847aa20558610ffb491763eb82949f3af764e1d languageName: node linkType: hard -"@cspell/dict-python@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-python@npm:4.0.1" - checksum: 83ceb2779c64fb8370dfb6070015cea6337905a7066d38e69508a20976236a5e691b9926f11f4a2391ad5676a9245b5bf981a9118db2ad483baab04741467956 +"@cspell/dict-public-licenses@npm:^2.0.5": + version: 2.0.5 + resolution: "@cspell/dict-public-licenses@npm:2.0.5" + checksum: 07e647c24ed1a5f0e88828264581e9f8fde179f776a50c4389ac0bc5c09a2bb94280d299c94d1884a8da01fbf112c5640178789b457f06b1a97414b18cda99e0 + languageName: node + linkType: hard + +"@cspell/dict-python@npm:^4.1.11": + version: 4.1.11 + resolution: "@cspell/dict-python@npm:4.1.11" + dependencies: + "@cspell/dict-data-science": "npm:^1.0.11" + checksum: 9d156e146c044c4e014bb80181f2cc678d3bd4c40a83f29b4987ed7c441e694c91d0380dc00c67f3221448410268065da0ec9949b2912d01a54645e7d5d0c635 languageName: node linkType: hard @@ -515,42 +570,42 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-ruby@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-ruby@npm:3.0.0" - checksum: 1fefcf6eb971065fb909bb64c3d73503285a1a2dace8121ca1e0659ed4e12cbb9b17bfa8a33e271e4fe85725bd4d6a0ffbde3adfef7bfa874dd017902a7cb2b8 +"@cspell/dict-ruby@npm:^5.0.2": + version: 5.0.2 + resolution: "@cspell/dict-ruby@npm:5.0.2" + checksum: c2006bcc808448b1eef146eb4b6b74388113c50334206191a9fe5817fb13669482ecd114f7bbd397562ad2e19a9683266ff396f48c6ce282f6445c2cfa8e82c7 languageName: node linkType: hard -"@cspell/dict-rust@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-rust@npm:3.0.0" - checksum: 0402b073b2d123305437bd7f67d8648931b8aeeb3ce0198f7d1db6aadac466d53cb91b419ae0788fd464c21067b5e4ccc55550beed6803ef5711aa1abddb92a6 +"@cspell/dict-rust@npm:^4.0.1": + version: 4.0.1 + resolution: "@cspell/dict-rust@npm:4.0.1" + checksum: 146d3af5d0b1b84ec62059353416cd5d4b53995ed0a0edb47b96ed89f1b8b82881e76c1bac46311318f41d1619eab87d81e0cdc94855f50b79cfa0719333cbb1 languageName: node linkType: hard -"@cspell/dict-scala@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-scala@npm:3.0.0" - checksum: 3a8794587cc16b95c2939927e980c9164c98fe2ea4709fa8e65ba98ea7632a2b21f2432da486843f13bd6d2ad1f67c81baa2b8226c48900fb19634b832ea3558 +"@cspell/dict-scala@npm:^5.0.0": + version: 5.0.0 + resolution: "@cspell/dict-scala@npm:5.0.0" + checksum: 874312cd63de246f95ca3ab0ae92649c3fd0b5ca4e28f7586b159759deccdc87d78e85a91b962cd9abc2ea0e855763ff00dfae776840980f69ac2d1da169777c languageName: node linkType: hard -"@cspell/dict-software-terms@npm:^3.0.7": - version: 3.1.0 - resolution: "@cspell/dict-software-terms@npm:3.1.0" - checksum: ef2da1d416bbd7019ad648dbe3e34016a63ca29a342a1bd866e82cb6881ffd0a0f61c2711a78aa6dbc03033b79cc815abcc19b24f132284468df37d68c6ff54c +"@cspell/dict-software-terms@npm:^3.3.15": + version: 3.3.16 + resolution: "@cspell/dict-software-terms@npm:3.3.16" + checksum: d9e6d1c0b11a06b23e9f4b67d5f37186b97431696d6521df0e2cd372105610a5fe9151778a15b3b2e0e1ea9218ace1331f6f9cbbb12119aab7413ab3dc45dedb languageName: node linkType: hard -"@cspell/dict-sql@npm:^2.0.1": - version: 2.0.1 - resolution: "@cspell/dict-sql@npm:2.0.1" - checksum: c92d2c9f3b22de02be5353dfe17e84ba3e562f463128fdcd46959ac9eacd9affb531a64ca374af159eeb8b1d3314a3a530d86ddaf35d972a76e0042614cb2d38 +"@cspell/dict-sql@npm:^2.1.3": + version: 2.1.3 + resolution: "@cspell/dict-sql@npm:2.1.3" + checksum: a435812cc697d4c453f11efa49962992150702518e49808381ea34548b8a8ed81432a10cca36682007912b013c28e9ce3c6c183341c6cde58c8af0eef25cddc3 languageName: node linkType: hard -"@cspell/dict-svelte@npm:^1.0.1": +"@cspell/dict-svelte@npm:^1.0.2": version: 1.0.2 resolution: "@cspell/dict-svelte@npm:1.0.2" checksum: 5b42989bc6743a26ca5172cc23ebc1449d930695b10c908376048ce1835bf57fef7a0004f02ec5e43219f24a97f154e125041df470441199a045ed0be9e654fc @@ -564,10 +619,10 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-typescript@npm:^3.1.0": - version: 3.1.0 - resolution: "@cspell/dict-typescript@npm:3.1.0" - checksum: b34a9f394a9426d0ec7ff6ee378b973b7e5a4483add7a19686cf923dd7047c0195e8ac155529c4a38e0bda4f48e50f7efe8de8df6ad71f875a29d28e64c8c01c +"@cspell/dict-typescript@npm:^3.1.2": + version: 3.1.2 + resolution: "@cspell/dict-typescript@npm:3.1.2" + checksum: b7ad45f704272795c6d8594c468fdc3e79db1fa8f8666be708d8a62188f8159c1b973005a901a49a359cddb80506e3af711b50d4fc9441cb224af34ddd17db76 languageName: node linkType: hard @@ -578,177 +633,228 @@ __metadata: languageName: node linkType: hard -"@cspell/strong-weak-map@npm:6.18.1": - version: 6.18.1 - resolution: "@cspell/strong-weak-map@npm:6.18.1" - checksum: bad1e5e1041797a2fa3bf74efadbfd0bee3b645f7adb98a4bf676cdc999531990754e948d0519cd3369bcdd0b3152760992bf9142acb3c7a0cb024c75142d9dd +"@cspell/dynamic-import@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/dynamic-import@npm:8.3.2" + dependencies: + import-meta-resolve: "npm:^4.0.0" + checksum: 176a5684922e9d3b3b277cdacbac14da509f691bd62da5135fab7c75db57f41c52ef0386c6ba3958e48dbc1b7b6f2751067c63bc1167ee09fae427c86dac71f7 languageName: node linkType: hard -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": 0.3.9 - checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa +"@cspell/strong-weak-map@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/strong-weak-map@npm:8.3.2" + checksum: 0a8bb07ef3226a0a33ecfd911c9ffd63cd47cfd8fb84a65f993eab24dee2b913730f7a05b10b5abdad321c683653824ff891bfadd41189c4ca2bff49ca19efe8 languageName: node linkType: hard -"@eslint/eslintrc@npm:^1.4.1": - version: 1.4.1 - resolution: "@eslint/eslintrc@npm:1.4.1" +"@dependents/detective-less@npm:^3.0.1": + version: 3.0.2 + resolution: "@dependents/detective-less@npm:3.0.2" dependencies: - ajv: ^6.12.4 - debug: ^4.3.2 - espree: ^9.4.0 - globals: ^13.19.0 - ignore: ^5.2.0 - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - minimatch: ^3.1.2 - strip-json-comments: ^3.1.1 - checksum: cd3e5a8683db604739938b1c1c8b77927dc04fce3e28e0c88e7f2cd4900b89466baf83dfbad76b2b9e4d2746abdd00dd3f9da544d3e311633d8693f327d04cd7 + gonzales-pe: "npm:^4.3.0" + node-source-walk: "npm:^5.0.1" + checksum: 2c263ab64fcd1f76117bc35f2b29a150c64bd2b105c96a909a63ce2f2baf07efd93d9ae80e612161d003fb71fbe46598292375f5cc3f447a1b83cfb545dc8f8f languageName: node linkType: hard -"@fast-check/ava@npm:^1.1.3": - version: 1.1.3 - resolution: "@fast-check/ava@npm:1.1.3" +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" dependencies: - fast-check: ^3.0.0 + eslint-visitor-keys: "npm:^3.3.0" peerDependencies: - ava: ">=4.0.0" - checksum: 3540d13ff2898916bfbaf921573b1d5f0f6364cfe09ac79f11670b3fd4768cb89f3dec5712ac75bf58feb4165b5ce188cf72d996a2d8e14711c808764f593c25 + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 8d70bcdcd8cd279049183aca747d6c2ed7092a5cf0cf5916faac1ef37ffa74f0c245c2a3a3d3b9979d9dfdd4ca59257b4c5621db699d637b847a2c5e02f491c2 languageName: node linkType: hard -"@gar/promisify@npm:^1.1.3": - version: 1.1.3 - resolution: "@gar/promisify@npm:1.1.3" - checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 +"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.10.0 + resolution: "@eslint-community/regexpp@npm:4.10.0" + checksum: 8c36169c815fc5d726078e8c71a5b592957ee60d08c6470f9ce0187c8046af1a00afbda0a065cc40ff18d5d83f82aed9793c6818f7304a74a7488dc9f3ecbd42 languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.8": - version: 0.11.8 - resolution: "@humanwhocodes/config-array@npm:0.11.8" +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" dependencies: - "@humanwhocodes/object-schema": ^1.2.1 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 + languageName: node + linkType: hard + +"@eslint/js@npm:8.56.0": + version: 8.56.0 + resolution: "@eslint/js@npm:8.56.0" + checksum: 97a4b5ccf7e24f4d205a1fb0f21cdcd610348ecf685f6798a48dd41ba443f2c1eedd3050ff5a0b8f30b8cf6501ab512aa9b76e531db15e59c9ebaa41f3162e37 + languageName: node + linkType: hard + +"@fast-check/ava@npm:^1.2.1": + version: 1.2.1 + resolution: "@fast-check/ava@npm:1.2.1" + dependencies: + fast-check: "npm:^3.0.0" + peerDependencies: + ava: ^4 || ^5 || ^6 + checksum: 816ac43e5fb0c2a101bc7e2307f67b68ede4dd64d029cecc78795113580c90f4120ccc3ea6931ad757c465dff06a79c24f45cbe399b8ab6d74494d72f9f19736 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.13": + version: 0.11.13 + resolution: "@humanwhocodes/config-array@npm:0.11.13" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.1" + debug: "npm:^4.1.1" + minimatch: "npm:^3.0.5" + checksum: 9f655e1df7efa5a86822cd149ca5cef57240bb8ffd728f0c07cc682cc0a15c6bdce68425fbfd58f9b3e8b16f79b3fd8cb1e96b10c434c9a76f20b2a89f213272 languageName: node linkType: hard "@humanwhocodes/module-importer@npm:^1.0.1": version: 1.0.1 resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + checksum: e993950e346331e5a32eefb27948ecdee2a2c4ab3f072b8f566cd213ef485dd50a3ca497050608db91006f5479e43f91a439aef68d2a313bd3ded06909c7c5b3 languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 +"@humanwhocodes/object-schema@npm:^2.0.1": + version: 2.0.1 + resolution: "@humanwhocodes/object-schema@npm:2.0.1" + checksum: dbddfd0465aecf92ed845ec30d06dba3f7bb2496d544b33b53dac7abc40370c0e46b8787b268d24a366730d5eeb5336ac88967232072a183905ee4abf7df4dab languageName: node linkType: hard "@hutson/parse-repository-url@npm:^3.0.0": version: 3.0.2 resolution: "@hutson/parse-repository-url@npm:3.0.2" - checksum: 39992c5f183c5ca3d761d6ed9dfabcb79b5f3750bf1b7f3532e1dc439ca370138bbd426ee250fdaba460bc948e6761fbefd484b8f4f36885d71ded96138340d1 + checksum: dae0656f2e77315a3027ab9ca438ed344bf78a5fda7b145f65a1fface20dfb17e94e1d31e146c8b76de4657c21020aabc72dc53b53941c9f5fe2c27416559283 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: e9ed5fd27c3aec1095e3a16e0c0cf148d1fee55a38665c35f7b3f86a9b5d00d042ddaabc98e8a1cb7463b9378c15f22a94eb35e99469c201453eb8375191f243 languageName: node linkType: hard "@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": version: 0.1.3 resolution: "@istanbuljs/schema@npm:0.1.3" - checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 + checksum: a9b1e49acdf5efc2f5b2359f2df7f90c5c725f2656f16099e8b2cd3a000619ecca9fc48cf693ba789cf0fd989f6e0df6a22bc05574be4223ecdbb7997d04384b languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: 64d59df8ae1a4e74315eb1b61e012f1c7bc8aac47a3a1e683f6fe7008eab07bc512a742b7aa7c0405685d1421206de58c9c2e6adbfe23832f8bd69408ffc183e languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.4.14 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: 89960ac087781b961ad918978975bcdf2051cd1741880469783c42de64239703eab9db5230d776d8e6a09d73bb5e4cb964e07d93ee6e2e7aea5a7d726e865c09 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" +"@jridgewell/trace-mapping@npm:^0.3.12": + version: 0.3.20 + resolution: "@jridgewell/trace-mapping@npm:0.3.20" dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 683117e4e6707ef50c725d6d0ec4234687ff751f36fa46c2b3068931eb6a86b49af374d3030200777666579a992b7470d1bd1c591e9bf64d764dda5295f33093 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12": - version: 0.3.17 - resolution: "@jridgewell/trace-mapping@npm:0.3.17" - dependencies: - "@jridgewell/resolve-uri": 3.1.0 - "@jridgewell/sourcemap-codec": 1.4.14 - checksum: 9d703b859cff5cd83b7308fd457a431387db5db96bd781a63bf48e183418dd9d3d44e76b9e4ae13237f6abeeb25d739ec9215c1d5bfdd08f66f750a50074a339 +"@mapbox/node-pre-gyp@npm:^1.0.5": + version: 1.0.11 + resolution: "@mapbox/node-pre-gyp@npm:1.0.11" + dependencies: + detect-libc: "npm:^2.0.0" + https-proxy-agent: "npm:^5.0.0" + make-dir: "npm:^3.1.0" + node-fetch: "npm:^2.6.7" + nopt: "npm:^5.0.0" + npmlog: "npm:^5.0.1" + rimraf: "npm:^3.0.2" + semver: "npm:^7.3.5" + tar: "npm:^6.1.11" + bin: + node-pre-gyp: bin/node-pre-gyp + checksum: 59529a2444e44fddb63057152452b00705aa58059079191126c79ac1388ae4565625afa84ed4dd1bf017d1111ab6e47907f7c5192e06d83c9496f2f3e708680a languageName: node linkType: hard -"@microsoft/api-documenter@npm:^7.19.27": - version: 7.19.27 - resolution: "@microsoft/api-documenter@npm:7.19.27" +"@microsoft/api-documenter@npm:^7.23.16": + version: 7.23.16 + resolution: "@microsoft/api-documenter@npm:7.23.16" dependencies: - "@microsoft/api-extractor-model": 7.25.3 - "@microsoft/tsdoc": 0.14.2 - "@rushstack/node-core-library": 3.53.3 - "@rushstack/ts-command-line": 4.13.1 - colors: ~1.2.1 - js-yaml: ~3.13.1 - resolve: ~1.22.1 + "@microsoft/api-extractor-model": "npm:7.28.4" + "@microsoft/tsdoc": "npm:0.14.2" + "@rushstack/node-core-library": "npm:3.63.0" + "@rushstack/ts-command-line": "npm:4.17.1" + colors: "npm:~1.2.1" + js-yaml: "npm:~3.13.1" + resolve: "npm:~1.22.1" bin: api-documenter: bin/api-documenter - checksum: f243f473e1fe58e1cd6e32aad223724b6b621f569276415380abc4845859bf5c23fbe0e370be2a218f362a6c85b01b44b5427336f55800f2ea8bf3f398b0ee41 + checksum: 382ba19c1c53c3e72bc3459da48e2de3093b0255ce178a89fd37f199ba3fcd36ca079d27e0b3d1e803557791236c64d8ccff73539c335b89753ab9105d12d20e languageName: node linkType: hard -"@microsoft/api-extractor-model@npm:7.25.3": - version: 7.25.3 - resolution: "@microsoft/api-extractor-model@npm:7.25.3" +"@microsoft/api-extractor-model@npm:7.28.4": + version: 7.28.4 + resolution: "@microsoft/api-extractor-model@npm:7.28.4" dependencies: - "@microsoft/tsdoc": 0.14.2 - "@microsoft/tsdoc-config": ~0.16.1 - "@rushstack/node-core-library": 3.53.3 - checksum: 532ca30606b5649e90035ef70ff46868f6ccc63181e10b783bc5092e580bcb133112b300799b8f71a19da2b79f685a55f7ddbe84c8fe7ad93d71359c1763c521 + "@microsoft/tsdoc": "npm:0.14.2" + "@microsoft/tsdoc-config": "npm:~0.16.1" + "@rushstack/node-core-library": "npm:3.63.0" + checksum: ecabfab1a816a31fb6bb6fef26661dd200417c38687c9efdb0755e3347be0618377ce871146fb780d4e8b0a09ba5763f6825dd9e66d7a6c16177594c0d5cce6a languageName: node linkType: hard -"@microsoft/api-extractor@npm:^7.33.7": - version: 7.33.7 - resolution: "@microsoft/api-extractor@npm:7.33.7" +"@microsoft/api-extractor@npm:^7.39.1": + version: 7.39.1 + resolution: "@microsoft/api-extractor@npm:7.39.1" dependencies: - "@microsoft/api-extractor-model": 7.25.3 - "@microsoft/tsdoc": 0.14.2 - "@microsoft/tsdoc-config": ~0.16.1 - "@rushstack/node-core-library": 3.53.3 - "@rushstack/rig-package": 0.3.17 - "@rushstack/ts-command-line": 4.13.1 - colors: ~1.2.1 - lodash: ~4.17.15 - resolve: ~1.17.0 - semver: ~7.3.0 - source-map: ~0.6.1 - typescript: ~4.8.4 + "@microsoft/api-extractor-model": "npm:7.28.4" + "@microsoft/tsdoc": "npm:0.14.2" + "@microsoft/tsdoc-config": "npm:~0.16.1" + "@rushstack/node-core-library": "npm:3.63.0" + "@rushstack/rig-package": "npm:0.5.1" + "@rushstack/ts-command-line": "npm:4.17.1" + colors: "npm:~1.2.1" + lodash: "npm:~4.17.15" + resolve: "npm:~1.22.1" + semver: "npm:~7.5.4" + source-map: "npm:~0.6.1" + typescript: "npm:5.3.3" bin: api-extractor: bin/api-extractor - checksum: 3f9034ca8e7bc7a6622cb8ac1f53f7f265ebca529e17f4abb2bef0ca297011cfa0927c0703a819607d974ca79b8f5307371491cfb192788e723cfd316250f9a6 + checksum: 82b1e62d5e22c1c1dd8d2251f3c075ebdbed15857cf7d2a2680d1e2a9510719ce04466ddf79dc1e735935a4631cb49abf019e84decf700bc2dca189d5f52466c languageName: node linkType: hard @@ -756,18 +862,18 @@ __metadata: version: 0.16.2 resolution: "@microsoft/tsdoc-config@npm:0.16.2" dependencies: - "@microsoft/tsdoc": 0.14.2 - ajv: ~6.12.6 - jju: ~1.4.0 - resolve: ~1.19.0 - checksum: 12b0d703154076bcaac75ca42e804e4fc292672396441e54346d7eadd0d6b57f90980eda2b1bab89b224af86da34a2389f9054002e282011e795ca5919a4386f + "@microsoft/tsdoc": "npm:0.14.2" + ajv: "npm:~6.12.6" + jju: "npm:~1.4.0" + resolve: "npm:~1.19.0" + checksum: 37fc35d83dab66771502165fad6a8380ec6d47e0fdaadcb60c09792e5b8172feea42f327ebf4e6026c3b22448e5e73d9ee53948a2d877ee00257679b162f3490 languageName: node linkType: hard "@microsoft/tsdoc@npm:0.14.2": version: 0.14.2 resolution: "@microsoft/tsdoc@npm:0.14.2" - checksum: b167c89e916ba73ee20b9c9d5dba6aa3a0de25ed3d50050e8a344dca7cd43cb2e1059bd515c820369b6e708901dd3fda476a42bc643ca74a35671ce77f724a3a + checksum: 00c3d4fc184e8e09e17aef57e4a990402bd9752607a5d50bd62a9e85bc4b8791c985a51e238affa6b9a2d23110f24d373becbfc84e1e6e9a84cf977822e3b00a languageName: node linkType: hard @@ -775,9 +881,9 @@ __metadata: version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b languageName: node linkType: hard @@ -792,188 +898,274 @@ __metadata: version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 languageName: node linkType: hard -"@npmcli/fs@npm:^2.1.0": - version: 2.1.2 - resolution: "@npmcli/fs@npm:2.1.2" +"@npmcli/agent@npm:^2.0.0": + version: 2.2.0 + resolution: "@npmcli/agent@npm:2.2.0" dependencies: - "@gar/promisify": ^1.1.3 - semver: ^7.3.5 - checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 822ea077553cd9cfc5cbd6d92380b0950fcb054a7027cd1b63a33bd0cbb16b0c6626ea75d95ec0e804643c8904472d3361d2da8c2444b1fb02a9b525d9c07c41 languageName: node linkType: hard -"@npmcli/move-file@npm:^2.0.0": - version: 2.0.1 - resolution: "@npmcli/move-file@npm:2.0.1" +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" dependencies: - mkdirp: ^1.0.4 - rimraf: ^3.0.2 - checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 + semver: "npm:^7.3.5" + checksum: f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e languageName: node linkType: hard -"@rollup/plugin-alias@npm:^4.0.2": - version: 4.0.2 - resolution: "@rollup/plugin-alias@npm:4.0.2" +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff + languageName: node + linkType: hard + +"@playwright/test@npm:^1.40.1": + version: 1.40.1 + resolution: "@playwright/test@npm:1.40.1" dependencies: - slash: ^4.0.0 + playwright: "npm:1.40.1" + bin: + playwright: cli.js + checksum: 77bfc3d4a101fd996309de3a67256117f671952764404727e520a4d512ba2e528d8f9e0b28ef9b2851664a651a5d002a0b05993e313077a2fa640bb430f38b25 + languageName: node + linkType: hard + +"@rollup/plugin-alias@npm:^5.1.0": + version: 5.1.0 + resolution: "@rollup/plugin-alias@npm:5.1.0" + dependencies: + slash: "npm:^4.0.0" peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 6f2db9cfea12b366d1127fca8774e09ab3de98da8ea62082834e795544e1e706479d3056b0d4863c3cc41de2ff04aa7f89942c3c333a8a9944c60108051b2e3c + checksum: 2749f9563dba9274e4324fcd14ffe761fa66ee3baab307ba583d0348adfa2c1d2a164f59eac8c26a9ce7c713a99a991a831c072101e83697157ccf082c362310 languageName: node linkType: hard -"@rollup/plugin-commonjs@npm:^22.0.2": - version: 22.0.2 - resolution: "@rollup/plugin-commonjs@npm:22.0.2" +"@rollup/plugin-commonjs@npm:^25.0.7": + version: 25.0.7 + resolution: "@rollup/plugin-commonjs@npm:25.0.7" dependencies: - "@rollup/pluginutils": ^3.1.0 - commondir: ^1.0.1 - estree-walker: ^2.0.1 - glob: ^7.1.6 - is-reference: ^1.2.1 - magic-string: ^0.25.7 - resolve: ^1.17.0 + "@rollup/pluginutils": "npm:^5.0.1" + commondir: "npm:^1.0.1" + estree-walker: "npm:^2.0.2" + glob: "npm:^8.0.3" + is-reference: "npm:1.2.1" + magic-string: "npm:^0.30.3" peerDependencies: - rollup: ^2.68.0 - checksum: 70098a4b91afe3f164f5d27cba65edf148c5ed146ee0e07a964b66940681553ac77391083114cdcf9427e7f2706bf0d61eab310b3a2caeab83b7452c0292fcae + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 89b108e245d1af6e7878ac949bfcd44e48f7d0c1eda0cb0b7e89c231ae73de455ffe2ac65eb03a398da4e8c300ce404f997fe66f8dde3d4d4794ffd2c1241fc3 languageName: node linkType: hard -"@rollup/plugin-node-resolve@npm:^15.0.1": - version: 15.0.1 - resolution: "@rollup/plugin-node-resolve@npm:15.0.1" +"@rollup/plugin-node-resolve@npm:^15.2.3": + version: 15.2.3 + resolution: "@rollup/plugin-node-resolve@npm:15.2.3" dependencies: - "@rollup/pluginutils": ^5.0.1 - "@types/resolve": 1.20.2 - deepmerge: ^4.2.2 - is-builtin-module: ^3.2.0 - is-module: ^1.0.0 - resolve: ^1.22.1 + "@rollup/pluginutils": "npm:^5.0.1" + "@types/resolve": "npm:1.20.2" + deepmerge: "npm:^4.2.2" + is-builtin-module: "npm:^3.2.1" + is-module: "npm:^1.0.0" + resolve: "npm:^1.22.1" peerDependencies: - rollup: ^2.78.0||^3.0.0 + rollup: ^2.78.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 90e30b41626a15ebf02746a83d34b15f9fe9051ddc156a9bf785504f489947980b3bdeb7bf2f80828a9becfe472a03a96d0238328a3e3e2198a482fcac7eb3aa + checksum: d36a6792fbe9d8673d3a7c7dc88920be669ac54fba02ac0093d3c00fc9463fce2e87da1906a2651016742709c3d202b367fb49a62acd0d98f18409343f27b8b4 languageName: node linkType: hard -"@rollup/pluginutils@npm:^3.1.0": - version: 3.1.0 - resolution: "@rollup/pluginutils@npm:3.1.0" +"@rollup/pluginutils@npm:^4.0.0": + version: 4.2.1 + resolution: "@rollup/pluginutils@npm:4.2.1" dependencies: - "@types/estree": 0.0.39 - estree-walker: ^1.0.1 - picomatch: ^2.2.2 - peerDependencies: - rollup: ^1.20.0||^2.0.0 - checksum: 8be16e27863c219edbb25a4e6ec2fe0e1e451d9e917b6a43cf2ae5bc025a6b8faaa40f82a6e53b66d0de37b58ff472c6c3d57a83037ae635041f8df959d6d9aa + estree-walker: "npm:^2.0.1" + picomatch: "npm:^2.2.2" + checksum: 503a6f0a449e11a2873ac66cfdfb9a3a0b77ffa84c5cad631f5e4bc1063c850710e8d5cd5dab52477c0d66cda2ec719865726dbe753318cd640bab3fff7ca476 languageName: node linkType: hard "@rollup/pluginutils@npm:^5.0.1": - version: 5.0.2 - resolution: "@rollup/pluginutils@npm:5.0.2" + version: 5.1.0 + resolution: "@rollup/pluginutils@npm:5.1.0" dependencies: - "@types/estree": ^1.0.0 - estree-walker: ^2.0.2 - picomatch: ^2.3.1 + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^2.0.2" + picomatch: "npm:^2.3.1" peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: edea15e543bebc7dcac3b0ac8bc7b8e8e6dbd46e2864dbe5dd28072de1fbd5b0e10d545a610c0edaa178e8a7ac432e2a2a52e547ece1308471412caba47db8ce + checksum: abb15eaec5b36f159ec351b48578401bedcefdfa371d24a914cfdbb1e27d0ebfbf895299ec18ccc343d247e71f2502cba21202bc1362d7ef27d5ded699e5c2b2 languageName: node linkType: hard -"@rushstack/node-core-library@npm:3.53.3": - version: 3.53.3 - resolution: "@rushstack/node-core-library@npm:3.53.3" - dependencies: - "@types/node": 12.20.24 - colors: ~1.2.1 - fs-extra: ~7.0.1 - import-lazy: ~4.0.0 - jju: ~1.4.0 - resolve: ~1.17.0 - semver: ~7.3.0 - z-schema: ~5.0.2 - checksum: 265d18e176079b8e90cd507e5d4d45f3afb1f811efdf491ea26f25f0397b77c0e9d42065166bf79a04503426c844ea92034cd3f8d5961b2a116de82e45cf6d6a +"@rollup/rollup-android-arm-eabi@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.9.3" + conditions: os=android & cpu=arm languageName: node linkType: hard -"@rushstack/rig-package@npm:0.3.17": - version: 0.3.17 - resolution: "@rushstack/rig-package@npm:0.3.17" - dependencies: - resolve: ~1.17.0 - strip-json-comments: ~3.1.1 - checksum: 54eeea471c85b547575d7efc84fad3c9588f10106e2bfd8cd022bccb02c2fb0bf8ff597fab9114450b3c262abab0f0a4e52dd074bfd120e850b95037cd7b3102 +"@rollup/rollup-android-arm64@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-android-arm64@npm:4.9.3" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rushstack/ts-command-line@npm:4.13.1": - version: 4.13.1 - resolution: "@rushstack/ts-command-line@npm:4.13.1" - dependencies: - "@types/argparse": 1.0.38 - argparse: ~1.0.9 - colors: ~1.2.1 - string-argv: ~0.3.1 - checksum: fea24b2549ecb7d3409b6b485d7c58bf8af8f8d1dd19c43a6b3532c45579ffc546bc4533b5db29c91ae1716581fdee4cb725f6a81ecb300e902ef06600e59f1d +"@rollup/rollup-darwin-arm64@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-darwin-arm64@npm:4.9.3" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@tokenizer/token@npm:^0.3.0": - version: 0.3.0 - resolution: "@tokenizer/token@npm:0.3.0" - checksum: 1d575d02d2a9f0c5a4ca5180635ebd2ad59e0f18b42a65f3d04844148b49b3db35cf00b6012a1af2d59c2ab3caca59451c5689f747ba8667ee586ad717ee58e1 +"@rollup/rollup-darwin-x64@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-darwin-x64@npm:4.9.3" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 +"@rollup/rollup-linux-arm-gnueabihf@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.9.3" + conditions: os=linux & cpu=arm languageName: node linkType: hard -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df +"@rollup/rollup-linux-arm64-gnu@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.9.3" + conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a +"@rollup/rollup-linux-arm64-musl@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.9.3" + conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d +"@rollup/rollup-linux-riscv64-gnu@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.9.3" + conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.3 - resolution: "@tsconfig/node16@npm:1.0.3" - checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f +"@rollup/rollup-linux-x64-gnu@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.9.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.9.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.9.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.9.3" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.9.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rushstack/node-core-library@npm:3.63.0": + version: 3.63.0 + resolution: "@rushstack/node-core-library@npm:3.63.0" + dependencies: + colors: "npm:~1.2.1" + fs-extra: "npm:~7.0.1" + import-lazy: "npm:~4.0.0" + jju: "npm:~1.4.0" + resolve: "npm:~1.22.1" + semver: "npm:~7.5.4" + z-schema: "npm:~5.0.2" + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 14e635884bac94b7d2a73a2e5793389c0a770c9d8cc9a4f6b13975318d4e7361af5169cd7084d00ac883bf7623c5ea74581c5cfb0a4c6a5590d72b0ce6cbef83 + languageName: node + linkType: hard + +"@rushstack/rig-package@npm:0.5.1": + version: 0.5.1 + resolution: "@rushstack/rig-package@npm:0.5.1" + dependencies: + resolve: "npm:~1.22.1" + strip-json-comments: "npm:~3.1.1" + checksum: 9e5d425f60bb1e23371ecc086eaca838651ced904da33b690103ac731820e65a8a3720243f9e03578dfd1efa067fec9c6d762f16b3bb8cf92b56254d5f906989 + languageName: node + linkType: hard + +"@rushstack/ts-command-line@npm:4.17.1": + version: 4.17.1 + resolution: "@rushstack/ts-command-line@npm:4.17.1" + dependencies: + "@types/argparse": "npm:1.0.38" + argparse: "npm:~1.0.9" + colors: "npm:~1.2.1" + string-argv: "npm:~0.3.1" + checksum: 75407f6a42fda364ec9f945ebd346c632a23dd97d7ed5ad108c264d72ee0370d3d912cc6c16af6973bbc3f5f92b845b63fb13da75a077d61f7e34e69f00b8823 + languageName: node + linkType: hard + +"@sindresorhus/merge-streams@npm:^1.0.0": + version: 1.0.0 + resolution: "@sindresorhus/merge-streams@npm:1.0.0" + checksum: 453c2a28164113a5ec4fd23ba636e291a4112f6ee9e91cd5476b9a96e0fc9ee5ff40d405fe81bbf284c9773b7ed718a3a0f31df7895a0efd413b1f9775d154fe + languageName: node + linkType: hard + +"@tokenizer/token@npm:^0.3.0": + version: 0.3.0 + resolution: "@tokenizer/token@npm:0.3.0" + checksum: 889c1f1e63ac7c92c0ea22d4a2861142f1b43c3d92eb70ec42aa9e9851fab2e9952211d50f541b287781280df2f979bf5600a9c1f91fbc61b7fcf9994e9376a5 languageName: node linkType: hard @@ -985,352 +1177,330 @@ __metadata: linkType: hard "@types/bn.js@npm:*": - version: 5.1.1 - resolution: "@types/bn.js@npm:5.1.1" + version: 5.1.5 + resolution: "@types/bn.js@npm:5.1.5" dependencies: - "@types/node": "*" - checksum: e50ed2dd3abe997e047caf90e0352c71e54fc388679735217978b4ceb7e336e51477791b715f49fd77195ac26dd296c7bad08a3be9750e235f9b2e1edb1b51c2 + "@types/node": "npm:*" + checksum: 9719330c86aeae0a6a447c974cf0f853ba3660ede20de61f435b03d699e30e6d8b35bf71a8dc9fdc8317784438e83177644ba068ed653d0ae0106e1ecbfe289e languageName: node linkType: hard "@types/body-parser@npm:*": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" dependencies: - "@types/connect": "*" - "@types/node": "*" - checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + "@types/connect": "npm:*" + "@types/node": "npm:*" + checksum: 1e251118c4b2f61029cc43b0dc028495f2d1957fe8ee49a707fb940f86a9bd2f9754230805598278fe99958b49e9b7e66eec8ef6a50ab5c1f6b93e1ba2aaba82 languageName: node linkType: hard "@types/connect@npm:*": - version: 3.4.35 - resolution: "@types/connect@npm:3.4.35" + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" dependencies: - "@types/node": "*" - checksum: fe81351470f2d3165e8b12ce33542eef89ea893e36dd62e8f7d72566dfb7e448376ae962f9f3ea888547ce8b55a40020ca0e01d637fab5d99567673084542641 + "@types/node": "npm:*" + checksum: 7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 languageName: node linkType: hard -"@types/elliptic@npm:^6.4.14": - version: 6.4.14 - resolution: "@types/elliptic@npm:6.4.14" +"@types/elliptic@npm:^6.4.18": + version: 6.4.18 + resolution: "@types/elliptic@npm:6.4.18" dependencies: - "@types/bn.js": "*" - checksum: d5a64f540e0ed4b74a12dfa5cc88c0aa7b531eab3b7a9fab17948ffbfc6e01814230e63d7417ce1b607dbd8b5d70e1b64f5afac632deabf96e44875aaac0ae1b + "@types/bn.js": "npm:*" + checksum: 06493e18167a581fa48d3c0f7034b9ad107993610767d5251ae2788be4bc5bdeda292d9ae18bbf366faa4a492eb669fc31060392f79bd5fdccb4efbd729ae66a languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/estree@npm:1.0.0" - checksum: 910d97fb7092c6738d30a7430ae4786a38542023c6302b95d46f49420b797f21619cdde11fa92b338366268795884111c2eb10356e4bd2c8ad5b92941e9e6443 +"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: 7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 languageName: node linkType: hard -"@types/estree@npm:0.0.39": - version: 0.0.39 - resolution: "@types/estree@npm:0.0.39" - checksum: 412fb5b9868f2c418126451821833414189b75cc6bf84361156feed733e3d92ec220b9d74a89e52722e03d5e241b2932732711b7497374a404fad49087adc248 +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.17.41 + resolution: "@types/express-serve-static-core@npm:4.17.41" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 7647e19d9c3d57ddd18947d2b161b90ef0aedd15875140e5b824209be41c1084ae942d4fb43cd5f2051a6a5f8c044519ef6c9ac1b2ad86b9aa546b4f1f023303 languageName: node linkType: hard -"@types/express-serve-static-core@npm:^4.17.31": - version: 4.17.32 - resolution: "@types/express-serve-static-core@npm:4.17.32" +"@types/express@npm:^4.17.21": + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" dependencies: - "@types/node": "*" - "@types/qs": "*" - "@types/range-parser": "*" - checksum: 70ec1b8f386628850b315a7b9fd4240a5a70297b41ef1c39af65c8b9661d2c775cfff4686b491fd90e5b6eef43088af203700c5541aec0d063db0c6cbeff254c + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^4.17.33" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 7a6d26cf6f43d3151caf4fec66ea11c9d23166e4f3102edfe45a94170654a54ea08cf3103d26b3928d7ebcc24162c90488e33986b7e3a5f8941225edd5eb18c7 languageName: node linkType: hard -"@types/express@npm:^4.17.15": - version: 4.17.15 - resolution: "@types/express@npm:4.17.15" - dependencies: - "@types/body-parser": "*" - "@types/express-serve-static-core": ^4.17.31 - "@types/qs": "*" - "@types/serve-static": "*" - checksum: b4acd8a836d4f6409cdf79b12d6e660485249b62500cccd61e7997d2f520093edf77d7f8498ca79d64a112c6434b6de5ca48039b8fde2c881679eced7e96979b +"@types/http-errors@npm:*": + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 1f3d7c3b32c7524811a45690881736b3ef741bf9849ae03d32ad1ab7062608454b150a4e7f1351f83d26a418b2d65af9bdc06198f1c079d75578282884c4e8e3 languageName: node linkType: hard "@types/istanbul-lib-coverage@npm:^2.0.1": - version: 2.0.4 - resolution: "@types/istanbul-lib-coverage@npm:2.0.4" - checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 languageName: node linkType: hard -"@types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.9": - version: 7.0.11 - resolution: "@types/json-schema@npm:7.0.11" - checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d +"@types/json-schema@npm:^7.0.12": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 languageName: node linkType: hard "@types/json5@npm:^0.0.29": version: 0.0.29 resolution: "@types/json5@npm:0.0.29" - checksum: e60b153664572116dfea673c5bda7778dbff150498f44f998e34b5886d8afc47f16799280e4b6e241c0472aef1bc36add771c569c68fc5125fc2ae519a3eb9ac + checksum: 4e5aed58cabb2bbf6f725da13421aa50a49abb6bc17bfab6c31b8774b073fa7b50d557c61f961a09a85f6056151190f8ac95f13f5b48136ba5841f7d4484ec56 languageName: node linkType: hard "@types/mime@npm:*": - version: 3.0.1 - resolution: "@types/mime@npm:3.0.1" - checksum: 4040fac73fd0cea2460e29b348c1a6173da747f3a87da0dbce80dd7a9355a3d0e51d6d9a401654f3e5550620e3718b5a899b2ec1debf18424e298a2c605346e7 + version: 3.0.4 + resolution: "@types/mime@npm:3.0.4" + checksum: a6139c8e1f705ef2b064d072f6edc01f3c099023ad7c4fce2afc6c2bf0231888202adadbdb48643e8e20da0ce409481a49922e737eca52871b3dc08017455843 languageName: node linkType: hard -"@types/minimist@npm:^1.2.0, @types/minimist@npm:^1.2.2": - version: 1.2.2 - resolution: "@types/minimist@npm:1.2.2" - checksum: b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: e29a5f9c4776f5229d84e525b7cd7dd960b51c30a0fb9a028c0821790b82fca9f672dab56561e2acd9e8eed51d431bde52eafdfef30f643586c4162f1aecfc78 languageName: node linkType: hard -"@types/node@npm:*": - version: 18.11.18 - resolution: "@types/node@npm:18.11.18" - checksum: 03f17f9480f8d775c8a72da5ea7e9383db5f6d85aa5fefde90dd953a1449bd5e4ffde376f139da4f3744b4c83942166d2a7603969a6f8ea826edfb16e6e3b49d +"@types/minimist@npm:^1.2.0": + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 477047b606005058ab0263c4f58097136268007f320003c348794f74adedc3166ffc47c80ec3e94687787f2ab7f4e72c468223946e79892cf0fd9e25e9970a90 languageName: node linkType: hard -"@types/node@npm:12.20.24": - version: 12.20.24 - resolution: "@types/node@npm:12.20.24" - checksum: e7a13460e2f5b0b5a32c0f3af7daf1a05201552a66d542d3cc3b1ea8b52d4730250f9eb1961d755e31cfe5d03c78340911a6242657a0a9a17d6f7e341fc9f366 +"@types/node@npm:*, @types/node@npm:^20.10.6": + version: 20.10.6 + resolution: "@types/node@npm:20.10.6" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 08471220d3cbbb6669835c4b78541edf5eface8f2c2e36c550cfa4ff73da73071c90e200a06359fac25d6564127597c23e178128058fb676824ec23d5178a017 languageName: node linkType: hard "@types/normalize-package-data@npm:^2.4.0": - version: 2.4.1 - resolution: "@types/normalize-package-data@npm:2.4.1" - checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 65dff72b543997b7be8b0265eca7ace0e34b75c3e5fee31de11179d08fa7124a7a5587265d53d0409532ecb7f7fba662c2012807963e1f9b059653ec2c83ee05 languageName: node linkType: hard "@types/qs@npm:*": - version: 6.9.7 - resolution: "@types/qs@npm:6.9.7" - checksum: 7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba + version: 6.9.11 + resolution: "@types/qs@npm:6.9.11" + checksum: 620ca1628bf3da65662c54ed6ebb120b18a3da477d0bfcc872b696685a9bb1893c3c92b53a1190a8f54d52eaddb6af8b2157755699ac83164604329935e8a7f2 languageName: node linkType: hard "@types/range-parser@npm:*": - version: 1.2.4 - resolution: "@types/range-parser@npm:1.2.4" - checksum: b7c0dfd5080a989d6c8bb0b6750fc0933d9acabeb476da6fe71d8bdf1ab65e37c136169d84148034802f48378ab94e3c37bb4ef7656b2bec2cb9c0f8d4146a95 + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 95640233b689dfbd85b8c6ee268812a732cf36d5affead89e806fe30da9a430767af8ef2cd661024fd97e19d61f3dec75af2df5e80ec3bea000019ab7028629a languageName: node linkType: hard "@types/resolve@npm:1.20.2": version: 1.20.2 resolution: "@types/resolve@npm:1.20.2" - checksum: 61c2cad2499ffc8eab36e3b773945d337d848d3ac6b7b0a87c805ba814bc838ef2f262fc0f109bfd8d2e0898ff8bd80ad1025f9ff64f1f71d3d4294c9f14e5f6 + checksum: 1bff0d3875e7e1557b6c030c465beca9bf3b1173ebc6937cac547654b0af3bb3ff0f16470e9c4d7c5dc308ad9ac8627c38dbff24ef698b66673ff5bd4ead7f7e languageName: node linkType: hard -"@types/semver@npm:^7.3.12": - version: 7.3.13 - resolution: "@types/semver@npm:7.3.13" - checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 +"@types/semver@npm:^7.5.0": + version: 7.5.6 + resolution: "@types/semver@npm:7.5.6" + checksum: e77282b17f74354e17e771c0035cccb54b94cc53d0433fa7e9ba9d23fd5d7edcd14b6c8b7327d58bbd89e83b1c5eda71dfe408e06b929007e2b89586e9b63459 languageName: node linkType: hard -"@types/serve-static@npm:*": - version: 1.15.0 - resolution: "@types/serve-static@npm:1.15.0" +"@types/send@npm:*": + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" dependencies: - "@types/mime": "*" - "@types/node": "*" - checksum: b6ac93d471fb0f53ddcac1f9b67572a09cd62806f7db5855244b28f6f421139626f24799392566e97d1ffc61b12f9de7f30380c39fcae3c8a161fe161d44edf2 + "@types/mime": "npm:^1" + "@types/node": "npm:*" + checksum: 28320a2aa1eb704f7d96a65272a07c0bf3ae7ed5509c2c96ea5e33238980f71deeed51d3631927a77d5250e4091b3e66bce53b42d770873282c6a20bb8b0280d languageName: node linkType: hard -"@types/yauzl@npm:^2.9.1": - version: 2.10.0 - resolution: "@types/yauzl@npm:2.10.0" - dependencies: - "@types/node": "*" - checksum: 55d27ae5d346ea260e40121675c24e112ef0247649073848e5d4e03182713ae4ec8142b98f61a1c6cbe7d3b72fa99bbadb65d8b01873e5e605cdc30f1ff70ef2 - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.28.0" +"@types/serve-static@npm:*": + version: 1.15.5 + resolution: "@types/serve-static@npm:1.15.5" dependencies: - "@typescript-eslint/scope-manager": 5.28.0 - "@typescript-eslint/type-utils": 5.28.0 - "@typescript-eslint/utils": 5.28.0 - debug: ^4.3.4 - functional-red-black-tree: ^1.0.1 - ignore: ^5.2.0 - regexpp: ^3.2.0 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 49e08865abd35acdc44829b929f2cd01d01a1f91d3c3c357963b6980e938de365f178efcec21e0ed6ec13a2ad9373f52b73001ddd5cdc7b0245fcf02b9564dd3 + "@types/http-errors": "npm:*" + "@types/mime": "npm:*" + "@types/node": "npm:*" + checksum: 49aa21c367fffe4588fc8c57ea48af0ea7cbadde7418bc53cde85d8bd57fd2a09a293970d9ea86e79f17a87f8adeb3e20da76aab38e1c4d1567931fa15c8af38 languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/eslint-plugin@npm:5.48.1" - dependencies: - "@typescript-eslint/scope-manager": 5.48.1 - "@typescript-eslint/type-utils": 5.48.1 - "@typescript-eslint/utils": 5.48.1 - debug: ^4.3.4 - ignore: ^5.2.0 - natural-compare-lite: ^1.4.0 - regexpp: ^3.2.0 - semver: ^7.3.7 - tsutils: ^3.21.0 +"@typescript-eslint/eslint-plugin@npm:^6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/eslint-plugin@npm:6.18.1" + dependencies: + "@eslint-community/regexpp": "npm:^4.5.1" + "@typescript-eslint/scope-manager": "npm:6.18.1" + "@typescript-eslint/type-utils": "npm:6.18.1" + "@typescript-eslint/utils": "npm:6.18.1" + "@typescript-eslint/visitor-keys": "npm:6.18.1" + debug: "npm:^4.3.4" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.4" + natural-compare: "npm:^1.4.0" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: d8d73d123d16fc9b50b500ef21816dcabdffe0d2dcfdb15089dc5a1015d57cbad709de565d1c830f5058c0d7b410069e2554c0b53d1485fe7b237ea8089e58be + checksum: 451abba1f784539ba38cbe40af26c461facd848e90cbf0c440a98ca2a770ff74a794bafe1df7240e52a97e7cd72bade97d5de751dffbac269643460ad65e3b19 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/parser@npm:5.48.1" +"@typescript-eslint/parser@npm:^6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/parser@npm:6.17.0" dependencies: - "@typescript-eslint/scope-manager": 5.48.1 - "@typescript-eslint/types": 5.48.1 - "@typescript-eslint/typescript-estree": 5.48.1 - debug: ^4.3.4 + "@typescript-eslint/scope-manager": "npm:6.17.0" + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/typescript-estree": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" + debug: "npm:^4.3.4" peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: c624d24eb209b4ce7f0a6c8116712363f10a9c9a5138f240e254ff265526ee4b0fd73b7b6b4b6a0e7611bd9934c42036350dd27f96ae2fa4efdade1a7ebd0e9e + checksum: 2ed0ed4a5b30e953430ce3279df3655af09fa1caed2abf11804d239717daefc32a22864f6620ef57bb9c684c74a99a13241384fea5096e961385e3678fc2e920 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/scope-manager@npm:5.28.0" +"@typescript-eslint/scope-manager@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/scope-manager@npm:6.17.0" dependencies: - "@typescript-eslint/types": 5.28.0 - "@typescript-eslint/visitor-keys": 5.28.0 - checksum: f187fd295d152508aa85233ef3ac89031952300fbbe277e188dfba3fbfd82656b15d3d8daa6d85984970ce00a30fdf75da912c4024df982004b24f3a95420b8f + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" + checksum: fe09c628553c9336e6a36d32c1d34e78ebd20aa02130a6bf535329621ba5a98aaac171f607bc6e4d17b3478c42e7de6476376636897ce3f227c754eb99acd07e languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/scope-manager@npm:5.48.1" - dependencies: - "@typescript-eslint/types": 5.48.1 - "@typescript-eslint/visitor-keys": 5.48.1 - checksum: f60a7efe917798cccf8652925de6be58b023ded6c6ee44ce74d074f0c2a1927680398a6d73bab33d500c69474ad8c54d63b90fcc6e13256712707d12a60e0a64 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/type-utils@npm:5.28.0" +"@typescript-eslint/scope-manager@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/scope-manager@npm:6.18.1" dependencies: - "@typescript-eslint/utils": 5.28.0 - debug: ^4.3.4 - tsutils: ^3.21.0 - peerDependencies: - eslint: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: 05563dab5414a42b7781f5ce65ee540b10a946c419bde3fbc45593aa3b1225b2a70558581f311720d670dc82ab699a3f9ecb4b1447d6fd557bd330cf8890d8ca + "@typescript-eslint/types": "npm:6.18.1" + "@typescript-eslint/visitor-keys": "npm:6.18.1" + checksum: ab75663cda67a2c95267f240f2e062a0aafab0df6d625043a134c8e1d61e193c0d3cfa49c802bd554b3fd80f4b7df5ea3f86ef2eb6994ba8b5e0790cc9868c84 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/type-utils@npm:5.48.1" +"@typescript-eslint/type-utils@npm:6.18.1, @typescript-eslint/type-utils@npm:^6.0.0": + version: 6.18.1 + resolution: "@typescript-eslint/type-utils@npm:6.18.1" dependencies: - "@typescript-eslint/typescript-estree": 5.48.1 - "@typescript-eslint/utils": 5.48.1 - debug: ^4.3.4 - tsutils: ^3.21.0 + "@typescript-eslint/typescript-estree": "npm:6.18.1" + "@typescript-eslint/utils": "npm:6.18.1" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^1.0.1" peerDependencies: - eslint: "*" + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 2739b35caf48c9edbeab82936de58ce0759ab34955ce7eec1786690d6a63146ae0a6c5d9c76034605d9fe200c87a73ede0772c6244c5df6e66df992d9ebbab72 + checksum: f775011c35aef10b11e7cffde698fca8b06b313785cd44422c60a40b6643d85a38cbd9a3cbdef011d963680d65383c40988d983e9dfd01258ae50a2f37f6d293 languageName: node linkType: hard "@typescript-eslint/types@npm:4.33.0": version: 4.33.0 resolution: "@typescript-eslint/types@npm:4.33.0" - checksum: 3baae1ca35872421b4eb60f5d3f3f32dc1d513f2ae0a67dee28c7d159fd7a43ed0d11a8a5a0f0c2d38507ffa036fc7c511cb0f18a5e8ac524b3ebde77390ec53 + checksum: c7ec55e6aef47ac49f712da52968c825552a23c59717f338f08c480e5336d592a689a324d21e2d370f48713a1302d7c78c14e6250bcea9b91f0b62ab6b2db3e1 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/types@npm:5.28.0" - checksum: e948915d6f24ece98043763a48e34ced5e16a1aa88cc86ea7d9057010ed92ce39457a753dd7a140be52f9b546b27f8a3b33bdc7d671427a386aa1aa381d908ef +"@typescript-eslint/types@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/types@npm:5.62.0" + checksum: 24e8443177be84823242d6729d56af2c4b47bfc664dd411a1d730506abf2150d6c31bdefbbc6d97c8f91043e3a50e0c698239dcb145b79bb6b0c34469aaf6c45 languageName: node linkType: hard -"@typescript-eslint/types@npm:5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/types@npm:5.48.1" - checksum: 8437986e9d86d792b23327517ae2f9861ec55992d5a9cd55991e525409b6244169436cd708f3987ab7c579e45e59b6eab5a9d3583f7729219e25691164293094 +"@typescript-eslint/types@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/types@npm:6.17.0" + checksum: 87ab1b5a3270ab34b917c22a2fb90a9ad7d9f3b19d73a337bc9efbe65f924da13482c97e8ccbe3bd3d081aa96039eeff50de41c1da2a2128066429b931cdb21d languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.28.0" +"@typescript-eslint/types@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/types@npm:6.18.1" + checksum: e304620953257a5af3b323697845d3fb41ffbb7944df2f84559675ef8ad71cc33011be30149efd8d34c5dedcbe92c6abee67cb1b95cb3dd56f15b9393b3435a6 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.17.0" dependencies: - "@typescript-eslint/types": 5.28.0 - "@typescript-eslint/visitor-keys": 5.28.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + minimatch: "npm:9.0.3" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" peerDependenciesMeta: typescript: optional: true - checksum: e7be6e9ff778ab2728bdc545713f29cd40bbe1282662461453fe46bc18f676f9b33c60e3514347fbc4e5e94d764525c20b8ef3d47baa62fec6bd3ce05fdde6eb + checksum: 1671b0d2f2fdf07074fb1e2524d61935cec173bd8db6e482cc5b2dcc77aed3ffa831396736ffa0ee2fdbddd8585ae9ca8d6c97bcaea1385b23907a1ec0508f83 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/typescript-estree@npm:5.48.1" - dependencies: - "@typescript-eslint/types": 5.48.1 - "@typescript-eslint/visitor-keys": 5.48.1 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 +"@typescript-eslint/typescript-estree@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/typescript-estree@npm:6.18.1" + dependencies: + "@typescript-eslint/types": "npm:6.18.1" + "@typescript-eslint/visitor-keys": "npm:6.18.1" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + minimatch: "npm:9.0.3" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" peerDependenciesMeta: typescript: optional: true - checksum: 2b26e5848ef131e1bb99ed54d8c0efa8279cf8e8f7d8b72de00c2ca6cf2799d96c20f5bbbcf26e14e81b7b9d1035ba509bff30f2d852c174815879e8f14c27ed + checksum: 33307bc87c3270f84f149545da79a15afaafacc5671e42f4aa827947f09c35ed114705f108ffa59d6ab175f8b838aa08cf10f9efe5b7793aca0792f879bbc7ca languageName: node linkType: hard @@ -1338,51 +1508,52 @@ __metadata: version: 4.33.0 resolution: "@typescript-eslint/typescript-estree@npm:4.33.0" dependencies: - "@typescript-eslint/types": 4.33.0 - "@typescript-eslint/visitor-keys": 4.33.0 - debug: ^4.3.1 - globby: ^11.0.3 - is-glob: ^4.0.1 - semver: ^7.3.5 - tsutils: ^3.21.0 + "@typescript-eslint/types": "npm:4.33.0" + "@typescript-eslint/visitor-keys": "npm:4.33.0" + debug: "npm:^4.3.1" + globby: "npm:^11.0.3" + is-glob: "npm:^4.0.1" + semver: "npm:^7.3.5" + tsutils: "npm:^3.21.0" peerDependenciesMeta: typescript: optional: true - checksum: 2566984390c76bd95f43240057215c068c69769e406e27aba41e9f21fd300074d6772e4983fa58fe61e80eb5550af1548d2e31e80550d92ba1d051bb00fe6f5c + checksum: e9409ec992d9d3c44efd53106bf63a6d5f6041e9dc359d54ea4b5f6787404cf44057cbd3090e9cc45ed4157dc631e398079f954490e50a4608cea1fbf9e69226 languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/utils@npm:5.28.0" +"@typescript-eslint/typescript-estree@npm:^5.55.0": + version: 5.62.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" dependencies: - "@types/json-schema": ^7.0.9 - "@typescript-eslint/scope-manager": 5.28.0 - "@typescript-eslint/types": 5.28.0 - "@typescript-eslint/typescript-estree": 5.28.0 - eslint-scope: ^5.1.1 - eslint-utils: ^3.0.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: d30958552470c3f46b2183b690fa8c922a375a84ef83ccfda4785148b8dafb7bf428ab01de6608f67cefbcae35c6a2b0c54b5a6a89bba31566ec3b41f098c02e + "@typescript-eslint/types": "npm:5.62.0" + "@typescript-eslint/visitor-keys": "npm:5.62.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + semver: "npm:^7.3.7" + tsutils: "npm:^3.21.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 06c975eb5f44b43bd19fadc2e1023c50cf87038fe4c0dd989d4331c67b3ff509b17fa60a3251896668ab4d7322bdc56162a9926971218d2e1a1874d2bef9a52e languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.48.1, @typescript-eslint/utils@npm:^5.10.2": - version: 5.48.1 - resolution: "@typescript-eslint/utils@npm:5.48.1" - dependencies: - "@types/json-schema": ^7.0.9 - "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.48.1 - "@typescript-eslint/types": 5.48.1 - "@typescript-eslint/typescript-estree": 5.48.1 - eslint-scope: ^5.1.1 - eslint-utils: ^3.0.0 - semver: ^7.3.7 +"@typescript-eslint/utils@npm:6.18.1, @typescript-eslint/utils@npm:^6.2.0": + version: 6.18.1 + resolution: "@typescript-eslint/utils@npm:6.18.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@types/json-schema": "npm:^7.0.12" + "@types/semver": "npm:^7.5.0" + "@typescript-eslint/scope-manager": "npm:6.18.1" + "@typescript-eslint/types": "npm:6.18.1" + "@typescript-eslint/typescript-estree": "npm:6.18.1" + semver: "npm:^7.5.4" peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 2d112cbb6a920f147c6c3322e404ca3c56c1170e1ede3bcbf16fb779960dc24cdba688b1f2d06acd242859fc1dbc8702da5f8fa8bbf53e7081e41d80bec4c236 + eslint: ^7.0.0 || ^8.0.0 + checksum: 967728f062ec7ef434b9d05af6b45ae59e0f8f314e4aa7cefc8e2c30a277cf269b7913f3e9f8d26a86c3faf8b2c9385ba1221cfcd856e9b228421fc6508b41bc languageName: node linkType: hard @@ -1390,29 +1561,67 @@ __metadata: version: 4.33.0 resolution: "@typescript-eslint/visitor-keys@npm:4.33.0" dependencies: - "@typescript-eslint/types": 4.33.0 - eslint-visitor-keys: ^2.0.0 - checksum: 59953e474ad4610c1aa23b2b1a964445e2c6201521da6367752f37939d854352bbfced5c04ea539274065e012b1337ba3ffa49c2647a240a4e87155378ba9873 + "@typescript-eslint/types": "npm:4.33.0" + eslint-visitor-keys: "npm:^2.0.0" + checksum: b28cd3f2c5cd919587d576e0cec8a95ea6c12a2e22dfec59ce70714efad4a7af4d467f9f964dd4ba1a4ad82d4a8c680a6d397e621b9be9d1df89b3a95380813f + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" + dependencies: + "@typescript-eslint/types": "npm:5.62.0" + eslint-visitor-keys: "npm:^3.3.0" + checksum: dc613ab7569df9bbe0b2ca677635eb91839dfb2ca2c6fa47870a5da4f160db0b436f7ec0764362e756d4164e9445d49d5eb1ff0b87f4c058946ae9d8c92eb388 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.28.0" +"@typescript-eslint/visitor-keys@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.17.0" dependencies: - "@typescript-eslint/types": 5.28.0 - eslint-visitor-keys: ^3.3.0 - checksum: e97251968ea273ce33fa0de8a9c04426499b797f6f7800379ff880c4be6e6e02fe023038be0092c595be394a8636f73ee8911974214d5232b3d59492a50771bf + "@typescript-eslint/types": "npm:6.17.0" + eslint-visitor-keys: "npm:^3.4.1" + checksum: a2aed0e1437fdab8858ab9c7c8e355f8b72a5fa4b0adc54f28b8a2bbc29d4bb93214968ee940f83d013d0a4b83d00cd4eeeb05fb4c2c7d0ead324c6793f7d6d4 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/visitor-keys@npm:5.48.1" +"@typescript-eslint/visitor-keys@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/visitor-keys@npm:6.18.1" dependencies: - "@typescript-eslint/types": 5.48.1 - eslint-visitor-keys: ^3.3.0 - checksum: 2bda10cf4e6bc48b0d463767617e48a832d708b9434665dff6ed101f7d33e0d592f02af17a2259bde1bd17e666246448ae78d0fe006148cb93d897fff9b1d134 + "@typescript-eslint/types": "npm:6.18.1" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 2d6c5ffa52e89caec0b4958d7079fb4ca9f17c19b5f5d5b8446b4eef0079fd59cd9959f469cc13c4e7d72ef4c47849e561fe323f3cebafa01bc916d43082e57b + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: c6fe89a505e513a7592e1438280db1c075764793a2397877ff1351721fe8792a966a5359769e30242b3cd023f2efb9e63ca2ca88019d73b564488cc20e3eab12 + languageName: node + linkType: hard + +"@vercel/nft@npm:^0.24.4": + version: 0.24.4 + resolution: "@vercel/nft@npm:0.24.4" + dependencies: + "@mapbox/node-pre-gyp": "npm:^1.0.5" + "@rollup/pluginutils": "npm:^4.0.0" + acorn: "npm:^8.6.0" + async-sema: "npm:^3.1.1" + bindings: "npm:^1.4.0" + estree-walker: "npm:2.0.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.2" + node-gyp-build: "npm:^4.2.2" + resolve-from: "npm:^5.0.0" + bin: + nft: out/cli.js + checksum: e6614ff91854fd3989e1116dbedca46c9937f1f2086fc4acf8d52d42e1cc13c192fb81d9f6efbdbe19f706565c3a09952e47de96df999be96d6b8a9ff088c41c languageName: node linkType: hard @@ -1420,18 +1629,25 @@ __metadata: version: 1.3.5 resolution: "JSONStream@npm:1.3.5" dependencies: - jsonparse: ^1.2.0 - through: ">=2.2.7 <3" + jsonparse: "npm:^1.2.0" + through: "npm:>=2.2.7 <3" bin: JSONStream: ./bin.js - checksum: 2605fa124260c61bad38bb65eba30d2f72216a78e94d0ab19b11b4e0327d572b8d530c0c9cc3b0764f727ad26d39e00bf7ebad57781ca6368394d73169c59e46 + checksum: e30daf7b9b2da23076181d9a0e4bec33bc1d97e8c0385b949f1b16ba3366a1d241ec6f077850c01fe32379b5ebb8b96b65496984bc1545a93a5150bf4c267439 languageName: node linkType: hard -"abbrev@npm:^1.0.0": +"abbrev@npm:1": version: 1.1.1 resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 + checksum: 2d882941183c66aa665118bafdab82b7a177e9add5eb2776c33e960a4f3c89cff88a1b38aba13a456de01d0dd9d66a8bea7c903268b21ea91dd1097e1e2e8243 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: ca0a54e35bea4ece0ecb68a47b312e1a9a6f772408d5bcb9051230aaa94b0460671c5b5c9cb3240eb5b7bc94c52476550eb221f65a0bbd0145bdc9f3113a6707 languageName: node linkType: hard @@ -1439,9 +1655,9 @@ __metadata: version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: - mime-types: ~2.1.34 - negotiator: 0.6.3 - checksum: 50c43d32e7b50285ebe84b613ee4a3aa426715a7d131b65b786e2ead0fd76b6b60091b9916d3478a75f11f162628a2139991b6c03ab3f1d9ab7c86075dc8eab4 + mime-types: "npm:~2.1.34" + negotiator: "npm:0.6.3" + checksum: 67eaaa90e2917c58418e7a9b89392002d2b1ccd69bcca4799135d0c632f3b082f23f4ae4ddeedbced5aa59bcc7bdf4699c69ebed4593696c922462b7bc5744d6 languageName: node linkType: hard @@ -1450,23 +1666,23 @@ __metadata: resolution: "acorn-jsx@npm:5.3.2" peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + checksum: d4371eaef7995530b5b5ca4183ff6f062ca17901a6d3f673c9ac011b01ede37e7a1f7f61f8f5cfe709e88054757bb8f3277dc4061087cdf4f2a1f90ccbcdb977 languageName: node linkType: hard -"acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 +"acorn-walk@npm:^8.3.0": + version: 8.3.1 + resolution: "acorn-walk@npm:8.3.1" + checksum: 64187f1377afcba01ec6a57950e3f6a31fff50e429cdb9c9ab2c24343375e711f0d552e5fce5b6ecf21f754566e7526b6d79e4da80bd83c7ad15644d285b2ad5 languageName: node linkType: hard -"acorn@npm:^8.4.1, acorn@npm:^8.8.0, acorn@npm:^8.8.1": - version: 8.8.1 - resolution: "acorn@npm:8.8.1" +"acorn@npm:^8.11.2, acorn@npm:^8.6.0, acorn@npm:^8.9.0": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" bin: acorn: bin/acorn - checksum: 4079b67283b94935157698831967642f24a075c52ce3feaaaafe095776dfbe15d86a1b33b1e53860fc0d062ed6c83f4284a5c87c85b9ad51853a01173da6097f + checksum: b688e7e3c64d9bfb17b596e1b35e4da9d50553713b3b3630cf5690f2b023a84eac90c56851e6912b483fe60e8b4ea28b254c07e92f17ef83d72d78745a8352dd languageName: node linkType: hard @@ -1477,23 +1693,21 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:6, agent-base@npm:^6.0.2": +"agent-base@npm:6": version: 6.0.2 resolution: "agent-base@npm:6.0.2" dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + debug: "npm:4" + checksum: 21fb903e0917e5cb16591b4d0ef6a028a54b83ac30cd1fca58dece3d4e0990512a8723f9f83130d88a41e2af8b1f7be1386fda3ea2d181bb1a62155e75e95e23 languageName: node linkType: hard -"agentkeepalive@npm:^4.2.1": - version: 4.2.1 - resolution: "agentkeepalive@npm:4.2.1" +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" dependencies: - debug: ^4.1.0 - depd: ^1.1.2 - humanize-ms: ^1.2.1 - checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18 + debug: "npm:^4.3.4" + checksum: f7828f991470a0cc22cb579c86a18cbae83d8a3cbed39992ab34fc7217c4d126017f1c74d0ab66be87f71455318a8ea3e757d6a37881b8d0f2a2c6aa55e5418f languageName: node linkType: hard @@ -1501,8 +1715,8 @@ __metadata: version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 languageName: node linkType: hard @@ -1511,8 +1725,8 @@ __metadata: version: 4.0.1 resolution: "aggregate-error@npm:4.0.1" dependencies: - clean-stack: ^4.0.0 - indent-string: ^5.0.0 + clean-stack: "npm:^4.0.0" + indent-string: "npm:^5.0.0" checksum: bb3ffdfd13447800fff237c2cba752c59868ee669104bb995dfbbe0b8320e967d679e683dabb640feb32e4882d60258165cde0baafc4cd467cc7d275a13ad6b5 languageName: node linkType: hard @@ -1521,13 +1735,13 @@ __metadata: version: 5.0.0 resolution: "ajv-cli@npm:5.0.0" dependencies: - ajv: ^8.0.0 - fast-json-patch: ^2.0.0 - glob: ^7.1.0 - js-yaml: ^3.14.0 - json-schema-migrate: ^2.0.0 - json5: ^2.1.3 - minimist: ^1.2.0 + ajv: "npm:^8.0.0" + fast-json-patch: "npm:^2.0.0" + glob: "npm:^7.1.0" + js-yaml: "npm:^3.14.0" + json-schema-migrate: "npm:^2.0.0" + json5: "npm:^2.1.3" + minimist: "npm:^1.2.0" peerDependencies: ts-node: ">=9.0.0" peerDependenciesMeta: @@ -1535,19 +1749,19 @@ __metadata: optional: true bin: ajv: dist/index.js - checksum: e8ba29f618c653abba3a08d8784f8c882b5ac560dab587540af4d53d8230acb93af07c37165a0461294adb4015ba8ceb09916017a66754c782f950f9679ae94a + checksum: bd755f7f34602356c5c65bf947f3ba8d73b31859296b275eb3b112d2c14e125fcfca71bac9c8d4242a006fc62e9c868be3cf4652ebc6a8df08fe16f83ee9080c languageName: node linkType: hard -"ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:~6.12.6": +"ajv@npm:^6.12.4, ajv@npm:~6.12.6": version: 6.12.6 resolution: "ajv@npm:6.12.6" 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 - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 48d6ad21138d12eb4d16d878d630079a2bda25a04e745c07846a4ad768319533031e28872a9b3c5790fa1ec41aabdf2abed30a56e5a03ebc2cf92184b8ee306c languageName: node linkType: hard @@ -1555,11 +1769,11 @@ __metadata: version: 8.12.0 resolution: "ajv@npm:8.12.0" dependencies: - fast-deep-equal: ^3.1.1 - json-schema-traverse: ^1.0.0 - require-from-string: ^2.0.2 - uri-js: ^4.2.2 - checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + fast-deep-equal: "npm:^3.1.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.2.2" + checksum: b406f3b79b5756ac53bfe2c20852471b08e122bc1ee4cde08ae4d6a800574d9cd78d60c81c69c63ff81e4da7cd0b638fafbb2303ae580d49cf1600b9059efb85 languageName: node linkType: hard @@ -1567,8 +1781,8 @@ __metadata: version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: - type-fest: ^0.21.3 - checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 + type-fest: "npm:^0.21.3" + checksum: 8661034456193ffeda0c15c8c564a9636b0c04094b7f78bd01517929c17c504090a60f7a75f949f5af91289c264d3e1001d91492c1bd58efc8e100500ce04de2 languageName: node linkType: hard @@ -1586,11 +1800,18 @@ __metadata: languageName: node linkType: hard +"ansi-sequence-parser@npm:^1.1.0": + version: 1.1.1 + resolution: "ansi-sequence-parser@npm:1.1.1" + checksum: 9ce30f257badc2ef62cac8028a7e26c368d22bf26650427192e8ffd102da42e377e3affe90fae58062eecc963b0b055f510dde3b677c7e0c433c67069b5a8ee5 + languageName: node + linkType: hard + "ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" dependencies: - color-convert: ^1.9.0 + color-convert: "npm:^1.9.0" checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 languageName: node linkType: hard @@ -1599,56 +1820,46 @@ __metadata: version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + color-convert: "npm:^2.0.1" + checksum: b4494dfbfc7e4591b4711a396bd27e540f8153914123dccb4cdbbcb514015ada63a3809f362b9d8d4f6b17a706f1d7bea3c6f974b15fa5ae76b5b502070889ff languageName: node linkType: hard -"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.2.1": +"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": version: 6.2.1 resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + checksum: 70fdf883b704d17a5dfc9cde206e698c16bcd74e7f196ab821511651aee4f9f76c9514bdfa6ca3a27b5e49138b89cb222a28caf3afe4567570139577f991df32 languageName: node linkType: hard -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: ^3.0.0 - picomatch: ^2.0.4 - checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 +"any-promise@npm:^1.1.0": + version: 1.3.0 + resolution: "any-promise@npm:1.3.0" + checksum: 6737469ba353b5becf29e4dc3680736b9caa06d300bda6548812a8fee63ae7d336d756f88572fa6b5219aed36698d808fa55f62af3e7e6845c7a1dc77d240edb languageName: node linkType: hard "app-module-path@npm:^2.2.0": version: 2.2.0 resolution: "app-module-path@npm:2.2.0" - checksum: b52aa49cfa809efbad41b514222e8ef3f8ee9e147f5eccf79280b45eddcc61f7aeb302b0049474e3f42072dd53a28348c57dd96f36cd461d2e31cc8ab1ef56b5 + checksum: 9ed8c6ce6247a6b5d556039f29b4610869237bbb5b8f3d905b22bd2d314c30efcc0fb70c2626d7461ecc52ec7edec9908f660d0938d2bea5b8cfc6868a28806f languageName: node linkType: hard "aproba@npm:^1.0.3 || ^2.0.0": version: 2.0.0 resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 + checksum: c2b9a631298e8d6f3797547e866db642f68493808f5b37cd61da778d5f6ada890d16f668285f7d60bd4fc3b03889bd590ffe62cf81b700e9bb353431238a0a7b languageName: node linkType: hard -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" +"are-we-there-yet@npm:^2.0.0": + version: 2.0.0 + resolution: "are-we-there-yet@npm:2.0.0" dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 + delegates: "npm:^1.0.0" + readable-stream: "npm:^3.6.0" + checksum: ea6f47d14fc33ae9cbea3e686eeca021d9d7b9db83a306010dd04ad5f2c8b7675291b127d3fcbfcbd8fec26e47b3324ad5b469a6cc3733a582f2fe4e12fc6756 languageName: node linkType: hard @@ -1656,15 +1867,25 @@ __metadata: version: 1.0.10 resolution: "argparse@npm:1.0.10" dependencies: - sprintf-js: ~1.0.2 - checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 + sprintf-js: "npm:~1.0.2" + checksum: c6a621343a553ff3779390bb5ee9c2263d6643ebcd7843227bdde6cc7adbed796eb5540ca98db19e3fd7b4714e1faa51551f8849b268bb62df27ddb15cbcd91e languageName: node linkType: hard "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced + checksum: 18640244e641a417ec75a9bd38b0b2b6b95af5199aa241b131d4b2fb206f334d7ecc600bd194861610a5579084978bfcbb02baa399dbe442d56d0ae5e60dbaef + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "array-buffer-byte-length@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + is-array-buffer: "npm:^3.0.1" + checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 languageName: node linkType: hard @@ -1678,7 +1899,7 @@ __metadata: "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" - checksum: a9925bf3512d9dce202112965de90c222cd59a4fbfce68a0951d25d965cf44642931f40aac72309c41f12df19afa010ecadceb07cfff9ccc1621e99d89ab5f3b + checksum: e13c9d247241be82f8b4ec71d035ed7204baa82fae820d4db6948d30d3c4a9f2b3905eb2eec2b937d4aa3565200bd3a1c500480114cff649fa748747d2a50feb languageName: node linkType: hard @@ -1689,23 +1910,23 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.4": - version: 3.1.6 - resolution: "array-includes@npm:3.1.6" +"array-includes@npm:^3.1.7": + version: 3.1.7 + resolution: "array-includes@npm:3.1.7" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - get-intrinsic: ^1.1.3 - is-string: ^1.0.7 - checksum: f22f8cd8ba8a6448d91eebdc69f04e4e55085d09232b5216ee2d476dab3ef59984e8d1889e662c6a0ed939dcb1b57fd05b2c0209c3370942fc41b752c82a2ca5 + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + get-intrinsic: "npm:^1.2.1" + is-string: "npm:^1.0.7" + checksum: 856a8be5d118967665936ad33ff3b07adfc50b06753e596e91fb80c3da9b8c022e92e3cc6781156d6ad95db7109b9f603682c7df2d6a529ed01f7f6b39a4a360 languageName: node linkType: hard "array-timsort@npm:^1.0.3": version: 1.0.3 resolution: "array-timsort@npm:1.0.3" - checksum: fd4b5b0911214bdc8b5699ed10d309685551b518b3819c611c967cff59b87aee01cf591a10e36a3f14dbff696984bd6682b845f6fdbf1217195e910f241a4f78 + checksum: f417f073b3733baec3a80decdf5d45bf763f04676ef3610b0e71f9b1d88c6e4c38154c05b28b31529d308bfd0e043d08059fcd9df966245a1276af15b5584936 languageName: node linkType: hard @@ -1716,15 +1937,55 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.2.5": - version: 1.3.1 - resolution: "array.prototype.flat@npm:1.3.1" +"array.prototype.findlastindex@npm:^1.2.3": + version: 1.2.3 + resolution: "array.prototype.findlastindex@npm:1.2.3" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-shim-unscopables: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.1" + checksum: 063cbab8eeac3aa01f3e980eecb9a8c5d87723032b49f7f814ecc6d75c33c03c17e3f43a458127a62e16303cab412f95d6ad9dc7e0ae6d9dc27a9bb76c24df7a + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.2": + version: 1.3.2 + resolution: "array.prototype.flat@npm:1.3.2" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-shim-unscopables: "npm:^1.0.0" + checksum: d9d2f6f27584de92ec7995bc931103e6de722cd2498bdbfc4cba814fc3e52f056050a93be883018811f7c0a35875f5056584a0e940603a5e5934f0279896aebe + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.2": + version: 1.3.2 + resolution: "array.prototype.flatmap@npm:1.3.2" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-shim-unscopables: "npm:^1.0.0" + checksum: 33f20006686e0cbe844fde7fd290971e8366c6c5e3380681c2df15738b1df766dd02c7784034aeeb3b037f65c496ee54de665388288edb323a2008bb550f77ea + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.2": + version: 1.0.2 + resolution: "arraybuffer.prototype.slice@npm:1.0.2" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - es-shim-unscopables: ^1.0.0 - checksum: 5a8415949df79bf6e01afd7e8839bbde5a3581300e8ad5d8449dea52639e9e59b26a467665622783697917b43bf39940a6e621877c7dd9b3d1c1f97484b9b88b + array-buffer-byte-length: "npm:^1.0.0" + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + get-intrinsic: "npm:^1.2.1" + is-array-buffer: "npm:^3.0.2" + is-shared-array-buffer: "npm:^1.0.2" + checksum: c200faf437786f5b2c80d4564ff5481c886a16dee642ef02abdc7306c7edd523d1f01d1dd12b769c7eb42ac9bc53874510db19a92a2c035c0f6696172aafa5d3 languageName: node linkType: hard @@ -1752,21 +2013,35 @@ __metadata: "asmcrypto.js@npm:^2.3.2": version: 2.3.2 resolution: "asmcrypto.js@npm:2.3.2" - checksum: d61722be99d51c9a09093166412354845fb6ba278374b0cccfb33b18ad9edd26019ced171ae286b1d55c57edd8702fe87d2eec096f20fb2080ee52f8ba4b995e + checksum: 94b1e33cfd417005a941cb05044718879804756042d1c8aac2070d1a0db03ca5550340b56bbbcde2df1e1ca8042b48092bfd5690a56740d179902e3b26521f65 languageName: node linkType: hard "ast-module-types@npm:^2.7.1": version: 2.7.1 resolution: "ast-module-types@npm:2.7.1" - checksum: 6238647bcf34eeff2a1390cb60388da8a5064dd598acf48d68f8d972d9a332dc8d0382a5a7c511b16470e314b313bcbb95de4b0b669515393e043282c0489538 + checksum: f5ff6a8aec1ac93533bb5af6ab3921b7eb9f91032f6fdd7cb08e6917005649dc8d5dcdfc98016b7125450db6028da22ae6990275e0ecd6d1fcfe7f1cf5c83b8a languageName: node linkType: hard "ast-module-types@npm:^3.0.0": version: 3.0.0 resolution: "ast-module-types@npm:3.0.0" - checksum: c6ef35d9b286f84c7942aeb0e2b50e389e0b6f44ee3b6d2c46aeed4852dbca0681dde8c3c0ec1d456dad5dbc84fced2e1c607b10b4b4c3b065b901b40f45bbe7 + checksum: 9cf2e1c566ff88347762ba177dbe8a8bd3e59f366052d45c0a3b1afde2db2228a1c56f05a6e4d7fbfa219de26ae64831a138ff7533269310b13bb9e3a0e84c9f + languageName: node + linkType: hard + +"ast-module-types@npm:^4.0.0": + version: 4.0.0 + resolution: "ast-module-types@npm:4.0.0" + checksum: 06cf93519ef353bb580d90d87f0a9501f39ef99f79784e5291e59e30764c07b383018c153ff4020e9d1409030e9affd438dfca76c28d38400ba729addba8a54a + languageName: node + linkType: hard + +"async-sema@npm:^3.1.1": + version: 3.1.1 + resolution: "async-sema@npm:3.1.1" + checksum: ee0225c2e7b72ae76d66157499f61a881a050824019edc54fa6ec789313076790729557556fbbe237af0083173c66fb2edf1c9cc45c522c5f846b66c0a94ddb3 languageName: node linkType: hard @@ -1777,55 +2052,50 @@ __metadata: languageName: node linkType: hard -"ava@npm:^5.1.0": - version: 5.1.0 - resolution: "ava@npm:5.1.0" - dependencies: - acorn: ^8.8.1 - acorn-walk: ^8.2.0 - ansi-styles: ^6.2.1 - arrgv: ^1.0.2 - arrify: ^3.0.0 - callsites: ^4.0.0 - cbor: ^8.1.0 - chalk: ^5.1.2 - chokidar: ^3.5.3 - chunkd: ^2.0.1 - ci-info: ^3.6.1 - ci-parallel-vars: ^1.0.1 - clean-yaml-object: ^0.1.0 - cli-truncate: ^3.1.0 - code-excerpt: ^4.0.0 - common-path-prefix: ^3.0.0 - concordance: ^5.0.4 - currently-unhandled: ^0.4.1 - debug: ^4.3.4 - del: ^7.0.0 - emittery: ^1.0.1 - figures: ^5.0.0 - globby: ^13.1.2 - ignore-by-default: ^2.1.0 - indent-string: ^5.0.0 - is-error: ^2.2.2 - is-plain-object: ^5.0.0 - is-promise: ^4.0.0 - matcher: ^5.0.0 - mem: ^9.0.2 - ms: ^2.1.3 - p-event: ^5.0.1 - p-map: ^5.5.0 - picomatch: ^2.3.1 - pkg-conf: ^4.0.0 - plur: ^5.1.0 - pretty-ms: ^8.0.0 - resolve-cwd: ^3.0.0 - slash: ^3.0.0 - stack-utils: ^2.0.6 - strip-ansi: ^7.0.1 - supertap: ^3.0.1 - temp-dir: ^3.0.0 - write-file-atomic: ^5.0.0 - yargs: ^17.6.2 +"ava@npm:^6.0.1": + version: 6.0.1 + resolution: "ava@npm:6.0.1" + dependencies: + "@vercel/nft": "npm:^0.24.4" + acorn: "npm:^8.11.2" + acorn-walk: "npm:^8.3.0" + ansi-styles: "npm:^6.2.1" + arrgv: "npm:^1.0.2" + arrify: "npm:^3.0.0" + callsites: "npm:^4.1.0" + cbor: "npm:^9.0.1" + chalk: "npm:^5.3.0" + chunkd: "npm:^2.0.1" + ci-info: "npm:^4.0.0" + ci-parallel-vars: "npm:^1.0.1" + cli-truncate: "npm:^4.0.0" + code-excerpt: "npm:^4.0.0" + common-path-prefix: "npm:^3.0.0" + concordance: "npm:^5.0.4" + currently-unhandled: "npm:^0.4.1" + debug: "npm:^4.3.4" + emittery: "npm:^1.0.1" + figures: "npm:^6.0.1" + globby: "npm:^14.0.0" + ignore-by-default: "npm:^2.1.0" + indent-string: "npm:^5.0.0" + is-plain-object: "npm:^5.0.0" + is-promise: "npm:^4.0.0" + matcher: "npm:^5.0.0" + memoize: "npm:^10.0.0" + ms: "npm:^2.1.3" + p-map: "npm:^6.0.0" + package-config: "npm:^5.0.0" + picomatch: "npm:^3.0.1" + plur: "npm:^5.1.0" + pretty-ms: "npm:^8.0.0" + resolve-cwd: "npm:^3.0.0" + stack-utils: "npm:^2.0.6" + strip-ansi: "npm:^7.1.0" + supertap: "npm:^3.0.1" + temp-dir: "npm:^3.0.0" + write-file-atomic: "npm:^5.0.1" + yargs: "npm:^17.7.2" peerDependencies: "@ava/typescript": "*" peerDependenciesMeta: @@ -1833,14 +2103,14 @@ __metadata: optional: true bin: ava: entrypoints/cli.mjs - checksum: 5f0b7ebd2ee236fe7698bf85ce6c67f8e4aed841a23f0bcf5e13ed6614f8e94be4937330ac721060f333b18f6d370e5c644649a1a979b2962d039d904f43b364 + checksum: 0b7e71b047c61fd9e52eb5ee5946ed2a450425ac0060410ef964bd5b1842e1581a1e5f2a71f4b328ecb8f54fb53a51c8c80acda78de974890582c194ef6ebb7d languageName: node linkType: hard "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" - checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a + checksum: 4d4d5e86ea0425696f40717882f66a570647b94ac8d273ddc7549a9b61e5da099e149bf431530ccbd776bd74e02039eb8b5edf426e3e2211ee61af16698a9064 languageName: node linkType: hard @@ -1855,7 +2125,7 @@ __metadata: version: 3.0.9 resolution: "base-x@npm:3.0.9" dependencies: - safe-buffer: ^5.0.1 + safe-buffer: "npm:^5.0.1" checksum: 957101d6fd09e1903e846fd8f69fd7e5e3e50254383e61ab667c725866bec54e5ece5ba49ce385128ae48f9ec93a26567d1d5ebb91f4d56ef4a9cc0d5a5481e8 languageName: node linkType: hard @@ -1867,17 +2137,6 @@ __metadata: languageName: node linkType: hard -"bcrypto@npm:^5.4.0": - version: 5.4.0 - resolution: "bcrypto@npm:5.4.0" - dependencies: - bufio: ~1.0.7 - loady: ~0.0.5 - node-gyp: latest - checksum: 0618353afadd524ec3a9907dcbb2059ac37a953ae108fb524e80ded490373db567aebfaefd742351f86fd5099f09ea514950fb4853f8c81bae2802be0facbd1c - languageName: node - linkType: hard - "bech32@npm:=2.0.0": version: 2.0.0 resolution: "bech32@npm:2.0.0" @@ -1889,23 +2148,25 @@ __metadata: version: 2.1.4 resolution: "benchmark@npm:2.1.4" dependencies: - lodash: ^4.17.4 - platform: ^1.3.3 - checksum: aa466561d4f2b0a2419a3069b8f90fd35ffacf26849697eea9de525ecfbd10b44da11070cc51c88d772076db8cb2415641b493de7d6c024fdf8551019c6fcf1c + lodash: "npm:^4.17.4" + platform: "npm:^1.3.3" + checksum: 0f42f865aeb8b79992bb6204874312f9cb384e122f4fd3b20ba6d0bc7cff003610400fb37e52580a7b4aec4a3d1291c51b5ff887691b1abc80e9df4ff032a675 languageName: node linkType: hard "bigi@npm:^1.1.0, bigi@npm:^1.4.2": version: 1.4.2 resolution: "bigi@npm:1.4.2" - checksum: 82b5ed2c779b2065a269fd8233c39e26bef9e5b129ca1b66579d056de1f5e2627850ac42bd952c477b28560f216760709bf486078299efe617b1898c8ea70306 + checksum: e8165beb2ad113add286f81a066653295737a3edc6287effae7b72c2d7695be19d36774069e80a977df7187857c9e2c4a9517f6ec966bb887e097ea8d36cc2e0 languageName: node linkType: hard -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 +"bindings@npm:^1.4.0": + version: 1.5.0 + resolution: "bindings@npm:1.5.0" + dependencies: + file-uri-to-path: "npm:1.0.0" + checksum: 593d5ae975ffba15fbbb4788fe5abd1e125afbab849ab967ab43691d27d6483751805d98cb92f7ac24a2439a8a8678cd0131c535d5d63de84e383b0ce2786133 languageName: node linkType: hard @@ -1913,82 +2174,82 @@ __metadata: version: 0.6.4 resolution: "bip-schnorr@npm:0.6.4" dependencies: - bigi: ^1.4.2 - ecurve: ^1.0.6 - js-sha256: ^0.9.0 - randombytes: ^2.1.0 - safe-buffer: ^5.2.1 - checksum: c5b2f97924854bee5cb64e5b357a6d315678c1fbdf3879475d0bcdbf9d32a776158e5700de7e9c05ac11fdd55e2257f14d0b8864c25acb585f8b371feaad11f8 + bigi: "npm:^1.4.2" + ecurve: "npm:^1.0.6" + js-sha256: "npm:^0.9.0" + randombytes: "npm:^2.1.0" + safe-buffer: "npm:^5.2.1" + checksum: 913859c57264e51505b57706616949fae23a9c0546f5d414dfd72b62b87fb8b9fcfe7b2006ae3dd52f9a9f78cfb1dc30b0c2d5414dcced266fc074aaea01c146 languageName: node linkType: hard -"bitcore-lib-cash@npm:^8.25.40": - version: 8.25.40 - resolution: "bitcore-lib-cash@npm:8.25.40" +"bitcore-lib-cash@npm:^10.0.23": + version: 10.0.23 + resolution: "bitcore-lib-cash@npm:10.0.23" dependencies: - bitcore-lib: ^8.25.40 - bn.js: =4.11.8 - bs58: ^4.0.1 - buffer-compare: =1.1.1 - elliptic: ^6.5.3 - inherits: =2.0.1 - lodash: ^4.17.20 - checksum: 0cbc66f51dd6c8bfcc1d96f02ddcb982e6005686b0cbcbdf6fdb84d2cb0b818ccfef6b709ada4a32ab0f1d9bb958638f2f520ed73dcbfe2a00aca7fc153035c7 + bitcore-lib: "npm:^10.0.23" + bn.js: "npm:=4.11.8" + bs58: "npm:^4.0.1" + buffer-compare: "npm:=1.1.1" + elliptic: "npm:^6.5.3" + inherits: "npm:=2.0.1" + lodash: "npm:^4.17.20" + checksum: 03b9b0a5181da26dfaf8b6f60d9c0c59ceb3b6328c4aa55464fc93f8364d34e0b52b5d2f7f3a02fe45b3b90300a690de2dbd4da7030a683814b51e472a15b67e languageName: node linkType: hard -"bitcore-lib@npm:^8.25.40": - version: 8.25.40 - resolution: "bitcore-lib@npm:8.25.40" +"bitcore-lib@npm:^10.0.23": + version: 10.0.23 + resolution: "bitcore-lib@npm:10.0.23" dependencies: - bech32: =2.0.0 - bip-schnorr: =0.6.4 - bn.js: =4.11.8 - bs58: ^4.0.1 - buffer-compare: =1.1.1 - elliptic: ^6.5.3 - inherits: =2.0.1 - lodash: ^4.17.20 - checksum: f37221914c95e95a2fc48902dc6ff8599b2725a22e0cfdcdd289263f413bb5e0dd628533ff5de5fcf9ef3afca54f62c193d9a3def522f09d618bdaf425ab9ab4 + bech32: "npm:=2.0.0" + bip-schnorr: "npm:=0.6.4" + bn.js: "npm:=4.11.8" + bs58: "npm:^4.0.1" + buffer-compare: "npm:=1.1.1" + elliptic: "npm:^6.5.3" + inherits: "npm:=2.0.1" + lodash: "npm:^4.17.20" + checksum: d10c120aa7425fd7c6a0f46df946172c0eb2ffc4fb1c75d6b1d8c33e230db56702a7846e3764e55124c417835d9bdf8dbdc8d2736e1e688e01927aa001d46806 languageName: node linkType: hard -"bl@npm:^4.0.3, bl@npm:^4.1.0": +"bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" dependencies: - buffer: ^5.5.0 - inherits: ^2.0.4 - readable-stream: ^3.4.0 - checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: b7904e66ed0bdfc813c06ea6c3e35eafecb104369dbf5356d0f416af90c1546de3b74e5b63506f0629acf5e16a6f87c3798f16233dcff086e9129383aa02ab55 languageName: node linkType: hard "bluebird@npm:^3.4.0": version: 3.7.2 resolution: "bluebird@npm:3.7.2" - checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef + checksum: 007c7bad22c5d799c8dd49c85b47d012a1fe3045be57447721e6afbd1d5be43237af1db62e26cb9b0d9ba812d2e4ca3bac82f6d7e016b6b88de06ee25ceb96e7 languageName: node linkType: hard "blueimp-md5@npm:^2.10.0": version: 2.19.0 resolution: "blueimp-md5@npm:2.19.0" - checksum: 28095dcbd2c67152a2938006e8d7c74c3406ba6556071298f872505432feb2c13241b0476644160ee0a5220383ba94cb8ccdac0053b51f68d168728f9c382530 + checksum: 84dc5f86e0d890e50c067a52b85654ec02e56d019c6af88f5a2810b1353adfd37b09ae34f540ef5cd1f19fe0023cb69d0dd68877123044cc49fbf6e7ff4c9a18 languageName: node linkType: hard "bn.js@npm:=4.11.8": version: 4.11.8 resolution: "bn.js@npm:4.11.8" - checksum: 80d4709cd58a21f0be8201e9e5859fea5ef133318e9800c8454cd334625c6e1caea593ca21f9b9a085fb560fbc12fb2fb3514363f8604258db924237fd039139 + checksum: b498be9c0914dfe8e9892c1bb924a920ef8b5d4eeec3c9b670c92f55d6f20ba6342df0f6dc127da8a9917676f86edf1963c6048daa567aae53fde0356e1fabbf languageName: node linkType: hard "bn.js@npm:^4.11.9": version: 4.12.0 resolution: "bn.js@npm:4.12.0" - checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 + checksum: 10f8db196d3da5adfc3207d35d0a42aa29033eb33685f20ba2c36cadfe2de63dad05df0a20ab5aae01b418d1c4b3d4d205273085262fa020d17e93ff32b67527 languageName: node linkType: hard @@ -1996,19 +2257,19 @@ __metadata: version: 1.20.1 resolution: "body-parser@npm:1.20.1" dependencies: - bytes: 3.1.2 - content-type: ~1.0.4 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: ~1.6.18 - unpipe: 1.0.0 - checksum: f1050dbac3bede6a78f0b87947a8d548ce43f91ccc718a50dd774f3c81f2d8b04693e52acf62659fad23101827dd318da1fb1363444ff9a8482b886a3e4a5266 + bytes: "npm:3.1.2" + content-type: "npm:~1.0.4" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.11.0" + raw-body: "npm:2.5.1" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: 5f8d128022a2fb8b6e7990d30878a0182f300b70e46b3f9d358a9433ad6275f0de46add6d63206da3637c01c3b38b6111a7480f7e7ac2e9f7b989f6133fe5510 languageName: node linkType: hard @@ -2016,8 +2277,8 @@ __metadata: version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 languageName: node linkType: hard @@ -2026,17 +2287,17 @@ __metadata: version: 2.0.1 resolution: "brace-expansion@npm:2.0.1" dependencies: - balanced-match: ^1.0.0 + balanced-match: "npm:^1.0.0" checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": +"braces@npm:^3.0.2": version: 3.0.2 resolution: "braces@npm:3.0.2" dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + fill-range: "npm:^7.0.1" + checksum: 966b1fb48d193b9d155f810e5efd1790962f2c4e0829f8440b8ad236ba009222c501f70185ef732fef17a4c490bb33a03b90dab0631feafbdf447da91e8165b1 languageName: node linkType: hard @@ -2051,7 +2312,7 @@ __metadata: version: 4.0.1 resolution: "bs58@npm:4.0.1" dependencies: - base-x: ^3.0.2 + base-x: "npm:^3.0.2" checksum: b3c5365bb9e0c561e1a82f1a2d809a1a692059fae016be233a6127ad2f50a6b986467c3a50669ce4c18929dcccb297c5909314dd347a25a68c21b68eb3e95ac2 languageName: node linkType: hard @@ -2059,14 +2320,7 @@ __metadata: "buffer-compare@npm:=1.1.1": version: 1.1.1 resolution: "buffer-compare@npm:1.1.1" - checksum: fe9a25cdd0c878eb689d928de4f8d6d3b4062b2a2c92bd4a1f6a5dcd22de17a95604bd102d4590542b2eb13779762c009f3193e840092dc9ed2c0dad8b726655 - languageName: node - linkType: hard - -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c + checksum: dc5adc7406a25059ae9d2088d455bfaffeabad2c1540ad7d6d432ec257efa06ff8efc3e87d887ed46a042ac448fb1dba37e559e602753b63e097fdeac732369e languageName: node linkType: hard @@ -2077,82 +2331,77 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.2.1, buffer@npm:^5.5.0": +"buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: - base64-js: ^1.3.1 - ieee754: ^1.1.13 - checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 - languageName: node - linkType: hard - -"bufio@npm:~1.0.7": - version: 1.0.7 - resolution: "bufio@npm:1.0.7" - checksum: 4871b8060a8d3bc04de8722f5cc5575b77f4cb18af389eab62d51bf42b08f43fe75159126ef11f15fe4045dc8c20e0e344406ca8388cb1371e558b986e971a57 + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 997434d3c6e3b39e0be479a80288875f71cd1c07d75a3855e6f08ef848a3c966023f79534e22e415ff3a5112708ce06127277ab20e527146d55c84566405c7c6 languageName: node linkType: hard "builtin-modules@npm:^3.3.0": version: 3.3.0 resolution: "builtin-modules@npm:3.3.0" - checksum: db021755d7ed8be048f25668fe2117620861ef6703ea2c65ed2779c9e3636d5c3b82325bd912244293959ff3ae303afa3471f6a15bf5060c103e4cc3a839749d + checksum: 62e063ab40c0c1efccbfa9ffa31873e4f9d57408cb396a2649981a0ecbce56aabc93c28feaccbc5658c95aab2703ad1d11980e62ec2e5e72637404e1eb60f39e + languageName: node + linkType: hard + +"bundle-name@npm:^4.1.0": + version: 4.1.0 + resolution: "bundle-name@npm:4.1.0" + dependencies: + run-applescript: "npm:^7.0.0" + checksum: 1d966c8d2dbf4d9d394e53b724ac756c2414c45c01340b37743621f59cc565a435024b394ddcb62b9b335d1c9a31f4640eb648c3fec7f97ee74dc0694c9beb6c languageName: node linkType: hard "bytes@npm:3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" - checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e - languageName: node - linkType: hard - -"c8@npm:^7.12.0": - version: 7.12.0 - resolution: "c8@npm:7.12.0" - dependencies: - "@bcoe/v8-coverage": ^0.2.3 - "@istanbuljs/schema": ^0.1.3 - find-up: ^5.0.0 - foreground-child: ^2.0.0 - istanbul-lib-coverage: ^3.2.0 - istanbul-lib-report: ^3.0.0 - istanbul-reports: ^3.1.4 - rimraf: ^3.0.2 - test-exclude: ^6.0.0 - v8-to-istanbul: ^9.0.0 - yargs: ^16.2.0 - yargs-parser: ^20.2.9 + checksum: a10abf2ba70c784471d6b4f58778c0beeb2b5d405148e66affa91f23a9f13d07603d0a0354667310ae1d6dc141474ffd44e2a074be0f6e2254edb8fc21445388 + languageName: node + linkType: hard + +"c8@npm:^9.0.0": + version: 9.0.0 + resolution: "c8@npm:9.0.0" + dependencies: + "@bcoe/v8-coverage": "npm:^0.2.3" + "@istanbuljs/schema": "npm:^0.1.3" + find-up: "npm:^5.0.0" + foreground-child: "npm:^3.1.1" + istanbul-lib-coverage: "npm:^3.2.0" + istanbul-lib-report: "npm:^3.0.1" + istanbul-reports: "npm:^3.1.6" + test-exclude: "npm:^6.0.0" + v8-to-istanbul: "npm:^9.0.0" + yargs: "npm:^17.7.2" + yargs-parser: "npm:^21.1.1" bin: c8: bin/c8.js - checksum: 3b7fa9ad7cff2cb0bb579467e6b544498fbd46e9353a809ad3b8cf749df4beadd074cde277356b0552f3c8055b1b3ec3ebaf2209e9ad4bdefed92dbf64d283ab + checksum: 71ccdf112ed5e52d983f20e0453e5abe1a61d2240cc5affe465933fe9a4d010ac9a3276a969a7bbfa705ae7395ea705384569549e242cf0ffdc9bb68401de699 languageName: node linkType: hard -"cacache@npm:^16.1.0": - version: 16.1.3 - resolution: "cacache@npm:16.1.3" +"cacache@npm:^18.0.0": + version: 18.0.2 + resolution: "cacache@npm:18.0.2" dependencies: - "@npmcli/fs": ^2.1.0 - "@npmcli/move-file": ^2.0.0 - chownr: ^2.0.0 - fs-minipass: ^2.1.0 - glob: ^8.0.1 - infer-owner: ^1.0.4 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - mkdirp: ^1.0.4 - p-map: ^4.0.0 - promise-inflight: ^1.0.1 - rimraf: ^3.0.2 - ssri: ^9.0.0 - tar: ^6.1.11 - unique-filename: ^2.0.0 - checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: 5ca58464f785d4d64ac2019fcad95451c8c89bea25949f63acd8987fcc3493eaef1beccc0fa39e673506d879d3fc1ab420760f8a14f8ddf46ea2d121805a5e96 languageName: node linkType: hard @@ -2163,13 +2412,14 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": + version: 1.0.5 + resolution: "call-bind@npm:1.0.5" dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.1" + set-function-length: "npm:^1.1.1" + checksum: 246d44db6ef9bbd418828dbd5337f80b46be4398d522eded015f31554cbb2ea33025b0203b75c7ab05a1a255b56ef218880cca1743e4121e306729f9e414da39 languageName: node linkType: hard @@ -2180,10 +2430,10 @@ __metadata: languageName: node linkType: hard -"callsites@npm:^4.0.0": - version: 4.0.0 - resolution: "callsites@npm:4.0.0" - checksum: ad3c3a57328a539c0d671cf1ca500abf09461b762807fc545a132026bdf87705fee9c299e1adb38b133c29201a3b04fbf4f2b90d8fa1d9e00ef507e803737cf2 +"callsites@npm:^4.1.0": + version: 4.1.0 + resolution: "callsites@npm:4.1.0" + checksum: 4ad31de7b7615fa25bdab9c2373865209d2d5190f895cdf2e2f518bd1dafa7ebcda2e6e9cc9640f2dfde6b3893d82fa4359a78ffc27baad2503227553c6882fa languageName: node linkType: hard @@ -2191,22 +2441,10 @@ __metadata: version: 6.2.2 resolution: "camelcase-keys@npm:6.2.2" dependencies: - camelcase: ^5.3.1 - map-obj: ^4.0.0 - quick-lru: ^4.0.1 - checksum: 43c9af1adf840471e54c68ab3e5fe8a62719a6b7dbf4e2e86886b7b0ff96112c945736342b837bd2529ec9d1c7d1934e5653318478d98e0cf22c475c04658e2a - languageName: node - linkType: hard - -"camelcase-keys@npm:^7.0.0": - version: 7.0.2 - resolution: "camelcase-keys@npm:7.0.2" - dependencies: - camelcase: ^6.3.0 - map-obj: ^4.1.0 - quick-lru: ^5.1.1 - type-fest: ^1.2.1 - checksum: b5821cc48dd00e8398a30c5d6547f06837ab44de123f1b3a603d0a03399722b2fc67a485a7e47106eb02ef543c3b50c5ebaabc1242cde4b63a267c3258d2365b + camelcase: "npm:^5.3.1" + map-obj: "npm:^4.0.0" + quick-lru: "npm:^4.0.1" + checksum: c1999f5b6d03bee7be9a36e48eef3da9e93e51b000677348ec8d15d51fc4418375890fb6c7155e387322d2ebb2a2cdebf9cd96607a6753d1d6c170d9b1e2eed5 languageName: node linkType: hard @@ -2217,80 +2455,56 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^6.3.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d +"cbor@npm:^9.0.1": + version: 9.0.1 + resolution: "cbor@npm:9.0.1" + dependencies: + nofilter: "npm:^3.1.0" + checksum: fa1bdf233b7d8b95b991c7d3861b6bf300b0d62fcebda34e4cca53605d32585021e80ee00b52378f492da011ebde6b21d704ac5117c2c6cce30de0b6419d2372 languageName: node linkType: hard -"cbor@npm:^8.1.0": - version: 8.1.0 - resolution: "cbor@npm:8.1.0" +"chalk-template@npm:^1.1.0": + version: 1.1.0 + resolution: "chalk-template@npm:1.1.0" dependencies: - nofilter: ^3.1.0 - checksum: a90338435dc7b45cc01461af979e3bb6ddd4f2a08584c437586039cd5f2235014c06e49d664295debbfb3514d87b2f06728092ab6aa6175e2e85e9cd7dc0c1fd + chalk: "npm:^5.2.0" + checksum: 868aae8d4e7556ad2f35de4e04fe65dbe1ea6c5c80ad783f1c156d0a5c33f444c6814f49cbb68fe348c78e99daf2bcf566b47ad7e13603e4691ca78b2f422824 languageName: node linkType: hard -"chalk@npm:^2.0.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": +"chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: 3d1d103433166f6bfe82ac75724951b33769675252d8417317363ef9d54699b7c3b2d46671b772b893a8e50c3ece70c4b933c73c01e81bc60ea4df9b55afa303 languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: cb3f3e594913d63b1814d7ca7c9bafbf895f75fbf93b92991980610dfd7b48500af4e3a5d4e3a8f337990a96b168d7eb84ee55efdce965e2ee8efc20f8c8f139 languageName: node linkType: hard -"chalk@npm:^5.1.2": - version: 5.2.0 - resolution: "chalk@npm:5.2.0" - checksum: 03d8060277de6cf2fd567dc25fcf770593eb5bb85f460ce443e49255a30ff1242edd0c90a06a03803b0466ff0687a939b41db1757bec987113e83de89a003caa +"chalk@npm:^5.2.0, chalk@npm:^5.3.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 6373caaab21bd64c405bfc4bd9672b145647fc9482657b5ea1d549b3b2765054e9d3d928870cdf764fb4aad67555f5061538ff247b8310f110c5c888d92397ea languageName: node linkType: hard "chardet@npm:^0.7.0": version: 0.7.0 resolution: "chardet@npm:0.7.0" - checksum: 6fd5da1f5d18ff5712c1e0aed41da200d7c51c28f11b36ee3c7b483f3696dabc08927fc6b227735eb8f0e1215c9a8abd8154637f3eff8cada5959df7f58b024d - languageName: node - linkType: hard - -"chokidar@npm:^3.5.3": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - -"chownr@npm:^1.1.1": - version: 1.1.4 - resolution: "chownr@npm:1.1.4" - checksum: 115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d + checksum: b0ec668fba5eeec575ed2559a0917ba41a6481f49063c8445400e476754e0957ee09e44dc032310f526182b8f1bf25e9d4ed371f74050af7be1383e06bc44952 languageName: node linkType: hard @@ -2305,13 +2519,13 @@ __metadata: version: 1.2.0 resolution: "chuhai@npm:1.2.0" dependencies: - benchmark: ^2.1.0 - bluebird: ^3.4.0 - debug: ^2.2.0 - fn-name: ^2.0.1 - lodash: ^4.13.1 - stack-utils: ^0.4.0 - checksum: 3f80f954f400eaec62064cbf902aaa68028c842fc25d89a960f4aa416fe707984f4d9c92abd59ea48f585ba57a212fb265f47f0861fd8882f99c0522484aeb2a + benchmark: "npm:^2.1.0" + bluebird: "npm:^3.4.0" + debug: "npm:^2.2.0" + fn-name: "npm:^2.0.1" + lodash: "npm:^4.13.1" + stack-utils: "npm:^0.4.0" + checksum: fa2da111daf626c07c3efdc168bfd87163ee554c43b72a79ad621971e193023578b3ab5c59ff2dcfaddcfb34a5043c159996067a626043e6b15e67b29ab43639 languageName: node linkType: hard @@ -2322,10 +2536,10 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^3.6.1": - version: 3.7.1 - resolution: "ci-info@npm:3.7.1" - checksum: 72d93d5101ea1c186511277fbd8d06ae8a6e028cc2fb94361e92bf735b39c5ebd192e8d15a66ff8c4e3ed569f87c2f844e96f90e141b2de5c649f77ec34ff601 +"ci-info@npm:^4.0.0": + version: 4.0.0 + resolution: "ci-info@npm:4.0.0" + checksum: c983bb7ff1b06648f4a47432201abbd58291147d8ab5043dbb5c03e1a0e3fb2347f40d29b66a3044f28ffeb5dade01ac35aa6bd4e7464a44d9a49a3d7532415a languageName: node linkType: hard @@ -2347,24 +2561,17 @@ __metadata: version: 4.2.0 resolution: "clean-stack@npm:4.2.0" dependencies: - escape-string-regexp: 5.0.0 + escape-string-regexp: "npm:5.0.0" checksum: 373f656a31face5c615c0839213b9b542a0a48057abfb1df66900eab4dc2a5c6097628e4a0b5aa559cdfc4e66f8a14ea47be9681773165a44470ef5fb8ccc172 languageName: node linkType: hard -"clean-yaml-object@npm:^0.1.0": - version: 0.1.0 - resolution: "clean-yaml-object@npm:0.1.0" - checksum: 0374ad2f1fbd4984ecf56ebc62200092f6372b9ccf1b7971bb979c328fb12fe76e759fb1e8adc491c80b7b1861f9f00c7f19813dd2a0f49c88231422c70451f4 - languageName: node - linkType: hard - "clear-module@npm:^4.1.2": version: 4.1.2 resolution: "clear-module@npm:4.1.2" dependencies: - parent-module: ^2.0.0 - resolve-from: ^5.0.0 + parent-module: "npm:^2.0.0" + resolve-from: "npm:^5.0.0" checksum: 4931f0c461f5d7b9b79f62c2d1bc31c37f7f1d33b4e95eef7080a83955c0374f4c180f5a96cc4d63bbefc64a9aa5d12b155641109e8e489dfa50fd5820e5101f languageName: node linkType: hard @@ -2373,32 +2580,32 @@ __metadata: version: 3.1.0 resolution: "cli-cursor@npm:3.1.0" dependencies: - restore-cursor: ^3.1.0 + restore-cursor: "npm:^3.1.0" checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 languageName: node linkType: hard "cli-spinners@npm:^2.5.0": - version: 2.7.0 - resolution: "cli-spinners@npm:2.7.0" - checksum: a9afaf73f58d1f951fb23742f503631b3cf513f43f4c7acb1b640100eb76bfa16efbcd1994d149ffc6603a6d75dd3d4a516a76f125f90dce437de9b16fd0ee6f + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: a0a863f442df35ed7294424f5491fa1756bd8d2e4ff0c8736531d886cec0ece4d85e8663b77a5afaf1d296e3cbbebff92e2e99f52bbea89b667cbe789b994794 languageName: node linkType: hard -"cli-truncate@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-truncate@npm:3.1.0" +"cli-truncate@npm:^4.0.0": + version: 4.0.0 + resolution: "cli-truncate@npm:4.0.0" dependencies: - slice-ansi: ^5.0.0 - string-width: ^5.0.0 - checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a + slice-ansi: "npm:^5.0.0" + string-width: "npm:^7.0.0" + checksum: d5149175fd25ca985731bdeec46a55ec237475cf74c1a5e103baea696aceb45e372ac4acbaabf1316f06bd62e348123060f8191ffadfeedebd2a70a2a7fb199d languageName: node linkType: hard "cli-width@npm:^3.0.0": version: 3.0.0 resolution: "cli-width@npm:3.0.0" - checksum: 4c94af3769367a70e11ed69aa6095f1c600c0ff510f3921ab4045af961820d57c0233acfa8b6396037391f31b4c397e1f614d234294f979ff61430a6c166c3f6 + checksum: 8730848b04fb189666ab037a35888d191c8f05b630b1d770b0b0e4c920b47bb5cc14bddf6b8ffe5bfc66cee97c8211d4d18e756c1ffcc75d7dbe7e1186cd7826 languageName: node linkType: hard @@ -2406,10 +2613,10 @@ __metadata: version: 7.0.4 resolution: "cliui@npm:7.0.4" dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.0 - wrap-ansi: ^7.0.0 - checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.0" + wrap-ansi: "npm:^7.0.0" + checksum: db858c49af9d59a32d603987e6fddaca2ce716cd4602ba5a2bb3a5af1351eebe82aba8dff3ef3e1b331f7fa9d40ca66e67bdf8e7c327ce0ea959747ead65c0ef languageName: node linkType: hard @@ -2417,10 +2624,10 @@ __metadata: version: 8.0.1 resolution: "cliui@npm:8.0.1" dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.1 - wrap-ansi: ^7.0.0 - checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: eaa5561aeb3135c2cddf7a3b3f562fc4238ff3b3fc666869ef2adf264be0f372136702f16add9299087fb1907c2e4ec5dbfe83bd24bce815c70a80c6c1a2e950 languageName: node linkType: hard @@ -2435,7 +2642,7 @@ __metadata: version: 4.0.0 resolution: "code-excerpt@npm:4.0.0" dependencies: - convert-to-spaces: ^2.0.1 + convert-to-spaces: "npm:^2.0.1" checksum: d57137d8f4825879283a828cc02a1115b56858dc54ed06c625c8f67d6685d1becd2fbaa7f0ab19ecca1f5cca03f8c97bbc1f013cab40261e4d3275032e65efe9 languageName: node linkType: hard @@ -2444,8 +2651,8 @@ __metadata: version: 1.9.3 resolution: "color-convert@npm:1.9.3" dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + color-name: "npm:1.1.3" + checksum: ffa319025045f2973919d155f25e7c00d08836b6b33ea2d205418c59bd63a665d713c52d9737a9e0fe467fb194b40fbef1d849bae80d674568ee220a31ef3d10 languageName: node linkType: hard @@ -2453,8 +2660,8 @@ __metadata: version: 2.0.1 resolution: "color-convert@npm:2.0.1" dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + color-name: "npm:~1.1.4" + checksum: fa00c91b4332b294de06b443923246bccebe9fab1b253f7fe1772d37b06a2269b4039a85e309abe1fe11b267b11c08d1d0473fda3badd6167f57313af2887a64 languageName: node linkType: hard @@ -2472,40 +2679,47 @@ __metadata: languageName: node linkType: hard -"color-support@npm:^1.1.3": +"color-support@npm:^1.1.2": version: 1.1.3 resolution: "color-support@npm:1.1.3" bin: color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b + checksum: 4bcfe30eea1498fe1cabc852bbda6c9770f230ea0e4faf4611c5858b1b9e4dde3730ac485e65f54ca182f4c50b626c1bea7c8441ceda47367a54a818c248aa7a languageName: node linkType: hard "colors@npm:~1.2.1": version: 1.2.5 resolution: "colors@npm:1.2.5" - checksum: b6e23de735f68b72d5cdf6fd854ca43d1b66d82dcf54bda0b788083b910164a040f2c4edf23c670d36a7a2d8f1b7d6e62e3292703e4642691e6ccaa1c62d8f74 + checksum: fe30007df0f62abedc2726990d0951f19292d85686dffcc76fa96ee9dc4e1a987d50b34aa02796e88627709c54a52f07c057bf1da4b7302c06eda8e1afd2f09a + languageName: node + linkType: hard + +"commander@npm:^11.0.0, commander@npm:^11.1.0": + version: 11.1.0 + resolution: "commander@npm:11.1.0" + checksum: 66bd2d8a0547f6cb1d34022efb25f348e433b0e04ad76a65279b1b09da108f59a4d3001ca539c60a7a46ea38bcf399fc17d91adad76a8cf43845d8dcbaf5cda1 languageName: node linkType: hard "commander@npm:^2.16.0, commander@npm:^2.20.3, commander@npm:^2.8.1": version: 2.20.3 resolution: "commander@npm:2.20.3" - checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e + checksum: 90c5b6898610cd075984c58c4f88418a4fb44af08c1b1415e9854c03171bec31b336b7f3e4cefe33de994b3f12b03c5e2d638da4316df83593b9e82554e7e95b languageName: node linkType: hard "commander@npm:^7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" - checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc + checksum: 9973af10727ad4b44f26703bf3e9fdc323528660a7590efe3aa9ad5042b4584c0deed84ba443f61c9d6f02dade54a5a5d3c95e306a1e1630f8374ae6db16c06d languageName: node linkType: hard -"commander@npm:^9.4.1": +"commander@npm:^9.4.1, commander@npm:^9.5.0": version: 9.5.0 resolution: "commander@npm:9.5.0" - checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade + checksum: 41c49b3d0f94a1fbeb0463c85b13f15aa15a9e0b4d5e10a49c0a1d58d4489b549d62262b052ae0aa6cfda53299bee487bfe337825df15e342114dde543f82906 languageName: node linkType: hard @@ -2513,52 +2727,52 @@ __metadata: version: 4.2.3 resolution: "comment-json@npm:4.2.3" dependencies: - array-timsort: ^1.0.3 - core-util-is: ^1.0.3 - esprima: ^4.0.1 - has-own-prop: ^2.0.0 - repeat-string: ^1.6.1 - checksum: 7f8d26266b0d49de9661f6365cbcc373fee4f4d0f422a203dfb17ad8f3d84c5be5ded444874935a197cd03cff297c53fe48910256cb4171cb2e52a3e6b9d317c + array-timsort: "npm:^1.0.3" + core-util-is: "npm:^1.0.3" + esprima: "npm:^4.0.1" + has-own-prop: "npm:^2.0.0" + repeat-string: "npm:^1.6.1" + checksum: 97eb6ff8231653864cea5c7721636e823194f0322cd7f0faa6154a1c5b5eb1cab2ca60526bc36d5b39e7c2bcf7eb175b57fd8e44b1c398f0c70ea8c9a114e834 languageName: node linkType: hard "commitizen@npm:^4.0.3": - version: 4.2.6 - resolution: "commitizen@npm:4.2.6" - dependencies: - cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0 - dedent: 0.7.0 - detect-indent: 6.1.0 - find-node-modules: ^2.1.2 - find-root: 1.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - inquirer: 8.2.4 - is-utf8: ^0.2.1 - lodash: 4.17.21 - minimist: 1.2.6 - strip-bom: 4.0.0 - strip-json-comments: 3.1.1 + version: 4.3.0 + resolution: "commitizen@npm:4.3.0" + dependencies: + cachedir: "npm:2.3.0" + cz-conventional-changelog: "npm:3.3.0" + dedent: "npm:0.7.0" + detect-indent: "npm:6.1.0" + find-node-modules: "npm:^2.1.2" + find-root: "npm:1.1.0" + fs-extra: "npm:9.1.0" + glob: "npm:7.2.3" + inquirer: "npm:8.2.5" + is-utf8: "npm:^0.2.1" + lodash: "npm:4.17.21" + minimist: "npm:1.2.7" + strip-bom: "npm:4.0.0" + strip-json-comments: "npm:3.1.1" bin: commitizen: bin/commitizen cz: bin/git-cz git-cz: bin/git-cz - checksum: 4423b25900a02d10e6a6aa98d58404bad0c0c2a68bbeff1ef2379c1ef04344a1fecdaaac3e773988d460de93c8ed4325d1afc186a01f904f7f27edcffcccfd49 + checksum: 45a82b7fdeb901654b39de37567995ef99c6e33e02406b25dd1059a75f880d9cd593fa4d52a32b2e70baef8754bb32c1bf8e5b9d9336f32087bf7f451cb3f72c languageName: node linkType: hard "common-path-prefix@npm:^3.0.0": version: 3.0.0 resolution: "common-path-prefix@npm:3.0.0" - checksum: fdb3c4f54e51e70d417ccd950c07f757582de800c0678ca388aedefefc84982039f346f9fd9a1252d08d2da9e9ef4019f580a1d1d3a10da031e4bb3c924c5818 + checksum: 09c180e8d8495d42990d617f4d4b7522b5da20f6b236afe310192d401d1da8147a7835ae1ea37797ba0c2238ef3d06f3492151591451df34539fdb4b2630f2b3 languageName: node linkType: hard "commondir@npm:^1.0.1": version: 1.0.1 resolution: "commondir@npm:1.0.1" - checksum: 59715f2fc456a73f68826285718503340b9f0dd89bfffc42749906c5cf3d4277ef11ef1cca0350d0e79204f00f1f6d83851ececc9095dc88512a697ac0b9bdcb + checksum: 4620bc4936a4ef12ce7dfcd272bb23a99f2ad68889a4e4ad766c9f8ad21af982511934d6f7050d4a8bde90011b1c15d56e61a1b4576d9913efbf697a20172d6c languageName: node linkType: hard @@ -2566,8 +2780,8 @@ __metadata: version: 2.0.0 resolution: "compare-func@npm:2.0.0" dependencies: - array-ify: ^1.0.0 - dot-prop: ^5.1.0 + array-ify: "npm:^1.0.0" + dot-prop: "npm:^5.1.0" checksum: fb71d70632baa1e93283cf9d80f30ac97f003aabee026e0b4426c9716678079ef5fea7519b84d012cbed938c476493866a38a79760564a9e21ae9433e40e6f0d languageName: node linkType: hard @@ -2575,7 +2789,7 @@ __metadata: "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + checksum: 9680699c8e2b3af0ae22592cb764acaf973f292a7b71b8a06720233011853a58e256c89216a10cbe889727532fd77f8bcd49a760cedfde271b8e006c20e079f2 languageName: node linkType: hard @@ -2583,11 +2797,11 @@ __metadata: version: 2.0.0 resolution: "concat-stream@npm:2.0.0" dependencies: - buffer-from: ^1.0.0 - inherits: ^2.0.3 - readable-stream: ^3.0.2 - typedarray: ^0.0.6 - checksum: d7f75d48f0ecd356c1545d87e22f57b488172811b1181d96021c7c4b14ab8855f5313280263dca44bb06e5222f274d047da3e290a38841ef87b59719bde967c7 + buffer-from: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.0.2" + typedarray: "npm:^0.0.6" + checksum: 250e576d0617e7c58e1c4b2dd6fe69560f316d2c962a409f9f3aac794018499ddb31948b1e4296f217008e124cd5d526432097745157fe504b5d9f3dc469eadb languageName: node linkType: hard @@ -2595,36 +2809,35 @@ __metadata: version: 5.0.4 resolution: "concordance@npm:5.0.4" dependencies: - date-time: ^3.1.0 - esutils: ^2.0.3 - fast-diff: ^1.2.0 - js-string-escape: ^1.0.1 - lodash: ^4.17.15 - md5-hex: ^3.0.1 - semver: ^7.3.2 - well-known-symbols: ^2.0.0 - checksum: 749153ba711492feb7c3d2f5bb04c107157440b3e39509bd5dd19ee7b3ac751d1e4cd75796d9f702e0a713312dbc661421c68aa4a2c34d5f6d91f47e3a1c64a6 + date-time: "npm:^3.1.0" + esutils: "npm:^2.0.3" + fast-diff: "npm:^1.2.0" + js-string-escape: "npm:^1.0.1" + lodash: "npm:^4.17.15" + md5-hex: "npm:^3.0.1" + semver: "npm:^7.3.2" + well-known-symbols: "npm:^2.0.0" + checksum: 156bb786746c2f0f821fd8339da2e38f4307e30ad9c078c24e636892a3c98ae5fcabf8812ff4baa54f1fcd4d88e9efe3050279d928abd524f48d551be26814c2 languageName: node linkType: hard -"configstore@npm:^5.0.1": - version: 5.0.1 - resolution: "configstore@npm:5.0.1" +"configstore@npm:^6.0.0": + version: 6.0.0 + resolution: "configstore@npm:6.0.0" dependencies: - dot-prop: ^5.2.0 - graceful-fs: ^4.1.2 - make-dir: ^3.0.0 - unique-string: ^2.0.0 - write-file-atomic: ^3.0.0 - xdg-basedir: ^4.0.0 - checksum: 60ef65d493b63f96e14b11ba7ec072fdbf3d40110a94fb7199d1c287761bdea5c5244e76b2596325f30c1b652213aa75de96ea20afd4a5f82065e61ea090988e + dot-prop: "npm:^6.0.1" + graceful-fs: "npm:^4.2.6" + unique-string: "npm:^3.0.0" + write-file-atomic: "npm:^3.0.3" + xdg-basedir: "npm:^5.0.1" + checksum: 81995351c10bc04c58507f17748477aeac6f47465109d20e3534cebc881d22e927cfd29e73dd852c46c55f62c2b7be4cd1fe6eb3a93ba51f7f9813c218f9bae0 languageName: node linkType: hard -"console-control-strings@npm:^1.1.0": +"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed + checksum: 27b5fa302bc8e9ae9e98c03c66d76ca289ad0c61ce2fe20ab288d288bee875d217512d2edb2363fc83165e88f1c405180cf3f5413a46e51b4fe1a004840c6cdb languageName: node linkType: hard @@ -2632,15 +2845,15 @@ __metadata: version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: - safe-buffer: 5.2.1 - checksum: afb9d545e296a5171d7574fcad634b2fdf698875f4006a9dd04a3e1333880c5c0c98d47b560d01216fb6505a54a2ba6a843ee3a02ec86d7e911e8315255f56c3 + safe-buffer: "npm:5.2.1" + checksum: b7f4ce176e324f19324be69b05bf6f6e411160ac94bc523b782248129eb1ef3be006f6cff431aaea5e337fe5d176ce8830b8c2a1b721626ead8933f0cbe78720 languageName: node linkType: hard "content-type@npm:~1.0.4": - version: 1.0.4 - resolution: "content-type@npm:1.0.4" - checksum: 3d93585fda985d1554eca5ebd251994327608d2e200978fdbfba21c0c679914d5faf266d17027de44b34a72c7b0745b18584ecccaa7e1fdfb6a68ac7114f12e0 + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 585847d98dc7fb8035c02ae2cb76c7a9bd7b25f84c447e5ed55c45c2175e83617c8813871b4ee22f368126af6b2b167df655829007b21aa10302873ea9c62662 languageName: node linkType: hard @@ -2648,9 +2861,9 @@ __metadata: version: 5.0.13 resolution: "conventional-changelog-angular@npm:5.0.13" dependencies: - compare-func: ^2.0.0 - q: ^1.5.1 - checksum: 6ed4972fce25a50f9f038c749cc9db501363131b0fb2efc1fccecba14e4b1c80651d0d758d4c350a609f32010c66fa343eefd49c02e79e911884be28f53f3f90 + compare-func: "npm:^2.0.0" + q: "npm:^1.5.1" + checksum: e7ee31ac703bc139552a735185f330d1b2e53d7c1ff40a78bf43339e563d95c290a4f57e68b76bb223345524702d80bf18dc955417cd0852d9457595c04ad8ce languageName: node linkType: hard @@ -2658,8 +2871,8 @@ __metadata: version: 2.0.8 resolution: "conventional-changelog-atom@npm:2.0.8" dependencies: - q: ^1.5.1 - checksum: 12ecbd928f8c261f9afaac067fcc0cf10ff6ac8505e4285dc3d9959ee072a8937ac942d505e850dce27c4527046009adb22b498ba0b10802916d2c7d2dc1f7bc + q: "npm:^1.5.1" + checksum: 53ae65ef33913538085f4cdda4904384a7b17374342efc2f34ad697569cb2011b2327d744ef5750ea651d27bfd401a166f9b6b5c2dc8564b38346910593dfae0 languageName: node linkType: hard @@ -2667,15 +2880,15 @@ __metadata: version: 2.0.8 resolution: "conventional-changelog-codemirror@npm:2.0.8" dependencies: - q: ^1.5.1 - checksum: cf331db40cc54c2353b0189aba26a2b959cb08b059bf2a81245272027371519c9acc90d574295782985829c50f0c52da60c952c70ec6dbd70e9e17affeb61453 + q: "npm:^1.5.1" + checksum: 45183dcb16fa19fe8bc6cc1affc34ea856150e826fe83579f52b5b934f83fe71df64094a8061ccdb2890b94c9dc01a97d04618c88fa6ee58a1ac7f82067cad11 languageName: node linkType: hard "conventional-changelog-config-spec@npm:2.1.0": version: 2.1.0 resolution: "conventional-changelog-config-spec@npm:2.1.0" - checksum: 1c3bec23e3558e25ba0f2884ef1c1266afa70084f156b90045dde654504af3d8f3e88ad1c0dd6c1aaf2f394069d6e8b39da8cab319bc2d8ca0c80e8042a8a33c + checksum: 90b76c6393942bed173f50d667d912a995a6b258aa611fce78773b23e61ab5e5b43e08f0487828255f05fd88ada9f6ba8f8569569ee9405cbaf69392c65cc6e9 languageName: node linkType: hard @@ -2683,10 +2896,10 @@ __metadata: version: 4.6.3 resolution: "conventional-changelog-conventionalcommits@npm:4.6.3" dependencies: - compare-func: ^2.0.0 - lodash: ^4.17.15 - q: ^1.5.1 - checksum: 7b8e8a21ebb56f9aaa510e12917b7c609202072c3e71089e0a09630c37c2e8146cdb04364809839b0e3eb55f807fe84d03b2079500b37f6186d505848be5c562 + compare-func: "npm:^2.0.0" + lodash: "npm:^4.17.15" + q: "npm:^1.5.1" + checksum: 70b9ba65a72d57d40aeea7e787cd200cd8350430ad959892a6cc2cb8b9c3874ba8e331d355c2565549c0a28881c114c5a8f1d4dab61fd8607f29d7e2174e181b languageName: node linkType: hard @@ -2694,21 +2907,21 @@ __metadata: version: 4.2.4 resolution: "conventional-changelog-core@npm:4.2.4" dependencies: - add-stream: ^1.0.0 - conventional-changelog-writer: ^5.0.0 - conventional-commits-parser: ^3.2.0 - dateformat: ^3.0.0 - get-pkg-repo: ^4.0.0 - git-raw-commits: ^2.0.8 - git-remote-origin-url: ^2.0.0 - git-semver-tags: ^4.1.1 - lodash: ^4.17.15 - normalize-package-data: ^3.0.0 - q: ^1.5.1 - read-pkg: ^3.0.0 - read-pkg-up: ^3.0.0 - through2: ^4.0.0 - checksum: 56d5194040495ea316e53fd64cb3614462c318f0fe54b1bf25aba6fba9b3d51cb9fdf7ac5b766f17e5529a3f90e317257394e00b0a9a5ce42caf3a59f82afb3a + add-stream: "npm:^1.0.0" + conventional-changelog-writer: "npm:^5.0.0" + conventional-commits-parser: "npm:^3.2.0" + dateformat: "npm:^3.0.0" + get-pkg-repo: "npm:^4.0.0" + git-raw-commits: "npm:^2.0.8" + git-remote-origin-url: "npm:^2.0.0" + git-semver-tags: "npm:^4.1.1" + lodash: "npm:^4.17.15" + normalize-package-data: "npm:^3.0.0" + q: "npm:^1.5.1" + read-pkg: "npm:^3.0.0" + read-pkg-up: "npm:^3.0.0" + through2: "npm:^4.0.0" + checksum: c8104986724ec384baa559425485bd7834bb94a12e5d52b71b4829eddf664895be4c6269504a83788179959e60e40ba2fcbdb474cc70606ba7ce06b61e016726 languageName: node linkType: hard @@ -2716,8 +2929,8 @@ __metadata: version: 2.0.9 resolution: "conventional-changelog-ember@npm:2.0.9" dependencies: - q: ^1.5.1 - checksum: 30c7bd48ce995e39fc91bcd8c719b2bee10cb408c246a6a7de6cec44a3ca12afe5a86f57f55aa1fd2c64beb484c68013d16658047e6273f130c1c80e7dad38e9 + q: "npm:^1.5.1" + checksum: 87faf4223079a8089c8377fc77a01a567c6f58b46e9699143cc3125301ae520a69cd132a847d26b218871e7a0e074303764ee2da03d019c691f498a0abcfd32c languageName: node linkType: hard @@ -2725,8 +2938,8 @@ __metadata: version: 3.0.9 resolution: "conventional-changelog-eslint@npm:3.0.9" dependencies: - q: ^1.5.1 - checksum: 402ae73a8c5390405d4f902819f630f56fa7dfa8f6bef77b3b5f2fb7c8bd17f64ad83edbacc030cfef5b84400ab722d4f166dd906296a4d286e66205c1bd8a3f + q: "npm:^1.5.1" + checksum: f12f82adaeb6353fa04ab7ff4c245373edefdead215b901ac7c15b51dc6c3fb00ea8fbbaa1a393803aba9d3bdf89fd5125167850ccc3f42260f403e6b2f0cde8 languageName: node linkType: hard @@ -2734,8 +2947,8 @@ __metadata: version: 2.0.6 resolution: "conventional-changelog-express@npm:2.0.6" dependencies: - q: ^1.5.1 - checksum: c139fa9878971455cce9904a195d92f770679d24a88ef07a016a6954e28f0f237ec59e45f2591b2fc9b8e10fd46c30150ddf0ce50a2cb03be85cae0ee64d4cdd + q: "npm:^1.5.1" + checksum: 08db048159e9bd140a4c607c17023d37ab29aeb5f31bd62388cb8e7c647e39c6e44d181e1cfb8ef7c36ea0ec240aa9a1bf0e8400c872ae654a0d8d1f4e8caccb languageName: node linkType: hard @@ -2743,8 +2956,8 @@ __metadata: version: 3.0.11 resolution: "conventional-changelog-jquery@npm:3.0.11" dependencies: - q: ^1.5.1 - checksum: df1145467c75e8e61f35ed24d7539e8b7dcdc810b86267b0173420c8955590cca139eb51f89ac255d70c632433d996b0ed227cb1acdf59537f3d2f4ad9c770d3 + q: "npm:^1.5.1" + checksum: 18720ee26785aa0e31b0098b0b85779f4e7410d6eb3c7a7cfb0ea5c5125b970e11ac18a2d5b414806286fc389047c8592d792cbe47ed17a49e4661bd9aac1c74 languageName: node linkType: hard @@ -2752,9 +2965,9 @@ __metadata: version: 2.0.9 resolution: "conventional-changelog-jshint@npm:2.0.9" dependencies: - compare-func: ^2.0.0 - q: ^1.5.1 - checksum: ec96144b75fdb84c4a6f7db9b671dc258d964cd7aa35f9b00539e42bbe05601a9127c17cf0dcc315ae81a0dd20fe795d9d41dd90373928d24b33f065728eb2e2 + compare-func: "npm:^2.0.0" + q: "npm:^1.5.1" + checksum: 42e16d0e41464619c68eefa00efdb9787a2be4923c33a1d607e5e281c3326491cc3674a67191ba8bd3cbdbe2a820de532622a8c6c9a10eae1639c48da458ab01 languageName: node linkType: hard @@ -2769,18 +2982,18 @@ __metadata: version: 5.0.1 resolution: "conventional-changelog-writer@npm:5.0.1" dependencies: - conventional-commits-filter: ^2.0.7 - dateformat: ^3.0.0 - handlebars: ^4.7.7 - json-stringify-safe: ^5.0.1 - lodash: ^4.17.15 - meow: ^8.0.0 - semver: ^6.0.0 - split: ^1.0.0 - through2: ^4.0.0 + conventional-commits-filter: "npm:^2.0.7" + dateformat: "npm:^3.0.0" + handlebars: "npm:^4.7.7" + json-stringify-safe: "npm:^5.0.1" + lodash: "npm:^4.17.15" + meow: "npm:^8.0.0" + semver: "npm:^6.0.0" + split: "npm:^1.0.0" + through2: "npm:^4.0.0" bin: conventional-changelog-writer: cli.js - checksum: 5c0129db44577f14b1f8de225b62a392a9927ba7fe3422cb21ad71a771b8472bd03badb7c87cb47419913abc3f2ce3759b69f59550cdc6f7a7b0459015b3b44c + checksum: 09703c3fcea24753ac79dd408fad391f64b7e48c6b3813d0429e6ed25b72aec5235400cf9f182400520ad193598983a81345ad817ca9c37ae289ef70975ae0c6 languageName: node linkType: hard @@ -2788,25 +3001,25 @@ __metadata: version: 3.1.25 resolution: "conventional-changelog@npm:3.1.25" dependencies: - conventional-changelog-angular: ^5.0.12 - conventional-changelog-atom: ^2.0.8 - conventional-changelog-codemirror: ^2.0.8 - conventional-changelog-conventionalcommits: ^4.5.0 - conventional-changelog-core: ^4.2.1 - conventional-changelog-ember: ^2.0.9 - conventional-changelog-eslint: ^3.0.9 - conventional-changelog-express: ^2.0.6 - conventional-changelog-jquery: ^3.0.11 - conventional-changelog-jshint: ^2.0.9 - conventional-changelog-preset-loader: ^2.3.4 - checksum: 1ea18378120cca9fd459f58ed2cf59170773cbfb2fcecad2504c7c44af076c368950013fa16f5e9428f1d723bea4c16e0c48170e152568b73b254a9c1bb93287 + conventional-changelog-angular: "npm:^5.0.12" + conventional-changelog-atom: "npm:^2.0.8" + conventional-changelog-codemirror: "npm:^2.0.8" + conventional-changelog-conventionalcommits: "npm:^4.5.0" + conventional-changelog-core: "npm:^4.2.1" + conventional-changelog-ember: "npm:^2.0.9" + conventional-changelog-eslint: "npm:^3.0.9" + conventional-changelog-express: "npm:^2.0.6" + conventional-changelog-jquery: "npm:^3.0.11" + conventional-changelog-jshint: "npm:^2.0.9" + conventional-changelog-preset-loader: "npm:^2.3.4" + checksum: 27f4651ec70d24ca45f8b12b88c81ac258ab0912044ea6dc701dd4119df326d9094919d032b2f4ab366f41aa70480d759398f910f6534975ace1989f7935b790 languageName: node linkType: hard "conventional-commit-types@npm:^3.0.0": version: 3.0.0 resolution: "conventional-commit-types@npm:3.0.0" - checksum: b9552de6a310c91a271ee57a890ed70d2d94340e710fc33856aaca5b24928fb2162f04dda5484d155b68c1fbaa042d904014d7fad0b6751a6d68052a0616015d + checksum: 1c6d9b9693b5c40b67b86780d15baf607b4893c3014aa857015ab59d0c8915bf67cdf0d6def820c0d157da796ad75ca9c9174a642a936db18072683f58d40666 languageName: node linkType: hard @@ -2814,9 +3027,9 @@ __metadata: version: 2.0.7 resolution: "conventional-commits-filter@npm:2.0.7" dependencies: - lodash.ismatch: ^4.4.0 - modify-values: ^1.0.0 - checksum: feb567f680a6da1baaa1ef3cff393b3c56a5828f77ab9df5e70626475425d109a6fee0289b4979223c62bbd63bf9c98ef532baa6fcb1b66ee8b5f49077f5d46c + lodash.ismatch: "npm:^4.4.0" + modify-values: "npm:^1.0.0" + checksum: c7e25df941047750324704ca61ea281cbc156d359a1bd8587dc5e9e94311fa8343d97be9f1115b2e3948624830093926992a2854ae1ac8cbc560e60e360fdd9b languageName: node linkType: hard @@ -2824,15 +3037,15 @@ __metadata: version: 3.2.4 resolution: "conventional-commits-parser@npm:3.2.4" dependencies: - JSONStream: ^1.0.4 - is-text-path: ^1.0.1 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 + JSONStream: "npm:^1.0.4" + is-text-path: "npm:^1.0.1" + lodash: "npm:^4.17.15" + meow: "npm:^8.0.0" + split2: "npm:^3.0.0" + through2: "npm:^4.0.0" bin: conventional-commits-parser: cli.js - checksum: 1627ff203bc9586d89e47a7fe63acecf339aba74903b9114e23d28094f79d4e2d6389bf146ae561461dcba8fc42e7bc228165d2b173f15756c43f1d32bc50bfd + checksum: 2f9d31bade60ae68c1296ae67e47099c547a9452e1670fc5bfa64b572cadc9f305797c88a855f064dd899cc4eb4f15dd5a860064cdd8c52085066538019fe2a5 languageName: node linkType: hard @@ -2840,24 +3053,24 @@ __metadata: version: 6.1.0 resolution: "conventional-recommended-bump@npm:6.1.0" dependencies: - concat-stream: ^2.0.0 - conventional-changelog-preset-loader: ^2.3.4 - conventional-commits-filter: ^2.0.7 - conventional-commits-parser: ^3.2.0 - git-raw-commits: ^2.0.8 - git-semver-tags: ^4.1.1 - meow: ^8.0.0 - q: ^1.5.1 + concat-stream: "npm:^2.0.0" + conventional-changelog-preset-loader: "npm:^2.3.4" + conventional-commits-filter: "npm:^2.0.7" + conventional-commits-parser: "npm:^3.2.0" + git-raw-commits: "npm:^2.0.8" + git-semver-tags: "npm:^4.1.1" + meow: "npm:^8.0.0" + q: "npm:^1.5.1" bin: conventional-recommended-bump: cli.js - checksum: da1d7a5f3b9f7706bede685cdcb3db67997fdaa43c310fd5bf340955c84a4b85dbb9427031522ee06dad290b730a54be987b08629d79c73720dbad3a2531146b + checksum: 5561a4163e097b502e5372420ae9eee240a2b0e00e8cca3f5d8a7110c35021a5fe61a18d457961ace815d58beecc0192ebd26da40c6affcfc038be2d3a5f77c4 languageName: node linkType: hard -"convert-source-map@npm:^1.6.0": - version: 1.9.0 - resolution: "convert-source-map@npm:1.9.0" - checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: c987be3ec061348cdb3c2bfb924bec86dea1eacad10550a85ca23edb0fe3556c3a61c7399114f3331ccb3499d7fd0285ab24566e5745929412983494c3926e15 languageName: node linkType: hard @@ -2878,7 +3091,7 @@ __metadata: "cookie@npm:0.5.0": version: 0.5.0 resolution: "cookie@npm:0.5.0" - checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180 + checksum: aae7911ddc5f444a9025fbd979ad1b5d60191011339bce48e555cb83343d0f98b865ff5c4d71fecdfb8555a5cafdc65632f6fce172f32aaf6936830a883a0380 languageName: node linkType: hard @@ -2889,83 +3102,72 @@ __metadata: languageName: node linkType: hard -"cosmiconfig-typescript-loader@npm:^4.0.0": - version: 4.3.0 - resolution: "cosmiconfig-typescript-loader@npm:4.3.0" +"cosmiconfig-typescript-loader@npm:^5.0.0": + version: 5.0.0 + resolution: "cosmiconfig-typescript-loader@npm:5.0.0" + dependencies: + jiti: "npm:^1.19.1" peerDependencies: "@types/node": "*" - cosmiconfig: ">=7" - ts-node: ">=10" - typescript: ">=3" - checksum: ea61dfd8e112cf2bb18df0ef89280bd3ae3dd5b997b4a9fc22bbabdc02513aadfbc6d4e15e922b6a9a5d987e9dad42286fa38caf77a9b8dcdbe7d4ce1c9db4fb + cosmiconfig: ">=8.2" + typescript: ">=4" + checksum: ccbb367fe92e623207cb33a85c1fe2e2b592e2af845b38c39c0781e0b05c1a72642eec9bea1ed589d0ac95b47c5d1f232f43cbbe0f68b6218f7d887d9813f850 languageName: node linkType: hard -"cosmiconfig@npm:8.0.0, cosmiconfig@npm:^8.0.0": - version: 8.0.0 - resolution: "cosmiconfig@npm:8.0.0" +"cosmiconfig@npm:^8.3.6": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" dependencies: - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - parse-json: ^5.0.0 - path-type: ^4.0.0 - checksum: ff4cdf89ac1ae52e7520816622c21a9e04380d04b82d653f5139ec581aa4f7f29e096d46770bc76c4a63c225367e88a1dfa233ea791669a35101f5f9b972c7d1 + import-fresh: "npm:^3.3.0" + js-yaml: "npm:^4.1.0" + parse-json: "npm:^5.2.0" + path-type: "npm:^4.0.0" + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 91d082baca0f33b1c085bf010f9ded4af43cbedacba8821da0fb5667184d0a848addc52c31fadd080007f904a555319c238cf5f4c03e6d58ece2e4876b2e73d6 languageName: node linkType: hard -"cp-file@npm:^9.1.0": - version: 9.1.0 - resolution: "cp-file@npm:9.1.0" +"cp-file@npm:^10.0.0": + version: 10.0.0 + resolution: "cp-file@npm:10.0.0" dependencies: - graceful-fs: ^4.1.2 - make-dir: ^3.0.0 - nested-error-stacks: ^2.0.0 - p-event: ^4.1.0 - checksum: 0ba0fb568baf502676fe15d0869f06703fc108d892bc2dd42097f9019c0215b83b4663b0ee4af5c1048c6d52530c67dfcfe855474be3532b559c4e0f549acb7a + graceful-fs: "npm:^4.2.10" + nested-error-stacks: "npm:^2.1.1" + p-event: "npm:^5.0.1" + checksum: 9b2432e35f4200ae55b5d120755998a49548813380ea34431c6a1ca148a1df4416fb3a80af14baa926cf4bf021173bce49d5ab7dd51fca4a31c402de39a3fc92 languageName: node linkType: hard -"cpy-cli@npm:^4.2.0": - version: 4.2.0 - resolution: "cpy-cli@npm:4.2.0" +"cpy-cli@npm:^5.0.0": + version: 5.0.0 + resolution: "cpy-cli@npm:5.0.0" dependencies: - cpy: ^9.0.0 - meow: ^10.1.2 + cpy: "npm:^10.1.0" + meow: "npm:^12.0.1" bin: cpy: cli.js - checksum: 883b142133fad9b57f10cf36483870c28e99bff34d4c166946e7bc26de1ec2786fca2e5102a061f7ff1fc73e5beaf90191f8a72eabdc3a4c97bd7f93e1fd793e - languageName: node - linkType: hard - -"cpy@npm:^9.0.0": - version: 9.0.1 - resolution: "cpy@npm:9.0.1" - dependencies: - arrify: ^3.0.0 - cp-file: ^9.1.0 - globby: ^13.1.1 - junk: ^4.0.0 - micromatch: ^4.0.4 - nested-error-stacks: ^2.1.0 - p-filter: ^3.0.0 - p-map: ^5.3.0 - checksum: 5139dfc07d181caefe3ec62c956340a1d02c4afeb794f8c199ddfc7e0cb0bdf5f5e4989ec08d6c07984be119bbb07eb323f21e8edb0733051ddf125a1084b565 - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + checksum: f575e8e80262320c1b7c8ff57546a7dff69dcef892ac9dd381b9ec2418c5ecd5bdda5f6c6a900566af087c2167db57ae25521b66efe34dd59d8a41b16c4e5f96 languageName: node linkType: hard -"cross-fetch@npm:3.1.5": - version: 3.1.5 - resolution: "cross-fetch@npm:3.1.5" +"cpy@npm:^10.1.0": + version: 10.1.0 + resolution: "cpy@npm:10.1.0" dependencies: - node-fetch: 2.6.7 - checksum: f6b8c6ee3ef993ace6277fd789c71b6acf1b504fd5f5c7128df4ef2f125a429e29cd62dc8c127523f04a5f2fa4771ed80e3f3d9695617f441425045f505cf3bb + arrify: "npm:^3.0.0" + cp-file: "npm:^10.0.0" + globby: "npm:^13.1.4" + junk: "npm:^4.0.1" + micromatch: "npm:^4.0.5" + nested-error-stacks: "npm:^2.1.1" + p-filter: "npm:^3.0.0" + p-map: "npm:^6.0.0" + checksum: 39da11b58b3a6fb7a849a59108fc42113cb8f8f64899d9e44719686b37b720050218b66f04b9be5d12d152c7b4d19314dbed187dfe63bb7a79e0da6f9e322b74 languageName: node linkType: hard @@ -2973,17 +3175,10 @@ __metadata: version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"crypto-random-string@npm:^2.0.0": - version: 2.0.0 - resolution: "crypto-random-string@npm:2.0.0" - checksum: 0283879f55e7c16fdceacc181f87a0a65c53bc16ffe1d58b9d19a6277adcd71900d02bb2c4843dd55e78c51e30e89b0fec618a7f170ebcc95b33182c28f05fd6 + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: e1a13869d2f57d974de0d9ef7acbf69dc6937db20b918525a01dacb5032129bd552d290d886d981e99f1b624cb03657084cc87bd40f115c07ecf376821c729ce languageName: node linkType: hard @@ -2991,131 +3186,143 @@ __metadata: version: 4.0.0 resolution: "crypto-random-string@npm:4.0.0" dependencies: - type-fest: ^1.0.1 - checksum: 91f148f27bcc8582798f0fb3e75a09d9174557f39c3c40a89dd1bd70fb5a14a02548245aa26fa7d663c426ac5026f4729841231c84f9e30e8c8ece5e38656741 - languageName: node - linkType: hard - -"cspell-dictionary@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-dictionary@npm:6.18.1" - dependencies: - "@cspell/cspell-pipe": 6.18.1 - "@cspell/cspell-types": 6.18.1 - cspell-trie-lib: 6.18.1 - fast-equals: ^4.0.3 - gensequence: ^4.0.3 - checksum: f6c90ba9356fcf61361474126588988b5cd535b21751ced7b8af64e22eff33a53459b89ba7d54a80a7f8fe6babd59c6224e334bdf734c17a9ad85d09387908a1 + type-fest: "npm:^1.0.1" + checksum: cd5d7ae13803de53680aaed4c732f67209af5988cbeec5f6b29082020347c2d8849ca921b2008be7d6bd1d9d198c3c3697e7441d6d0d3da1bf51e9e4d2032149 languageName: node linkType: hard -"cspell-gitignore@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-gitignore@npm:6.18.1" +"cspell-config-lib@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-config-lib@npm:8.3.2" dependencies: - cspell-glob: 6.18.1 - find-up: ^5.0.0 - bin: - cspell-gitignore: bin.js - checksum: f9b3141fbe435fdd7003bc3ba3586bfc40ac304d6cc44c19326660e678cc251379e7c2bd689a6ea985be743ca840bb56f58b41d9e3d3bf847bfe064b63ff883b + "@cspell/cspell-types": "npm:8.3.2" + comment-json: "npm:^4.2.3" + yaml: "npm:^2.3.4" + checksum: 7d5563c2a49f13e9e2b965258f8d5539e282c75234f4375831db3f7ee3c209aa246f07f8bbbc7e7195c248edfdc3a58cb590c5119ad866446ee47df07a593481 languageName: node linkType: hard -"cspell-glob@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-glob@npm:6.18.1" +"cspell-dictionary@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-dictionary@npm:8.3.2" dependencies: - micromatch: ^4.0.5 - checksum: d2ffde4df6dc41b0ae728b96dab45db0b908deac143928ac5f028e0c02b2beae6c7dd6a105d79e05ad54cd2ff0d845dde27d17dbbaf4230ad9af185258b7f861 + "@cspell/cspell-pipe": "npm:8.3.2" + "@cspell/cspell-types": "npm:8.3.2" + cspell-trie-lib: "npm:8.3.2" + fast-equals: "npm:^5.0.1" + gensequence: "npm:^6.0.0" + checksum: a1135e5245816fc7bfdaa5cdbb59da6aebdd464de305487c069a591f8efe90f1d9dcb039bb9e0e0395b6019f9c3bcdf99454b048a85f2e6a27976131ea299f10 languageName: node linkType: hard -"cspell-grammar@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-grammar@npm:6.18.1" +"cspell-gitignore@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-gitignore@npm:8.3.2" dependencies: - "@cspell/cspell-pipe": 6.18.1 - "@cspell/cspell-types": 6.18.1 + cspell-glob: "npm:8.3.2" + find-up-simple: "npm:^1.0.0" bin: - cspell-grammar: bin.js - checksum: fc7120d20ea5e04df9b35f28502d6d550a1a1b298ab1cda56a3bf302ea85fafeeb8aff19d3f4411ba950b9ff1ae26b23d6de9ceab39217dc04ea144cbcd33e5b + cspell-gitignore: bin.mjs + checksum: bc9eed57f90a37b84019295770daa1c11a7992359798fd3b52873c44252947841e87a89e5d16dcce19f06528f67b37a77cc3de5bb3dccea33c1a5fe97a8ddf36 languageName: node linkType: hard -"cspell-io@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-io@npm:6.18.1" +"cspell-glob@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-glob@npm:8.3.2" dependencies: - "@cspell/cspell-service-bus": 6.18.1 - node-fetch: ^2.6.7 - checksum: 1374c78d8a091a14684b1c0fbf6fb84fdabe28430ad9282f0111d2de8c04d261bf809c9c8f8deaa4628f6db63ae93247a532b093ec13771a2ecd10d6fb696313 + micromatch: "npm:^4.0.5" + checksum: 99e666f232a2d69db53b8bb26961a0a43c94275c80a84982e7245e9517679d35a596c36ca84e6c7003cc230ada31bdf2d60ce0449a600be87e9082704994ad23 languageName: node linkType: hard -"cspell-lib@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-lib@npm:6.18.1" - dependencies: - "@cspell/cspell-bundled-dicts": 6.18.1 - "@cspell/cspell-pipe": 6.18.1 - "@cspell/cspell-types": 6.18.1 - "@cspell/strong-weak-map": 6.18.1 - clear-module: ^4.1.2 - comment-json: ^4.2.3 - configstore: ^5.0.1 - cosmiconfig: ^8.0.0 - cspell-dictionary: 6.18.1 - cspell-glob: 6.18.1 - cspell-grammar: 6.18.1 - cspell-io: 6.18.1 - cspell-trie-lib: 6.18.1 - fast-equals: ^4.0.3 - find-up: ^5.0.0 - fs-extra: ^11.1.0 - gensequence: ^4.0.3 - import-fresh: ^3.3.0 - resolve-from: ^5.0.0 - resolve-global: ^1.0.0 - vscode-languageserver-textdocument: ^1.0.8 - vscode-uri: ^3.0.7 - checksum: 4927cb1f06af6046972e00a3178e10be1c53f519c49be2aaabd4d9339e0cb302420268022a4f0d7fd2781f45af67cb3e449355bc489f188026d5bebc43cbb78c - languageName: node - linkType: hard - -"cspell-trie-lib@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-trie-lib@npm:6.18.1" +"cspell-grammar@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-grammar@npm:8.3.2" dependencies: - "@cspell/cspell-pipe": 6.18.1 - "@cspell/cspell-types": 6.18.1 - fs-extra: ^11.1.0 - gensequence: ^4.0.3 - checksum: 11916cec6e23e971f18e84678b306fcb630cbd6b459d392cf888841b234ade665dd053cc1b5a692b7341c33f3c3abd5966ed48ee6df82fa4a26569dcc1b4b179 - languageName: node - linkType: hard - -"cspell@npm:^6.18.1": - version: 6.18.1 - resolution: "cspell@npm:6.18.1" - dependencies: - "@cspell/cspell-pipe": 6.18.1 - chalk: ^4.1.2 - commander: ^9.4.1 - cspell-gitignore: 6.18.1 - cspell-glob: 6.18.1 - cspell-lib: 6.18.1 - fast-json-stable-stringify: ^2.1.0 - file-entry-cache: ^6.0.1 - fs-extra: ^11.1.0 - get-stdin: ^8.0.0 - glob: ^8.0.3 - imurmurhash: ^0.1.4 - semver: ^7.3.8 - strip-ansi: ^6.0.1 - vscode-uri: ^3.0.7 + "@cspell/cspell-pipe": "npm:8.3.2" + "@cspell/cspell-types": "npm:8.3.2" + bin: + cspell-grammar: bin.mjs + checksum: 296f72bad3fddb1984f55a9aa5002630727a6b29152f67a2fe32d6bb55a220b04ca2f81d5825452b24e196df28d1ad84da9c169368ab91278fa6556fb9758404 + languageName: node + linkType: hard + +"cspell-io@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-io@npm:8.3.2" + dependencies: + "@cspell/cspell-service-bus": "npm:8.3.2" + checksum: 08310b96e75945baeb92992971cdcf7a6a82da210828d517753f278b03814eb20a384348b59d4f7c8fe9fda40b4e9c5e43ab7166efc6114969f702ad8c5bcd8a + languageName: node + linkType: hard + +"cspell-lib@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-lib@npm:8.3.2" + dependencies: + "@cspell/cspell-bundled-dicts": "npm:8.3.2" + "@cspell/cspell-pipe": "npm:8.3.2" + "@cspell/cspell-resolver": "npm:8.3.2" + "@cspell/cspell-types": "npm:8.3.2" + "@cspell/dynamic-import": "npm:8.3.2" + "@cspell/strong-weak-map": "npm:8.3.2" + clear-module: "npm:^4.1.2" + comment-json: "npm:^4.2.3" + configstore: "npm:^6.0.0" + cspell-config-lib: "npm:8.3.2" + cspell-dictionary: "npm:8.3.2" + cspell-glob: "npm:8.3.2" + cspell-grammar: "npm:8.3.2" + cspell-io: "npm:8.3.2" + cspell-trie-lib: "npm:8.3.2" + fast-equals: "npm:^5.0.1" + gensequence: "npm:^6.0.0" + import-fresh: "npm:^3.3.0" + resolve-from: "npm:^5.0.0" + vscode-languageserver-textdocument: "npm:^1.0.11" + vscode-uri: "npm:^3.0.8" + checksum: 24b938911bb6e0c30781c9e1f68244956cfbb665ae34774d7c7c66f64ccb5e5a08b9ba36ceb6649272b2df451cee7e3b24d5275fe69f13708d4d59589dae96e9 + languageName: node + linkType: hard + +"cspell-trie-lib@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-trie-lib@npm:8.3.2" + dependencies: + "@cspell/cspell-pipe": "npm:8.3.2" + "@cspell/cspell-types": "npm:8.3.2" + gensequence: "npm:^6.0.0" + checksum: 5653183024675b55ecd10a269db7471169820a92defb89cb2f2789af373e2863825dd035c46a14b7c967626fc38bf59a0604fb563f83e8a1e931e6c3cf958411 + languageName: node + linkType: hard + +"cspell@npm:^8.3.2": + version: 8.3.2 + resolution: "cspell@npm:8.3.2" + dependencies: + "@cspell/cspell-json-reporter": "npm:8.3.2" + "@cspell/cspell-pipe": "npm:8.3.2" + "@cspell/cspell-types": "npm:8.3.2" + "@cspell/dynamic-import": "npm:8.3.2" + chalk: "npm:^5.3.0" + chalk-template: "npm:^1.1.0" + commander: "npm:^11.1.0" + cspell-gitignore: "npm:8.3.2" + cspell-glob: "npm:8.3.2" + cspell-io: "npm:8.3.2" + cspell-lib: "npm:8.3.2" + fast-glob: "npm:^3.3.2" + fast-json-stable-stringify: "npm:^2.1.0" + file-entry-cache: "npm:^8.0.0" + get-stdin: "npm:^9.0.0" + semver: "npm:^7.5.4" + strip-ansi: "npm:^7.1.0" + vscode-uri: "npm:^3.0.8" bin: - cspell: bin.js - checksum: 44cda81bd43d8453f4f081d63203290f84356c573e6e09a40a63c690367071cb5b2a335881c627d537df6cf9f39da93ffab1153dd46b715e5d257418bf4275fe + cspell: bin.mjs + cspell-esm: bin.mjs + checksum: fc5e243ff405896718d0c9c20270de1e4a3d0fc92defbde2b5e2cb60168b2e5ef8b5bc49d72dcd91f61dd484afe3fcb9fab8f0a5f865182aaf2b079308d40ae9 languageName: node linkType: hard @@ -3123,8 +3330,8 @@ __metadata: version: 0.4.1 resolution: "currently-unhandled@npm:0.4.1" dependencies: - array-find-index: ^1.0.1 - checksum: 1f59fe10b5339b54b1a1eee110022f663f3495cf7cf2f480686e89edc7fa8bfe42dbab4b54f85034bc8b092a76cc7becbc2dad4f9adad332ab5831bec39ad540 + array-find-index: "npm:^1.0.1" + checksum: 53fb803e582737bdb5de6b150f0924dd9abf7be606648b4c2871db1c682bf288e248e8066ef10548979732a680cfb6c047294e3877846c2cf2f8d40437d8a741 languageName: node linkType: hard @@ -3132,17 +3339,17 @@ __metadata: version: 3.3.0 resolution: "cz-conventional-changelog@npm:3.3.0" dependencies: - "@commitlint/load": ">6.1.1" - chalk: ^2.4.1 - commitizen: ^4.0.3 - conventional-commit-types: ^3.0.0 - lodash.map: ^4.5.1 - longest: ^2.0.1 - word-wrap: ^1.0.3 + "@commitlint/load": "npm:>6.1.1" + chalk: "npm:^2.4.1" + commitizen: "npm:^4.0.3" + conventional-commit-types: "npm:^3.0.0" + lodash.map: "npm:^4.5.1" + longest: "npm:^2.0.1" + word-wrap: "npm:^1.0.3" dependenciesMeta: "@commitlint/load": optional: true - checksum: 8b766712092142ecec86c5c8a2a7206d0b2da46ae16e137303c6d75b42c048acd831c734fd542b9c3cbeb0fd8e7d1f5391494ed629dfba4459fee2d6f5d2c0ca + checksum: 790c201a7fbbf082f780fa0542843a3f85bb6894d29194e544440edaacc727ad9c11cfd526de766bf8e1c89ddec66bc7d489e2b2af2bcf092022b554f3d1ee73 languageName: node linkType: hard @@ -3157,7 +3364,7 @@ __metadata: version: 3.1.0 resolution: "date-time@npm:3.1.0" dependencies: - time-zone: ^1.0.0 + time-zone: "npm:^1.0.0" checksum: f9cfcd1b15dfeabab15c0b9d18eb9e4e2d9d4371713564178d46a8f91ad577a290b5178b80050718d02d9c0cf646f8a875011e12d1ed05871e9f72c72c8a8fe6 languageName: node linkType: hard @@ -3165,28 +3372,28 @@ __metadata: "dateformat@npm:^3.0.0": version: 3.0.3 resolution: "dateformat@npm:3.0.3" - checksum: ca4911148abb09887bd9bdcd632c399b06f3ecad709a18eb594d289a1031982f441e08e281db77ffebcb2cbcbfa1ac578a7cbfbf8743f41009aa5adc1846ed34 + checksum: 0504baf50c3777ad333c96c37d1673d67efcb7dd071563832f70b5cbf7f3f4753f18981d44bfd8f665d5e5a511d2fc0af8e0ead8b585b9b3ddaa90067864d3f0 languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.6.9": +"debug@npm:2.6.9, debug@npm:^2.2.0": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: - ms: 2.0.0 - checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 + ms: "npm:2.0.0" + checksum: e07005f2b40e04f1bd14a3dd20520e9c4f25f60224cb006ce9d6781732c917964e9ec029fc7f1a151083cd929025ad5133814d4dc624a9aaf020effe4914ed14 languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: - ms: 2.1.2 + ms: "npm:2.1.2" peerDependenciesMeta: supports-color: optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + checksum: 0073c3bcbd9cb7d71dd5f6b55be8701af42df3e56e911186dfa46fac3a5b9eb7ce7f377dd1d3be6db8977221f8eb333d945216f645cf56f6b688cd484837d255 languageName: node linkType: hard @@ -3194,8 +3401,8 @@ __metadata: version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: - ms: ^2.1.1 - checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c + ms: "npm:^2.1.1" + checksum: d86fd7be2b85462297ea16f1934dc219335e802f629ca9a69b63ed8ed041dda492389bb2ee039217c02e5b54792b1c51aa96ae954cf28634d363a2360c7a1639 languageName: node linkType: hard @@ -3203,9 +3410,9 @@ __metadata: version: 1.1.1 resolution: "decamelize-keys@npm:1.1.1" dependencies: - decamelize: ^1.1.0 - map-obj: ^1.0.0 - checksum: fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 + decamelize: "npm:^1.1.0" + map-obj: "npm:^1.0.0" + checksum: 71d5898174f17a8d2303cecc98ba0236e842948c4d042a8180d5e749be8442220bca2d16dd93bebd7b49e86c807814273212e4da0fae67be7c58c282ff76057a languageName: node linkType: hard @@ -3216,13 +3423,6 @@ __metadata: languageName: node linkType: hard -"decamelize@npm:^5.0.0": - version: 5.0.1 - resolution: "decamelize@npm:5.0.1" - checksum: 7c3b1ed4b3e60e7fbc00a35fb248298527c1cdfe603e41dfcf05e6c4a8cb9efbee60630deb677ed428908fb4e74e322966c687a094d1478ddc9c3a74e9dc7140 - languageName: node - linkType: hard - "dedent@npm:0.7.0": version: 0.7.0 resolution: "dedent@npm:0.7.0" @@ -3237,24 +3437,41 @@ __metadata: languageName: node linkType: hard -"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": +"deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + checksum: ec12d074aef5ae5e81fa470b9317c313142c9e8e2afe3f8efa124db309720db96d1d222b82b84c834e5f87e7a614b44a4684b6683583118b87c833b3be40d4d8 languageName: node linkType: hard -"deepmerge-ts@npm:^4.0.3": - version: 4.2.2 - resolution: "deepmerge-ts@npm:4.2.2" - checksum: 137c3650519d9b1a220db7e23a3f56304cd02e7f97b2b8392e2767251055a29318425bacdb2ab2ff175a4645f7179643acf0e038d5dafbfdbc11bdf322f79697 +"deepmerge-ts@npm:^5.1.0": + version: 5.1.0 + resolution: "deepmerge-ts@npm:5.1.0" + checksum: 0f615ccfb27b93a286abc315d7d1ec171f1befe9c511c2799ca7184c11fc6a6f29f5368d446c6885338de0d95cf6cb66a5ff4c55141a1265012730bd69408cf9 languageName: node linkType: hard "deepmerge@npm:^4.2.2": - version: 4.2.2 - resolution: "deepmerge@npm:4.2.2" - checksum: a8c43a1ed8d6d1ed2b5bf569fa4c8eb9f0924034baf75d5d406e47e157a451075c4db353efea7b6bcc56ec48116a8ce72fccf867b6e078e7c561904b5897530b + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 058d9e1b0ff1a154468bf3837aea436abcfea1ba1d165ddaaf48ca93765fdd01a30d33c36173da8fbbed951dd0a267602bc782fe288b0fc4b7e1e7091afc4529 + languageName: node + linkType: hard + +"default-browser-id@npm:^5.0.0": + version: 5.0.0 + resolution: "default-browser-id@npm:5.0.0" + checksum: 185bfaecec2c75fa423544af722a3469b20704c8d1942794a86e4364fe7d9e8e9f63241a5b769d61c8151993bc65833a5b959026fa1ccea343b3db0a33aa6deb + languageName: node + linkType: hard + +"default-browser@npm:^5.2.1": + version: 5.2.1 + resolution: "default-browser@npm:5.2.1" + dependencies: + bundle-name: "npm:^4.1.0" + default-browser-id: "npm:^5.0.0" + checksum: afab7eff7b7f5f7a94d9114d1ec67273d3fbc539edf8c0f80019879d53aa71e867303c6f6d7cffeb10a6f3cfb59d4f963dba3f9c96830b4540cc7339a1bf9840 languageName: node linkType: hard @@ -3262,41 +3479,37 @@ __metadata: version: 1.0.4 resolution: "defaults@npm:1.0.4" dependencies: - clone: ^1.0.2 + clone: "npm:^1.0.2" checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a languageName: node linkType: hard -"define-lazy-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "define-lazy-prop@npm:2.0.0" - checksum: 0115fdb065e0490918ba271d7339c42453d209d4cb619dfe635870d906731eff3e1ade8028bb461ea27ce8264ec5e22c6980612d332895977e89c1bbc80fcee2 +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": + version: 1.1.1 + resolution: "define-data-property@npm:1.1.1" + dependencies: + get-intrinsic: "npm:^1.2.1" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + checksum: 5573c8df96b5857408cad64d9b91b69152e305ce4b06218e5f49b59c6cafdbb90a8bd8a0bb83c7bc67a8d479c04aa697063c9bc28d849b7282f9327586d6bc7b languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": - version: 1.1.4 - resolution: "define-properties@npm:1.1.4" - dependencies: - has-property-descriptors: ^1.0.0 - object-keys: ^1.1.1 - checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b +"define-lazy-prop@npm:^3.0.0": + version: 3.0.0 + resolution: "define-lazy-prop@npm:3.0.0" + checksum: f28421cf9ee86eecaf5f3b8fe875f13d7009c2625e97645bfff7a2a49aca678270b86c39f9c32939e5ca7ab96b551377ed4139558c795e076774287ad3af1aa4 languageName: node linkType: hard -"del@npm:^7.0.0": - version: 7.0.0 - resolution: "del@npm:7.0.0" +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" dependencies: - globby: ^13.1.2 - graceful-fs: ^4.2.10 - is-glob: ^4.0.3 - is-path-cwd: ^3.0.0 - is-path-inside: ^4.0.0 - p-map: ^5.5.0 - rimraf: ^3.0.2 - slash: ^4.0.0 - checksum: 33e5077f18b5dfbe81971d1f8a2cd8bf676dd5ede491bab85ec17a4a1d59001bd3ec47fd38e9a4ae01a3c98c07b98c7b3dc56190b86d88926798802d7858d827 + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 languageName: node linkType: hard @@ -3310,29 +3523,22 @@ __metadata: "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" - checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a - languageName: node - linkType: hard - -"depd@npm:^1.1.2": - version: 1.1.2 - resolution: "depd@npm:1.1.2" - checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9 + checksum: c0c8ff36079ce5ada64f46cc9d6fd47ebcf38241105b6e0c98f412e8ad91f084bcf906ff644cc3a4bd876ca27a62accb8b0fff72ea6ed1a414b89d8506f4a5ca languageName: node linkType: hard -"dependency-tree@npm:^8.1.1": - version: 8.1.2 - resolution: "dependency-tree@npm:8.1.2" +"dependency-tree@npm:^9.0.0": + version: 9.0.0 + resolution: "dependency-tree@npm:9.0.0" dependencies: - commander: ^2.20.3 - debug: ^4.3.1 - filing-cabinet: ^3.0.1 - precinct: ^8.0.0 - typescript: ^3.9.7 + commander: "npm:^2.20.3" + debug: "npm:^4.3.1" + filing-cabinet: "npm:^3.0.1" + precinct: "npm:^9.0.0" + typescript: "npm:^4.0.0" bin: dependency-tree: bin/cli.js - checksum: e26dffd0332b80ac6303fa4073dcd8f3df05c1584e26fe8fd15f59572f0427e8618757e9797d8963578648f80eb9d4f4496f25bbbb5984329b4c55e49e51d7be + checksum: 7ffc6009bf6eeea712cead1c18d57f87e2d9c0ca5a3327b12daf368de5350f85c613558ae4274e7b49b23010533746917d84ad75dd4fd4d731d61a2eaaf9e310 languageName: node linkType: hard @@ -3357,6 +3563,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.0": + version: 2.0.2 + resolution: "detect-libc@npm:2.0.2" + checksum: 6118f30c0c425b1e56b9d2609f29bec50d35a6af0b762b6ad127271478f3bbfda7319ce869230cf1a351f2b219f39332cde290858553336d652c77b970f15de8 + languageName: node + linkType: hard + "detect-newline@npm:^3.1.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -3368,42 +3581,75 @@ __metadata: version: 3.1.2 resolution: "detective-amd@npm:3.1.2" dependencies: - ast-module-types: ^3.0.0 - escodegen: ^2.0.0 - get-amd-module-type: ^3.0.0 - node-source-walk: ^4.2.0 + ast-module-types: "npm:^3.0.0" + escodegen: "npm:^2.0.0" + get-amd-module-type: "npm:^3.0.0" + node-source-walk: "npm:^4.2.0" bin: detective-amd: bin/cli.js checksum: 0b71555edad8e85c9a2ae85e2799d5faf2bdfe0de969587c9288ca76e717494678e34f444dffe32ffdd432e85ce50ca7017a5d0441a4855677a45a40c4590c74 languageName: node linkType: hard +"detective-amd@npm:^4.0.1, detective-amd@npm:^4.1.0": + version: 4.2.0 + resolution: "detective-amd@npm:4.2.0" + dependencies: + ast-module-types: "npm:^4.0.0" + escodegen: "npm:^2.0.0" + get-amd-module-type: "npm:^4.1.0" + node-source-walk: "npm:^5.0.1" + bin: + detective-amd: bin/cli.js + checksum: c1e829a3202045796105680c9fe90ac61f63b0ccecc12cc30c7204c9e7ec22a4e2c3e2357719b9346a4e3579eba778cdce9a050e642938e2a4c8b57b091278e4 + languageName: node + linkType: hard + "detective-cjs@npm:^3.1.1": version: 3.1.3 resolution: "detective-cjs@npm:3.1.3" dependencies: - ast-module-types: ^3.0.0 - node-source-walk: ^4.0.0 + ast-module-types: "npm:^3.0.0" + node-source-walk: "npm:^4.0.0" checksum: a691cb4afbbfea59d9aae0ee00752ec1a825a7ef18fc9178b53664975f162f3b537268590def009d9ce1cccfc5bc4f38cf775df08d0872aaacc05d96c72de85a languageName: node linkType: hard -"detective-es6@npm:^2.2.0, detective-es6@npm:^2.2.1": +"detective-cjs@npm:^4.0.0, detective-cjs@npm:^4.1.0": + version: 4.1.0 + resolution: "detective-cjs@npm:4.1.0" + dependencies: + ast-module-types: "npm:^4.0.0" + node-source-walk: "npm:^5.0.1" + checksum: 17e40183959e9f377333a9fd03dcf4cbabf1b7a9f588882311066ecaaad68ad16765a7b63ffc096fc91d2a3c14ac044ed1823257c76105c9cb96dfc141a806e2 + languageName: node + linkType: hard + +"detective-es6@npm:^2.2.1": version: 2.2.2 resolution: "detective-es6@npm:2.2.2" dependencies: - node-source-walk: ^4.0.0 + node-source-walk: "npm:^4.0.0" checksum: 9ee9909c089f5dcd1f89eccd347d509197996280ba24e2e08742bbc5ca3eef655ff07b4edfd76b52d6b4376ba03b8ec17d621c9f9c4382a6ba233dc1b1d00d33 languageName: node linkType: hard +"detective-es6@npm:^3.0.0, detective-es6@npm:^3.0.1": + version: 3.0.1 + resolution: "detective-es6@npm:3.0.1" + dependencies: + node-source-walk: "npm:^5.0.0" + checksum: 881a0c16b49504c212e61a521231ebbb4299a6102b178230959c74d2ca22d5f7538dfaf9518d01fb568ff93eadcf61d865d4428c9fed893dd4c91a7f29d515c5 + languageName: node + linkType: hard + "detective-less@npm:^1.0.2": version: 1.0.2 resolution: "detective-less@npm:1.0.2" dependencies: - debug: ^4.0.0 - gonzales-pe: ^4.2.3 - node-source-walk: ^4.0.0 + debug: "npm:^4.0.0" + gonzales-pe: "npm:^4.2.3" + node-source-walk: "npm:^4.0.0" checksum: 858936fbad87423bd5d7502ff5fafca023e7c99e4006ed01b31c12c4b5ff8697edce91419798479d857efec68ee8f022fcac64de5530db6a64012be600a2249e languageName: node linkType: hard @@ -3412,22 +3658,22 @@ __metadata: version: 4.0.0 resolution: "detective-postcss@npm:4.0.0" dependencies: - debug: ^4.1.1 - is-url: ^1.2.4 - postcss: ^8.1.7 - postcss-values-parser: ^2.0.1 - checksum: e4c9fed31613df43466357fb104c4c5cdaf45a12909f7c1174161a45ebb2ebe77bb0843b3c0c117b68f55c9acb4e0578668298594c7f0108dfb73e54aaec8513 + debug: "npm:^4.1.1" + is-url: "npm:^1.2.4" + postcss: "npm:^8.1.7" + postcss-values-parser: "npm:^2.0.1" + checksum: 9bd5d35554bf51f255db2640f14745f83c10352ba4c4f499096ee4f21547fd7fab501f3dc4017aa7d3bee3b1b455f1162a8067d1810c62d4b1806c96bd6c238e languageName: node linkType: hard -"detective-postcss@npm:^5.0.0": - version: 5.1.3 - resolution: "detective-postcss@npm:5.1.3" +"detective-postcss@npm:^6.1.0, detective-postcss@npm:^6.1.1": + version: 6.1.3 + resolution: "detective-postcss@npm:6.1.3" dependencies: - is-url: ^1.2.4 - postcss: ^8.4.6 - postcss-values-parser: ^5.0.0 - checksum: 7310e3fa9995d10d97d3d6995a89df72195cba8a6420c661b8b6100c0bbbf466887c29e6a166a93e76ede395b290c24d7837c2a0c644b5cd415d9834db77d8cf + is-url: "npm:^1.2.4" + postcss: "npm:^8.4.23" + postcss-values-parser: "npm:^6.0.2" + checksum: ee6e07fed20ac93a6ba84736b9c586a942a4a6b2df173f963f95ea753380c99e4a606da22b8d9e8407c50e356f3d893a127eb68cf84c97233a209e9fbbadb026 languageName: node linkType: hard @@ -3435,22 +3681,42 @@ __metadata: version: 3.0.2 resolution: "detective-sass@npm:3.0.2" dependencies: - gonzales-pe: ^4.3.0 - node-source-walk: ^4.0.0 + gonzales-pe: "npm:^4.3.0" + node-source-walk: "npm:^4.0.0" checksum: 7489e5ae7dbed2eba89855cea21ad32321e8e92bd9f2d3b925e7feec0dd9aa8b4b865296525275938e573a3be9759715490038103cbc970570a1c48c4f2fd23d languageName: node linkType: hard +"detective-sass@npm:^4.0.1, detective-sass@npm:^4.1.1": + version: 4.1.3 + resolution: "detective-sass@npm:4.1.3" + dependencies: + gonzales-pe: "npm:^4.3.0" + node-source-walk: "npm:^5.0.1" + checksum: 91681e90037cc935f38b2867fab2aa5585848491b3a269dfb44b37721146ff83f57a540d964b15db22dc1f232623568bedfd13470ec7363e6111991d4d3fe573 + languageName: node + linkType: hard + "detective-scss@npm:^2.0.1": version: 2.0.2 resolution: "detective-scss@npm:2.0.2" dependencies: - gonzales-pe: ^4.3.0 - node-source-walk: ^4.0.0 + gonzales-pe: "npm:^4.3.0" + node-source-walk: "npm:^4.0.0" checksum: 515ff1b8946ec92baead48ef435efe1ea0f33ee1d98a7537dd700f1d06dd192f9ea0971c10343adcb08b561ab296d01c18a1f62d0b63163a8f4c09885a956e1a languageName: node linkType: hard +"detective-scss@npm:^3.0.0, detective-scss@npm:^3.0.1": + version: 3.1.1 + resolution: "detective-scss@npm:3.1.1" + dependencies: + gonzales-pe: "npm:^4.3.0" + node-source-walk: "npm:^5.0.1" + checksum: 3d9c0468216c822c25572e700b9aba1e2e2797d336b6b84fd455d83ce849263324855008d1e58d6ccdf9c7a4f099e31277b99e885407cd19674e0bb10fc458cd + languageName: node + linkType: hard + "detective-stylus@npm:^1.0.0": version: 1.0.3 resolution: "detective-stylus@npm:1.0.3" @@ -3458,29 +3724,41 @@ __metadata: languageName: node linkType: hard +"detective-stylus@npm:^2.0.1": + version: 2.0.1 + resolution: "detective-stylus@npm:2.0.1" + checksum: c701ba6df3e6b5346aa5dd37b8329a9069a20fd7d075933e2e3b819a75922a2adab809143591151e7337183d59c980e6bc64ad6e51ce96de864575221c1b9506 + languageName: node + linkType: hard + +"detective-stylus@npm:^3.0.0": + version: 3.0.0 + resolution: "detective-stylus@npm:3.0.0" + checksum: e82eda490406d289f7b22050423ad69eb1c0f0d88414adaa292de4ab533be3c50d4cf512a9fefba426f3ad20789f0c0db3b0d32f70162112ca89034bbc5ca9d3 + languageName: node + linkType: hard + "detective-typescript@npm:^7.0.0": version: 7.0.2 resolution: "detective-typescript@npm:7.0.2" dependencies: - "@typescript-eslint/typescript-estree": ^4.33.0 - ast-module-types: ^2.7.1 - node-source-walk: ^4.2.0 - typescript: ^3.9.10 + "@typescript-eslint/typescript-estree": "npm:^4.33.0" + ast-module-types: "npm:^2.7.1" + node-source-walk: "npm:^4.2.0" + typescript: "npm:^3.9.10" checksum: 77703410baa242029dc5e7d02cca7a26278dea498ec1c3320f92efa08a85263affc3b102fc2b09952ece1d2c851a3808733d7bfa9ed11944a7c0f39920e33ec9 languageName: node linkType: hard -"devtools-protocol@npm:0.0.1068969": - version: 0.0.1068969 - resolution: "devtools-protocol@npm:0.0.1068969" - checksum: 53b9c8d661e4148eaf8e990f03902fb3a2cceb06044f661013b6c92dd48ece397ef49fd18401775823c9a33069b4b535502f2559d4f99c74a6bdcb71582b6c8a - languageName: node - linkType: hard - -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d +"detective-typescript@npm:^9.0.0, detective-typescript@npm:^9.1.1": + version: 9.1.1 + resolution: "detective-typescript@npm:9.1.1" + dependencies: + "@typescript-eslint/typescript-estree": "npm:^5.55.0" + ast-module-types: "npm:^4.0.0" + node-source-walk: "npm:^5.0.1" + typescript: "npm:^4.9.5" + checksum: 5f50801f622740d4e9d724ce04518ceb81591215bf18c18c5d22f6f3948df49dfb0a8bbe3596dac47220a37028bc2879ccd7a968f265217c9855817bda4622f5 languageName: node linkType: hard @@ -3488,7 +3766,7 @@ __metadata: version: 3.0.1 resolution: "dir-glob@npm:3.0.1" dependencies: - path-type: ^4.0.0 + path-type: "npm:^4.0.0" checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 languageName: node linkType: hard @@ -3497,8 +3775,8 @@ __metadata: version: 2.1.0 resolution: "doctrine@npm:2.1.0" dependencies: - esutils: ^2.0.2 - checksum: a45e277f7feaed309fe658ace1ff286c6e2002ac515af0aaf37145b8baa96e49899638c7cd47dccf84c3d32abfc113246625b3ac8f552d1046072adee13b0dc8 + esutils: "npm:^2.0.2" + checksum: 555684f77e791b17173ea86e2eea45ef26c22219cb64670669c4f4bebd26dbc95cd90ec1f4159e9349a6bb9eb892ce4dde8cd0139e77bedd8bf4518238618474 languageName: node linkType: hard @@ -3506,17 +3784,26 @@ __metadata: version: 3.0.0 resolution: "doctrine@npm:3.0.0" dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + esutils: "npm:^2.0.2" + checksum: b4b28f1df5c563f7d876e7461254a4597b8cabe915abe94d7c5d1633fed263fcf9a85e8d3836591fc2d040108e822b0d32758e5ec1fe31c590dc7e08086e3e48 languageName: node linkType: hard -"dot-prop@npm:^5.1.0, dot-prop@npm:^5.2.0": +"dot-prop@npm:^5.1.0": version: 5.3.0 resolution: "dot-prop@npm:5.3.0" dependencies: - is-obj: ^2.0.0 - checksum: d5775790093c234ef4bfd5fbe40884ff7e6c87573e5339432870616331189f7f5d86575c5b5af2dcf0f61172990f4f734d07844b1f23482fff09e3c4bead05ea + is-obj: "npm:^2.0.0" + checksum: 33b2561617bd5c73cf9305368ba4638871c5dbf9c8100c8335acd2e2d590a81ec0e75c11cfaea5cc3cf8c2f668cad4beddb52c11856d0c9e666348eee1baf57a + languageName: node + linkType: hard + +"dot-prop@npm:^6.0.1": + version: 6.0.1 + resolution: "dot-prop@npm:6.0.1" + dependencies: + is-obj: "npm:^2.0.0" + checksum: 1200a4f6f81151161b8526c37966d60738cf12619b0ed1f55be01bdb55790bf0a5cd1398b8f2c296dcc07d0a7c2dd0e650baf0b069c367e74bb5df2f6603aba0 languageName: node linkType: hard @@ -3524,16 +3811,16 @@ __metadata: version: 2.1.0 resolution: "dotgitignore@npm:2.1.0" dependencies: - find-up: ^3.0.0 - minimatch: ^3.0.4 - checksum: 67589446765ddc25539f414b7649442a649f047343030342f309ba69172beb916b9e54feb7d552db422111265f9e93344f31b5697e8e6c81ffc13d33c0d910a0 + find-up: "npm:^3.0.0" + minimatch: "npm:^3.0.4" + checksum: 84b00ad4d3b75c2eef8d8502d83fffe6000999213ef3a7089680957b1c33b521cf41f15081f693899a17d180e8b49a148063cc39ce7407a8d35acb82047e6daa languageName: node linkType: hard "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + checksum: 9b1d3e1baefeaf7d70799db8774149cef33b97183a6addceeba0cf6b85ba23ee2686f302f14482006df32df75d32b17c509c143a3689627929e4a8efaf483952 languageName: node linkType: hard @@ -3541,9 +3828,9 @@ __metadata: version: 1.0.6 resolution: "ecurve@npm:1.0.6" dependencies: - bigi: ^1.1.0 - safe-buffer: ^5.0.1 - checksum: 11185533d4d204f3b419df2c3ff2123187cc30c098d792c7f139f0c02a11a84181de185c2b18501d505242f1f1a6d27f693ff4ea5e8b9348fc27bae509dda618 + bigi: "npm:^1.1.0" + safe-buffer: "npm:^5.0.1" + checksum: 5f738e564ad956acbcd743239b0b9e144d1fca999b6018370d86084545bf03ac5b63229918ab0b2ff87f676e85c23dedabc0f1ad6ea2eef160da70cb3119924b languageName: node linkType: hard @@ -3558,35 +3845,42 @@ __metadata: version: 6.5.4 resolution: "elliptic@npm:6.5.4" dependencies: - bn.js: ^4.11.9 - brorand: ^1.1.0 - hash.js: ^1.0.0 - hmac-drbg: ^1.0.1 - inherits: ^2.0.4 - minimalistic-assert: ^1.0.1 - minimalistic-crypto-utils: ^1.0.1 - checksum: d56d21fd04e97869f7ffcc92e18903b9f67f2d4637a23c860492fbbff5a3155fd9ca0184ce0c865dd6eb2487d234ce9551335c021c376cd2d3b7cb749c7d10f4 + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 2cd7ff4b69720dbb2ca1ca650b2cf889d1df60c96d4a99d331931e4fe21e45a7f3b8074e86618ca7e56366c4b6258007f234f9d61d9b0c87bbbc8ea990b99e94 languageName: node linkType: hard "emittery@npm:^1.0.1": version: 1.0.1 resolution: "emittery@npm:1.0.1" - checksum: d95faee6ffb2e023cadaa6804265fea5298c53d079f170112af8dfae3e141761363ea4510966128259346418e3ec7639310fd75059ecce2423bf8afd07004226 + checksum: 65dacfa022e5d412eac767fc1e62c4b89dbdf52d8fe96c25435149ca656907e7d87a325d1e5b1dab063315a154f56f5ea4fdaa0f12f228370af1dc0d91b017c2 + languageName: node + linkType: hard + +"emoji-regex@npm:^10.3.0": + version: 10.3.0 + resolution: "emoji-regex@npm:10.3.0" + checksum: b9b084ebe904f13bb4b66ee4c29fb41a7a4a1165adcc33c1ce8056c0194b882cc91ebdc782f1a779b5d7ea7375c5064643a7734893d7c657b44c5c6b9d7bf1e7 languageName: node linkType: hard "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + checksum: c72d67a6821be15ec11997877c437491c313d924306b8da5d87d2a2bcc2cec9903cb5b04ee1a088460501d8e5b44f10df82fdc93c444101a7610b80c8b6938e1 languageName: node linkType: hard "emoji-regex@npm:^9.2.2": version: 9.2.2 resolution: "emoji-regex@npm:9.2.2" - checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + checksum: 915acf859cea7131dac1b2b5c9c8e35c4849e325a1d114c30adb8cd615970f6dca0e27f64f3a4949d7d6ed86ecd79a1c5c63f02e697513cddd7b5835c90948b8 languageName: node linkType: hard @@ -3601,27 +3895,18 @@ __metadata: version: 0.1.13 resolution: "encoding@npm:0.1.13" dependencies: - iconv-lite: ^0.6.2 + iconv-lite: "npm:^0.6.2" checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f languageName: node linkType: hard -"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: ^1.4.0 - checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b - languageName: node - linkType: hard - "enhanced-resolve@npm:^5.8.3": - version: 5.12.0 - resolution: "enhanced-resolve@npm:5.12.0" + version: 5.15.0 + resolution: "enhanced-resolve@npm:5.15.0" dependencies: - graceful-fs: ^4.2.4 - tapable: ^2.2.0 - checksum: bf3f787facaf4ce3439bef59d148646344e372bef5557f0d37ea8aa02c51f50a925cd1f07b8d338f18992c29f544ec235a8c64bcdb56030196c48832a5494174 + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 180c3f2706f9117bf4dc7982e1df811dad83a8db075723f299245ef4488e0cad7e96859c5f0e410682d28a4ecd4da021ec7d06265f7e4eb6eed30c69ca5f7d3e languageName: node linkType: hard @@ -3635,7 +3920,7 @@ __metadata: "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + checksum: 1d20d825cdcce8d811bfbe86340f4755c02655a7feb2f13f8c880566d9d72a3f6c92c192a6867632e490d6da67b678271f46e01044996a6443e870331100dfdd languageName: node linkType: hard @@ -3643,68 +3928,75 @@ __metadata: version: 1.3.2 resolution: "error-ex@npm:1.3.2" dependencies: - is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 - languageName: node - linkType: hard - -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": - version: 1.21.0 - resolution: "es-abstract@npm:1.21.0" - dependencies: - call-bind: ^1.0.2 - es-set-tostringtag: ^2.0.0 - es-to-primitive: ^1.2.1 - function-bind: ^1.1.1 - function.prototype.name: ^1.1.5 - get-intrinsic: ^1.1.3 - get-symbol-description: ^1.0.0 - globalthis: ^1.0.3 - gopd: ^1.0.1 - has: ^1.0.3 - has-property-descriptors: ^1.0.0 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - internal-slot: ^1.0.4 - is-array-buffer: ^3.0.0 - is-callable: ^1.2.7 - is-negative-zero: ^2.0.2 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 - is-string: ^1.0.7 - is-typed-array: ^1.1.10 - is-weakref: ^1.0.2 - object-inspect: ^1.12.2 - object-keys: ^1.1.1 - object.assign: ^4.1.4 - regexp.prototype.flags: ^1.4.3 - safe-regex-test: ^1.0.0 - string.prototype.trimend: ^1.0.6 - string.prototype.trimstart: ^1.0.6 - typed-array-length: ^1.0.4 - unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.9 - checksum: 52305b52aff6505c9d8cebfa727835dd8871af76de151868d1db7baf6d21f13a81586316ac513601eec9b46e2947cab044fc2a131db68bfa05daf37aa153dbd9 - languageName: node - linkType: hard - -"es-set-tostringtag@npm:^2.0.0": - version: 2.0.1 - resolution: "es-set-tostringtag@npm:2.0.1" + is-arrayish: "npm:^0.2.1" + checksum: d547740aa29c34e753fb6fed2c5de81802438529c12b3673bd37b6bb1fe49b9b7abdc3c11e6062fe625d8a296b3cf769a80f878865e25e685f787763eede3ffb + languageName: node + linkType: hard + +"es-abstract@npm:^1.22.1": + version: 1.22.3 + resolution: "es-abstract@npm:1.22.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.0" + arraybuffer.prototype.slice: "npm:^1.0.2" + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.5" + es-set-tostringtag: "npm:^2.0.1" + es-to-primitive: "npm:^1.2.1" + function.prototype.name: "npm:^1.1.6" + get-intrinsic: "npm:^1.2.2" + get-symbol-description: "npm:^1.0.0" + globalthis: "npm:^1.0.3" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + internal-slot: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.2" + is-callable: "npm:^1.2.7" + is-negative-zero: "npm:^2.0.2" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.2" + is-string: "npm:^1.0.7" + is-typed-array: "npm:^1.1.12" + is-weakref: "npm:^1.0.2" + object-inspect: "npm:^1.13.1" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.4" + regexp.prototype.flags: "npm:^1.5.1" + safe-array-concat: "npm:^1.0.1" + safe-regex-test: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.8" + string.prototype.trimend: "npm:^1.0.7" + string.prototype.trimstart: "npm:^1.0.7" + typed-array-buffer: "npm:^1.0.0" + typed-array-byte-length: "npm:^1.0.0" + typed-array-byte-offset: "npm:^1.0.0" + typed-array-length: "npm:^1.0.4" + unbox-primitive: "npm:^1.0.2" + which-typed-array: "npm:^1.1.13" + checksum: e1ea9738ece15f810733b7bd71d825b555e01bb8c860272560d7d901467a9db1265214d6cf44f3beeb5d73ae421a609b9ad93a39aa47bbcd8cde510d5e0aa875 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.2 + resolution: "es-set-tostringtag@npm:2.0.2" dependencies: - get-intrinsic: ^1.1.3 - has: ^1.0.3 - has-tostringtag: ^1.0.0 - checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 + get-intrinsic: "npm:^1.2.2" + has-tostringtag: "npm:^1.0.0" + hasown: "npm:^2.0.0" + checksum: afcec3a4c9890ae14d7ec606204858441c801ff84f312538e1d1ccf1e5493c8b17bd672235df785f803756472cb4f2d49b87bde5237aef33411e74c22f194e07 languageName: node linkType: hard "es-shim-unscopables@npm:^1.0.0": - version: 1.0.0 - resolution: "es-shim-unscopables@npm:1.0.0" + version: 1.0.2 + resolution: "es-shim-unscopables@npm:1.0.2" dependencies: - has: ^1.0.3 - checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 + hasown: "npm:^2.0.0" + checksum: 6d3bf91f658a27cc7217cd32b407a0d714393a84d125ad576319b9e83a893bea165cf41270c29e9ceaa56d3cf41608945d7e2a2c31fd51c0009b0c31402b91c7 languageName: node linkType: hard @@ -3712,17 +4004,17 @@ __metadata: version: 1.2.1 resolution: "es-to-primitive@npm:1.2.1" dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + is-callable: "npm:^1.1.4" + is-date-object: "npm:^1.0.1" + is-symbol: "npm:^1.0.2" + checksum: 74aeeefe2714cf99bb40cab7ce3012d74e1e2c1bd60d0a913b467b269edde6e176ca644b5ba03a5b865fb044a29bca05671cd445c85ca2cdc2de155d7fc8fe9b languageName: node linkType: hard "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 + checksum: afa618e73362576b63f6ca83c975456621095a1ed42ff068174e3f5cea48afc422814dda548c96e6ebb5333e7265140c7292abcc81bbd6ccb1757d50d3a4e182 languageName: node linkType: hard @@ -3762,71 +4054,70 @@ __metadata: linkType: hard "escodegen@npm:^2.0.0": - version: 2.0.0 - resolution: "escodegen@npm:2.0.0" + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" dependencies: - esprima: ^4.0.1 - estraverse: ^5.2.0 - esutils: ^2.0.2 - optionator: ^0.8.1 - source-map: ~0.6.1 + esprima: "npm:^4.0.1" + estraverse: "npm:^5.2.0" + esutils: "npm:^2.0.2" + source-map: "npm:~0.6.1" dependenciesMeta: source-map: optional: true bin: escodegen: bin/escodegen.js esgenerate: bin/esgenerate.js - checksum: 5aa6b2966fafe0545e4e77936300cc94ad57cfe4dc4ebff9950492eaba83eef634503f12d7e3cbd644ecc1bab388ad0e92b06fd32222c9281a75d1cf02ec6cef + checksum: 47719a65b2888b4586e3fa93769068b275961c13089e90d5d01a96a6e8e95871b1c3893576814c8fbf08a4a31a496f37e7b2c937cf231270f4d81de012832c7c languageName: node linkType: hard -"eslint-config-bitauth@npm:^3.1.2": - version: 3.1.2 - resolution: "eslint-config-bitauth@npm:3.1.2" - dependencies: - "@typescript-eslint/eslint-plugin": 5.28.0 - eslint-config-prettier: ^8.5.0 +"eslint-config-bitauth@portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A.": + version: 0.0.0-use.local + resolution: "eslint-config-bitauth@portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A." peerDependencies: - "@typescript-eslint/parser": ">=5.9" + "@typescript-eslint/eslint-plugin": ">=6" + "@typescript-eslint/parser": ">=6" eslint: ">=8" - eslint-plugin-eslint-comments: ">=3.2" - eslint-plugin-functional: ">=4" - eslint-plugin-import: ">=2.25" - typescript: ">=4.5" - checksum: 2ab16014fac327a1d22598a4a5559cc64a188e21fc65633a794fe7694908cdc530f4271676ac2491810baa0d945b81816e53766ac5ef27692ad35de6bb54acf5 + eslint-config-prettier: ">=9" + eslint-plugin-eslint-comments: ">=3" + eslint-plugin-functional: ">=6" + eslint-plugin-import: ">=2" + eslint-plugin-tsdoc: ">=0.2" + typescript: ">=5" languageName: node - linkType: hard + linkType: soft -"eslint-config-prettier@npm:^8.5.0, eslint-config-prettier@npm:^8.6.0": - version: 8.6.0 - resolution: "eslint-config-prettier@npm:8.6.0" +"eslint-config-prettier@npm:^9.1.0": + version: 9.1.0 + resolution: "eslint-config-prettier@npm:9.1.0" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: ff0d0dfc839a556355422293428637e8d35693de58dabf8638bf0b6529131a109d0b2ade77521aa6e54573bb842d7d9d322e465dd73dd61c7590fa3834c3fa81 + checksum: 411e3b3b1c7aa04e3e0f20d561271b3b909014956c4dba51c878bf1a23dbb8c800a3be235c46c4732c70827276e540b6eed4636d9b09b444fd0a8e07f0fcd830 languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.6": - version: 0.3.6 - resolution: "eslint-import-resolver-node@npm:0.3.6" +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.9 + resolution: "eslint-import-resolver-node@npm:0.3.9" dependencies: - debug: ^3.2.7 - resolve: ^1.20.0 - checksum: 6266733af1e112970e855a5bcc2d2058fb5ae16ad2a6d400705a86b29552b36131ffc5581b744c23d550de844206fb55e9193691619ee4dbf225c4bde526b1c8 + debug: "npm:^3.2.7" + is-core-module: "npm:^2.13.0" + resolve: "npm:^1.22.4" + checksum: d52e08e1d96cf630957272e4f2644dcfb531e49dcfd1edd2e07e43369eb2ec7a7d4423d417beee613201206ff2efa4eb9a582b5825ee28802fc7c71fcd53ca83 languageName: node linkType: hard -"eslint-module-utils@npm:^2.7.3": - version: 2.7.4 - resolution: "eslint-module-utils@npm:2.7.4" +"eslint-module-utils@npm:^2.8.0": + version: 2.8.0 + resolution: "eslint-module-utils@npm:2.8.0" dependencies: - debug: ^3.2.7 + debug: "npm:^3.2.7" peerDependenciesMeta: eslint: optional: true - checksum: 5da13645daff145a5c922896b258f8bba560722c3767254e458d894ff5fbb505d6dfd945bffa932a5b0ae06714da2379bd41011c4c20d2d59cc83e23895360f7 + checksum: a9a7ed93eb858092e3cdc797357d4ead2b3ea06959b0eada31ab13862d46a59eb064b9cb82302214232e547980ce33618c2992f6821138a4934e65710ed9cc29 languageName: node linkType: hard @@ -3834,70 +4125,58 @@ __metadata: version: 3.2.0 resolution: "eslint-plugin-eslint-comments@npm:3.2.0" dependencies: - escape-string-regexp: ^1.0.5 - ignore: ^5.0.5 + escape-string-regexp: "npm:^1.0.5" + ignore: "npm:^5.0.5" peerDependencies: eslint: ">=4.19.1" - checksum: c9fe273dd56699abdf7e416cfad0344eb50aa01564a5a9133e72d982defb89310bc2e9b0b148ce19c5190d7ff641223b0ba9e667a194bc48467c3dd0d471e657 + checksum: 4aa0d31a78ac7746002e37ca0cb436f3e5b481a97d28be07bad831e161a2ffcc4dedff44820edef9a1e80f6a0ab1ef44ed9a46e3a4c4a050350438451908972b languageName: node linkType: hard -"eslint-plugin-functional@npm:^4.4.1": - version: 4.4.1 - resolution: "eslint-plugin-functional@npm:4.4.1" - dependencies: - "@typescript-eslint/utils": ^5.10.2 - deepmerge-ts: ^4.0.3 - escape-string-regexp: ^4.0.0 - semver: ^7.3.7 +"eslint-plugin-functional@npm:^6.0.0": + version: 6.0.0 + resolution: "eslint-plugin-functional@npm:6.0.0" + dependencies: + "@typescript-eslint/utils": "npm:^6.2.0" + deepmerge-ts: "npm:^5.1.0" + escape-string-regexp: "npm:^4.0.0" + is-immutable-type: "npm:^2.0.1" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" peerDependencies: eslint: ^8.0.0 - tsutils: ^3.0.0 - typescript: ^3.4.1 || ^4.0.0 + typescript: ">=4.3.5" peerDependenciesMeta: - tsutils: - optional: true typescript: optional: true - checksum: 00a6001e86db6294f93ba409a5fb9a88d218049460fdf2cfbd4d67ce08884382cf84b66cf536154d764d5db5c51e1747bbaa257cec17a602575d1a9fa9b91db8 - languageName: node - linkType: hard - -"eslint-plugin-import@npm:^2.26.0": - version: 2.26.0 - resolution: "eslint-plugin-import@npm:2.26.0" - dependencies: - array-includes: ^3.1.4 - array.prototype.flat: ^1.2.5 - debug: ^2.6.9 - doctrine: ^2.1.0 - eslint-import-resolver-node: ^0.3.6 - eslint-module-utils: ^2.7.3 - has: ^1.0.3 - is-core-module: ^2.8.1 - is-glob: ^4.0.3 - minimatch: ^3.1.2 - object.values: ^1.1.5 - resolve: ^1.22.0 - tsconfig-paths: ^3.14.1 - peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 0bf77ad80339554481eafa2b1967449e1f816b94c7a6f9614ce33fb4083c4e6c050f10d241dd50b4975d47922880a34de1e42ea9d8e6fd663ebb768baa67e655 - languageName: node - linkType: hard - -"eslint-plugin-prettier@npm:^4.2.1": - version: 4.2.1 - resolution: "eslint-plugin-prettier@npm:4.2.1" - dependencies: - prettier-linter-helpers: ^1.0.0 + checksum: 96e665083a9e44eb14e4fcb243a79f43280347b20605606b20cf63948a2b3e997410998995097ecbd9501fc21eff25e489f5dd793bbbffcfe458adda55a96cac + languageName: node + linkType: hard + +"eslint-plugin-import@npm:^2.29.1": + version: 2.29.1 + resolution: "eslint-plugin-import@npm:2.29.1" + dependencies: + array-includes: "npm:^3.1.7" + array.prototype.findlastindex: "npm:^1.2.3" + array.prototype.flat: "npm:^1.3.2" + array.prototype.flatmap: "npm:^1.3.2" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.8.0" + hasown: "npm:^2.0.0" + is-core-module: "npm:^2.13.1" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.7" + object.groupby: "npm:^1.0.1" + object.values: "npm:^1.1.7" + semver: "npm:^6.3.1" + tsconfig-paths: "npm:^3.15.0" peerDependencies: - eslint: ">=7.28.0" - prettier: ">=2.0.0" - peerDependenciesMeta: - eslint-config-prettier: - optional: true - checksum: b9e839d2334ad8ec7a5589c5cb0f219bded260839a857d7a486997f9870e95106aa59b8756ff3f37202085ebab658de382b0267cae44c3a7f0eb0bcc03a4f6d6 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + checksum: 5865f05c38552145423c535326ec9a7113ab2305c7614c8b896ff905cfabc859c8805cac21e979c9f6f742afa333e6f62f812eabf891a7e8f5f0b853a32593c1 languageName: node linkType: hard @@ -3905,114 +4184,92 @@ __metadata: version: 0.2.17 resolution: "eslint-plugin-tsdoc@npm:0.2.17" dependencies: - "@microsoft/tsdoc": 0.14.2 - "@microsoft/tsdoc-config": 0.16.2 - checksum: d143a5f1c5967812d75f246ae2776cb030f6e7966b981406c9df9352a9ab02b035f294cedb30054eac2c4a217ee4ab2ed9fb76292bdccda9438e54d2d7b0146e - languageName: node - linkType: hard - -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb - languageName: node - linkType: hard - -"eslint-scope@npm:^7.1.1": - version: 7.1.1 - resolution: "eslint-scope@npm:7.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: 9f6e974ab2db641ca8ab13508c405b7b859e72afe9f254e8131ff154d2f40c99ad4545ce326fd9fde3212ff29707102562a4834f1c48617b35d98c71a97fbf3e + "@microsoft/tsdoc": "npm:0.14.2" + "@microsoft/tsdoc-config": "npm:0.16.2" + checksum: b2b3a1517a2e8ba01eb65ddfb29992a9141954a883935cac069477659647dcb83603b6661d1ee16f9919007f5082cad0fc2532f5d95620fcc3fb239bde820fe3 languageName: node linkType: hard -"eslint-utils@npm:^3.0.0": - version: 3.0.0 - resolution: "eslint-utils@npm:3.0.0" +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" dependencies: - eslint-visitor-keys: ^2.0.0 - peerDependencies: - eslint: ">=5" - checksum: 0668fe02f5adab2e5a367eee5089f4c39033af20499df88fe4e6aba2015c20720404d8c3d6349b6f716b08fdf91b9da4e5d5481f265049278099c4c836ccb619 + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 5c660fb905d5883ad018a6fea2b49f3cb5b1cbf2cd4bd08e98646e9864f9bc2c74c0839bed2d292e90a4a328833accc197c8f0baed89cbe8d605d6f918465491 languageName: node linkType: hard "eslint-visitor-keys@npm:^2.0.0": version: 2.1.0 resolution: "eslint-visitor-keys@npm:2.1.0" - checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0": - version: 3.3.0 - resolution: "eslint-visitor-keys@npm:3.3.0" - checksum: d59e68a7c5a6d0146526b0eec16ce87fbf97fe46b8281e0d41384224375c4e52f5ffb9e16d48f4ea50785cde93f766b0c898e31ab89978d88b0e1720fbfb7808 - languageName: node - linkType: hard - -"eslint@npm:8.31.0": - version: 8.31.0 - resolution: "eslint@npm:8.31.0" - dependencies: - "@eslint/eslintrc": ^1.4.1 - "@humanwhocodes/config-array": ^0.11.8 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - ajv: ^6.10.0 - chalk: ^4.0.0 - cross-spawn: ^7.0.2 - debug: ^4.3.2 - doctrine: ^3.0.0 - escape-string-regexp: ^4.0.0 - eslint-scope: ^7.1.1 - eslint-utils: ^3.0.0 - eslint-visitor-keys: ^3.3.0 - espree: ^9.4.0 - esquery: ^1.4.0 - esutils: ^2.0.2 - fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 - find-up: ^5.0.0 - glob-parent: ^6.0.2 - globals: ^13.19.0 - grapheme-splitter: ^1.0.4 - ignore: ^5.2.0 - import-fresh: ^3.0.0 - imurmurhash: ^0.1.4 - is-glob: ^4.0.0 - is-path-inside: ^3.0.3 - js-sdsl: ^4.1.4 - js-yaml: ^4.1.0 - json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 - lodash.merge: ^4.6.2 - minimatch: ^3.1.2 - natural-compare: ^1.4.0 - optionator: ^0.9.1 - regexpp: ^3.2.0 - strip-ansi: ^6.0.1 - strip-json-comments: ^3.1.0 - text-table: ^0.2.0 + checksum: db4547eef5039122d518fa307e938ceb8589da5f6e8f5222efaf14dd62f748ce82e2d2becd3ff9412a50350b726bda95dbea8515a471074547daefa58aee8735 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b + languageName: node + linkType: hard + +"eslint@npm:8.56.0": + version: 8.56.0 + resolution: "eslint@npm:8.56.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.56.0" + "@humanwhocodes/config-array": "npm:^0.11.13" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 5e5688bb864edc6b12d165849994812eefa67fb3fc44bb26f53659b63edcd8bcc68389d27cc6cc9e5b79ee22f24b6f311fa3ed047bddcafdec7d84c1b5561e4f + checksum: ef6193c6e4cef20774b985a5cc2fd4bf6d3c4decd423117cbc4a0196617861745db291217ad3c537bc3a160650cca965bc818f55e1f3e446af1fcb293f9940a5 languageName: node linkType: hard -"espree@npm:^9.4.0": - version: 9.4.1 - resolution: "espree@npm:9.4.1" +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" dependencies: - acorn: ^8.8.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.3.0 - checksum: 4d266b0cf81c7dfe69e542c7df0f246e78d29f5b04dda36e514eb4c7af117ee6cfbd3280e560571ed82ff6c9c3f0003c05b82583fc7a94006db7497c4fe4270e + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 255ab260f0d711a54096bdeda93adff0eadf02a6f9b92f02b323e83a2b7fc258797919437ad331efec3930475feb0142c5ecaaf3cdab4befebd336d47d3f3134 languageName: node linkType: hard @@ -4022,16 +4279,16 @@ __metadata: bin: esparse: ./bin/esparse.js esvalidate: ./bin/esvalidate.js - checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + checksum: f1d3c622ad992421362294f7acf866aa9409fbad4eb2e8fa230bd33944ce371d32279667b242d8b8907ec2b6ad7353a717f3c0e60e748873a34a7905174bc0eb languageName: node linkType: hard -"esquery@npm:^1.4.0": - version: 1.4.0 - resolution: "esquery@npm:1.4.0" +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" dependencies: - estraverse: ^5.1.0 - checksum: a0807e17abd7fbe5fbd4fab673038d6d8a50675cdae6b04fbaa520c34581be0c5fa24582990e8acd8854f671dd291c78bb2efb9e0ed5b62f33bac4f9cf820210 + estraverse: "npm:^5.1.0" + checksum: e65fcdfc1e0ff5effbf50fb4f31ea20143ae5df92bb2e4953653d8d40aa4bc148e0d06117a592ce4ea53eeab1dafdfded7ea7e22a5be87e82d73757329a1b01d languageName: node linkType: hard @@ -4039,43 +4296,29 @@ __metadata: version: 4.3.0 resolution: "esrecurse@npm:4.3.0" dependencies: - estraverse: ^5.2.0 - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + estraverse: "npm:^5.2.0" + checksum: 44ffcd89e714ea6b30143e7f119b104fc4d75e77ee913f34d59076b40ef2d21967f84e019f84e1fd0465b42cdbf725db449f232b5e47f29df29ed76194db8e16 languageName: node linkType: hard "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"estree-walker@npm:^1.0.1": - version: 1.0.1 - resolution: "estree-walker@npm:1.0.1" - checksum: 7e70da539691f6db03a08e7ce94f394ce2eef4180e136d251af299d41f92fb2d28ebcd9a6e393e3728d7970aeb5358705ddf7209d52fbcb2dd4693f95dcf925f + checksum: 37cbe6e9a68014d34dbdc039f90d0baf72436809d02edffcc06ba3c2a12eb298048f877511353b130153e532aac8d68ba78430c0dd2f44806ebc7c014b01585e languageName: node linkType: hard -"estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": +"estree-walker@npm:2.0.2, estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": version: 2.0.2 resolution: "estree-walker@npm:2.0.2" - checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc + checksum: b02109c5d46bc2ed47de4990eef770f7457b1159a229f0999a09224d2b85ffeed2d7679cffcff90aeb4448e94b0168feb5265b209cdec29aad50a3d6e93d21e2 languageName: node linkType: hard "esutils@npm:^2.0.2, esutils@npm:^2.0.3": version: 2.0.3 resolution: "esutils@npm:2.0.3" - checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + checksum: b23acd24791db11d8f65be5ea58fd9a6ce2df5120ae2da65c16cfc5331ff59d5ac4ef50af66cd4bde238881503ec839928a0135b99a036a9cdfa22d17fd56cdb languageName: node linkType: hard @@ -4086,20 +4329,20 @@ __metadata: languageName: node linkType: hard -"execa@npm:^5.1.1": - version: 5.1.1 - resolution: "execa@npm:5.1.1" +"execa@npm:^7.1.1": + version: 7.2.0 + resolution: "execa@npm:7.2.0" dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.0 - human-signals: ^2.1.0 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.1 - onetime: ^5.1.2 - signal-exit: ^3.0.3 - strip-final-newline: ^2.0.0 - checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.1" + human-signals: "npm:^4.3.0" + is-stream: "npm:^3.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^5.1.0" + onetime: "npm:^6.0.0" + signal-exit: "npm:^3.0.7" + strip-final-newline: "npm:^3.0.0" + checksum: 473feff60f9d4dbe799225948de48b5158c1723021d19c4b982afe37bcd111ae84e1b4c9dfe967fae5101b0894b1a62e4dd564a286dfa3e46d7b0cfdbf7fe62b languageName: node linkType: hard @@ -4107,47 +4350,54 @@ __metadata: version: 2.0.2 resolution: "expand-tilde@npm:2.0.2" dependencies: - homedir-polyfill: ^1.0.1 + homedir-polyfill: "npm:^1.0.1" checksum: 2efe6ed407d229981b1b6ceb552438fbc9e5c7d6a6751ad6ced3e0aa5cf12f0b299da695e90d6c2ac79191b5c53c613e508f7149e4573abfbb540698ddb7301a languageName: node linkType: hard +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 2d9bbb6473de7051f96790d5f9a678f32e60ed0aa70741dc7fdc96fec8d631124ec3374ac144387604f05afff9500f31a1d45bd9eee4cdc2e4f9ad2d9b9d5dbd + languageName: node + linkType: hard + "express@npm:^4.18.2": version: 4.18.2 resolution: "express@npm:4.18.2" dependencies: - accepts: ~1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1 - content-disposition: 0.5.4 - content-type: ~1.0.4 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - etag: ~1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: ~1.1.2 - on-finished: 2.4.1 - parseurl: ~1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: ~2.0.7 - qs: 6.11.0 - range-parser: ~1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: ~1.6.18 - utils-merge: 1.0.1 - vary: ~1.1.2 - checksum: 3c4b9b076879442f6b968fe53d85d9f1eeacbb4f4c41e5f16cc36d77ce39a2b0d81b3f250514982110d815b2f7173f5561367f9110fcc541f9371948e8c8b037 + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.1" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.5.0" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.2.0" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.1" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.7" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.11.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.18.0" + serve-static: "npm:1.15.0" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 869ae89ed6ff4bed7b373079dc58e5dddcf2915a2669b36037ff78c99d675ae930e5fe052b35c24f56557d28a023bb1cbe3e2f2fb87eaab96a1cedd7e597809d languageName: node linkType: hard @@ -4155,36 +4405,19 @@ __metadata: version: 3.1.0 resolution: "external-editor@npm:3.1.0" dependencies: - chardet: ^0.7.0 - iconv-lite: ^0.4.24 - tmp: ^0.0.33 - checksum: 1c2a616a73f1b3435ce04030261bed0e22d4737e14b090bb48e58865da92529c9f2b05b893de650738d55e692d071819b45e1669259b2b354bc3154d27a698c7 - languageName: node - linkType: hard - -"extract-zip@npm:2.0.1": - version: 2.0.1 - resolution: "extract-zip@npm:2.0.1" - dependencies: - "@types/yauzl": ^2.9.1 - debug: ^4.1.1 - get-stream: ^5.1.0 - yauzl: ^2.10.0 - dependenciesMeta: - "@types/yauzl": - optional: true - bin: - extract-zip: cli.js - checksum: 8cbda9debdd6d6980819cc69734d874ddd71051c9fe5bde1ef307ebcedfe949ba57b004894b585f758b7c9eeeea0e3d87f2dda89b7d25320459c2c9643ebb635 + chardet: "npm:^0.7.0" + iconv-lite: "npm:^0.4.24" + tmp: "npm:^0.0.33" + checksum: 776dff1d64a1d28f77ff93e9e75421a81c062983fd1544279d0a32f563c0b18c52abbb211f31262e2827e48edef5c9dc8f960d06dd2d42d1654443b88568056b languageName: node linkType: hard -"fast-check@npm:^3.0.0, fast-check@npm:^3.5.0": - version: 3.5.0 - resolution: "fast-check@npm:3.5.0" +"fast-check@npm:^3.0.0, fast-check@npm:^3.15.0": + version: 3.15.0 + resolution: "fast-check@npm:3.15.0" dependencies: - pure-rand: ^5.0.2 - checksum: 5725ef677919bec3982c7187534a6f8e2369659c1f187ec6eb79a4e94d8e09c6d713bf447be47269c11254c876431c93115c873a72b4174f9b15f164402149af + pure-rand: "npm:^6.0.0" + checksum: 4e4542bea0ae1672f4b0fcc15256ce52acabe92694c6f3674a39f55ca10de1c178245dbb7ee78a95db641a0c3a5b35976389d15b9dade558a21781d5f9219c28 languageName: node linkType: hard @@ -4202,30 +4435,30 @@ __metadata: languageName: node linkType: hard -"fast-diff@npm:^1.1.2, fast-diff@npm:^1.2.0": - version: 1.2.0 - resolution: "fast-diff@npm:1.2.0" - checksum: 1b5306eaa9e826564d9e5ffcd6ebd881eb5f770b3f977fcbf38f05c824e42172b53c79920e8429c54eb742ce15a0caf268b0fdd5b38f6de52234c4a8368131ae +"fast-diff@npm:^1.2.0": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: 9e57415bc69cd6efcc720b3b8fe9fdaf42dcfc06f86f0f45378b1fa512598a8aac48aa3928c8751d58e2f01bb4ba4f07e4f3d9bc0d57586d45f1bd1e872c6cde languageName: node linkType: hard -"fast-equals@npm:^4.0.3": - version: 4.0.3 - resolution: "fast-equals@npm:4.0.3" - checksum: 3d5935b757f9f2993e59b5164a7a9eeda0de149760495375cde14a4ed725186a7e6c1c0d58f7d42d2f91deb97f3fce1e0aad5591916ef0984278199a85c87c87 +"fast-equals@npm:^5.0.1": + version: 5.0.1 + resolution: "fast-equals@npm:5.0.1" + checksum: 9dc1ef767903600e5694a89a787782fc3a4f56cc04d235afc13616c848c33563b8f415b1c6a248b2a236424f624aa1a7513f46b7fa69590a640e7784f1296bce languageName: node linkType: hard -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9": - version: 3.2.12 - resolution: "fast-glob@npm:3.2.12" +"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" dependencies: - "@nodelib/fs.stat": ^2.0.2 - "@nodelib/fs.walk": ^1.2.3 - glob-parent: ^5.1.2 - merge2: ^1.3.0 - micromatch: ^4.0.4 - checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 222512e9315a0efca1276af9adb2127f02105d7288fa746145bf45e2716383fb79eb983c89601a72a399a56b7c18d38ce70457c5466218c5f13fad957cee16df languageName: node linkType: hard @@ -4233,40 +4466,31 @@ __metadata: version: 2.2.1 resolution: "fast-json-patch@npm:2.2.1" dependencies: - fast-deep-equal: ^2.0.1 - checksum: 955aebb3f873d1fb0452a5d8c34865ce4c3c6cdafeb7d3ad98d43b467de9a5a0d304132f8595fd2b373f8f4d200605947e865286b180f3a55e8377a634893164 + fast-deep-equal: "npm:^2.0.1" + checksum: 802924e8f6e50267c1c92c9a52de59e9e4d448a383c32119e228a17ef17fe90e54f52bb4211a616a9c93e708f873cc39d5df10ae77fe32cd5a22c4b9cb69cae9 languageName: node linkType: hard "fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + checksum: 2c20055c1fa43c922428f16ca8bb29f2807de63e5c851f665f7ac9790176c01c3b40335257736b299764a8d383388dabc73c8083b8e1bc3d99f0a941444ec60e languageName: node linkType: hard -"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": +"fast-levenshtein@npm:^2.0.6": version: 2.0.6 resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + checksum: eb7e220ecf2bab5159d157350b81d01f75726a4382f5a9266f42b9150c4523b9795f7f5d9fbbbeaeac09a441b2369f05ee02db48ea938584205530fe5693cfe1 languageName: node linkType: hard "fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" - dependencies: - reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a - languageName: node - linkType: hard - -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" + version: 1.16.0 + resolution: "fastq@npm:1.16.0" dependencies: - pend: ~1.2.0 - checksum: c8585fd5713f4476eb8261150900d2cb7f6ff2d87f8feb306ccc8a1122efd152f1783bdb2b8dc891395744583436bfd8081d8e63ece0ec8687eeefea394d4ff2 + reusify: "npm:^1.0.4" + checksum: de151543aab9d91900ed5da88860c46987ece925c628df586fac664235f25e020ec20729e1c032edb5fd2520fd4aa5b537d69e39b689e65e82112cfbecb4479e languageName: node linkType: hard @@ -4274,18 +4498,17 @@ __metadata: version: 3.2.0 resolution: "figures@npm:3.2.0" dependencies: - escape-string-regexp: ^1.0.5 - checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b + escape-string-regexp: "npm:^1.0.5" + checksum: a3bf94e001be51d3770500789157f067218d4bc681a65e1f69d482de15120bcac822dceb1a7b3803f32e4e3a61a46df44f7f2c8ba95d6375e7491502e0dd3d97 languageName: node linkType: hard -"figures@npm:^5.0.0": - version: 5.0.0 - resolution: "figures@npm:5.0.0" +"figures@npm:^6.0.1": + version: 6.0.1 + resolution: "figures@npm:6.0.1" dependencies: - escape-string-regexp: ^5.0.0 - is-unicode-supported: ^1.2.0 - checksum: e6e8b6d1df2f554d4effae4a5ceff5d796f9449f6d4e912d74dab7d5f25916ecda6c305b9084833157d56485a0c78b37164430ddc5675bcee1330e346710669e + is-unicode-supported: "npm:^2.0.0" + checksum: 2fb988f01bed5ae6915a0593342f083bd1b09d0a6bf9aa58d0882c446cf13b59059f8a967acd676763278107b87b762231430d610d8f3be87c90ce87984a32a1 languageName: node linkType: hard @@ -4293,42 +4516,58 @@ __metadata: version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + flat-cache: "npm:^3.0.4" + checksum: 099bb9d4ab332cb93c48b14807a6918a1da87c45dce91d4b61fd40e6505d56d0697da060cb901c729c90487067d93c9243f5da3dc9c41f0358483bfdebca736b + languageName: node + linkType: hard + +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" + dependencies: + flat-cache: "npm:^4.0.0" + checksum: afe55c4de4e0d226a23c1eae62a7219aafb390859122608a89fa4df6addf55c7fd3f1a2da6f5b41e7cdff496e4cf28bbd215d53eab5c817afa96d2b40c81bfb0 languageName: node linkType: hard -"file-type@npm:^18.0.0": - version: 18.0.0 - resolution: "file-type@npm:18.0.0" +"file-type@npm:^18.7.0": + version: 18.7.0 + resolution: "file-type@npm:18.7.0" dependencies: - readable-web-to-node-stream: ^3.0.2 - strtok3: ^7.0.0 - token-types: ^5.0.1 - checksum: 67f5a927b8030e35a4faf9dd9dea9e17bcb042fb61b9851b7dd1b1b3bb3ecfdd9f83bc3bc72686316ea2bac70df652c61e10affa9b5957b1a3d731df4925e3cb + readable-web-to-node-stream: "npm:^3.0.2" + strtok3: "npm:^7.0.0" + token-types: "npm:^5.0.1" + checksum: 95b70313d697484bb9613dd822a29554e9754b49f4d62f17e399649c981a12556776b4ee83b0a62b752fc9048ac79f6cf79ad13b2a750d89afa170902c7b0029 + languageName: node + linkType: hard + +"file-uri-to-path@npm:1.0.0": + version: 1.0.0 + resolution: "file-uri-to-path@npm:1.0.0" + checksum: b648580bdd893a008c92c7ecc96c3ee57a5e7b6c4c18a9a09b44fb5d36d79146f8e442578bc0e173dc027adf3987e254ba1dfd6e3ec998b7c282873010502144 languageName: node linkType: hard "filing-cabinet@npm:^3.0.1": - version: 3.3.0 - resolution: "filing-cabinet@npm:3.3.0" - dependencies: - app-module-path: ^2.2.0 - commander: ^2.20.3 - debug: ^4.3.3 - enhanced-resolve: ^5.8.3 - is-relative-path: ^1.0.2 - module-definition: ^3.3.1 - module-lookup-amd: ^7.0.1 - resolve: ^1.21.0 - resolve-dependency-path: ^2.0.0 - sass-lookup: ^3.0.0 - stylus-lookup: ^3.0.1 - tsconfig-paths: ^3.10.1 - typescript: ^3.9.7 + version: 3.3.1 + resolution: "filing-cabinet@npm:3.3.1" + dependencies: + app-module-path: "npm:^2.2.0" + commander: "npm:^2.20.3" + debug: "npm:^4.3.3" + enhanced-resolve: "npm:^5.8.3" + is-relative-path: "npm:^1.0.2" + module-definition: "npm:^3.3.1" + module-lookup-amd: "npm:^7.0.1" + resolve: "npm:^1.21.0" + resolve-dependency-path: "npm:^2.0.0" + sass-lookup: "npm:^3.0.0" + stylus-lookup: "npm:^3.0.1" + tsconfig-paths: "npm:^3.10.1" + typescript: "npm:^3.9.7" bin: filing-cabinet: bin/cli.js - checksum: fbf4dfabf22c28233f79124e097148d28786120a456d1a164f9f716968cd2b1286f72355a27aeb99d1026d9deb174bddaec73a210223f3623ceddc7853e4a72a + checksum: c4e71efffa1714e2fe862fa7741446a6307ce03a27f01faed3cc4969c9fc395dddd4d1e095569ce0bf6b6c95826f2665883465971f3346ba179f815b888e8151 languageName: node linkType: hard @@ -4336,8 +4575,8 @@ __metadata: version: 7.0.1 resolution: "fill-range@npm:7.0.1" dependencies: - to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + to-regex-range: "npm:^5.0.1" + checksum: e260f7592fd196b4421504d3597cc76f4a1ca7a9488260d533b611fc3cefd61e9a9be1417cb82d3b01ad9f9c0ff2dbf258e1026d2445e26b0cf5148ff4250429 languageName: node linkType: hard @@ -4345,14 +4584,14 @@ __metadata: version: 1.2.0 resolution: "finalhandler@npm:1.2.0" dependencies: - debug: 2.6.9 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - on-finished: 2.4.1 - parseurl: ~1.3.3 - statuses: 2.0.1 - unpipe: ~1.0.0 - checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716 + debug: "npm:2.6.9" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:2.0.1" + unpipe: "npm:~1.0.0" + checksum: 635718cb203c6d18e6b48dfbb6c54ccb08ea470e4f474ddcef38c47edcf3227feec316f886dd701235997d8af35240cae49856721ce18f539ad038665ebbf163 languageName: node linkType: hard @@ -4360,8 +4599,8 @@ __metadata: version: 2.1.3 resolution: "find-node-modules@npm:2.1.3" dependencies: - findup-sync: ^4.0.0 - merge: ^2.1.1 + findup-sync: "npm:^4.0.0" + merge: "npm:^2.1.1" checksum: 4b8a194ffd56ccf1a1033de35e2ee8209869b05cce68ff7c4ab0dbf04e63fd7196283383eee4c84596c7b311755b2836815209d558234cadc330a87881e5a3f4 languageName: node linkType: hard @@ -4369,7 +4608,14 @@ __metadata: "find-root@npm:1.1.0": version: 1.1.0 resolution: "find-root@npm:1.1.0" - checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf + checksum: caa799c976a14925ba7f31ca1a226fe73d3aa270f4f1b623fcfeb1c6e263111db4beb807d8acd31bd4d48d44c343b93688a9288dfbccca27463c36a0301b0bb9 + languageName: node + linkType: hard + +"find-up-simple@npm:^1.0.0": + version: 1.0.0 + resolution: "find-up-simple@npm:1.0.0" + checksum: 91c3d51c1111b5eb4e6e6d71d21438f6571a37a69dc288d4222b98996756e2f472fa5393a4dddb5e1a84929405d87e86f4bdce798ba84ee513b79854960ec140 languageName: node linkType: hard @@ -4377,7 +4623,7 @@ __metadata: version: 2.1.0 resolution: "find-up@npm:2.1.0" dependencies: - locate-path: ^2.0.0 + locate-path: "npm:^2.0.0" checksum: 43284fe4da09f89011f08e3c32cd38401e786b19226ea440b75386c1b12a4cb738c94969808d53a84f564ede22f732c8409e3cfc3f7fb5b5c32378ad0bbf28bd languageName: node linkType: hard @@ -4386,7 +4632,7 @@ __metadata: version: 3.0.0 resolution: "find-up@npm:3.0.0" dependencies: - locate-path: ^3.0.0 + locate-path: "npm:^3.0.0" checksum: 38eba3fe7a66e4bc7f0f5a1366dc25508b7cfc349f852640e3678d26ad9a6d7e2c43eff0a472287de4a9753ef58f066a0ea892a256fa3636ad51b3fe1e17fae9 languageName: node linkType: hard @@ -4395,8 +4641,8 @@ __metadata: version: 4.1.0 resolution: "find-up@npm:4.1.0" dependencies: - locate-path: ^5.0.0 - path-exists: ^4.0.0 + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 languageName: node linkType: hard @@ -4405,48 +4651,50 @@ __metadata: version: 5.0.0 resolution: "find-up@npm:5.0.0" dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 languageName: node linkType: hard -"find-up@npm:^6.0.0": - version: 6.3.0 - resolution: "find-up@npm:6.3.0" - dependencies: - locate-path: ^7.1.0 - path-exists: ^5.0.0 - checksum: 9a21b7f9244a420e54c6df95b4f6fc3941efd3c3e5476f8274eb452f6a85706e7a6a90de71353ee4f091fcb4593271a6f92810a324ec542650398f928783c280 - languageName: node - linkType: hard - "findup-sync@npm:^4.0.0": version: 4.0.0 resolution: "findup-sync@npm:4.0.0" dependencies: - detect-file: ^1.0.0 - is-glob: ^4.0.0 - micromatch: ^4.0.2 - resolve-dir: ^1.0.1 + detect-file: "npm:^1.0.0" + is-glob: "npm:^4.0.0" + micromatch: "npm:^4.0.2" + resolve-dir: "npm:^1.0.1" checksum: 94131e1107ad63790ed00c4c39ca131a93ea602607bd97afeffd92b69a9a63cf2c6f57d6db88cb753fe748ac7fde79e1e76768ff784247026b7c5ebf23ede3a0 languageName: node linkType: hard "flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" dependencies: - flatted: ^3.1.0 - rimraf: ^3.0.2 - checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: 02381c6ece5e9fa5b826c9bbea481d7fd77645d96e4b0b1395238124d581d10e56f17f723d897b6d133970f7a57f0fab9148cbbb67237a0a0ffe794ba60c0c70 languageName: node linkType: hard -"flatted@npm:^3.1.0": - version: 3.2.7 - resolution: "flatted@npm:3.2.7" - checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 +"flat-cache@npm:^4.0.0": + version: 4.0.0 + resolution: "flat-cache@npm:4.0.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + rimraf: "npm:^5.0.5" + checksum: 344c60d397fab339b86b317d5c32dedeb31142b72160d7e17e0fc218c0a5f0aa09a48441ec8f5638e18c723c1d923a3d2a2eb922ae58656963306b42d2f47aec + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.2.9 + resolution: "flatted@npm:3.2.9" + checksum: dc2b89e46a2ebde487199de5a4fcb79e8c46f984043fea5c41dbf4661eb881fefac1c939b5bdcd8a09d7f960ec364f516970c7ec44e58ff451239c07fd3d419b languageName: node linkType: hard @@ -4468,39 +4716,32 @@ __metadata: version: 0.3.3 resolution: "for-each@npm:0.3.3" dependencies: - is-callable: ^1.1.3 - checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + is-callable: "npm:^1.1.3" + checksum: fdac0cde1be35610bd635ae958422e8ce0cc1313e8d32ea6d34cfda7b60850940c1fd07c36456ad76bd9c24aef6ff5e03b02beb58c83af5ef6c968a64eada676 languageName: node linkType: hard -"foreground-child@npm:^2.0.0": - version: 2.0.0 - resolution: "foreground-child@npm:2.0.0" +"foreground-child@npm:^3.1.0, foreground-child@npm:^3.1.1": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" dependencies: - cross-spawn: ^7.0.0 - signal-exit: ^3.0.2 - checksum: f77ec9aff621abd6b754cb59e690743e7639328301fbea6ff09df27d2befaf7dd5b77cec51c32323d73a81a7d91caaf9413990d305cbe3d873eec4fe58960956 + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 087edd44857d258c4f73ad84cb8df980826569656f2550c341b27adf5335354393eec24ea2fabd43a253233fb27cee177ebe46bd0b7ea129c77e87cb1e9936fb languageName: node linkType: hard "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" - checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 + checksum: 29ba9fd347117144e97cbb8852baae5e8b2acb7d1b591ef85695ed96f5b933b1804a7fac4a15dd09ca7ac7d0cdc104410e8102aae2dd3faa570a797ba07adb81 languageName: node linkType: hard "fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" - checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 - languageName: node - linkType: hard - -"fs-constants@npm:^1.0.0": - version: 1.0.0 - resolution: "fs-constants@npm:1.0.0" - checksum: 18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d + checksum: 64c88e489b5d08e2f29664eb3c79c705ff9a8eb15d3e597198ef76546d4ade295897a44abb0abd2700e7ef784b2e3cbf1161e4fbf16f59129193fd1030d16da1 languageName: node linkType: hard @@ -4508,22 +4749,11 @@ __metadata: version: 9.1.0 resolution: "fs-extra@npm:9.1.0" dependencies: - at-least-node: ^1.0.0 - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 - languageName: node - linkType: hard - -"fs-extra@npm:^11.1.0": - version: 11.1.0 - resolution: "fs-extra@npm:11.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: 5ca476103fa1f5ff4a9b3c4f331548f8a3c1881edaae323a4415d3153b5dc11dc6a981c8d1dd93eec8367ceee27b53f8bd27eecbbf66ffcdd04927510c171e7f + at-least-node: "npm:^1.0.0" + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 08600da1b49552ed23dfac598c8fc909c66776dd130fea54fbcad22e330f7fcc13488bb995f6bc9ce5651aa35b65702faf616fe76370ee56f1aade55da982dca languageName: node linkType: hard @@ -4531,101 +4761,123 @@ __metadata: version: 7.0.1 resolution: "fs-extra@npm:7.0.1" dependencies: - graceful-fs: ^4.1.2 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: 141b9dccb23b66a66cefdd81f4cda959ff89282b1d721b98cea19ba08db3dcbe6f862f28841f3cf24bb299e0b7e6c42303908f65093cb7e201708e86ea5a8dcf + graceful-fs: "npm:^4.1.2" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: 3fc6e56ba2f07c00d452163f27f21a7076b72ef7da8a50fef004336d59ef4c34deda11d10ecd73fd8fbcf20e4f575f52857293090b3c9f8741d4e0598be30fea languageName: node linkType: hard -"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": +"fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 + minipass: "npm:^3.0.0" + checksum: 03191781e94bc9a54bd376d3146f90fe8e082627c502185dbf7b9b3032f66b0b142c1115f3b2cc5936575fc1b44845ce903dd4c21bec2a8d69f3bd56f9cee9ec + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: af143246cf6884fe26fa281621d45cfe111d34b30535a475bfa38dafe343dadb466c047a924ffc7d6b7b18265df4110224ce3803806dbb07173bf2087b648d7f languageName: node linkType: hard "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + checksum: e703107c28e362d8d7b910bbcbfd371e640a3bb45ae157a362b5952c0030c0b6d4981140ec319b347bce7adc025dd7813da1ff908a945ac214d64f5402a51b96 languageName: node linkType: hard -"fsevents@npm:~2.3.2": +"fsevents@npm:2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" dependencies: - node-gyp: latest - checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + node-gyp: "npm:latest" + checksum: 6b5b6f5692372446ff81cf9501c76e3e0459a4852b3b5f1fc72c103198c125a6b8c72f5f166bdd76ffb2fca261e7f6ee5565daf80dca6e571e55bcc589cc1256 conditions: os=darwin languageName: node linkType: hard -"fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" +"fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" dependencies: - node-gyp: latest + node-gyp: "npm:latest" + checksum: 4c1ade961ded57cdbfbb5cac5106ec17bc8bccd62e16343c569a0ceeca83b9dfef87550b4dc5cbb89642da412b20c5071f304c8c464b80415446e8e155a038c0 conditions: os=darwin languageName: node linkType: hard -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a +"fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5": - version: 1.1.5 - resolution: "function.prototype.name@npm:1.1.5" +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 - functions-have-names: ^1.2.2 - checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + node-gyp: "npm:latest" + conditions: os=darwin languageName: node linkType: hard -"functional-red-black-tree@npm:^1.0.1": - version: 1.0.1 - resolution: "functional-red-black-tree@npm:1.0.1" - checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 185e20d20f10c8d661d59aac0f3b63b31132d492e1b11fcc2a93cb2c47257ebaee7407c38513efd2b35cafdf972d9beb2ea4593c1e0f3bf8f2744836928d7454 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + functions-have-names: "npm:^1.2.3" + checksum: 4d40be44d4609942e4e90c4fff77a811fa936f4985d92d2abfcf44f673ba344e2962bf223a33101f79c1a056465f36f09b072b9c289d7660ca554a12491cd5a2 languageName: node linkType: hard -"functions-have-names@npm:^1.2.2": +"functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" - checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 + checksum: 0ddfd3ed1066a55984aaecebf5419fbd9344a5c38dd120ffb0739fac4496758dcf371297440528b115e4367fc46e3abc86a2cc0ff44612181b175ae967a11a05 languageName: node linkType: hard -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" +"gauge@npm:^3.0.0": + version: 3.0.2 + resolution: "gauge@npm:3.0.2" dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d + aproba: "npm:^1.0.3 || ^2.0.0" + color-support: "npm:^1.1.2" + console-control-strings: "npm:^1.0.0" + has-unicode: "npm:^2.0.1" + object-assign: "npm:^4.1.1" + signal-exit: "npm:^3.0.0" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + wide-align: "npm:^1.1.2" + checksum: 46df086451672a5fecd58f7ec86da74542c795f8e00153fbef2884286ce0e86653c3eb23be2d0abb0c4a82b9b2a9dec3b09b6a1cf31c28085fa0376599a26589 languageName: node linkType: hard -"gensequence@npm:^4.0.3": - version: 4.0.3 - resolution: "gensequence@npm:4.0.3" - checksum: 541824a242bb0a64e7e58b595c753a5a9cd07c02a1c6c41928e0d6e09f16047e774deab470ae484e4aded29cfe03a6325a3090dd6e5a0c32ff3726606b09ffc4 +"gensequence@npm:^6.0.0": + version: 6.0.0 + resolution: "gensequence@npm:6.0.0" + checksum: 95bc7233ee3426d266ff6e2b1554245e4dcedc49fde02bfd38465399a03e11d363364fa3b2d512f923b07232839290d689502f22d945ed508c0b679118d4b51e languageName: node linkType: hard @@ -4633,9 +4885,19 @@ __metadata: version: 3.0.2 resolution: "get-amd-module-type@npm:3.0.2" dependencies: - ast-module-types: ^3.0.0 - node-source-walk: ^4.2.2 - checksum: d16fac5037f63027992e6ebd2d642e6d4feef2f8fa71ff3da6aa76006e05b3dcd4aa6044b4c5966f13ba5d412fd7c1367d910df86b58f9c13f53cbb35d2e4b72 + ast-module-types: "npm:^3.0.0" + node-source-walk: "npm:^4.2.2" + checksum: dd41d3d966677ee03b2f51ffe0e9cd1e37df4757ec490c31d67840042d6dc3173c019ec82d03ed12282338239589b3380dac6c59508b4f4ab802f28f1c9c8a8d + languageName: node + linkType: hard + +"get-amd-module-type@npm:^4.1.0": + version: 4.1.0 + resolution: "get-amd-module-type@npm:4.1.0" + dependencies: + ast-module-types: "npm:^4.0.0" + node-source-walk: "npm:^5.0.1" + checksum: b12fe94eeee65df44010d7046f5435661d220b1f8132fbc11e525f2eab4ef2d9e6114c439e9905621f71449e5e43f588f21d29243a53bef36bcfcf5252481b6d languageName: node linkType: hard @@ -4646,14 +4908,22 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3": - version: 1.1.3 - resolution: "get-intrinsic@npm:1.1.3" +"get-east-asian-width@npm:^1.0.0": + version: 1.2.0 + resolution: "get-east-asian-width@npm:1.2.0" + checksum: c9b280e7c7c67fb89fa17e867c4a9d1c9f1321aba2a9ee27bff37fb6ca9552bccda328c70a80c1f83a0e39ba1b7e3427e60f47823402d19e7a41b83417ec047a + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": + version: 1.2.2 + resolution: "get-intrinsic@npm:1.2.2" dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-symbols: ^1.0.3 - checksum: 152d79e87251d536cf880ba75cfc3d6c6c50e12b3a64e1ea960e73a3752b47c69f46034456eae1b0894359ce3bc64c55c186f2811f8a788b75b638b06fab228a + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: aa96db4f809734d26d49b59bc8669d73a0ae792da561514e987735573a1dfaede516cd102f217a078ea2b42d4c4fb1f83d487932cb15d49826b726cc9cd4470b languageName: node linkType: hard @@ -4668,20 +4938,13 @@ __metadata: version: 4.2.1 resolution: "get-pkg-repo@npm:4.2.1" dependencies: - "@hutson/parse-repository-url": ^3.0.0 - hosted-git-info: ^4.0.0 - through2: ^2.0.0 - yargs: ^16.2.0 + "@hutson/parse-repository-url": "npm:^3.0.0" + hosted-git-info: "npm:^4.0.0" + through2: "npm:^2.0.0" + yargs: "npm:^16.2.0" bin: get-pkg-repo: src/cli.js - checksum: 5abf169137665e45b09a857b33ad2fdcf2f4a09f0ecbd0ebdd789a7ce78c39186a21f58621127eb724d2d4a3a7ee8e6bd4ac7715efda01ad5200665afc218e0d - languageName: node - linkType: hard - -"get-stdin@npm:^8.0.0": - version: 8.0.0 - resolution: "get-stdin@npm:8.0.0" - checksum: 40128b6cd25781ddbd233344f1a1e4006d4284906191ed0a7d55ec2c1a3e44d650f280b2c9eeab79c03ac3037da80257476c0e4e5af38ddfb902d6ff06282d77 + checksum: 033225cf7cdf3f61885f45c492975f412268cf9f3ec68cc42df9af1bec54cf0b0c5ddb7391a6dc973361e7e10df9d432cca0050892ba8856bc50413e0741804f languageName: node linkType: hard @@ -4692,19 +4955,10 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: ^3.0.0 - checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0": +"get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" - checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad + checksum: 781266d29725f35c59f1d214aedc92b0ae855800a980800e2923b3fbc4e56b3cb6e462c42e09a1cf1a00c64e056a78fa407cbe06c7c92b7e5cd49b4b85c2a497 languageName: node linkType: hard @@ -4712,9 +4966,9 @@ __metadata: version: 1.0.0 resolution: "get-symbol-description@npm:1.0.0" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.1" + checksum: 7e5f298afe0f0872747dce4a949ce490ebc5d6dd6aefbbe5044543711c9b19a4dfaebdbc627aee99e1299d58a435b2fbfa083458c1d58be6dc03a3bada24d359 languageName: node linkType: hard @@ -4722,14 +4976,14 @@ __metadata: version: 2.0.11 resolution: "git-raw-commits@npm:2.0.11" dependencies: - dargs: ^7.0.0 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 + dargs: "npm:^7.0.0" + lodash: "npm:^4.17.15" + meow: "npm:^8.0.0" + split2: "npm:^3.0.0" + through2: "npm:^4.0.0" bin: git-raw-commits: cli.js - checksum: c178af43633684106179793b6e3473e1d2bb50bb41d04e2e285ea4eef342ca4090fee6bc8a737552fde879d22346c90de5c49f18c719a0f38d4c934f258a0f79 + checksum: 04e02b3da7c0e13a55f3e6fa8c1c5f06f7d0d641a9f90d896393ef0144bfcf91aa59beede68d14d61ed56aaf09f2c8dba175563c47ec000a8cf70f9df4877577 languageName: node linkType: hard @@ -4737,8 +4991,8 @@ __metadata: version: 2.0.0 resolution: "git-remote-origin-url@npm:2.0.0" dependencies: - gitconfiglocal: ^1.0.0 - pify: ^2.3.0 + gitconfiglocal: "npm:^1.0.0" + pify: "npm:^2.3.0" checksum: 85263a09c044b5f4fe2acc45cbb3c5331ab2bd4484bb53dfe7f3dd593a4bf90a9786a2e00b9884524331f50b3da18e8c924f01c2944087fc7f342282c4437b73 languageName: node linkType: hard @@ -4747,11 +5001,11 @@ __metadata: version: 4.1.1 resolution: "git-semver-tags@npm:4.1.1" dependencies: - meow: ^8.0.0 - semver: ^6.0.0 + meow: "npm:^8.0.0" + semver: "npm:^6.0.0" bin: git-semver-tags: cli.js - checksum: e16d02a515c0f88289a28b5bf59bf42c0dc053765922d3b617ae4b50546bd4f74a25bf3ad53b91cb6c1159319a2e92533b160c573b856c2629125c8b26b3b0e3 + checksum: ab2ad6c7c81aeb6e703f9c9dd1d590a4c546a86b036540780ca414eb6d327f582a9c2d164899ccf0c20e1e875ec4db13b1e665c12c9d5c802eee79d9c71fdd0f languageName: node linkType: hard @@ -4759,17 +5013,17 @@ __metadata: version: 1.0.0 resolution: "gitconfiglocal@npm:1.0.0" dependencies: - ini: ^1.3.2 + ini: "npm:^1.3.2" checksum: e6d2764c15bbab6d1d1000d1181bb907f6b3796bb04f63614dba571b18369e0ecb1beaf27ce8da5b24307ef607e3a5f262a67cb9575510b9446aac697d421beb languageName: node linkType: hard -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": +"glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + is-glob: "npm:^4.0.1" + checksum: 32cd106ce8c0d83731966d31517adb766d02c3812de49c30cfe0675c7c0ae6630c11214c54a5ae67aca882cf738d27fd7768f21aa19118b9245950554be07247 languageName: node linkType: hard @@ -4777,7 +5031,7 @@ __metadata: version: 6.0.2 resolution: "glob-parent@npm:6.0.2" dependencies: - is-glob: ^4.0.3 + is-glob: "npm:^4.0.3" checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 languageName: node linkType: hard @@ -4786,26 +5040,50 @@ __metadata: version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 59452a9202c81d4508a43b8af7082ca5c76452b9fcc4a9ab17655822e6ce9b21d4f8fbadabe4fe3faef448294cec249af305e2cd824b7e9aaf689240e5e96a7b + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^2.3.5" + minimatch: "npm:^9.0.1" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry: "npm:^1.10.1" + bin: + glob: dist/esm/bin.mjs + checksum: 38bdb2c9ce75eb5ed168f309d4ed05b0798f640b637034800a6bf306f39d35409bf278b0eaaffaec07591085d3acb7184a201eae791468f0f617771c2486a6a8 + languageName: node + linkType: hard + +"glob@npm:^8.0.3": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^5.0.1" + once: "npm:^1.3.0" + checksum: 9aab1c75eb087c35dbc41d1f742e51d0507aa2b14c910d96fb8287107a10a22f4bbdce26fc0a3da4c69a20f7b26d62f1640b346a4f6e6becfff47f335bb1dc5e languageName: node linkType: hard -"glob@npm:^8.0.1, glob@npm:^8.0.3": - version: 8.0.3 - resolution: "glob@npm:8.0.3" +"global-directory@npm:^4.0.1": + version: 4.0.1 + resolution: "global-directory@npm:4.0.1" dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^5.0.1 - once: ^1.3.0 - checksum: 50bcdea19d8e79d8de5f460b1939ffc2b3299eac28deb502093fdca22a78efebc03e66bf54f0abc3d3d07d8134d19a32850288b7440d77e072aa55f9d33b18c5 + ini: "npm:4.1.1" + checksum: 5b4df24438a4e5f21e43fbdd9e54f5e12bb48dce01a0a83b415d8052ce91be2d3a97e0c8f98a535e69649b2190036155e9f0f7d3c62f9318f31bdc3fd4f235f5 languageName: node linkType: hard @@ -4813,7 +5091,7 @@ __metadata: version: 0.1.1 resolution: "global-dirs@npm:0.1.1" dependencies: - ini: ^1.3.4 + ini: "npm:^1.3.4" checksum: 10624f5a8ddb8634c22804c6b24f93fb591c3639a6bc78e3584e01a238fc6f7b7965824184e57d63f6df36980b6c191484ad7bc6c35a1599b8f1d64be64c2a4a languageName: node linkType: hard @@ -4822,10 +5100,10 @@ __metadata: version: 1.0.0 resolution: "global-modules@npm:1.0.0" dependencies: - global-prefix: ^1.0.1 - is-windows: ^1.0.1 - resolve-dir: ^1.0.0 - checksum: 10be68796c1e1abc1e2ba87ec4ea507f5629873b119ab0cd29c07284ef2b930f1402d10df01beccb7391dedd9cd479611dd6a24311c71be58937beaf18edf85e + global-prefix: "npm:^1.0.1" + is-windows: "npm:^1.0.1" + resolve-dir: "npm:^1.0.0" + checksum: e4031a01c0c7401349bb69e1499c7268d636552b16374c0002d677c7a6185da6782a2927a7a3a7c046eb7be97cd26b3c7b1b736f9818ecc7ac09e9d61449065e languageName: node linkType: hard @@ -4833,21 +5111,21 @@ __metadata: version: 1.0.2 resolution: "global-prefix@npm:1.0.2" dependencies: - expand-tilde: ^2.0.2 - homedir-polyfill: ^1.0.1 - ini: ^1.3.4 - is-windows: ^1.0.1 - which: ^1.2.14 - checksum: 061b43470fe498271bcd514e7746e8a8535032b17ab9570517014ae27d700ff0dca749f76bbde13ba384d185be4310d8ba5712cb0e74f7d54d59390db63dd9a0 + expand-tilde: "npm:^2.0.2" + homedir-polyfill: "npm:^1.0.1" + ini: "npm:^1.3.4" + is-windows: "npm:^1.0.1" + which: "npm:^1.2.14" + checksum: 68cf78f81cd85310095ca1f0ec22dd5f43a1059646b2c7b3fc4a7c9ce744356e66ca833adda4e5753e38021847aaec393a159a029ba2d257c08ccb3f00ca2899 languageName: node linkType: hard "globals@npm:^13.19.0": - version: 13.19.0 - resolution: "globals@npm:13.19.0" + version: 13.24.0 + resolution: "globals@npm:13.24.0" dependencies: - type-fest: ^0.20.2 - checksum: a000dbd00bcf28f0941d8a29c3522b1c3b8e4bfe4e60e262c477a550c3cbbe8dbe2925a6905f037acd40f9a93c039242e1f7079c76b0fd184bc41dcc3b5c8e2e + type-fest: "npm:^0.20.2" + checksum: 62c5b1997d06674fc7191d3e01e324d3eda4d65ac9cc4e78329fa3b5c4fd42a0e1c8722822497a6964eee075255ce21ccf1eec2d83f92ef3f06653af4d0ee28e languageName: node linkType: hard @@ -4855,8 +5133,8 @@ __metadata: version: 1.0.3 resolution: "globalthis@npm:1.0.3" dependencies: - define-properties: ^1.1.3 - checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 + define-properties: "npm:^1.1.3" + checksum: 45ae2f3b40a186600d0368f2a880ae257e8278b4c7704f0417d6024105ad7f7a393661c5c2fa1334669cd485ea44bc883a08fdd4516df2428aec40c99f52aa89 languageName: node linkType: hard @@ -4864,26 +5142,40 @@ __metadata: version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: - array-union: ^2.1.0 - dir-glob: ^3.0.1 - fast-glob: ^3.2.9 - ignore: ^5.2.0 - merge2: ^1.4.1 - slash: ^3.0.0 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.9" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^3.0.0" + checksum: 288e95e310227bbe037076ea81b7c2598ccbc3122d87abc6dab39e1eec309aa14f0e366a98cdc45237ffcfcbad3db597778c0068217dcb1950fef6249104e1b1 languageName: node linkType: hard -"globby@npm:^13.1.1, globby@npm:^13.1.2": - version: 13.1.3 - resolution: "globby@npm:13.1.3" +"globby@npm:^13.1.4": + version: 13.2.2 + resolution: "globby@npm:13.2.2" dependencies: - dir-glob: ^3.0.1 - fast-glob: ^3.2.11 - ignore: ^5.2.0 - merge2: ^1.4.1 - slash: ^4.0.0 - checksum: 93f06e02002cdf368f7e3d55bd59e7b00784c7cc8fe92c7ee5082cc7171ff6109fda45e1c97a80bb48bc811dedaf7843c7c9186f5f84bde4883ab630e13c43df + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.3.0" + ignore: "npm:^5.2.4" + merge2: "npm:^1.4.1" + slash: "npm:^4.0.0" + checksum: 4494a9d2162a7e4d327988b26be66d8eab87d7f59a83219e74b065e2c3ced23698f68fb10482bf9337133819281803fb886d6ae06afbb2affa743623eb0b1949 + languageName: node + linkType: hard + +"globby@npm:^14.0.0": + version: 14.0.0 + resolution: "globby@npm:14.0.0" + dependencies: + "@sindresorhus/merge-streams": "npm:^1.0.0" + fast-glob: "npm:^3.3.2" + ignore: "npm:^5.2.4" + path-type: "npm:^5.0.0" + slash: "npm:^5.1.0" + unicorn-magic: "npm:^0.1.0" + checksum: 6e7d84bbc69d8d21a07507af090998c6546c385702a350ff14f6fb08207f90ed40bd41c7b19c11a23851c3b86666e79503373e0f8b400a91a29b13952b1e960c languageName: node linkType: hard @@ -4891,10 +5183,10 @@ __metadata: version: 4.3.0 resolution: "gonzales-pe@npm:4.3.0" dependencies: - minimist: ^1.2.5 + minimist: "npm:^1.2.5" bin: gonzales: bin/gonzales.js - checksum: 49d60fc49ad35639e5d55923c1516d3ec2e4de5e6e5913ec3458a479b66623e54a060d568295349b0bb9f96ee970c473ff984d4b82a5cfeaf736c55f0d6dc3b7 + checksum: d1676546bcaa4cb1c6c1fc5de5d62e85960665a13a4c489b02baeb58a10c53a249beef05ceaf21ea801813a559ff17d7b61158aa417211c135bcb8bdcb1701ca languageName: node linkType: hard @@ -4902,49 +5194,40 @@ __metadata: version: 1.0.1 resolution: "gopd@npm:1.0.1" dependencies: - get-intrinsic: ^1.1.3 - checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + get-intrinsic: "npm:^1.1.3" + checksum: 5fbc7ad57b368ae4cd2f41214bd947b045c1a4be2f194a7be1778d71f8af9dbf4004221f3b6f23e30820eb0d052b4f819fe6ebe8221e2a3c6f0ee4ef173421ca languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da - languageName: node - linkType: hard - -"grapheme-splitter@npm:^1.0.4": - version: 1.0.4 - resolution: "grapheme-splitter@npm:1.0.4" - checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 languageName: node linkType: hard -"graphviz@npm:0.0.9": - version: 0.0.9 - resolution: "graphviz@npm:0.0.9" - dependencies: - temp: ~0.4.0 - checksum: fb414f89763d568646f2d899f9a2baa19e1cdf1b97db831f64f2b3f7322609ca1e4e43bcb3d2e3bfc992b9e0f657803559d7a98e289d5aa6dc549d578939d599 +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 6dd60dba97007b21e3a829fab3f771803cc1292977fe610e240ea72afd67e5690ac9eeaafc4a99710e78962e5936ab5a460787c2a1180f1cb0ccfac37d29f897 languageName: node linkType: hard "handlebars@npm:^4.7.7": - version: 4.7.7 - resolution: "handlebars@npm:4.7.7" - dependencies: - minimist: ^1.2.5 - neo-async: ^2.6.0 - source-map: ^0.6.1 - uglify-js: ^3.1.4 - wordwrap: ^1.0.0 + version: 4.7.8 + resolution: "handlebars@npm:4.7.8" + dependencies: + minimist: "npm:^1.2.5" + neo-async: "npm:^2.6.2" + source-map: "npm:^0.6.1" + uglify-js: "npm:^3.1.4" + wordwrap: "npm:^1.0.0" dependenciesMeta: uglify-js: optional: true bin: handlebars: bin/handlebars - checksum: 1e79a43f5e18d15742977cb987923eab3e2a8f44f2d9d340982bcb69e1735ed049226e534d7c1074eaddaf37e4fb4f471a8adb71cddd5bc8cf3f894241df5cee + checksum: bd528f4dd150adf67f3f857118ef0fa43ff79a153b1d943fa0a770f2599e38b25a7a0dbac1a3611a4ec86970fd2325a81310fb788b5c892308c9f8743bd02e11 languageName: node linkType: hard @@ -4958,7 +5241,7 @@ __metadata: "has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": version: 1.0.2 resolution: "has-bigints@npm:1.0.2" - checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b + checksum: 4e0426c900af034d12db14abfece02ce7dbf53f2022d28af1a97913ff4c07adb8799476d57dc44fbca0e07d1dbda2a042c2928b1f33d3f09c15de0640a7fb81b languageName: node linkType: hard @@ -4984,25 +5267,25 @@ __metadata: linkType: hard "has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" + version: 1.0.1 + resolution: "has-property-descriptors@npm:1.0.1" dependencies: - get-intrinsic: ^1.1.1 - checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + get-intrinsic: "npm:^1.2.2" + checksum: 21a47bb080a24e79594aef1ce71e1a18a1c5ab4120308e218088f67ebb7f6f408847541e2d96e5bd00e90eef5c5a49e4ebbdc8fc2d5b365a2c379aef071642f0 languageName: node linkType: hard "has-proto@npm:^1.0.1": version: 1.0.1 resolution: "has-proto@npm:1.0.1" - checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e + checksum: eab2ab0ed1eae6d058b9bbc4c1d99d2751b29717be80d02fd03ead8b62675488de0c7359bc1fdd4b87ef6fd11e796a9631ad4d7452d9324fdada70158c2e5be7 languageName: node linkType: hard "has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": version: 1.0.3 resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + checksum: 464f97a8202a7690dadd026e6d73b1ceeddd60fe6acfd06151106f050303eaa75855aaa94969df8015c11ff7c505f196114d22f7386b4a471038da5874cf5e9b languageName: node linkType: hard @@ -5010,34 +5293,34 @@ __metadata: version: 1.0.0 resolution: "has-tostringtag@npm:1.0.0" dependencies: - has-symbols: ^1.0.2 - checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + has-symbols: "npm:^1.0.2" + checksum: 95546e7132efc895a9ae64a8a7cf52588601fc3d52e0304ed228f336992cdf0baaba6f3519d2655e560467db35a1ed79f6420c286cc91a13aa0647a31ed92570 languageName: node linkType: hard "has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 + checksum: 041b4293ad6bf391e21c5d85ed03f412506d6623786b801c4ab39e4e6ca54993f13201bceb544d92963f9e0024e6e7fbf0cb1d84c9d6b31cb9c79c8c990d13d8 languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: 0c89ee4006606a40f92df5cc3c263342e7fea68110f3e9ef032bd2083650430505db01b6b7926953489517d4027535e4fdc7f970412893d3031c361d3ec8f4b3 languageName: node linkType: hard -"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": - version: 1.1.7 - resolution: "hash.js@npm:1.1.7" +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" dependencies: - inherits: ^2.0.3 - minimalistic-assert: ^1.0.1 - checksum: e350096e659c62422b85fa508e4b3669017311aa4c49b74f19f8e1bc7f3a54a584fdfd45326d4964d6011f2b2d882e38bea775a96046f2a61b7779a979629d8f + function-bind: "npm:^1.1.2" + checksum: c330f8d93f9d23fe632c719d4db3d698ef7d7c367d51548b836069e06a90fa9151e868c8e67353cfe98d67865bf7354855db28fa36eb1b18fa5d4a3f4e7f1c90 languageName: node linkType: hard @@ -5045,10 +5328,10 @@ __metadata: version: 1.0.1 resolution: "hmac-drbg@npm:1.0.1" dependencies: - hash.js: ^1.0.3 - minimalistic-assert: ^1.0.0 - minimalistic-crypto-utils: ^1.0.1 - checksum: bd30b6a68d7f22d63f10e1888aee497d7c2c5c0bb469e66bbdac99f143904d1dfe95f8131f95b3e86c86dd239963c9d972fcbe147e7cffa00e55d18585c43fe0 + hash.js: "npm:^1.0.3" + minimalistic-assert: "npm:^1.0.0" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 0298a1445b8029a69b713d918ecaa84a1d9f614f5857e0c6e1ca517abfa1357216987b2ee08cc6cc73ba82a6c6ddf2ff11b9717a653530ef03be599d4699b836 languageName: node linkType: hard @@ -5056,7 +5339,7 @@ __metadata: version: 1.0.3 resolution: "homedir-polyfill@npm:1.0.3" dependencies: - parse-passwd: ^1.0.0 + parse-passwd: "npm:^1.0.0" checksum: 18dd4db87052c6a2179d1813adea0c4bfcfa4f9996f0e226fefb29eb3d548e564350fa28ec46b0bf1fbc0a1d2d6922ceceb80093115ea45ff8842a4990139250 languageName: node linkType: hard @@ -5064,7 +5347,7 @@ __metadata: "hosted-git-info@npm:^2.1.4": version: 2.8.9 resolution: "hosted-git-info@npm:2.8.9" - checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd + checksum: 96da7d412303704af41c3819207a09ea2cab2de97951db4cf336bb8bce8d8e36b9a6821036ad2e55e67d3be0af8f967a7b57981203fbfb88bc05cd803407b8c3 languageName: node linkType: hard @@ -5072,22 +5355,22 @@ __metadata: version: 4.1.0 resolution: "hosted-git-info@npm:4.1.0" dependencies: - lru-cache: ^6.0.0 - checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 + lru-cache: "npm:^6.0.0" + checksum: 4dc67022b7ecb12829966bd731fb9a5f14d351547aafc6520ef3c8e7211f4f0e69452d24e29eae3d9b17df924d660052e53d8ca321cf3008418fb7e6c7c47d6f languageName: node linkType: hard "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" - checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 + checksum: 034d74029dcca544a34fb6135e98d427acd73019796ffc17383eaa3ec2fe1c0471dcbbc8f8ed39e46e86d43ccd753a160631615e4048285e313569609b66d5b7 languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.0": - version: 4.1.0 - resolution: "http-cache-semantics@npm:4.1.0" - checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 362d5ed66b12ceb9c0a328fb31200b590ab1b02f4a254a697dc796850cc4385603e75f53ec59f768b2dad3bfa1464bd229f7de278d2899a0e3beffc634b6683f languageName: node linkType: hard @@ -5095,49 +5378,49 @@ __metadata: version: 2.0.0 resolution: "http-errors@npm:2.0.0" dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 + depd: "npm:2.0.0" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + toidentifier: "npm:1.0.1" + checksum: 0e7f76ee8ff8a33e58a3281a469815b893c41357378f408be8f6d4aa7d1efafb0da064625518e7078381b6a92325949b119dc38fcb30bdbc4e3a35f78c44c439 languageName: node linkType: hard -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" +"http-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "http-proxy-agent@npm:7.0.0" dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: dbaaf3d9f3fc4df4a5d7ec45d456ec50f575240b557160fa63427b447d1f812dd7fe4a4f17d2e1ba003d231f07edf5a856ea6d91cb32d533062ff20a7803ccac languageName: node linkType: hard -"https-proxy-agent@npm:5.0.1, https-proxy-agent@npm:^5.0.0": +"https-proxy-agent@npm:^5.0.0": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + agent-base: "npm:6" + debug: "npm:4" + checksum: f0dce7bdcac5e8eaa0be3c7368bb8836ed010fb5b6349ffb412b172a203efe8f807d9a6681319105ea1b6901e1972c7b5ea899672a7b9aad58309f766dcbe0df languageName: node linkType: hard -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 +"https-proxy-agent@npm:^7.0.1": + version: 7.0.2 + resolution: "https-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 9ec844f78fd643608239c9c3f6819918631df5cd3e17d104cc507226a39b5d4adda9d790fc9fd63ac0d2bb8a761b2f9f60faa80584a9bf9d7f2e8c5ed0acd330 languageName: node linkType: hard -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 +"human-signals@npm:^4.3.0": + version: 4.3.1 + resolution: "human-signals@npm:4.3.1" + checksum: fa59894c358fe9f2b5549be2fb083661d5e1dff618d3ac70a49ca73495a72e873fbf6c0878561478e521e17d498292746ee391791db95ffe5747bfb5aef8765b languageName: node linkType: hard @@ -5145,8 +5428,8 @@ __metadata: version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" dependencies: - safer-buffer: ">= 2.1.2 < 3" - checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 6d3a2dac6e5d1fb126d25645c25c3a1209f70cceecc68b8ef51ae0da3cdc078c151fade7524a30b12a3094926336831fca09c666ef55b37e2c69638b5d6bd2e3 languageName: node linkType: hard @@ -5154,15 +5437,15 @@ __metadata: version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 24e3292dd3dadaa81d065c6f8c41b274a47098150d444b96e5f53b4638a9a71482921ea6a91a1f59bb71d9796de25e04afd05919fa64c360347ba65d3766f10f languageName: node linkType: hard "ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" - checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e + checksum: d9f2557a59036f16c282aaeb107832dc957a93d73397d89bbad4eb1130560560eb695060145e8e6b3b498b15ab95510226649a0b8f52ae06583575419fe10fc4 languageName: node linkType: hard @@ -5173,10 +5456,10 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.0.5, ignore@npm:^5.2.0": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef +"ignore@npm:^5.0.5, ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.3.0 + resolution: "ignore@npm:5.3.0" + checksum: 51594355cea4c6ad6b28b3b85eb81afa7b988a1871feefd7062baf136c95aa06760ee934fa9590e43d967bd377ce84a4cf6135fbeb6063e063f1182a0e9a3bcd languageName: node linkType: hard @@ -5184,8 +5467,8 @@ __metadata: version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: - parent-module: ^1.0.0 - resolve-from: ^4.0.0 + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa languageName: node linkType: hard @@ -5193,21 +5476,28 @@ __metadata: "import-lazy@npm:~4.0.0": version: 4.0.0 resolution: "import-lazy@npm:4.0.0" - checksum: 22f5e51702134aef78890156738454f620e5fe7044b204ebc057c614888a1dd6fdf2ede0fdcca44d5c173fd64f65c985f19a51775b06967ef58cc3d26898df07 + checksum: 943309cc8eb01ada12700448c288b0384f77a1bc33c7e00fa4cb223c665f467a13ce9aaceb8d2e4cf586b07c1d2828040263dcc069873ce63cfc2ac6fd087971 + languageName: node + linkType: hard + +"import-meta-resolve@npm:^4.0.0": + version: 4.0.0 + resolution: "import-meta-resolve@npm:4.0.0" + checksum: 73f0f1d68f7280cb4415e3a212a6e5d57fbfe61ab6f467df3dad5361529fbd89ac7d8ea2b694412b74985a4226d218ad3fb22fd8f06f5429beda521dc9f0229c languageName: node linkType: hard "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + checksum: 2d30b157a91fe1c1d7c6f653cbf263f039be6c5bfa959245a16d4ee191fc0f2af86c08545b6e6beeb041c56b574d2d5b9f95343d378ab49c0f37394d541e7fc8 languageName: node linkType: hard "indent-string@npm:^4.0.0": version: 4.0.0 resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + checksum: cd3f5cbc9ca2d624c6a1f53f12e6b341659aba0e2d3254ae2b4464aaea8b4294cdb09616abbc59458f980531f2429784ed6a420d48d245bcad0811980c9efae9 languageName: node linkType: hard @@ -5225,114 +5515,114 @@ __metadata: languageName: node linkType: hard -"infer-owner@npm:^1.0.4": - version: 1.0.4 - resolution: "infer-owner@npm:1.0.4" - checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 - languageName: node - linkType: hard - "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: d2ebd65441a38c8336c223d1b80b921b9fa737e37ea466fd7e253cb000c64ae1f17fa59e68130ef5bda92cfd8d36b83d37dab0eb0a4558bcfec8e8cdfd2dcb67 languageName: node linkType: hard "inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + checksum: cd45e923bee15186c07fa4c89db0aace24824c482fb887b528304694b2aa6ff8a898da8657046a5dcf3e46cd6db6c61629551f9215f208d7c3f157cf9b290521 languageName: node linkType: hard "inherits@npm:=2.0.1": version: 2.0.1 resolution: "inherits@npm:2.0.1" - checksum: 6536b9377296d4ce8ee89c5c543cb75030934e61af42dba98a428e7d026938c5985ea4d1e3b87743a5b834f40ed1187f89c2d7479e9d59e41d2d1051aefba07b + checksum: 37165f42e53627edc18d815654a79e7407e356adf480aab77db3a12c978e597f3af632cf0459472dd5a088bc21ee911020f544c0d3c23b45bcfd1cd92fe9e404 + languageName: node + linkType: hard + +"ini@npm:4.1.1": + version: 4.1.1 + resolution: "ini@npm:4.1.1" + checksum: 64c7102301742a7527bb17257d18451410eacf63b4b5648a20e108816c355c21c4e8a1761bbcbf3fe8c4ded3297f1b832b885d5e3e485d781e293ebfaf56fea6 languageName: node linkType: hard "ini@npm:^1.3.2, ini@npm:^1.3.4, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" - checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 + checksum: 314ae176e8d4deb3def56106da8002b462221c174ddb7ce0c49ee72c8cd1f9044f7b10cc555a7d8850982c3b9ca96fc212122749f5234bc2b6fb05fb942ed566 languageName: node linkType: hard -"inquirer@npm:8.2.4": - version: 8.2.4 - resolution: "inquirer@npm:8.2.4" +"inquirer@npm:8.2.5": + version: 8.2.5 + resolution: "inquirer@npm:8.2.5" dependencies: - ansi-escapes: ^4.2.1 - chalk: ^4.1.1 - cli-cursor: ^3.1.0 - cli-width: ^3.0.0 - external-editor: ^3.0.3 - figures: ^3.0.0 - lodash: ^4.17.21 - mute-stream: 0.0.8 - ora: ^5.4.1 - run-async: ^2.4.0 - rxjs: ^7.5.5 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - through: ^2.3.6 - wrap-ansi: ^7.0.0 - checksum: dfcb6529d3af443dfea2241cb471508091b51f5121a088fdb8728b23ec9b349ef0a5e13a0ef2c8e19457b0bed22f7cbbcd561f7a4529d084c562a58c605e2655 + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.1.1" + cli-cursor: "npm:^3.1.0" + cli-width: "npm:^3.0.0" + external-editor: "npm:^3.0.3" + figures: "npm:^3.0.0" + lodash: "npm:^4.17.21" + mute-stream: "npm:0.0.8" + ora: "npm:^5.4.1" + run-async: "npm:^2.4.0" + rxjs: "npm:^7.5.5" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + through: "npm:^2.3.6" + wrap-ansi: "npm:^7.0.0" + checksum: 50a240dfeaca37a14e6a6d11d7d6f7da947be3a9fe1e34ac41db6a49fc27022e7b3875ebe8ccd739497359808694488f3509792cc986f9ac48c43135f4e14172 languageName: node linkType: hard -"internal-slot@npm:^1.0.4": - version: 1.0.4 - resolution: "internal-slot@npm:1.0.4" +"internal-slot@npm:^1.0.5": + version: 1.0.6 + resolution: "internal-slot@npm:1.0.6" dependencies: - get-intrinsic: ^1.1.3 - has: ^1.0.3 - side-channel: ^1.0.4 - checksum: 8974588d06bab4f675573a3b52975370facf6486df51bc0567a982c7024fa29495f10b76c0d4dc742dd951d1b72024fdc1e31bb0bedf1678dc7aacacaf5a4f73 + get-intrinsic: "npm:^1.2.2" + hasown: "npm:^2.0.0" + side-channel: "npm:^1.0.4" + checksum: bc2022eb1f277f2fcb2a60e7ced451c7ffc7a769b12e63c7a3fb247af8b5a1bed06428ce724046a8bca39ed6eb5b6832501a42f2e9a5ec4a9a7dc4e634431616 languageName: node linkType: hard "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + checksum: 1270b11e534a466fb4cf4426cbcc3a907c429389f7f4e4e3b288b42823562e88d6a509ceda8141a507de147ca506141f745005c0aa144569d94cf24a54eb52bc languageName: node linkType: hard "ipaddr.js@npm:1.9.1": version: 1.9.1 resolution: "ipaddr.js@npm:1.9.1" - checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 + checksum: 864d0cced0c0832700e9621913a6429ccdc67f37c1bd78fb8c6789fff35c9d167cb329134acad2290497a53336813ab4798d2794fd675d5eb33b5fdf0982b9ca languageName: node linkType: hard "irregular-plurals@npm:^3.3.0": - version: 3.3.0 - resolution: "irregular-plurals@npm:3.3.0" - checksum: 1282d8adfb00a9718655ce21e5b096d4b31d2115c817a30e1e3254648ae4ac0f84d706cd0cad2a93c64f4bb5c5572ea8f63fcc9766f005a5362031c56d9e77b5 + version: 3.5.0 + resolution: "irregular-plurals@npm:3.5.0" + checksum: 27f04e66402264b78251c03973dd4866aba58b851579b2f1870f3610494a163c20c5161a3eae8fdd49a61a5379ee611460a1781aadc891ce0203bcd7a52e4850 languageName: node linkType: hard -"is-array-buffer@npm:^3.0.0": - version: 3.0.1 - resolution: "is-array-buffer@npm:3.0.1" +"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": + version: 3.0.2 + resolution: "is-array-buffer@npm:3.0.2" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.3 - is-typed-array: ^1.1.10 - checksum: f26ab87448e698285daf707e52a533920449f7abf63714140ffab9d5571aa5a71ac2fa2677e8b793ad0d5d3e40078d4d2c8a0ab39c957e3cfc6513bb6c9dfdc9 + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.0" + is-typed-array: "npm:^1.1.10" + checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 languageName: node linkType: hard "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" - checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f + checksum: 73ced84fa35e59e2c57da2d01e12cd01479f381d7f122ce41dcbb713f09dbfc651315832cd2bf8accba7681a69e4d6f1e03941d94dd10040d415086360e7005e languageName: node linkType: hard @@ -5340,17 +5630,8 @@ __metadata: version: 1.0.4 resolution: "is-bigint@npm:1.0.4" dependencies: - has-bigints: ^1.0.1 - checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: ^2.0.0 - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c + has-bigints: "npm:^1.0.1" + checksum: cc981cf0564c503aaccc1e5f39e994ae16ae2d1a8fcd14721f14ad431809071f39ec568cfceef901cff408045f1a6d6bac90d1b43eeb0b8e3bc34c8eb1bdb4c4 languageName: node linkType: hard @@ -5358,34 +5639,34 @@ __metadata: version: 1.1.2 resolution: "is-boolean-object@npm:1.1.2" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: ba794223b56a49a9f185e945eeeb6b7833b8ea52a335cec087d08196cf27b538940001615d3bb976511287cefe94e5907d55f00bb49580533f9ca9b4515fcc2e languageName: node linkType: hard -"is-builtin-module@npm:^3.2.0": - version: 3.2.0 - resolution: "is-builtin-module@npm:3.2.0" +"is-builtin-module@npm:^3.2.1": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" dependencies: - builtin-modules: ^3.3.0 - checksum: 0315751b898feff0646511c896e88b608a755c5025d0ce9a3ad25783de50be870e47dafb838cebbb06fbb2a948b209ea55348eee267836c9dd40d3a11ec717d3 + builtin-modules: "npm:^3.3.0" + checksum: e8f0ffc19a98240bda9c7ada84d846486365af88d14616e737d280d378695c8c448a621dcafc8332dbf0fcd0a17b0763b845400709963fa9151ddffece90ae88 languageName: node linkType: hard "is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" - checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac + checksum: 48a9297fb92c99e9df48706241a189da362bff3003354aea4048bd5f7b2eb0d823cd16d0a383cece3d76166ba16d85d9659165ac6fcce1ac12e6c649d66dbdb9 languageName: node linkType: hard -"is-core-module@npm:^2.1.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": - version: 2.11.0 - resolution: "is-core-module@npm:2.11.0" +"is-core-module@npm:^2.1.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.5.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" dependencies: - has: ^1.0.3 - checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab + hasown: "npm:^2.0.0" + checksum: d53bd0cc24b0a0351fb4b206ee3908f71b9bbf1c47e9c9e14e5f06d292af1663704d2abd7e67700d6487b2b7864e0d0f6f10a1edf1892864bdffcb197d1845a2 languageName: node linkType: hard @@ -5393,24 +5674,17 @@ __metadata: version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + has-tostringtag: "npm:^1.0.0" + checksum: cc80b3a4b42238fa0d358b9a6230dae40548b349e64a477cb7c5eff9b176ba194c11f8321daaf6dd157e44073e9b7fd01f87db1f14952a88d5657acdcd3a56e2 languageName: node linkType: hard -"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" bin: is-docker: cli.js - checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 - languageName: node - linkType: hard - -"is-error@npm:^2.2.2": - version: 2.2.2 - resolution: "is-error@npm:2.2.2" - checksum: a97b39587150f0d38f9f93f64699807fe3020fe5edbd63548f234dc2ba96fd7c776d66c062bf031dfeb93c7f48db563ff6bde588418ca041da37c659a416f055 + checksum: b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 languageName: node linkType: hard @@ -5435,12 +5709,36 @@ __metadata: languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + is-extglob: "npm:^2.1.1" + checksum: 3ed74f2b0cdf4f401f38edb0442ddfde3092d79d7d35c9919c86641efdbcbb32e45aa3c0f70ce5eecc946896cd5a0f26e4188b9f2b881876f7cb6c505b82da11 + languageName: node + linkType: hard + +"is-immutable-type@npm:^2.0.1": + version: 2.0.1 + resolution: "is-immutable-type@npm:2.0.1" + dependencies: + "@typescript-eslint/type-utils": "npm:^6.0.0" + ts-api-utils: "npm:^1.0.1" + peerDependencies: + eslint: "*" + typescript: ">=4.7.4" + checksum: 12eacd773960f0844a3e4b3d7c6e178cde56a3544335993ba6c45a9dfb7d29d8830be16e4ffa61a4b641420618f1795e7fc073382f2a39084cb59cd9485ecb88 + languageName: node + linkType: hard + +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 languageName: node linkType: hard @@ -5468,7 +5766,7 @@ __metadata: "is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" - checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a + checksum: edbec1a9e6454d68bf595a114c3a72343d2d0be7761d8173dae46c0b73d05bb8fe9398c85d121e7794a66467d2f40b4a610b0be84cd804262d234fc634c86131 languageName: node linkType: hard @@ -5476,15 +5774,15 @@ __metadata: version: 1.0.7 resolution: "is-number-object@npm:1.0.7" dependencies: - has-tostringtag: ^1.0.0 - checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + has-tostringtag: "npm:^1.0.0" + checksum: 8700dcf7f602e0a9625830541345b8615d04953655acbf5c6d379c58eb1af1465e71227e95d501343346e1d49b6f2d53cbc166b1fc686a7ec19151272df582f9 languageName: node linkType: hard "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + checksum: 6a6c3383f68afa1e05b286af866017c78f1226d43ac8cb064e115ff9ed85eb33f5c4f7216c96a71e4dfea289ef52c5da3aef5bbfade8ffe47a0465d70c0c8e86 languageName: node linkType: hard @@ -5502,13 +5800,6 @@ __metadata: languageName: node linkType: hard -"is-path-cwd@npm:^3.0.0": - version: 3.0.0 - resolution: "is-path-cwd@npm:3.0.0" - checksum: bc34d13b6a03dfca4a3ab6a8a5ba78ae4b24f4f1db4b2b031d2760c60d0913bd16a4b980dcb4e590adfc906649d5f5132684079a3972bd219da49deebb9adea8 - languageName: node - linkType: hard - "is-path-inside@npm:^3.0.3": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" @@ -5516,13 +5807,6 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^4.0.0": - version: 4.0.0 - resolution: "is-path-inside@npm:4.0.0" - checksum: 8810fa11c58e6360b82c3e0d6cd7d9c7d0392d3ac9eb10f980b81f9839f40ac6d1d6d6f05d069db0d227759801228f0b072e1b6c343e4469b065ab5fe0b68fe5 - languageName: node - linkType: hard - "is-plain-obj@npm:^1.1.0": version: 1.1.0 resolution: "is-plain-obj@npm:1.1.0" @@ -5544,11 +5828,11 @@ __metadata: languageName: node linkType: hard -"is-reference@npm:^1.2.1": +"is-reference@npm:1.2.1": version: 1.2.1 resolution: "is-reference@npm:1.2.1" dependencies: - "@types/estree": "*" + "@types/estree": "npm:*" checksum: e7b48149f8abda2c10849ea51965904d6a714193d68942ad74e30522231045acf06cbfae5a4be2702fede5d232e61bf50b3183acdc056e6e3afe07fcf4f4b2bc languageName: node linkType: hard @@ -5557,9 +5841,9 @@ __metadata: version: 1.1.4 resolution: "is-regex@npm:1.1.4" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 36d9174d16d520b489a5e9001d7d8d8624103b387be300c50f860d9414556d0485d74a612fdafc6ebbd5c89213d947dcc6b6bff6b2312093f71ea03cbb19e564 languageName: node linkType: hard @@ -5581,15 +5865,8 @@ __metadata: version: 1.0.2 resolution: "is-shared-array-buffer@npm:1.0.2" dependencies: - call-bind: ^1.0.2 - checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 + call-bind: "npm:^1.0.2" + checksum: 23d82259d6cd6dbb7c4ff3e4efeff0c30dbc6b7f88698498c17f9821cb3278d17d2b6303a5341cbd638ab925a28f3f086a6c79b3df70ac986cc526c725d43b4f languageName: node linkType: hard @@ -5604,8 +5881,8 @@ __metadata: version: 1.0.7 resolution: "is-string@npm:1.0.7" dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + has-tostringtag: "npm:^1.0.0" + checksum: 2bc292fe927493fb6dfc3338c099c3efdc41f635727c6ebccf704aeb2a27bca7acb9ce6fd34d103db78692b10b22111a8891de26e12bfa1c5e11e263c99d1fef languageName: node linkType: hard @@ -5613,8 +5890,8 @@ __metadata: version: 1.0.4 resolution: "is-symbol@npm:1.0.4" dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + has-symbols: "npm:^1.0.2" + checksum: a47dd899a84322528b71318a89db25c7ecdec73197182dad291df15ffea501e17e3c92c8de0bfb50e63402747399981a687b31c519971b1fa1a27413612be929 languageName: node linkType: hard @@ -5622,28 +5899,24 @@ __metadata: version: 1.0.1 resolution: "is-text-path@npm:1.0.1" dependencies: - text-extensions: ^1.0.0 + text-extensions: "npm:^1.0.0" checksum: fb5d78752c22b3f73a7c9540768f765ffcfa38c9e421e2b9af869565307fa1ae5e3d3a2ba016a43549742856846566d327da406e94a5846ec838a288b1704fd2 languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": - version: 1.1.10 - resolution: "is-typed-array@npm:1.1.10" +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.9": + version: 1.1.12 + resolution: "is-typed-array@npm:1.1.12" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-tostringtag: ^1.0.0 - checksum: aac6ecb59d4c56a1cdeb69b1f129154ef462bbffe434cb8a8235ca89b42f258b7ae94073c41b3cb7bce37f6a1733ad4499f07882d5d5093a7ba84dfc4ebb8017 + which-typed-array: "npm:^1.1.11" + checksum: d953adfd3c41618d5e01b2a10f21817e4cdc9572772fa17211100aebb3811b6e3c2e308a0558cc87d218a30504cb90154b833013437776551bfb70606fb088ca languageName: node linkType: hard "is-typedarray@npm:^1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" - checksum: 3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7 + checksum: 4b433bfb0f9026f079f4eb3fbaa4ed2de17c9995c3a0b5c800bec40799b4b2a8b4e051b1ada77749deb9ded4ae52fe2096973f3a93ff83df1a5a7184a669478c languageName: node linkType: hard @@ -5654,10 +5927,10 @@ __metadata: languageName: node linkType: hard -"is-unicode-supported@npm:^1.2.0": - version: 1.3.0 - resolution: "is-unicode-supported@npm:1.3.0" - checksum: 20a1fc161afafaf49243551a5ac33b6c4cf0bbcce369fcd8f2951fbdd000c30698ce320de3ee6830497310a8f41880f8066d440aa3eb0a853e2aa4836dd89abc +"is-unicode-supported@npm:^2.0.0": + version: 2.0.0 + resolution: "is-unicode-supported@npm:2.0.0" + checksum: 000b80639dedaf59a385f1c0a57f97a4d1435e0723716f24cc19ad94253a7a0a9f838bdc9ac49b10a29ac93b01f52ae9b2ed358a8876caf1eb74d73b4ede92b2 languageName: node linkType: hard @@ -5686,8 +5959,8 @@ __metadata: version: 1.0.2 resolution: "is-weakref@npm:1.0.2" dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + call-bind: "npm:^1.0.2" + checksum: 0023fd0e4bdf9c338438ffbe1eed7ebbbff7e7e18fb7cdc227caaf9d4bd024a2dcdf6a8c9f40c92192022eac8391243bb9e66cccebecbf6fe1d8a366108f8513 languageName: node linkType: hard @@ -5698,12 +5971,19 @@ __metadata: languageName: node linkType: hard -"is-wsl@npm:^2.2.0": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" +"is-wsl@npm:^3.1.0": + version: 3.1.0 + resolution: "is-wsl@npm:3.1.0" dependencies: - is-docker: ^2.0.0 - checksum: 20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 + is-inside-container: "npm:^1.0.0" + checksum: f9734c81f2f9cf9877c5db8356bfe1ff61680f1f4c1011e91278a9c0564b395ae796addb4bf33956871041476ec82c3e5260ed57b22ac91794d4ae70a1d2f0a9 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 1d8bc7911e13bb9f105b1b3e0b396c787a9e63046af0b8fe0ab1414488ab06b2b099b87a2d8a9e31d21c9a6fad773c7fc8b257c4880f2d957274479d28ca3414 languageName: node linkType: hard @@ -5717,56 +5997,78 @@ __metadata: "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + checksum: 7c9f715c03aff08f35e98b1fadae1b9267b38f0615d501824f9743f3aab99ef10e303ce7db3f186763a0b70a19de5791ebfc854ff884d5a8c4d92211f642ec92 + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e languageName: node linkType: hard "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": - version: 3.2.0 - resolution: "istanbul-lib-coverage@npm:3.2.0" - checksum: a2a545033b9d56da04a8571ed05c8120bf10e9bce01cf8633a3a2b0d1d83dff4ac4fe78d6d5673c27fc29b7f21a41d75f83a36be09f82a61c367b56aa73c1ff9 + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 40bbdd1e937dfd8c830fa286d0f665e81b7a78bdabcd4565f6d5667c99828bda3db7fb7ac6b96a3e2e8a2461ddbc5452d9f8bc7d00cb00075fa6a3e99f5b6a81 languageName: node linkType: hard -"istanbul-lib-report@npm:^3.0.0": - version: 3.0.0 - resolution: "istanbul-lib-report@npm:3.0.0" +"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 86a83421ca1cf2109a9f6d193c06c31ef04a45e72a74579b11060b1e7bb9b6337a4e6f04abfb8857e2d569c271273c65e855ee429376a0d7c91ad91db42accd1 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.6": + version: 3.1.6 + resolution: "istanbul-reports@npm:3.1.6" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: 135c178e509b21af5c446a6951fc01c331331bb0fdb1ed1dd7f68a8c875603c2e2ee5c82801db5feb868e5cc35e9babe2d972d322afc50f6de6cce6431b9b2ff + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" dependencies: - istanbul-lib-coverage: ^3.0.0 - make-dir: ^3.0.0 - supports-color: ^7.1.0 - checksum: 3f29eb3f53c59b987386e07fe772d24c7f58c6897f34c9d7a296f4000de7ae3de9eb95c3de3df91dc65b134c84dee35c54eee572a56243e8907c48064e34ff1b + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 6e6490d676af8c94a7b5b29b8fd5629f21346911ebe2e32931c2a54210134408171c24cee1a109df2ec19894ad04a429402a8438cbf5cc2794585d35428ace76 languageName: node linkType: hard -"istanbul-reports@npm:^3.1.4": - version: 3.1.5 - resolution: "istanbul-reports@npm:3.1.5" - dependencies: - html-escaper: ^2.0.0 - istanbul-lib-report: ^3.0.0 - checksum: 7867228f83ed39477b188ea07e7ccb9b4f5320b6f73d1db93a0981b7414fa4ef72d3f80c4692c442f90fc250d9406e71d8d7ab65bb615cb334e6292b73192b89 +"jiti@npm:^1.19.1": + version: 1.21.0 + resolution: "jiti@npm:1.21.0" + bin: + jiti: bin/jiti.js + checksum: 005a0239e50381b5c9919f59dbab86128367bd64872f3376dbbde54b6523f41bd134bf22909e2a509e38fd87e1c22125ca255b9b6b53e7df0fedd23f737334cc languageName: node linkType: hard "jju@npm:~1.4.0": version: 1.4.0 resolution: "jju@npm:1.4.0" - checksum: 3790481bd2b7827dd6336e6e3dc2dcc6d425679ba7ebde7b679f61dceb4457ea0cda330972494de608571f4973c6dfb5f70fab6f3c5037dbab19ac449a60424f - languageName: node - linkType: hard - -"js-sdsl@npm:^4.1.4": - version: 4.2.0 - resolution: "js-sdsl@npm:4.2.0" - checksum: 2cd0885f7212afb355929d72ca105cb37de7e95ad6031e6a32619eaefa46735a7d0fb682641a0ba666e1519cb138fe76abc1eea8a34e224140c9d94c995171f1 + checksum: 1067ff8ce02221faac5a842116ed0ec79a53312a111d0bf8342a80bd02c0a3fdf0b8449694a65947db0a3e8420e8b326dffb489c7dd5866efc380c0d1708a707 languageName: node linkType: hard "js-sha256@npm:^0.9.0": version: 0.9.0 resolution: "js-sha256@npm:0.9.0" - checksum: ffad54b3373f81581e245866abfda50a62c483803a28176dd5c28fd2d313e0bdf830e77dac7ff8afd193c53031618920f3d98daf21cbbe80082753ab639c0365 + checksum: 4dc16be74bf4e60d8ee2a482cc822c4d4f5cd060d9f92a060fe3ab1f143cd0946edda552cd274459251c279073df15872a5df47fc4bff054bbc3812e396e990b languageName: node linkType: hard @@ -5780,7 +6082,7 @@ __metadata: "js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" - checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 + checksum: af37d0d913fb56aec6dc0074c163cc71cd23c0b8aad5c2350747b6721d37ba118af35abdd8b33c47ec2800de07dedb16a527ca9c530ee004093e04958bd0cbf2 languageName: node linkType: hard @@ -5788,11 +6090,11 @@ __metadata: version: 3.14.1 resolution: "js-yaml@npm:3.14.1" dependencies: - argparse: ^1.0.7 - esprima: ^4.0.0 + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" bin: js-yaml: bin/js-yaml.js - checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + checksum: 9e22d80b4d0105b9899135365f746d47466ed53ef4223c529b3c0f7a39907743fdbd3c4379f94f1106f02755b5e90b2faaf84801a891135544e1ea475d1a1379 languageName: node linkType: hard @@ -5800,10 +6102,10 @@ __metadata: version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: - argparse: ^2.0.1 + argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + checksum: c138a34a3fd0d08ebaf71273ad4465569a483b8a639e0b118ff65698d257c2791d3199e3f303631f2cb98213fa7b5f5d6a4621fd0fff819421b990d30d967140 languageName: node linkType: hard @@ -5811,25 +6113,32 @@ __metadata: version: 3.13.1 resolution: "js-yaml@npm:3.13.1" dependencies: - argparse: ^1.0.7 - esprima: ^4.0.0 + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" bin: js-yaml: bin/js-yaml.js - checksum: 7511b764abb66d8aa963379f7d2a404f078457d106552d05a7b556d204f7932384e8477513c124749fa2de52eb328961834562bd09924902c6432e40daa408bc + checksum: cec89175b065743875fce53e63adc8b89aded77e18d00e54ff80c57ab730f22ccfddaf2fe3e6adab1d6dff59a3d55dd9ae6fc711d46335b7e94c32d3583a5627 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 82876154521b7b68ba71c4f969b91572d1beabadd87bd3a6b236f85fbc7dc4695089191ed60bb59f9340993c51b33d479f45b6ba9f3548beb519705281c32c3c languageName: node linkType: hard "json-parse-better-errors@npm:^1.0.1": version: 1.0.2 resolution: "json-parse-better-errors@npm:1.0.2" - checksum: ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d + checksum: 5553232045359b767b0f2039a6777fede1a8d7dca1a0ffb1f9ef73a7519489ae7f566b2e040f2b4c38edb8e35e37ae07af7f0a52420902f869ee0dbf5dc6c784 languageName: node linkType: hard "json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f + checksum: 5f3a99009ed5f2a5a67d06e2f298cc97bc86d462034173308156f15b43a6e850be8511dc204b9b94566305da2947f7d90289657237d210351a39059ff9d666cf languageName: node linkType: hard @@ -5837,8 +6146,8 @@ __metadata: version: 2.0.0 resolution: "json-schema-migrate@npm:2.0.0" dependencies: - ajv: ^8.0.0 - checksum: 21537305f3a5102695cfeeab997d565516297b240ee560bf7fe5c01ea4d56b65e0fbc4e9a4f9a32819e2cb1874daf43b06eb580e623d0aade0cf50d03ae40418 + ajv: "npm:^8.0.0" + checksum: bb32718273e0a1bcce5f3926f5c93559ceb209af19abb5af441fc1af937cfba39bab9884ae5461d91c5ba6019ea80067226b7c7a5b073fd8ab53133a981c387f languageName: node linkType: hard @@ -5859,41 +6168,41 @@ __metadata: "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + checksum: 12786c2e2f22c27439e6db0532ba321f1d0617c27ad8cb1c352a0e9249a50182fd1ba8b52a18899291604b0c32eafa8afd09e51203f19109a0537f68db2b652d languageName: node linkType: hard "json-stringify-safe@npm:^5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" - checksum: 48ec0adad5280b8a96bb93f4563aa1667fd7a36334f79149abd42446d0989f2ddc58274b479f4819f1f00617957e6344c886c55d05a4e15ebb4ab931e4a6a8ee + checksum: 59169a081e4eeb6f9559ae1f938f656191c000e0512aa6df9f3c8b2437a4ab1823819c6b9fd1818a4e39593ccfd72e9a051fdd3e2d1e340ed913679e888ded8c languageName: node linkType: hard -"json5@npm:^1.0.1": +"json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" dependencies: - minimist: ^1.2.0 + minimist: "npm:^1.2.0" bin: json5: lib/cli.js - checksum: 866458a8c58a95a49bef3adba929c625e82532bcff1fe93f01d29cb02cac7c3fe1f4b79951b7792c2da9de0b32871a8401a6e3c5b36778ad852bf5b8a61165d7 + checksum: a78d812dbbd5642c4f637dd130954acfd231b074965871c3e28a5bbd571f099d623ecf9161f1960c4ddf68e0cc98dee8bebfdb94a71ad4551f85a1afc94b63f6 languageName: node linkType: hard -"json5@npm:^2.1.3, json5@npm:^2.2.1": +"json5@npm:^2.1.3, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: json5: lib/cli.js - checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 + checksum: 1db67b853ff0de3534085d630691d3247de53a2ed1390ba0ddff681ea43e9b3e30ecbdb65c5e9aab49435e44059c23dbd6fee8ee619419ba37465bb0dd7135da languageName: node linkType: hard "jsonc-parser@npm:^3.2.0": version: 3.2.0 resolution: "jsonc-parser@npm:3.2.0" - checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 + checksum: bd68b902e5f9394f01da97921f49c5084b2dc03a0c5b4fdb2a429f8d6f292686c1bf87badaeb0a8148d024192a88f5ad2e57b2918ba43fe25cf15f3371db64d4 languageName: node linkType: hard @@ -5901,11 +6210,11 @@ __metadata: version: 4.0.0 resolution: "jsonfile@npm:4.0.0" dependencies: - graceful-fs: ^4.1.6 + graceful-fs: "npm:^4.1.6" dependenciesMeta: graceful-fs: optional: true - checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e + checksum: 17796f0ab1be8479827d3683433f97ebe0a1c6932c3360fa40348eac36904d69269aab26f8b16da311882d94b42e9208e8b28e490bf926364f3ac9bff134c226 languageName: node linkType: hard @@ -5913,33 +6222,42 @@ __metadata: version: 6.1.0 resolution: "jsonfile@npm:6.1.0" dependencies: - graceful-fs: ^4.1.6 - universalify: ^2.0.0 + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" dependenciesMeta: graceful-fs: optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 + checksum: 03014769e7dc77d4cf05fa0b534907270b60890085dd5e4d60a382ff09328580651da0b8b4cdf44d91e4c8ae64d91791d965f05707beff000ed494a38b6fec85 languageName: node linkType: hard "jsonparse@npm:^1.2.0": version: 1.3.1 resolution: "jsonparse@npm:1.3.1" - checksum: 6514a7be4674ebf407afca0eda3ba284b69b07f9958a8d3113ef1005f7ec610860c312be067e450c569aab8b89635e332cee3696789c750692bb60daba627f4d + checksum: 24531e956f0f19d79e22c157cebd81b37af3486ae22f9bc1028f8c2a4d1b70df48b168ff86f8568d9c2248182de9b6da9f50f685d5e4b9d1d2d339d2a29d15bc languageName: node linkType: hard -"junk@npm:^4.0.0": - version: 4.0.0 - resolution: "junk@npm:4.0.0" - checksum: af79841fbdc0f3a8ec328a4bf68381013c7f52a78821184855a4b19ef95713edb3c30cd144c6393e6159e1b7dfb76b3f682dc983aafb54e52ff321ab1b4a9983 +"junk@npm:^4.0.1": + version: 4.0.1 + resolution: "junk@npm:4.0.1" + checksum: 4f0c94c0b2e46172284d9eaeb57bf1b784d86d218dbc673a1c8e08ef3443d03164238eb067591d0ad9f2c76a6ad012aeb618bb8135a2f0f26a6da931058e131b + languageName: node + linkType: hard + +"keyv@npm:^4.5.3, keyv@npm:^4.5.4": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 167eb6ef64cc84b6fa0780ee50c9de456b422a1e18802209234f7c2cf7eae648c7741f32e50d7e24ccb22b24c13154070b01563d642755b156c357431a191e75 languageName: node linkType: hard "kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" - checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b + checksum: 5873d303fb36aad875b7538798867da2ae5c9e328d67194b0162a3659a627d22f742fc9c4ae95cd1704132a24b00cae5041fc00c0f6ef937dc17080dc4dbb962 languageName: node linkType: hard @@ -5947,19 +6265,9 @@ __metadata: version: 0.4.1 resolution: "levn@npm:0.4.1" dependencies: - prelude-ls: ^1.2.1 - type-check: ~0.4.0 - checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 - languageName: node - linkType: hard - -"levn@npm:~0.3.0": - version: 0.3.0 - resolution: "levn@npm:0.3.0" - dependencies: - prelude-ls: ~1.1.2 - type-check: ~0.3.2 - checksum: 0d084a524231a8246bb10fec48cdbb35282099f6954838604f3c7fc66f2e16fa66fd9cc2f3f20a541a113c4dafdf181e822c887c8a319c9195444e6c64ac395e + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 2e4720ff79f21ae08d42374b0a5c2f664c5be8b6c8f565bb4e1315c96ed3a8acaa9de788ffed82d7f2378cf36958573de07ef92336cb5255ed74d08b8318c9ee languageName: node linkType: hard @@ -5974,34 +6282,27 @@ __metadata: version: 4.0.0 resolution: "load-json-file@npm:4.0.0" dependencies: - graceful-fs: ^4.1.2 - parse-json: ^4.0.0 - pify: ^3.0.0 - strip-bom: ^3.0.0 + graceful-fs: "npm:^4.1.2" + parse-json: "npm:^4.0.0" + pify: "npm:^3.0.0" + strip-bom: "npm:^3.0.0" checksum: 8f5d6d93ba64a9620445ee9bde4d98b1eac32cf6c8c2d20d44abfa41a6945e7969456ab5f1ca2fb06ee32e206c9769a20eec7002fe290de462e8c884b6b8b356 languageName: node linkType: hard -"load-json-file@npm:^7.0.0": +"load-json-file@npm:^7.0.1": version: 7.0.1 resolution: "load-json-file@npm:7.0.1" checksum: a560288da6891778321ef993e4bdbdf05374a4f3a3aeedd5ba6b64672798c830d748cfc59a2ec9891a3db30e78b3d04172e0dcb0d4828168289a393147ca0e74 languageName: node linkType: hard -"loady@npm:~0.0.5": - version: 0.0.5 - resolution: "loady@npm:0.0.5" - checksum: 3cba2ffa8cef8a082b3d23f22c1269a339e9f268105c30229bb3fed9123bb79830c0c7f3fa79f52286e1de9303b87e4eb3236952a6ee3fcffa83e7c576f7a8f5 - languageName: node - linkType: hard - "locate-path@npm:^2.0.0": version: 2.0.0 resolution: "locate-path@npm:2.0.0" dependencies: - p-locate: ^2.0.0 - path-exists: ^3.0.0 + p-locate: "npm:^2.0.0" + path-exists: "npm:^3.0.0" checksum: 02d581edbbbb0fa292e28d96b7de36b5b62c2fa8b5a7e82638ebb33afa74284acf022d3b1e9ae10e3ffb7658fbc49163fcd5e76e7d1baaa7801c3e05a81da755 languageName: node linkType: hard @@ -6010,8 +6311,8 @@ __metadata: version: 3.0.0 resolution: "locate-path@npm:3.0.0" dependencies: - p-locate: ^3.0.0 - path-exists: ^3.0.0 + p-locate: "npm:^3.0.0" + path-exists: "npm:^3.0.0" checksum: 53db3996672f21f8b0bf2a2c645ae2c13ffdae1eeecfcd399a583bce8516c0b88dcb4222ca6efbbbeb6949df7e46860895be2c02e8d3219abd373ace3bfb4e11 languageName: node linkType: hard @@ -6020,7 +6321,7 @@ __metadata: version: 5.0.0 resolution: "locate-path@npm:5.0.0" dependencies: - p-locate: ^4.1.0 + p-locate: "npm:^4.1.0" checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 languageName: node linkType: hard @@ -6029,38 +6330,29 @@ __metadata: version: 6.0.0 resolution: "locate-path@npm:6.0.0" dependencies: - p-locate: ^5.0.0 + p-locate: "npm:^5.0.0" checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a languageName: node linkType: hard -"locate-path@npm:^7.1.0": - version: 7.1.1 - resolution: "locate-path@npm:7.1.1" - dependencies: - p-locate: ^6.0.0 - checksum: 1d88af5b512d6e6398026252e17382907126683ab09ae5d6b8918d0bc72ca2642e1ad6e2fe635c5920840e369618e5d748c08deb57ba537fdd3f78e87ca993e0 - languageName: node - linkType: hard - "lodash.get@npm:^4.4.2": version: 4.4.2 resolution: "lodash.get@npm:4.4.2" - checksum: e403047ddb03181c9d0e92df9556570e2b67e0f0a930fcbbbd779370972368f5568e914f913e93f3b08f6d492abc71e14d4e9b7a18916c31fa04bd2306efe545 + checksum: 2a4925f6e89bc2c010a77a802d1ba357e17ed1ea03c2ddf6a146429f2856a216663e694a6aa3549a318cbbba3fd8b7decb392db457e6ac0b83dc745ed0a17380 languageName: node linkType: hard "lodash.isequal@npm:^4.5.0": version: 4.5.0 resolution: "lodash.isequal@npm:4.5.0" - checksum: da27515dc5230eb1140ba65ff8de3613649620e8656b19a6270afe4866b7bd461d9ba2ac8a48dcc57f7adac4ee80e1de9f965d89d4d81a0ad52bb3eec2609644 + checksum: 82fc58a83a1555f8df34ca9a2cd300995ff94018ac12cc47c349655f0ae1d4d92ba346db4c19bbfc90510764e0c00ddcc985a358bdcd4b3b965abf8f2a48a214 languageName: node linkType: hard "lodash.ismatch@npm:^4.4.0": version: 4.4.0 resolution: "lodash.ismatch@npm:4.4.0" - checksum: a393917578842705c7fc1a30fb80613d1ac42d20b67eb26a2a6004d6d61ee90b419f9eb320508ddcd608e328d91eeaa2651411727eaa9a12534ed6ccb02fc705 + checksum: 946a7176cdf4048f7b624378defda00dc0d01a2dad9933c54dad11fbecc253716df4210fbbfcd7d042e6fdb7603463cfe48e0ef576e20bf60d43f7deb1a2fe04 languageName: node linkType: hard @@ -6074,35 +6366,35 @@ __metadata: "lodash.map@npm:^4.5.1": version: 4.6.0 resolution: "lodash.map@npm:4.6.0" - checksum: 7369a41d7d24d15ce3bbd02a7faa3a90f6266c38184e64932571b9b21b758bd10c04ffd117d1859be1a44156f29b94df5045eff172bf8a97fddf68bf1002d12f + checksum: f1e69def35025be1e6213f1099df8acfa478442de8dfac3511e6eeeb5ef939b911f59db858251cc6b96076984d869fdd329ea360982d83240206124589f56f5d languageName: node linkType: hard "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + checksum: d0ea2dd0097e6201be083865d50c3fb54fbfbdb247d9cc5950e086c991f448b7ab0cdab0d57eacccb43473d3f2acd21e134db39f22dac2d6c9ba6bf26978e3d6 languageName: node linkType: hard "lodash.mergewith@npm:^4.6.2": version: 4.6.2 resolution: "lodash.mergewith@npm:4.6.2" - checksum: a6db2a9339752411f21b956908c404ec1e088e783a65c8b29e30ae5b3b6384f82517662d6f425cc97c2070b546cc2c7daaa8d33f78db7b6e9be06cd834abdeb8 + checksum: aea75a4492541a4902ac7e551dc6c54b722da0c187f84385d02e8fc33a7ae3454b837822446e5f63fcd5ad1671534ea408740b776670ea4d9c7890b10105fce0 languageName: node linkType: hard "lodash.uniq@npm:^4.5.0": version: 4.5.0 resolution: "lodash.uniq@npm:4.5.0" - checksum: a4779b57a8d0f3c441af13d9afe7ecff22dd1b8ce1129849f71d9bbc8e8ee4e46dfb4b7c28f7ad3d67481edd6e51126e4e2a6ee276e25906d10f7140187c392d + checksum: 86246ca64ac0755c612e5df6d93cfe92f9ecac2e5ff054b965efbbb1d9a647b6310969e78545006f70f52760554b03233ad0103324121ae31474c20d5f7a2812 languageName: node linkType: hard "lodash@npm:4.17.21, lodash@npm:^4.13.1, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:~4.17.15": version: 4.17.21 resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + checksum: c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532 languageName: node linkType: hard @@ -6110,8 +6402,8 @@ __metadata: version: 4.1.0 resolution: "log-symbols@npm:4.1.0" dependencies: - chalk: ^4.1.0 - is-unicode-supported: ^0.1.0 + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 languageName: node linkType: hard @@ -6123,139 +6415,132 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.1.0 + resolution: "lru-cache@npm:10.1.0" + checksum: 207278d6fa711fb1f94a0835d4d4737441d2475302482a14785b10515e4c906a57ebf9f35bf060740c9560e91c7c1ad5a04fd7ed030972a9ba18bce2a228e95b + languageName: node + linkType: hard + "lru-cache@npm:^6.0.0": version: 6.0.0 resolution: "lru-cache@npm:6.0.0" dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"lru-cache@npm:^7.7.1": - version: 7.14.1 - resolution: "lru-cache@npm:7.14.1" - checksum: d72c6713c6a6d86836a7a6523b3f1ac6764768cca47ec99341c3e76db06aacd4764620e5e2cda719a36848785a52a70e531822dc2b33fb071fa709683746c104 + yallist: "npm:^4.0.0" + checksum: fc1fe2ee205f7c8855fa0f34c1ab0bcf14b6229e35579ec1fd1079f31d6fc8ef8eb6fd17f2f4d99788d7e339f50e047555551ebd5e434dda503696e7c6591825 languageName: node linkType: hard "lunr@npm:^2.3.9": version: 2.3.9 resolution: "lunr@npm:2.3.9" - checksum: 176719e24fcce7d3cf1baccce9dd5633cd8bdc1f41ebe6a180112e5ee99d80373fe2454f5d4624d437e5a8319698ca6837b9950566e15d2cae5f2a543a3db4b8 + checksum: f2f6db34c046f5a767782fe2454e6dd69c75ba3c5cf5c1cb9cacca2313a99c2ba78ff8fa67dac866fb7c4ffd5f22e06684793f5f15ba14bddb598b94513d54bf languageName: node linkType: hard -"madge@npm:^5.0.1": - version: 5.0.1 - resolution: "madge@npm:5.0.1" - dependencies: - chalk: ^4.1.1 - commander: ^7.2.0 - commondir: ^1.0.1 - debug: ^4.3.1 - dependency-tree: ^8.1.1 - detective-amd: ^3.1.0 - detective-cjs: ^3.1.1 - detective-es6: ^2.2.0 - detective-less: ^1.0.2 - detective-postcss: ^5.0.0 - detective-sass: ^3.0.1 - detective-scss: ^2.0.1 - detective-stylus: ^1.0.0 - detective-typescript: ^7.0.0 - graphviz: 0.0.9 - ora: ^5.4.1 - pluralize: ^8.0.0 - precinct: ^8.1.0 - pretty-ms: ^7.0.1 - rc: ^1.2.7 - typescript: ^3.9.5 - walkdir: ^0.4.1 +"madge@npm:^6.1.0": + version: 6.1.0 + resolution: "madge@npm:6.1.0" + dependencies: + chalk: "npm:^4.1.1" + commander: "npm:^7.2.0" + commondir: "npm:^1.0.1" + debug: "npm:^4.3.1" + dependency-tree: "npm:^9.0.0" + detective-amd: "npm:^4.0.1" + detective-cjs: "npm:^4.0.0" + detective-es6: "npm:^3.0.0" + detective-less: "npm:^1.0.2" + detective-postcss: "npm:^6.1.0" + detective-sass: "npm:^4.0.1" + detective-scss: "npm:^3.0.0" + detective-stylus: "npm:^2.0.1" + detective-typescript: "npm:^9.0.0" + ora: "npm:^5.4.1" + pluralize: "npm:^8.0.0" + precinct: "npm:^8.1.0" + pretty-ms: "npm:^7.0.1" + rc: "npm:^1.2.7" + stream-to-array: "npm:^2.3.0" + ts-graphviz: "npm:^1.5.0" + walkdir: "npm:^0.4.1" + peerDependencies: + typescript: ^3.9.5 || ^4.9.5 || ^5 + peerDependenciesMeta: + typescript: + optional: true bin: madge: bin/cli.js - checksum: 821db88fdcb6259cf4bf1665abb976dd859fb7157a712886468d4172ab6d758f3446212fcd3fa92be21e9e2b408854f96e9495b7119d7387e6fe5690bd9786c4 + checksum: 80d3d549135e302109a5b98ab6cb088b44579779067365008368a042578bca0dfb1a76c697a1e9f63d5d2037724628e66b9dbd3efb0126555dd9d626a865d6d0 languageName: node linkType: hard -"magic-string@npm:^0.25.7": - version: 0.25.9 - resolution: "magic-string@npm:0.25.9" +"magic-string@npm:^0.30.3": + version: 0.30.5 + resolution: "magic-string@npm:0.30.5" dependencies: - sourcemap-codec: ^1.4.8 - checksum: 9a0e55a15c7303fc360f9572a71cffba1f61451bc92c5602b1206c9d17f492403bf96f946dfce7483e66822d6b74607262e24392e87b0ac27b786e69a40e9b1a + "@jridgewell/sourcemap-codec": "npm:^1.4.15" + checksum: c8a6b25f813215ca9db526f3a407d6dc0bf35429c2b8111d6f1c2cf6cf6afd5e2d9f9cd189416a0e3959e20ecd635f73639f9825c73de1074b29331fe36ace59 languageName: node linkType: hard -"make-dir@npm:^3.0.0": +"make-dir@npm:^3.1.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" dependencies: - semver: ^6.0.0 + semver: "npm:^6.0.0" checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 languageName: node linkType: hard -"make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^10.0.3": - version: 10.2.1 - resolution: "make-fetch-happen@npm:10.2.1" +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" dependencies: - agentkeepalive: ^4.2.1 - cacache: ^16.1.0 - http-cache-semantics: ^4.1.0 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-fetch: ^2.0.3 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 - ssri: ^9.0.0 - checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c + semver: "npm:^7.5.3" + checksum: bf0731a2dd3aab4db6f3de1585cea0b746bb73eb5a02e3d8d72757e376e64e6ada190b1eddcde5b2f24a81b688a9897efd5018737d05e02e2a671dda9cff8a8a languageName: node linkType: hard -"map-age-cleaner@npm:^0.1.3": - version: 0.1.3 - resolution: "map-age-cleaner@npm:0.1.3" +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" dependencies: - p-defer: ^1.0.0 - checksum: cb2804a5bcb3cbdfe4b59066ea6d19f5e7c8c196cd55795ea4c28f792b192e4c442426ae52524e5e1acbccf393d3bddacefc3d41f803e66453f6c4eda3650bc1 + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: ded5a91a02b76381b06a4ec4d5c1d23ebbde15d402b3c3e4533b371dac7e2f7ca071ae71ae6dae72aa261182557b7b1b3fd3a705b39252dc17f74fa509d3e76f languageName: node linkType: hard "map-obj@npm:^1.0.0": version: 1.0.1 resolution: "map-obj@npm:1.0.1" - checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed + checksum: f8e6fc7f6137329c376c4524f6d25b3c243c17019bc8f621d15a2dcb855919e482a9298a78ae58b00dbd0e76b640bf6533aa343a9e993cfc16e0346a2507e7f8 languageName: node linkType: hard -"map-obj@npm:^4.0.0, map-obj@npm:^4.1.0": +"map-obj@npm:^4.0.0": version: 4.3.0 resolution: "map-obj@npm:4.3.0" checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e languageName: node linkType: hard -"marked@npm:^4.2.5": - version: 4.2.5 - resolution: "marked@npm:4.2.5" +"marked@npm:^4.3.0": + version: 4.3.0 + resolution: "marked@npm:4.3.0" bin: marked: bin/marked.js - checksum: dd7da20a3983c66b516463fad5dc8d15dc70e137d20b6dc491e134f671e84bd2ed5f859e2c35f21e56830a122e4356b9e574bcde49b72b7ad6bc121a215a1a98 + checksum: c830bb4cb3705b754ca342b656e8a582d7428706b2678c898b856f6030c134ce2d1e19136efa3e6a1841f7330efbd24963d6bdeddc57d2938e906250f99895d0 languageName: node linkType: hard @@ -6263,7 +6548,7 @@ __metadata: version: 5.0.0 resolution: "matcher@npm:5.0.0" dependencies: - escape-string-regexp: ^5.0.0 + escape-string-regexp: "npm:^5.0.0" checksum: 28f191c2d23fee0f6f32fd0181d9fe173b0ab815a919edba55605438a2f9fa40372e002574a1b17add981b0a8669c75bc6194318d065ed2dceffd8b160c38118 languageName: node linkType: hard @@ -6272,45 +6557,31 @@ __metadata: version: 3.0.1 resolution: "md5-hex@npm:3.0.1" dependencies: - blueimp-md5: ^2.10.0 - checksum: 6799a19e8bdd3e0c2861b94c1d4d858a89220488d7885c1fa236797e367d0c2e5f2b789e05309307083503f85be3603a9686a5915568a473137d6b4117419cc2 + blueimp-md5: "npm:^2.10.0" + checksum: 4af5252998a525a01fc899b0df222a505ca6400f9de58d2fed26473ac91919331436a84cc5bf376a5fe1b1b45d3057a214ddaf86668b608e9be26221ca1585cc languageName: node linkType: hard "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" - checksum: af1b38516c28ec95d6b0826f6c8f276c58aec391f76be42aa07646b4e39d317723e869700933ca6995b056db4b09a78c92d5440dc23657e6764be5d28874bba1 + checksum: 38e0984db39139604756903a01397e29e17dcb04207bb3e081412ce725ab17338ecc47220c1b186b6bbe79a658aad1b0d41142884f5a481f36290cdefbe6aa46 languageName: node linkType: hard -"mem@npm:^9.0.2": - version: 9.0.2 - resolution: "mem@npm:9.0.2" +"memoize@npm:^10.0.0": + version: 10.0.0 + resolution: "memoize@npm:10.0.0" dependencies: - map-age-cleaner: ^0.1.3 - mimic-fn: ^4.0.0 - checksum: 07829bb182af0e3ecf748dc2edb1c3b10a256ef10458f7e24d06561a2adc2b3ef34d14abe81678bbcedb46faa477e7370223f118b1a5e1252da5fe43496f3967 + mimic-function: "npm:^5.0.0" + checksum: 2239451cc0b26f9e99e6107c2a24f069b8ccd98877b4fe4f28fe3a1e977521fe23a53fa7fb5e7ad485577e0f30ab61aed97cf29facbc701b88facf27b8f12ce3 languageName: node linkType: hard -"meow@npm:^10.1.2, meow@npm:^10.1.5": - version: 10.1.5 - resolution: "meow@npm:10.1.5" - dependencies: - "@types/minimist": ^1.2.2 - camelcase-keys: ^7.0.0 - decamelize: ^5.0.0 - decamelize-keys: ^1.1.0 - hard-rejection: ^2.1.0 - minimist-options: 4.1.0 - normalize-package-data: ^3.0.2 - read-pkg-up: ^8.0.0 - redent: ^4.0.0 - trim-newlines: ^4.0.2 - type-fest: ^1.2.2 - yargs-parser: ^20.2.9 - checksum: dd5f0caa4af18517813547dc66741dcbf52c4c23def5062578d39b11189fd9457aee5c1f2263a5cd6592a465023df8357e8ac876b685b64dbcf545e3f66c23a7 +"meow@npm:^12.0.1, meow@npm:^12.1.1": + version: 12.1.1 + resolution: "meow@npm:12.1.1" + checksum: 8594c319f4671a562c1fef584422902f1bbbad09ea49cdf9bb26dc92f730fa33398dd28a8cf34fcf14167f1d1148d05a867e50911fc4286751a4fb662fdd2dc2 languageName: node linkType: hard @@ -6318,18 +6589,18 @@ __metadata: version: 8.1.2 resolution: "meow@npm:8.1.2" dependencies: - "@types/minimist": ^1.2.0 - camelcase-keys: ^6.2.2 - decamelize-keys: ^1.1.0 - hard-rejection: ^2.1.0 - minimist-options: 4.1.0 - normalize-package-data: ^3.0.0 - read-pkg-up: ^7.0.1 - redent: ^3.0.0 - trim-newlines: ^3.0.0 - type-fest: ^0.18.0 - yargs-parser: ^20.2.3 - checksum: bc23bf1b4423ef6a821dff9734406bce4b91ea257e7f10a8b7f896f45b59649f07adc0926e2917eacd8cf1df9e4cd89c77623cf63dfd0f8bf54de07a32ee5a85 + "@types/minimist": "npm:^1.2.0" + camelcase-keys: "npm:^6.2.2" + decamelize-keys: "npm:^1.1.0" + hard-rejection: "npm:^2.1.0" + minimist-options: "npm:4.1.0" + normalize-package-data: "npm:^3.0.0" + read-pkg-up: "npm:^7.0.1" + redent: "npm:^3.0.0" + trim-newlines: "npm:^3.0.0" + type-fest: "npm:^0.18.0" + yargs-parser: "npm:^20.2.3" + checksum: d4770f90135c0ef4d0f4fa4f4310a18c07bbbe408221fa79a68fda93944134001ffc24ed605e7668f61e920dd8db30936548e927d2331b0e30699d56247f9873 languageName: node linkType: hard @@ -6357,14 +6628,14 @@ __metadata: "merge@npm:^2.1.1": version: 2.1.1 resolution: "merge@npm:2.1.1" - checksum: 9c36b0e25aa53b3f7305d7cf0f330397f1142cf311802b681e5619f12e986a790019b8246c1c0df21701c8652449f9046b0129551030097ef563d1958c823249 + checksum: 1875521a8e429ba8d82c6d24bf3f229b4b64a348873c41a1245851b422c0caa7fbeb958118c24fbfcbb71e416a29924b3b1c4518911529db175f49eb5bcb5e62 languageName: node linkType: hard "methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" - checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a + checksum: a385dd974faa34b5dd021b2bbf78c722881bf6f003bfe6d391d7da3ea1ed625d1ff10ddd13c57531f628b3e785be38d3eed10ad03cebd90b76932413df9a1820 languageName: node linkType: hard @@ -6372,16 +6643,16 @@ __metadata: version: 4.0.5 resolution: "micromatch@npm:4.0.5" dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + braces: "npm:^3.0.2" + picomatch: "npm:^2.3.1" + checksum: a749888789fc15cac0e03273844dbd749f9f8e8d64e70c564bcf06a033129554c789bb9e30d7566d7ff6596611a08e58ac12cf2a05f6e3c9c47c50c4c7e12fa2 languageName: node linkType: hard "mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + checksum: 54bb60bf39e6f8689f6622784e668a3d7f8bed6b0d886f5c3c446cb3284be28b30bf707ed05d0fe44a036f8469976b2629bbea182684977b084de9da274694d7 languageName: node linkType: hard @@ -6389,8 +6660,8 @@ __metadata: version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: - mime-db: 1.52.0 - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + mime-db: "npm:1.52.0" + checksum: 89aa9651b67644035de2784a6e665fc685d79aba61857e02b9c8758da874a754aed4a9aced9265f5ed1171fd934331e5516b84a7f0218031b6fa0270eca1e51a languageName: node linkType: hard @@ -6399,7 +6670,7 @@ __metadata: resolution: "mime@npm:1.6.0" bin: mime: cli.js - checksum: fef25e39263e6d207580bdc629f8872a3f9772c923c7f8c7e793175cee22777bbe8bba95e5d509a40aaa292d8974514ce634ae35769faa45f22d17edda5e8557 + checksum: b7d98bb1e006c0e63e2c91b590fe1163b872abf8f7ef224d53dd31499c2197278a6d3d0864c45239b1a93d22feaf6f9477e9fc847eef945838150b8c02d03170 languageName: node linkType: hard @@ -6417,7 +6688,14 @@ __metadata: languageName: node linkType: hard -"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": +"mimic-function@npm:^5.0.0": + version: 5.0.0 + resolution: "mimic-function@npm:5.0.0" + checksum: 1cb53bc250e4824544b89322f047ef37b2f70327cac67a9e5d64a192ac2b810dabc6a6e76e528751aae8558adf618de91fa0b69cec8514f96ee3cf1db81c4508 + languageName: node + linkType: hard + +"min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 @@ -6438,21 +6716,30 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:9.0.3, minimatch@npm:^9.0.1, minimatch@npm:^9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: c81b47d28153e77521877649f4bab48348d10938df9e8147a58111fe00ef89559a2938de9f6632910c4f7bf7bb5cd81191a546167e58d357f0cfb1e18cecc1c5 + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + brace-expansion: "npm:^1.1.7" + checksum: e0b25b04cd4ec6732830344e5739b13f8690f8a012d73445a4a19fbc623f5dd481ef7a5827fde25954cd6026fede7574cc54dc4643c99d6c6b653d6203f94634 languageName: node linkType: hard -"minimatch@npm:^5.0.1, minimatch@npm:^5.1.2": - version: 5.1.2 - resolution: "minimatch@npm:5.1.2" +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" dependencies: - brace-expansion: ^2.0.1 - checksum: 32ffda25b9fb8270a1c1beafdb7489dc0e411af553495136509a945691f63c9b6b000eeeaaf8bffe3efa609c1d6d3bc0f5a106f6c3443b5c05da649100ded964 + brace-expansion: "npm:^2.0.1" + checksum: 126b36485b821daf96d33b5c821dac600cc1ab36c87e7a532594f9b1652b1fa89a1eebcaad4dff17c764dce1a7ac1531327f190fed5f97d8f6e5f889c116c429 languageName: node linkType: hard @@ -6460,48 +6747,48 @@ __metadata: version: 4.1.0 resolution: "minimist-options@npm:4.1.0" dependencies: - arrify: ^1.0.1 - is-plain-obj: ^1.1.0 - kind-of: ^6.0.3 + arrify: "npm:^1.0.1" + is-plain-obj: "npm:^1.1.0" + kind-of: "npm:^6.0.3" checksum: 8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e languageName: node linkType: hard -"minimist@npm:1.2.6": - version: 1.2.6 - resolution: "minimist@npm:1.2.6" - checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb +"minimist@npm:1.2.7": + version: 1.2.7 + resolution: "minimist@npm:1.2.7" + checksum: 0202378a8eb1a9d98a44f623f43c89793a095f4bde6981bda29f6ae61e82a15c18b1690b5efc4c66ddbd402a3e9b7175e6ebdabb2b28037c279ac823b7360e00 languageName: node linkType: hard "minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": - version: 1.2.7 - resolution: "minimist@npm:1.2.7" - checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f languageName: node linkType: hard -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + minipass: "npm:^7.0.3" + checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 languageName: node linkType: hard -"minipass-fetch@npm:^2.0.3": - version: 2.1.2 - resolution: "minipass-fetch@npm:2.1.2" +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" dependencies: - encoding: ^0.1.13 - minipass: ^3.1.6 - minipass-sized: ^1.0.3 - minizlib: ^2.1.2 + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" dependenciesMeta: encoding: optional: true - checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 + checksum: 3edf72b900e30598567eafe96c30374432a8709e61bb06b87198fa3192d466777e2ec21c52985a0999044fa6567bd6f04651585983a1cbb27e2c1770a07ed2a2 languageName: node linkType: hard @@ -6509,7 +6796,7 @@ __metadata: version: 1.0.5 resolution: "minipass-flush@npm:1.0.5" dependencies: - minipass: ^3.0.0 + minipass: "npm:^3.0.0" checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf languageName: node linkType: hard @@ -6518,7 +6805,7 @@ __metadata: version: 1.2.4 resolution: "minipass-pipeline@npm:1.2.4" dependencies: - minipass: ^3.0.0 + minipass: "npm:^3.0.0" checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b languageName: node linkType: hard @@ -6527,26 +6814,31 @@ __metadata: version: 1.0.3 resolution: "minipass-sized@npm:1.0.3" dependencies: - minipass: ^3.0.0 - checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 + minipass: "npm:^3.0.0" + checksum: 40982d8d836a52b0f37049a0a7e5d0f089637298e6d9b45df9c115d4f0520682a78258905e5c8b180fb41b593b0a82cc1361d2c74b45f7ada66334f84d1ecfdd languageName: node linkType: hard -"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": +"minipass@npm:^3.0.0": version: 3.3.6 resolution: "minipass@npm:3.3.6" dependencies: - yallist: ^4.0.0 - checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 + yallist: "npm:^4.0.0" + checksum: a5c6ef069f70d9a524d3428af39f2b117ff8cd84172e19b754e7264a33df460873e6eb3d6e55758531580970de50ae950c496256bb4ad3691a2974cddff189f0 languageName: node linkType: hard -"minipass@npm:^4.0.0": - version: 4.0.0 - resolution: "minipass@npm:4.0.0" - dependencies: - yallist: ^4.0.0 - checksum: 7a609afbf394abfcf9c48e6c90226f471676c8f2a67f07f6838871afb03215ede431d1433feffe1b855455bcb13ef0eb89162841b9796109d6fed8d89790f381 +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 61682162d29f45d3152b78b08bab7fb32ca10899bc5991ffe98afc18c9e9543bd1e3be94f8b8373ba6262497db63607079dc242ea62e43e7b2270837b7347c93 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: e864bd02ceb5e0707696d58f7ce3a0b89233f0d686ef0d447a66db705c0846a8dc6f34865cd85256c1472ff623665f616b90b8ff58058b2ad996c5de747d2d18 languageName: node linkType: hard @@ -6554,32 +6846,25 @@ __metadata: version: 2.1.2 resolution: "minizlib@npm:2.1.2" dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - -"mkdirp-classic@npm:^0.5.2": - version: 0.5.3 - resolution: "mkdirp-classic@npm:0.5.3" - checksum: 3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: ae0f45436fb51344dcb87938446a32fbebb540d0e191d63b35e1c773d47512e17307bf54aa88326cc6d176594d00e4423563a091f7266c2f9a6872cdc1e234d1 languageName: node linkType: hard -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": +"mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: mkdirp: bin/cmd.js - checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + checksum: d71b8dcd4b5af2fe13ecf3bd24070263489404fe216488c5ba7e38ece1f54daf219e72a833a3a2dc404331e870e9f44963a33399589490956bff003a3404d3b2 languageName: node linkType: hard "modify-values@npm:^1.0.0": version: 1.0.1 resolution: "modify-values@npm:1.0.1" - checksum: 8296610c608bc97b03c2cf889c6cdf4517e32fa2d836440096374c2209f6b7b3e256c209493a0b32584b9cb32d528e99d0dd19dcd9a14d2d915a312d391cc7e9 + checksum: 16fa93f7ddb2540a8e82c99738ae4ed0e8e8cae57c96e13a0db9d68dfad074fd2eec542929b62ebbb18b357bbb3e4680b92d3a4099baa7aeb32360cb1c8f0247 languageName: node linkType: hard @@ -6587,26 +6872,38 @@ __metadata: version: 3.4.0 resolution: "module-definition@npm:3.4.0" dependencies: - ast-module-types: ^3.0.0 - node-source-walk: ^4.0.0 + ast-module-types: "npm:^3.0.0" + node-source-walk: "npm:^4.0.0" bin: module-definition: bin/cli.js checksum: 5cbfd38aab1a9169b5c31924e208e430a87a1b1512ab9736a9a368d950e3cc8e2f5cf642e37fe74123e25402cae50bfb8fdf1f5f0fd3d4d9270df705a2360bfa languageName: node linkType: hard +"module-definition@npm:^4.1.0": + version: 4.1.0 + resolution: "module-definition@npm:4.1.0" + dependencies: + ast-module-types: "npm:^4.0.0" + node-source-walk: "npm:^5.0.1" + bin: + module-definition: bin/cli.js + checksum: d9b6397c9ba04b08bc035fd87a3652900530b9a5d6e5263f8a1e05c927dfc103fdffcecd7071a9fd6cd7813fc9feafbbe828f5277e5b706e5de82831153ef0fb + languageName: node + linkType: hard + "module-lookup-amd@npm:^7.0.1": version: 7.0.1 resolution: "module-lookup-amd@npm:7.0.1" dependencies: - commander: ^2.8.1 - debug: ^4.1.0 - glob: ^7.1.6 - requirejs: ^2.3.5 - requirejs-config-file: ^4.0.0 + commander: "npm:^2.8.1" + debug: "npm:^4.1.0" + glob: "npm:^7.1.6" + requirejs: "npm:^2.3.5" + requirejs-config-file: "npm:^4.0.0" bin: lookup-amd: bin/cli.js - checksum: 911abd6b8fb1d82cfae4ef38050981d4eb7e710bfeba898903c5c49a4d3a44b3cacb6201ddf9930a39fae3473faf9b96d39930cfa8766dbf0da86689108895b1 + checksum: dadf8c602dd970e211136b22271231a853f76ec0b857a3bfa765e52a1f45f313a8e8bc7e1961f96bb1eced14e557cdbc798b37f5c17f0235cf29155617f4e7a9 languageName: node linkType: hard @@ -6624,7 +6921,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": +"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -6634,23 +6931,16 @@ __metadata: "mute-stream@npm:0.0.8": version: 0.0.8 resolution: "mute-stream@npm:0.0.8" - checksum: ff48d251fc3f827e5b1206cda0ffdaec885e56057ee86a3155e1951bc940fd5f33531774b1cc8414d7668c10a8907f863f6561875ee6e8768931a62121a531a1 + checksum: a2d2e79dde87e3424ffc8c334472c7f3d17b072137734ca46e6f221131f1b014201cc593b69a38062e974fb2394d3d1cb4349f80f012bbf8b8ac1b28033e515f languageName: node linkType: hard -"nanoid@npm:^3.3.4": - version: 3.3.4 - resolution: "nanoid@npm:3.3.4" +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" bin: nanoid: bin/nanoid.cjs - checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c - languageName: node - linkType: hard - -"natural-compare-lite@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare-lite@npm:1.4.0" - checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 + checksum: ac1eb60f615b272bccb0e2b9cd933720dad30bf9708424f691b8113826bb91aca7e9d14ef5d9415a6ba15c266b37817256f58d8ce980c82b0ba3185352565679 languageName: node linkType: hard @@ -6664,75 +6954,75 @@ __metadata: "negotiator@npm:0.6.3, negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + checksum: 2723fb822a17ad55c93a588a4bc44d53b22855bf4be5499916ca0cab1e7165409d0b288ba2577d7b029f10ce18cf2ed8e703e5af31c984e1e2304277ef979837 languageName: node linkType: hard -"neo-async@npm:^2.6.0": +"neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" - checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 + checksum: 1a7948fea86f2b33ec766bc899c88796a51ba76a4afc9026764aedc6e7cde692a09067031e4a1bf6db4f978ccd99e7f5b6c03fe47ad9865c3d4f99050d67e002 languageName: node linkType: hard -"nested-error-stacks@npm:^2.0.0, nested-error-stacks@npm:^2.1.0": +"nested-error-stacks@npm:^2.1.1": version: 2.1.1 resolution: "nested-error-stacks@npm:2.1.1" checksum: 5f452fad75db8480b4db584e1602894ff5977f8bf3d2822f7ba5cb7be80e89adf1fffa34dada3347ef313a4288850b4486eb0635b315c32bdfb505577e8880e3 languageName: node linkType: hard -"node-addon-api@npm:^2.0.0": - version: 2.0.2 - resolution: "node-addon-api@npm:2.0.2" +"node-addon-api@npm:^5.0.0": + version: 5.1.0 + resolution: "node-addon-api@npm:5.1.0" dependencies: - node-gyp: latest - checksum: 31fb22d674648204f8dd94167eb5aac896c841b84a9210d614bf5d97c74ef059cc6326389cf0c54d2086e35312938401d4cc82e5fcd679202503eb8ac84814f8 + node-gyp: "npm:latest" + checksum: 595f59ffb4630564f587c502119cbd980d302e482781021f3b479f5fc7e41cf8f2f7280fdc2795f32d148e4f3259bd15043c52d4a3442796aa6f1ae97b959636 languageName: node linkType: hard -"node-fetch@npm:2.6.7, node-fetch@npm:^2.6.7": - version: 2.6.7 - resolution: "node-fetch@npm:2.6.7" +"node-fetch@npm:^2.6.7": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" dependencies: - whatwg-url: ^5.0.0 + whatwg-url: "npm:^5.0.0" peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: encoding: optional: true - checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b + checksum: b24f8a3dc937f388192e59bcf9d0857d7b6940a2496f328381641cb616efccc9866e89ec43f2ec956bbd6c3d3ee05524ce77fe7b29ccd34692b3a16f237d6676 languageName: node linkType: hard -"node-gyp-build@npm:^4.2.0": - version: 4.6.0 - resolution: "node-gyp-build@npm:4.6.0" +"node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.2.2": + version: 4.7.1 + resolution: "node-gyp-build@npm:4.7.1" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: 25d78c5ef1f8c24291f4a370c47ba52fcea14f39272041a90a7894cd50d766f7c8cb8fb06c0f42bf6f69b204b49d9be3c8fc344aac09714d5bdb95965499eb15 + checksum: 3f6780a24dc7f6c47870ee1095a3f88aca9ca9c156dfdc390aee8f320fe94ebf8b91a361edd62aff7bf2eae469e25800378ed97533134d8580a8b9bdae75994c languageName: node linkType: hard "node-gyp@npm:latest": - version: 9.3.1 - resolution: "node-gyp@npm:9.3.1" - dependencies: - env-paths: ^2.2.0 - glob: ^7.1.4 - graceful-fs: ^4.2.6 - make-fetch-happen: ^10.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 - semver: ^7.3.5 - tar: ^6.1.2 - which: ^2.0.2 + version: 10.0.1 + resolution: "node-gyp@npm:10.0.1" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^3.0.0" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^4.0.0" bin: node-gyp: bin/node-gyp.js - checksum: b860e9976fa645ca0789c69e25387401b4396b93c8375489b5151a6c55cf2640a3b6183c212b38625ef7c508994930b72198338e3d09b9d7ade5acc4aaf51ea7 + checksum: 578cf0c821f258ce4b6ebce4461eca4c991a4df2dee163c0624f2fe09c7d6d37240be4942285a0048d307230248ee0b18382d6623b9a0136ce9533486deddfa8 languageName: node linkType: hard @@ -6740,26 +7030,46 @@ __metadata: version: 4.3.0 resolution: "node-source-walk@npm:4.3.0" dependencies: - "@babel/parser": ^7.0.0 - checksum: 124bcec61f73141a5f13e63f773beb00c9a9620e9eec6d7505b9de8fa884797f3eb0b9e9d225bb324930234ae03b28a4a7a231e2c2f23d71405d4a562b404e34 + "@babel/parser": "npm:^7.0.0" + checksum: 3145f4b907624b42bf7847d19937e33a1c3946b960ebcf5ac7eded9ba187ae00edec143946ef4a8f04835c31688f06e8341e0a7b4962a41d4d56bd5ab0a83ed5 + languageName: node + linkType: hard + +"node-source-walk@npm:^5.0.0, node-source-walk@npm:^5.0.1": + version: 5.0.2 + resolution: "node-source-walk@npm:5.0.2" + dependencies: + "@babel/parser": "npm:^7.21.4" + checksum: cbb474a80a7c4576ed94bf4c999be889a85ad1177a0a80019714adece1f5ca70e6a5f728b6828afb4ea00ca524c3ea65fc24d7405b921b754bfb596553f78e7b languageName: node linkType: hard "nofilter@npm:^3.1.0": version: 3.1.0 resolution: "nofilter@npm:3.1.0" - checksum: 58aa85a5b4b35cbb6e42de8a8591c5e338061edc9f3e7286f2c335e9e9b9b8fa7c335ae45daa8a1f3433164dc0b9a3d187fa96f9516e04a17a1f9ce722becc4f + checksum: f63d87231dfda4b783db17d75b15aac948f78e65f4f1043096ef441147f6667ff74cd4b3f57ada5dbe240be282d3e9838558ac863a66cb04ef25fff7b2b4be4e languageName: node linkType: hard -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" +"nopt@npm:^5.0.0": + version: 5.0.0 + resolution: "nopt@npm:5.0.0" + dependencies: + abbrev: "npm:1" + bin: + nopt: bin/nopt.js + checksum: 00f9bb2d16449469ba8ffcf9b8f0eae6bae285ec74b135fec533e5883563d2400c0cd70902d0a7759e47ac031ccf206ace4e86556da08ed3f1c66dda206e9ccd + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" dependencies: - abbrev: ^1.0.0 + abbrev: "npm:^2.0.0" bin: nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + checksum: 1e7489f17cbda452c8acaf596a8defb4ae477d2a9953b76eb96f4ec3f62c6b421cd5174eaa742f88279871fde9586d8a1d38fb3f53fa0c405585453be31dff4c languageName: node linkType: hard @@ -6767,88 +7077,118 @@ __metadata: version: 2.5.0 resolution: "normalize-package-data@npm:2.5.0" dependencies: - hosted-git-info: ^2.1.4 - resolve: ^1.10.0 - semver: 2 || 3 || 4 || 5 - validate-npm-package-license: ^3.0.1 - checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 644f830a8bb9b7cc9bf2f6150618727659ee27cdd0840d1c1f97e8e6cab0803a098a2c19f31c6247ad9d3a0792e61521a13a6e8cd87cc6bb676e3150612c03d4 languageName: node linkType: hard -"normalize-package-data@npm:^3.0.0, normalize-package-data@npm:^3.0.2": +"normalize-package-data@npm:^3.0.0": version: 3.0.3 resolution: "normalize-package-data@npm:3.0.3" dependencies: - hosted-git-info: ^4.0.1 - is-core-module: ^2.5.0 - semver: ^7.3.4 - validate-npm-package-license: ^3.0.1 - checksum: bbcee00339e7c26fdbc760f9b66d429258e2ceca41a5df41f5df06cc7652de8d82e8679ff188ca095cad8eff2b6118d7d866af2b68400f74602fbcbce39c160a + hosted-git-info: "npm:^4.0.1" + is-core-module: "npm:^2.5.0" + semver: "npm:^7.3.4" + validate-npm-package-license: "npm:^3.0.1" + checksum: 3cd3b438c9c7b15d72ed2d1bbf0f8cc2d07bfe27702fc9e95d039f0af4e069dc75c0646e75068f9f9255a8aae64b59aa4fe2177e65787145fb996c3d38d48acb languageName: node linkType: hard -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": +"normalize-path@npm:^3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 languageName: node linkType: hard -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" +"npm-run-path@npm:^5.1.0": + version: 5.2.0 + resolution: "npm-run-path@npm:5.2.0" dependencies: - path-key: ^3.0.0 - checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 + path-key: "npm:^4.0.0" + checksum: c5325e016014e715689c4014f7e0be16cc4cbf529f32a1723e511bc4689b5f823b704d2bca61ac152ce2bda65e0205dc8b3ba0ec0f5e4c3e162d302f6f5b9efb languageName: node linkType: hard -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" +"npmlog@npm:^5.0.1": + version: 5.0.1 + resolution: "npmlog@npm:5.0.1" dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a + are-we-there-yet: "npm:^2.0.0" + console-control-strings: "npm:^1.1.0" + gauge: "npm:^3.0.0" + set-blocking: "npm:^2.0.0" + checksum: f42c7b9584cdd26a13c41a21930b6f5912896b6419ab15be88cc5721fc792f1c3dd30eb602b26ae08575694628ba70afdcf3675d86e4f450fc544757e52726ec + languageName: node + linkType: hard + +"object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f languageName: node linkType: hard -"object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": - version: 1.12.2 - resolution: "object-inspect@npm:1.12.2" - checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 +"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": + version: 1.13.1 + resolution: "object-inspect@npm:1.13.1" + checksum: 92f4989ed83422d56431bc39656d4c780348eb15d397ce352ade6b7fec08f973b53744bd41b94af021901e61acaf78fcc19e65bf464ecc0df958586a672700f0 languageName: node linkType: hard "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" - checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a + checksum: 3d81d02674115973df0b7117628ea4110d56042e5326413e4b4313f0bcdf7dd78d4a3acef2c831463fa3796a66762c49daef306f4a0ea1af44877d7086d73bde languageName: node linkType: hard "object.assign@npm:^4.1.4": - version: 4.1.4 - resolution: "object.assign@npm:4.1.4" + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - has-symbols: ^1.0.3 - object-keys: ^1.1.1 - checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + object-keys: "npm:^1.1.1" + checksum: dbb22da4cda82e1658349ea62b80815f587b47131b3dd7a4ab7f84190ab31d206bbd8fe7e26ae3220c55b65725ac4529825f6142154211220302aa6b1518045d languageName: node linkType: hard -"object.values@npm:^1.1.5": - version: 1.1.6 - resolution: "object.values@npm:1.1.6" +"object.fromentries@npm:^2.0.7": + version: 2.0.7 + resolution: "object.fromentries@npm:2.0.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 1bfbe42a51f8d84e417d193fae78e4b8eebb134514cdd44406480f8e8a0e075071e0717635d8e3eccd50fec08c1d555fe505c38804cbac0808397187653edd59 + languageName: node + linkType: hard + +"object.groupby@npm:^1.0.1": + version: 1.0.1 + resolution: "object.groupby@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + get-intrinsic: "npm:^1.2.1" + checksum: b7123d91403f95d63978513b23a6079c30f503311f64035fafc863c291c787f287b58df3b21ef002ce1d0b820958c9009dd5a8ab696e0eca325639d345e41524 + languageName: node + linkType: hard + +"object.values@npm:^1.1.7": + version: 1.1.7 + resolution: "object.values@npm:1.1.7" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: f6fff9fd817c24cfd8107f50fb33061d81cd11bacc4e3dbb3852e9ff7692fde4dbce823d4333ea27cd9637ef1b6690df5fbb61f1ed314fa2959598dc3ae23d8e + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 20ab42c0bbf984405c80e060114b18cf5d629a40a132c7eac4fb79c5d06deb97496311c19297dcf9c61f45c2539cd4c7f7c5d6230e51db360ff297bbc9910162 languageName: node linkType: hard @@ -6856,80 +7196,76 @@ __metadata: version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: - ee-first: 1.1.1 - checksum: d20929a25e7f0bb62f937a425b5edeb4e4cde0540d77ba146ec9357f00b0d497cdb3b9b05b9c8e46222407d1548d08166bff69cc56dfa55ba0e4469228920ff0 + ee-first: "npm:1.1.1" + checksum: 8e81472c5028125c8c39044ac4ab8ba51a7cdc19a9fbd4710f5d524a74c6d8c9ded4dd0eed83f28d3d33ac1d7a6a439ba948ccb765ac6ce87f30450a26bfe2ea languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: - wrappy: 1 + wrappy: "npm:1" checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 languageName: node linkType: hard -"onetime@npm:^5.1.0, onetime@npm:^5.1.2": +"onetime@npm:^5.1.0": version: 5.1.2 resolution: "onetime@npm:5.1.2" dependencies: - mimic-fn: ^2.1.0 - checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 + mimic-fn: "npm:^2.1.0" + checksum: e9fd0695a01cf226652f0385bf16b7a24153dbbb2039f764c8ba6d2306a8506b0e4ce570de6ad99c7a6eb49520743afdb66edd95ee979c1a342554ed49a9aadd languageName: node linkType: hard -"open-cli@npm:^7.1.0": - version: 7.1.0 - resolution: "open-cli@npm:7.1.0" +"onetime@npm:^6.0.0": + version: 6.0.0 + resolution: "onetime@npm:6.0.0" dependencies: - file-type: ^18.0.0 - get-stdin: ^9.0.0 - meow: ^10.1.5 - open: ^8.4.0 - tempy: ^3.0.0 - bin: - open-cli: cli.js - checksum: 65b87a9119b1137730c7dc881e04df5e6eadd3ca83efacc837cc0aa587d7e7a331dcf63005e5f28b374f1bc3bfdec089d27ee1ec7f3cf10181d227aac9e72266 + mimic-fn: "npm:^4.0.0" + checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 languageName: node linkType: hard -"open@npm:^8.4.0": - version: 8.4.0 - resolution: "open@npm:8.4.0" +"open-cli@npm:^8.0.0": + version: 8.0.0 + resolution: "open-cli@npm:8.0.0" dependencies: - define-lazy-prop: ^2.0.0 - is-docker: ^2.1.1 - is-wsl: ^2.2.0 - checksum: e9545bec64cdbf30a0c35c1bdc310344adf8428a117f7d8df3c0af0a0a24c513b304916a6d9b11db0190ff7225c2d578885080b761ed46a3d5f6f1eebb98b63c + file-type: "npm:^18.7.0" + get-stdin: "npm:^9.0.0" + meow: "npm:^12.1.1" + open: "npm:^10.0.0" + tempy: "npm:^3.1.0" + bin: + open-cli: cli.js + checksum: 2206724f05975c0a271c20e20de77877bc247cde89791a08e2bcc805766ae23a6eccf384dad7de20a44b285a164005decf4b16e3f9b91433be74d711ad207f7c languageName: node linkType: hard -"optionator@npm:^0.8.1": - version: 0.8.3 - resolution: "optionator@npm:0.8.3" +"open@npm:^10.0.0": + version: 10.0.2 + resolution: "open@npm:10.0.2" dependencies: - deep-is: ~0.1.3 - fast-levenshtein: ~2.0.6 - levn: ~0.3.0 - prelude-ls: ~1.1.2 - type-check: ~0.3.2 - word-wrap: ~1.2.3 - checksum: b8695ddf3d593203e25ab0900e265d860038486c943ff8b774f596a310f8ceebdb30c6832407a8198ba3ec9debe1abe1f51d4aad94843612db3b76d690c61d34 + default-browser: "npm:^5.2.1" + define-lazy-prop: "npm:^3.0.0" + is-inside-container: "npm:^1.0.0" + is-wsl: "npm:^3.1.0" + checksum: 6f7f9e08204af00930f2998690293df1a919a61c98b225ff9e3aa09a765254b8a98bec101644ffe991452c6aabea0c6f9e49670b559d48a44bfc5238f6b58351 languageName: node linkType: hard -"optionator@npm:^0.9.1": - version: 0.9.1 - resolution: "optionator@npm:0.9.1" +"optionator@npm:^0.9.3": + version: 0.9.3 + resolution: "optionator@npm:0.9.3" 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 - checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 + "@aashutoshrathi/word-wrap": "npm:^1.2.3" + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + checksum: fa28d3016395974f7fc087d6bbf0ac7f58ac3489f4f202a377e9c194969f329a7b88c75f8152b33fb08794a30dcd5c079db6bb465c28151357f113d80bbf67da languageName: node linkType: hard @@ -6937,16 +7273,16 @@ __metadata: version: 5.4.1 resolution: "ora@npm:5.4.1" dependencies: - bl: ^4.1.0 - chalk: ^4.1.0 - cli-cursor: ^3.1.0 - cli-spinners: ^2.5.0 - is-interactive: ^1.0.0 - is-unicode-supported: ^0.1.0 - log-symbols: ^4.1.0 - strip-ansi: ^6.0.0 - wcwidth: ^1.0.1 - checksum: 28d476ee6c1049d68368c0dc922e7225e3b5600c3ede88fade8052837f9ed342625fdaa84a6209302587c8ddd9b664f71f0759833cbdb3a4cf81344057e63c63 + bl: "npm:^4.1.0" + chalk: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-spinners: "npm:^2.5.0" + is-interactive: "npm:^1.0.0" + is-unicode-supported: "npm:^0.1.0" + log-symbols: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + wcwidth: "npm:^1.0.1" + checksum: 8d071828f40090a8e1c6e8f350c6eb065808e9ab2b3e57fa37e0d5ae78cb46dac00117c8f12c3c8b8da2923454afbd8265e08c10b69881170c5b269f451e7fef languageName: node linkType: hard @@ -6957,28 +7293,12 @@ __metadata: languageName: node linkType: hard -"p-defer@npm:^1.0.0": - version: 1.0.0 - resolution: "p-defer@npm:1.0.0" - checksum: 4271b935c27987e7b6f229e5de4cdd335d808465604644cb7b4c4c95bef266735859a93b16415af8a41fd663ee9e3b97a1a2023ca9def613dba1bad2a0da0c7b - languageName: node - linkType: hard - -"p-event@npm:^4.1.0": - version: 4.2.0 - resolution: "p-event@npm:4.2.0" - dependencies: - p-timeout: ^3.1.0 - checksum: 8a3588f7a816a20726a3262dfeee70a631e3997e4773d23219176333eda55cce9a76219e3d2b441b331eb746e14fdb381eb2694ab9ff2fcf87c846462696fe89 - languageName: node - linkType: hard - "p-event@npm:^5.0.1": version: 5.0.1 resolution: "p-event@npm:5.0.1" dependencies: - p-timeout: ^5.0.2 - checksum: 3bdd8df6092e6b149f25e9c2eb1c0843b3b4279b07be2a2c72c02b65b267a8908c2040fefd606f2497b0f2bcefcd214f8ca5a74f0c883515d400ccf1d88d5683 + p-timeout: "npm:^5.0.2" + checksum: 755a737e3d4fe912772daaa7262f7f3a4b45e3dbcfb0212a3a913c2db47b0981ddc2e9b1c5ec5fbbfb0cb622ce5b67bc04751ec8ced7e340398107e536d5aab2 languageName: node linkType: hard @@ -6986,24 +7306,17 @@ __metadata: version: 3.0.0 resolution: "p-filter@npm:3.0.0" dependencies: - p-map: ^5.1.0 + p-map: "npm:^5.1.0" checksum: aacc36820f0531c01963334edc6debf5038b47c83a1c2255b7c14f6964a9a5fc1887ce0b93e72d137727403253bcc9bb26eed9bb79896ece1fa9f52d979bb97b languageName: node linkType: hard -"p-finally@npm:^1.0.0": - version: 1.0.0 - resolution: "p-finally@npm:1.0.0" - checksum: 93a654c53dc805dd5b5891bab16eb0ea46db8f66c4bfd99336ae929323b1af2b70a8b0654f8f1eae924b2b73d037031366d645f1fd18b3d30cbd15950cc4b1d4 - languageName: node - linkType: hard - "p-limit@npm:^1.1.0": version: 1.3.0 resolution: "p-limit@npm:1.3.0" dependencies: - p-try: ^1.0.0 - checksum: 281c1c0b8c82e1ac9f81acd72a2e35d402bf572e09721ce5520164e9de07d8274451378a3470707179ad13240535558f4b277f02405ad752e08c7d5b0d54fbfd + p-try: "npm:^1.0.0" + checksum: eb9d9bc378d48ab1998d2a2b2962a99eddd3e3726c82d3258ecc1a475f22907968edea4fec2736586d100366a001c6bb449a2abe6cd65e252e9597394f01e789 languageName: node linkType: hard @@ -7011,7 +7324,7 @@ __metadata: version: 2.3.0 resolution: "p-limit@npm:2.3.0" dependencies: - p-try: ^2.0.0 + p-try: "npm:^2.0.0" checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 languageName: node linkType: hard @@ -7020,25 +7333,16 @@ __metadata: version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: - yocto-queue: ^0.1.0 + yocto-queue: "npm:^0.1.0" checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 languageName: node linkType: hard -"p-limit@npm:^4.0.0": - version: 4.0.0 - resolution: "p-limit@npm:4.0.0" - dependencies: - yocto-queue: ^1.0.0 - checksum: 01d9d70695187788f984226e16c903475ec6a947ee7b21948d6f597bed788e3112cc7ec2e171c1d37125057a5f45f3da21d8653e04a3a793589e12e9e80e756b - languageName: node - linkType: hard - "p-locate@npm:^2.0.0": version: 2.0.0 resolution: "p-locate@npm:2.0.0" dependencies: - p-limit: ^1.1.0 + p-limit: "npm:^1.1.0" checksum: e2dceb9b49b96d5513d90f715780f6f4972f46987dc32a0e18bc6c3fc74a1a5d73ec5f81b1398af5e58b99ea1ad03fd41e9181c01fa81b4af2833958696e3081 languageName: node linkType: hard @@ -7047,7 +7351,7 @@ __metadata: version: 3.0.0 resolution: "p-locate@npm:3.0.0" dependencies: - p-limit: ^2.0.0 + p-limit: "npm:^2.0.0" checksum: 83991734a9854a05fe9dbb29f707ea8a0599391f52daac32b86f08e21415e857ffa60f0e120bfe7ce0cc4faf9274a50239c7895fc0d0579d08411e513b83a4ae languageName: node linkType: hard @@ -7056,7 +7360,7 @@ __metadata: version: 4.1.0 resolution: "p-locate@npm:4.1.0" dependencies: - p-limit: ^2.2.0 + p-limit: "npm:^2.2.0" checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 languageName: node linkType: hard @@ -7065,44 +7369,33 @@ __metadata: version: 5.0.0 resolution: "p-locate@npm:5.0.0" dependencies: - p-limit: ^3.0.2 + p-limit: "npm:^3.0.2" checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 languageName: node linkType: hard -"p-locate@npm:^6.0.0": - version: 6.0.0 - resolution: "p-locate@npm:6.0.0" - dependencies: - p-limit: ^4.0.0 - checksum: 2bfe5234efa5e7a4e74b30a5479a193fdd9236f8f6b4d2f3f69e3d286d9a7d7ab0c118a2a50142efcf4e41625def635bd9332d6cbf9cc65d85eb0718c579ab38 - languageName: node - linkType: hard - "p-map@npm:^4.0.0": version: 4.0.0 resolution: "p-map@npm:4.0.0" dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + aggregate-error: "npm:^3.0.0" + checksum: 7ba4a2b1e24c05e1fc14bbaea0fc6d85cf005ae7e9c9425d4575550f37e2e584b1af97bcde78eacd7559208f20995988d52881334db16cf77bc1bcf68e48ed7c languageName: node linkType: hard -"p-map@npm:^5.1.0, p-map@npm:^5.3.0, p-map@npm:^5.5.0": +"p-map@npm:^5.1.0": version: 5.5.0 resolution: "p-map@npm:5.5.0" dependencies: - aggregate-error: ^4.0.0 - checksum: 065cb6fca6b78afbd070dd9224ff160dc23eea96e57863c09a0c8ea7ce921043f76854be7ee0abc295cff1ac9adcf700e79a1fbe3b80b625081087be58e7effb + aggregate-error: "npm:^4.0.0" + checksum: 089a709d2525208a965b7907cc8e58af950542629b538198fc142c40e7f36b3b492dd6a46a1279515ccab58bb6f047e04593c0ab5ef4539d312adf7f761edf55 languageName: node linkType: hard -"p-timeout@npm:^3.1.0": - version: 3.2.0 - resolution: "p-timeout@npm:3.2.0" - dependencies: - p-finally: ^1.0.0 - checksum: 3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c +"p-map@npm:^6.0.0": + version: 6.0.0 + resolution: "p-map@npm:6.0.0" + checksum: 1fd59257b3828a4c4def676ef64acb0edb7809b161ada25efd9a0c8db312ad81c66bcaa9e5d8fd982fd20d412609aabcb8da9b090e81f6c449bc1203752ba0eb languageName: node linkType: hard @@ -7116,7 +7409,7 @@ __metadata: "p-try@npm:^1.0.0": version: 1.0.0 resolution: "p-try@npm:1.0.0" - checksum: 3b5303f77eb7722144154288bfd96f799f8ff3e2b2b39330efe38db5dd359e4fb27012464cd85cb0a76e9b7edd1b443568cb3192c22e7cffc34989df0bafd605 + checksum: 20d9735f57258158df50249f172c77fe800d31e80f11a3413ac9e68ccbe6b11798acb3f48f2df8cea7ba2b56b753ce695a4fe2a2987c3c7691c44226b6d82b6f languageName: node linkType: hard @@ -7127,11 +7420,21 @@ __metadata: languageName: node linkType: hard +"package-config@npm:^5.0.0": + version: 5.0.0 + resolution: "package-config@npm:5.0.0" + dependencies: + find-up-simple: "npm:^1.0.0" + load-json-file: "npm:^7.0.1" + checksum: dfff5264c51a0dad7af9a55b02e3b8b6e457075e9c4f02d0ffacfeee9af4dd5db2b566dae41486412161292b8741483cd89d5a8404a5742fc54d718dadacac4a + languageName: node + linkType: hard + "parent-module@npm:^1.0.0": version: 1.0.1 resolution: "parent-module@npm:1.0.1" dependencies: - callsites: ^3.0.0 + callsites: "npm:^3.0.0" checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff languageName: node linkType: hard @@ -7140,7 +7443,7 @@ __metadata: version: 2.0.0 resolution: "parent-module@npm:2.0.0" dependencies: - callsites: ^3.1.0 + callsites: "npm:^3.1.0" checksum: f131f13d687a938556a01033561fb1b274b39921eb4425c7a691f0d91dcfbe9b19759c2b8d425a3ee7c8a46874e57fa418a690643880c3c7c56827aba12f78dd languageName: node linkType: hard @@ -7149,8 +7452,8 @@ __metadata: version: 4.0.0 resolution: "parse-json@npm:4.0.0" dependencies: - error-ex: ^1.3.1 - json-parse-better-errors: ^1.0.1 + error-ex: "npm:^1.3.1" + json-parse-better-errors: "npm:^1.0.1" checksum: 0fe227d410a61090c247e34fa210552b834613c006c2c64d9a05cfe9e89cf8b4246d1246b1a99524b53b313e9ac024438d0680f67e33eaed7e6f38db64cfe7b5 languageName: node linkType: hard @@ -7159,10 +7462,10 @@ __metadata: version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: - "@babel/code-frame": ^7.0.0 - error-ex: ^1.3.1 - json-parse-even-better-errors: ^2.3.0 - lines-and-columns: ^1.1.6 + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 languageName: node linkType: hard @@ -7170,7 +7473,7 @@ __metadata: "parse-ms@npm:^2.1.0": version: 2.1.0 resolution: "parse-ms@npm:2.1.0" - checksum: d5c66c76cca8df5bd0574e2d11b9c3752893b59b466e74308d4a2f09760dc5436a1633f549cad300fc8c3c19154d14959a3b8333d3b2f7bd75898fe18149d564 + checksum: 517eab80cdb9df6ae22a8fad944bfb4289482699bcde5211a1c127091dfea33c3dcb217246b188865fc32e998bcee815bfa4a863f41e3b2d0bcc69f34ef1a543 languageName: node linkType: hard @@ -7209,13 +7512,6 @@ __metadata: languageName: node linkType: hard -"path-exists@npm:^5.0.0": - version: 5.0.0 - resolution: "path-exists@npm:5.0.0" - checksum: 8ca842868cab09423994596eb2c5ec2a971c17d1a3cb36dbf060592c730c725cd524b9067d7d2a1e031fef9ba7bd2ac6dc5ec9fb92aa693265f7be3987045254 - languageName: node - linkType: hard - "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -7223,13 +7519,20 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": +"path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 languageName: node linkType: hard +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 + languageName: node + linkType: hard + "path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -7237,10 +7540,20 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: "npm:^9.1.1 || ^10.0.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: eebfb8304fef1d4f7e1486df987e4fd77413de4fce16508dea69fcf8eb318c09a6b15a7a2f4c22877cec1cb7ecbd3071d18ca9de79eeece0df874a00f1f0bdc8 + languageName: node + linkType: hard + "path-to-regexp@npm:0.1.7": version: 0.1.7 resolution: "path-to-regexp@npm:0.1.7" - checksum: 69a14ea24db543e8b0f4353305c5eac6907917031340e5a8b37df688e52accd09e3cebfe1660b70d76b6bd89152f52183f28c74813dbf454ba1a01c82a38abce + checksum: 701c99e1f08e3400bea4d701cf6f03517474bb1b608da71c78b1eb261415b645c5670dfae49808c89e12cea2dccd113b069f040a80de012da0400191c6dbd1c8 languageName: node linkType: hard @@ -7248,7 +7561,7 @@ __metadata: version: 3.0.0 resolution: "path-type@npm:3.0.0" dependencies: - pify: ^3.0.0 + pify: "npm:^3.0.0" checksum: 735b35e256bad181f38fa021033b1c33cfbe62ead42bb2222b56c210e42938eecb272ae1949f3b6db4ac39597a61b44edd8384623ec4d79bfdc9a9c0f12537a6 languageName: node linkType: hard @@ -7260,17 +7573,17 @@ __metadata: languageName: node linkType: hard -"peek-readable@npm:^5.0.0": +"path-type@npm:^5.0.0": version: 5.0.0 - resolution: "peek-readable@npm:5.0.0" - checksum: bef5ceb50586eb42e14efba274ac57ffe97f0ed272df9239ce029f688f495d9bf74b2886fa27847c706a9db33acda4b7d23bbd09a2d21eb4c2a54da915117414 + resolution: "path-type@npm:5.0.0" + checksum: 15ec24050e8932c2c98d085b72cfa0d6b4eeb4cbde151a0a05726d8afae85784fc5544f733d8dfc68536587d5143d29c0bd793623fad03d7e61cc00067291cd5 languageName: node linkType: hard -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 6c72f5243303d9c60bd98e6446ba7d30ae29e3d56fdb6fae8767e8ba6386f33ee284c97efe3230a0d0217e2b1723b8ab490b1bbf34fcbb2180dbc8a9de47850d +"peek-readable@npm:^5.0.0": + version: 5.0.0 + resolution: "peek-readable@npm:5.0.0" + checksum: d342f02dd0c8a6b4bd0e7519a93d545b2b19375200e79a7431f0f1ec3f91e22b2217fa3a15cde95f6ab388ce6fce8aae75794d84b9b39c5836eb7c5f55e7ee9e languageName: node linkType: hard @@ -7281,10 +7594,17 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": +"picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" - checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + checksum: 60c2595003b05e4535394d1da94850f5372c9427ca4413b71210f437f7b2ca091dbd611c45e8b37d10036fa8eade25c1b8951654f9d3973bfa66a2ff4d3b08bc + languageName: node + linkType: hard + +"picomatch@npm:^3.0.1": + version: 3.0.1 + resolution: "picomatch@npm:3.0.1" + checksum: 65ac837fedbd0640586f7c214f6c7481e1e12f41cdcd22a95eb6a2914d1773707ed0f0b5bd2d1e39b5ec7860b43a4c9150152332a3884cd8dd1d419b2a2fa5b5 languageName: node linkType: hard @@ -7298,24 +7618,38 @@ __metadata: "pify@npm:^3.0.0": version: 3.0.0 resolution: "pify@npm:3.0.0" - checksum: 6cdcbc3567d5c412450c53261a3f10991665d660961e06605decf4544a61a97a54fefe70a68d5c37080ff9d6f4cf51444c90198d1ba9f9309a6c0d6e9f5c4fde - languageName: node - linkType: hard - -"pkg-conf@npm:^4.0.0": - version: 4.0.0 - resolution: "pkg-conf@npm:4.0.0" - dependencies: - find-up: ^6.0.0 - load-json-file: ^7.0.0 - checksum: 6da0c064a74f6c7ae80d7d68c5853e14f7e762a2a80c6ca9e0aa827002b90b69c86fefe3bac830b10a6f1739e7f96a1f728637f2a141e50b0fdafe92a2c3eab6 + checksum: 668c1dc8d9fc1b34b9ce3b16ba59deb39d4dc743527bf2ed908d2b914cb8ba40aa5ba6960b27c417c241531c5aafd0598feeac2d50cb15278cf9863fa6b02a77 languageName: node linkType: hard "platform@npm:^1.3.3": version: 1.3.6 resolution: "platform@npm:1.3.6" - checksum: 6f472a09c61d418c7e26c1c16d0bdc029549d512dbec6526216a1e59ec68100d07007d0097dcba69dddad883d6f2a83361b4bdfe0094a3d9a2af24158643d85e + checksum: 1f2d8333e23ea6a7620c828d2fc1ccbbd33e01928fb142323420506114d7325ebdeb1b38544efbf64e90ab73af0847f874d0f475b9327bcf53510fa827a4ef95 + languageName: node + linkType: hard + +"playwright-core@npm:1.40.1": + version: 1.40.1 + resolution: "playwright-core@npm:1.40.1" + bin: + playwright-core: cli.js + checksum: b8945a5eec68a2772be537219c81f74b8fbd1545650c908c41fdcb2b9eb40f488968d1fb59c61ca58afb923af1e390dd621bba3099521fcd3d9a63ef3645a203 + languageName: node + linkType: hard + +"playwright@npm:1.40.1": + version: 1.40.1 + resolution: "playwright@npm:1.40.1" + dependencies: + fsevents: "npm:2.3.2" + playwright-core: "npm:1.40.1" + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: 95cf79f1574accbff18fac4b876aa3811640314ee74cf4cd1c249398cd49824e55dc664039342a18d2d2fa4f5ad460ce91a97cb15942ab5d71c8ab04f442dc32 languageName: node linkType: hard @@ -7323,7 +7657,7 @@ __metadata: version: 5.1.0 resolution: "plur@npm:5.1.0" dependencies: - irregular-plurals: ^3.3.0 + irregular-plurals: "npm:^3.3.0" checksum: 57e400dc4b926768fb0abab7f8688fe17e85673712134546e7beaaee188bae7e0504976e847d7e41d0d6103ff2fd61204095f03c2a45de19a8bad15aecb45cc1 languageName: node linkType: hard @@ -7331,7 +7665,7 @@ __metadata: "pluralize@npm:^8.0.0": version: 8.0.0 resolution: "pluralize@npm:8.0.0" - checksum: 08931d4a6a4a5561a7f94f67a31c17e6632cb21e459ab3ff4f6f629d9a822984cf8afef2311d2005fbea5d7ef26016ebb090db008e2d8bce39d0a9a9d218736e + checksum: 17877fdfdb7ddb3639ce257ad73a7c51a30a966091e40f56ea9f2f545b5727ce548d4928f8cb3ce38e7dc0c5150407d318af6a4ed0ea5265d378473b4c2c61ec languageName: node linkType: hard @@ -7339,89 +7673,95 @@ __metadata: version: 2.0.1 resolution: "postcss-values-parser@npm:2.0.1" dependencies: - flatten: ^1.0.2 - indexes-of: ^1.0.1 - uniq: ^1.0.1 - checksum: 050877880937e15af8d18bf48902e547e2123d7cc32c1f215b392642bc5e2598a87a341995d62f38e450aab4186b8afeb2c9541934806d458ad8b117020b2ebf + flatten: "npm:^1.0.2" + indexes-of: "npm:^1.0.1" + uniq: "npm:^1.0.1" + checksum: f69211656b90a9d2f5efb1ec4a9e5f076f968b0c1169bfddc16aa0dce2e3a2853d7875e4d8058652e9b65d084fab93bfee8da389f6a2145ac547ee9ab0a03456 languageName: node linkType: hard -"postcss-values-parser@npm:^5.0.0": - version: 5.0.0 - resolution: "postcss-values-parser@npm:5.0.0" +"postcss-values-parser@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-values-parser@npm:6.0.2" dependencies: - color-name: ^1.1.4 - is-url-superb: ^4.0.0 - quote-unquote: ^1.0.0 + color-name: "npm:^1.1.4" + is-url-superb: "npm:^4.0.0" + quote-unquote: "npm:^1.0.0" peerDependencies: - postcss: ^8.0.9 - checksum: d45bde8606fdb721cf7fc1f971bc635b0da156fd75a1b706b0503af00416d5699afc477d028781229eabab56fa543b17f15b5b13807cfb8c5ba0e442281eb463 + postcss: ^8.2.9 + checksum: ff2fa096896f1c33f7531e814b8d01e785bd99d672c1597d5c5d8c2409b30b8146be6565f6269c952d1f03d626f00ae3f1afb8308cc772c08b323abee23c9a42 languageName: node linkType: hard -"postcss@npm:^8.1.7, postcss@npm:^8.4.6": - version: 8.4.21 - resolution: "postcss@npm:8.4.21" +"postcss@npm:^8.1.7, postcss@npm:^8.4.23": + version: 8.4.33 + resolution: "postcss@npm:8.4.33" dependencies: - nanoid: ^3.3.4 - picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: e39ac60ccd1542d4f9d93d894048aac0d686b3bb38e927d8386005718e6793dbbb46930f0a523fe382f1bbd843c6d980aaea791252bf5e176180e5a4336d9679 + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.0.0" + source-map-js: "npm:^1.0.2" + checksum: e22a4594c255f26117f38419fb494d7ecab0f596cd409f7aadc8a6173abf180ed7ea970cd13fd366ab12b5840be901d2a09b25197700c2ebcb5a8077326bf519 languageName: node linkType: hard -"precinct@npm:^8.0.0, precinct@npm:^8.1.0": +"precinct@npm:^8.1.0": version: 8.3.1 resolution: "precinct@npm:8.3.1" dependencies: - commander: ^2.20.3 - debug: ^4.3.3 - detective-amd: ^3.1.0 - detective-cjs: ^3.1.1 - detective-es6: ^2.2.1 - detective-less: ^1.0.2 - detective-postcss: ^4.0.0 - detective-sass: ^3.0.1 - detective-scss: ^2.0.1 - detective-stylus: ^1.0.0 - detective-typescript: ^7.0.0 - module-definition: ^3.3.1 - node-source-walk: ^4.2.0 + commander: "npm:^2.20.3" + debug: "npm:^4.3.3" + detective-amd: "npm:^3.1.0" + detective-cjs: "npm:^3.1.1" + detective-es6: "npm:^2.2.1" + detective-less: "npm:^1.0.2" + detective-postcss: "npm:^4.0.0" + detective-sass: "npm:^3.0.1" + detective-scss: "npm:^2.0.1" + detective-stylus: "npm:^1.0.0" + detective-typescript: "npm:^7.0.0" + module-definition: "npm:^3.3.1" + node-source-walk: "npm:^4.2.0" + bin: + precinct: bin/cli.js + checksum: 46ec2cd2e8af5386b1b0bf47fb264b288be39895dc6e33b9537d795d57c7b0a97f349c217edfa0bf584fef1031b4b0a5b30d1ad74fbe9833644adad6e325bc9e + languageName: node + linkType: hard + +"precinct@npm:^9.0.0": + version: 9.2.1 + resolution: "precinct@npm:9.2.1" + dependencies: + "@dependents/detective-less": "npm:^3.0.1" + commander: "npm:^9.5.0" + detective-amd: "npm:^4.1.0" + detective-cjs: "npm:^4.1.0" + detective-es6: "npm:^3.0.1" + detective-postcss: "npm:^6.1.1" + detective-sass: "npm:^4.1.1" + detective-scss: "npm:^3.0.1" + detective-stylus: "npm:^3.0.0" + detective-typescript: "npm:^9.1.1" + module-definition: "npm:^4.1.0" + node-source-walk: "npm:^5.0.1" bin: precinct: bin/cli.js - checksum: 16ba57e545fc53481b3a194f9d7843cefd562ce5e847280355eed360ca4c55def4d03d501776fb49fdf79bfe84a03ec6138003d8387c0426f6a68e1931688399 + checksum: f208d2e3c5d7c7b3834f70f761d0255680f76268d3835cd498006bc5dafa602aaecda0b2e68868ed679ec330fddaee0b662ba862d6eacd7282760dc0bc5f1b35 languageName: node linkType: hard "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" - checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a - languageName: node - linkType: hard - -"prelude-ls@npm:~1.1.2": - version: 1.1.2 - resolution: "prelude-ls@npm:1.1.2" - checksum: c4867c87488e4a0c233e158e4d0d5565b609b105d75e4c05dc760840475f06b731332eb93cc8c9cecb840aa8ec323ca3c9a56ad7820ad2e63f0261dadcb154e4 - languageName: node - linkType: hard - -"prettier-linter-helpers@npm:^1.0.0": - version: 1.0.0 - resolution: "prettier-linter-helpers@npm:1.0.0" - dependencies: - fast-diff: ^1.1.2 - checksum: 00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 + checksum: 0b9d2c76801ca652a7f64892dd37b7e3fab149a37d2424920099bf894acccc62abb4424af2155ab36dea8744843060a2d8ddc983518d0b1e22265a22324b72ed languageName: node linkType: hard -"prettier@npm:^2.8.2": - version: 2.8.2 - resolution: "prettier@npm:2.8.2" +"prettier@npm:^3.1.1": + version: 3.1.1 + resolution: "prettier@npm:3.1.1" bin: - prettier: bin-prettier.js - checksum: 740c56c2128d587d656ea1dde9bc9c3503dfc94db4f3ac387259215eeb2e216680bdad9d18a0c9feecc6b42cfa188d6fa777df4c36c1d00cedd4199074fbfbd2 + prettier: bin/prettier.cjs + checksum: 26a249f321b97d26c04483f1bf2eeb22e082a76f4222a2c922bebdc60111691aad4ec3979610e83942e0b956058ec361d9e9c81c185172264eb6db9aa678082b languageName: node linkType: hard @@ -7429,8 +7769,8 @@ __metadata: version: 7.0.1 resolution: "pretty-ms@npm:7.0.1" dependencies: - parse-ms: ^2.1.0 - checksum: d76c4920283b48be91f1d3797a2ce4bd51187d58d2a609ae993c028f73c92d16439449d857af57ccad91ae3a38b30c87307f5589749a056102ebb494c686957e + parse-ms: "npm:^2.1.0" + checksum: a39aac23cc7dae7a94c70518ab8b6c6db0894a7b84c81ee7abc8778c5ec8bae2d1e71ba991ff641732b38433724bfbdbb37bd3a00418637f797c072e06fe8b4c languageName: node linkType: hard @@ -7438,8 +7778,15 @@ __metadata: version: 8.0.0 resolution: "pretty-ms@npm:8.0.0" dependencies: - parse-ms: ^3.0.0 - checksum: b7d2a8182887af0e5ab93f9df331f10db9b8eda86855e2de115eb01a6c501bde5631a8813b1b0abdd7d045e79b08ae875369a8fd279a3dacd6d9e572bdd3bfa6 + parse-ms: "npm:^3.0.0" + checksum: 07c78d9522d7d3a8fa54fbb417d21c451b82de0fe3591de7d3a715160507067da77c421cbe601d9a65bfc10f52883057eb2922e2698913647d444fb35e9db6ed + languageName: node + linkType: hard + +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: 02b64e1b3919e63df06f836b98d3af002b5cd92655cab18b5746e37374bfb73e03b84fe305454614b34c25b485cc687a9eebdccf0242cda8fda2475dd2c97e02 languageName: node linkType: hard @@ -7450,106 +7797,44 @@ __metadata: languageName: node linkType: hard -"progress@npm:2.0.3": - version: 2.0.3 - resolution: "progress@npm:2.0.3" - checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 - languageName: node - linkType: hard - -"promise-inflight@npm:^1.0.1": - version: 1.0.1 - resolution: "promise-inflight@npm:1.0.1" - checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981 - languageName: node - linkType: hard - "promise-retry@npm:^2.0.1": version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: ^2.0.2 - retry: ^0.12.0 - checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 - languageName: node - linkType: hard - -"proxy-addr@npm:~2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 - languageName: node - linkType: hard - -"proxy-from-env@npm:1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 - languageName: node - linkType: hard - -"pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" - dependencies: - end-of-stream: ^1.1.0 - once: ^1.3.1 - checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.1.1 - resolution: "punycode@npm:2.1.1" - checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 96e1a82453c6c96eef53a37a1d6134c9f2482f94068f98a59145d0986ca4e497bf110a410adf73857e588165eab3899f0ebcf7b3890c1b3ce802abc0d65967d4 languageName: node linkType: hard -"puppeteer-core@npm:19.5.0": - version: 19.5.0 - resolution: "puppeteer-core@npm:19.5.0" +"proxy-addr@npm:~2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" dependencies: - cross-fetch: 3.1.5 - debug: 4.3.4 - devtools-protocol: 0.0.1068969 - extract-zip: 2.0.1 - https-proxy-agent: 5.0.1 - proxy-from-env: 1.1.0 - rimraf: 3.0.2 - tar-fs: 2.1.1 - unbzip2-stream: 1.4.3 - ws: 8.11.0 - checksum: 0cdac5c54dc9933f4e819ed57ecaa7dc93861937606ba1fab87365c4935a4709543f472e4c9f7eb3c09bf414dceee61acf41c983ab000f06bcf7339615082cd1 + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: f24a0c80af0e75d31e3451398670d73406ec642914da11a2965b80b1898ca6f66a0e3e091a11a4327079b2b268795f6fa06691923fef91887215c3d0e8ea3f68 languageName: node linkType: hard -"puppeteer@npm:^19.5.0": - version: 19.5.0 - resolution: "puppeteer@npm:19.5.0" - dependencies: - cosmiconfig: 8.0.0 - https-proxy-agent: 5.0.1 - progress: 2.0.3 - proxy-from-env: 1.1.0 - puppeteer-core: 19.5.0 - checksum: 4193e7e5f6b8bb42fae823f836e37058410d14fd92e384fcd1a361dbeab9a753065f97bcecad29bdd5e574404b75ccaf26e8a7598514c8e36265a3b1d9663eec +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 languageName: node linkType: hard -"pure-rand@npm:^5.0.2": - version: 5.0.5 - resolution: "pure-rand@npm:5.0.5" - checksum: 824b906f7f66695c15ed9a898ff650e925723515e999de0360b0726ebad924ce41a74cc2ac60409dc6c55f5781008855f32ecd0fe0a1f40fbce293d48bd11dd1 +"pure-rand@npm:^6.0.0": + version: 6.0.4 + resolution: "pure-rand@npm:6.0.4" + checksum: 34fed0abe99d3db7ddc459c12e1eda6bff05db6a17f2017a1ae12202271ccf276fb223b442653518c719671c1b339bbf97f27ba9276dba0997c89e45c4e6a3bf languageName: node linkType: hard "q@npm:^1.5.1": version: 1.5.1 resolution: "q@npm:1.5.1" - checksum: 147baa93c805bc1200ed698bdf9c72e9e42c05f96d007e33a558b5fdfd63e5ea130e99313f28efc1783e90e6bdb4e48b67a36fcc026b7b09202437ae88a1fb12 + checksum: 70c4a30b300277165cd855889cd3aa681929840a5940413297645c5691e00a3549a2a4153131efdf43fe8277ee8cf5a34c9636dcb649d83ad47f311a015fd380 languageName: node linkType: hard @@ -7557,29 +7842,22 @@ __metadata: version: 6.11.0 resolution: "qs@npm:6.11.0" dependencies: - side-channel: ^1.0.4 - checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297 + side-channel: "npm:^1.0.4" + checksum: 5a3bfea3e2f359ede1bfa5d2f0dbe54001aa55e40e27dc3e60fab814362d83a9b30758db057c2011b6f53a2d4e4e5150194b5bac45372652aecb3e3c0d4b256e languageName: node linkType: hard "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + checksum: 72900df0616e473e824202113c3df6abae59150dfb73ed13273503127235320e9c8ca4aaaaccfd58cf417c6ca92a6e68ee9a5c3182886ae949a768639b388a7b languageName: node linkType: hard "quick-lru@npm:^4.0.1": version: 4.0.1 resolution: "quick-lru@npm:4.0.1" - checksum: bea46e1abfaa07023e047d3cf1716a06172c4947886c053ede5c50321893711577cb6119360f810cc3ffcd70c4d7db4069c3cee876b358ceff8596e062bd1154 - languageName: node - linkType: hard - -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed + checksum: 5c7c75f1c696750f619b165cc9957382f919e4207dabf04597a64f0298861391cdc5ee91a1dde1a5d460ecf7ee1af7fc36fef6d155bef2be66f05d43fd63d4f0 languageName: node linkType: hard @@ -7594,15 +7872,15 @@ __metadata: version: 2.1.0 resolution: "randombytes@npm:2.1.0" dependencies: - safe-buffer: ^5.1.0 - checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 + safe-buffer: "npm:^5.1.0" + checksum: 4efd1ad3d88db77c2d16588dc54c2b52fd2461e70fe5724611f38d283857094fe09040fa2c9776366803c3152cf133171b452ef717592b65631ce5dc3a2bdafc languageName: node linkType: hard "range-parser@npm:~1.2.1": version: 1.2.1 resolution: "range-parser@npm:1.2.1" - checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9 + checksum: ce21ef2a2dd40506893157970dc76e835c78cf56437e26e19189c48d5291e7279314477b06ac38abd6a401b661a6840f7b03bd0b1249da9b691deeaa15872c26 languageName: node linkType: hard @@ -7610,11 +7888,11 @@ __metadata: version: 2.5.1 resolution: "raw-body@npm:2.5.1" dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - checksum: 5362adff1575d691bb3f75998803a0ffed8c64eabeaa06e54b4ada25a0cd1b2ae7f4f5ec46565d1bec337e08b5ac90c76eaa0758de6f72a633f025d754dec29e + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + unpipe: "npm:1.0.0" + checksum: 280bedc12db3490ecd06f740bdcf66093a07535374b51331242382c0e130bb273ebb611b7bc4cba1b4b4e016cc7b1f4b05a6df885a6af39c2bc3b94c02291c84 languageName: node linkType: hard @@ -7622,13 +7900,13 @@ __metadata: version: 1.2.8 resolution: "rc@npm:1.2.8" dependencies: - deep-extend: ^0.6.0 - ini: ~1.3.0 - minimist: ^1.2.0 - strip-json-comments: ~2.0.1 + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" bin: rc: ./cli.js - checksum: 2e26e052f8be2abd64e6d1dabfbd7be03f80ec18ccbc49562d31f617d0015fbdbcf0f9eed30346ea6ab789e0fdfe4337f033f8016efdbee0df5354751842080e + checksum: 5c4d72ae7eec44357171585938c85ce066da8ca79146b5635baf3d55d74584c92575fa4e2c9eac03efbed3b46a0b2e7c30634c012b4b4fa40d654353d3c163eb languageName: node linkType: hard @@ -7636,8 +7914,8 @@ __metadata: version: 3.0.0 resolution: "read-pkg-up@npm:3.0.0" dependencies: - find-up: ^2.0.0 - read-pkg: ^3.0.0 + find-up: "npm:^2.0.0" + read-pkg: "npm:^3.0.0" checksum: 16175573f2914ab9788897bcbe2a62b5728d0075e62285b3680cebe97059e2911e0134a062cf6e51ebe3e3775312bc788ac2039ed6af38ec68d2c10c6f2b30fb languageName: node linkType: hard @@ -7646,31 +7924,20 @@ __metadata: version: 7.0.1 resolution: "read-pkg-up@npm:7.0.1" dependencies: - find-up: ^4.1.0 - read-pkg: ^5.2.0 - type-fest: ^0.8.1 + find-up: "npm:^4.1.0" + read-pkg: "npm:^5.2.0" + type-fest: "npm:^0.8.1" checksum: e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 languageName: node linkType: hard -"read-pkg-up@npm:^8.0.0": - version: 8.0.0 - resolution: "read-pkg-up@npm:8.0.0" - dependencies: - find-up: ^5.0.0 - read-pkg: ^6.0.0 - type-fest: ^1.0.1 - checksum: fe4c80401656b40b408884457fffb5a8015c03b1018cfd8e48f8d82a5e9023e24963603aeb2755608d964593e046c15b34d29b07d35af9c7aa478be81805209c - languageName: node - linkType: hard - "read-pkg@npm:^3.0.0": version: 3.0.0 resolution: "read-pkg@npm:3.0.0" dependencies: - load-json-file: ^4.0.0 - normalize-package-data: ^2.3.2 - path-type: ^3.0.0 + load-json-file: "npm:^4.0.0" + normalize-package-data: "npm:^2.3.2" + path-type: "npm:^3.0.0" checksum: 398903ebae6c7e9965419a1062924436cc0b6f516c42c4679a90290d2f87448ed8f977e7aa2dbba4aa1ac09248628c43e493ac25b2bc76640e946035200e34c6 languageName: node linkType: hard @@ -7679,49 +7946,37 @@ __metadata: version: 5.2.0 resolution: "read-pkg@npm:5.2.0" dependencies: - "@types/normalize-package-data": ^2.4.0 - normalize-package-data: ^2.5.0 - parse-json: ^5.0.0 - type-fest: ^0.6.0 + "@types/normalize-package-data": "npm:^2.4.0" + normalize-package-data: "npm:^2.5.0" + parse-json: "npm:^5.0.0" + type-fest: "npm:^0.6.0" checksum: eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 languageName: node linkType: hard -"read-pkg@npm:^6.0.0": - version: 6.0.0 - resolution: "read-pkg@npm:6.0.0" - dependencies: - "@types/normalize-package-data": ^2.4.0 - normalize-package-data: ^3.0.2 - parse-json: ^5.2.0 - type-fest: ^1.0.1 - checksum: 0cebdff381128e923815c643074a87011070e5fc352bee575d327d6485da3317fab6d802a7b03deeb0be7be8d3ad1640397b3d5d2f044452caf4e8d1736bf94f - languageName: node - linkType: hard - -"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": - version: 3.6.0 - resolution: "readable-stream@npm:3.6.0" +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8 + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: d9e3e53193adcdb79d8f10f2a1f6989bd4389f5936c6f8b870e77570853561c362bee69feca2bbb7b32368ce96a85504aa4cedf7cf80f36e6a9de30d64244048 languageName: node linkType: hard "readable-stream@npm:~2.3.6": - version: 2.3.7 - resolution: "readable-stream@npm:2.3.7" + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" 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 - checksum: e4920cf7549a60f8aaf694d483a0e61b2a878b969d224f89b3bc788b8d920075132c4b55a7494ee944c7b6a9a0eada28a7f6220d80b0312ece70bbf08eeca755 + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 8500dd3a90e391d6c5d889256d50ec6026c059fadee98ae9aa9b86757d60ac46fff24fafb7a39fa41d54cb39d8be56cc77be202ebd4cd8ffcf4cb226cbaa40d4 languageName: node linkType: hard @@ -7729,17 +7984,8 @@ __metadata: version: 3.0.2 resolution: "readable-web-to-node-stream@npm:3.0.2" dependencies: - readable-stream: ^3.6.0 - checksum: 8c56cc62c68513425ddfa721954875b382768f83fa20e6b31e365ee00cbe7a3d6296f66f7f1107b16cd3416d33aa9f1680475376400d62a081a88f81f0ea7f9c - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: ^2.2.1 - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + readable-stream: "npm:^3.6.0" + checksum: d3a5bf9d707c01183d546a64864aa63df4d9cb835dfd2bf89ac8305e17389feef2170c4c14415a10d38f9b9bfddf829a57aaef7c53c8b40f11d499844bf8f1a4 languageName: node linkType: hard @@ -7747,37 +7993,20 @@ __metadata: version: 3.0.0 resolution: "redent@npm:3.0.0" dependencies: - indent-string: ^4.0.0 - strip-indent: ^3.0.0 + indent-string: "npm:^4.0.0" + strip-indent: "npm:^3.0.0" checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b languageName: node linkType: hard -"redent@npm:^4.0.0": - version: 4.0.0 - resolution: "redent@npm:4.0.0" - dependencies: - indent-string: ^5.0.0 - strip-indent: ^4.0.0 - checksum: 6944e7b1d8f3fd28c2515f5c605b9f7f0ea0f4edddf41890bbbdd4d9ee35abb7540c3b278f03ff827bd278bb6ff4a5bd8692ca406b748c5c1c3ce7355e9fbf8f - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.4.3": - version: 1.4.3 - resolution: "regexp.prototype.flags@npm:1.4.3" +"regexp.prototype.flags@npm:^1.5.1": + version: 1.5.1 + resolution: "regexp.prototype.flags@npm:1.5.1" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - functions-have-names: ^1.2.2 - checksum: 51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 - languageName: node - linkType: hard - -"regexpp@npm:^3.2.0": - version: 3.2.0 - resolution: "regexpp@npm:3.2.0" - checksum: a78dc5c7158ad9ddcfe01aa9144f46e192ddbfa7b263895a70a5c6c73edd9ce85faf7c0430e59ac38839e1734e275b9c3de5c57ee3ab6edc0e0b1bdebefccef8 + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + set-function-name: "npm:^2.0.0" + checksum: 3fa5610b8e411bbc3a43ddfd13162f3a817beb43155fbd8caa24d4fd0ce2f431a8197541808772a5a06e5946cebfb68464c827827115bde0d11720a92fe2981a languageName: node linkType: hard @@ -7791,14 +8020,14 @@ __metadata: "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" - checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 + checksum: a72468e2589270d91f06c7d36ec97a88db53ae5d6fe3787fadc943f0b0276b10347f89b363b2a82285f650bdcc135ad4a257c61bdd4d00d6df1fa24875b0ddaf languageName: node linkType: hard "require-from-string@npm:^2.0.2": version: 2.0.2 resolution: "require-from-string@npm:2.0.2" - checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + checksum: 839a3a890102a658f4cb3e7b2aa13a1f80a3a976b512020c3d1efc418491c48a886b6e481ea56afc6c4cb5eef678f23b2a4e70575e7534eccadf5e30ed2e56eb languageName: node linkType: hard @@ -7806,9 +8035,9 @@ __metadata: version: 4.0.0 resolution: "requirejs-config-file@npm:4.0.0" dependencies: - esprima: ^4.0.0 - stringify-object: ^3.2.1 - checksum: 61ac1c419a8978df9484211827047f0a43d48a97e242ebca9628a2e52da8c739ee068bd67dc4d5dc5fd7be6d1c9a863006bb02df691c86914921fe12713fbebb + esprima: "npm:^4.0.0" + stringify-object: "npm:^3.2.1" + checksum: 9fc55813ca8627cc4d3704622702b6b119a222c97825fc61459727d5f9ef9435e4fd34ee03335dc119c66e834d7963fdfe43d9a4df99448d43219587c624ba4e languageName: node linkType: hard @@ -7818,7 +8047,7 @@ __metadata: bin: r.js: ./bin/r.js r_js: ./bin/r.js - checksum: 7c3c006bf5e1887d93ac7adb7f600328918d23cf3d28282a505a2873d4ddde499c7ec560e55cee3440d17fe1205cb4dcb72b07f35b39e8940372eca850e49b62 + checksum: 808540b0a2374cf19bf00d13036a90f94aac92984a9be0f1fa642266d0ee467db0b1aa9d85d567e0da71b54294f5feb92e13ac62bae7f85a0b3ac3ab393b05d4 languageName: node linkType: hard @@ -7826,7 +8055,7 @@ __metadata: version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" dependencies: - resolve-from: ^5.0.0 + resolve-from: "npm:^5.0.0" checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 languageName: node linkType: hard @@ -7834,7 +8063,7 @@ __metadata: "resolve-dependency-path@npm:^2.0.0": version: 2.0.0 resolution: "resolve-dependency-path@npm:2.0.0" - checksum: 161296969a0a7853ebb7710847154ffb5bd11a51c370b67a0d0c89cacfcb57063d204587617fd030ea227bfd19a3c4af79d39e9d20ae0fbe354c27598d1ea8a8 + checksum: f7511412546276473bbe0182730baf9bda08a437425f817b1d944ecac4c0a137129c544bf60ca5928b1b89f7124855408c257a12e1b604ebbffeb997bbb81a65 languageName: node linkType: hard @@ -7842,8 +8071,8 @@ __metadata: version: 1.0.1 resolution: "resolve-dir@npm:1.0.1" dependencies: - expand-tilde: ^2.0.0 - global-modules: ^1.0.0 + expand-tilde: "npm:^2.0.0" + global-modules: "npm:^1.0.0" checksum: ef736b8ed60d6645c3b573da17d329bfb50ec4e1d6c5ffd6df49e3497acef9226f9810ea6823b8ece1560e01dcb13f77a9f6180d4f242d00cc9a8f4de909c65c languageName: node linkType: hard @@ -7851,14 +8080,14 @@ __metadata: "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" - checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + checksum: 91eb76ce83621eea7bbdd9b55121a5c1c4a39e54a9ce04a9ad4517f102f8b5131c2cf07622c738a6683991bf54f2ce178f5a42803ecbd527ddc5105f362cc9e3 languageName: node linkType: hard "resolve-from@npm:^5.0.0": version: 5.0.0 resolution: "resolve-from@npm:5.0.0" - checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + checksum: be18a5e4d76dd711778664829841cde690971d02b6cbae277735a09c1c28f407b99ef6ef3cd585a1e6546d4097b28df40ed32c4a287b9699dcf6d7f208495e23 languageName: node linkType: hard @@ -7866,30 +8095,21 @@ __metadata: version: 1.0.0 resolution: "resolve-global@npm:1.0.0" dependencies: - global-dirs: ^0.1.1 + global-dirs: "npm:^0.1.1" checksum: c4e11d33e84bde7516b824503ffbe4b6cce863d5ce485680fd3db997b7c64da1df98321b1fd0703b58be8bc9bc83bc96bd83043f96194386b45eb47229efb6b6 languageName: node linkType: hard -"resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.20.0, resolve@npm:^1.21.0, resolve@npm:^1.22.0, resolve@npm:^1.22.1, resolve@npm:~1.22.1": - version: 1.22.1 - resolution: "resolve@npm:1.22.1" +"resolve@npm:^1.10.0, resolve@npm:^1.21.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:~1.22.1": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e - languageName: node - linkType: hard - -"resolve@npm:~1.17.0": - version: 1.17.0 - resolution: "resolve@npm:1.17.0" - dependencies: - path-parse: ^1.0.6 - checksum: 9ceaf83b3429f2d7ff5d0281b8d8f18a1f05b6ca86efea7633e76b8f76547f33800799dfdd24434942dec4fbd9e651ed3aef577d9a6b5ec87ad89c1060e24759 + checksum: c473506ee01eb45cbcfefb68652ae5759e092e6b0fb64547feadf9736a6394f258fbc6f88e00c5ca36d5477fbb65388b272432a3600fa223062e54333c156753 languageName: node linkType: hard @@ -7897,41 +8117,32 @@ __metadata: version: 1.19.0 resolution: "resolve@npm:1.19.0" dependencies: - is-core-module: ^2.1.0 - path-parse: ^1.0.6 - checksum: a05b356e47b85ad3613d9e2a39a824f3c27f4fcad9c9ff6c7cc71a2e314c5904a90ab37481ad0069d03cab9eaaac6eb68aca1bc3355fdb05f1045cd50e2aacea + is-core-module: "npm:^2.1.0" + path-parse: "npm:^1.0.6" + checksum: b0f326a85422ebc4db8524957990d49d89e028bd6c10f23f2e89db5ee923678c6c08eae596e594031a5cda20f1e19d4a371e22cd772907b0bcf3c932e2205753 languageName: node linkType: hard -"resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.21.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@~1.22.1#~builtin": - version: 1.22.1 - resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.21.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b - languageName: node - linkType: hard - -"resolve@patch:resolve@~1.17.0#~builtin": - version: 1.17.0 - resolution: "resolve@patch:resolve@npm%3A1.17.0#~builtin::version=1.17.0&hash=c3c19d" - dependencies: - path-parse: ^1.0.6 - checksum: 6fd799f282ddf078c4bc20ce863e3af01fa8cb218f0658d9162c57161a2dbafe092b13015b9a4c58d0e1e801cf7aa7a4f13115fea9db98c3f9a0c43e429bad6f + checksum: f345cd37f56a2c0275e3fe062517c650bb673815d885e7507566df589375d165bbbf4bdb6aa95600a9bc55f4744b81f452b5a63f95b9f10a72787dba3c90890a languageName: node linkType: hard -"resolve@patch:resolve@~1.19.0#~builtin": +"resolve@patch:resolve@npm%3A~1.19.0#optional!builtin": version: 1.19.0 - resolution: "resolve@patch:resolve@npm%3A1.19.0#~builtin::version=1.19.0&hash=c3c19d" + resolution: "resolve@patch:resolve@npm%3A1.19.0#optional!builtin::version=1.19.0&hash=c3c19d" dependencies: - is-core-module: ^2.1.0 - path-parse: ^1.0.6 - checksum: 2443b94d347e6946c87c85faf13071f605e609e0b54784829b0ed2b917d050bfc1cbaf4ecc6453f224cfa7d0c5dcd97cbb273454cd210bee68e4af15c1a5abc9 + is-core-module: "npm:^2.1.0" + path-parse: "npm:^1.0.6" + checksum: eb8853b1b7b9ef25f0156304c7c21e2a0d2b2ce247169282542e76565f460986e10adbb770eeb2549c06197fb546b433906cbf3700a3232c567aaaaa53490b88 languageName: node linkType: hard @@ -7939,8 +8150,8 @@ __metadata: version: 3.1.0 resolution: "restore-cursor@npm:3.1.0" dependencies: - onetime: ^5.1.0 - signal-exit: ^3.0.2 + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 languageName: node linkType: hard @@ -7948,46 +8159,104 @@ __metadata: "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" - checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c + checksum: 1f914879f97e7ee931ad05fe3afa629bd55270fc6cf1c1e589b6a99fab96d15daad0fa1a52a00c729ec0078045fe3e399bd4fd0c93bcc906957bdc17f89cb8e6 languageName: node linkType: hard "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + checksum: 14222c9e1d3f9ae01480c50d96057228a8524706db79cdeb5a2ce5bb7070dd9f409a6f84a02cbef8cdc80d39aef86f2dd03d155188a1300c599b05437dcd2ffb languageName: node linkType: hard -"rimraf@npm:3.0.2, rimraf@npm:^3.0.2": +"rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" dependencies: - glob: ^7.1.3 + glob: "npm:^7.1.3" bin: rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + checksum: 063ffaccaaaca2cfd0ef3beafb12d6a03dd7ff1260d752d62a6077b5dfff6ae81bea571f655bb6b589d366930ec1bdd285d40d560c0dae9b12f125e54eb743d5 languageName: node linkType: hard -"rollup@npm:^2.79.1": - version: 2.79.1 - resolution: "rollup@npm:2.79.1" +"rimraf@npm:^5.0.5": + version: 5.0.5 + resolution: "rimraf@npm:5.0.5" dependencies: - fsevents: ~2.3.2 + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: a612c7184f96258b7d1328c486b12ca7b60aa30e04229a08bbfa7e964486deb1e9a1b52d917809311bdc39a808a4055c0f950c0280fba194ba0a09e6f0d404f6 + languageName: node + linkType: hard + +"rollup@npm:^4.9.2": + version: 4.9.3 + resolution: "rollup@npm:4.9.3" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.9.3" + "@rollup/rollup-android-arm64": "npm:4.9.3" + "@rollup/rollup-darwin-arm64": "npm:4.9.3" + "@rollup/rollup-darwin-x64": "npm:4.9.3" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.9.3" + "@rollup/rollup-linux-arm64-gnu": "npm:4.9.3" + "@rollup/rollup-linux-arm64-musl": "npm:4.9.3" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.9.3" + "@rollup/rollup-linux-x64-gnu": "npm:4.9.3" + "@rollup/rollup-linux-x64-musl": "npm:4.9.3" + "@rollup/rollup-win32-arm64-msvc": "npm:4.9.3" + "@rollup/rollup-win32-ia32-msvc": "npm:4.9.3" + "@rollup/rollup-win32-x64-msvc": "npm:4.9.3" + "@types/estree": "npm:1.0.5" + fsevents: "npm:~2.3.2" dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true fsevents: optional: true bin: rollup: dist/bin/rollup - checksum: 6a2bf167b3587d4df709b37d149ad0300692cc5deb510f89ac7bdc77c8738c9546ae3de9322b0968e1ed2b0e984571f5f55aae28fa7de4cfcb1bc5402a4e2be6 + checksum: 8916c72dd148ec4aa116ff6f28f5baf07c07da689bd3c0b2dd4e6ae80978411f38674b5156decb32d752f3ce49de5882d0aca62a90894ae2cdcd3704605707bb + languageName: node + linkType: hard + +"run-applescript@npm:^7.0.0": + version: 7.0.0 + resolution: "run-applescript@npm:7.0.0" + checksum: b02462454d8b182ad4117e5d4626e9e6782eb2072925c9fac582170b0627ae3c1ea92ee9b2df7daf84b5e9ffe14eb1cf5fb70bc44b15c8a0bfcdb47987e2410c languageName: node linkType: hard "run-async@npm:^2.4.0": version: 2.4.1 resolution: "run-async@npm:2.4.1" - checksum: a2c88aa15df176f091a2878eb840e68d0bdee319d8d97bbb89112223259cebecb94bc0defd735662b83c2f7a30bed8cddb7d1674eb48ae7322dc602b22d03797 + checksum: c79551224dafa26ecc281cb1efad3510c82c79116aaf681f8a931ce70fdf4ca880d58f97d3b930a38992c7aad7955a08e065b32ec194e1dd49d7790c874ece50 languageName: node linkType: hard @@ -7995,56 +8264,68 @@ __metadata: version: 1.2.0 resolution: "run-parallel@npm:1.2.0" dependencies: - queue-microtask: ^1.2.2 + queue-microtask: "npm:^1.2.2" checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d languageName: node linkType: hard "rxjs@npm:^7.5.5": - version: 7.8.0 - resolution: "rxjs@npm:7.8.0" + version: 7.8.1 + resolution: "rxjs@npm:7.8.1" + dependencies: + tslib: "npm:^2.1.0" + checksum: b10cac1a5258f885e9dd1b70d23c34daeb21b61222ee735d2ec40a8685bdca40429000703a44f0e638c27a684ac139e1c37e835d2a0dc16f6fc061a138ae3abb + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.0.1": + version: 1.0.1 + resolution: "safe-array-concat@npm:1.0.1" dependencies: - tslib: ^2.1.0 - checksum: 61b4d4fd323c1043d8d6ceb91f24183b28bcf5def4f01ca111511d5c6b66755bc5578587fe714ef5d67cf4c9f2e26f4490d4e1d8cabf9bd5967687835e9866a2 + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + isarray: "npm:^2.0.5" + checksum: 44f073d85ca12458138e6eff103ac63cec619c8261b6579bd2fa3ae7b6516cf153f02596d68e40c5bbe322a29c930017800efff652734ddcb8c0f33b2a71f89c languageName: node linkType: hard "safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + checksum: 32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 languageName: node linkType: hard "safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" - checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c + checksum: 7eb5b48f2ed9a594a4795677d5a150faa7eb54483b2318b568dc0c4fc94092a6cce5be02c7288a0500a156282f5276d5688bce7259299568d1053b2150ef374a languageName: node linkType: hard "safe-regex-test@npm:^1.0.0": - version: 1.0.0 - resolution: "safe-regex-test@npm:1.0.0" + version: 1.0.1 + resolution: "safe-regex-test@npm:1.0.1" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.3 - is-regex: ^1.1.4 - checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 + call-bind: "npm:^1.0.5" + get-intrinsic: "npm:^1.2.2" + is-regex: "npm:^1.1.4" + checksum: f9e2af64e4a8385c00239797513103bc8b3ade4b0bb71f4c6ecd8de2d92d31c891ec6fd0e6e6d1f1c597d606f5e200acf615d6c9b6baa5e422ed9fe17ddacc35 languageName: node linkType: hard -"safe-stable-stringify@npm:^2.4.1": - version: 2.4.2 - resolution: "safe-stable-stringify@npm:2.4.2" - checksum: 0324ba2e40f78cae63e31a02b1c9bdf1b786621f9e8760845608eb9e81aef401944ac2078e5c9c1533cf516aea34d08fa8052ca853637ced84b791caaf1e394e +"safe-stable-stringify@npm:^2.4.3": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: a6c192bbefe47770a11072b51b500ed29be7b1c15095371c1ee1dc13e45ce48ee3c80330214c56764d006c485b88bd0b24940d868948170dddc16eed312582d8 languageName: node linkType: hard "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + checksum: 7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 languageName: node linkType: hard @@ -8052,51 +8333,51 @@ __metadata: version: 3.0.0 resolution: "sass-lookup@npm:3.0.0" dependencies: - commander: ^2.16.0 + commander: "npm:^2.16.0" bin: sass-lookup: bin/cli.js - checksum: fd4bf1ad9c54111617dec30dd90aff083e87c96aef50aff6cec443ad2fbbfa65da09f6e67a7e5ef99fa39dff65c937dc7358f18d319e083c6031f21def85ce6d + checksum: 010b6ae2ee42554ef567a433a1febb9979e91ea99bfacc514e886cf966adba76cd075126d4eac3d557377c30ce2477825bd3d9b59a326571f295c99373a342da languageName: node linkType: hard -"secp256k1@npm:^4.0.3": - version: 4.0.3 - resolution: "secp256k1@npm:4.0.3" +"secp256k1@npm:^5.0.0": + version: 5.0.0 + resolution: "secp256k1@npm:5.0.0" dependencies: - elliptic: ^6.5.4 - node-addon-api: ^2.0.0 - node-gyp: latest - node-gyp-build: ^4.2.0 - checksum: 21e219adc0024fbd75021001358780a3cc6ac21273c3fcaef46943af73969729709b03f1df7c012a0baab0830fb9a06ccc6b42f8d50050c665cb98078eab477b + elliptic: "npm:^6.5.4" + node-addon-api: "npm:^5.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.2.0" + checksum: 6e146c876ef202dbfbb35836d6ccd0ea3779dc09bad632bb9e0fe2e702848a4ee96638f39da54895430de832232d6292d858529e2eda56db3ddda13e40d7facc languageName: node linkType: hard "semver@npm:2 || 3 || 4 || 5": - version: 5.7.1 - resolution: "semver@npm:5.7.1" + version: 5.7.2 + resolution: "semver@npm:5.7.2" bin: - semver: ./bin/semver - checksum: 57fd0acfd0bac382ee87cd52cd0aaa5af086a7dc8d60379dfe65fea491fb2489b6016400813930ecd61fd0952dae75c115287a1b16c234b1550887117744dfaf + semver: bin/semver + checksum: fca14418a174d4b4ef1fecb32c5941e3412d52a4d3d85165924ce3a47fbc7073372c26faf7484ceb4bbc2bde25880c6b97e492473dc7e9708fdfb1c6a02d546e languageName: node linkType: hard -"semver@npm:^6.0.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" +"semver@npm:^6.0.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + semver: bin/semver.js + checksum: 1ef3a85bd02a760c6ef76a45b8c1ce18226de40831e02a00bad78485390b98b6ccaa31046245fc63bba4a47a6a592b6c7eedc65cc47126e60489f9cc1ce3ed7e languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:~7.3.0": - version: 7.3.8 - resolution: "semver@npm:7.3.8" +"semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:~7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" dependencies: - lru-cache: ^6.0.0 + lru-cache: "npm:^6.0.0" bin: semver: bin/semver.js - checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 + checksum: 985dec0d372370229a262c737063860fabd4a1c730662c1ea3200a2f649117761a42184c96df62a0e885e76fbd5dace41087d6c1ac0351b13c0df5d6bcb1b5ac languageName: node linkType: hard @@ -8104,20 +8385,20 @@ __metadata: version: 0.18.0 resolution: "send@npm:0.18.0" dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - etag: ~1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: ~1.2.1 - statuses: 2.0.1 - checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8 + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: ec66c0ad109680ad8141d507677cfd8b4e40b9559de23191871803ed241718e99026faa46c398dcfb9250676076573bd6bfe5d0ec347f88f4b7b8533d1d391cb languageName: node linkType: hard @@ -8125,7 +8406,7 @@ __metadata: version: 7.0.1 resolution: "serialize-error@npm:7.0.1" dependencies: - type-fest: ^0.13.1 + type-fest: "npm:^0.13.1" checksum: e0aba4dca2fc9fe74ae1baf38dbd99190e1945445a241ba646290f2176cdb2032281a76443b02ccf0caf30da5657d510746506368889a593b9835a497fc0732e languageName: node linkType: hard @@ -8134,25 +8415,48 @@ __metadata: version: 1.15.0 resolution: "serve-static@npm:1.15.0" dependencies: - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - parseurl: ~1.3.3 - send: 0.18.0 - checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:0.18.0" + checksum: 699b2d4c29807a51d9b5e0f24955346911437aebb0178b3c4833ad30d3eca93385ff9927254f5c16da345903cad39d9cd4a532198c95a5129cc4ed43911b15a4 languageName: node linkType: hard "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 + checksum: 8980ebf7ae9eb945bb036b6e283c547ee783a1ad557a82babf758a065e2fb6ea337fd82cac30dd565c1e606e423f30024a19fff7afbf4977d784720c4026a8ef + languageName: node + linkType: hard + +"set-function-length@npm:^1.1.1": + version: 1.1.1 + resolution: "set-function-length@npm:1.1.1" + dependencies: + define-data-property: "npm:^1.1.1" + get-intrinsic: "npm:^1.2.1" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + checksum: 745ed1d7dc69a6185e0820082fe73838ab3dfd01e75cce83a41e4c1d68bbf34bc5fb38f32ded542ae0b557536b5d2781594499b5dcd19e7db138e06292a76c7b + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.0": + version: 2.0.1 + resolution: "set-function-name@npm:2.0.1" + dependencies: + define-data-property: "npm:^1.0.1" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.0" + checksum: 4975d17d90c40168eee2c7c9c59d023429f0a1690a89d75656306481ece0c3c1fb1ebcc0150ea546d1913e35fbd037bace91372c69e543e51fc5d1f31a9fa126 languageName: node linkType: hard "setprototypeof@npm:1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" - checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 + checksum: fde1630422502fbbc19e6844346778f99d449986b2f9cdcceb8326730d2f3d9964dbcb03c02aaadaefffecd0f2c063315ebea8b3ad895914bf1afc1747fc172e languageName: node linkType: hard @@ -8160,7 +8464,7 @@ __metadata: version: 2.0.0 resolution: "shebang-command@npm:2.0.0" dependencies: - shebang-regex: ^3.0.0 + shebang-regex: "npm:^3.0.0" checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa languageName: node linkType: hard @@ -8172,14 +8476,15 @@ __metadata: languageName: node linkType: hard -"shiki@npm:^0.12.1": - version: 0.12.1 - resolution: "shiki@npm:0.12.1" +"shiki@npm:^0.14.7": + version: 0.14.7 + resolution: "shiki@npm:0.14.7" dependencies: - jsonc-parser: ^3.2.0 - vscode-oniguruma: ^1.7.0 - vscode-textmate: ^8.0.0 - checksum: a5d78a79d282f5c5168786980c66e82f075e91fa015097456486624fc5775688d685ad9b1972b0617d7f1ef50927d21b61dca476247a6f6c6b7042046e89a979 + ansi-sequence-parser: "npm:^1.1.0" + jsonc-parser: "npm:^3.2.0" + vscode-oniguruma: "npm:^1.7.0" + vscode-textmate: "npm:^8.0.0" + checksum: be3f2444c65bd0c57802026f171cb42ad571d361ee885be0c292b60785f68c70f19b69310f5ffe7f7a93db4c5ef50211e0a0248794bc6bb48d242bc43fe72a62 languageName: node linkType: hard @@ -8187,20 +8492,27 @@ __metadata: version: 1.0.4 resolution: "side-channel@npm:1.0.4" dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + call-bind: "npm:^1.0.0" + get-intrinsic: "npm:^1.0.2" + object-inspect: "npm:^1.9.0" + checksum: c4998d9fc530b0e75a7fd791ad868fdc42846f072734f9080ff55cc8dc7d3899abcda24fd896aa6648c3ab7021b4bb478073eb4f44dfd55bce9714bc1a7c5d45 languageName: node linkType: hard -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 languageName: node linkType: hard +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: c9fa63bbbd7431066174a48ba2dd9986dfd930c3a8b59de9c29d7b6854ec1c12a80d15310869ea5166d413b99f041bfa3dd80a7947bcd44ea8e6eb3ffeabfa1f + languageName: node + linkType: hard + "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" @@ -8215,12 +8527,19 @@ __metadata: languageName: node linkType: hard +"slash@npm:^5.1.0": + version: 5.1.0 + resolution: "slash@npm:5.1.0" + checksum: 2c41ec6fb1414cd9bba0fa6b1dd00e8be739e3fe85d079c69d4b09ca5f2f86eafd18d9ce611c0c0f686428638a36c272a6ac14799146a8295f259c10cc45cde4 + languageName: node + linkType: hard + "slice-ansi@npm:^5.0.0": version: 5.0.0 resolution: "slice-ansi@npm:5.0.0" dependencies: - ansi-styles: ^6.0.0 - is-fullwidth-code-point: ^4.0.0 + ansi-styles: "npm:^6.0.0" + is-fullwidth-code-point: "npm:^4.0.0" checksum: 7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e languageName: node linkType: hard @@ -8228,35 +8547,35 @@ __metadata: "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" - checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b + checksum: 927484aa0b1640fd9473cee3e0a0bcad6fce93fd7bbc18bac9ad0c33686f5d2e2c422fba24b5899c184524af01e11dd2bd051c2bf2b07e47aff8ca72cbfc60d2 languageName: node linkType: hard -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" +"socks-proxy-agent@npm:^8.0.1": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + agent-base: "npm:^7.0.2" + debug: "npm:^4.3.4" + socks: "npm:^2.7.1" + checksum: ea727734bd5b2567597aa0eda14149b3b9674bb44df5937bbb9815280c1586994de734d965e61f1dd45661183d7b41f115fb9e432d631287c9063864cfcc2ecc languageName: node linkType: hard -"socks@npm:^2.6.2": +"socks@npm:^2.7.1": version: 2.7.1 resolution: "socks@npm:2.7.1" dependencies: - ip: ^2.0.0 - smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + ip: "npm:^2.0.0" + smart-buffer: "npm:^4.2.0" + checksum: 5074f7d6a13b3155fa655191df1c7e7a48ce3234b8ccf99afa2ccb56591c195e75e8bb78486f8e9ea8168e95a29573cbaad55b2b5e195160ae4d2ea6811ba833 languageName: node linkType: hard "source-map-js@npm:^1.0.2": version: 1.0.2 resolution: "source-map-js@npm:1.0.2" - checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c + checksum: 38e2d2dd18d2e331522001fc51b54127ef4a5d473f53b1349c5cca2123562400e0986648b52e9407e348eaaed53bce49248b6e2641e6d793ca57cb2c360d6d51 languageName: node linkType: hard @@ -8264,33 +8583,26 @@ __metadata: version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 8317e12d84019b31e34b86d483dd41d6f832f389f7417faf8fc5c75a66a12d9686e47f589a0554a868b8482f037e23df9d040d29387eb16fa14cb85f091ba207 languageName: node linkType: hard "source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"sourcemap-codec@npm:^1.4.8": - version: 1.4.8 - resolution: "sourcemap-codec@npm:1.4.8" - checksum: b57981c05611afef31605732b598ccf65124a9fcb03b833532659ac4d29ac0f7bfacbc0d6c5a28a03e84c7510e7e556d758d0bb57786e214660016fb94279316 + checksum: 59ef7462f1c29d502b3057e822cdbdae0b0e565302c4dd1a95e11e793d8d9d62006cdc10e0fd99163ca33ff2071360cf50ee13f90440806e7ed57d81cba2f7ff languageName: node linkType: hard "spdx-correct@npm:^3.0.0": - version: 3.1.1 - resolution: "spdx-correct@npm:3.1.1" + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" dependencies: - spdx-expression-parse: ^3.0.0 - spdx-license-ids: ^3.0.0 - checksum: 77ce438344a34f9930feffa61be0eddcda5b55fc592906ef75621d4b52c07400a97084d8701557b13f7d2aae0cb64f808431f469e566ef3fe0a3a131dcb775a6 + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: cc2e4dbef822f6d12142116557d63f5facf3300e92a6bd24e907e4865e17b7e1abd0ee6b67f305cae6790fc2194175a24dc394bfcc01eea84e2bdad728e9ae9a languageName: node linkType: hard @@ -8305,16 +8617,16 @@ __metadata: version: 3.0.1 resolution: "spdx-expression-parse@npm:3.0.1" dependencies: - spdx-exceptions: ^2.1.0 - spdx-license-ids: ^3.0.0 + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde languageName: node linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.12 - resolution: "spdx-license-ids@npm:3.0.12" - checksum: 92a4dddce62ce1db6fe54a7a839cf85e06abc308fc83b776a55b44e4f1906f02e7ebd506120847039e976bbbad359ea8bdfafb7925eae5cd7e73255f02e0b7d6 + version: 3.0.16 + resolution: "spdx-license-ids@npm:3.0.16" + checksum: 6425c54132ca38d717315cdbd2b620235937d1859972c5978bbc95b4c14400438ffe113709d8aabb0d5498cc27a5b89876fca0fe21b4e26f5ce122bc86d0d88e languageName: node linkType: hard @@ -8322,8 +8634,8 @@ __metadata: version: 3.2.2 resolution: "split2@npm:3.2.2" dependencies: - readable-stream: ^3.0.0 - checksum: 8127ddbedd0faf31f232c0e9192fede469913aa8982aa380752e0463b2e31c2359ef6962eb2d24c125bac59eeec76873678d723b1c7ff696216a1cd071e3994a + readable-stream: "npm:^3.0.0" + checksum: a426e1e6718e2f7e50f102d5ec3525063d885e3d9cec021a81175fd3497fdb8b867a89c99e70bef4daeef4f2f5e544f7b92df8c1a30b4254e10a9cfdcc3dae87 languageName: node linkType: hard @@ -8331,7 +8643,7 @@ __metadata: version: 1.0.1 resolution: "split@npm:1.0.1" dependencies: - through: 2 + through: "npm:2" checksum: 12f4554a5792c7e98bb3e22b53c63bfa5ef89aa704353e1db608a55b51f5b12afaad6e4a8ecf7843c15f273f43cdadd67b3705cc43d48a75c2cf4641d51f7e7a languageName: node linkType: hard @@ -8339,23 +8651,23 @@ __metadata: "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" - checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 + checksum: c34828732ab8509c2741e5fd1af6b767c3daf2c642f267788f933a65b1614943c282e74c4284f4fa749c264b18ee016a0d37a3e5b73aee446da46277d3a85daa languageName: node linkType: hard -"ssri@npm:^9.0.0": - version: 9.0.1 - resolution: "ssri@npm:9.0.1" +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" dependencies: - minipass: ^3.1.1 - checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb + minipass: "npm:^7.0.3" + checksum: 453f9a1c241c13f5dfceca2ab7b4687bcff354c3ccbc932f35452687b9ef0ccf8983fd13b8a3baa5844c1a4882d6e3ddff48b0e7fd21d743809ef33b80616d79 languageName: node linkType: hard "stack-utils@npm:^0.4.0": version: 0.4.0 resolution: "stack-utils@npm:0.4.0" - checksum: 4f57cc33ffe18846657fb083bc93b1d51941ab18de20e7610e3cc2fccbb2ca7127f10acb2e2d68240f8f16fba0240aca165ee55a8feabab61de97c59b2cde539 + checksum: 3436f7db19dc33e52669cbd22ca5ee4b0c07a8e4709c1424b42e1f2584116d129dd090684464edfecadb896ab616cdc8bc5276b7f0bf0bd851b816846e0afadf languageName: node linkType: hard @@ -8363,8 +8675,8 @@ __metadata: version: 2.0.6 resolution: "stack-utils@npm:2.0.6" dependencies: - escape-string-regexp: ^2.0.0 - checksum: 052bf4d25bbf5f78e06c1d5e67de2e088b06871fa04107ca8d3f0e9d9263326e2942c8bedee3545795fc77d787d443a538345eef74db2f8e35db3558c6f91ff7 + escape-string-regexp: "npm:^2.0.0" + checksum: cdc988acbc99075b4b036ac6014e5f1e9afa7e564482b687da6384eee6a1909d7eaffde85b0a17ffbe186c5247faf6c2b7544e802109f63b72c7be69b13151bb languageName: node linkType: hard @@ -8372,23 +8684,23 @@ __metadata: version: 9.5.0 resolution: "standard-version@npm:9.5.0" dependencies: - chalk: ^2.4.2 - conventional-changelog: 3.1.25 - conventional-changelog-config-spec: 2.1.0 - conventional-changelog-conventionalcommits: 4.6.3 - conventional-recommended-bump: 6.1.0 - detect-indent: ^6.0.0 - detect-newline: ^3.1.0 - dotgitignore: ^2.1.0 - figures: ^3.1.0 - find-up: ^5.0.0 - git-semver-tags: ^4.0.0 - semver: ^7.1.1 - stringify-package: ^1.0.1 - yargs: ^16.0.0 + chalk: "npm:^2.4.2" + conventional-changelog: "npm:3.1.25" + conventional-changelog-config-spec: "npm:2.1.0" + conventional-changelog-conventionalcommits: "npm:4.6.3" + conventional-recommended-bump: "npm:6.1.0" + detect-indent: "npm:^6.0.0" + detect-newline: "npm:^3.1.0" + dotgitignore: "npm:^2.1.0" + figures: "npm:^3.1.0" + find-up: "npm:^5.0.0" + git-semver-tags: "npm:^4.0.0" + semver: "npm:^7.1.1" + stringify-package: "npm:^1.0.1" + yargs: "npm:^16.0.0" bin: standard-version: bin/cli.js - checksum: 55003206f7eca18ee9962566e5222d3930a1fa3c4692615d64e88f08873b9685837d669dc58361831bd3f211b6687c1681ad6a1749edf346b2db3e4564b4933c + checksum: a59fc3a3046007d376bf164b053011db8f6c1417b3512db697e36ea574ec47fca55086513f602ba237c62a2e61f4c60480eb84793fd0450a715bac9dd8634aa2 languageName: node linkType: hard @@ -8399,54 +8711,85 @@ __metadata: languageName: node linkType: hard +"stream-to-array@npm:^2.3.0": + version: 2.3.0 + resolution: "stream-to-array@npm:2.3.0" + dependencies: + any-promise: "npm:^1.1.0" + checksum: 7feaf63b38399b850615e6ffcaa951e96e4c8f46745dbce4b553a94c5dc43966933813747014935a3ff97793e7f30a65270bde19f82b2932871a1879229a77cf + languageName: node + linkType: hard + "string-argv@npm:~0.3.1": - version: 0.3.1 - resolution: "string-argv@npm:0.3.1" - checksum: efbd0289b599bee808ce80820dfe49c9635610715429c6b7cc50750f0437e3c2f697c81e5c390208c13b5d5d12d904a1546172a88579f6ee5cbaaaa4dc9ec5cf + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: f9d3addf887026b4b5f997a271149e93bf71efc8692e7dc0816e8807f960b18bcb9787b45beedf0f97ff459575ee389af3f189d8b649834cac602f2e857e75af languageName: node linkType: hard -"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb languageName: node linkType: hard -"string-width@npm:^5.0.0": +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": version: 5.1.2 resolution: "string-width@npm:5.1.2" dependencies: - eastasianwidth: ^0.2.0 - emoji-regex: ^9.2.2 - strip-ansi: ^7.0.1 + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.6": - version: 1.0.6 - resolution: "string.prototype.trimend@npm:1.0.6" +"string-width@npm:^7.0.0": + version: 7.0.0 + resolution: "string-width@npm:7.0.0" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 0fdc34645a639bd35179b5a08227a353b88dc089adf438f46be8a7c197fc3f22f8514c1c9be4629b3cd29c281582730a8cbbad6466c60f76b5f99cf2addb132e + emoji-regex: "npm:^10.3.0" + get-east-asian-width: "npm:^1.0.0" + strip-ansi: "npm:^7.1.0" + checksum: bc0de5700a2690895169fce447ec4ed44bc62de80312c2093d5606bfd48319bb88e48a99e97f269dff2bc9577448b91c26b3804c16e7d9b389699795e4655c3b languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.6": - version: 1.0.6 - resolution: "string.prototype.trimstart@npm:1.0.6" +"string.prototype.trim@npm:^1.2.8": + version: 1.2.8 + resolution: "string.prototype.trim@npm:1.2.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 89080feef416621e6ef1279588994305477a7a91648d9436490d56010a1f7adc39167cddac7ce0b9884b8cdbef086987c4dcb2960209f2af8bac0d23ceff4f41 + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 9301f6cb2b6c44f069adde1b50f4048915985170a20a1d64cf7cb2dc53c5cd6b9525b92431f1257f894f94892d6c4ae19b5aa7f577c3589e7e51772dffc9d5a4 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimend@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 3f0d3397ab9bd95cd98ae2fe0943bd3e7b63d333c2ab88f1875cf2e7c958c75dc3355f6fe19ee7c8fca28de6f39f2475e955e103821feb41299a2764a7463ffa + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimstart@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 6e594d3a61b127d243b8be1312e9f78683abe452cfe0bcafa3e0dc62ad6f030ccfb64d87ed3086fb7cb540fda62442c164d237cc5cc4d53c6e3eb659c29a0aeb languageName: node linkType: hard @@ -8454,8 +8797,8 @@ __metadata: version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + safe-buffer: "npm:~5.2.0" + checksum: 54d23f4a6acae0e93f999a585e673be9e561b65cd4cca37714af1e893ab8cd8dfa52a9e4f58f48f87b4a44918d3a9254326cb80ed194bf2e4c226e2b21767e56 languageName: node linkType: hard @@ -8463,8 +8806,8 @@ __metadata: version: 1.1.1 resolution: "string_decoder@npm:1.1.1" dependencies: - safe-buffer: ~5.1.0 - checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b + safe-buffer: "npm:~5.1.0" + checksum: 7c41c17ed4dea105231f6df208002ebddd732e8e9e2d619d133cecd8e0087ddfd9587d2feb3c8caf3213cbd841ada6d057f5142cae68a4e62d3540778d9819b4 languageName: node linkType: hard @@ -8472,10 +8815,10 @@ __metadata: version: 3.3.0 resolution: "stringify-object@npm:3.3.0" dependencies: - get-own-enumerable-property-symbols: ^3.0.0 - is-obj: ^1.0.1 - is-regexp: ^1.0.0 - checksum: 6827a3f35975cfa8572e8cd3ed4f7b262def260af18655c6fde549334acdac49ddba69f3c861ea5a6e9c5a4990fe4ae870b9c0e6c31019430504c94a83b7a154 + get-own-enumerable-property-symbols: "npm:^3.0.0" + is-obj: "npm:^1.0.1" + is-regexp: "npm:^1.0.0" + checksum: 973782f09a3df3f39a2cf07dbf43fb9ba6cb32976f3616cd0f6c10e0a5c5415dd72b7b700e72920e8da2bf57c3001b8e37b5af7174bab9a748ce0416989e19b1 languageName: node linkType: hard @@ -8486,21 +8829,21 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + ansi-regex: "npm:^5.0.1" + checksum: ae3b5436d34fadeb6096367626ce987057713c566e1e7768818797e00ac5d62023d0f198c4e681eae9e20701721980b26a64a8f5b91238869592a9c6800719a2 languageName: node linkType: hard -"strip-ansi@npm:^7.0.1": - version: 7.0.1 - resolution: "strip-ansi@npm:7.0.1" +"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" dependencies: - ansi-regex: ^6.0.1 - checksum: 257f78fa433520e7f9897722731d78599cb3fce29ff26a20a5e12ba4957463b50a01136f37c43707f4951817a75e90820174853d6ccc240997adc5df8f966039 + ansi-regex: "npm:^6.0.1" + checksum: 475f53e9c44375d6e72807284024ac5d668ee1d06010740dec0b9744f2ddf47de8d7151f80e5f6190fc8f384e802fdf9504b76a7e9020c9faee7103623338be2 languageName: node linkType: hard @@ -8518,10 +8861,10 @@ __metadata: languageName: node linkType: hard -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 +"strip-final-newline@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-final-newline@npm:3.0.0" + checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 languageName: node linkType: hard @@ -8529,21 +8872,12 @@ __metadata: version: 3.0.0 resolution: "strip-indent@npm:3.0.0" dependencies: - min-indent: ^1.0.0 + min-indent: "npm:^1.0.0" checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 languageName: node linkType: hard -"strip-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-indent@npm:4.0.0" - dependencies: - min-indent: ^1.0.1 - checksum: 06cbcd93da721c46bc13caeb1c00af93a9b18146a1c95927672d2decab6a25ad83662772417cea9317a2507fb143253ecc23c4415b64f5828cef9b638a744598 - languageName: node - linkType: hard - -"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1, strip-json-comments@npm:~3.1.1": +"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.1, strip-json-comments@npm:~3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 @@ -8561,9 +8895,9 @@ __metadata: version: 7.0.0 resolution: "strtok3@npm:7.0.0" dependencies: - "@tokenizer/token": ^0.3.0 - peek-readable: ^5.0.0 - checksum: 2ebe7ad8f2aea611dec6742cf6a42e82764892a362907f7ce493faf334501bf981ce21c828dcc300457e6d460dc9c34d644ededb3b01dcb9e37559203cf1748c + "@tokenizer/token": "npm:^0.3.0" + peek-readable: "npm:^5.0.0" + checksum: 4f2269679fcfce1e9fe0600eff361ea4c687ae0a0e8d9dab6703811071cd92545cbcb32d4ace3d3aa591f777cec1a3e8aeecd5efd71ae216fd2962a7a238b4ab languageName: node linkType: hard @@ -8571,11 +8905,11 @@ __metadata: version: 3.0.2 resolution: "stylus-lookup@npm:3.0.2" dependencies: - commander: ^2.8.1 - debug: ^4.1.0 + commander: "npm:^2.8.1" + debug: "npm:^4.1.0" bin: stylus-lookup: bin/cli.js - checksum: 460e9b6e7e662e2cf98d41ee670cb5da9ec8b8dbc1d4574de29ac422c632d5c7933772822fc12792f2ee9f9c2f62b3f60ed5850690e7c780ab7b6f07010199e4 + checksum: 94da8b81ef16f73eae0dc734b18165e6f84d41960bc85fb39d9b028f4b6d8c4c2983ce52492751a3eb2e8e65e3e1507adc6739cc3c7893754672546c6af22f62 languageName: node linkType: hard @@ -8583,11 +8917,11 @@ __metadata: version: 3.0.1 resolution: "supertap@npm:3.0.1" dependencies: - indent-string: ^5.0.0 - js-yaml: ^3.14.1 - serialize-error: ^7.0.1 - strip-ansi: ^7.0.1 - checksum: ee3d71c1d25f7f15d4a849e72b0c5f430df7cd8f702cf082fdbec5642a9546be6557766745655fa3a3e9c88f7c7eed849f2d74457b5b72cb9d94a779c0c8a948 + indent-string: "npm:^5.0.0" + js-yaml: "npm:^3.14.1" + serialize-error: "npm:^7.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 2074334f793eef87a960b2dbee7e5106a9002ba83b2df507df6fe70b0014430e54f145e5ef6e9de507d413c2aadbf569b9f4c1dd600725ea295b9dec8bd6aaa3 languageName: node linkType: hard @@ -8595,8 +8929,8 @@ __metadata: version: 5.5.0 resolution: "supports-color@npm:5.5.0" dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + has-flag: "npm:^3.0.0" + checksum: 5f505c6fa3c6e05873b43af096ddeb22159831597649881aeb8572d6fe3b81e798cc10840d0c9735e0026b250368851b7f77b65e84f4e4daa820a4f69947f55b languageName: node linkType: hard @@ -8604,68 +8938,36 @@ __metadata: version: 7.2.0 resolution: "supports-color@npm:7.2.0" dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + has-flag: "npm:^4.0.0" + checksum: c8bb7afd564e3b26b50ca6ee47572c217526a1389fe018d00345856d4a9b08ffbd61fadaf283a87368d94c3dcdb8f5ffe2650a5a65863e21ad2730ca0f05210a languageName: node linkType: hard "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + checksum: a9dc19ae2220c952bd2231d08ddeecb1b0328b61e72071ff4000c8384e145cc07c1c0bdb3b5a1cb06e186a7b2790f1dee793418b332f6ddf320de25d9125be7e languageName: node linkType: hard "tapable@npm:^2.2.0": version: 2.2.1 resolution: "tapable@npm:2.2.1" - checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 - languageName: node - linkType: hard - -"tar-fs@npm:2.1.1": - version: 2.1.1 - resolution: "tar-fs@npm:2.1.1" - dependencies: - chownr: ^1.1.1 - mkdirp-classic: ^0.5.2 - pump: ^3.0.0 - tar-stream: ^2.1.4 - checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d - languageName: node - linkType: hard - -"tar-stream@npm:^2.1.4": - version: 2.2.0 - resolution: "tar-stream@npm:2.2.0" - 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 - checksum: 699831a8b97666ef50021c767f84924cfee21c142c2eb0e79c63254e140e6408d6d55a065a2992548e72b06de39237ef2b802b99e3ece93ca3904a37622a66f3 + checksum: 1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a languageName: node linkType: hard "tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.1.13 - resolution: "tar@npm:6.1.13" + version: 6.2.0 + resolution: "tar@npm:6.2.0" dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^4.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: 8a278bed123aa9f53549b256a36b719e317c8b96fe86a63406f3c62887f78267cea9b22dc6f7007009738509800d4a4dccc444abd71d762287c90f35b002eb1c - languageName: node - linkType: hard - -"temp-dir@npm:^2.0.0": - version: 2.0.0 - resolution: "temp-dir@npm:2.0.0" - checksum: cc4f0404bf8d6ae1a166e0e64f3f409b423f4d1274d8c02814a59a5529f07db6cd070a749664141b992b2c1af337fa9bb451a460a43bb9bcddc49f235d3115aa + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 2042bbb14830b5cd0d584007db0eb0a7e933e66d1397e72a4293768d2332449bc3e312c266a0887ec20156dea388d8965e53b4fc5097f42d78593549016da089 languageName: node linkType: hard @@ -8676,22 +8978,15 @@ __metadata: languageName: node linkType: hard -"temp@npm:~0.4.0": - version: 0.4.0 - resolution: "temp@npm:0.4.0" - checksum: 8b83f98833b7f6cd03a1f523d17f8b06fe687cbdfc5654ae41edacdf640e71f1057c3cf2534ac44e265834c1af6270d9a0b9baeee6b86ccb2ef379e43dbc0d0a - languageName: node - linkType: hard - -"tempy@npm:^3.0.0": - version: 3.0.0 - resolution: "tempy@npm:3.0.0" +"tempy@npm:^3.1.0": + version: 3.1.0 + resolution: "tempy@npm:3.1.0" dependencies: - is-stream: ^3.0.0 - temp-dir: ^2.0.0 - type-fest: ^2.12.2 - unique-string: ^3.0.0 - checksum: 52138bfda3854b09cef5b4ded773e4daeebc910888d5d3bbc348adcc5f935661e07b1b1ba291e3bbb5b4f42c6e04f912b80a0d37812cf8940bdf271f18f7364d + is-stream: "npm:^3.0.0" + temp-dir: "npm:^3.0.0" + type-fest: "npm:^2.12.2" + unique-string: "npm:^3.0.0" + checksum: f5540bc24dcd9d41ab0b31e9eed73c3ef825080f1c8b1e854e4b73059155c889f72f5f7c15e8cd462d59aa10c9726e423c81d6a365d614b538c6cc78a1209cc6 languageName: node linkType: hard @@ -8699,10 +8994,10 @@ __metadata: version: 6.0.0 resolution: "test-exclude@npm:6.0.0" dependencies: - "@istanbuljs/schema": ^0.1.2 - glob: ^7.1.4 - minimatch: ^3.0.4 - checksum: 3b34a3d77165a2cb82b34014b3aba93b1c4637a5011807557dc2f3da826c59975a5ccad765721c4648b39817e3472789f9b0fa98fc854c5c1c7a1e632aacdc28 + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^7.1.4" + minimatch: "npm:^3.0.4" + checksum: 8fccb2cb6c8fcb6bb4115394feb833f8b6cf4b9503ec2485c2c90febf435cac62abe882a0c5c51a37b9bbe70640cdd05acf5f45e486ac4583389f4b0855f69e5 languageName: node linkType: hard @@ -8716,7 +9011,7 @@ __metadata: "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + checksum: 4383b5baaeffa9bb4cda2ac33a4aa2e6d1f8aaf811848bf73513a9b88fd76372dc461f6fd6d2e9cb5100f48b473be32c6f95bd983509b7d92bb4d92c10747452 languageName: node linkType: hard @@ -8724,9 +9019,9 @@ __metadata: version: 2.0.5 resolution: "through2@npm:2.0.5" dependencies: - readable-stream: ~2.3.6 - xtend: ~4.0.1 - checksum: beb0f338aa2931e5660ec7bf3ad949e6d2e068c31f4737b9525e5201b824ac40cac6a337224856b56bd1ddd866334bbfb92a9f57cd6f66bc3f18d3d86fc0fe50 + readable-stream: "npm:~2.3.6" + xtend: "npm:~4.0.1" + checksum: cd71f7dcdc7a8204fea003a14a433ef99384b7d4e31f5497e1f9f622b3cf3be3691f908455f98723bdc80922a53af7fa10c3b7abbe51c6fd3d536dbc7850e2c4 languageName: node linkType: hard @@ -8734,15 +9029,15 @@ __metadata: version: 4.0.2 resolution: "through2@npm:4.0.2" dependencies: - readable-stream: 3 - checksum: ac7430bd54ccb7920fd094b1c7ff3e1ad6edd94202e5528331253e5fde0cc56ceaa690e8df9895de2e073148c52dfbe6c4db74cacae812477a35660090960cc0 + readable-stream: "npm:3" + checksum: 72c246233d9a989bbebeb6b698ef0b7b9064cb1c47930f79b25d87b6c867e075432811f69b7b2ac8da00ca308191c507bdab913944be8019ac43b036ce88f6ba languageName: node linkType: hard -"through@npm:2, through@npm:>=2.2.7 <3, through@npm:^2.3.6, through@npm:^2.3.8": +"through@npm:2, through@npm:>=2.2.7 <3, through@npm:^2.3.6": version: 2.3.8 resolution: "through@npm:2.3.8" - checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd + checksum: 5da78346f70139a7d213b65a0106f3c398d6bc5301f9248b5275f420abc2c4b1e77c2abc72d218dedc28c41efb2e7c312cb76a7730d04f9c2d37d247da3f4198 languageName: node linkType: hard @@ -8757,8 +9052,8 @@ __metadata: version: 0.0.33 resolution: "tmp@npm:0.0.33" dependencies: - os-tmpdir: ~1.0.2 - checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 + os-tmpdir: "npm:~1.0.2" + checksum: 09c0abfd165cff29b32be42bc35e80b8c64727d97dedde6550022e88fa9fd39a084660415ed8e3ebaa2aca1ee142f86df8b31d4196d4f81c774a3a20fd4b6abf languageName: node linkType: hard @@ -8773,8 +9068,8 @@ __metadata: version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" dependencies: - is-number: ^7.0.0 - checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + is-number: "npm:^7.0.0" + checksum: 10dda13571e1f5ad37546827e9b6d4252d2e0bc176c24a101252153ef435d83696e2557fe128c4678e4e78f5f01e83711c703eef9814eb12dab028580d45980a languageName: node linkType: hard @@ -8789,16 +9084,16 @@ __metadata: version: 5.0.1 resolution: "token-types@npm:5.0.1" dependencies: - "@tokenizer/token": ^0.3.0 - ieee754: ^1.2.1 - checksum: 32780123bc6ce8b6a2231d860445c994a02a720abf38df5583ea957aa6626873cd1c4dd8af62314da4cf16ede00c379a765707a3b06f04b8808c38efdae1c785 + "@tokenizer/token": "npm:^0.3.0" + ieee754: "npm:^1.2.1" + checksum: 0985369bbea9f53a5ccd79bb9899717b41401a813deb2c7fb1add5d0baf2f702aaf6da78f6e0ccf346d5a9f7acaa7cb5efed7d092d89d8c1e6962959e9509bc0 languageName: node linkType: hard "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" - checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 + checksum: 8f1f5aa6cb232f9e1bdc86f485f916b7aa38caee8a778b378ffec0b70d9307873f253f5cbadbe2955ece2ac5c83d0dc14a77513166ccd0a0c7fe197e21396695 languageName: node linkType: hard @@ -8809,91 +9104,62 @@ __metadata: languageName: node linkType: hard -"trim-newlines@npm:^4.0.2": - version: 4.0.2 - resolution: "trim-newlines@npm:4.0.2" - checksum: 1eef206eb77361856dff0b827e5811baf64574bb21e81b7ad643fe321c5c19b0a452dd83e9afc31206993fcff9bb90a379925d7b5915f887de1ca7da5b57933a +"ts-api-utils@npm:^1.0.1": + version: 1.0.3 + resolution: "ts-api-utils@npm:1.0.3" + peerDependencies: + typescript: ">=4.2.0" + checksum: 1350a5110eb1e534e9a6178f4081fb8a4fcc439749e19f4ad699baec9090fcb90fe532d5e191d91a062dc6e454a14a8d7eb2ad202f57135a30c4a44a3024f039 languageName: node linkType: hard -"ts-json-schema-generator@npm:^1.2.0": - version: 1.2.0 - resolution: "ts-json-schema-generator@npm:1.2.0" - dependencies: - "@types/json-schema": ^7.0.11 - commander: ^9.4.1 - glob: ^8.0.3 - json5: ^2.2.1 - normalize-path: ^3.0.0 - safe-stable-stringify: ^2.4.1 - typescript: ~4.9.3 +"ts-graphviz@npm:^1.5.0": + version: 1.8.1 + resolution: "ts-graphviz@npm:1.8.1" + checksum: 4936292e2b6104363b2d37f995fea766f8aefdabaecae10c963785e0c0b09da35bce78f961ac48897278f4f2148c2d71c7eeafaedcf273d8af06971ae5a01abc + languageName: node + linkType: hard + +"ts-json-schema-generator@npm:^1.5.0": + version: 1.5.0 + resolution: "ts-json-schema-generator@npm:1.5.0" + dependencies: + "@types/json-schema": "npm:^7.0.12" + commander: "npm:^11.0.0" + glob: "npm:^8.0.3" + json5: "npm:^2.2.3" + normalize-path: "npm:^3.0.0" + safe-stable-stringify: "npm:^2.4.3" + typescript: "npm:~5.3.2" bin: ts-json-schema-generator: bin/ts-json-schema-generator - checksum: 855615d442f4834f03a2761955a350255f29f0b4197e2101a30a250062ca0fb793d8c1244ee313f716e075981ffe43d24c1d1fe6a7c23d62a6c05d0a3ba28ada - languageName: node - linkType: hard - -"ts-node@npm:^10.8.1": - version: 10.9.1 - resolution: "ts-node@npm:10.9.1" - dependencies: - "@cspotcode/source-map-support": ^0.8.0 - "@tsconfig/node10": ^1.0.7 - "@tsconfig/node12": ^1.0.7 - "@tsconfig/node14": ^1.0.0 - "@tsconfig/node16": ^1.0.2 - acorn: ^8.4.1 - acorn-walk: ^8.1.1 - arg: ^4.1.0 - create-require: ^1.1.0 - diff: ^4.0.1 - make-error: ^1.1.1 - v8-compile-cache-lib: ^3.0.1 - yn: 3.1.1 - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 + checksum: da0798384eb7ba302f2e7da534fa8965453b9519f6cd3288f62709890e2d1294d6727ee283c96d7bef53381f144404702f9df9ebcc1edd7f26b9b332126a1715 languageName: node linkType: hard -"tsconfig-paths@npm:^3.10.1, tsconfig-paths@npm:^3.14.1": - version: 3.14.1 - resolution: "tsconfig-paths@npm:3.14.1" +"tsconfig-paths@npm:^3.10.1, tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" dependencies: - "@types/json5": ^0.0.29 - json5: ^1.0.1 - minimist: ^1.2.6 - strip-bom: ^3.0.0 - checksum: 8afa01c673ebb4782ba53d3a12df97fa837ce524f8ad38ee4e2b2fd57f5ac79abc21c574e9e9eb014d93efe7fe8214001b96233b5c6ea75bd1ea82afe17a4c6d + "@types/json5": "npm:^0.0.29" + json5: "npm:^1.0.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 2041beaedc6c271fc3bedd12e0da0cc553e65d030d4ff26044b771fac5752d0460944c0b5e680f670c2868c95c664a256cec960ae528888db6ded83524e33a14 languageName: node linkType: hard "tslib@npm:^1.8.1": version: 1.14.1 resolution: "tslib@npm:1.14.1" - checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + checksum: 7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb languageName: node linkType: hard "tslib@npm:^2.1.0": - version: 2.4.1 - resolution: "tslib@npm:2.4.1" - checksum: 19480d6e0313292bd6505d4efe096a6b31c70e21cf08b5febf4da62e95c265c8f571f7b36fcc3d1a17e068032f59c269fab3459d6cd3ed6949eafecf64315fca + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca languageName: node linkType: hard @@ -8901,10 +9167,10 @@ __metadata: version: 3.21.0 resolution: "tsutils@npm:3.21.0" dependencies: - tslib: ^1.8.1 + tslib: "npm:^1.8.1" 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" - checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 + checksum: ea036bec1dd024e309939ffd49fda7a351c0e87a1b8eb049570dd119d447250e2c56e0e6c00554e8205760e7417793fdebff752a46e573fbe07d4f375502a5b2 languageName: node linkType: hard @@ -8912,73 +9178,64 @@ __metadata: version: 0.4.0 resolution: "type-check@npm:0.4.0" dependencies: - prelude-ls: ^1.2.1 - checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a - languageName: node - linkType: hard - -"type-check@npm:~0.3.2": - version: 0.3.2 - resolution: "type-check@npm:0.3.2" - dependencies: - prelude-ls: ~1.1.2 - checksum: dd3b1495642731bc0e1fc40abe5e977e0263005551ac83342ecb6f4f89551d106b368ec32ad3fb2da19b3bd7b2d1f64330da2ea9176d8ddbfe389fb286eb5124 + prelude-ls: "npm:^1.2.1" + checksum: 14687776479d048e3c1dbfe58a2409e00367810d6960c0f619b33793271ff2a27f81b52461f14a162f1f89a9b1d8da1b237fc7c99b0e1fdcec28ec63a86b1fec languageName: node linkType: hard "type-fest@npm:^0.13.1": version: 0.13.1 resolution: "type-fest@npm:0.13.1" - checksum: e6bf2e3c449f27d4ef5d56faf8b86feafbc3aec3025fc9a5fbe2db0a2587c44714521f9c30d8516a833c8c506d6263f5cc11267522b10c6ccdb6cc55b0a9d1c4 + checksum: 11e9476dc85bf97a71f6844fb67ba8e64a4c7e445724c0f3bd37eb2ddf4bc97c1dc9337bd880b28bce158de1c0cb275c2d03259815a5bf64986727197126ab56 languageName: node linkType: hard "type-fest@npm:^0.18.0": version: 0.18.1 resolution: "type-fest@npm:0.18.1" - checksum: e96dcee18abe50ec82dab6cbc4751b3a82046da54c52e3b2d035b3c519732c0b3dd7a2fa9df24efd1a38d953d8d4813c50985f215f1957ee5e4f26b0fe0da395 + checksum: 08844377058435c2b0e633ba01bab6102dba0ed63d85417d8e18feff265eed6f5c9f8f9a25d405ea9db88a41a569be73a3c4c0d4e29150bf89fb145bb23114a2 languageName: node linkType: hard "type-fest@npm:^0.20.2": version: 0.20.2 resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + checksum: 8907e16284b2d6cfa4f4817e93520121941baba36b39219ea36acfe64c86b9dbc10c9941af450bd60832c8f43464974d51c0957f9858bc66b952b66b6914cbb9 languageName: node linkType: hard "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" - checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 + checksum: f4254070d9c3d83a6e573bcb95173008d73474ceadbbf620dd32d273940ca18734dff39c2b2480282df9afe5d1675ebed5499a00d791758748ea81f61a38961f languageName: node linkType: hard "type-fest@npm:^0.6.0": version: 0.6.0 resolution: "type-fest@npm:0.6.0" - checksum: b2188e6e4b21557f6e92960ec496d28a51d68658018cba8b597bd3ef757721d1db309f120ae987abeeda874511d14b776157ff809f23c6d1ce8f83b9b2b7d60f + checksum: 9ecbf4ba279402b14c1a0614b6761bbe95626fab11377291fecd7e32b196109551e0350dcec6af74d97ced1b000ba8060a23eca33157091e642b409c2054ba82 languageName: node linkType: hard "type-fest@npm:^0.8.1": version: 0.8.1 resolution: "type-fest@npm:0.8.1" - checksum: d61c4b2eba24009033ae4500d7d818a94fd6d1b481a8111612ee141400d5f1db46f199c014766b9fa9b31a6a7374d96fc748c6d688a78a3ce5a33123839becb7 + checksum: fd4a91bfb706aeeb0d326ebd2e9a8ea5263979e5dec8d16c3e469a5bd3a946e014a062ef76c02e3086d3d1c7209a56a20a4caafd0e9f9a5c2ab975084ea3d388 languageName: node linkType: hard -"type-fest@npm:^1.0.1, type-fest@npm:^1.2.1, type-fest@npm:^1.2.2": +"type-fest@npm:^1.0.1": version: 1.4.0 resolution: "type-fest@npm:1.4.0" - checksum: b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 + checksum: 89875c247564601c2650bacad5ff80b859007fbdb6c9e43713ae3ffa3f584552eea60f33711dd762e16496a1ab4debd409822627be14097d9a17e39c49db591a languageName: node linkType: hard "type-fest@npm:^2.12.2": version: 2.19.0 resolution: "type-fest@npm:2.19.0" - checksum: a4ef07ece297c9fba78fc1bd6d85dff4472fe043ede98bd4710d2615d15776902b595abf62bd78339ed6278f021235fb28a96361f8be86ed754f778973a0d278 + checksum: 7bf9e8fdf34f92c8bb364c0af14ca875fac7e0183f2985498b77be129dc1b3b1ad0a6b3281580f19e48c6105c037fb966ad9934520c69c6434d17fd0af4eed78 languageName: node linkType: hard @@ -8986,9 +9243,45 @@ __metadata: version: 1.6.18 resolution: "type-is@npm:1.6.18" dependencies: - media-typer: 0.3.0 - mime-types: ~2.1.24 - checksum: 2c8e47675d55f8b4e404bcf529abdf5036c537a04c2b20177bcf78c9e3c1da69da3942b1346e6edb09e823228c0ee656ef0e033765ec39a70d496ef601a0c657 + media-typer: "npm:0.3.0" + mime-types: "npm:~2.1.24" + checksum: 0bd9eeae5efd27d98fd63519f999908c009e148039d8e7179a074f105362d4fcc214c38b24f6cda79c87e563cbd12083a4691381ed28559220d4a10c2047bed4 + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-buffer@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.1" + is-typed-array: "npm:^1.1.10" + checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-length@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + has-proto: "npm:^1.0.1" + is-typed-array: "npm:^1.1.10" + checksum: 6f376bf5d988f00f98ccee41fd551cafc389095a2a307c18fab30f29da7d1464fc3697139cf254cda98b4128bbcb114f4b557bbabdc6d9c2e5039c515b31decf + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-offset@npm:1.0.0" + dependencies: + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + has-proto: "npm:^1.0.1" + is-typed-array: "npm:^1.1.10" + checksum: 2d81747faae31ca79f6c597dc18e15ae3d5b7e97f7aaebce3b31f46feeb2a6c1d6c92b9a634d901c83731ffb7ec0b74d05c6ff56076f5ae39db0cd19b16a3f92 languageName: node linkType: hard @@ -8996,10 +9289,10 @@ __metadata: version: 1.0.4 resolution: "typed-array-length@npm:1.0.4" dependencies: - call-bind: ^1.0.2 - for-each: ^0.3.3 - is-typed-array: ^1.1.9 - checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + is-typed-array: "npm:^1.1.9" + checksum: 0444658acc110b233176cb0b7689dcb828b0cfa099ab1d377da430e8553b6fdcdce882360b7ffe9ae085b6330e1d39383d7b2c61574d6cd8eef651d3e4a87822 languageName: node linkType: hard @@ -9007,91 +9300,91 @@ __metadata: version: 3.1.5 resolution: "typedarray-to-buffer@npm:3.1.5" dependencies: - is-typedarray: ^1.0.0 - checksum: 99c11aaa8f45189fcfba6b8a4825fd684a321caa9bd7a76a27cf0c7732c174d198b99f449c52c3818107430b5f41c0ccbbfb75cb2ee3ca4a9451710986d61a60 + is-typedarray: "npm:^1.0.0" + checksum: 7c850c3433fbdf4d04f04edfc751743b8f577828b8e1eb93b95a3bce782d156e267d83e20fb32b3b47813e69a69ab5e9b5342653332f7d21c7d1210661a7a72c languageName: node linkType: hard "typedarray@npm:^0.0.6": version: 0.0.6 resolution: "typedarray@npm:0.0.6" - checksum: 33b39f3d0e8463985eeaeeacc3cb2e28bc3dfaf2a5ed219628c0b629d5d7b810b0eb2165f9f607c34871d5daa92ba1dc69f49051cf7d578b4cbd26c340b9d1b1 + checksum: 2cc1bcf7d8c1237f6a16c04efc06637b2c5f2d74e58e84665445cf87668b85a21ab18dd751fa49eee6ae024b70326635d7b79ad37b1c370ed2fec6aeeeb52714 languageName: node linkType: hard -"typedoc@npm:^0.23.24": - version: 0.23.24 - resolution: "typedoc@npm:0.23.24" +"typedoc@npm:^0.25.6": + version: 0.25.6 + resolution: "typedoc@npm:0.25.6" dependencies: - lunr: ^2.3.9 - marked: ^4.2.5 - minimatch: ^5.1.2 - shiki: ^0.12.1 + lunr: "npm:^2.3.9" + marked: "npm:^4.3.0" + minimatch: "npm:^9.0.3" + shiki: "npm:^0.14.7" peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x bin: typedoc: bin/typedoc - checksum: b04f9afcba9a38d35631b08ca345f52700f9138f59b9729d7bfecf127c2a75dd6a053594db68f3141e4d7e63b701ffa5421cbdeb95f86b254257e05e240f4da0 + checksum: 4d3858152859598e0a7ed34f3ed023a4ad83b4fa0c684b14752e23b59c3102d265596eb510f2ab8665e7b8e67b5a601fe3f70c9eab1b0a2fece63c33088ea848 languageName: node linkType: hard -"typescript@npm:^3.9.10, typescript@npm:^3.9.5, typescript@npm:^3.9.7": - version: 3.9.10 - resolution: "typescript@npm:3.9.10" +"typescript@npm:5.3.3, typescript@npm:^5.3.3, typescript@npm:~5.3.2": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 46c842e2cd4797b88b66ef06c9c41dd21da48b95787072ccf39d5f2aa3124361bc4c966aa1c7f709fae0509614d76751455b5231b12dbb72eb97a31369e1ff92 + checksum: 6e4e6a14a50c222b3d14d4ea2f729e79f972fa536ac1522b91202a9a65af3605c2928c4a790a4a50aa13694d461c479ba92cedaeb1e7b190aadaa4e4b96b8e18 languageName: node linkType: hard -"typescript@npm:^4.6.4, typescript@npm:^4.9.4, typescript@npm:~4.9.3": - version: 4.9.4 - resolution: "typescript@npm:4.9.4" +"typescript@npm:^3.9.10, typescript@npm:^3.9.7": + version: 3.9.10 + resolution: "typescript@npm:3.9.10" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: e782fb9e0031cb258a80000f6c13530288c6d63f1177ed43f770533fdc15740d271554cdae86701c1dd2c83b082cea808b07e97fd68b38a172a83dbf9e0d0ef9 + checksum: f86a085eea24fdd665850c6be4dd69c7a71fe3d27ecc712be88cdc7a52d866f4f2416ad91c554df60f499dedcf288a24b3d8052e502833d8acc661a9d21bb98f languageName: node linkType: hard -"typescript@npm:~4.8.4": - version: 4.8.4 - resolution: "typescript@npm:4.8.4" +"typescript@npm:^4.0.0, typescript@npm:^4.9.5": + version: 4.9.5 + resolution: "typescript@npm:4.9.5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 3e4f061658e0c8f36c820802fa809e0fd812b85687a9a2f5430bc3d0368e37d1c9605c3ce9b39df9a05af2ece67b1d844f9f6ea8ff42819f13bcb80f85629af0 + checksum: 458f7220ab11e0fc191514cc41be1707645ec9a8c2d609448a448e18c522cef9646f58728f6811185a4c35613dacdf6c98cf8965c88b3541d0288c47291e4300 languageName: node linkType: hard -"typescript@patch:typescript@^3.9.10#~builtin, typescript@patch:typescript@^3.9.5#~builtin, typescript@patch:typescript@^3.9.7#~builtin": - version: 3.9.10 - resolution: "typescript@patch:typescript@npm%3A3.9.10#~builtin::version=3.9.10&hash=3bd3d3" +"typescript@patch:typescript@npm%3A5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin, typescript@patch:typescript@npm%3A~5.3.2#optional!builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: dc7141ab555b23a8650a6787f98845fc11692063d02b75ff49433091b3af2fe3d773650dea18389d7c21f47d620fb3b110ea363dab4ab039417a6ccbbaf96fc2 + checksum: c93786fcc9a70718ba1e3819bab56064ead5817004d1b8186f8ca66165f3a2d0100fee91fa64c840dcd45f994ca5d615d8e1f566d39a7470fc1e014dbb4cf15d languageName: node linkType: hard -"typescript@patch:typescript@^4.6.4#~builtin, typescript@patch:typescript@^4.9.4#~builtin, typescript@patch:typescript@~4.9.3#~builtin": - version: 4.9.4 - resolution: "typescript@patch:typescript@npm%3A4.9.4#~builtin::version=4.9.4&hash=ad5954" +"typescript@patch:typescript@npm%3A^3.9.10#optional!builtin, typescript@patch:typescript@npm%3A^3.9.7#optional!builtin": + version: 3.9.10 + resolution: "typescript@patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 1caaea6cb7f813e64345190fddc4e6c924d0b698ab81189b503763c4a18f7f5501c69362979d36e19c042d89d936443e768a78b0675690b35eb663d19e0eae71 + checksum: 77024c200e1f80d95185d5a973bcc4b0ecc12a77851390b1382e372195313769373a4b8b1642df4a8d4ae1df5911dcd9bde111cf6755eb4b6091f374e97c6dc5 languageName: node linkType: hard -"typescript@patch:typescript@~4.8.4#~builtin": - version: 4.8.4 - resolution: "typescript@patch:typescript@npm%3A4.8.4#~builtin::version=4.8.4&hash=0102e9" +"typescript@patch:typescript@npm%3A^4.0.0#optional!builtin, typescript@patch:typescript@npm%3A^4.9.5#optional!builtin": + version: 4.9.5 + resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 301459fc3eb3b1a38fe91bf96d98eb55da88a9cb17b4ef80b4d105d620f4d547ba776cc27b44cc2ef58b66eda23fe0a74142feb5e79a6fb99f54fc018a696afa + checksum: 5659316360b5cc2d6f5931b346401fa534107b68b60179cf14970e27978f0936c1d5c46f4b5b8175f8cba0430f522b3ce355b4b724c0ea36ce6c0347fab25afd languageName: node linkType: hard @@ -9100,7 +9393,7 @@ __metadata: resolution: "uglify-js@npm:3.17.4" bin: uglifyjs: bin/uglifyjs - checksum: 7b3897df38b6fc7d7d9f4dcd658599d81aa2b1fb0d074829dd4e5290f7318dbca1f4af2f45acb833b95b1fe0ed4698662ab61b87e94328eb4c0a0d3435baf924 + checksum: 4c0b800e0ff192079d2c3ce8414fd3b656a570028c7c79af5c29c53d5c532b68bbcae4ad47307f89c2ee124d11826fff7a136b59d5c5bb18422bcdf5568afe1e languageName: node linkType: hard @@ -9108,21 +9401,25 @@ __metadata: version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" dependencies: - call-bind: ^1.0.2 - has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + call-bind: "npm:^1.0.2" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.0.3" + which-boxed-primitive: "npm:^1.0.2" + checksum: 06e1ee41c1095e37281cb71a975cb3350f7cb470a0665d2576f02cc9564f623bd90cfc0183693b8a7fdf2d242963dcc3010b509fa3ac683f540c765c0f3e7e43 languageName: node linkType: hard -"unbzip2-stream@npm:1.4.3": - version: 1.4.3 - resolution: "unbzip2-stream@npm:1.4.3" - dependencies: - buffer: ^5.2.1 - through: ^2.3.8 - checksum: 0e67c4a91f4fa0fc7b4045f8b914d3498c2fc2e8c39c359977708ec85ac6d6029840e97f508675fdbdf21fcb8d276ca502043406f3682b70f075e69aae626d1d +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 0097779d94bc0fd26f0418b3a05472410408877279141ded2bd449167be1aed7ea5b76f756562cb3586a07f251b90799bab22d9019ceba49c037c76445f7cddd + languageName: node + linkType: hard + +"unicorn-magic@npm:^0.1.0": + version: 0.1.0 + resolution: "unicorn-magic@npm:0.1.0" + checksum: 9b4d0e9809807823dc91d0920a4a4c0cff2de3ebc54ee87ac1ee9bc75eafd609b09d1f14495e0173aef26e01118706196b6ab06a75fe0841028b3983a8af313f languageName: node linkType: hard @@ -9133,30 +9430,21 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^2.0.0": - version: 2.0.1 - resolution: "unique-filename@npm:2.0.1" - dependencies: - unique-slug: ^3.0.0 - checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f - languageName: node - linkType: hard - -"unique-slug@npm:^3.0.0": +"unique-filename@npm:^3.0.0": version: 3.0.0 - resolution: "unique-slug@npm:3.0.0" + resolution: "unique-filename@npm:3.0.0" dependencies: - imurmurhash: ^0.1.4 - checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c + unique-slug: "npm:^4.0.0" + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df languageName: node linkType: hard -"unique-string@npm:^2.0.0": - version: 2.0.0 - resolution: "unique-string@npm:2.0.0" +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" dependencies: - crypto-random-string: ^2.0.0 - checksum: ef68f639136bcfe040cf7e3cd7a8dff076a665288122855148a6f7134092e6ed33bf83a7f3a9185e46c98dddc445a0da6ac25612afa1a7c38b8b654d6c02498e + imurmurhash: "npm:^0.1.4" + checksum: 40912a8963fc02fb8b600cf50197df4a275c602c60de4cac4f75879d3c48558cfac48de08a25cc10df8112161f7180b3bbb4d662aadb711568602f9eddee54f0 languageName: node linkType: hard @@ -9164,7 +9452,7 @@ __metadata: version: 3.0.0 resolution: "unique-string@npm:3.0.0" dependencies: - crypto-random-string: ^4.0.0 + crypto-random-string: "npm:^4.0.0" checksum: 1a1e2e7d02eab1bb10f720475da735e1990c8a5ff34edd1a3b6bc31590cb4210b7a1233d779360cc622ce11c211e43afa1628dd658f35d3e6a89964b622940df languageName: node linkType: hard @@ -9177,9 +9465,9 @@ __metadata: linkType: hard "universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 languageName: node linkType: hard @@ -9194,8 +9482,8 @@ __metadata: version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: - punycode: ^2.1.0 - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + punycode: "npm:^2.1.0" + checksum: b271ca7e3d46b7160222e3afa3e531505161c9a4e097febae9664e4b59912f4cbe94861361a4175edac3a03fee99d91e44b6a58c17a634bc5a664b19fc76fbcb languageName: node linkType: hard @@ -9209,25 +9497,18 @@ __metadata: "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1" - checksum: c81095493225ecfc28add49c106ca4f09cdf56bc66731aa8dabc2edbbccb1e1bfe2de6a115e5c6a380d3ea166d1636410b62ef216bb07b3feb1cfde1d95d5080 - languageName: node - linkType: hard - -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 + checksum: 5d6949693d58cb2e636a84f3ee1c6e7b2f9c16cb1d42d0ecb386d8c025c69e327205aa1c69e2868cc06a01e5e20681fbba55a4e0ed0cce913d60334024eae798 languageName: node linkType: hard "v8-to-istanbul@npm:^9.0.0": - version: 9.0.1 - resolution: "v8-to-istanbul@npm:9.0.1" + version: 9.2.0 + resolution: "v8-to-istanbul@npm:9.2.0" dependencies: - "@jridgewell/trace-mapping": ^0.3.12 - "@types/istanbul-lib-coverage": ^2.0.1 - convert-source-map: ^1.6.0 - checksum: a49c34bf0a3af0c11041a3952a2600913904a983bd1bc87148b5c033bc5c1d02d5a13620fcdbfa2c60bc582a2e2970185780f0c844b4c3a220abf405f8af6311 + "@jridgewell/trace-mapping": "npm:^0.3.12" + "@types/istanbul-lib-coverage": "npm:^2.0.1" + convert-source-map: "npm:^2.0.0" + checksum: 18dd8cebfb6790f27f4e41e7cff77c7ab1c8904085f354dd7875e2eb65f4261c4cf40939132502875779d92304bfea46b8336346ecb40b6f33c3a3979e6f5729 languageName: node linkType: hard @@ -9235,58 +9516,58 @@ __metadata: version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" dependencies: - spdx-correct: ^3.0.0 - spdx-expression-parse: ^3.0.0 - checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 86242519b2538bb8aeb12330edebb61b4eb37fd35ef65220ab0b03a26c0592c1c8a7300d32da3cde5abd08d18d95e8dabfad684b5116336f6de9e6f207eec224 languageName: node linkType: hard "validator@npm:^13.7.0": - version: 13.7.0 - resolution: "validator@npm:13.7.0" - checksum: 2b83283de1222ca549a7ef57f46e8d49c6669213348db78b7045bce36a3b5843ff1e9f709ebf74574e06223461ee1f264f8cc9a26a0060a79a27de079d8286ef + version: 13.11.0 + resolution: "validator@npm:13.11.0" + checksum: 4bf094641eb71729c06a42d669840e7189597ba655a8264adabac9bf03f95cd6fde5fbc894b0a13ee861bd4a852f56d2afdc9391aeaeb3fc0f9633a974140e12 languageName: node linkType: hard "vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" - checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b + checksum: 31389debef15a480849b8331b220782230b9815a8e0dbb7b9a8369559aed2e9a7800cd904d4371ea74f4c3527db456dc8e7ac5befce5f0d289014dbdf47b2242 languageName: node linkType: hard -"vscode-languageserver-textdocument@npm:^1.0.8": - version: 1.0.8 - resolution: "vscode-languageserver-textdocument@npm:1.0.8" - checksum: d6b685456ceca2736793d7fc1924d78a8483997c96c6ec4900d90e64115730da6c0c03e3fbc2c5d031a4592f2acd9cca2ca58a651b696c4f40b8690a48538c06 +"vscode-languageserver-textdocument@npm:^1.0.11": + version: 1.0.11 + resolution: "vscode-languageserver-textdocument@npm:1.0.11" + checksum: 6096d2a85570e819e01ff406de7c88c48211e6874c6fc71df92193aa8b5aadf40591e44f033d634a95d04975d7aad29049d3eccab617ca41c189ae325aadb913 languageName: node linkType: hard "vscode-oniguruma@npm:^1.7.0": version: 1.7.0 resolution: "vscode-oniguruma@npm:1.7.0" - checksum: 53519d91d90593e6fb080260892e87d447e9b200c4964d766772b5053f5699066539d92100f77f1302c91e8fc5d9c772fbe40fe4c90f3d411a96d5a9b1e63f42 + checksum: 7da9d21459f9788544b258a5fd1b9752df6edd8b406a19eea0209c6bf76507d5717277016799301c4da0d536095f9ca8c06afd1ab8f4001189090c804ca4814e languageName: node linkType: hard "vscode-textmate@npm:^8.0.0": version: 8.0.0 resolution: "vscode-textmate@npm:8.0.0" - checksum: 127780dfea89559d70b8326df6ec344cfd701312dd7f3f591a718693812b7852c30b6715e3cfc8b3200a4e2515b4c96f0843c0eacc0a3020969b5de262c2a4bb + checksum: 9fa7d66d6042cb090d116c2d8820d34c8870cfcbaed6e404da89f66b899970ed0ac47b59a2e30fc40a25af5414822bb3ea27974f714e9b91910d69c894be95f7 languageName: node linkType: hard -"vscode-uri@npm:^3.0.7": - version: 3.0.7 - resolution: "vscode-uri@npm:3.0.7" - checksum: c899a0334f9f6ba53021328e083f6307978c09b94407d7e5fe86fcd8fcb8f1da0cb344123a335e55769055007a46d51aff83f9ee1dfc0296ee54b78f34ef0e4f +"vscode-uri@npm:^3.0.8": + version: 3.0.8 + resolution: "vscode-uri@npm:3.0.8" + checksum: e882d6b679e0d053cbc042893c0951a135d899a192b62cd07f0a8924f11ae722067a8d6b1b5b147034becf57faf9fff9fb543b17b749fd0f17db1f54f783f07c languageName: node linkType: hard "walkdir@npm:^0.4.1": version: 0.4.1 resolution: "walkdir@npm:0.4.1" - checksum: 71045c21dc19aae3321f897b6e9e507cf8039202665c35a0b908eecccaf25636aab769b31cbd61ef8267237fe22fc316923a691ecc2d9d38840a15c59c0f2594 + checksum: 54cbe7afc5fb811a55748b0bfa077a9a4aa43f568eb5857db9785af9728e1ad8b1ecf6b9ce6f14b405c6124939a92522e36aaa0397f3f52a9a7a08496f2eebe1 languageName: node linkType: hard @@ -9294,15 +9575,15 @@ __metadata: version: 1.0.1 resolution: "wcwidth@npm:1.0.1" dependencies: - defaults: ^1.0.3 - checksum: 814e9d1ddcc9798f7377ffa448a5a3892232b9275ebb30a41b529607691c0491de47cba426e917a4d08ded3ee7e9ba2f3fe32e62ee3cd9c7d3bafb7754bd553c + defaults: "npm:^1.0.3" + checksum: 182ebac8ca0b96845fae6ef44afd4619df6987fe5cf552fdee8396d3daa1fb9b8ec5c6c69855acb7b3c1231571393bd1f0a4cdc4028d421575348f64bb0a8817 languageName: node linkType: hard "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" - checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c + checksum: b65b9f8d6854572a84a5c69615152b63371395f0c5dcd6729c45789052296df54314db2bc3e977df41705eacb8bc79c247cee139a63fa695192f95816ed528ad languageName: node linkType: hard @@ -9317,9 +9598,9 @@ __metadata: version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" dependencies: - tr46: ~0.0.3 - webidl-conversions: ^3.0.0 - checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: f95adbc1e80820828b45cc671d97da7cd5e4ef9deb426c31bcd5ab00dc7103042291613b3ef3caec0a2335ed09e0d5ed026c940755dbb6d404e2b27f940fdf07 languageName: node linkType: hard @@ -9327,26 +9608,25 @@ __metadata: version: 1.0.2 resolution: "which-boxed-primitive@npm:1.0.2" dependencies: - is-bigint: ^1.0.1 - is-boolean-object: ^1.1.0 - is-number-object: ^1.0.4 - is-string: ^1.0.5 - is-symbol: ^1.0.3 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + is-bigint: "npm:^1.0.1" + is-boolean-object: "npm:^1.1.0" + is-number-object: "npm:^1.0.4" + is-string: "npm:^1.0.5" + is-symbol: "npm:^1.0.3" + checksum: 9c7ca7855255f25ac47f4ce8b59c4cc33629e713fd7a165c9d77a2bb47bf3d9655a5664660c70337a3221cf96742f3589fae15a3a33639908d33e29aa2941efb languageName: node linkType: hard -"which-typed-array@npm:^1.1.9": - version: 1.1.9 - resolution: "which-typed-array@npm:1.1.9" +"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "which-typed-array@npm:1.1.13" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-tostringtag: ^1.0.0 - is-typed-array: ^1.1.10 - checksum: fe0178ca44c57699ca2c0e657b64eaa8d2db2372a4e2851184f568f98c478ae3dc3fdb5f7e46c384487046b0cf9e23241423242b277e03e8ba3dabc7c84c98ef + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.4" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.0" + checksum: 605e3e10b7118af904a0e79d0d50b95275102f06ec902734024989cd71354929f7acee50de43529d3baf5858e2e4eb32c75e6ebd226c888ad976d8140e4a3e71 languageName: node linkType: hard @@ -9354,55 +9634,77 @@ __metadata: version: 1.3.1 resolution: "which@npm:1.3.1" dependencies: - isexe: ^2.0.0 + isexe: "npm:^2.0.0" bin: which: ./bin/which - checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 + checksum: 549dcf1752f3ee7fbb64f5af2eead4b9a2f482108b7de3e85c781d6c26d8cf6a52d37cfbe0642a155fa6470483fe892661a859c03157f24c669cf115f3bbab5e languageName: node linkType: hard -"which@npm:^2.0.1, which@npm:^2.0.2": +"which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" dependencies: - isexe: ^2.0.0 + isexe: "npm:^2.0.0" bin: node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + checksum: 4782f8a1d6b8fc12c65e968fea49f59752bf6302dc43036c3bf87da718a80710f61a062516e9764c70008b487929a73546125570acea95c5b5dcc8ac3052c70f languageName: node linkType: hard -"wide-align@npm:^1.1.5": +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.2": version: 1.1.5 resolution: "wide-align@npm:1.1.5" dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + string-width: "npm:^1.0.2 || 2 || 3 || 4" + checksum: d5f8027b9a8255a493a94e4ec1b74a27bff6679d5ffe29316a3215e4712945c84ef73ca4045c7e20ae7d0c72f5f57f296e04a4928e773d4276a2f1222e4c2e99 languageName: node linkType: hard -"word-wrap@npm:^1.0.3, word-wrap@npm:^1.2.3, word-wrap@npm:~1.2.3": - version: 1.2.3 - resolution: "word-wrap@npm:1.2.3" - checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f +"word-wrap@npm:^1.0.3": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 1ec6f6089f205f83037be10d0c4b34c9183b0b63fca0834a5b3cee55dd321429d73d40bb44c8fc8471b5203d6e8f8275717f49a8ff4b2b0ab41d7e1b563e0854 languageName: node linkType: hard "wordwrap@npm:^1.0.0": version: 1.0.0 resolution: "wordwrap@npm:1.0.0" - checksum: 2a44b2788165d0a3de71fd517d4880a8e20ea3a82c080ce46e294f0b68b69a2e49cff5f99c600e275c698a90d12c5ea32aff06c311f0db2eb3f1201f3e7b2a04 + checksum: 497d40beb2bdb08e6d38754faa17ce20b0bf1306327f80cb777927edb23f461ee1f6bc659b3c3c93f26b08e1cf4b46acc5bae8fda1f0be3b5ab9a1a0211034cd languageName: node linkType: hard -"wrap-ansi@npm:^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: cebdaeca3a6880da410f75209e68cd05428580de5ad24535f22696d7d9cab134d1f8498599f344c3cf0fb37c1715807a183778d8c648d6cc0cb5ff2bb4236540 + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 7b1e4b35e9bb2312d2ee9ee7dc95b8cb5f8b4b5a89f7dde5543fe66c1e3715663094defa50d75454ac900bd210f702d575f15f3f17fa9ec0291806d2578d1ddf languageName: node linkType: hard @@ -9413,47 +9715,32 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^3.0.0": +"write-file-atomic@npm:^3.0.3": version: 3.0.3 resolution: "write-file-atomic@npm:3.0.3" dependencies: - imurmurhash: ^0.1.4 - is-typedarray: ^1.0.0 - signal-exit: ^3.0.2 - typedarray-to-buffer: ^3.1.5 - checksum: c55b24617cc61c3a4379f425fc62a386cc51916a9b9d993f39734d005a09d5a4bb748bc251f1304e7abd71d0a26d339996c275955f527a131b1dcded67878280 + imurmurhash: "npm:^0.1.4" + is-typedarray: "npm:^1.0.0" + signal-exit: "npm:^3.0.2" + typedarray-to-buffer: "npm:^3.1.5" + checksum: 0955ab94308b74d32bc252afe69d8b42ba4b8a28b8d79f399f3f405969f82623f981e35d13129a52aa2973450f342107c06d86047572637584e85a1c0c246bf3 languageName: node linkType: hard -"write-file-atomic@npm:^5.0.0": - version: 5.0.0 - resolution: "write-file-atomic@npm:5.0.0" +"write-file-atomic@npm:^5.0.1": + version: 5.0.1 + resolution: "write-file-atomic@npm:5.0.1" dependencies: - imurmurhash: ^0.1.4 - signal-exit: ^3.0.7 - checksum: 6ee16b195572386cb1c905f9d29808f77f4de2fd063d74a6f1ab6b566363832d8906a493b764ee715e57ab497271d5fc91642a913724960e8e845adf504a9837 - languageName: node - linkType: hard - -"ws@npm:8.11.0": - version: 8.11.0 - resolution: "ws@npm:8.11.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 316b33aba32f317cd217df66dbfc5b281a2f09ff36815de222bc859e3424d83766d9eb2bd4d667de658b6ab7be151f258318fb1da812416b30be13103e5b5c67 + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^4.0.1" + checksum: 648efddba54d478d0e4330ab6f239976df3b9752b123db5dc9405d9b5af768fa9d70ce60c52fdbe61d1200d24350bc4fbcbaf09288496c2be050de126bd95b7e languageName: node linkType: hard -"xdg-basedir@npm:^4.0.0": - version: 4.0.0 - resolution: "xdg-basedir@npm:4.0.0" - checksum: 0073d5b59a37224ed3a5ac0dd2ec1d36f09c49f0afd769008a6e9cd3cd666bd6317bd1c7ce2eab47e1de285a286bad11a9b038196413cd753b79770361855f3c +"xdg-basedir@npm:^5.0.1": + version: 5.1.0 + resolution: "xdg-basedir@npm:5.1.0" + checksum: b60e8a2c663ccb1dac77c2d913f3b96de48dafbfa083657171d3d50e10820b8a04bb4edfe9f00808c8c20e5f5355e1927bea9029f03136e29265cb98291e1fea languageName: node linkType: hard @@ -9467,28 +9754,35 @@ __metadata: "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8" - checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 + checksum: 5f1b5f95e3775de4514edbb142398a2c37849ccfaf04a015be5d75521e9629d3be29bd4432d23c57f37e5b61ade592fb0197022e9993f81a06a5afbdcda9346d languageName: node linkType: hard "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + checksum: 4cb02b42b8a93b5cf50caf5d8e9beb409400a8a4d85e83bb0685c1457e9ac0b7a00819e9f5991ac25ffabb56a78e2f017c1acc010b3a1babfe6de690ba531abd languageName: node linkType: hard -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3, yargs-parser@npm:^20.2.9": +"yaml@npm:^2.3.4": + version: 2.3.4 + resolution: "yaml@npm:2.3.4" + checksum: f8207ce43065a22268a2806ea6a0fa3974c6fde92b4b2fa0082357e487bc333e85dc518910007e7ac001b532c7c84bd3eccb6c7757e94182b564028b0008f44b + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" - checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 + checksum: 0188f430a0f496551d09df6719a9132a3469e47fe2747208b1dd0ab2bb0c512a95d0b081628bbca5400fb20dbf2fabe63d22badb346cecadffdd948b049f3fcc languageName: node linkType: hard "yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" - checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c + checksum: 9dc2c217ea3bf8d858041252d43e074f7166b53f3d010a8c711275e09cd3d62a002969a39858b92bbda2a6a63a585c7127014534a560b9c69ed2d923d113406e languageName: node linkType: hard @@ -9496,46 +9790,29 @@ __metadata: version: 16.2.0 resolution: "yargs@npm:16.2.0" dependencies: - cliui: ^7.0.2 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.0 - y18n: ^5.0.5 - yargs-parser: ^20.2.2 - checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 - languageName: node - linkType: hard - -"yargs@npm:^17.6.2": - version: 17.6.2 - resolution: "yargs@npm:17.6.2" - dependencies: - cliui: ^8.0.1 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.3 - y18n: ^5.0.5 - yargs-parser: ^21.1.1 - checksum: 47da1b0d854fa16d45a3ded57b716b013b2179022352a5f7467409da5a04a1eef5b3b3d97a2dfc13e8bbe5f2ffc0afe3bc6a4a72f8254e60f5a4bd7947138643 + cliui: "npm:^7.0.2" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^20.2.2" + checksum: 807fa21211d2117135d557f95fcd3c3d390530cda2eca0c840f1d95f0f40209dcfeb5ec18c785a1f3425896e623e3b2681e8bb7b6600060eda1c3f4804e7957e languageName: node linkType: hard -"yauzl@npm:^2.10.0": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" dependencies: - buffer-crc32: ~0.2.3 - fd-slicer: ~1.1.0 - checksum: 7f21fe0bbad6e2cb130044a5d1d0d5a0e5bf3d8d4f8c4e6ee12163ce798fee3de7388d22a7a0907f563ac5f9d40f8699a223d3d5c1718da90b0156da6904022b - languageName: node - linkType: hard - -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: abb3e37678d6e38ea85485ed86ebe0d1e3464c640d7d9069805ea0da12f69d5a32df8e5625e370f9c96dd1c2dc088ab2d0a4dd32af18222ef3c4224a19471576 languageName: node linkType: hard @@ -9546,26 +9823,19 @@ __metadata: languageName: node linkType: hard -"yocto-queue@npm:^1.0.0": - version: 1.0.0 - resolution: "yocto-queue@npm:1.0.0" - checksum: 2cac84540f65c64ccc1683c267edce396b26b1e931aa429660aefac8fbe0188167b7aee815a3c22fa59a28a58d898d1a2b1825048f834d8d629f4c2a5d443801 - languageName: node - linkType: hard - "z-schema@npm:~5.0.2": version: 5.0.5 resolution: "z-schema@npm:5.0.5" dependencies: - commander: ^9.4.1 - lodash.get: ^4.4.2 - lodash.isequal: ^4.5.0 - validator: ^13.7.0 + commander: "npm:^9.4.1" + lodash.get: "npm:^4.4.2" + lodash.isequal: "npm:^4.5.0" + validator: "npm:^13.7.0" dependenciesMeta: commander: optional: true bin: z-schema: bin/z-schema - checksum: 8a1d66817ae4384dc3f63311f0cccaadd95cc9640eaade5fd3fbf91aa80d6bb82fb95d9b9171fa82ac371a0155b32b7f5f77bbe84dabaca611b66f74c628f0b8 + checksum: 8ac2fa445f5a00e790d1f91a48aeff0ccfc340f84626771853e03f4d97cdc2f5f798cdb2e38418f7815ffc3aac3952c45caabcf077bf4f83fedf0cdef43b885b languageName: node linkType: hard