From 3768c0add8c9e0fa06143dfed38bba237b8cdd36 Mon Sep 17 00:00:00 2001 From: Bhoomiraj Date: Sun, 7 Jan 2024 16:40:53 +0530 Subject: [PATCH] new file: LandContract/application-typescript/package.json new file: LandContract/application-typescript/src/Admin.js new file: LandContract/application-typescript/src/app.ts new file: LandContract/application-typescript/src/registerEnrollUser.js new file: LandContract/application-typescript/src/utils/AppUtil.ts new file: LandContract/application-typescript/src/utils/CAUtil.ts new file: LandContract/application-typescript/tsconfig.json new file: LandContract/application-typescript/tslint.json new file: chaincode-typescript/Dockerfile new file: chaincode-typescript/dist/Contract/landAsset.d.ts new file: chaincode-typescript/dist/Contract/landAsset.js new file: chaincode-typescript/dist/Contract/landAsset.js.map new file: chaincode-typescript/dist/Contract/landTransaction.d.ts new file: chaincode-typescript/dist/Contract/landTransaction.js new file: chaincode-typescript/dist/Contract/landTransaction.js.map new file: chaincode-typescript/dist/asset.d.ts new file: chaincode-typescript/dist/asset.js new file: chaincode-typescript/dist/asset.js.map new file: chaincode-typescript/dist/assetTransfer.d.ts new file: chaincode-typescript/dist/assetTransfer.js new file: chaincode-typescript/dist/assetTransfer.js.map new file: chaincode-typescript/dist/index.d.ts new file: chaincode-typescript/dist/index.js new file: chaincode-typescript/dist/index.js.map new file: chaincode-typescript/docker/docker-entrypoint.sh new file: chaincode-typescript/npm-shrinkwrap.json new file: chaincode-typescript/package.json new file: chaincode-typescript/src/Contract/Admin.js new file: chaincode-typescript/src/Contract/landAsset.ts new file: chaincode-typescript/src/Contract/landTransaction.ts new file: chaincode-typescript/src/Contract/registerEnrollUser.js new file: chaincode-typescript/src/Contract/userRequest.ts new file: chaincode-typescript/src/Contract/wallet/admin.id new file: chaincode-typescript/src/Contract/wallet/user123.id new file: chaincode-typescript/src/asset.ts new file: chaincode-typescript/src/assetTransfer.ts new file: chaincode-typescript/src/index.ts new file: chaincode-typescript/tsconfig.json new file: chaincode-typescript/tslint.json modified: test-network/compose/compose-ca.yaml modified: test-network/compose/compose-test-net.yaml modified: test-network/compose/docker/docker-compose-bft-test-net.yaml modified: test-network/compose/docker/docker-compose-test-net.yaml modified: test-network/configtx/configtx.yaml modified: test-network/network.sh modified: test-network/organizations/ccp-generate.sh modified: test-network/organizations/cryptogen/crypto-config-org2.yaml new file: test-network/organizations/cryptogen/crypto-config-org3.yaml new file: test-network/organizations/cryptogen/crypto-config-org4.yaml modified: test-network/organizations/fabric-ca/registerEnroll.sh new file: test-network_org4.zip --- .../application-typescript/.gitignore | 15 + .../application-typescript/package.json | 51 + .../application-typescript/src/Admin.js | 47 + .../application-typescript/src/app.ts | 172 + .../src/registerEnrollUser.js | 41 + .../src/utils/AppUtil.ts | 76 + .../src/utils/CAUtil.ts | 119 + .../application-typescript/tsconfig.json | 15 + .../application-typescript/tslint.json | 23 + chaincode-typescript/Dockerfile | 36 + .../dist/Contract/landAsset.d.ts | 6 + .../dist/Contract/landAsset.js | 36 + .../dist/Contract/landAsset.js.map | 1 + .../dist/Contract/landTransaction.d.ts | 11 + .../dist/Contract/landTransaction.js | 171 + .../dist/Contract/landTransaction.js.map | 1 + chaincode-typescript/dist/asset.d.ts | 8 + chaincode-typescript/dist/asset.js | 47 + chaincode-typescript/dist/asset.js.map | 1 + chaincode-typescript/dist/assetTransfer.d.ts | 11 + chaincode-typescript/dist/assetTransfer.js | 219 + .../dist/assetTransfer.js.map | 1 + chaincode-typescript/dist/index.d.ts | 2 + chaincode-typescript/dist/index.js | 14 + chaincode-typescript/dist/index.js.map | 1 + .../docker/docker-entrypoint.sh | 16 + chaincode-typescript/npm-shrinkwrap.json | 4410 +++++++++++++++++ chaincode-typescript/package.json | 71 + chaincode-typescript/src/Contract/Admin.js | 47 + .../src/Contract/landAsset.ts | 16 + .../src/Contract/landTransaction.ts | 121 + .../src/Contract/registerEnrollUser.js | 41 + .../src/Contract/userRequest.ts | 13 + .../src/Contract/wallet/admin.id | 1 + .../src/Contract/wallet/user123.id | 1 + chaincode-typescript/src/asset.ts | 26 + chaincode-typescript/src/assetTransfer.ts | 173 + chaincode-typescript/src/index.ts | 15 + chaincode-typescript/tsconfig.json | 19 + chaincode-typescript/tslint.json | 23 + test-network/compose/compose-ca.yaml | 38 +- test-network/compose/compose-test-net.yaml | 77 +- .../docker/docker-compose-bft-test-net.yaml | 4 +- .../docker/docker-compose-test-net.yaml | 30 +- test-network/configtx/configtx.yaml | 9 + test-network/network.sh | 44 +- test-network/organizations/ccp-generate.sh | 34 +- .../cryptogen/crypto-config-org2.yaml | 4 +- .../cryptogen/crypto-config-org3.yaml | 61 + .../cryptogen/crypto-config-org4.yaml | 61 + .../organizations/fabric-ca/registerEnroll.sh | 15 + test-network_org4.zip | Bin 0 -> 500887 bytes 52 files changed, 6412 insertions(+), 83 deletions(-) create mode 100644 LandContract/application-typescript/.gitignore create mode 100644 LandContract/application-typescript/package.json create mode 100644 LandContract/application-typescript/src/Admin.js create mode 100644 LandContract/application-typescript/src/app.ts create mode 100644 LandContract/application-typescript/src/registerEnrollUser.js create mode 100644 LandContract/application-typescript/src/utils/AppUtil.ts create mode 100644 LandContract/application-typescript/src/utils/CAUtil.ts create mode 100644 LandContract/application-typescript/tsconfig.json create mode 100644 LandContract/application-typescript/tslint.json create mode 100644 chaincode-typescript/Dockerfile create mode 100644 chaincode-typescript/dist/Contract/landAsset.d.ts create mode 100644 chaincode-typescript/dist/Contract/landAsset.js create mode 100644 chaincode-typescript/dist/Contract/landAsset.js.map create mode 100644 chaincode-typescript/dist/Contract/landTransaction.d.ts create mode 100644 chaincode-typescript/dist/Contract/landTransaction.js create mode 100644 chaincode-typescript/dist/Contract/landTransaction.js.map create mode 100644 chaincode-typescript/dist/asset.d.ts create mode 100644 chaincode-typescript/dist/asset.js create mode 100644 chaincode-typescript/dist/asset.js.map create mode 100644 chaincode-typescript/dist/assetTransfer.d.ts create mode 100644 chaincode-typescript/dist/assetTransfer.js create mode 100644 chaincode-typescript/dist/assetTransfer.js.map create mode 100644 chaincode-typescript/dist/index.d.ts create mode 100644 chaincode-typescript/dist/index.js create mode 100644 chaincode-typescript/dist/index.js.map create mode 100755 chaincode-typescript/docker/docker-entrypoint.sh create mode 100644 chaincode-typescript/npm-shrinkwrap.json create mode 100644 chaincode-typescript/package.json create mode 100644 chaincode-typescript/src/Contract/Admin.js create mode 100644 chaincode-typescript/src/Contract/landAsset.ts create mode 100644 chaincode-typescript/src/Contract/landTransaction.ts create mode 100644 chaincode-typescript/src/Contract/registerEnrollUser.js create mode 100644 chaincode-typescript/src/Contract/userRequest.ts create mode 100644 chaincode-typescript/src/Contract/wallet/admin.id create mode 100644 chaincode-typescript/src/Contract/wallet/user123.id create mode 100644 chaincode-typescript/src/asset.ts create mode 100644 chaincode-typescript/src/assetTransfer.ts create mode 100644 chaincode-typescript/src/index.ts create mode 100644 chaincode-typescript/tsconfig.json create mode 100644 chaincode-typescript/tslint.json create mode 100755 test-network/organizations/cryptogen/crypto-config-org3.yaml create mode 100755 test-network/organizations/cryptogen/crypto-config-org4.yaml create mode 100644 test-network_org4.zip diff --git a/LandContract/application-typescript/.gitignore b/LandContract/application-typescript/.gitignore new file mode 100644 index 00000000..48285d12 --- /dev/null +++ b/LandContract/application-typescript/.gitignore @@ -0,0 +1,15 @@ +# +# SPDX-License-Identifier: Apache-2.0 +# + + +# Coverage directory used by tools like istanbul +coverage + +# Dependency directories +node_modules/ +jspm_packages/ + +# Compiled TypeScript files +dist + diff --git a/LandContract/application-typescript/package.json b/LandContract/application-typescript/package.json new file mode 100644 index 00000000..ca8f7b38 --- /dev/null +++ b/LandContract/application-typescript/package.json @@ -0,0 +1,51 @@ +{ + "name": "asset-transfer-basic", + "version": "1.0.0", + "description": "Asset Transfer Basic contract implemented in TypeScript", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "engines": { + "node": ">=14.14" + }, + "scripts": { + "lint": "tslint -c tslint.json 'src/**/*.ts'", + "pretest": "npm run lint", + "start": "npm run build && node dist/app.js", + "build": "tsc", + "build:watch": "tsc -w", + "prepublishOnly": "npm run build" + }, + "engineStrict": true, + "author": "Hyperledger", + "license": "Apache-2.0", + "dependencies": { + "fabric-ca-client": "^2.2.19", + "fabric-network": "^2.2.19" + }, + "devDependencies": { + "@tsconfig/node14": "^14.1.0", + "@types/node": "^14.17.32", + "tslint": "^5.11.0", + "typescript": "~4.9.4" + }, + "nyc": { + "extension": [ + ".ts", + ".tsx" + ], + "exclude": [ + "coverage/**", + "dist/**" + ], + "reporter": [ + "text-summary", + "html" + ], + "all": true, + "check-coverage": true, + "statements": 100, + "branches": 100, + "functions": 100, + "lines": 100 + } +} diff --git a/LandContract/application-typescript/src/Admin.js b/LandContract/application-typescript/src/Admin.js new file mode 100644 index 00000000..c1a7ac6b --- /dev/null +++ b/LandContract/application-typescript/src/Admin.js @@ -0,0 +1,47 @@ +const { Wallets } = require('fabric-network'); +const FabricCAServices = require('fabric-ca-client'); +const path = require('path'); +const { buildCAClient, enrollAdmin, ClearWallet } = require('./utils/CAUtil.ts'); +const { buildCCPOrg1, buildWallet } = require('./utils/AppUtil.ts'); + +const mspOrg1 = 'Org1MSP'; + +async function enrollAdmmin() { + console.log('\n--> Enrolling the Org1 CA admin'); + const ccpOrg1 = buildCCPOrg1(); + const caOrg1Client = buildCAClient(FabricCAServices, ccpOrg1, 'ca.org1.example.com'); + + const walletPathOrg1 = path.join(__dirname, 'wallet'); + const walletOrg1 = await buildWallet(Wallets, walletPathOrg1); + + await enrollAdmin(caOrg1Client, walletOrg1, mspOrg1); +} + +async function clearWallet(){ + const walletPath = path.join(__dirname, 'wallet'); + const wallet = await buildWallet(Wallets, walletPath); + + await ClearWallet(wallet); +} + +async function main() { + cmd = "create"; + if (!(process.argv[2] === undefined)) { + cmd = process.argv[2]; + } + + try { + if(cmd=="clear"){ + await clearWallet(); + }else if(cmd=="create"){ + await enrollAdmmin(); + }else{ + throw Error(cmd + " is not defined. (create / clean)") + } + } catch (error) { + console.error(`Error in admin: ${error}`); + process.exit(1); + } +} + +main(); \ No newline at end of file diff --git a/LandContract/application-typescript/src/app.ts b/LandContract/application-typescript/src/app.ts new file mode 100644 index 00000000..08758e06 --- /dev/null +++ b/LandContract/application-typescript/src/app.ts @@ -0,0 +1,172 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ +import { Gateway, GatewayOptions } from 'fabric-network'; +import * as path from 'path'; +import { buildCCPOrg1, buildWallet, prettyJSONString } from './utils//AppUtil'; +import { buildCAClient, enrollAdmin, registerAndEnrollUser } from './utils/CAUtil'; + +const channelName = process.env.CHANNEL_NAME || 'mychannel'; +const chaincodeName = process.env.CHAINCODE_NAME || 'basic'; + +const mspOrg1 = 'Org1MSP'; +const walletPath = path.join(__dirname, 'wallet'); +const org1UserId = 'typescriptAppUser'; + +// pre-requisites: +// - fabric-sample two organization test-network setup with two peers, ordering service, +// and 2 certificate authorities +// ===> from directory /fabric-samples/test-network +// ./network.sh up createChannel -ca +// - Use any of the asset-transfer-basic chaincodes deployed on the channel "mychannel" +// with the chaincode name of "basic". The following deploy command will package, +// install, approve, and commit the javascript chaincode, all the actions it takes +// to deploy a chaincode to a channel. +// ===> from directory /fabric-samples/test-network +// ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-typescript/ -ccl javascript +// - Be sure that node.js is installed +// ===> from directory /fabric-samples/asset-transfer-basic/application-typescript +// node -v +// - npm installed code dependencies +// ===> from directory /fabric-samples/asset-transfer-basic/application-typescript +// npm install +// - to run this test application +// ===> from directory /fabric-samples/asset-transfer-basic/application-typescript +// npm start + +// NOTE: If you see kind an error like these: +/* + 2020-08-07T20:23:17.590Z - error: [DiscoveryService]: send[mychannel] - Channel:mychannel received discovery error:access denied + ******** FAILED to run the application: Error: DiscoveryService: mychannel error: access denied + + OR + + Failed to register user : Error: fabric-ca request register failed with errors [[ { code: 20, message: 'Authentication failure' } ]] + ******** FAILED to run the application: Error: Identity not found in wallet: appUser +*/ +// Delete the /fabric-samples/asset-transfer-basic/application-typescript/wallet directory +// and retry this application. + +// The certificate authority must have been restarted and the saved certificates for the +// admin and application user are not valid. Deleting the wallet store will force these to be reset +// with the new certificate authority. + +/** + * A test application to show basic queries operations with any of the asset-transfer-basic chaincodes + * -- How to submit a transaction + * -- How to query and check the results + * + * To see the SDK workings, try setting the logging to show on the console before running + * export HFC_LOGGING='{"debug":"console"}' + */ +async function main() { + try { + // build an in memory object with the network configuration (also known as a connection profile) + const ccp = buildCCPOrg1(); + + // build an instance of the fabric ca services client based on + // the information in the network configuration + const caClient = buildCAClient(ccp, 'ca.org1.example.com'); + + // setup the wallet to hold the credentials of the application user + const wallet = await buildWallet(walletPath); + + // in a real application this would be done on an administrative flow, and only once + await enrollAdmin(caClient, wallet, mspOrg1); + + // in a real application this would be done only when a new user was required to be added + // and would be part of an administrative flow + await registerAndEnrollUser(caClient, wallet, mspOrg1, org1UserId, 'org1.department1'); + + // Create a new gateway instance for interacting with the fabric network. + // In a real application this would be done as the backend server session is setup for + // a user that has been verified. + const gateway = new Gateway(); + + const gatewayOpts: GatewayOptions = { + wallet, + identity: org1UserId, + discovery: { enabled: true, asLocalhost: true }, // using asLocalhost as this gateway is using a fabric network deployed locally + }; + + try { + // setup the gateway instance + // The user will now be able to create connections to the fabric network and be able to + // submit transactions and query. All transactions submitted by this gateway will be + // signed by this user using the credentials stored in the wallet. + await gateway.connect(ccp, gatewayOpts); + + // Build a network instance based on the channel where the smart contract is deployed + const network = await gateway.getNetwork(channelName); + + // Get the contract from the network. + const contract = network.getContract(chaincodeName); + + // Initialize a set of asset data on the channel using the chaincode 'InitLedger' function. + // This type of transaction would only be run once by an application the first time it was started after it + // deployed the first time. Any updates to the chaincode deployed later would likely not need to run + // an "init" type function. + console.log('\n--> Submit Transaction: InitLedger, function creates the initial set of assets on the ledger'); + await contract.submitTransaction('InitLedger'); + console.log('*** Result: committed'); + + // Let's try a query type operation (function). + // This will be sent to just one peer and the results will be shown. + console.log('\n--> Evaluate Transaction: GetAllAssets, function returns all the current assets on the ledger'); + let result = await contract.evaluateTransaction('GetAllAssets'); + console.log(`*** Result: ${prettyJSONString(result.toString())}`); + + // Now let's try to submit a transaction. + // This will be sent to both peers and if both peers endorse the transaction, the endorsed proposal will be sent + // to the orderer to be committed by each of the peer's to the channel ledger. + console.log('\n--> Submit Transaction: CreateAsset, creates new asset with ID, color, owner, size, and appraisedValue arguments'); + await contract.submitTransaction('CreateAsset', 'asset413', 'yellow', '5', 'Tom', '1300'); + console.log('*** Result: committed'); + + console.log('\n--> Evaluate Transaction: ReadAsset, function returns an asset with a given assetID'); + result = await contract.evaluateTransaction('ReadAsset', 'asset413'); + console.log(`*** Result: ${prettyJSONString(result.toString())}`); + + console.log('\n--> Evaluate Transaction: AssetExists, function returns "true" if an asset with given assetID exist'); + result = await contract.evaluateTransaction('AssetExists', 'asset1'); + console.log(`*** Result: ${prettyJSONString(result.toString())}`); + + console.log('\n--> Submit Transaction: UpdateAsset asset1, change the appraisedValue to 350'); + await contract.submitTransaction('UpdateAsset', 'asset1', 'blue', '5', 'Tomoko', '350'); + console.log('*** Result: committed'); + + console.log('\n--> Evaluate Transaction: ReadAsset, function returns "asset1" attributes'); + result = await contract.evaluateTransaction('ReadAsset', 'asset1'); + console.log(`*** Result: ${prettyJSONString(result.toString())}`); + + try { + // How about we try a transactions where the executing chaincode throws an error + // Notice how the submitTransaction will throw an error containing the error thrown by the chaincode + console.log('\n--> Submit Transaction: UpdateAsset asset70, asset70 does not exist and should return an error'); + await contract.submitTransaction('UpdateAsset', 'asset70', 'blue', '5', 'Tomoko', '300'); + console.log('******** FAILED to return an error'); + } catch (error) { + console.log(`*** Successfully caught the error: \n ${error}`); + } + + console.log('\n--> Submit Transaction: TransferAsset asset1, transfer to new owner of Tom'); + await contract.submitTransaction('TransferAsset', 'asset1', 'Tom'); + console.log('*** Result: committed'); + + console.log('\n--> Evaluate Transaction: ReadAsset, function returns "asset1" attributes'); + result = await contract.evaluateTransaction('ReadAsset', 'asset1'); + console.log(`*** Result: ${prettyJSONString(result.toString())}`); + } finally { + // Disconnect from the gateway when the application is closing + // This will close all connections to the network + gateway.disconnect(); + } + } catch (error) { + console.error(`******** FAILED to run the application: ${error}`); + process.exit(1); + } +} + +main(); diff --git a/LandContract/application-typescript/src/registerEnrollUser.js b/LandContract/application-typescript/src/registerEnrollUser.js new file mode 100644 index 00000000..12fa7272 --- /dev/null +++ b/LandContract/application-typescript/src/registerEnrollUser.js @@ -0,0 +1,41 @@ +const { Wallets } = require('fabric-network'); +const FabricCAServices = require('fabric-ca-client'); +const path = require('path'); +const { buildCAClient, registerAndEnrollUser} = require('../../../test-application/javascript/CAUtil.js'); +const { buildCCPOrg1, buildWallet } = require('../../../test-application/javascript/AppUtil.js'); + +const mspOrg1 = 'Org1MSP'; + + +async function connectToOrg1CA(UserID) { + console.log('\n--> Register and enrolling new user'); + const ccpOrg1 = buildCCPOrg1(); + const caOrg1Client = buildCAClient(FabricCAServices, ccpOrg1, 'ca.org1.example.com'); + + const walletPathOrg1 = path.join(__dirname, 'wallet'); + const walletOrg1 = await buildWallet(Wallets, walletPathOrg1); + + await registerAndEnrollUser(caOrg1Client, walletOrg1, mspOrg1, UserID, 'org1.department1'); + +} + +async function main() { + + if (process.argv[2] === undefined ) { + console.log('Usage: node registerEnrollUser.js userID'); + process.exit(1); + } + + const userId = process.argv[2]; + + try { + + await connectToOrg1CA(userId); + + } catch (error) { + console.error(`Error in enrolling admin: ${error}`); + process.exit(1); + } +} + +main(); diff --git a/LandContract/application-typescript/src/utils/AppUtil.ts b/LandContract/application-typescript/src/utils/AppUtil.ts new file mode 100644 index 00000000..d72ec0f9 --- /dev/null +++ b/LandContract/application-typescript/src/utils/AppUtil.ts @@ -0,0 +1,76 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { Wallet, Wallets } from 'fabric-network'; +import * as fs from 'fs'; +import * as path from 'path'; + +const buildCCPOrg1 = (): Record => { + // load the common connection configuration file + const ccpPath = path.resolve(__dirname, '..', '..', '..', '..', 'test-network', + 'organizations', 'peerOrganizations', 'org1.example.com', 'connection-org1.json'); + const fileExists = fs.existsSync(ccpPath); + if (!fileExists) { + throw new Error(`no such file or directory: ${ccpPath}`); + } + const contents = fs.readFileSync(ccpPath, 'utf8'); + + // build a JSON object from the file contents + const ccp = JSON.parse(contents); + + console.log(`Loaded the network configuration located at ${ccpPath}`); + return ccp; +}; + +const buildCCPOrg2 = (): Record => { + // load the common connection configuration file + const ccpPath = path.resolve(__dirname, '..', '..', '..', '..', 'test-network', + 'organizations', 'peerOrganizations', 'org2.example.com', 'connection-org2.json'); + const fileExists = fs.existsSync(ccpPath); + if (!fileExists) { + throw new Error(`no such file or directory: ${ccpPath}`); + } + const contents = fs.readFileSync(ccpPath, 'utf8'); + + // build a JSON object from the file contents + const ccp = JSON.parse(contents); + + console.log(`Loaded the network configuration located at ${ccpPath}`); + return ccp; +}; + +const buildWallet = async (walletPath: string): Promise => { + // Create a new wallet : Note that wallet is for managing identities. + let wallet: Wallet; + if (walletPath) { + + // remove any pre-existing wallet from prior runs + fs.rmSync(walletPath, { recursive: true, force: true }); + + wallet = await Wallets.newFileSystemWallet(walletPath); + console.log(`Built a file system wallet at ${walletPath}`); + } else { + wallet = await Wallets.newInMemoryWallet(); + console.log('Built an in memory wallet'); + } + + return wallet; +}; + +const prettyJSONString = (inputString: string): string => { + if (inputString) { + return JSON.stringify(JSON.parse(inputString), null, 2); + } else { + return inputString; + } +}; + +export { + buildCCPOrg1, + buildCCPOrg2, + buildWallet, + prettyJSONString, +}; diff --git a/LandContract/application-typescript/src/utils/CAUtil.ts b/LandContract/application-typescript/src/utils/CAUtil.ts new file mode 100644 index 00000000..783ffc76 --- /dev/null +++ b/LandContract/application-typescript/src/utils/CAUtil.ts @@ -0,0 +1,119 @@ +/* + * Copyright IBM Corp. All Rights Reserved. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import FabricCAServices from 'fabric-ca-client'; +import { Wallet } from 'fabric-network'; + +const adminUserId = 'admin'; +const adminUserPasswd = 'adminpw'; + +/** + * + * @param {*} ccp + */ +const buildCAClient = (ccp: Record, caHostName: string): FabricCAServices => { + // Create a new CA client for interacting with the CA. + const caInfo = ccp.certificateAuthorities[caHostName]; // lookup CA details from config + const caTLSCACerts = caInfo.tlsCACerts.pem; + const caClient = new FabricCAServices(caInfo.url, { trustedRoots: caTLSCACerts, verify: false }, caInfo.caName); + + console.log(`Built a CA Client named ${caInfo.caName}`); + return caClient; +}; + +const enrollAdmin = async (caClient: FabricCAServices, wallet: Wallet, orgMspId: string): Promise => { + try { + // Check to see if we've already enrolled the admin user. + const identity = await wallet.get(adminUserId); + if (identity) { + console.log('An identity for the admin user already exists in the wallet'); + return; + } + + // Enroll the admin user, and import the new identity into the wallet. + const enrollment = await caClient.enroll({ enrollmentID: adminUserId, enrollmentSecret: adminUserPasswd }); + const x509Identity = { + credentials: { + certificate: enrollment.certificate, + privateKey: enrollment.key.toBytes(), + }, + mspId: orgMspId, + type: 'X.509', + }; + await wallet.put(adminUserId, x509Identity); + console.log('Successfully enrolled admin user and imported it into the wallet'); + } catch (error) { + console.error(`Failed to enroll admin user : ${error}`); + } +}; + +const registerAndEnrollUser = async (caClient: FabricCAServices, wallet: Wallet, orgMspId: string, userId: string, affiliation: string): Promise => { + try { + // Check to see if we've already enrolled the user + const userIdentity = await wallet.get(userId); + if (userIdentity) { + console.log(`An identity for the user ${userId} already exists in the wallet`); + return; + } + + // Must use an admin to register a new user + const adminIdentity = await wallet.get(adminUserId); + if (!adminIdentity) { + console.log('An identity for the admin user does not exist in the wallet'); + console.log('Enroll the admin user before retrying'); + return; + } + + // build a user object for authenticating with the CA + const provider = wallet.getProviderRegistry().getProvider(adminIdentity.type); + const adminUser = await provider.getUserContext(adminIdentity, adminUserId); + + // Register the user, enroll the user, and import the new identity into the wallet. + // if affiliation is specified by client, the affiliation value must be configured in CA + const secret = await caClient.register({ + affiliation, + enrollmentID: userId, + role: 'client', + }, adminUser); + const enrollment = await caClient.enroll({ + enrollmentID: userId, + enrollmentSecret: secret, + }); + const x509Identity = { + credentials: { + certificate: enrollment.certificate, + privateKey: enrollment.key.toBytes(), + }, + mspId: orgMspId, + type: 'X.509', + }; + await wallet.put(userId, x509Identity); + console.log(`Successfully registered and enrolled user ${userId} and imported it into the wallet`); + } catch (error) { + console.error(`Failed to register user : ${error}`); + } +}; + +const ClearWallet = async (wallet:Wallet) => { + try{ + const list = await wallet.list(); + console.log(list) + for(const item in list){ + await wallet.remove(list[item]); + } + + console.log(`cleared the wallet`); + } catch (error) { + console.error(`Failed to clear : ${error}`); + } +}; + +export { + buildCAClient, + enrollAdmin, + registerAndEnrollUser, + ClearWallet, +}; \ No newline at end of file diff --git a/LandContract/application-typescript/tsconfig.json b/LandContract/application-typescript/tsconfig.json new file mode 100644 index 00000000..ba53c819 --- /dev/null +++ b/LandContract/application-typescript/tsconfig.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@tsconfig/node14/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "declaration": true, + "sourceMap": true, + }, + "include": [ + "./src/**/*" + ], + "exclude": [ + "./src/**/*.spec.ts" + ] +} diff --git a/LandContract/application-typescript/tslint.json b/LandContract/application-typescript/tslint.json new file mode 100644 index 00000000..a52c3ee2 --- /dev/null +++ b/LandContract/application-typescript/tslint.json @@ -0,0 +1,23 @@ +{ + "defaultSeverity": "error", + "extends": [ + "tslint:recommended" + ], + "jsRules": {}, + "rules": { + "indent": [true, "spaces", 4], + "linebreak-style": [true, "LF"], + "quotemark": [true, "single"], + "semicolon": [true, "always"], + "no-console": false, + "curly": true, + "triple-equals": true, + "no-string-throw": true, + "no-var-keyword": true, + "no-trailing-whitespace": true, + "object-literal-key-quotes": [true, "as-needed"], + "object-literal-sort-keys": false, + "max-line-length": false + }, + "rulesDirectory": [] +} diff --git a/chaincode-typescript/Dockerfile b/chaincode-typescript/Dockerfile new file mode 100644 index 00000000..74623698 --- /dev/null +++ b/chaincode-typescript/Dockerfile @@ -0,0 +1,36 @@ +# +# SPDX-License-Identifier: Apache-2.0 +# +FROM node:16 AS builder + +WORKDIR /usr/src/app + +# Copy node.js source and build, changing owner as well +COPY --chown=node:node . /usr/src/app +ENV npm_config_cache=/usr/src/app +RUN npm ci && npm run package + + +FROM node:16 AS production +ARG CC_SERVER_PORT + +# Setup tini to work better handle signals +ENV TINI_VERSION v0.19.0 +ENV PLATFORM=amd64 +ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${PLATFORM} /tini +RUN chmod +x /tini + +WORKDIR /usr/src/app +COPY --chown=node:node --from=builder /usr/src/app/dist ./dist +COPY --chown=node:node --from=builder /usr/src/app/package.json ./ +COPY --chown=node:node --from=builder /usr/src/app/npm-shrinkwrap.json ./ +COPY --chown=node:node docker/docker-entrypoint.sh /usr/src/app/docker-entrypoint.sh + +RUN npm ci --omit=dev && npm cache clean --force + +ENV PORT $CC_SERVER_PORT +EXPOSE $CC_SERVER_PORT +ENV NODE_ENV=production + +USER node +ENTRYPOINT [ "/tini", "--", "/usr/src/app/docker-entrypoint.sh" ] diff --git a/chaincode-typescript/dist/Contract/landAsset.d.ts b/chaincode-typescript/dist/Contract/landAsset.d.ts new file mode 100644 index 00000000..542f5f21 --- /dev/null +++ b/chaincode-typescript/dist/Contract/landAsset.d.ts @@ -0,0 +1,6 @@ +export declare class Asset { + ID: string; + Size: number; + Owner: string; + TimeStamp: number; +} diff --git a/chaincode-typescript/dist/Contract/landAsset.js b/chaincode-typescript/dist/Contract/landAsset.js new file mode 100644 index 00000000..5dffd381 --- /dev/null +++ b/chaincode-typescript/dist/Contract/landAsset.js @@ -0,0 +1,36 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Asset = void 0; +const fabric_contract_api_1 = require("fabric-contract-api"); +let Asset = class Asset { +}; +__decorate([ + (0, fabric_contract_api_1.Property)(), + __metadata("design:type", String) +], Asset.prototype, "ID", void 0); +__decorate([ + (0, fabric_contract_api_1.Property)(), + __metadata("design:type", Number) +], Asset.prototype, "Size", void 0); +__decorate([ + (0, fabric_contract_api_1.Property)(), + __metadata("design:type", String) +], Asset.prototype, "Owner", void 0); +__decorate([ + (0, fabric_contract_api_1.Property)(), + __metadata("design:type", Number) +], Asset.prototype, "TimeStamp", void 0); +Asset = __decorate([ + (0, fabric_contract_api_1.Object)() +], Asset); +exports.Asset = Asset; +//# sourceMappingURL=landAsset.js.map \ No newline at end of file diff --git a/chaincode-typescript/dist/Contract/landAsset.js.map b/chaincode-typescript/dist/Contract/landAsset.js.map new file mode 100644 index 00000000..30a8fb5e --- /dev/null +++ b/chaincode-typescript/dist/Contract/landAsset.js.map @@ -0,0 +1 @@ +{"version":3,"file":"landAsset.js","sourceRoot":"","sources":["../../src/Contract/landAsset.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6DAAqD;AAG9C,IAAM,KAAK,GAAX,MAAM,KAAK;CAYjB,CAAA;AAXG;IAAC,IAAA,8BAAQ,GAAE;;iCACO;AAElB;IAAC,IAAA,8BAAQ,GAAE;;mCACS;AAEpB;IAAC,IAAA,8BAAQ,GAAE;;oCACU;AAErB;IAAC,IAAA,8BAAQ,GAAE;;wCACc;AAXhB,KAAK;IADjB,IAAA,4BAAM,GAAE;GACI,KAAK,CAYjB;AAZY,sBAAK"} \ No newline at end of file diff --git a/chaincode-typescript/dist/Contract/landTransaction.d.ts b/chaincode-typescript/dist/Contract/landTransaction.d.ts new file mode 100644 index 00000000..3c527b19 --- /dev/null +++ b/chaincode-typescript/dist/Contract/landTransaction.d.ts @@ -0,0 +1,11 @@ +import { Context, Contract } from 'fabric-contract-api'; +export declare class LandTransferContract extends Contract { + InitLedger(ctx: Context): Promise; + private CreateAsset; + private DeleteAsset; + TransferAsset(ctx: Context, id: string, newOwner: string): Promise; + SplitAsset(ctx: Context, id: string, newOwner: string, transfer: string): Promise; + ReadAsset(ctx: Context, id: string): Promise; + AssetExists(ctx: Context, id: string): Promise; + GetAllAssets(ctx: Context): Promise; +} diff --git a/chaincode-typescript/dist/Contract/landTransaction.js b/chaincode-typescript/dist/Contract/landTransaction.js new file mode 100644 index 00000000..c8d2d531 --- /dev/null +++ b/chaincode-typescript/dist/Contract/landTransaction.js @@ -0,0 +1,171 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LandTransferContract = void 0; +const fabric_contract_api_1 = require("fabric-contract-api"); +const json_stringify_deterministic_1 = __importDefault(require("json-stringify-deterministic")); +const sort_keys_recursive_1 = __importDefault(require("sort-keys-recursive")); +22224; +let LandTransferContract = class LandTransferContract extends fabric_contract_api_1.Contract { + async InitLedger(ctx) { + const assets = [ + { + ID: "0", + Size: 10000, + Owner: "Government", + TimeStamp: Date.now() + } + ]; + for (const asset of assets) { + await ctx.stub.putState(asset.ID, Buffer.from((0, json_stringify_deterministic_1.default)((0, sort_keys_recursive_1.default)(asset)))); + console.info(`Asset ${asset.ID} initialized`); + } + } + async CreateAsset(ctx, id, size, owner) { + const exists = await this.AssetExists(ctx, id); + if (exists) { + throw new Error(`The asset ${id} already exists`); + } + const asset = { + ID: id, + Size: size, + Owner: owner, + TimeStamp: Date.now() + }; + await ctx.stub.putState(id, Buffer.from((0, json_stringify_deterministic_1.default)((0, sort_keys_recursive_1.default)(asset)))); + } + async DeleteAsset(ctx, id) { + const exists = await this.AssetExists(ctx, id); + if (!exists) { + throw new Error(`The asset ${id} does not exist`); + } + return ctx.stub.deleteState(id); + } + async TransferAsset(ctx, id, newOwner) { + const assetString = await this.ReadAsset(ctx, id); + const asset = JSON.parse(assetString); + const oldOwner = asset.Owner; + asset.Owner = newOwner; + // we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive' + await ctx.stub.putState(id, Buffer.from((0, json_stringify_deterministic_1.default)((0, sort_keys_recursive_1.default)(asset)))); + return oldOwner; + } + async SplitAsset(ctx, id, newOwner, transfer) { + const transferSize = parseInt(transfer); + const assetString = await this.ReadAsset(ctx, id); + const asset = JSON.parse(assetString); + if (asset.Size < transferSize) { + throw new Error(`Cannot transfer more than the user owns`); + } + const oldOwner = asset.Owner; + try { + await this.DeleteAsset(ctx, id); + } + catch (error) { + throw error; + } + if (asset.Size > transferSize) + await this.CreateAsset(ctx, id + "0", asset.Size - transferSize, oldOwner); + await this.CreateAsset(ctx, id + "1", transferSize, newOwner); + // we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive' + // await ctx.stub.putState(id, Buffer.from(stringify(sortKeysRecursive(asset)))); + return oldOwner; + } + async ReadAsset(ctx, id) { + const assetJSON = await ctx.stub.getState(id); // get the asset from chaincode state + if (!assetJSON || assetJSON.length === 0) { + throw new Error(`The asset ${id} does not exist`); + } + return assetJSON.toString(); + } + async AssetExists(ctx, id) { + const assetJSON = await ctx.stub.getState(id); + return assetJSON && assetJSON.length > 0; + } + async GetAllAssets(ctx) { + const allResults = []; + // range query with empty string for startKey and endKey does an open-ended query of all assets in the chaincode namespace. + const iterator = await ctx.stub.getStateByRange('', ''); + let result = await iterator.next(); + while (!result.done) { + const strValue = Buffer.from(result.value.value.toString()).toString('utf8'); + let record; + try { + record = JSON.parse(strValue); + } + catch (err) { + console.log(err); + record = strValue; + } + allResults.push(record); + result = await iterator.next(); + } + return JSON.stringify(allResults); + } +}; +__decorate([ + (0, fabric_contract_api_1.Transaction)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context]), + __metadata("design:returntype", Promise) +], LandTransferContract.prototype, "InitLedger", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, Number, String]), + __metadata("design:returntype", Promise) +], LandTransferContract.prototype, "CreateAsset", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), + __metadata("design:returntype", Promise) +], LandTransferContract.prototype, "DeleteAsset", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String]), + __metadata("design:returntype", Promise) +], LandTransferContract.prototype, "TransferAsset", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String, String]), + __metadata("design:returntype", Promise) +], LandTransferContract.prototype, "SplitAsset", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(false), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), + __metadata("design:returntype", Promise) +], LandTransferContract.prototype, "ReadAsset", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(false), + (0, fabric_contract_api_1.Returns)('boolean'), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), + __metadata("design:returntype", Promise) +], LandTransferContract.prototype, "AssetExists", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(false), + (0, fabric_contract_api_1.Returns)('string'), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context]), + __metadata("design:returntype", Promise) +], LandTransferContract.prototype, "GetAllAssets", null); +LandTransferContract = __decorate([ + (0, fabric_contract_api_1.Info)({ title: 'LandTransfer', description: 'Smart contract for trading land assets' }) +], LandTransferContract); +exports.LandTransferContract = LandTransferContract; +//# sourceMappingURL=landTransaction.js.map \ No newline at end of file diff --git a/chaincode-typescript/dist/Contract/landTransaction.js.map b/chaincode-typescript/dist/Contract/landTransaction.js.map new file mode 100644 index 00000000..ea5a841b --- /dev/null +++ b/chaincode-typescript/dist/Contract/landTransaction.js.map @@ -0,0 +1 @@ +{"version":3,"file":"landTransaction.js","sourceRoot":"","sources":["../../src/Contract/landTransaction.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/chaincode-typescript/dist/asset.d.ts b/chaincode-typescript/dist/asset.d.ts new file mode 100644 index 00000000..76258663 --- /dev/null +++ b/chaincode-typescript/dist/asset.d.ts @@ -0,0 +1,8 @@ +export declare class Asset { + docType?: string; + ID: string; + Color: string; + Size: number; + Owner: string; + AppraisedValue: number; +} diff --git a/chaincode-typescript/dist/asset.js b/chaincode-typescript/dist/asset.js new file mode 100644 index 00000000..3d73d74a --- /dev/null +++ b/chaincode-typescript/dist/asset.js @@ -0,0 +1,47 @@ +"use strict"; +/* + SPDX-License-Identifier: Apache-2.0 +*/ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Asset = void 0; +const fabric_contract_api_1 = require("fabric-contract-api"); +let Asset = class Asset { +}; +__decorate([ + (0, fabric_contract_api_1.Property)(), + __metadata("design:type", String) +], Asset.prototype, "docType", void 0); +__decorate([ + (0, fabric_contract_api_1.Property)(), + __metadata("design:type", String) +], Asset.prototype, "ID", void 0); +__decorate([ + (0, fabric_contract_api_1.Property)(), + __metadata("design:type", String) +], Asset.prototype, "Color", void 0); +__decorate([ + (0, fabric_contract_api_1.Property)(), + __metadata("design:type", Number) +], Asset.prototype, "Size", void 0); +__decorate([ + (0, fabric_contract_api_1.Property)(), + __metadata("design:type", String) +], Asset.prototype, "Owner", void 0); +__decorate([ + (0, fabric_contract_api_1.Property)(), + __metadata("design:type", Number) +], Asset.prototype, "AppraisedValue", void 0); +Asset = __decorate([ + (0, fabric_contract_api_1.Object)() +], Asset); +exports.Asset = Asset; +//# sourceMappingURL=asset.js.map \ No newline at end of file diff --git a/chaincode-typescript/dist/asset.js.map b/chaincode-typescript/dist/asset.js.map new file mode 100644 index 00000000..4efe107e --- /dev/null +++ b/chaincode-typescript/dist/asset.js.map @@ -0,0 +1 @@ +{"version":3,"file":"asset.js","sourceRoot":"","sources":["../src/asset.ts"],"names":[],"mappings":";AAAA;;EAEE;;;;;;;;;;;;AAEF,6DAAqD;AAG9C,IAAM,KAAK,GAAX,MAAM,KAAK;CAkBjB,CAAA;AAjBG;IAAC,IAAA,8BAAQ,GAAE;;sCACa;AAExB;IAAC,IAAA,8BAAQ,GAAE;;iCACO;AAElB;IAAC,IAAA,8BAAQ,GAAE;;oCACU;AAErB;IAAC,IAAA,8BAAQ,GAAE;;mCACS;AAEpB;IAAC,IAAA,8BAAQ,GAAE;;oCACU;AAErB;IAAC,IAAA,8BAAQ,GAAE;;6CACmB;AAjBrB,KAAK;IADjB,IAAA,4BAAM,GAAE;GACI,KAAK,CAkBjB;AAlBY,sBAAK"} \ No newline at end of file diff --git a/chaincode-typescript/dist/assetTransfer.d.ts b/chaincode-typescript/dist/assetTransfer.d.ts new file mode 100644 index 00000000..e14e21f1 --- /dev/null +++ b/chaincode-typescript/dist/assetTransfer.d.ts @@ -0,0 +1,11 @@ +import { Context, Contract } from 'fabric-contract-api'; +export declare class AssetTransferContract extends Contract { + InitLedger(ctx: Context): Promise; + CreateAsset(ctx: Context, id: string, color: string, size: number, owner: string, appraisedValue: number): Promise; + ReadAsset(ctx: Context, id: string): Promise; + UpdateAsset(ctx: Context, id: string, color: string, size: number, owner: string, appraisedValue: number): Promise; + DeleteAsset(ctx: Context, id: string): Promise; + AssetExists(ctx: Context, id: string): Promise; + TransferAsset(ctx: Context, id: string, newOwner: string): Promise; + GetAllAssets(ctx: Context): Promise; +} diff --git a/chaincode-typescript/dist/assetTransfer.js b/chaincode-typescript/dist/assetTransfer.js new file mode 100644 index 00000000..65748516 --- /dev/null +++ b/chaincode-typescript/dist/assetTransfer.js @@ -0,0 +1,219 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AssetTransferContract = void 0; +/* + * SPDX-License-Identifier: Apache-2.0 + */ +// Deterministic JSON.stringify() +const fabric_contract_api_1 = require("fabric-contract-api"); +const json_stringify_deterministic_1 = __importDefault(require("json-stringify-deterministic")); +const sort_keys_recursive_1 = __importDefault(require("sort-keys-recursive")); +let AssetTransferContract = class AssetTransferContract extends fabric_contract_api_1.Contract { + async InitLedger(ctx) { + const assets = [ + { + ID: 'asset1', + Color: 'blue', + Size: 5, + Owner: 'Tomoko', + AppraisedValue: 300, + }, + { + ID: 'asset2', + Color: 'red', + Size: 5, + Owner: 'Brad', + AppraisedValue: 400, + }, + { + ID: 'asset3', + Color: 'green', + Size: 10, + Owner: 'Jin Soo', + AppraisedValue: 500, + }, + { + ID: 'asset4', + Color: 'yellow', + Size: 10, + Owner: 'Max', + AppraisedValue: 600, + }, + { + ID: 'asset5', + Color: 'black', + Size: 15, + Owner: 'Adriana', + AppraisedValue: 700, + }, + { + ID: 'asset6', + Color: 'white', + Size: 15, + Owner: 'Michel', + AppraisedValue: 800, + }, + ]; + for (const asset of assets) { + asset.docType = 'asset'; + // example of how to write to world state deterministically + // use convetion of alphabetic order + // we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive' + // when retrieving data, in any lang, the order of data will be the same and consequently also the corresonding hash + await ctx.stub.putState(asset.ID, Buffer.from((0, json_stringify_deterministic_1.default)((0, sort_keys_recursive_1.default)(asset)))); + console.info(`Asset ${asset.ID} initialized`); + } + } + // CreateAsset issues a new asset to the world state with given details. + async CreateAsset(ctx, id, color, size, owner, appraisedValue) { + const exists = await this.AssetExists(ctx, id); + if (exists) { + throw new Error(`The asset ${id} already exists`); + } + const asset = { + ID: id, + Color: color, + Size: size, + Owner: owner, + AppraisedValue: appraisedValue, + }; + // we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive' + await ctx.stub.putState(id, Buffer.from((0, json_stringify_deterministic_1.default)((0, sort_keys_recursive_1.default)(asset)))); + } + // ReadAsset returns the asset stored in the world state with given id. + async ReadAsset(ctx, id) { + const assetJSON = await ctx.stub.getState(id); // get the asset from chaincode state + if (!assetJSON || assetJSON.length === 0) { + throw new Error(`The asset ${id} does not exist`); + } + return assetJSON.toString(); + } + // UpdateAsset updates an existing asset in the world state with provided parameters. + async UpdateAsset(ctx, id, color, size, owner, appraisedValue) { + const exists = await this.AssetExists(ctx, id); + if (!exists) { + throw new Error(`The asset ${id} does not exist`); + } + // overwriting original asset with new asset + const updatedAsset = { + ID: id, + Color: color, + Size: size, + Owner: owner, + AppraisedValue: appraisedValue, + }; + // we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive' + return ctx.stub.putState(id, Buffer.from((0, json_stringify_deterministic_1.default)((0, sort_keys_recursive_1.default)(updatedAsset)))); + } + // DeleteAsset deletes an given asset from the world state. + async DeleteAsset(ctx, id) { + const exists = await this.AssetExists(ctx, id); + if (!exists) { + throw new Error(`The asset ${id} does not exist`); + } + return ctx.stub.deleteState(id); + } + // AssetExists returns true when asset with given ID exists in world state. + async AssetExists(ctx, id) { + const assetJSON = await ctx.stub.getState(id); + return assetJSON && assetJSON.length > 0; + } + // TransferAsset updates the owner field of asset with given id in the world state, and returns the old owner. + async TransferAsset(ctx, id, newOwner) { + const assetString = await this.ReadAsset(ctx, id); + const asset = JSON.parse(assetString); + const oldOwner = asset.Owner; + asset.Owner = newOwner; + // we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive' + await ctx.stub.putState(id, Buffer.from((0, json_stringify_deterministic_1.default)((0, sort_keys_recursive_1.default)(asset)))); + return oldOwner; + } + // GetAllAssets returns all assets found in the world state. + async GetAllAssets(ctx) { + const allResults = []; + // range query with empty string for startKey and endKey does an open-ended query of all assets in the chaincode namespace. + const iterator = await ctx.stub.getStateByRange('', ''); + let result = await iterator.next(); + while (!result.done) { + const strValue = Buffer.from(result.value.value.toString()).toString('utf8'); + let record; + try { + record = JSON.parse(strValue); + } + catch (err) { + console.log(err); + record = strValue; + } + allResults.push(record); + result = await iterator.next(); + } + return JSON.stringify(allResults); + } +}; +__decorate([ + (0, fabric_contract_api_1.Transaction)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context]), + __metadata("design:returntype", Promise) +], AssetTransferContract.prototype, "InitLedger", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String, Number, String, Number]), + __metadata("design:returntype", Promise) +], AssetTransferContract.prototype, "CreateAsset", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(false), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), + __metadata("design:returntype", Promise) +], AssetTransferContract.prototype, "ReadAsset", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String, Number, String, Number]), + __metadata("design:returntype", Promise) +], AssetTransferContract.prototype, "UpdateAsset", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), + __metadata("design:returntype", Promise) +], AssetTransferContract.prototype, "DeleteAsset", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(false), + (0, fabric_contract_api_1.Returns)('boolean'), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context, String]), + __metadata("design:returntype", Promise) +], AssetTransferContract.prototype, "AssetExists", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context, String, String]), + __metadata("design:returntype", Promise) +], AssetTransferContract.prototype, "TransferAsset", null); +__decorate([ + (0, fabric_contract_api_1.Transaction)(false), + (0, fabric_contract_api_1.Returns)('string'), + __metadata("design:type", Function), + __metadata("design:paramtypes", [fabric_contract_api_1.Context]), + __metadata("design:returntype", Promise) +], AssetTransferContract.prototype, "GetAllAssets", null); +AssetTransferContract = __decorate([ + (0, fabric_contract_api_1.Info)({ title: 'AssetTransfer', description: 'Smart contract for trading assets' }) +], AssetTransferContract); +exports.AssetTransferContract = AssetTransferContract; +//# sourceMappingURL=assetTransfer.js.map \ No newline at end of file diff --git a/chaincode-typescript/dist/assetTransfer.js.map b/chaincode-typescript/dist/assetTransfer.js.map new file mode 100644 index 00000000..cfb64145 --- /dev/null +++ b/chaincode-typescript/dist/assetTransfer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"assetTransfer.js","sourceRoot":"","sources":["../src/assetTransfer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/chaincode-typescript/dist/index.d.ts b/chaincode-typescript/dist/index.d.ts new file mode 100644 index 00000000..dc09a006 --- /dev/null +++ b/chaincode-typescript/dist/index.d.ts @@ -0,0 +1,2 @@ +export { LandTransferContract } from './Contract/landTransaction'; +export declare const contracts: any[]; diff --git a/chaincode-typescript/dist/index.js b/chaincode-typescript/dist/index.js new file mode 100644 index 00000000..27a99160 --- /dev/null +++ b/chaincode-typescript/dist/index.js @@ -0,0 +1,14 @@ +"use strict"; +// /* +// * SPDX-License-Identifier: Apache-2.0 +// */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.contracts = exports.LandTransferContract = void 0; +// import {AssetTransferContract} from './assetTransfer'; +// export {AssetTransferContract} from './assetTransfer'; +// export const contracts: any[] = [AssetTransferContract]; +const landTransaction_1 = require("./Contract/landTransaction"); +var landTransaction_2 = require("./Contract/landTransaction"); +Object.defineProperty(exports, "LandTransferContract", { enumerable: true, get: function () { return landTransaction_2.LandTransferContract; } }); +exports.contracts = [landTransaction_1.LandTransferContract]; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/chaincode-typescript/dist/index.js.map b/chaincode-typescript/dist/index.js.map new file mode 100644 index 00000000..cae36e0d --- /dev/null +++ b/chaincode-typescript/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,KAAK;AACL,yCAAyC;AACzC,MAAM;;;AAEN,yDAAyD;AAEzD,yDAAyD;AAEzD,2DAA2D;AAE3D,gEAAgE;AAEhE,8DAAgE;AAAxD,uHAAA,oBAAoB,OAAA;AAEf,QAAA,SAAS,GAAU,CAAC,sCAAoB,CAAC,CAAC"} \ No newline at end of file diff --git a/chaincode-typescript/docker/docker-entrypoint.sh b/chaincode-typescript/docker/docker-entrypoint.sh new file mode 100755 index 00000000..2fd8fcf6 --- /dev/null +++ b/chaincode-typescript/docker/docker-entrypoint.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# +# SPDX-License-Identifier: Apache-2.0 +# +set -euo pipefail +: ${CORE_PEER_TLS_ENABLED:="false"} +: ${DEBUG:="false"} + +if [ "${DEBUG,,}" = "true" ]; then + npm run start:server-debug +elif [ "${CORE_PEER_TLS_ENABLED,,}" = "true" ]; then + npm run start:server +else + npm run start:server-nontls +fi + diff --git a/chaincode-typescript/npm-shrinkwrap.json b/chaincode-typescript/npm-shrinkwrap.json new file mode 100644 index 00000000..d02ea06e --- /dev/null +++ b/chaincode-typescript/npm-shrinkwrap.json @@ -0,0 +1,4410 @@ +{ + "name": "asset-transfer-basic", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "asset-transfer-basic", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "fabric-ca-client": "^2.2.19", + "fabric-contract-api": "^2.4.0", + "fabric-network": "^2.2.19", + "fabric-shim": "^2.4.0", + "json-stringify-deterministic": "^1.0.1", + "sort-keys-recursive": "^2.1.2" + }, + "devDependencies": { + "@types/chai": "^4.1.7", + "@types/mocha": "^5.2.5", + "@types/node": "^12.20.55", + "@types/sinon": "^5.0.7", + "@types/sinon-chai": "^3.2.1", + "chai": "^4.2.0", + "mocha": "^10.0.0", + "nyc": "^14.1.1", + "sinon": "^7.1.1", + "sinon-chai": "^3.3.0", + "ts-node": "^7.0.1", + "tslint": "^5.11.0", + "typescript": "^4.4" + }, + "engines": { + "node": ">=12", + "npm": ">=5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@fidm/asn1": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@fidm/asn1/-/asn1-1.0.4.tgz", + "integrity": "sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@fidm/x509": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fidm/x509/-/x509-1.2.1.tgz", + "integrity": "sha512-nwc2iesjyc9hkuzcrMCBXQRn653XuAUKorfWM8PZyJawiy1QzLj4vahwzaI25+pfpwOLvMzbJ0uKpWLDNmo16w==", + "dependencies": { + "@fidm/asn1": "^1.0.4", + "tweetnacl": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.6.tgz", + "integrity": "sha512-yq3qTy23u++8zdvf+h4mz4ohDFi681JAkMZZPTKh8zmUVh0AKLisFlgxcn22FMNowXz15oJ6pqgwT7DJ+PdJvg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@hyperledger/fabric-protos": { + "version": "0.1.0-dev.2300102001.1", + "resolved": "https://registry.npmjs.org/@hyperledger/fabric-protos/-/fabric-protos-0.1.0-dev.2300102001.1.tgz", + "integrity": "sha512-MtVXncAQz09PYOcFZUB2QbS9eVwbSGnULPuZKqFr9iScbasG194QyN6Tq8cl+kthQGSoBQORyjCIbrGIaN8EFQ==", + "dependencies": { + "@grpc/grpc-js": "^1.5.9", + "@types/google-protobuf": "^3.15.5", + "google-protobuf": "^3.19.4" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@types/chai": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.9.tgz", + "integrity": "sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==", + "dev": true + }, + "node_modules/@types/google-protobuf": { + "version": "3.15.8", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.8.tgz", + "integrity": "sha512-gHOxlQ/oKePvn36Nt4FOcgYu+E9p9td2KS14Qzf00HK0NPMYLR5yxSg3q2hUChCNlxIvCbPNzplgDYUWt8x74Q==" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/mocha": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", + "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/@types/sinon": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-5.0.7.tgz", + "integrity": "sha512-opwMHufhUwkn/UUDk35LDbKJpA2VBsZT8WLU8NjayvRLGPxQkN+8XmfC2Xl35MAscBE8469koLLBjaI3XLEIww==", + "dev": true + }, + "node_modules/@types/sinon-chai": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.10.tgz", + "integrity": "sha512-D+VFqUjMqeku/FGl4Ioo+fDeWOaIfbZ6Oj+glgFUgz5m5RJ4kgCER3FdV1uvhmEt0A+FRz+juPdybFlg5Hxfow==", + "dev": true, + "dependencies": { + "@types/chai": "*", + "@types/sinon": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", + "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==" + }, + "node_modules/@types/triple-beam": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.3.tgz", + "integrity": "sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g==" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "dependencies": { + "default-require-extensions": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==", + "dev": true + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/axios-cookiejar-support": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/axios-cookiejar-support/-/axios-cookiejar-support-1.0.1.tgz", + "integrity": "sha512-IZJxnAJ99XxiLqNeMOqrPbfR7fRyIfaoSLdPUf4AMQEGkH8URs0ghJK/xtqBsD+KsSr3pKl4DEQjCn834pHMig==", + "dependencies": { + "is-redirect": "^1.0.0", + "pify": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@types/tough-cookie": ">=2.3.3", + "axios": ">=0.16.2", + "tough-cookie": ">=2.3.3" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, + "dependencies": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "engines": { + "node": "*" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/class-transformer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz", + "integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA==" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cp-file/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "node_modules/cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha512-B0n2zDIXpzLzKeoEozorDSa1cHc1t0NjmxP0zuAxbizNU2MBqYJJKYXrrFdKuQliojXynrxgd7l4ahfg/+aA5g==", + "dev": true, + "dependencies": { + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "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" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/fabric-ca-client": { + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/fabric-ca-client/-/fabric-ca-client-2.2.19.tgz", + "integrity": "sha512-1chxgUd3KLJVfLtOVIs2SNrGRAznM9p4d50X1F92ve+RySNKPsSLr+otn3FAqrWz8GRK7GpAjEr9FNz7IIbGWw==", + "dependencies": { + "fabric-common": "2.2.19", + "jsrsasign": "^10.5.25", + "url": "^0.11.0", + "winston": "^2.4.5" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/fabric-common": { + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/fabric-common/-/fabric-common-2.2.19.tgz", + "integrity": "sha512-Pp+eFdy0af+N2ROL0G3NrLBVSEw4gZCvbK7qc0nSQRRkvS69HXoykEVzWWPUgOgKiE4/WJ9vMdwum743PPqiVQ==", + "dependencies": { + "callsite": "^1.0.0", + "elliptic": "^6.5.4", + "fabric-protos": "2.2.19", + "js-sha3": "^0.8.0", + "jsrsasign": "^10.5.25", + "long": "^5.2.3", + "nconf": "^0.12.0", + "promise-settle": "^0.3.0", + "sjcl": "^1.0.8", + "winston": "^2.4.5", + "yn": "^4.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "optionalDependencies": { + "pkcs11js": "^1.3.0" + } + }, + "node_modules/fabric-contract-api": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/fabric-contract-api/-/fabric-contract-api-2.5.4.tgz", + "integrity": "sha512-DnRY3b5CoMLznIboVKvlEzz+DJ/mfO5vJTTHRHgfVRt37zHSMJa7PC31dF/t1yxXfxC41llZQh3Or8tUqjUuPw==", + "dependencies": { + "class-transformer": "^0.4.0", + "fabric-shim-api": "2.5.4", + "fast-safe-stringify": "^2.1.1", + "get-params": "^0.1.2", + "reflect-metadata": "^0.1.13", + "winston": "^3.7.2" + }, + "engines": { + "node": "^18.0.0" + } + }, + "node_modules/fabric-contract-api/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fabric-contract-api/node_modules/winston": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", + "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/fabric-network": { + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/fabric-network/-/fabric-network-2.2.19.tgz", + "integrity": "sha512-N4IIpJuDMzEfmvoPYW4qUljXepAO1d6+hOQZp4By9RXsMBMR2qx3NLTloBxoRtKmLnUUTGOhIM5faWLNCsTc6w==", + "dependencies": { + "fabric-common": "2.2.19", + "fabric-protos": "2.2.19", + "long": "^5.2.3", + "nano": "^9.0.5" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/fabric-protos": { + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/fabric-protos/-/fabric-protos-2.2.19.tgz", + "integrity": "sha512-MIwZ+ENG5OT/0QAIwHS1yZ/zYqyHcJ/yPJu7sqaX2g9bZZh4ppXK3tGx0K58c6cXlCyWprWfWpm+UqsqrNrPHQ==", + "dependencies": { + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.0", + "long": "^5.2.3", + "protobufjs": "^7.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/fabric-shim": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/fabric-shim/-/fabric-shim-2.5.4.tgz", + "integrity": "sha512-nsx/qtbx/imAMpYTOn0wMq1KFH6L9IQMVK2xGTHPUK2HHebLBm/+HSuM6tmgK/QSaCtVt6c0MgBW2jeVCbwjqg==", + "dependencies": { + "@fidm/x509": "^1.2.1", + "@grpc/grpc-js": "1.8.15", + "@grpc/proto-loader": "^0.6.6", + "@hyperledger/fabric-protos": "0.1.0-dev.2300102001.1", + "@types/node": "^16.11.1", + "ajv": "^6.12.2", + "fabric-contract-api": "2.5.4", + "fabric-shim-api": "2.5.4", + "fast-safe-stringify": "^2.1.1", + "fs-extra": "^10.0.1", + "long": "^5.2.3", + "reflect-metadata": "^0.1.13", + "winston": "^3.7.2", + "yargs": "^17.4.0", + "yargs-parser": "^21.0.1" + }, + "bin": { + "fabric-chaincode-node": "cli.js" + }, + "engines": { + "node": "^18.0.0" + } + }, + "node_modules/fabric-shim-api": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/fabric-shim-api/-/fabric-shim-api-2.5.4.tgz", + "integrity": "sha512-DiMLjYmJt/fi67fhaAA7q0jiqiULt+pf4YME5wiPtxJ9bwBybcVTNMLmN7nVHE3ALkX439HBdsAZpeSBpqiqSA==", + "engines": { + "eslint": "^6.6.0", + "node": "^18.0.0" + } + }, + "node_modules/fabric-shim/node_modules/@grpc/grpc-js": { + "version": "1.8.15", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.15.tgz", + "integrity": "sha512-H2Bu/w6+oQ58DsRbQol66ERBk3V5ZIak/z/MDx0T4EgDnJWps807I6BvTjq0v6UvZtOcLO+ur+Q9wvniqu3OJA==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/fabric-shim/node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/fabric-shim/node_modules/@grpc/proto-loader": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", + "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.11.3", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/fabric-shim/node_modules/@grpc/proto-loader/node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/fabric-shim/node_modules/@grpc/proto-loader/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/fabric-shim/node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fabric-shim/node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/fabric-shim/node_modules/@types/node": { + "version": "16.18.58", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.58.tgz", + "integrity": "sha512-YGncyA25/MaVtQkjWW9r0EFBukZ+JulsLcVZBlGUfIb96OBMjkoRWwQo5IEWJ8Fj06Go3GHw+bjYDitv6BaGsA==" + }, + "node_modules/fabric-shim/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/fabric-shim/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fabric-shim/node_modules/winston": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz", + "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.5.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha512-3TOY+4TKV0Ml83PXJQY+JFQaHNV38lzQDIzzXYg1kWdBLenGgoZhAs0CKgzI31vi2pWEpQMq/Yi4bpKwCPkw7g==", + "dev": true, + "dependencies": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-params": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/get-params/-/get-params-0.1.2.tgz", + "integrity": "sha512-41eOxtlGgHQRbFyA8KTH+w+32Em3cRdfBud7j67ulzmIfmaHX9doq47s0fa4P5o9H64BZX9nrYI6sJvk46Op+Q==" + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha512-w0Kz8lJFBoyaurBiNrIvxPqr/gJ6fOfSkpAPOepN3oECqGJag37xPbOv57izi/KP8auHgNYxn5fXtAb+1LsJ6w==", + "dev": true, + "dependencies": { + "is-stream": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "dependencies": { + "append-transform": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "dependencies": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-deterministic": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/json-stringify-deterministic/-/json-stringify-deterministic-1.0.11.tgz", + "integrity": "sha512-lsn3NoTZ6dGgJJ7W4i7BUKV4WJ+hqAJ0imqHl314MNUw2U+As++qLDudcHqBqlkCXTTH7kH3v5LUQ3CHoVM0BA==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsrsasign": { + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-10.8.6.tgz", + "integrity": "sha512-bQmbVtsfbgaKBTWCKiDCPlUPbdlRIK/FzSwT3BzIgZl/cU6TqXu6pZJsCI/dJVrZ9Gir5GC4woqw9shH/v7MBw==", + "funding": { + "url": "https://github.com/kjur/jsrsasign#donations" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "optional": true + }, + "node_modules/nano": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/nano/-/nano-9.0.5.tgz", + "integrity": "sha512-fEAhwAdXh4hDDnC8cYJtW6D8ivOmpvFAqT90+zEuQREpRkzA/mJPcI4EKv15JUdajaqiLTXNoKK6PaRF+/06DQ==", + "dependencies": { + "@types/tough-cookie": "^4.0.0", + "axios": "^0.21.1", + "axios-cookiejar-support": "^1.0.1", + "qs": "^6.9.4", + "tough-cookie": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nconf": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz", + "integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==", + "dependencies": { + "async": "^3.0.0", + "ini": "^2.0.0", + "secure-keys": "^1.0.0", + "yargs": "^16.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nconf/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/nconf/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nconf/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/nested-error-stacks": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", + "dev": true + }, + "node_modules/nise": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", + "dev": true, + "dependencies": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nyc/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/nyc/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/nyc/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/nyc/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/nyc/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/nyc/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nyc/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nyc/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", + "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkcs11js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkcs11js/-/pkcs11js-1.3.1.tgz", + "integrity": "sha512-eo7fTeQwYGzX1pFmRaf4ji/WcDW2XKpwqylOwzutsjNWECv6G9PzDHj3Yj5dX9EW/fydMnJG8xvWj/btnQT9TA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "nan": "^2.15.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/PeculiarVentures" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/promise-settle": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/promise-settle/-/promise-settle-0.3.0.tgz", + "integrity": "sha512-sdZv9X6V2mnVSNibIHk44hI2jf6z9bhsm2OUU+hsU1JgdFuwsZVUcIGPreQ9wlu5wWlAGXzbyEbCUU+U8TQSHQ==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/@types/node": { + "version": "20.8.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", + "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", + "dependencies": { + "undici-types": "~5.25.1" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/sinon": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.4.0", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.3.3", + "diff": "^3.5.0", + "lolex": "^4.2.0", + "nise": "^1.5.2", + "supports-color": "^5.5.0" + } + }, + "node_modules/sinon-chai": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", + "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", + "dev": true, + "peerDependencies": { + "chai": "^4.0.0", + "sinon": ">=4.0.0" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/sinon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sjcl": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/sjcl/-/sjcl-1.0.8.tgz", + "integrity": "sha512-LzIjEQ0S0DpIgnxMEayM1rq9aGwGRG4OnZhCdjx7glTaJtf4zRfpg87ImfjSJjoW9vKpagd82McDOwbRT5kQKQ==", + "engines": { + "node": "*" + } + }, + "node_modules/sort-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz", + "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", + "dependencies": { + "is-plain-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sort-keys-recursive": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/sort-keys-recursive/-/sort-keys-recursive-2.1.9.tgz", + "integrity": "sha512-faoeWGRoPzR6hh21iljMoGeCfnKId0jiBqQH3jmdlVB7s78VRIiqJxtgM4DXA7FBNGuZB5GMWQQEozROXKlOng==", + "dependencies": { + "kind-of": "~6.0.2", + "sort-keys": "~4.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-wrap": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", + "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", + "dev": true, + "dependencies": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "dependencies": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dev": true, + "dependencies": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/ts-node/node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" + } + }, + "node_modules/tslint/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/tslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/tslint/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/tslint/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/tslint/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslint/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tslint/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/tslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tslint/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tslint/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/winston": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.7.tgz", + "integrity": "sha512-vLB4BqzCKDnnZH9PHGoS2ycawueX4HLqENXQitvFHczhgW2vFpSOn31LZtVr1KU8YTw7DS4tM+cqyovxo8taVg==", + "dependencies": { + "async": "^2.6.4", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "stack-trace": "0.0.x" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/winston-transport": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz", + "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-4.0.0.tgz", + "integrity": "sha512-huWiiCS4TxKc4SfgmTwW1K7JmXPPAmuXWYy4j9qjQo4+27Kni8mGhAAi1cloRWmBe2EqcLgt3IGqQoRL/MtPgg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/chaincode-typescript/package.json b/chaincode-typescript/package.json new file mode 100644 index 00000000..d61599bc --- /dev/null +++ b/chaincode-typescript/package.json @@ -0,0 +1,71 @@ +{ + "name": "asset-transfer-basic", + "version": "1.0.0", + "description": "Asset Transfer Basic contract implemented in TypeScript", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "engines": { + "node": ">=12", + "npm": ">=5" + }, + "scripts": { + "lint": "tslint -c tslint.json 'src/**/*.ts'", + "pretest": "npm run lint", + "test": "nyc mocha -r ts-node/register src/**/*.spec.ts", + "start": "set -x && fabric-chaincode-node start", + "build": "tsc", + "build:watch": "tsc -w", + "prepublishOnly": "npm run build", + "docker": "docker build -f ./Dockerfile -t asset-transfer-basic .", + "package": "npm run build && npm shrinkwrap", + "start:server-nontls": "set -x && fabric-chaincode-node server --chaincode-address=$CHAINCODE_SERVER_ADDRESS --chaincode-id=$CHAINCODE_ID", + "start:server-debug": "set -x && NODE_OPTIONS='--inspect=0.0.0.0:9229' fabric-chaincode-node server --chaincode-address=$CHAINCODE_SERVER_ADDRESS --chaincode-id=$CHAINCODE_ID", + "start:server": "set -x && fabric-chaincode-node server --chaincode-address=$CHAINCODE_SERVER_ADDRESS --chaincode-id=$CHAINCODE_ID --chaincode-tls-key-file=/hyperledger/privatekey.pem --chaincode-tls-client-cacert-file=/hyperledger/rootcert.pem --chaincode-tls-cert-file=/hyperledger/cert.pem" + }, + "engineStrict": true, + "author": "Hyperledger", + "license": "Apache-2.0", + "dependencies": { + "fabric-ca-client": "^2.2.19", + "fabric-contract-api": "^2.4.0", + "fabric-network": "^2.2.19", + "fabric-shim": "^2.4.0", + "json-stringify-deterministic": "^1.0.1", + "sort-keys-recursive": "^2.1.2" + }, + "devDependencies": { + "@types/chai": "^4.1.7", + "@types/mocha": "^5.2.5", + "@types/node": "^12.20.55", + "@types/sinon": "^5.0.7", + "@types/sinon-chai": "^3.2.1", + "chai": "^4.2.0", + "mocha": "^10.0.0", + "nyc": "^14.1.1", + "sinon": "^7.1.1", + "sinon-chai": "^3.3.0", + "ts-node": "^7.0.1", + "tslint": "^5.11.0", + "typescript": "^4.4" + }, + "nyc": { + "extension": [ + ".ts", + ".tsx" + ], + "exclude": [ + "coverage/**", + "dist/**" + ], + "reporter": [ + "text-summary", + "html" + ], + "all": true, + "check-coverage": true, + "statements": 100, + "branches": 100, + "functions": 100, + "lines": 100 + } +} diff --git a/chaincode-typescript/src/Contract/Admin.js b/chaincode-typescript/src/Contract/Admin.js new file mode 100644 index 00000000..549b71b6 --- /dev/null +++ b/chaincode-typescript/src/Contract/Admin.js @@ -0,0 +1,47 @@ +const { Wallets } = require('fabric-network'); +const FabricCAServices = require('fabric-ca-client'); +const path = require('path'); +const { buildCAClient, enrollAdmin, ClearWallet } = require('../../../test-application/javascript/CAUtil.js'); +const { buildCCPOrg1, buildWallet } = require('../../../test-application/javascript/AppUtil.js'); + +const mspOrg1 = 'Org1MSP'; + +async function enrollAdmmin() { + console.log('\n--> Enrolling the Org1 CA admin'); + const ccpOrg1 = buildCCPOrg1(); + const caOrg1Client = buildCAClient(FabricCAServices, ccpOrg1, 'ca.org1.example.com'); + + const walletPathOrg1 = path.join(__dirname, 'wallet'); + const walletOrg1 = await buildWallet(Wallets, walletPathOrg1); + + await enrollAdmin(caOrg1Client, walletOrg1, mspOrg1); +} + +async function clearWallet(){ + const walletPath = path.join(__dirname, 'wallet'); + const wallet = await buildWallet(Wallets, walletPath); + + await ClearWallet(wallet); +} + +async function main() { + cmd = "create"; + if (!(process.argv[2] === undefined)) { + cmd = process.argv[2]; + } + + try { + if(cmd=="clear"){ + await clearWallet(); + }else if(cmd=="create"){ + await enrollAdmmin(); + }else{ + throw Error(cmd + " is not defined. (create / clean)") + } + } catch (error) { + console.error(`Error in admin: ${error}`); + process.exit(1); + } +} + +main(); \ No newline at end of file diff --git a/chaincode-typescript/src/Contract/landAsset.ts b/chaincode-typescript/src/Contract/landAsset.ts new file mode 100644 index 00000000..a6439cf8 --- /dev/null +++ b/chaincode-typescript/src/Contract/landAsset.ts @@ -0,0 +1,16 @@ +import {Object, Property} from 'fabric-contract-api'; + +@Object() +export class Asset { + @Property() + public ID: string; + + @Property() + public Size: number; + + @Property() + public Owner: string; + + @Property() + public TimeStamp: number; +} diff --git a/chaincode-typescript/src/Contract/landTransaction.ts b/chaincode-typescript/src/Contract/landTransaction.ts new file mode 100644 index 00000000..0fa97487 --- /dev/null +++ b/chaincode-typescript/src/Contract/landTransaction.ts @@ -0,0 +1,121 @@ +import {Context, Contract, Returns, Transaction, Info} from 'fabric-contract-api'; +import stringify from 'json-stringify-deterministic'; +import sortKeysRecursive from 'sort-keys-recursive'; +import { Asset } from './landAsset'; + +@Info({title: 'LandTransfer', description: 'Smart contract for trading land assets'}) +export class LandTransferContract extends Contract { + + @Transaction() + public async InitLedger(ctx: Context): Promise { + const assets: Asset[] = [ + { + ID: "0", + Size: 10000, + Owner: "Government", + TimeStamp: Date.now() + } + ]; + + for (const asset of assets) { + await ctx.stub.putState(asset.ID, Buffer.from(stringify(sortKeysRecursive(asset)))); + console.info(`Asset ${asset.ID} initialized`); + } + } + + @Transaction() + private async CreateAsset(ctx: Context, id:string, size: number, owner: string): Promise { + const exists = await this.AssetExists(ctx, id); + if (exists) { + throw new Error(`The asset ${id} already exists`); + } + + const asset:Asset = { + ID: id, + Size: size, + Owner: owner, + TimeStamp: Date.now() + }; + await ctx.stub.putState(id, Buffer.from(stringify(sortKeysRecursive(asset)))); + } + + @Transaction() + private async DeleteAsset(ctx: Context, id: string): Promise { + const exists = await this.AssetExists(ctx, id); + if (!exists) { + throw new Error(`The asset ${id} does not exist`); + } + return ctx.stub.deleteState(id); + } + + @Transaction() + public async TransferAsset(ctx: Context, id: string, newOwner: string): Promise { + const assetString = await this.ReadAsset(ctx, id); + const asset = JSON.parse(assetString); + const oldOwner = asset.Owner; + asset.Owner = newOwner; + // we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive' + await ctx.stub.putState(id, Buffer.from(stringify(sortKeysRecursive(asset)))); + return oldOwner; + } + + @Transaction() + public async SplitAsset(ctx: Context, id: string, newOwner: string, transfer:string): Promise { + const transferSize = parseInt(transfer); + const assetString = await this.ReadAsset(ctx, id); + const asset:Asset = JSON.parse(assetString); + if(asset.SizetransferSize) await this.CreateAsset(ctx, id+"0", asset.Size-transferSize, oldOwner); + await this.CreateAsset(ctx, id+"1", transferSize, newOwner); + // we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive' + // await ctx.stub.putState(id, Buffer.from(stringify(sortKeysRecursive(asset)))); + return oldOwner; + } + + @Transaction(false) + public async ReadAsset(ctx: Context, id: string): Promise { + const assetJSON = await ctx.stub.getState(id); // get the asset from chaincode state + if (!assetJSON || assetJSON.length === 0) { + throw new Error(`The asset ${id} does not exist`); + } + return assetJSON.toString(); + } + + + @Transaction(false) + @Returns('boolean') + public async AssetExists(ctx: Context, id: string): Promise { + const assetJSON = await ctx.stub.getState(id); + return assetJSON && assetJSON.length > 0; + } + + @Transaction(false) + @Returns('string') + public async GetAllAssets(ctx: Context): Promise { + const allResults = []; + // range query with empty string for startKey and endKey does an open-ended query of all assets in the chaincode namespace. + const iterator = await ctx.stub.getStateByRange('', ''); + let result = await iterator.next(); + while (!result.done) { + const strValue = Buffer.from(result.value.value.toString()).toString('utf8'); + let record; + try { + record = JSON.parse(strValue); + } catch (err) { + console.log(err); + record = strValue; + } + allResults.push(record); + result = await iterator.next(); + } + return JSON.stringify(allResults); + } +} \ No newline at end of file diff --git a/chaincode-typescript/src/Contract/registerEnrollUser.js b/chaincode-typescript/src/Contract/registerEnrollUser.js new file mode 100644 index 00000000..12fa7272 --- /dev/null +++ b/chaincode-typescript/src/Contract/registerEnrollUser.js @@ -0,0 +1,41 @@ +const { Wallets } = require('fabric-network'); +const FabricCAServices = require('fabric-ca-client'); +const path = require('path'); +const { buildCAClient, registerAndEnrollUser} = require('../../../test-application/javascript/CAUtil.js'); +const { buildCCPOrg1, buildWallet } = require('../../../test-application/javascript/AppUtil.js'); + +const mspOrg1 = 'Org1MSP'; + + +async function connectToOrg1CA(UserID) { + console.log('\n--> Register and enrolling new user'); + const ccpOrg1 = buildCCPOrg1(); + const caOrg1Client = buildCAClient(FabricCAServices, ccpOrg1, 'ca.org1.example.com'); + + const walletPathOrg1 = path.join(__dirname, 'wallet'); + const walletOrg1 = await buildWallet(Wallets, walletPathOrg1); + + await registerAndEnrollUser(caOrg1Client, walletOrg1, mspOrg1, UserID, 'org1.department1'); + +} + +async function main() { + + if (process.argv[2] === undefined ) { + console.log('Usage: node registerEnrollUser.js userID'); + process.exit(1); + } + + const userId = process.argv[2]; + + try { + + await connectToOrg1CA(userId); + + } catch (error) { + console.error(`Error in enrolling admin: ${error}`); + process.exit(1); + } +} + +main(); diff --git a/chaincode-typescript/src/Contract/userRequest.ts b/chaincode-typescript/src/Contract/userRequest.ts new file mode 100644 index 00000000..1599b1d2 --- /dev/null +++ b/chaincode-typescript/src/Contract/userRequest.ts @@ -0,0 +1,13 @@ +import {Object, Property} from 'fabric-contract-api'; + +@Object() +export class User { + @Property() + public userName: string; + + @Property() + public Approved: boolean; + + @Property() + public CreationTime: number; +} diff --git a/chaincode-typescript/src/Contract/wallet/admin.id b/chaincode-typescript/src/Contract/wallet/admin.id new file mode 100644 index 00000000..3798115e --- /dev/null +++ b/chaincode-typescript/src/Contract/wallet/admin.id @@ -0,0 +1 @@ +{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIIB8zCCAZmgAwIBAgIUf/oQQ6bxcJi2CLPkqdXK73qabiUwCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjMxMDE4MDU0OTAwWhcNMjQxMDE3MDgxODAw\nWjAhMQ8wDQYDVQQLEwZjbGllbnQxDjAMBgNVBAMTBWFkbWluMFkwEwYHKoZIzj0C\nAQYIKoZIzj0DAQcDQgAE10NX3+ksbyj1ihsPFeyD5P8/PBIVeK+MkkYNove4Epd9\nwC0ZVJIs/6/Nw7HCuB4njyqm3IsnG19+41Mn/PvGOqNgMF4wDgYDVR0PAQH/BAQD\nAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFN9N55/92SUkWc/n6cRa4pG2P2S5\nMB8GA1UdIwQYMBaAFA+auQ7Dgia/v7BDt10XszfiPsfHMAoGCCqGSM49BAMCA0gA\nMEUCIQCeRKO13pOPWD9Wd1Z1C1wpWYw1SZwpprYNkchJ+CCgwwIgJ4sTnPD30/pK\nKrdpuRx8tuR+rHAZBMC1SjrStiJyblA=\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg3YH3+eUHRb0EuPXy\r\nB3mnYSssSNDuwBrYP3hB37iXfoqhRANCAATXQ1ff6SxvKPWKGw8V7IPk/z88EhV4\r\nr4ySRg2i97gSl33ALRlUkiz/r83DscK4HiePKqbciycbX37jUyf8+8Y6\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file diff --git a/chaincode-typescript/src/Contract/wallet/user123.id b/chaincode-typescript/src/Contract/wallet/user123.id new file mode 100644 index 00000000..42467cd8 --- /dev/null +++ b/chaincode-typescript/src/Contract/wallet/user123.id @@ -0,0 +1 @@ +{"credentials":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICgzCCAiqgAwIBAgIUIqIkO0oZz51bzn+uBqkv2EE1qIcwCgYIKoZIzj0EAwIw\ncDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMQ8wDQYDVQQH\nEwZEdXJoYW0xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMjMxMDE4MDU0OTAwWhcNMjQxMDE3MDgxOTAw\nWjBEMTAwCwYDVQQLEwRvcmcxMA0GA1UECxMGY2xpZW50MBIGA1UECxMLZGVwYXJ0\nbWVudDExEDAOBgNVBAMTB3VzZXIxMjMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC\nAATokA8wRpsYyu90MTBwJACKhkPLwAAdPHVTC+XSOQoOXGY+W2UPrEvZxlzYNqG1\njYPffWW5gZXlD5gAXPBCuKglo4HNMIHKMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMB\nAf8EAjAAMB0GA1UdDgQWBBTGBNj7yXfFpNA5nI+3pbbnSrpOcTAfBgNVHSMEGDAW\ngBQPmrkOw4Imv7+wQ7ddF7M34j7HxzBqBggqAwQFBgcIAQReeyJhdHRycyI6eyJo\nZi5BZmZpbGlhdGlvbiI6Im9yZzEuZGVwYXJ0bWVudDEiLCJoZi5FbnJvbGxtZW50\nSUQiOiJ1c2VyMTIzIiwiaGYuVHlwZSI6ImNsaWVudCJ9fTAKBggqhkjOPQQDAgNH\nADBEAiARDmNUggj34mLZke78XQcqsnY8eDcJFEFe6/oAcPglQgIgZsX5ETpcCRyh\n8QURT7zEP+ns8HhXGBPLdOC9T4IKlNo=\n-----END CERTIFICATE-----\n","privateKey":"-----BEGIN PRIVATE KEY-----\r\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9S/JIxNtav98ksuW\r\nxanH+3NY/voevpoJ0cuGm5E3YmGhRANCAATokA8wRpsYyu90MTBwJACKhkPLwAAd\r\nPHVTC+XSOQoOXGY+W2UPrEvZxlzYNqG1jYPffWW5gZXlD5gAXPBCuKgl\r\n-----END PRIVATE KEY-----\r\n"},"mspId":"Org1MSP","type":"X.509","version":1} \ No newline at end of file diff --git a/chaincode-typescript/src/asset.ts b/chaincode-typescript/src/asset.ts new file mode 100644 index 00000000..9fd62d35 --- /dev/null +++ b/chaincode-typescript/src/asset.ts @@ -0,0 +1,26 @@ +/* + SPDX-License-Identifier: Apache-2.0 +*/ + +import {Object, Property} from 'fabric-contract-api'; + +@Object() +export class Asset { + @Property() + public docType?: string; + + @Property() + public ID: string; + + @Property() + public Color: string; + + @Property() + public Size: number; + + @Property() + public Owner: string; + + @Property() + public AppraisedValue: number; +} diff --git a/chaincode-typescript/src/assetTransfer.ts b/chaincode-typescript/src/assetTransfer.ts new file mode 100644 index 00000000..b9b6c3ff --- /dev/null +++ b/chaincode-typescript/src/assetTransfer.ts @@ -0,0 +1,173 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + */ +// Deterministic JSON.stringify() +import {Context, Contract, Info, Returns, Transaction} from 'fabric-contract-api'; +import stringify from 'json-stringify-deterministic'; +import sortKeysRecursive from 'sort-keys-recursive'; +import {Asset} from './asset'; + +@Info({title: 'AssetTransfer', description: 'Smart contract for trading assets'}) +export class AssetTransferContract extends Contract { + + @Transaction() + public async InitLedger(ctx: Context): Promise { + const assets: Asset[] = [ + { + ID: 'asset1', + Color: 'blue', + Size: 5, + Owner: 'Tomoko', + AppraisedValue: 300, + }, + { + ID: 'asset2', + Color: 'red', + Size: 5, + Owner: 'Brad', + AppraisedValue: 400, + }, + { + ID: 'asset3', + Color: 'green', + Size: 10, + Owner: 'Jin Soo', + AppraisedValue: 500, + }, + { + ID: 'asset4', + Color: 'yellow', + Size: 10, + Owner: 'Max', + AppraisedValue: 600, + }, + { + ID: 'asset5', + Color: 'black', + Size: 15, + Owner: 'Adriana', + AppraisedValue: 700, + }, + { + ID: 'asset6', + Color: 'white', + Size: 15, + Owner: 'Michel', + AppraisedValue: 800, + }, + ]; + + for (const asset of assets) { + asset.docType = 'asset'; + // example of how to write to world state deterministically + // use convetion of alphabetic order + // we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive' + // when retrieving data, in any lang, the order of data will be the same and consequently also the corresonding hash + await ctx.stub.putState(asset.ID, Buffer.from(stringify(sortKeysRecursive(asset)))); + console.info(`Asset ${asset.ID} initialized`); + } + } + + // CreateAsset issues a new asset to the world state with given details. + @Transaction() + public async CreateAsset(ctx: Context, id: string, color: string, size: number, owner: string, appraisedValue: number): Promise { + const exists = await this.AssetExists(ctx, id); + if (exists) { + throw new Error(`The asset ${id} already exists`); + } + + const asset = { + ID: id, + Color: color, + Size: size, + Owner: owner, + AppraisedValue: appraisedValue, + }; + // we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive' + await ctx.stub.putState(id, Buffer.from(stringify(sortKeysRecursive(asset)))); + } + + // ReadAsset returns the asset stored in the world state with given id. + @Transaction(false) + public async ReadAsset(ctx: Context, id: string): Promise { + const assetJSON = await ctx.stub.getState(id); // get the asset from chaincode state + if (!assetJSON || assetJSON.length === 0) { + throw new Error(`The asset ${id} does not exist`); + } + return assetJSON.toString(); + } + + // UpdateAsset updates an existing asset in the world state with provided parameters. + @Transaction() + public async UpdateAsset(ctx: Context, id: string, color: string, size: number, owner: string, appraisedValue: number): Promise { + const exists = await this.AssetExists(ctx, id); + if (!exists) { + throw new Error(`The asset ${id} does not exist`); + } + + // overwriting original asset with new asset + const updatedAsset = { + ID: id, + Color: color, + Size: size, + Owner: owner, + AppraisedValue: appraisedValue, + }; + // we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive' + return ctx.stub.putState(id, Buffer.from(stringify(sortKeysRecursive(updatedAsset)))); + } + + // DeleteAsset deletes an given asset from the world state. + @Transaction() + public async DeleteAsset(ctx: Context, id: string): Promise { + const exists = await this.AssetExists(ctx, id); + if (!exists) { + throw new Error(`The asset ${id} does not exist`); + } + return ctx.stub.deleteState(id); + } + + // AssetExists returns true when asset with given ID exists in world state. + @Transaction(false) + @Returns('boolean') + public async AssetExists(ctx: Context, id: string): Promise { + const assetJSON = await ctx.stub.getState(id); + return assetJSON && assetJSON.length > 0; + } + + // TransferAsset updates the owner field of asset with given id in the world state, and returns the old owner. + @Transaction() + public async TransferAsset(ctx: Context, id: string, newOwner: string): Promise { + const assetString = await this.ReadAsset(ctx, id); + const asset = JSON.parse(assetString); + const oldOwner = asset.Owner; + asset.Owner = newOwner; + // we insert data in alphabetic order using 'json-stringify-deterministic' and 'sort-keys-recursive' + await ctx.stub.putState(id, Buffer.from(stringify(sortKeysRecursive(asset)))); + return oldOwner; + } + + // GetAllAssets returns all assets found in the world state. + @Transaction(false) + @Returns('string') + public async GetAllAssets(ctx: Context): Promise { + const allResults = []; + // range query with empty string for startKey and endKey does an open-ended query of all assets in the chaincode namespace. + const iterator = await ctx.stub.getStateByRange('', ''); + let result = await iterator.next(); + while (!result.done) { + const strValue = Buffer.from(result.value.value.toString()).toString('utf8'); + let record; + try { + record = JSON.parse(strValue); + } catch (err) { + console.log(err); + record = strValue; + } + allResults.push(record); + result = await iterator.next(); + } + return JSON.stringify(allResults); + } + +} diff --git a/chaincode-typescript/src/index.ts b/chaincode-typescript/src/index.ts new file mode 100644 index 00000000..715bcfc6 --- /dev/null +++ b/chaincode-typescript/src/index.ts @@ -0,0 +1,15 @@ +// /* +// * SPDX-License-Identifier: Apache-2.0 +// */ + +// import {AssetTransferContract} from './assetTransfer'; + +// export {AssetTransferContract} from './assetTransfer'; + +// export const contracts: any[] = [AssetTransferContract]; + +import {LandTransferContract} from './Contract/landTransaction'; + +export {LandTransferContract} from './Contract/landTransaction'; + +export const contracts: any[] = [LandTransferContract]; diff --git a/chaincode-typescript/tsconfig.json b/chaincode-typescript/tsconfig.json new file mode 100644 index 00000000..70cc98c9 --- /dev/null +++ b/chaincode-typescript/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "outDir": "dist", + "target": "es2017", + "moduleResolution": "node", + "module": "commonjs", + "esModuleInterop": true, + "declaration": true, + "sourceMap": true + }, + "include": [ + "./src/**/*" + ], + "exclude": [ + "./src/**/*.spec.ts" + ] +} diff --git a/chaincode-typescript/tslint.json b/chaincode-typescript/tslint.json new file mode 100644 index 00000000..a52c3ee2 --- /dev/null +++ b/chaincode-typescript/tslint.json @@ -0,0 +1,23 @@ +{ + "defaultSeverity": "error", + "extends": [ + "tslint:recommended" + ], + "jsRules": {}, + "rules": { + "indent": [true, "spaces", 4], + "linebreak-style": [true, "LF"], + "quotemark": [true, "single"], + "semicolon": [true, "always"], + "no-console": false, + "curly": true, + "triple-equals": true, + "no-string-throw": true, + "no-var-keyword": true, + "no-trailing-whitespace": true, + "object-literal-key-quotes": [true, "as-needed"], + "object-literal-sort-keys": false, + "max-line-length": false + }, + "rulesDirectory": [] +} diff --git a/test-network/compose/compose-ca.yaml b/test-network/compose/compose-ca.yaml index f678755b..0568540c 100644 --- a/test-network/compose/compose-ca.yaml +++ b/test-network/compose/compose-ca.yaml @@ -31,25 +31,25 @@ services: networks: - test - ca_org2: - image: hyperledger/fabric-ca:latest - labels: - service: hyperledger-fabric - environment: - - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server - - FABRIC_CA_SERVER_CA_NAME=ca-org2 - - FABRIC_CA_SERVER_TLS_ENABLED=true - - FABRIC_CA_SERVER_PORT=8054 - - FABRIC_CA_SERVER_OPERATIONS_LISTENADDRESS=0.0.0.0:18054 - ports: - - "8054:8054" - - "18054:18054" - command: sh -c 'fabric-ca-server start -b admin:adminpw -d' - volumes: - - ../organizations/fabric-ca/org2:/etc/hyperledger/fabric-ca-server - container_name: ca_org2 - networks: - - test + # ca_org2: + # image: hyperledger/fabric-ca:latest + # labels: + # service: hyperledger-fabric + # environment: + # - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server + # - FABRIC_CA_SERVER_CA_NAME=ca-org2 + # - FABRIC_CA_SERVER_TLS_ENABLED=true + # - FABRIC_CA_SERVER_PORT=8054 + # - FABRIC_CA_SERVER_OPERATIONS_LISTENADDRESS=0.0.0.0:18054 + # ports: + # - "8054:8054" + # - "18054:18054" + # command: sh -c 'fabric-ca-server start -b admin:adminpw -d' + # volumes: + # - ../organizations/fabric-ca/org2:/etc/hyperledger/fabric-ca-server + # container_name: ca_org2 + # networks: + # - test ca_orderer: image: hyperledger/fabric-ca:latest diff --git a/test-network/compose/compose-test-net.yaml b/test-network/compose/compose-test-net.yaml index ba3a968c..0d908b5e 100644 --- a/test-network/compose/compose-test-net.yaml +++ b/test-network/compose/compose-test-net.yaml @@ -97,44 +97,44 @@ services: networks: - test - peer0.org2.example.com: - container_name: peer0.org2.example.com - image: hyperledger/fabric-peer:latest - labels: - service: hyperledger-fabric - environment: - - FABRIC_CFG_PATH=/etc/hyperledger/peercfg - - FABRIC_LOGGING_SPEC=INFO - #- FABRIC_LOGGING_SPEC=DEBUG - - CORE_PEER_TLS_ENABLED=true - - CORE_PEER_PROFILE_ENABLED=false - - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt - - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key - - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt - # Peer specific variables - - CORE_PEER_ID=peer0.org2.example.com - - CORE_PEER_ADDRESS=peer0.org2.example.com:9051 - - CORE_PEER_LISTENADDRESS=0.0.0.0:9051 - - CORE_PEER_CHAINCODEADDRESS=peer0.org2.example.com:9052 - - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:9052 - - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:9051 - - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:9051 - - CORE_PEER_LOCALMSPID=Org2MSP - - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/msp - - CORE_OPERATIONS_LISTENADDRESS=peer0.org2.example.com:9445 - - CORE_METRICS_PROVIDER=prometheus - - CHAINCODE_AS_A_SERVICE_BUILDER_CONFIG={"peername":"peer0org2"} - - CORE_CHAINCODE_EXECUTETIMEOUT=300s - volumes: - - ../organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com:/etc/hyperledger/fabric - - peer0.org2.example.com:/var/hyperledger/production - working_dir: /root - command: peer node start - ports: - - 9051:9051 - - 9445:9445 - networks: - - test + # peer0.org2.example.com: + # container_name: peer0.org2.example.com + # image: hyperledger/fabric-peer:latest + # labels: + # service: hyperledger-fabric + # environment: + # - FABRIC_CFG_PATH=/etc/hyperledger/peercfg + # - FABRIC_LOGGING_SPEC=INFO + # #- FABRIC_LOGGING_SPEC=DEBUG + # - CORE_PEER_TLS_ENABLED=true + # - CORE_PEER_PROFILE_ENABLED=false + # - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt + # - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key + # - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt + # # Peer specific variables + # - CORE_PEER_ID=peer0.org2.example.com + # - CORE_PEER_ADDRESS=peer0.org2.example.com:9051 + # - CORE_PEER_LISTENADDRESS=0.0.0.0:9051 + # - CORE_PEER_CHAINCODEADDRESS=peer0.org2.example.com:9052 + # - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:9052 + # - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:9051 + # - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:9051 + # - CORE_PEER_LOCALMSPID=Org2MSP + # - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/fabric/msp + # - CORE_OPERATIONS_LISTENADDRESS=peer0.org2.example.com:9445 + # - CORE_METRICS_PROVIDER=prometheus + # - CHAINCODE_AS_A_SERVICE_BUILDER_CONFIG={"peername":"peer0org2"} + # - CORE_CHAINCODE_EXECUTETIMEOUT=300s + # volumes: + # - ../organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com:/etc/hyperledger/fabric + # - peer0.org2.example.com:/var/hyperledger/production + # working_dir: /root + # command: peer node start + # ports: + # - 9051:9051 + # - 9445:9445 + # networks: + # - test cli: container_name: cli @@ -155,6 +155,5 @@ services: - ../scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/ depends_on: - peer0.org1.example.com - - peer0.org2.example.com networks: - test \ No newline at end of file diff --git a/test-network/compose/docker/docker-compose-bft-test-net.yaml b/test-network/compose/docker/docker-compose-bft-test-net.yaml index 68f6dc56..36d2117e 100644 --- a/test-network/compose/docker/docker-compose-bft-test-net.yaml +++ b/test-network/compose/docker/docker-compose-bft-test-net.yaml @@ -18,8 +18,8 @@ services: - ./docker/peercfg:/etc/hyperledger/peercfg - ${DOCKER_SOCK}:/host/var/run/docker.sock - peer0.org2.example.com: - container_name: peer0.org2.example.com + peer1.org1.example.com: + container_name: peer1.org1.example.com image: hyperledger/fabric-peer:latest labels: service: hyperledger-fabric diff --git a/test-network/compose/docker/docker-compose-test-net.yaml b/test-network/compose/docker/docker-compose-test-net.yaml index 68f6dc56..b8bb8216 100644 --- a/test-network/compose/docker/docker-compose-test-net.yaml +++ b/test-network/compose/docker/docker-compose-test-net.yaml @@ -18,8 +18,8 @@ services: - ./docker/peercfg:/etc/hyperledger/peercfg - ${DOCKER_SOCK}:/host/var/run/docker.sock - peer0.org2.example.com: - container_name: peer0.org2.example.com + peer1.org1.example.com: + container_name: peer1.org1.example.com image: hyperledger/fabric-peer:latest labels: service: hyperledger-fabric @@ -31,6 +31,32 @@ services: - ./docker/peercfg:/etc/hyperledger/peercfg - ${DOCKER_SOCK}:/host/var/run/docker.sock + peer2.org1.example.com: + container_name: peer2.org1.example.com + image: hyperledger/fabric-peer:latest + labels: + service: hyperledger-fabric + environment: + #Generic peer variables + - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock + - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=fabric_test + volumes: + - ./docker/peercfg:/etc/hyperledger/peercfg + - ${DOCKER_SOCK}:/host/var/run/docker.sock + + peer3.org1.example.com: + container_name: peer3.org1.example.com + image: hyperledger/fabric-peer:latest + labels: + service: hyperledger-fabric + environment: + #Generic peer variables + - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock + - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=fabric_test + volumes: + - ./docker/peercfg:/etc/hyperledger/peercfg + - ${DOCKER_SOCK}:/host/var/run/docker.sock + cli: container_name: cli image: hyperledger/fabric-tools:latest diff --git a/test-network/configtx/configtx.yaml b/test-network/configtx/configtx.yaml index 6f783e2a..64679de0 100644 --- a/test-network/configtx/configtx.yaml +++ b/test-network/configtx/configtx.yaml @@ -61,6 +61,15 @@ Organizations: Endorsement: Type: Signature Rule: "OR('Org1MSP.peer')" + AnchorPeers: + - Host: peer0.org1.example.com + Port: 7051 + - Host: peer1.org1.example.com + Port: 7061 + - Host: peer2.org1.example.com + Port: 7071 + - Host: peer3.org1.example.com + Port: 7081 - &Org2 # DefaultOrg defines the organization which is used in the sampleconfig # of the fabric.git development environment diff --git a/test-network/network.sh b/test-network/network.sh index c790f1ae..b0453ffc 100755 --- a/test-network/network.sh +++ b/test-network/network.sh @@ -173,17 +173,37 @@ function createOrgs() { fatalln "Failed to generate certificates..." fi - infoln "Creating Org2 Identities" + # infoln "Creating Org2 Identities" - set -x - cryptogen generate --config=./organizations/cryptogen/crypto-config-org2.yaml --output="organizations" - res=$? - { set +x; } 2>/dev/null - if [ $res -ne 0 ]; then - fatalln "Failed to generate certificates..." - fi + # set -x + # cryptogen generate --config=./organizations/cryptogen/crypto-config-org2.yaml --output="organizations" + # res=$? + # { set +x; } 2>/dev/null + # if [ $res -ne 0 ]; then + # fatalln "Failed to generate certificates..." + # fi - infoln "Creating Orderer Org Identities" + #infoln "Creating Org3 Identities" + + # set -x + # cryptogen generate --config=./organizations/cryptogen/crypto-config-org3.yaml --output="organizations" + # res=$? + # { set +x; } 2>/dev/null + # if [ $res -ne 0 ]; then + # fatalln "Failed to generate certificates..." + # fi + + # infoln "Creating Org4 Identities" + + # set -x + # cryptogen generate --config=./organizations/cryptogen/crypto-config-org4.yaml --output="organizations" + # res=$? + # { set +x; } 2>/dev/null + # if [ $res -ne 0 ]; then + # fatalln "Failed to generate certificates..." + # fi + + # infoln "Creating Orderer Org Identities" set -x cryptogen generate --config=./organizations/cryptogen/crypto-config-orderer.yaml --output="organizations" @@ -235,9 +255,9 @@ function createOrgs() { createOrg1 - infoln "Creating Org2 Identities" + # infoln "Creating Org2 Identities" - createOrg2 + # createOrg2 infoln "Creating Orderer Org Identities" @@ -245,7 +265,7 @@ function createOrgs() { fi - infoln "Generating CCP files for Org1 and Org2" + infoln "Generating CCP files for Org1" ./organizations/ccp-generate.sh } diff --git a/test-network/organizations/ccp-generate.sh b/test-network/organizations/ccp-generate.sh index 7e091d0b..43af0e7b 100755 --- a/test-network/organizations/ccp-generate.sh +++ b/test-network/organizations/ccp-generate.sh @@ -35,11 +35,31 @@ CAPEM=organizations/peerOrganizations/org1.example.com/ca/ca.org1.example.com-ce echo "$(json_ccp $ORG $P0PORT $CAPORT $PEERPEM $CAPEM)" > organizations/peerOrganizations/org1.example.com/connection-org1.json echo "$(yaml_ccp $ORG $P0PORT $CAPORT $PEERPEM $CAPEM)" > organizations/peerOrganizations/org1.example.com/connection-org1.yaml -ORG=2 -P0PORT=9051 -CAPORT=8054 -PEERPEM=organizations/peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem -CAPEM=organizations/peerOrganizations/org2.example.com/ca/ca.org2.example.com-cert.pem +# ORG=2 +# P0PORT=9051 +# CAPORT=8054 +# PEERPEM=organizations/peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem +# CAPEM=organizations/peerOrganizations/org2.example.com/ca/ca.org2.example.com-cert.pem -echo "$(json_ccp $ORG $P0PORT $CAPORT $PEERPEM $CAPEM)" > organizations/peerOrganizations/org2.example.com/connection-org2.json -echo "$(yaml_ccp $ORG $P0PORT $CAPORT $PEERPEM $CAPEM)" > organizations/peerOrganizations/org2.example.com/connection-org2.yaml +# echo "$(json_ccp $ORG $P0PORT $CAPORT $PEERPEM $CAPEM)" > organizations/peerOrganizations/org2.example.com/connection-org2.json +# echo "$(yaml_ccp $ORG $P0PORT $CAPORT $PEERPEM $CAPEM)" > organizations/peerOrganizations/org2.example.com/connection-org2.yaml + +# ORG=3 +# P0PORT=9151 +# CAPORT=8154 +# PEERPEM=organizations/peerOrganizations/org3.example.com/tlsca/tlsca.org3.example.com-cert.pem +# CAPEM=organizations/peerOrganizations/org3.example.com/ca/ca.org3.example.com-cert.pem +# PEERCOUNT=3 + +# echo "$(json_ccp $ORG $P0PORT $CAPORT $PEERPEM $CAPEM $PEERCOUNT)" > organizations/peerOrganizations/org3.example.com/connection-org3.json +# echo "$(yaml_ccp $ORG $P0PORT $CAPORT $PEERPEM $CAPEM $PEERCOUNT)" > organizations/peerOrganizations/org3.example.com/connection-org3.yaml + +# ORG=4 +# P0PORT=9251 +# CAPORT=8254 +# PEERPEM=organizations/peerOrganizations/org4.example.com/tlsca/tlsca.org4.example.com-cert.pem +# CAPEM=organizations/peerOrganizations/org4.example.com/ca/ca.org4.example.com-cert.pem +# PEERCOUNT=4 + +# echo "$(json_ccp $ORG $P0PORT $CAPORT $PEERPEM $CAPEM $PEERCOUNT)" > organizations/peerOrganizations/org4.example.com/connection-org4.json +# echo "$(yaml_ccp $ORG $P0PORT $CAPORT $PEERPEM $CAPEM $PEERCOUNT)" > organizations/peerOrganizations/org4.example.com/connection-org4.yaml diff --git a/test-network/organizations/cryptogen/crypto-config-org2.yaml b/test-network/organizations/cryptogen/crypto-config-org2.yaml index 6298ff6d..66af47be 100755 --- a/test-network/organizations/cryptogen/crypto-config-org2.yaml +++ b/test-network/organizations/cryptogen/crypto-config-org2.yaml @@ -47,7 +47,7 @@ PeerOrgs: # name collisions # --------------------------------------------------------------------------- Template: - Count: 1 + Count: 2 SANS: - localhost # Start: 5 @@ -58,4 +58,4 @@ PeerOrgs: # Count: The number of user accounts _in addition_ to Admin # --------------------------------------------------------------------------- Users: - Count: 1 + Count: 2 diff --git a/test-network/organizations/cryptogen/crypto-config-org3.yaml b/test-network/organizations/cryptogen/crypto-config-org3.yaml new file mode 100755 index 00000000..7ceacd42 --- /dev/null +++ b/test-network/organizations/cryptogen/crypto-config-org3.yaml @@ -0,0 +1,61 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# + + +# --------------------------------------------------------------------------- +# "PeerOrgs" - Definition of organizations managing peer nodes +# --------------------------------------------------------------------------- +PeerOrgs: + # --------------------------------------------------------------------------- + # Org1 + # --------------------------------------------------------------------------- + - Name: Org3 + Domain: org3.example.com + EnableNodeOUs: true + # --------------------------------------------------------------------------- + # "Specs" + # --------------------------------------------------------------------------- + # Uncomment this section to enable the explicit definition of hosts in your + # configuration. Most users will want to use Template, below + # + # Specs is an array of Spec entries. Each Spec entry consists of two fields: + # - Hostname: (Required) The desired hostname, sans the domain. + # - CommonName: (Optional) Specifies the template or explicit override for + # the CN. By default, this is the template: + # + # "{{.Hostname}}.{{.Domain}}" + # + # which obtains its values from the Spec.Hostname and + # Org.Domain, respectively. + # --------------------------------------------------------------------------- + # - Hostname: foo # implicitly "foo.org1.example.com" + # CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above + # - Hostname: bar + # - Hostname: baz + # --------------------------------------------------------------------------- + # "Template" + # --------------------------------------------------------------------------- + # Allows for the definition of 1 or more hosts that are created sequentially + # from a template. By default, this looks like "peer%d" from 0 to Count-1. + # You may override the number of nodes (Count), the starting index (Start) + # or the template used to construct the name (Hostname). + # + # Note: Template and Specs are not mutually exclusive. You may define both + # sections and the aggregate nodes will be created for you. Take care with + # name collisions + # --------------------------------------------------------------------------- + Template: + Count: 3 + SANS: + - localhost + # Start: 5 + # Hostname: {{.Prefix}}{{.Index}} # default + # --------------------------------------------------------------------------- + # "Users" + # --------------------------------------------------------------------------- + # Count: The number of user accounts _in addition_ to Admin + # --------------------------------------------------------------------------- + Users: + Count: 3 diff --git a/test-network/organizations/cryptogen/crypto-config-org4.yaml b/test-network/organizations/cryptogen/crypto-config-org4.yaml new file mode 100755 index 00000000..3365a8ea --- /dev/null +++ b/test-network/organizations/cryptogen/crypto-config-org4.yaml @@ -0,0 +1,61 @@ +# Copyright IBM Corp. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# + + +# --------------------------------------------------------------------------- +# "PeerOrgs" - Definition of organizations managing peer nodes +# --------------------------------------------------------------------------- +PeerOrgs: + # --------------------------------------------------------------------------- + # Org1 + # --------------------------------------------------------------------------- + - Name: Org4 + Domain: org4.example.com + EnableNodeOUs: true + # --------------------------------------------------------------------------- + # "Specs" + # --------------------------------------------------------------------------- + # Uncomment this section to enable the explicit definition of hosts in your + # configuration. Most users will want to use Template, below + # + # Specs is an array of Spec entries. Each Spec entry consists of two fields: + # - Hostname: (Required) The desired hostname, sans the domain. + # - CommonName: (Optional) Specifies the template or explicit override for + # the CN. By default, this is the template: + # + # "{{.Hostname}}.{{.Domain}}" + # + # which obtains its values from the Spec.Hostname and + # Org.Domain, respectively. + # --------------------------------------------------------------------------- + # - Hostname: foo # implicitly "foo.org1.example.com" + # CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above + # - Hostname: bar + # - Hostname: baz + # --------------------------------------------------------------------------- + # "Template" + # --------------------------------------------------------------------------- + # Allows for the definition of 1 or more hosts that are created sequentially + # from a template. By default, this looks like "peer%d" from 0 to Count-1. + # You may override the number of nodes (Count), the starting index (Start) + # or the template used to construct the name (Hostname). + # + # Note: Template and Specs are not mutually exclusive. You may define both + # sections and the aggregate nodes will be created for you. Take care with + # name collisions + # --------------------------------------------------------------------------- + Template: + Count: 4 + SANS: + - localhost + # Start: 5 + # Hostname: {{.Prefix}}{{.Index}} # default + # --------------------------------------------------------------------------- + # "Users" + # --------------------------------------------------------------------------- + # Count: The number of user accounts _in addition_ to Admin + # --------------------------------------------------------------------------- + Users: + Count: 4 diff --git a/test-network/organizations/fabric-ca/registerEnroll.sh b/test-network/organizations/fabric-ca/registerEnroll.sh index 178db6cf..d1a157bc 100755 --- a/test-network/organizations/fabric-ca/registerEnroll.sh +++ b/test-network/organizations/fabric-ca/registerEnroll.sh @@ -44,6 +44,21 @@ function createOrg1() { fabric-ca-client register --caname ca-org1 --id.name peer0 --id.secret peer0pw --id.type peer --tls.certfiles "${PWD}/organizations/fabric-ca/org1/ca-cert.pem" { set +x; } 2>/dev/null + infoln "Registering peer1" + set -x + fabric-ca-client register --caname ca-org1 --id.name peer1 --id.secret peer1pw --id.type peer --tls.certfiles "${PWD}/organizations/fabric-ca/org1/ca-cert.pem" + { set +x; } 2>/dev/null + + infoln "Registering peer2" + set -x + fabric-ca-client register --caname ca-org1 --id.name peer2 --id.secret peer2pw --id.type peer --tls.certfiles "${PWD}/organizations/fabric-ca/org1/ca-cert.pem" + { set +x; } 2>/dev/null + + infoln "Registering peer3" + set -x + fabric-ca-client register --caname ca-org1 --id.name peer3 --id.secret peer3pw --id.type peer --tls.certfiles "${PWD}/organizations/fabric-ca/org1/ca-cert.pem" + { set +x; } 2>/dev/null + infoln "Registering user" set -x fabric-ca-client register --caname ca-org1 --id.name user1 --id.secret user1pw --id.type client --tls.certfiles "${PWD}/organizations/fabric-ca/org1/ca-cert.pem" diff --git a/test-network_org4.zip b/test-network_org4.zip new file mode 100644 index 0000000000000000000000000000000000000000..971623289b9237aa0b10fb0ab58019ee704af5d9 GIT binary patch literal 500887 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%0A=t`-tK!2m3y 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 z

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 r9t09Lh_-y3(}cMPj?9g~SOi7GwDR$$Dc& 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

qCLajQ(v;>t#{>g?;80j5 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

_w<^6&ncko--~Cp`Hdk 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 literal 0 HcmV?d00001