diff --git a/modules/chronik-client/.eslintignore b/modules/chronik-client/.eslintignore new file mode 100644 index 000000000..844dc5464 --- /dev/null +++ b/modules/chronik-client/.eslintignore @@ -0,0 +1,4 @@ +node_modules +dist +docs +/.eslintrc.js diff --git a/modules/chronik-client/.eslintrc.js b/modules/chronik-client/.eslintrc.js new file mode 100644 index 000000000..4606956a8 --- /dev/null +++ b/modules/chronik-client/.eslintrc.js @@ -0,0 +1,10 @@ +module.exports = { + root: true, + parser: "@typescript-eslint/parser", + plugins: ["@typescript-eslint"], + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "prettier", + ], +} diff --git a/modules/chronik-client/.gitignore b/modules/chronik-client/.gitignore new file mode 100644 index 000000000..b240b0f87 --- /dev/null +++ b/modules/chronik-client/.gitignore @@ -0,0 +1,6 @@ +# packaged dependencies +/node_modules + +# generated files +/dist +/docs diff --git a/modules/chronik-client/.prettierignore b/modules/chronik-client/.prettierignore new file mode 100644 index 000000000..67f1c5845 --- /dev/null +++ b/modules/chronik-client/.prettierignore @@ -0,0 +1,3 @@ +node_modules +docs +dist diff --git a/modules/chronik-client/README.md b/modules/chronik-client/README.md new file mode 100644 index 000000000..485940547 --- /dev/null +++ b/modules/chronik-client/README.md @@ -0,0 +1,68 @@ +# Chronik Indexer Client + +Access Chronik Indexer via browser or Node. + +## Installation + +`npm install chronik-client` + +`yarn add chronik-client` + +## Usage + +```js +import { ChronikClient } from "chronik-client" +// For XEC, eCash chain: +const chronik = new ChronikClient("https://chronik.be.cash/xec") +// For XPI, Lotus chain: +const chronik = new ChronikClient("https://chronik.be.cash/xpi") + +// Get Genesis block (on eCash): +const block = await chronik.block( + "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", +) + +// Get the first 11 blocks of the chain: +const blocks = await chronik.blocks(0, 10) + +// Get SLP tx details on eCash: +const tx = await chronik.tx( + "0f3c3908a2ddec8dea91d2fe1f77295bbbb158af869bff345d44ae800f0a5498", +) + +// Validate Genesis UTXO (considered 'unspent' by Chronik): +const validationResult = await chronik.validateUtxos([ + { + txid: "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", + outIdx: 0, + }, +]) + +const GENESIS_PK = + "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc" + + "3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f" +// Get first page of tx history of the Genesis pubkey, most recent first: +const history = await chronik + .script("p2pk", GENESIS_PK) + .history(/*page=*/ 0, /*page_size=*/ 10) +// Get all UTXOs of the Genesis pubkey: +const utxos = await chronik.script("p2pk", GENESIS_PK).utxos() + +// Listen to updates on scripts: +const ws = chronik.ws({ + onMessage: msg => { + console.log("Got update: ", msg) + }, + onReconnect: e => { + // Fired before a reconnect attempt is made: + console.log("Reconnecting websocket, disconnection cause: ", e) + }, +}) +// Wait for WS to be connected: +await ws.waitForOpen() +// Subscribe to scripts (on Lotus, current ABC payout address): +// Will give a message on avg every 2 minutes +ws.subscribe("p2pkh", "b8ae1c47effb58f72f7bca819fe7fc252f9e852e") +// Unsubscribe: +ws.unsubscribe("p2pkh", "b8ae1c47effb58f72f7bca819fe7fc252f9e852e") +``` diff --git a/modules/chronik-client/chronik.ts b/modules/chronik-client/chronik.ts new file mode 100644 index 000000000..06f6e0d97 --- /dev/null +++ b/modules/chronik-client/chronik.ts @@ -0,0 +1,3797 @@ +/* eslint-disable */ +import Long from "long" +import * as _m0 from "protobufjs/minimal" + +export const protobufPackage = "chronik" + +export enum SlpTokenType { + FUNGIBLE = 0, + NFT1_GROUP = 1, + NFT1_CHILD = 2, + UNKNOWN_TOKEN_TYPE = 3, + UNRECOGNIZED = -1, +} + +export function slpTokenTypeFromJSON(object: any): SlpTokenType { + switch (object) { + case 0: + case "FUNGIBLE": + return SlpTokenType.FUNGIBLE + case 1: + case "NFT1_GROUP": + return SlpTokenType.NFT1_GROUP + case 2: + case "NFT1_CHILD": + return SlpTokenType.NFT1_CHILD + case 3: + case "UNKNOWN_TOKEN_TYPE": + return SlpTokenType.UNKNOWN_TOKEN_TYPE + case -1: + case "UNRECOGNIZED": + default: + return SlpTokenType.UNRECOGNIZED + } +} + +export function slpTokenTypeToJSON(object: SlpTokenType): string { + switch (object) { + case SlpTokenType.FUNGIBLE: + return "FUNGIBLE" + case SlpTokenType.NFT1_GROUP: + return "NFT1_GROUP" + case SlpTokenType.NFT1_CHILD: + return "NFT1_CHILD" + case SlpTokenType.UNKNOWN_TOKEN_TYPE: + return "UNKNOWN_TOKEN_TYPE" + default: + return "UNKNOWN" + } +} + +export enum SlpTxType { + GENESIS = 0, + SEND = 1, + MINT = 2, + BURN = 4, + UNKNOWN_TX_TYPE = 3, + UNRECOGNIZED = -1, +} + +export function slpTxTypeFromJSON(object: any): SlpTxType { + switch (object) { + case 0: + case "GENESIS": + return SlpTxType.GENESIS + case 1: + case "SEND": + return SlpTxType.SEND + case 2: + case "MINT": + return SlpTxType.MINT + case 4: + case "BURN": + return SlpTxType.BURN + case 3: + case "UNKNOWN_TX_TYPE": + return SlpTxType.UNKNOWN_TX_TYPE + case -1: + case "UNRECOGNIZED": + default: + return SlpTxType.UNRECOGNIZED + } +} + +export function slpTxTypeToJSON(object: SlpTxType): string { + switch (object) { + case SlpTxType.GENESIS: + return "GENESIS" + case SlpTxType.SEND: + return "SEND" + case SlpTxType.MINT: + return "MINT" + case SlpTxType.BURN: + return "BURN" + case SlpTxType.UNKNOWN_TX_TYPE: + return "UNKNOWN_TX_TYPE" + default: + return "UNKNOWN" + } +} + +export enum Network { + BCH = 0, + XEC = 1, + XPI = 2, + XRG = 3, + UNRECOGNIZED = -1, +} + +export function networkFromJSON(object: any): Network { + switch (object) { + case 0: + case "BCH": + return Network.BCH + case 1: + case "XEC": + return Network.XEC + case 2: + case "XPI": + return Network.XPI + case 3: + case "XRG": + return Network.XRG + case -1: + case "UNRECOGNIZED": + default: + return Network.UNRECOGNIZED + } +} + +export function networkToJSON(object: Network): string { + switch (object) { + case Network.BCH: + return "BCH" + case Network.XEC: + return "XEC" + case Network.XPI: + return "XPI" + case Network.XRG: + return "XRG" + default: + return "UNKNOWN" + } +} + +export enum UtxoStateVariant { + UNSPENT = 0, + SPENT = 1, + NO_SUCH_TX = 2, + NO_SUCH_OUTPUT = 3, + UNRECOGNIZED = -1, +} + +export function utxoStateVariantFromJSON(object: any): UtxoStateVariant { + switch (object) { + case 0: + case "UNSPENT": + return UtxoStateVariant.UNSPENT + case 1: + case "SPENT": + return UtxoStateVariant.SPENT + case 2: + case "NO_SUCH_TX": + return UtxoStateVariant.NO_SUCH_TX + case 3: + case "NO_SUCH_OUTPUT": + return UtxoStateVariant.NO_SUCH_OUTPUT + case -1: + case "UNRECOGNIZED": + default: + return UtxoStateVariant.UNRECOGNIZED + } +} + +export function utxoStateVariantToJSON(object: UtxoStateVariant): string { + switch (object) { + case UtxoStateVariant.UNSPENT: + return "UNSPENT" + case UtxoStateVariant.SPENT: + return "SPENT" + case UtxoStateVariant.NO_SUCH_TX: + return "NO_SUCH_TX" + case UtxoStateVariant.NO_SUCH_OUTPUT: + return "NO_SUCH_OUTPUT" + default: + return "UNKNOWN" + } +} + +export interface ValidateUtxoRequest { + outpoints: OutPoint[] +} + +export interface ValidateUtxoResponse { + utxoStates: UtxoState[] +} + +export interface BroadcastTxRequest { + rawTx: Uint8Array + skipSlpCheck: boolean +} + +export interface BroadcastTxResponse { + txid: Uint8Array +} + +export interface BroadcastTxsRequest { + rawTxs: Uint8Array[] + skipSlpCheck: boolean +} + +export interface BroadcastTxsResponse { + txids: Uint8Array[] +} + +export interface BlockchainInfo { + tipHash: Uint8Array + tipHeight: number +} + +export interface Tx { + txid: Uint8Array + version: number + inputs: TxInput[] + outputs: TxOutput[] + lockTime: number + slpTxData: SlpTxData | undefined + slpErrorMsg: string + block: BlockMetadata | undefined + timeFirstSeen: string + size: number + isCoinbase: boolean + network: Network +} + +export interface Utxo { + outpoint: OutPoint | undefined + blockHeight: number + isCoinbase: boolean + value: string + slpMeta: SlpMeta | undefined + slpToken: SlpToken | undefined + network: Network +} + +export interface Token { + slpTxData: SlpTxData | undefined + tokenStats: TokenStats | undefined + block: BlockMetadata | undefined + timeFirstSeen: string + initialTokenQuantity: string + containsBaton: boolean + network: Network +} + +export interface BlockInfo { + hash: Uint8Array + prevHash: Uint8Array + height: number + nBits: number + timestamp: string + /** Block size of this block in bytes (including headers etc.) */ + blockSize: string + /** Number of txs in this block */ + numTxs: string + /** Total number of tx inputs in block (including coinbase) */ + numInputs: string + /** Total number of tx output in block (including coinbase) */ + numOutputs: string + /** Total number of satoshis spent by tx inputs */ + sumInputSats: string + /** Block reward for this block */ + sumCoinbaseOutputSats: string + /** Total number of satoshis in non-coinbase tx outputs */ + sumNormalOutputSats: string + /** Total number of satoshis burned using OP_RETURN */ + sumBurnedSats: string +} + +export interface BlockDetails { + version: number + merkleRoot: Uint8Array + nonce: string + medianTimestamp: string +} + +export interface Block { + blockInfo: BlockInfo | undefined + blockDetails: BlockDetails | undefined + rawHeader: Uint8Array + txs: Tx[] +} + +export interface ScriptUtxos { + outputScript: Uint8Array + utxos: Utxo[] +} + +export interface TxHistoryPage { + txs: Tx[] + numPages: number +} + +export interface Utxos { + scriptUtxos: ScriptUtxos[] +} + +export interface Blocks { + blocks: BlockInfo[] +} + +export interface SlpTxData { + slpMeta: SlpMeta | undefined + genesisInfo: SlpGenesisInfo | undefined +} + +export interface SlpMeta { + tokenType: SlpTokenType + txType: SlpTxType + tokenId: Uint8Array + groupTokenId: Uint8Array +} + +export interface TokenStats { + /** + * This doesn't fit into uint64, so we use a string with the decimal + * representation. If available, use i128 to parse, otherwise some + * BigNumber library. + */ + totalMinted: string + totalBurned: string +} + +export interface TxInput { + prevOut: OutPoint | undefined + inputScript: Uint8Array + outputScript: Uint8Array + value: string + sequenceNo: number + slpBurn: SlpBurn | undefined + slpToken: SlpToken | undefined +} + +export interface TxOutput { + value: string + outputScript: Uint8Array + slpToken: SlpToken | undefined + spentBy: OutPoint | undefined +} + +export interface BlockMetadata { + height: number + hash: Uint8Array + timestamp: string +} + +export interface OutPoint { + txid: Uint8Array + outIdx: number +} + +export interface SlpToken { + amount: string + isMintBaton: boolean +} + +export interface SlpBurn { + token: SlpToken | undefined + tokenId: Uint8Array +} + +export interface SlpGenesisInfo { + tokenTicker: Uint8Array + tokenName: Uint8Array + tokenDocumentUrl: Uint8Array + tokenDocumentHash: Uint8Array + decimals: number +} + +export interface UtxoState { + height: number + isConfirmed: boolean + state: UtxoStateVariant +} + +export interface Subscription { + scriptType: string + payload: Uint8Array + isSubscribe: boolean +} + +export interface SubscribeMsg { + error: Error | undefined + AddedToMempool: MsgAddedToMempool | undefined + RemovedFromMempool: MsgRemovedFromMempool | undefined + Confirmed: MsgConfirmed | undefined + Reorg: MsgReorg | undefined + BlockConnected: MsgBlockConnected | undefined + BlockDisconnected: MsgBlockDisconnected | undefined +} + +export interface MsgAddedToMempool { + txid: Uint8Array +} + +export interface MsgRemovedFromMempool { + txid: Uint8Array +} + +export interface MsgConfirmed { + txid: Uint8Array +} + +export interface MsgReorg { + txid: Uint8Array +} + +export interface MsgBlockConnected { + blockHash: Uint8Array +} + +export interface MsgBlockDisconnected { + blockHash: Uint8Array +} + +export interface Error { + errorCode: string + msg: string + isUserError: boolean +} + +function createBaseValidateUtxoRequest(): ValidateUtxoRequest { + return { outpoints: [] } +} + +export const ValidateUtxoRequest = { + encode( + message: ValidateUtxoRequest, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + for (const v of message.outpoints) { + OutPoint.encode(v!, writer.uint32(10).fork()).ldelim() + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ValidateUtxoRequest { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseValidateUtxoRequest() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.outpoints.push(OutPoint.decode(reader, reader.uint32())) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): ValidateUtxoRequest { + return { + outpoints: Array.isArray(object?.outpoints) + ? object.outpoints.map((e: any) => OutPoint.fromJSON(e)) + : [], + } + }, + + toJSON(message: ValidateUtxoRequest): unknown { + const obj: any = {} + if (message.outpoints) { + obj.outpoints = message.outpoints.map(e => + e ? OutPoint.toJSON(e) : undefined, + ) + } else { + obj.outpoints = [] + } + return obj + }, + + fromPartial, I>>( + object: I, + ): ValidateUtxoRequest { + const message = createBaseValidateUtxoRequest() + message.outpoints = + object.outpoints?.map(e => OutPoint.fromPartial(e)) || [] + return message + }, +} + +function createBaseValidateUtxoResponse(): ValidateUtxoResponse { + return { utxoStates: [] } +} + +export const ValidateUtxoResponse = { + encode( + message: ValidateUtxoResponse, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + for (const v of message.utxoStates) { + UtxoState.encode(v!, writer.uint32(10).fork()).ldelim() + } + return writer + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): ValidateUtxoResponse { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseValidateUtxoResponse() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.utxoStates.push(UtxoState.decode(reader, reader.uint32())) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): ValidateUtxoResponse { + return { + utxoStates: Array.isArray(object?.utxoStates) + ? object.utxoStates.map((e: any) => UtxoState.fromJSON(e)) + : [], + } + }, + + toJSON(message: ValidateUtxoResponse): unknown { + const obj: any = {} + if (message.utxoStates) { + obj.utxoStates = message.utxoStates.map(e => + e ? UtxoState.toJSON(e) : undefined, + ) + } else { + obj.utxoStates = [] + } + return obj + }, + + fromPartial, I>>( + object: I, + ): ValidateUtxoResponse { + const message = createBaseValidateUtxoResponse() + message.utxoStates = + object.utxoStates?.map(e => UtxoState.fromPartial(e)) || [] + return message + }, +} + +function createBaseBroadcastTxRequest(): BroadcastTxRequest { + return { rawTx: new Uint8Array(), skipSlpCheck: false } +} + +export const BroadcastTxRequest = { + encode( + message: BroadcastTxRequest, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.rawTx.length !== 0) { + writer.uint32(10).bytes(message.rawTx) + } + if (message.skipSlpCheck === true) { + writer.uint32(16).bool(message.skipSlpCheck) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): BroadcastTxRequest { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseBroadcastTxRequest() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.rawTx = reader.bytes() + break + case 2: + message.skipSlpCheck = reader.bool() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): BroadcastTxRequest { + return { + rawTx: isSet(object.rawTx) + ? bytesFromBase64(object.rawTx) + : new Uint8Array(), + skipSlpCheck: isSet(object.skipSlpCheck) + ? Boolean(object.skipSlpCheck) + : false, + } + }, + + toJSON(message: BroadcastTxRequest): unknown { + const obj: any = {} + message.rawTx !== undefined && + (obj.rawTx = base64FromBytes( + message.rawTx !== undefined ? message.rawTx : new Uint8Array(), + )) + message.skipSlpCheck !== undefined && + (obj.skipSlpCheck = message.skipSlpCheck) + return obj + }, + + fromPartial, I>>( + object: I, + ): BroadcastTxRequest { + const message = createBaseBroadcastTxRequest() + message.rawTx = object.rawTx ?? new Uint8Array() + message.skipSlpCheck = object.skipSlpCheck ?? false + return message + }, +} + +function createBaseBroadcastTxResponse(): BroadcastTxResponse { + return { txid: new Uint8Array() } +} + +export const BroadcastTxResponse = { + encode( + message: BroadcastTxResponse, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.txid.length !== 0) { + writer.uint32(10).bytes(message.txid) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): BroadcastTxResponse { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseBroadcastTxResponse() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.txid = reader.bytes() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): BroadcastTxResponse { + return { + txid: isSet(object.txid) + ? bytesFromBase64(object.txid) + : new Uint8Array(), + } + }, + + toJSON(message: BroadcastTxResponse): unknown { + const obj: any = {} + message.txid !== undefined && + (obj.txid = base64FromBytes( + message.txid !== undefined ? message.txid : new Uint8Array(), + )) + return obj + }, + + fromPartial, I>>( + object: I, + ): BroadcastTxResponse { + const message = createBaseBroadcastTxResponse() + message.txid = object.txid ?? new Uint8Array() + return message + }, +} + +function createBaseBroadcastTxsRequest(): BroadcastTxsRequest { + return { rawTxs: [], skipSlpCheck: false } +} + +export const BroadcastTxsRequest = { + encode( + message: BroadcastTxsRequest, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + for (const v of message.rawTxs) { + writer.uint32(10).bytes(v!) + } + if (message.skipSlpCheck === true) { + writer.uint32(16).bool(message.skipSlpCheck) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): BroadcastTxsRequest { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseBroadcastTxsRequest() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.rawTxs.push(reader.bytes()) + break + case 2: + message.skipSlpCheck = reader.bool() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): BroadcastTxsRequest { + return { + rawTxs: Array.isArray(object?.rawTxs) + ? object.rawTxs.map((e: any) => bytesFromBase64(e)) + : [], + skipSlpCheck: isSet(object.skipSlpCheck) + ? Boolean(object.skipSlpCheck) + : false, + } + }, + + toJSON(message: BroadcastTxsRequest): unknown { + const obj: any = {} + if (message.rawTxs) { + obj.rawTxs = message.rawTxs.map(e => + base64FromBytes(e !== undefined ? e : new Uint8Array()), + ) + } else { + obj.rawTxs = [] + } + message.skipSlpCheck !== undefined && + (obj.skipSlpCheck = message.skipSlpCheck) + return obj + }, + + fromPartial, I>>( + object: I, + ): BroadcastTxsRequest { + const message = createBaseBroadcastTxsRequest() + message.rawTxs = object.rawTxs?.map(e => e) || [] + message.skipSlpCheck = object.skipSlpCheck ?? false + return message + }, +} + +function createBaseBroadcastTxsResponse(): BroadcastTxsResponse { + return { txids: [] } +} + +export const BroadcastTxsResponse = { + encode( + message: BroadcastTxsResponse, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + for (const v of message.txids) { + writer.uint32(10).bytes(v!) + } + return writer + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): BroadcastTxsResponse { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseBroadcastTxsResponse() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.txids.push(reader.bytes()) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): BroadcastTxsResponse { + return { + txids: Array.isArray(object?.txids) + ? object.txids.map((e: any) => bytesFromBase64(e)) + : [], + } + }, + + toJSON(message: BroadcastTxsResponse): unknown { + const obj: any = {} + if (message.txids) { + obj.txids = message.txids.map(e => + base64FromBytes(e !== undefined ? e : new Uint8Array()), + ) + } else { + obj.txids = [] + } + return obj + }, + + fromPartial, I>>( + object: I, + ): BroadcastTxsResponse { + const message = createBaseBroadcastTxsResponse() + message.txids = object.txids?.map(e => e) || [] + return message + }, +} + +function createBaseBlockchainInfo(): BlockchainInfo { + return { tipHash: new Uint8Array(), tipHeight: 0 } +} + +export const BlockchainInfo = { + encode( + message: BlockchainInfo, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.tipHash.length !== 0) { + writer.uint32(10).bytes(message.tipHash) + } + if (message.tipHeight !== 0) { + writer.uint32(16).int32(message.tipHeight) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): BlockchainInfo { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseBlockchainInfo() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.tipHash = reader.bytes() + break + case 2: + message.tipHeight = reader.int32() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): BlockchainInfo { + return { + tipHash: isSet(object.tipHash) + ? bytesFromBase64(object.tipHash) + : new Uint8Array(), + tipHeight: isSet(object.tipHeight) ? Number(object.tipHeight) : 0, + } + }, + + toJSON(message: BlockchainInfo): unknown { + const obj: any = {} + message.tipHash !== undefined && + (obj.tipHash = base64FromBytes( + message.tipHash !== undefined ? message.tipHash : new Uint8Array(), + )) + message.tipHeight !== undefined && + (obj.tipHeight = Math.round(message.tipHeight)) + return obj + }, + + fromPartial, I>>( + object: I, + ): BlockchainInfo { + const message = createBaseBlockchainInfo() + message.tipHash = object.tipHash ?? new Uint8Array() + message.tipHeight = object.tipHeight ?? 0 + return message + }, +} + +function createBaseTx(): Tx { + return { + txid: new Uint8Array(), + version: 0, + inputs: [], + outputs: [], + lockTime: 0, + slpTxData: undefined, + slpErrorMsg: "", + block: undefined, + timeFirstSeen: "0", + size: 0, + isCoinbase: false, + network: 0, + } +} + +export const Tx = { + encode(message: Tx, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.txid.length !== 0) { + writer.uint32(10).bytes(message.txid) + } + if (message.version !== 0) { + writer.uint32(16).int32(message.version) + } + for (const v of message.inputs) { + TxInput.encode(v!, writer.uint32(26).fork()).ldelim() + } + for (const v of message.outputs) { + TxOutput.encode(v!, writer.uint32(34).fork()).ldelim() + } + if (message.lockTime !== 0) { + writer.uint32(40).uint32(message.lockTime) + } + if (message.slpTxData !== undefined) { + SlpTxData.encode(message.slpTxData, writer.uint32(50).fork()).ldelim() + } + if (message.slpErrorMsg !== "") { + writer.uint32(58).string(message.slpErrorMsg) + } + if (message.block !== undefined) { + BlockMetadata.encode(message.block, writer.uint32(66).fork()).ldelim() + } + if (message.timeFirstSeen !== "0") { + writer.uint32(72).int64(message.timeFirstSeen) + } + if (message.size !== 0) { + writer.uint32(88).uint32(message.size) + } + if (message.isCoinbase === true) { + writer.uint32(96).bool(message.isCoinbase) + } + if (message.network !== 0) { + writer.uint32(80).int32(message.network) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Tx { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseTx() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.txid = reader.bytes() + break + case 2: + message.version = reader.int32() + break + case 3: + message.inputs.push(TxInput.decode(reader, reader.uint32())) + break + case 4: + message.outputs.push(TxOutput.decode(reader, reader.uint32())) + break + case 5: + message.lockTime = reader.uint32() + break + case 6: + message.slpTxData = SlpTxData.decode(reader, reader.uint32()) + break + case 7: + message.slpErrorMsg = reader.string() + break + case 8: + message.block = BlockMetadata.decode(reader, reader.uint32()) + break + case 9: + message.timeFirstSeen = longToString(reader.int64() as Long) + break + case 11: + message.size = reader.uint32() + break + case 12: + message.isCoinbase = reader.bool() + break + case 10: + message.network = reader.int32() as any + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): Tx { + return { + txid: isSet(object.txid) + ? bytesFromBase64(object.txid) + : new Uint8Array(), + version: isSet(object.version) ? Number(object.version) : 0, + inputs: Array.isArray(object?.inputs) + ? object.inputs.map((e: any) => TxInput.fromJSON(e)) + : [], + outputs: Array.isArray(object?.outputs) + ? object.outputs.map((e: any) => TxOutput.fromJSON(e)) + : [], + lockTime: isSet(object.lockTime) ? Number(object.lockTime) : 0, + slpTxData: isSet(object.slpTxData) + ? SlpTxData.fromJSON(object.slpTxData) + : undefined, + slpErrorMsg: isSet(object.slpErrorMsg) ? String(object.slpErrorMsg) : "", + block: isSet(object.block) + ? BlockMetadata.fromJSON(object.block) + : undefined, + timeFirstSeen: isSet(object.timeFirstSeen) + ? String(object.timeFirstSeen) + : "0", + size: isSet(object.size) ? Number(object.size) : 0, + isCoinbase: isSet(object.isCoinbase) ? Boolean(object.isCoinbase) : false, + network: isSet(object.network) ? networkFromJSON(object.network) : 0, + } + }, + + toJSON(message: Tx): unknown { + const obj: any = {} + message.txid !== undefined && + (obj.txid = base64FromBytes( + message.txid !== undefined ? message.txid : new Uint8Array(), + )) + message.version !== undefined && (obj.version = Math.round(message.version)) + if (message.inputs) { + obj.inputs = message.inputs.map(e => (e ? TxInput.toJSON(e) : undefined)) + } else { + obj.inputs = [] + } + if (message.outputs) { + obj.outputs = message.outputs.map(e => + e ? TxOutput.toJSON(e) : undefined, + ) + } else { + obj.outputs = [] + } + message.lockTime !== undefined && + (obj.lockTime = Math.round(message.lockTime)) + message.slpTxData !== undefined && + (obj.slpTxData = message.slpTxData + ? SlpTxData.toJSON(message.slpTxData) + : undefined) + message.slpErrorMsg !== undefined && (obj.slpErrorMsg = message.slpErrorMsg) + message.block !== undefined && + (obj.block = message.block + ? BlockMetadata.toJSON(message.block) + : undefined) + message.timeFirstSeen !== undefined && + (obj.timeFirstSeen = message.timeFirstSeen) + message.size !== undefined && (obj.size = Math.round(message.size)) + message.isCoinbase !== undefined && (obj.isCoinbase = message.isCoinbase) + message.network !== undefined && + (obj.network = networkToJSON(message.network)) + return obj + }, + + fromPartial, I>>(object: I): Tx { + const message = createBaseTx() + message.txid = object.txid ?? new Uint8Array() + message.version = object.version ?? 0 + message.inputs = object.inputs?.map(e => TxInput.fromPartial(e)) || [] + message.outputs = object.outputs?.map(e => TxOutput.fromPartial(e)) || [] + message.lockTime = object.lockTime ?? 0 + message.slpTxData = + object.slpTxData !== undefined && object.slpTxData !== null + ? SlpTxData.fromPartial(object.slpTxData) + : undefined + message.slpErrorMsg = object.slpErrorMsg ?? "" + message.block = + object.block !== undefined && object.block !== null + ? BlockMetadata.fromPartial(object.block) + : undefined + message.timeFirstSeen = object.timeFirstSeen ?? "0" + message.size = object.size ?? 0 + message.isCoinbase = object.isCoinbase ?? false + message.network = object.network ?? 0 + return message + }, +} + +function createBaseUtxo(): Utxo { + return { + outpoint: undefined, + blockHeight: 0, + isCoinbase: false, + value: "0", + slpMeta: undefined, + slpToken: undefined, + network: 0, + } +} + +export const Utxo = { + encode(message: Utxo, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.outpoint !== undefined) { + OutPoint.encode(message.outpoint, writer.uint32(10).fork()).ldelim() + } + if (message.blockHeight !== 0) { + writer.uint32(16).int32(message.blockHeight) + } + if (message.isCoinbase === true) { + writer.uint32(24).bool(message.isCoinbase) + } + if (message.value !== "0") { + writer.uint32(40).int64(message.value) + } + if (message.slpMeta !== undefined) { + SlpMeta.encode(message.slpMeta, writer.uint32(50).fork()).ldelim() + } + if (message.slpToken !== undefined) { + SlpToken.encode(message.slpToken, writer.uint32(58).fork()).ldelim() + } + if (message.network !== 0) { + writer.uint32(72).int32(message.network) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Utxo { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseUtxo() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.outpoint = OutPoint.decode(reader, reader.uint32()) + break + case 2: + message.blockHeight = reader.int32() + break + case 3: + message.isCoinbase = reader.bool() + break + case 5: + message.value = longToString(reader.int64() as Long) + break + case 6: + message.slpMeta = SlpMeta.decode(reader, reader.uint32()) + break + case 7: + message.slpToken = SlpToken.decode(reader, reader.uint32()) + break + case 9: + message.network = reader.int32() as any + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): Utxo { + return { + outpoint: isSet(object.outpoint) + ? OutPoint.fromJSON(object.outpoint) + : undefined, + blockHeight: isSet(object.blockHeight) ? Number(object.blockHeight) : 0, + isCoinbase: isSet(object.isCoinbase) ? Boolean(object.isCoinbase) : false, + value: isSet(object.value) ? String(object.value) : "0", + slpMeta: isSet(object.slpMeta) + ? SlpMeta.fromJSON(object.slpMeta) + : undefined, + slpToken: isSet(object.slpToken) + ? SlpToken.fromJSON(object.slpToken) + : undefined, + network: isSet(object.network) ? networkFromJSON(object.network) : 0, + } + }, + + toJSON(message: Utxo): unknown { + const obj: any = {} + message.outpoint !== undefined && + (obj.outpoint = message.outpoint + ? OutPoint.toJSON(message.outpoint) + : undefined) + message.blockHeight !== undefined && + (obj.blockHeight = Math.round(message.blockHeight)) + message.isCoinbase !== undefined && (obj.isCoinbase = message.isCoinbase) + message.value !== undefined && (obj.value = message.value) + message.slpMeta !== undefined && + (obj.slpMeta = message.slpMeta + ? SlpMeta.toJSON(message.slpMeta) + : undefined) + message.slpToken !== undefined && + (obj.slpToken = message.slpToken + ? SlpToken.toJSON(message.slpToken) + : undefined) + message.network !== undefined && + (obj.network = networkToJSON(message.network)) + return obj + }, + + fromPartial, I>>(object: I): Utxo { + const message = createBaseUtxo() + message.outpoint = + object.outpoint !== undefined && object.outpoint !== null + ? OutPoint.fromPartial(object.outpoint) + : undefined + message.blockHeight = object.blockHeight ?? 0 + message.isCoinbase = object.isCoinbase ?? false + message.value = object.value ?? "0" + message.slpMeta = + object.slpMeta !== undefined && object.slpMeta !== null + ? SlpMeta.fromPartial(object.slpMeta) + : undefined + message.slpToken = + object.slpToken !== undefined && object.slpToken !== null + ? SlpToken.fromPartial(object.slpToken) + : undefined + message.network = object.network ?? 0 + return message + }, +} + +function createBaseToken(): Token { + return { + slpTxData: undefined, + tokenStats: undefined, + block: undefined, + timeFirstSeen: "0", + initialTokenQuantity: "0", + containsBaton: false, + network: 0, + } +} + +export const Token = { + encode(message: Token, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.slpTxData !== undefined) { + SlpTxData.encode(message.slpTxData, writer.uint32(10).fork()).ldelim() + } + if (message.tokenStats !== undefined) { + TokenStats.encode(message.tokenStats, writer.uint32(18).fork()).ldelim() + } + if (message.block !== undefined) { + BlockMetadata.encode(message.block, writer.uint32(26).fork()).ldelim() + } + if (message.timeFirstSeen !== "0") { + writer.uint32(32).int64(message.timeFirstSeen) + } + if (message.initialTokenQuantity !== "0") { + writer.uint32(40).uint64(message.initialTokenQuantity) + } + if (message.containsBaton === true) { + writer.uint32(48).bool(message.containsBaton) + } + if (message.network !== 0) { + writer.uint32(56).int32(message.network) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Token { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseToken() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.slpTxData = SlpTxData.decode(reader, reader.uint32()) + break + case 2: + message.tokenStats = TokenStats.decode(reader, reader.uint32()) + break + case 3: + message.block = BlockMetadata.decode(reader, reader.uint32()) + break + case 4: + message.timeFirstSeen = longToString(reader.int64() as Long) + break + case 5: + message.initialTokenQuantity = longToString(reader.uint64() as Long) + break + case 6: + message.containsBaton = reader.bool() + break + case 7: + message.network = reader.int32() as any + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): Token { + return { + slpTxData: isSet(object.slpTxData) + ? SlpTxData.fromJSON(object.slpTxData) + : undefined, + tokenStats: isSet(object.tokenStats) + ? TokenStats.fromJSON(object.tokenStats) + : undefined, + block: isSet(object.block) + ? BlockMetadata.fromJSON(object.block) + : undefined, + timeFirstSeen: isSet(object.timeFirstSeen) + ? String(object.timeFirstSeen) + : "0", + initialTokenQuantity: isSet(object.initialTokenQuantity) + ? String(object.initialTokenQuantity) + : "0", + containsBaton: isSet(object.containsBaton) + ? Boolean(object.containsBaton) + : false, + network: isSet(object.network) ? networkFromJSON(object.network) : 0, + } + }, + + toJSON(message: Token): unknown { + const obj: any = {} + message.slpTxData !== undefined && + (obj.slpTxData = message.slpTxData + ? SlpTxData.toJSON(message.slpTxData) + : undefined) + message.tokenStats !== undefined && + (obj.tokenStats = message.tokenStats + ? TokenStats.toJSON(message.tokenStats) + : undefined) + message.block !== undefined && + (obj.block = message.block + ? BlockMetadata.toJSON(message.block) + : undefined) + message.timeFirstSeen !== undefined && + (obj.timeFirstSeen = message.timeFirstSeen) + message.initialTokenQuantity !== undefined && + (obj.initialTokenQuantity = message.initialTokenQuantity) + message.containsBaton !== undefined && + (obj.containsBaton = message.containsBaton) + message.network !== undefined && + (obj.network = networkToJSON(message.network)) + return obj + }, + + fromPartial, I>>(object: I): Token { + const message = createBaseToken() + message.slpTxData = + object.slpTxData !== undefined && object.slpTxData !== null + ? SlpTxData.fromPartial(object.slpTxData) + : undefined + message.tokenStats = + object.tokenStats !== undefined && object.tokenStats !== null + ? TokenStats.fromPartial(object.tokenStats) + : undefined + message.block = + object.block !== undefined && object.block !== null + ? BlockMetadata.fromPartial(object.block) + : undefined + message.timeFirstSeen = object.timeFirstSeen ?? "0" + message.initialTokenQuantity = object.initialTokenQuantity ?? "0" + message.containsBaton = object.containsBaton ?? false + message.network = object.network ?? 0 + return message + }, +} + +function createBaseBlockInfo(): BlockInfo { + return { + hash: new Uint8Array(), + prevHash: new Uint8Array(), + height: 0, + nBits: 0, + timestamp: "0", + blockSize: "0", + numTxs: "0", + numInputs: "0", + numOutputs: "0", + sumInputSats: "0", + sumCoinbaseOutputSats: "0", + sumNormalOutputSats: "0", + sumBurnedSats: "0", + } +} + +export const BlockInfo = { + encode( + message: BlockInfo, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.hash.length !== 0) { + writer.uint32(10).bytes(message.hash) + } + if (message.prevHash.length !== 0) { + writer.uint32(18).bytes(message.prevHash) + } + if (message.height !== 0) { + writer.uint32(24).int32(message.height) + } + if (message.nBits !== 0) { + writer.uint32(32).uint32(message.nBits) + } + if (message.timestamp !== "0") { + writer.uint32(40).int64(message.timestamp) + } + if (message.blockSize !== "0") { + writer.uint32(48).uint64(message.blockSize) + } + if (message.numTxs !== "0") { + writer.uint32(56).uint64(message.numTxs) + } + if (message.numInputs !== "0") { + writer.uint32(64).uint64(message.numInputs) + } + if (message.numOutputs !== "0") { + writer.uint32(72).uint64(message.numOutputs) + } + if (message.sumInputSats !== "0") { + writer.uint32(80).int64(message.sumInputSats) + } + if (message.sumCoinbaseOutputSats !== "0") { + writer.uint32(88).int64(message.sumCoinbaseOutputSats) + } + if (message.sumNormalOutputSats !== "0") { + writer.uint32(96).int64(message.sumNormalOutputSats) + } + if (message.sumBurnedSats !== "0") { + writer.uint32(104).int64(message.sumBurnedSats) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): BlockInfo { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseBlockInfo() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.hash = reader.bytes() + break + case 2: + message.prevHash = reader.bytes() + break + case 3: + message.height = reader.int32() + break + case 4: + message.nBits = reader.uint32() + break + case 5: + message.timestamp = longToString(reader.int64() as Long) + break + case 6: + message.blockSize = longToString(reader.uint64() as Long) + break + case 7: + message.numTxs = longToString(reader.uint64() as Long) + break + case 8: + message.numInputs = longToString(reader.uint64() as Long) + break + case 9: + message.numOutputs = longToString(reader.uint64() as Long) + break + case 10: + message.sumInputSats = longToString(reader.int64() as Long) + break + case 11: + message.sumCoinbaseOutputSats = longToString(reader.int64() as Long) + break + case 12: + message.sumNormalOutputSats = longToString(reader.int64() as Long) + break + case 13: + message.sumBurnedSats = longToString(reader.int64() as Long) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): BlockInfo { + return { + hash: isSet(object.hash) + ? bytesFromBase64(object.hash) + : new Uint8Array(), + prevHash: isSet(object.prevHash) + ? bytesFromBase64(object.prevHash) + : new Uint8Array(), + height: isSet(object.height) ? Number(object.height) : 0, + nBits: isSet(object.nBits) ? Number(object.nBits) : 0, + timestamp: isSet(object.timestamp) ? String(object.timestamp) : "0", + blockSize: isSet(object.blockSize) ? String(object.blockSize) : "0", + numTxs: isSet(object.numTxs) ? String(object.numTxs) : "0", + numInputs: isSet(object.numInputs) ? String(object.numInputs) : "0", + numOutputs: isSet(object.numOutputs) ? String(object.numOutputs) : "0", + sumInputSats: isSet(object.sumInputSats) + ? String(object.sumInputSats) + : "0", + sumCoinbaseOutputSats: isSet(object.sumCoinbaseOutputSats) + ? String(object.sumCoinbaseOutputSats) + : "0", + sumNormalOutputSats: isSet(object.sumNormalOutputSats) + ? String(object.sumNormalOutputSats) + : "0", + sumBurnedSats: isSet(object.sumBurnedSats) + ? String(object.sumBurnedSats) + : "0", + } + }, + + toJSON(message: BlockInfo): unknown { + const obj: any = {} + message.hash !== undefined && + (obj.hash = base64FromBytes( + message.hash !== undefined ? message.hash : new Uint8Array(), + )) + message.prevHash !== undefined && + (obj.prevHash = base64FromBytes( + message.prevHash !== undefined ? message.prevHash : new Uint8Array(), + )) + message.height !== undefined && (obj.height = Math.round(message.height)) + message.nBits !== undefined && (obj.nBits = Math.round(message.nBits)) + message.timestamp !== undefined && (obj.timestamp = message.timestamp) + message.blockSize !== undefined && (obj.blockSize = message.blockSize) + message.numTxs !== undefined && (obj.numTxs = message.numTxs) + message.numInputs !== undefined && (obj.numInputs = message.numInputs) + message.numOutputs !== undefined && (obj.numOutputs = message.numOutputs) + message.sumInputSats !== undefined && + (obj.sumInputSats = message.sumInputSats) + message.sumCoinbaseOutputSats !== undefined && + (obj.sumCoinbaseOutputSats = message.sumCoinbaseOutputSats) + message.sumNormalOutputSats !== undefined && + (obj.sumNormalOutputSats = message.sumNormalOutputSats) + message.sumBurnedSats !== undefined && + (obj.sumBurnedSats = message.sumBurnedSats) + return obj + }, + + fromPartial, I>>( + object: I, + ): BlockInfo { + const message = createBaseBlockInfo() + message.hash = object.hash ?? new Uint8Array() + message.prevHash = object.prevHash ?? new Uint8Array() + message.height = object.height ?? 0 + message.nBits = object.nBits ?? 0 + message.timestamp = object.timestamp ?? "0" + message.blockSize = object.blockSize ?? "0" + message.numTxs = object.numTxs ?? "0" + message.numInputs = object.numInputs ?? "0" + message.numOutputs = object.numOutputs ?? "0" + message.sumInputSats = object.sumInputSats ?? "0" + message.sumCoinbaseOutputSats = object.sumCoinbaseOutputSats ?? "0" + message.sumNormalOutputSats = object.sumNormalOutputSats ?? "0" + message.sumBurnedSats = object.sumBurnedSats ?? "0" + return message + }, +} + +function createBaseBlockDetails(): BlockDetails { + return { + version: 0, + merkleRoot: new Uint8Array(), + nonce: "0", + medianTimestamp: "0", + } +} + +export const BlockDetails = { + encode( + message: BlockDetails, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.version !== 0) { + writer.uint32(8).int32(message.version) + } + if (message.merkleRoot.length !== 0) { + writer.uint32(18).bytes(message.merkleRoot) + } + if (message.nonce !== "0") { + writer.uint32(24).uint64(message.nonce) + } + if (message.medianTimestamp !== "0") { + writer.uint32(32).int64(message.medianTimestamp) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): BlockDetails { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseBlockDetails() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.version = reader.int32() + break + case 2: + message.merkleRoot = reader.bytes() + break + case 3: + message.nonce = longToString(reader.uint64() as Long) + break + case 4: + message.medianTimestamp = longToString(reader.int64() as Long) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): BlockDetails { + return { + version: isSet(object.version) ? Number(object.version) : 0, + merkleRoot: isSet(object.merkleRoot) + ? bytesFromBase64(object.merkleRoot) + : new Uint8Array(), + nonce: isSet(object.nonce) ? String(object.nonce) : "0", + medianTimestamp: isSet(object.medianTimestamp) + ? String(object.medianTimestamp) + : "0", + } + }, + + toJSON(message: BlockDetails): unknown { + const obj: any = {} + message.version !== undefined && (obj.version = Math.round(message.version)) + message.merkleRoot !== undefined && + (obj.merkleRoot = base64FromBytes( + message.merkleRoot !== undefined + ? message.merkleRoot + : new Uint8Array(), + )) + message.nonce !== undefined && (obj.nonce = message.nonce) + message.medianTimestamp !== undefined && + (obj.medianTimestamp = message.medianTimestamp) + return obj + }, + + fromPartial, I>>( + object: I, + ): BlockDetails { + const message = createBaseBlockDetails() + message.version = object.version ?? 0 + message.merkleRoot = object.merkleRoot ?? new Uint8Array() + message.nonce = object.nonce ?? "0" + message.medianTimestamp = object.medianTimestamp ?? "0" + return message + }, +} + +function createBaseBlock(): Block { + return { + blockInfo: undefined, + blockDetails: undefined, + rawHeader: new Uint8Array(), + txs: [], + } +} + +export const Block = { + encode(message: Block, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.blockInfo !== undefined) { + BlockInfo.encode(message.blockInfo, writer.uint32(10).fork()).ldelim() + } + if (message.blockDetails !== undefined) { + BlockDetails.encode( + message.blockDetails, + writer.uint32(26).fork(), + ).ldelim() + } + if (message.rawHeader.length !== 0) { + writer.uint32(34).bytes(message.rawHeader) + } + for (const v of message.txs) { + Tx.encode(v!, writer.uint32(18).fork()).ldelim() + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Block { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseBlock() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.blockInfo = BlockInfo.decode(reader, reader.uint32()) + break + case 3: + message.blockDetails = BlockDetails.decode(reader, reader.uint32()) + break + case 4: + message.rawHeader = reader.bytes() + break + case 2: + message.txs.push(Tx.decode(reader, reader.uint32())) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): Block { + return { + blockInfo: isSet(object.blockInfo) + ? BlockInfo.fromJSON(object.blockInfo) + : undefined, + blockDetails: isSet(object.blockDetails) + ? BlockDetails.fromJSON(object.blockDetails) + : undefined, + rawHeader: isSet(object.rawHeader) + ? bytesFromBase64(object.rawHeader) + : new Uint8Array(), + txs: Array.isArray(object?.txs) + ? object.txs.map((e: any) => Tx.fromJSON(e)) + : [], + } + }, + + toJSON(message: Block): unknown { + const obj: any = {} + message.blockInfo !== undefined && + (obj.blockInfo = message.blockInfo + ? BlockInfo.toJSON(message.blockInfo) + : undefined) + message.blockDetails !== undefined && + (obj.blockDetails = message.blockDetails + ? BlockDetails.toJSON(message.blockDetails) + : undefined) + message.rawHeader !== undefined && + (obj.rawHeader = base64FromBytes( + message.rawHeader !== undefined ? message.rawHeader : new Uint8Array(), + )) + if (message.txs) { + obj.txs = message.txs.map(e => (e ? Tx.toJSON(e) : undefined)) + } else { + obj.txs = [] + } + return obj + }, + + fromPartial, I>>(object: I): Block { + const message = createBaseBlock() + message.blockInfo = + object.blockInfo !== undefined && object.blockInfo !== null + ? BlockInfo.fromPartial(object.blockInfo) + : undefined + message.blockDetails = + object.blockDetails !== undefined && object.blockDetails !== null + ? BlockDetails.fromPartial(object.blockDetails) + : undefined + message.rawHeader = object.rawHeader ?? new Uint8Array() + message.txs = object.txs?.map(e => Tx.fromPartial(e)) || [] + return message + }, +} + +function createBaseScriptUtxos(): ScriptUtxos { + return { outputScript: new Uint8Array(), utxos: [] } +} + +export const ScriptUtxos = { + encode( + message: ScriptUtxos, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.outputScript.length !== 0) { + writer.uint32(10).bytes(message.outputScript) + } + for (const v of message.utxos) { + Utxo.encode(v!, writer.uint32(18).fork()).ldelim() + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): ScriptUtxos { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseScriptUtxos() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.outputScript = reader.bytes() + break + case 2: + message.utxos.push(Utxo.decode(reader, reader.uint32())) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): ScriptUtxos { + return { + outputScript: isSet(object.outputScript) + ? bytesFromBase64(object.outputScript) + : new Uint8Array(), + utxos: Array.isArray(object?.utxos) + ? object.utxos.map((e: any) => Utxo.fromJSON(e)) + : [], + } + }, + + toJSON(message: ScriptUtxos): unknown { + const obj: any = {} + message.outputScript !== undefined && + (obj.outputScript = base64FromBytes( + message.outputScript !== undefined + ? message.outputScript + : new Uint8Array(), + )) + if (message.utxos) { + obj.utxos = message.utxos.map(e => (e ? Utxo.toJSON(e) : undefined)) + } else { + obj.utxos = [] + } + return obj + }, + + fromPartial, I>>( + object: I, + ): ScriptUtxos { + const message = createBaseScriptUtxos() + message.outputScript = object.outputScript ?? new Uint8Array() + message.utxos = object.utxos?.map(e => Utxo.fromPartial(e)) || [] + return message + }, +} + +function createBaseTxHistoryPage(): TxHistoryPage { + return { txs: [], numPages: 0 } +} + +export const TxHistoryPage = { + encode( + message: TxHistoryPage, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + for (const v of message.txs) { + Tx.encode(v!, writer.uint32(10).fork()).ldelim() + } + if (message.numPages !== 0) { + writer.uint32(16).uint32(message.numPages) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TxHistoryPage { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseTxHistoryPage() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.txs.push(Tx.decode(reader, reader.uint32())) + break + case 2: + message.numPages = reader.uint32() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): TxHistoryPage { + return { + txs: Array.isArray(object?.txs) + ? object.txs.map((e: any) => Tx.fromJSON(e)) + : [], + numPages: isSet(object.numPages) ? Number(object.numPages) : 0, + } + }, + + toJSON(message: TxHistoryPage): unknown { + const obj: any = {} + if (message.txs) { + obj.txs = message.txs.map(e => (e ? Tx.toJSON(e) : undefined)) + } else { + obj.txs = [] + } + message.numPages !== undefined && + (obj.numPages = Math.round(message.numPages)) + return obj + }, + + fromPartial, I>>( + object: I, + ): TxHistoryPage { + const message = createBaseTxHistoryPage() + message.txs = object.txs?.map(e => Tx.fromPartial(e)) || [] + message.numPages = object.numPages ?? 0 + return message + }, +} + +function createBaseUtxos(): Utxos { + return { scriptUtxos: [] } +} + +export const Utxos = { + encode(message: Utxos, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + for (const v of message.scriptUtxos) { + ScriptUtxos.encode(v!, writer.uint32(10).fork()).ldelim() + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Utxos { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseUtxos() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.scriptUtxos.push(ScriptUtxos.decode(reader, reader.uint32())) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): Utxos { + return { + scriptUtxos: Array.isArray(object?.scriptUtxos) + ? object.scriptUtxos.map((e: any) => ScriptUtxos.fromJSON(e)) + : [], + } + }, + + toJSON(message: Utxos): unknown { + const obj: any = {} + if (message.scriptUtxos) { + obj.scriptUtxos = message.scriptUtxos.map(e => + e ? ScriptUtxos.toJSON(e) : undefined, + ) + } else { + obj.scriptUtxos = [] + } + return obj + }, + + fromPartial, I>>(object: I): Utxos { + const message = createBaseUtxos() + message.scriptUtxos = + object.scriptUtxos?.map(e => ScriptUtxos.fromPartial(e)) || [] + return message + }, +} + +function createBaseBlocks(): Blocks { + return { blocks: [] } +} + +export const Blocks = { + encode( + message: Blocks, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + for (const v of message.blocks) { + BlockInfo.encode(v!, writer.uint32(10).fork()).ldelim() + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Blocks { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseBlocks() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.blocks.push(BlockInfo.decode(reader, reader.uint32())) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): Blocks { + return { + blocks: Array.isArray(object?.blocks) + ? object.blocks.map((e: any) => BlockInfo.fromJSON(e)) + : [], + } + }, + + toJSON(message: Blocks): unknown { + const obj: any = {} + if (message.blocks) { + obj.blocks = message.blocks.map(e => + e ? BlockInfo.toJSON(e) : undefined, + ) + } else { + obj.blocks = [] + } + return obj + }, + + fromPartial, I>>(object: I): Blocks { + const message = createBaseBlocks() + message.blocks = object.blocks?.map(e => BlockInfo.fromPartial(e)) || [] + return message + }, +} + +function createBaseSlpTxData(): SlpTxData { + return { slpMeta: undefined, genesisInfo: undefined } +} + +export const SlpTxData = { + encode( + message: SlpTxData, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.slpMeta !== undefined) { + SlpMeta.encode(message.slpMeta, writer.uint32(10).fork()).ldelim() + } + if (message.genesisInfo !== undefined) { + SlpGenesisInfo.encode( + message.genesisInfo, + writer.uint32(18).fork(), + ).ldelim() + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SlpTxData { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseSlpTxData() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.slpMeta = SlpMeta.decode(reader, reader.uint32()) + break + case 2: + message.genesisInfo = SlpGenesisInfo.decode(reader, reader.uint32()) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): SlpTxData { + return { + slpMeta: isSet(object.slpMeta) + ? SlpMeta.fromJSON(object.slpMeta) + : undefined, + genesisInfo: isSet(object.genesisInfo) + ? SlpGenesisInfo.fromJSON(object.genesisInfo) + : undefined, + } + }, + + toJSON(message: SlpTxData): unknown { + const obj: any = {} + message.slpMeta !== undefined && + (obj.slpMeta = message.slpMeta + ? SlpMeta.toJSON(message.slpMeta) + : undefined) + message.genesisInfo !== undefined && + (obj.genesisInfo = message.genesisInfo + ? SlpGenesisInfo.toJSON(message.genesisInfo) + : undefined) + return obj + }, + + fromPartial, I>>( + object: I, + ): SlpTxData { + const message = createBaseSlpTxData() + message.slpMeta = + object.slpMeta !== undefined && object.slpMeta !== null + ? SlpMeta.fromPartial(object.slpMeta) + : undefined + message.genesisInfo = + object.genesisInfo !== undefined && object.genesisInfo !== null + ? SlpGenesisInfo.fromPartial(object.genesisInfo) + : undefined + return message + }, +} + +function createBaseSlpMeta(): SlpMeta { + return { + tokenType: 0, + txType: 0, + tokenId: new Uint8Array(), + groupTokenId: new Uint8Array(), + } +} + +export const SlpMeta = { + encode( + message: SlpMeta, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.tokenType !== 0) { + writer.uint32(8).int32(message.tokenType) + } + if (message.txType !== 0) { + writer.uint32(16).int32(message.txType) + } + if (message.tokenId.length !== 0) { + writer.uint32(26).bytes(message.tokenId) + } + if (message.groupTokenId.length !== 0) { + writer.uint32(34).bytes(message.groupTokenId) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SlpMeta { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseSlpMeta() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.tokenType = reader.int32() as any + break + case 2: + message.txType = reader.int32() as any + break + case 3: + message.tokenId = reader.bytes() + break + case 4: + message.groupTokenId = reader.bytes() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): SlpMeta { + return { + tokenType: isSet(object.tokenType) + ? slpTokenTypeFromJSON(object.tokenType) + : 0, + txType: isSet(object.txType) ? slpTxTypeFromJSON(object.txType) : 0, + tokenId: isSet(object.tokenId) + ? bytesFromBase64(object.tokenId) + : new Uint8Array(), + groupTokenId: isSet(object.groupTokenId) + ? bytesFromBase64(object.groupTokenId) + : new Uint8Array(), + } + }, + + toJSON(message: SlpMeta): unknown { + const obj: any = {} + message.tokenType !== undefined && + (obj.tokenType = slpTokenTypeToJSON(message.tokenType)) + message.txType !== undefined && + (obj.txType = slpTxTypeToJSON(message.txType)) + message.tokenId !== undefined && + (obj.tokenId = base64FromBytes( + message.tokenId !== undefined ? message.tokenId : new Uint8Array(), + )) + message.groupTokenId !== undefined && + (obj.groupTokenId = base64FromBytes( + message.groupTokenId !== undefined + ? message.groupTokenId + : new Uint8Array(), + )) + return obj + }, + + fromPartial, I>>(object: I): SlpMeta { + const message = createBaseSlpMeta() + message.tokenType = object.tokenType ?? 0 + message.txType = object.txType ?? 0 + message.tokenId = object.tokenId ?? new Uint8Array() + message.groupTokenId = object.groupTokenId ?? new Uint8Array() + return message + }, +} + +function createBaseTokenStats(): TokenStats { + return { totalMinted: "", totalBurned: "" } +} + +export const TokenStats = { + encode( + message: TokenStats, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.totalMinted !== "") { + writer.uint32(10).string(message.totalMinted) + } + if (message.totalBurned !== "") { + writer.uint32(18).string(message.totalBurned) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TokenStats { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseTokenStats() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.totalMinted = reader.string() + break + case 2: + message.totalBurned = reader.string() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): TokenStats { + return { + totalMinted: isSet(object.totalMinted) ? String(object.totalMinted) : "", + totalBurned: isSet(object.totalBurned) ? String(object.totalBurned) : "", + } + }, + + toJSON(message: TokenStats): unknown { + const obj: any = {} + message.totalMinted !== undefined && (obj.totalMinted = message.totalMinted) + message.totalBurned !== undefined && (obj.totalBurned = message.totalBurned) + return obj + }, + + fromPartial, I>>( + object: I, + ): TokenStats { + const message = createBaseTokenStats() + message.totalMinted = object.totalMinted ?? "" + message.totalBurned = object.totalBurned ?? "" + return message + }, +} + +function createBaseTxInput(): TxInput { + return { + prevOut: undefined, + inputScript: new Uint8Array(), + outputScript: new Uint8Array(), + value: "0", + sequenceNo: 0, + slpBurn: undefined, + slpToken: undefined, + } +} + +export const TxInput = { + encode( + message: TxInput, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.prevOut !== undefined) { + OutPoint.encode(message.prevOut, writer.uint32(10).fork()).ldelim() + } + if (message.inputScript.length !== 0) { + writer.uint32(18).bytes(message.inputScript) + } + if (message.outputScript.length !== 0) { + writer.uint32(26).bytes(message.outputScript) + } + if (message.value !== "0") { + writer.uint32(32).int64(message.value) + } + if (message.sequenceNo !== 0) { + writer.uint32(40).uint32(message.sequenceNo) + } + if (message.slpBurn !== undefined) { + SlpBurn.encode(message.slpBurn, writer.uint32(50).fork()).ldelim() + } + if (message.slpToken !== undefined) { + SlpToken.encode(message.slpToken, writer.uint32(58).fork()).ldelim() + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TxInput { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseTxInput() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.prevOut = OutPoint.decode(reader, reader.uint32()) + break + case 2: + message.inputScript = reader.bytes() + break + case 3: + message.outputScript = reader.bytes() + break + case 4: + message.value = longToString(reader.int64() as Long) + break + case 5: + message.sequenceNo = reader.uint32() + break + case 6: + message.slpBurn = SlpBurn.decode(reader, reader.uint32()) + break + case 7: + message.slpToken = SlpToken.decode(reader, reader.uint32()) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): TxInput { + return { + prevOut: isSet(object.prevOut) + ? OutPoint.fromJSON(object.prevOut) + : undefined, + inputScript: isSet(object.inputScript) + ? bytesFromBase64(object.inputScript) + : new Uint8Array(), + outputScript: isSet(object.outputScript) + ? bytesFromBase64(object.outputScript) + : new Uint8Array(), + value: isSet(object.value) ? String(object.value) : "0", + sequenceNo: isSet(object.sequenceNo) ? Number(object.sequenceNo) : 0, + slpBurn: isSet(object.slpBurn) + ? SlpBurn.fromJSON(object.slpBurn) + : undefined, + slpToken: isSet(object.slpToken) + ? SlpToken.fromJSON(object.slpToken) + : undefined, + } + }, + + toJSON(message: TxInput): unknown { + const obj: any = {} + message.prevOut !== undefined && + (obj.prevOut = message.prevOut + ? OutPoint.toJSON(message.prevOut) + : undefined) + message.inputScript !== undefined && + (obj.inputScript = base64FromBytes( + message.inputScript !== undefined + ? message.inputScript + : new Uint8Array(), + )) + message.outputScript !== undefined && + (obj.outputScript = base64FromBytes( + message.outputScript !== undefined + ? message.outputScript + : new Uint8Array(), + )) + message.value !== undefined && (obj.value = message.value) + message.sequenceNo !== undefined && + (obj.sequenceNo = Math.round(message.sequenceNo)) + message.slpBurn !== undefined && + (obj.slpBurn = message.slpBurn + ? SlpBurn.toJSON(message.slpBurn) + : undefined) + message.slpToken !== undefined && + (obj.slpToken = message.slpToken + ? SlpToken.toJSON(message.slpToken) + : undefined) + return obj + }, + + fromPartial, I>>(object: I): TxInput { + const message = createBaseTxInput() + message.prevOut = + object.prevOut !== undefined && object.prevOut !== null + ? OutPoint.fromPartial(object.prevOut) + : undefined + message.inputScript = object.inputScript ?? new Uint8Array() + message.outputScript = object.outputScript ?? new Uint8Array() + message.value = object.value ?? "0" + message.sequenceNo = object.sequenceNo ?? 0 + message.slpBurn = + object.slpBurn !== undefined && object.slpBurn !== null + ? SlpBurn.fromPartial(object.slpBurn) + : undefined + message.slpToken = + object.slpToken !== undefined && object.slpToken !== null + ? SlpToken.fromPartial(object.slpToken) + : undefined + return message + }, +} + +function createBaseTxOutput(): TxOutput { + return { + value: "0", + outputScript: new Uint8Array(), + slpToken: undefined, + spentBy: undefined, + } +} + +export const TxOutput = { + encode( + message: TxOutput, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.value !== "0") { + writer.uint32(8).int64(message.value) + } + if (message.outputScript.length !== 0) { + writer.uint32(18).bytes(message.outputScript) + } + if (message.slpToken !== undefined) { + SlpToken.encode(message.slpToken, writer.uint32(26).fork()).ldelim() + } + if (message.spentBy !== undefined) { + OutPoint.encode(message.spentBy, writer.uint32(34).fork()).ldelim() + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): TxOutput { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseTxOutput() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.value = longToString(reader.int64() as Long) + break + case 2: + message.outputScript = reader.bytes() + break + case 3: + message.slpToken = SlpToken.decode(reader, reader.uint32()) + break + case 4: + message.spentBy = OutPoint.decode(reader, reader.uint32()) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): TxOutput { + return { + value: isSet(object.value) ? String(object.value) : "0", + outputScript: isSet(object.outputScript) + ? bytesFromBase64(object.outputScript) + : new Uint8Array(), + slpToken: isSet(object.slpToken) + ? SlpToken.fromJSON(object.slpToken) + : undefined, + spentBy: isSet(object.spentBy) + ? OutPoint.fromJSON(object.spentBy) + : undefined, + } + }, + + toJSON(message: TxOutput): unknown { + const obj: any = {} + message.value !== undefined && (obj.value = message.value) + message.outputScript !== undefined && + (obj.outputScript = base64FromBytes( + message.outputScript !== undefined + ? message.outputScript + : new Uint8Array(), + )) + message.slpToken !== undefined && + (obj.slpToken = message.slpToken + ? SlpToken.toJSON(message.slpToken) + : undefined) + message.spentBy !== undefined && + (obj.spentBy = message.spentBy + ? OutPoint.toJSON(message.spentBy) + : undefined) + return obj + }, + + fromPartial, I>>(object: I): TxOutput { + const message = createBaseTxOutput() + message.value = object.value ?? "0" + message.outputScript = object.outputScript ?? new Uint8Array() + message.slpToken = + object.slpToken !== undefined && object.slpToken !== null + ? SlpToken.fromPartial(object.slpToken) + : undefined + message.spentBy = + object.spentBy !== undefined && object.spentBy !== null + ? OutPoint.fromPartial(object.spentBy) + : undefined + return message + }, +} + +function createBaseBlockMetadata(): BlockMetadata { + return { height: 0, hash: new Uint8Array(), timestamp: "0" } +} + +export const BlockMetadata = { + encode( + message: BlockMetadata, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.height !== 0) { + writer.uint32(8).int32(message.height) + } + if (message.hash.length !== 0) { + writer.uint32(18).bytes(message.hash) + } + if (message.timestamp !== "0") { + writer.uint32(24).int64(message.timestamp) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): BlockMetadata { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseBlockMetadata() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.height = reader.int32() + break + case 2: + message.hash = reader.bytes() + break + case 3: + message.timestamp = longToString(reader.int64() as Long) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): BlockMetadata { + return { + height: isSet(object.height) ? Number(object.height) : 0, + hash: isSet(object.hash) + ? bytesFromBase64(object.hash) + : new Uint8Array(), + timestamp: isSet(object.timestamp) ? String(object.timestamp) : "0", + } + }, + + toJSON(message: BlockMetadata): unknown { + const obj: any = {} + message.height !== undefined && (obj.height = Math.round(message.height)) + message.hash !== undefined && + (obj.hash = base64FromBytes( + message.hash !== undefined ? message.hash : new Uint8Array(), + )) + message.timestamp !== undefined && (obj.timestamp = message.timestamp) + return obj + }, + + fromPartial, I>>( + object: I, + ): BlockMetadata { + const message = createBaseBlockMetadata() + message.height = object.height ?? 0 + message.hash = object.hash ?? new Uint8Array() + message.timestamp = object.timestamp ?? "0" + return message + }, +} + +function createBaseOutPoint(): OutPoint { + return { txid: new Uint8Array(), outIdx: 0 } +} + +export const OutPoint = { + encode( + message: OutPoint, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.txid.length !== 0) { + writer.uint32(10).bytes(message.txid) + } + if (message.outIdx !== 0) { + writer.uint32(16).uint32(message.outIdx) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): OutPoint { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseOutPoint() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.txid = reader.bytes() + break + case 2: + message.outIdx = reader.uint32() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): OutPoint { + return { + txid: isSet(object.txid) + ? bytesFromBase64(object.txid) + : new Uint8Array(), + outIdx: isSet(object.outIdx) ? Number(object.outIdx) : 0, + } + }, + + toJSON(message: OutPoint): unknown { + const obj: any = {} + message.txid !== undefined && + (obj.txid = base64FromBytes( + message.txid !== undefined ? message.txid : new Uint8Array(), + )) + message.outIdx !== undefined && (obj.outIdx = Math.round(message.outIdx)) + return obj + }, + + fromPartial, I>>(object: I): OutPoint { + const message = createBaseOutPoint() + message.txid = object.txid ?? new Uint8Array() + message.outIdx = object.outIdx ?? 0 + return message + }, +} + +function createBaseSlpToken(): SlpToken { + return { amount: "0", isMintBaton: false } +} + +export const SlpToken = { + encode( + message: SlpToken, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.amount !== "0") { + writer.uint32(8).uint64(message.amount) + } + if (message.isMintBaton === true) { + writer.uint32(16).bool(message.isMintBaton) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SlpToken { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseSlpToken() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.amount = longToString(reader.uint64() as Long) + break + case 2: + message.isMintBaton = reader.bool() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): SlpToken { + return { + amount: isSet(object.amount) ? String(object.amount) : "0", + isMintBaton: isSet(object.isMintBaton) + ? Boolean(object.isMintBaton) + : false, + } + }, + + toJSON(message: SlpToken): unknown { + const obj: any = {} + message.amount !== undefined && (obj.amount = message.amount) + message.isMintBaton !== undefined && (obj.isMintBaton = message.isMintBaton) + return obj + }, + + fromPartial, I>>(object: I): SlpToken { + const message = createBaseSlpToken() + message.amount = object.amount ?? "0" + message.isMintBaton = object.isMintBaton ?? false + return message + }, +} + +function createBaseSlpBurn(): SlpBurn { + return { token: undefined, tokenId: new Uint8Array() } +} + +export const SlpBurn = { + encode( + message: SlpBurn, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.token !== undefined) { + SlpToken.encode(message.token, writer.uint32(10).fork()).ldelim() + } + if (message.tokenId.length !== 0) { + writer.uint32(18).bytes(message.tokenId) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SlpBurn { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseSlpBurn() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.token = SlpToken.decode(reader, reader.uint32()) + break + case 2: + message.tokenId = reader.bytes() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): SlpBurn { + return { + token: isSet(object.token) ? SlpToken.fromJSON(object.token) : undefined, + tokenId: isSet(object.tokenId) + ? bytesFromBase64(object.tokenId) + : new Uint8Array(), + } + }, + + toJSON(message: SlpBurn): unknown { + const obj: any = {} + message.token !== undefined && + (obj.token = message.token ? SlpToken.toJSON(message.token) : undefined) + message.tokenId !== undefined && + (obj.tokenId = base64FromBytes( + message.tokenId !== undefined ? message.tokenId : new Uint8Array(), + )) + return obj + }, + + fromPartial, I>>(object: I): SlpBurn { + const message = createBaseSlpBurn() + message.token = + object.token !== undefined && object.token !== null + ? SlpToken.fromPartial(object.token) + : undefined + message.tokenId = object.tokenId ?? new Uint8Array() + return message + }, +} + +function createBaseSlpGenesisInfo(): SlpGenesisInfo { + return { + tokenTicker: new Uint8Array(), + tokenName: new Uint8Array(), + tokenDocumentUrl: new Uint8Array(), + tokenDocumentHash: new Uint8Array(), + decimals: 0, + } +} + +export const SlpGenesisInfo = { + encode( + message: SlpGenesisInfo, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.tokenTicker.length !== 0) { + writer.uint32(10).bytes(message.tokenTicker) + } + if (message.tokenName.length !== 0) { + writer.uint32(18).bytes(message.tokenName) + } + if (message.tokenDocumentUrl.length !== 0) { + writer.uint32(26).bytes(message.tokenDocumentUrl) + } + if (message.tokenDocumentHash.length !== 0) { + writer.uint32(34).bytes(message.tokenDocumentHash) + } + if (message.decimals !== 0) { + writer.uint32(40).uint32(message.decimals) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SlpGenesisInfo { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseSlpGenesisInfo() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.tokenTicker = reader.bytes() + break + case 2: + message.tokenName = reader.bytes() + break + case 3: + message.tokenDocumentUrl = reader.bytes() + break + case 4: + message.tokenDocumentHash = reader.bytes() + break + case 5: + message.decimals = reader.uint32() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): SlpGenesisInfo { + return { + tokenTicker: isSet(object.tokenTicker) + ? bytesFromBase64(object.tokenTicker) + : new Uint8Array(), + tokenName: isSet(object.tokenName) + ? bytesFromBase64(object.tokenName) + : new Uint8Array(), + tokenDocumentUrl: isSet(object.tokenDocumentUrl) + ? bytesFromBase64(object.tokenDocumentUrl) + : new Uint8Array(), + tokenDocumentHash: isSet(object.tokenDocumentHash) + ? bytesFromBase64(object.tokenDocumentHash) + : new Uint8Array(), + decimals: isSet(object.decimals) ? Number(object.decimals) : 0, + } + }, + + toJSON(message: SlpGenesisInfo): unknown { + const obj: any = {} + message.tokenTicker !== undefined && + (obj.tokenTicker = base64FromBytes( + message.tokenTicker !== undefined + ? message.tokenTicker + : new Uint8Array(), + )) + message.tokenName !== undefined && + (obj.tokenName = base64FromBytes( + message.tokenName !== undefined ? message.tokenName : new Uint8Array(), + )) + message.tokenDocumentUrl !== undefined && + (obj.tokenDocumentUrl = base64FromBytes( + message.tokenDocumentUrl !== undefined + ? message.tokenDocumentUrl + : new Uint8Array(), + )) + message.tokenDocumentHash !== undefined && + (obj.tokenDocumentHash = base64FromBytes( + message.tokenDocumentHash !== undefined + ? message.tokenDocumentHash + : new Uint8Array(), + )) + message.decimals !== undefined && + (obj.decimals = Math.round(message.decimals)) + return obj + }, + + fromPartial, I>>( + object: I, + ): SlpGenesisInfo { + const message = createBaseSlpGenesisInfo() + message.tokenTicker = object.tokenTicker ?? new Uint8Array() + message.tokenName = object.tokenName ?? new Uint8Array() + message.tokenDocumentUrl = object.tokenDocumentUrl ?? new Uint8Array() + message.tokenDocumentHash = object.tokenDocumentHash ?? new Uint8Array() + message.decimals = object.decimals ?? 0 + return message + }, +} + +function createBaseUtxoState(): UtxoState { + return { height: 0, isConfirmed: false, state: 0 } +} + +export const UtxoState = { + encode( + message: UtxoState, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.height !== 0) { + writer.uint32(8).int32(message.height) + } + if (message.isConfirmed === true) { + writer.uint32(16).bool(message.isConfirmed) + } + if (message.state !== 0) { + writer.uint32(24).int32(message.state) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): UtxoState { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseUtxoState() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.height = reader.int32() + break + case 2: + message.isConfirmed = reader.bool() + break + case 3: + message.state = reader.int32() as any + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): UtxoState { + return { + height: isSet(object.height) ? Number(object.height) : 0, + isConfirmed: isSet(object.isConfirmed) + ? Boolean(object.isConfirmed) + : false, + state: isSet(object.state) ? utxoStateVariantFromJSON(object.state) : 0, + } + }, + + toJSON(message: UtxoState): unknown { + const obj: any = {} + message.height !== undefined && (obj.height = Math.round(message.height)) + message.isConfirmed !== undefined && (obj.isConfirmed = message.isConfirmed) + message.state !== undefined && + (obj.state = utxoStateVariantToJSON(message.state)) + return obj + }, + + fromPartial, I>>( + object: I, + ): UtxoState { + const message = createBaseUtxoState() + message.height = object.height ?? 0 + message.isConfirmed = object.isConfirmed ?? false + message.state = object.state ?? 0 + return message + }, +} + +function createBaseSubscription(): Subscription { + return { scriptType: "", payload: new Uint8Array(), isSubscribe: false } +} + +export const Subscription = { + encode( + message: Subscription, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.scriptType !== "") { + writer.uint32(10).string(message.scriptType) + } + if (message.payload.length !== 0) { + writer.uint32(18).bytes(message.payload) + } + if (message.isSubscribe === true) { + writer.uint32(24).bool(message.isSubscribe) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Subscription { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseSubscription() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.scriptType = reader.string() + break + case 2: + message.payload = reader.bytes() + break + case 3: + message.isSubscribe = reader.bool() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): Subscription { + return { + scriptType: isSet(object.scriptType) ? String(object.scriptType) : "", + payload: isSet(object.payload) + ? bytesFromBase64(object.payload) + : new Uint8Array(), + isSubscribe: isSet(object.isSubscribe) + ? Boolean(object.isSubscribe) + : false, + } + }, + + toJSON(message: Subscription): unknown { + const obj: any = {} + message.scriptType !== undefined && (obj.scriptType = message.scriptType) + message.payload !== undefined && + (obj.payload = base64FromBytes( + message.payload !== undefined ? message.payload : new Uint8Array(), + )) + message.isSubscribe !== undefined && (obj.isSubscribe = message.isSubscribe) + return obj + }, + + fromPartial, I>>( + object: I, + ): Subscription { + const message = createBaseSubscription() + message.scriptType = object.scriptType ?? "" + message.payload = object.payload ?? new Uint8Array() + message.isSubscribe = object.isSubscribe ?? false + return message + }, +} + +function createBaseSubscribeMsg(): SubscribeMsg { + return { + error: undefined, + AddedToMempool: undefined, + RemovedFromMempool: undefined, + Confirmed: undefined, + Reorg: undefined, + BlockConnected: undefined, + BlockDisconnected: undefined, + } +} + +export const SubscribeMsg = { + encode( + message: SubscribeMsg, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.error !== undefined) { + Error.encode(message.error, writer.uint32(10).fork()).ldelim() + } + if (message.AddedToMempool !== undefined) { + MsgAddedToMempool.encode( + message.AddedToMempool, + writer.uint32(18).fork(), + ).ldelim() + } + if (message.RemovedFromMempool !== undefined) { + MsgRemovedFromMempool.encode( + message.RemovedFromMempool, + writer.uint32(26).fork(), + ).ldelim() + } + if (message.Confirmed !== undefined) { + MsgConfirmed.encode(message.Confirmed, writer.uint32(34).fork()).ldelim() + } + if (message.Reorg !== undefined) { + MsgReorg.encode(message.Reorg, writer.uint32(42).fork()).ldelim() + } + if (message.BlockConnected !== undefined) { + MsgBlockConnected.encode( + message.BlockConnected, + writer.uint32(50).fork(), + ).ldelim() + } + if (message.BlockDisconnected !== undefined) { + MsgBlockDisconnected.encode( + message.BlockDisconnected, + writer.uint32(58).fork(), + ).ldelim() + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): SubscribeMsg { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseSubscribeMsg() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.error = Error.decode(reader, reader.uint32()) + break + case 2: + message.AddedToMempool = MsgAddedToMempool.decode( + reader, + reader.uint32(), + ) + break + case 3: + message.RemovedFromMempool = MsgRemovedFromMempool.decode( + reader, + reader.uint32(), + ) + break + case 4: + message.Confirmed = MsgConfirmed.decode(reader, reader.uint32()) + break + case 5: + message.Reorg = MsgReorg.decode(reader, reader.uint32()) + break + case 6: + message.BlockConnected = MsgBlockConnected.decode( + reader, + reader.uint32(), + ) + break + case 7: + message.BlockDisconnected = MsgBlockDisconnected.decode( + reader, + reader.uint32(), + ) + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): SubscribeMsg { + return { + error: isSet(object.error) ? Error.fromJSON(object.error) : undefined, + AddedToMempool: isSet(object.AddedToMempool) + ? MsgAddedToMempool.fromJSON(object.AddedToMempool) + : undefined, + RemovedFromMempool: isSet(object.RemovedFromMempool) + ? MsgRemovedFromMempool.fromJSON(object.RemovedFromMempool) + : undefined, + Confirmed: isSet(object.Confirmed) + ? MsgConfirmed.fromJSON(object.Confirmed) + : undefined, + Reorg: isSet(object.Reorg) ? MsgReorg.fromJSON(object.Reorg) : undefined, + BlockConnected: isSet(object.BlockConnected) + ? MsgBlockConnected.fromJSON(object.BlockConnected) + : undefined, + BlockDisconnected: isSet(object.BlockDisconnected) + ? MsgBlockDisconnected.fromJSON(object.BlockDisconnected) + : undefined, + } + }, + + toJSON(message: SubscribeMsg): unknown { + const obj: any = {} + message.error !== undefined && + (obj.error = message.error ? Error.toJSON(message.error) : undefined) + message.AddedToMempool !== undefined && + (obj.AddedToMempool = message.AddedToMempool + ? MsgAddedToMempool.toJSON(message.AddedToMempool) + : undefined) + message.RemovedFromMempool !== undefined && + (obj.RemovedFromMempool = message.RemovedFromMempool + ? MsgRemovedFromMempool.toJSON(message.RemovedFromMempool) + : undefined) + message.Confirmed !== undefined && + (obj.Confirmed = message.Confirmed + ? MsgConfirmed.toJSON(message.Confirmed) + : undefined) + message.Reorg !== undefined && + (obj.Reorg = message.Reorg ? MsgReorg.toJSON(message.Reorg) : undefined) + message.BlockConnected !== undefined && + (obj.BlockConnected = message.BlockConnected + ? MsgBlockConnected.toJSON(message.BlockConnected) + : undefined) + message.BlockDisconnected !== undefined && + (obj.BlockDisconnected = message.BlockDisconnected + ? MsgBlockDisconnected.toJSON(message.BlockDisconnected) + : undefined) + return obj + }, + + fromPartial, I>>( + object: I, + ): SubscribeMsg { + const message = createBaseSubscribeMsg() + message.error = + object.error !== undefined && object.error !== null + ? Error.fromPartial(object.error) + : undefined + message.AddedToMempool = + object.AddedToMempool !== undefined && object.AddedToMempool !== null + ? MsgAddedToMempool.fromPartial(object.AddedToMempool) + : undefined + message.RemovedFromMempool = + object.RemovedFromMempool !== undefined && + object.RemovedFromMempool !== null + ? MsgRemovedFromMempool.fromPartial(object.RemovedFromMempool) + : undefined + message.Confirmed = + object.Confirmed !== undefined && object.Confirmed !== null + ? MsgConfirmed.fromPartial(object.Confirmed) + : undefined + message.Reorg = + object.Reorg !== undefined && object.Reorg !== null + ? MsgReorg.fromPartial(object.Reorg) + : undefined + message.BlockConnected = + object.BlockConnected !== undefined && object.BlockConnected !== null + ? MsgBlockConnected.fromPartial(object.BlockConnected) + : undefined + message.BlockDisconnected = + object.BlockDisconnected !== undefined && + object.BlockDisconnected !== null + ? MsgBlockDisconnected.fromPartial(object.BlockDisconnected) + : undefined + return message + }, +} + +function createBaseMsgAddedToMempool(): MsgAddedToMempool { + return { txid: new Uint8Array() } +} + +export const MsgAddedToMempool = { + encode( + message: MsgAddedToMempool, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.txid.length !== 0) { + writer.uint32(10).bytes(message.txid) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MsgAddedToMempool { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseMsgAddedToMempool() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.txid = reader.bytes() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): MsgAddedToMempool { + return { + txid: isSet(object.txid) + ? bytesFromBase64(object.txid) + : new Uint8Array(), + } + }, + + toJSON(message: MsgAddedToMempool): unknown { + const obj: any = {} + message.txid !== undefined && + (obj.txid = base64FromBytes( + message.txid !== undefined ? message.txid : new Uint8Array(), + )) + return obj + }, + + fromPartial, I>>( + object: I, + ): MsgAddedToMempool { + const message = createBaseMsgAddedToMempool() + message.txid = object.txid ?? new Uint8Array() + return message + }, +} + +function createBaseMsgRemovedFromMempool(): MsgRemovedFromMempool { + return { txid: new Uint8Array() } +} + +export const MsgRemovedFromMempool = { + encode( + message: MsgRemovedFromMempool, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.txid.length !== 0) { + writer.uint32(10).bytes(message.txid) + } + return writer + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): MsgRemovedFromMempool { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseMsgRemovedFromMempool() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.txid = reader.bytes() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): MsgRemovedFromMempool { + return { + txid: isSet(object.txid) + ? bytesFromBase64(object.txid) + : new Uint8Array(), + } + }, + + toJSON(message: MsgRemovedFromMempool): unknown { + const obj: any = {} + message.txid !== undefined && + (obj.txid = base64FromBytes( + message.txid !== undefined ? message.txid : new Uint8Array(), + )) + return obj + }, + + fromPartial, I>>( + object: I, + ): MsgRemovedFromMempool { + const message = createBaseMsgRemovedFromMempool() + message.txid = object.txid ?? new Uint8Array() + return message + }, +} + +function createBaseMsgConfirmed(): MsgConfirmed { + return { txid: new Uint8Array() } +} + +export const MsgConfirmed = { + encode( + message: MsgConfirmed, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.txid.length !== 0) { + writer.uint32(10).bytes(message.txid) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MsgConfirmed { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseMsgConfirmed() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.txid = reader.bytes() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): MsgConfirmed { + return { + txid: isSet(object.txid) + ? bytesFromBase64(object.txid) + : new Uint8Array(), + } + }, + + toJSON(message: MsgConfirmed): unknown { + const obj: any = {} + message.txid !== undefined && + (obj.txid = base64FromBytes( + message.txid !== undefined ? message.txid : new Uint8Array(), + )) + return obj + }, + + fromPartial, I>>( + object: I, + ): MsgConfirmed { + const message = createBaseMsgConfirmed() + message.txid = object.txid ?? new Uint8Array() + return message + }, +} + +function createBaseMsgReorg(): MsgReorg { + return { txid: new Uint8Array() } +} + +export const MsgReorg = { + encode( + message: MsgReorg, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.txid.length !== 0) { + writer.uint32(10).bytes(message.txid) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MsgReorg { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseMsgReorg() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.txid = reader.bytes() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): MsgReorg { + return { + txid: isSet(object.txid) + ? bytesFromBase64(object.txid) + : new Uint8Array(), + } + }, + + toJSON(message: MsgReorg): unknown { + const obj: any = {} + message.txid !== undefined && + (obj.txid = base64FromBytes( + message.txid !== undefined ? message.txid : new Uint8Array(), + )) + return obj + }, + + fromPartial, I>>(object: I): MsgReorg { + const message = createBaseMsgReorg() + message.txid = object.txid ?? new Uint8Array() + return message + }, +} + +function createBaseMsgBlockConnected(): MsgBlockConnected { + return { blockHash: new Uint8Array() } +} + +export const MsgBlockConnected = { + encode( + message: MsgBlockConnected, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.blockHash.length !== 0) { + writer.uint32(10).bytes(message.blockHash) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): MsgBlockConnected { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseMsgBlockConnected() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.blockHash = reader.bytes() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): MsgBlockConnected { + return { + blockHash: isSet(object.blockHash) + ? bytesFromBase64(object.blockHash) + : new Uint8Array(), + } + }, + + toJSON(message: MsgBlockConnected): unknown { + const obj: any = {} + message.blockHash !== undefined && + (obj.blockHash = base64FromBytes( + message.blockHash !== undefined ? message.blockHash : new Uint8Array(), + )) + return obj + }, + + fromPartial, I>>( + object: I, + ): MsgBlockConnected { + const message = createBaseMsgBlockConnected() + message.blockHash = object.blockHash ?? new Uint8Array() + return message + }, +} + +function createBaseMsgBlockDisconnected(): MsgBlockDisconnected { + return { blockHash: new Uint8Array() } +} + +export const MsgBlockDisconnected = { + encode( + message: MsgBlockDisconnected, + writer: _m0.Writer = _m0.Writer.create(), + ): _m0.Writer { + if (message.blockHash.length !== 0) { + writer.uint32(10).bytes(message.blockHash) + } + return writer + }, + + decode( + input: _m0.Reader | Uint8Array, + length?: number, + ): MsgBlockDisconnected { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseMsgBlockDisconnected() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.blockHash = reader.bytes() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): MsgBlockDisconnected { + return { + blockHash: isSet(object.blockHash) + ? bytesFromBase64(object.blockHash) + : new Uint8Array(), + } + }, + + toJSON(message: MsgBlockDisconnected): unknown { + const obj: any = {} + message.blockHash !== undefined && + (obj.blockHash = base64FromBytes( + message.blockHash !== undefined ? message.blockHash : new Uint8Array(), + )) + return obj + }, + + fromPartial, I>>( + object: I, + ): MsgBlockDisconnected { + const message = createBaseMsgBlockDisconnected() + message.blockHash = object.blockHash ?? new Uint8Array() + return message + }, +} + +function createBaseError(): Error { + return { errorCode: "", msg: "", isUserError: false } +} + +export const Error = { + encode(message: Error, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { + if (message.errorCode !== "") { + writer.uint32(10).string(message.errorCode) + } + if (message.msg !== "") { + writer.uint32(18).string(message.msg) + } + if (message.isUserError === true) { + writer.uint32(24).bool(message.isUserError) + } + return writer + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): Error { + const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input) + let end = length === undefined ? reader.len : reader.pos + length + const message = createBaseError() + while (reader.pos < end) { + const tag = reader.uint32() + switch (tag >>> 3) { + case 1: + message.errorCode = reader.string() + break + case 2: + message.msg = reader.string() + break + case 3: + message.isUserError = reader.bool() + break + default: + reader.skipType(tag & 7) + break + } + } + return message + }, + + fromJSON(object: any): Error { + return { + errorCode: isSet(object.errorCode) ? String(object.errorCode) : "", + msg: isSet(object.msg) ? String(object.msg) : "", + isUserError: isSet(object.isUserError) + ? Boolean(object.isUserError) + : false, + } + }, + + toJSON(message: Error): unknown { + const obj: any = {} + message.errorCode !== undefined && (obj.errorCode = message.errorCode) + message.msg !== undefined && (obj.msg = message.msg) + message.isUserError !== undefined && (obj.isUserError = message.isUserError) + return obj + }, + + fromPartial, I>>(object: I): Error { + const message = createBaseError() + message.errorCode = object.errorCode ?? "" + message.msg = object.msg ?? "" + message.isUserError = object.isUserError ?? false + return message + }, +} + +declare var self: any | undefined +declare var window: any | undefined +declare var global: any | undefined +var globalThis: any = (() => { + if (typeof globalThis !== "undefined") return globalThis + if (typeof self !== "undefined") return self + if (typeof window !== "undefined") return window + if (typeof global !== "undefined") return global + throw "Unable to locate global object" +})() + +const atob: (b64: string) => string = + globalThis.atob || + (b64 => globalThis.Buffer.from(b64, "base64").toString("binary")) +function bytesFromBase64(b64: string): Uint8Array { + const bin = atob(b64) + const arr = new Uint8Array(bin.length) + for (let i = 0; i < bin.length; ++i) { + arr[i] = bin.charCodeAt(i) + } + return arr +} + +const btoa: (bin: string) => string = + globalThis.btoa || + (bin => globalThis.Buffer.from(bin, "binary").toString("base64")) +function base64FromBytes(arr: Uint8Array): string { + const bin: string[] = [] + arr.forEach(byte => { + bin.push(String.fromCharCode(byte)) + }) + return btoa(bin.join("")) +} + +type Builtin = + | Date + | Function + | Uint8Array + | string + | number + | boolean + | undefined + +export type DeepPartial = T extends Builtin + ? T + : T extends Array + ? Array> + : T extends ReadonlyArray + ? ReadonlyArray> + : T extends {} + ? { [K in keyof T]?: DeepPartial } + : Partial + +type KeysOfUnion = T extends T ? keyof T : never +export type Exact = P extends Builtin + ? P + : P & { [K in keyof P]: Exact } & Record< + Exclude>, + never + > + +function longToString(long: Long) { + return long.toString() +} + +if (_m0.util.Long !== Long) { + _m0.util.Long = Long as any + _m0.configure() +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined +} diff --git a/modules/chronik-client/hex.ts b/modules/chronik-client/hex.ts new file mode 100644 index 000000000..0003e3be0 --- /dev/null +++ b/modules/chronik-client/hex.ts @@ -0,0 +1,66 @@ +// Pre-Init +const LUT_HEX_4b = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "a", + "b", + "c", + "d", + "e", + "f", +] +const LUT_HEX_8b = new Array(0x100) +const LUT_BIN_8b: { [key: string]: number } = {} +for (let n = 0; n < 0x100; n++) { + const hex = `${LUT_HEX_4b[(n >>> 4) & 0xf]}${LUT_HEX_4b[n & 0xf]}` + LUT_HEX_8b[n] = hex + LUT_BIN_8b[hex] = n +} +// End Pre-Init + +export function toHex(buffer: Uint8Array): string { + let out = "" + for (let idx = 0, edx = buffer.length; idx < edx; ++idx) { + out += LUT_HEX_8b[buffer[idx]] + } + return out +} + +export function toHexRev(buffer: Uint8Array): string { + let out = "" + for (let idx = buffer.length - 1; idx >= 0; --idx) { + out += LUT_HEX_8b[buffer[idx]] + } + return out +} + +export function fromHex(str: string): Uint8Array { + if ((str.length & 1) != 0) { + throw new Error(`Odd hex length: ${str}`) + } + const nBytes = str.length >> 1 + const array = new Uint8Array(nBytes) + for (let idx = 0; idx < str.length; idx += 2) { + const pair = str.substr(idx, 2) + const byte = LUT_BIN_8b[pair] + if (byte === undefined) { + throw new Error(`Invalid hex pair: ${pair}, at index ${idx}`) + } + array[idx >> 1] = byte + } + return array +} + +export function fromHexRev(str: string): Uint8Array { + const array = fromHex(str) + array.reverse() + return array +} diff --git a/modules/chronik-client/index.ts b/modules/chronik-client/index.ts new file mode 100644 index 000000000..e35f5a546 --- /dev/null +++ b/modules/chronik-client/index.ts @@ -0,0 +1,1127 @@ +import axios, { AxiosResponse } from "axios" +import WebSocket from "isomorphic-ws" +import * as ws from "ws" +import * as proto from "./chronik" +import { fromHex, fromHexRev, toHex, toHexRev } from "./hex" + +type MessageEvent = ws.MessageEvent | { data: Blob } + +/** Client to access a Chronik instance.Plain object, without any + * connections. */ +export class ChronikClient { + private _url: string + private _wsUrl: string + + /** + * Create a new client. This just creates an object, without any connections. + * + * @param url Url of a Chronik instance, with schema and without trailing + * slash. E.g. https://chronik.be.cash/xec. + */ + constructor(url: string) { + this._url = url + if (url.endsWith("/")) { + throw new Error("`url` cannot end with '/', got: " + url) + } + if (url.startsWith("https://")) { + this._wsUrl = "wss://" + url.substring("https://".length) + } else if (url.startsWith("http://")) { + this._wsUrl = "ws://" + url.substring("http://".length) + } else { + throw new Error( + "`url` must start with 'https://' or 'http://', got: " + url, + ) + } + } + + /** Broadcasts the `rawTx` on the network. + * If `skipSlpCheck` is false, it will be checked that the tx doesn't burn + * any SLP tokens before broadcasting. + */ + public async broadcastTx( + rawTx: Uint8Array | string, + skipSlpCheck = false, + ): Promise<{ txid: string }> { + const request = proto.BroadcastTxRequest.encode({ + rawTx: typeof rawTx === "string" ? fromHex(rawTx) : rawTx, + skipSlpCheck, + }).finish() + const data = await _post(this._url, "/broadcast-tx", request) + const broadcastResponse = proto.BroadcastTxResponse.decode(data) + return { + txid: toHexRev(broadcastResponse.txid), + } + } + + /** Broadcasts the `rawTxs` on the network, only if all of them are valid. + * If `skipSlpCheck` is false, it will be checked that the txs don't burn + * any SLP tokens before broadcasting. + */ + public async broadcastTxs( + rawTxs: (Uint8Array | string)[], + skipSlpCheck = false, + ): Promise<{ txids: string[] }> { + const request = proto.BroadcastTxsRequest.encode({ + rawTxs: rawTxs.map(rawTx => + typeof rawTx === "string" ? fromHex(rawTx) : rawTx, + ), + skipSlpCheck, + }).finish() + const data = await _post(this._url, "/broadcast-txs", request) + const broadcastResponse = proto.BroadcastTxsResponse.decode(data) + return { + txids: broadcastResponse.txids.map(toHexRev), + } + } + + /** Fetch current info of the blockchain, such as tip hash and height. */ + public async blockchainInfo(): Promise { + const data = await _get(this._url, `/blockchain-info`) + const blockchainInfo = proto.BlockchainInfo.decode(data) + return convertToBlockchainInfo(blockchainInfo) + } + + /** Fetch the block given hash or height. */ + public async block(hashOrHeight: string | number): Promise { + const data = await _get(this._url, `/block/${hashOrHeight}`) + const block = proto.Block.decode(data) + return convertToBlock(block) + } + + /** Fetch block info of a range of blocks. `startHeight` and `endHeight` are + * inclusive ranges. */ + public async blocks( + startHeight: number, + endHeight: number, + ): Promise { + const data = await _get(this._url, `/blocks/${startHeight}/${endHeight}`) + const blocks = proto.Blocks.decode(data) + return blocks.blocks.map(convertToBlockInfo) + } + + /** Fetch tx details given the txid. */ + public async tx(txid: string): Promise { + const data = await _get(this._url, `/tx/${txid}`) + const tx = proto.Tx.decode(data) + return convertToTx(tx) + } + + /** Fetch token info and stats given the tokenId. */ + public async token(tokenId: string): Promise { + const data = await _get(this._url, `/token/${tokenId}`) + const token = proto.Token.decode(data) + return convertToToken(token) + } + + /** Validate the given outpoints: whether they are unspent, spent or + * never existed. */ + public async validateUtxos(outpoints: OutPoint[]): Promise { + const request = proto.ValidateUtxoRequest.encode({ + outpoints: outpoints.map(outpoint => ({ + txid: fromHexRev(outpoint.txid), + outIdx: outpoint.outIdx, + })), + }).finish() + const data = await _post(this._url, "/validate-utxos", request) + const validationStates = proto.ValidateUtxoResponse.decode(data) + return validationStates.utxoStates.map(state => ({ + height: state.height, + isConfirmed: state.isConfirmed, + state: convertToUtxoStateVariant(state.state), + })) + } + + /** Create object that allows fetching script history or UTXOs. */ + public script(scriptType: ScriptType, scriptPayload: string): ScriptEndpoint { + return new ScriptEndpoint(this._url, scriptType, scriptPayload) + } + + /** Open a WebSocket connection to listen for updates. */ + public ws(config: WsConfig): WsEndpoint { + return new WsEndpoint(`${this._wsUrl}/ws`, config) + } +} + +/** Allows fetching script history and UTXOs. */ +export class ScriptEndpoint { + private _url: string + private _scriptType: string + private _scriptPayload: string + + constructor(url: string, scriptType: string, scriptPayload: string) { + this._url = url + this._scriptType = scriptType + this._scriptPayload = scriptPayload + } + + /** Fetches the tx history of this script, in anti-chronological order. + * This means it's ordered by first-seen first. If the tx hasn't been seen + * by the indexer before, it's ordered by the block timestamp. + * @param page Page index of the tx history. + * @param pageSize Number of txs per page. + */ + public async history( + page?: number, + pageSize?: number, + ): Promise { + const query = + page !== undefined && pageSize !== undefined + ? `?page=${page}&page_size=${pageSize}` + : page !== undefined + ? `?page=${page}` + : pageSize !== undefined + ? `?page_size=${pageSize}` + : "" + const data = await _get( + this._url, + `/script/${this._scriptType}/${this._scriptPayload}/history${query}`, + ) + const historyPage = proto.TxHistoryPage.decode(data) + return { + txs: historyPage.txs.map(convertToTx), + numPages: historyPage.numPages, + } + } + + /** Fetches the current UTXO set for this script. + * It is grouped by output script, in case a script type can match multiple + * different output scripts (e.g. Taproot on Lotus). */ + public async utxos(): Promise { + const data = await _get( + this._url, + `/script/${this._scriptType}/${this._scriptPayload}/utxos`, + ) + const utxos = proto.Utxos.decode(data) + return utxos.scriptUtxos.map(scriptUtxos => ({ + outputScript: toHex(scriptUtxos.outputScript), + utxos: scriptUtxos.utxos.map(convertToUtxo), + })) + } +} + +/** Config for a WebSocket connection to Chronik. */ +export interface WsConfig { + /** Fired when a message is sent from the WebSocket. */ + onMessage?: (msg: SubscribeMsg) => void + + /** Fired when a connection has been (re)established. */ + onConnect?: (e: ws.Event) => void + + /** Fired after a connection has been unexpectedly closed, and before a + * reconnection attempt is made. Only fired if `autoReconnect` is true. */ + onReconnect?: (e: ws.Event) => void + + /** Fired when an error with the WebSocket occurs. */ + onError?: (e: ws.ErrorEvent) => void + + /** Fired after a connection has been manually closed, or if `autoReconnect` + * is false, if the WebSocket disconnects for any reason. */ + onEnd?: (e: ws.Event) => void + + /** Whether to automatically reconnect on disconnect, default true. */ + autoReconnect?: boolean +} + +/** WebSocket connection to Chronik. */ +export class WsEndpoint { + /** Fired when a message is sent from the WebSocket. */ + public onMessage?: (msg: SubscribeMsg) => void + + /** Fired when a connection has been (re)established. */ + public onConnect?: (e: ws.Event) => void + + /** Fired after a connection has been unexpectedly closed, and before a + * reconnection attempt is made. Only fired if `autoReconnect` is true. */ + public onReconnect?: (e: ws.Event) => void + + /** Fired when an error with the WebSocket occurs. */ + public onError?: (e: ws.ErrorEvent) => void + + /** Fired after a connection has been manually closed, or if `autoReconnect` + * is false, if the WebSocket disconnects for any reason. */ + public onEnd?: (e: ws.Event) => void + + /** Whether to automatically reconnect on disconnect, default true. */ + public autoReconnect: boolean + + private _ws: ws.WebSocket | undefined + private _wsUrl: string + private _connected: Promise | undefined + private _manuallyClosed: boolean + private _subs: { scriptType: ScriptType; scriptPayload: string }[] + + constructor(wsUrl: string, config: WsConfig) { + this.onMessage = config.onMessage + this.onConnect = config.onConnect + this.onReconnect = config.onReconnect + this.onEnd = config.onEnd + this.autoReconnect = + config.autoReconnect !== undefined ? config.autoReconnect : true + this._manuallyClosed = false + this._subs = [] + this._wsUrl = wsUrl + this._connect() + } + + /** Wait for the WebSocket to be connected. */ + public async waitForOpen() { + await this._connected + } + + /** Subscribe to the given script type and payload. + * For "p2pkh", `scriptPayload` is the 20 byte public key hash. */ + public subscribe(scriptType: ScriptType, scriptPayload: string) { + this._subs.push({ scriptType, scriptPayload }) + if (this._ws?.readyState === WebSocket.OPEN) { + this._subUnsub(true, scriptType, scriptPayload) + } + } + + /** Unsubscribe from the given script type and payload. */ + public unsubscribe(scriptType: ScriptType, scriptPayload: string) { + this._subs = this._subs.filter( + sub => + sub.scriptType !== scriptType || sub.scriptPayload !== scriptPayload, + ) + if (this._ws?.readyState === WebSocket.OPEN) { + this._subUnsub(false, scriptType, scriptPayload) + } + } + + /** Close the WebSocket connection and prevent future any reconnection + * attempts. */ + public close() { + this._manuallyClosed = true + this._ws?.close() + } + + private _connect() { + const ws: ws.WebSocket = new WebSocket(this._wsUrl) + this._ws = ws + this._connected = new Promise(resolved => { + ws.onopen = msg => { + this._subs.forEach(sub => + this._subUnsub(true, sub.scriptType, sub.scriptPayload), + ) + resolved(msg) + if (this.onConnect !== undefined) { + this.onConnect(msg) + } + } + }) + ws.onmessage = e => this._handleMsg(e as MessageEvent) + ws.onerror = e => this.onError !== undefined && this.onError(e) + ws.onclose = e => { + // End if manually closed or no auto-reconnect + if (this._manuallyClosed || !this.autoReconnect) { + if (this.onEnd !== undefined) { + this.onEnd(e) + } + return + } + if (this.onReconnect !== undefined) { + this.onReconnect(e) + } + this._connect() + } + } + + private _subUnsub( + isSubscribe: boolean, + scriptType: ScriptType, + scriptPayload: string, + ) { + const encodedSubscription = proto.Subscription.encode({ + isSubscribe, + scriptType, + payload: fromHex(scriptPayload), + }).finish() + if (this._ws === undefined) + throw new Error("Invalid state; _ws is undefined") + this._ws.send(encodedSubscription) + } + + private async _handleMsg(wsMsg: MessageEvent) { + if (this.onMessage === undefined) { + return + } + const data = + wsMsg.data instanceof Buffer + ? (wsMsg.data as Uint8Array) + : new Uint8Array(await (wsMsg.data as Blob).arrayBuffer()) + const msg = proto.SubscribeMsg.decode(data) + if (msg.error) { + this.onMessage({ + type: "Error", + ...msg.error, + }) + } else if (msg.AddedToMempool) { + this.onMessage({ + type: "AddedToMempool", + txid: toHexRev(msg.AddedToMempool.txid), + }) + } else if (msg.RemovedFromMempool) { + this.onMessage({ + type: "RemovedFromMempool", + txid: toHexRev(msg.RemovedFromMempool.txid), + }) + } else if (msg.Confirmed) { + this.onMessage({ + type: "Confirmed", + txid: toHexRev(msg.Confirmed.txid), + }) + } else if (msg.Reorg) { + this.onMessage({ + type: "Reorg", + txid: toHexRev(msg.Reorg.txid), + }) + } else if (msg.BlockConnected) { + this.onMessage({ + type: "BlockConnected", + blockHash: toHexRev(msg.BlockConnected.blockHash), + }) + } else if (msg.BlockDisconnected) { + this.onMessage({ + type: "BlockDisconnected", + blockHash: toHexRev(msg.BlockDisconnected.blockHash), + }) + } else { + console.log("Silently ignored unknown Chronik message:", msg) + } + } +} + +async function _get(url: string, path: string): Promise { + const response = await axios.get(`${url}${path}`, { + responseType: "arraybuffer", + validateStatus: undefined, + }) + ensureResponseErrorThrown(response, path) + return new Uint8Array(response.data) +} + +async function _post( + url: string, + path: string, + data: Uint8Array, +): Promise { + const response = await axios.post(`${url}${path}`, data, { + responseType: "arraybuffer", + validateStatus: undefined, + // Prevents Axios encoding the Uint8Array as JSON or something + transformRequest: x => x, + headers: { + "Content-Type": "application/x-protobuf", + }, + }) + ensureResponseErrorThrown(response, path) + return new Uint8Array(response.data) +} + +function ensureResponseErrorThrown(response: AxiosResponse, path: string) { + if (response.status != 200) { + const error = proto.Error.decode(new Uint8Array(response.data)) + throw new Error(`Failed getting ${path} (${error.errorCode}): ${error.msg}`) + } +} + +function convertToBlockchainInfo( + blockchainInfo: proto.BlockchainInfo, +): BlockchainInfo { + return { + tipHash: toHexRev(blockchainInfo.tipHash), + tipHeight: blockchainInfo.tipHeight, + } +} + +function convertToBlock(block: proto.Block): Block { + if (block.blockInfo === undefined) { + throw new Error("Block has no blockInfo") + } + if (block.blockDetails === undefined) { + throw new Error("Block has no blockDetails") + } + return { + blockInfo: convertToBlockInfo(block.blockInfo), + blockDetails: convertToBlockDetails(block.blockDetails), + rawHeader: toHex(block.rawHeader), + txs: block.txs.map(convertToTx), + } +} + +function convertToTx(tx: proto.Tx): Tx { + return { + txid: toHexRev(tx.txid), + version: tx.version, + inputs: tx.inputs.map(convertToTxInput), + outputs: tx.outputs.map(convertToTxOutput), + lockTime: tx.lockTime, + slpTxData: tx.slpTxData ? convertToSlpTxData(tx.slpTxData) : undefined, + slpErrorMsg: tx.slpErrorMsg.length !== 0 ? tx.slpErrorMsg : undefined, + block: tx.block !== undefined ? convertToBlockMeta(tx.block) : undefined, + timeFirstSeen: tx.timeFirstSeen, + size: tx.size, + isCoinbase: tx.isCoinbase, + network: convertToNetwork(tx.network), + } +} + +function convertToUtxo(utxo: proto.Utxo): Utxo { + if (utxo.outpoint === undefined) { + throw new Error("UTXO outpoint is undefined") + } + return { + outpoint: { + txid: toHexRev(utxo.outpoint.txid), + outIdx: utxo.outpoint.outIdx, + }, + blockHeight: utxo.blockHeight, + isCoinbase: utxo.isCoinbase, + value: utxo.value, + slpMeta: + utxo.slpMeta !== undefined ? convertToSlpMeta(utxo.slpMeta) : undefined, + slpToken: + utxo.slpToken !== undefined + ? convertToSlpToken(utxo.slpToken) + : undefined, + network: convertToNetwork(utxo.network), + } +} + +function convertToToken(token: proto.Token): Token { + if (token.slpTxData === undefined) { + throw new Error("Invalid proto, no slpTxData") + } + if (token.tokenStats === undefined) { + throw new Error("Invalid proto, no tokenStats") + } + return { + slpTxData: convertToSlpTokenTxData(token.slpTxData), + tokenStats: token.tokenStats, + block: + token.block !== undefined ? convertToBlockMeta(token.block) : undefined, + timeFirstSeen: token.timeFirstSeen, + initialTokenQuantity: token.initialTokenQuantity, + containsBaton: token.containsBaton, + network: convertToNetwork(token.network), + } +} + +function convertToTxInput(input: proto.TxInput): TxInput { + if (input.prevOut === undefined) { + throw new Error("Invalid proto, no prevOut") + } + return { + prevOut: { + txid: toHexRev(input.prevOut.txid), + outIdx: input.prevOut.outIdx, + }, + inputScript: toHex(input.inputScript), + outputScript: + input.outputScript.length > 0 ? toHex(input.outputScript) : undefined, + value: input.value, + sequenceNo: input.sequenceNo, + slpBurn: + input.slpBurn !== undefined ? convertToSlpBurn(input.slpBurn) : undefined, + slpToken: + input.slpToken !== undefined + ? convertToSlpToken(input.slpToken) + : undefined, + } +} + +function convertToTxOutput(output: proto.TxOutput): TxOutput { + return { + value: output.value, + outputScript: toHex(output.outputScript), + slpToken: + output.slpToken !== undefined + ? convertToSlpToken(output.slpToken) + : undefined, + spentBy: + output.spentBy !== undefined + ? { + txid: toHexRev(output.spentBy.txid), + outIdx: output.spentBy.outIdx, + } + : undefined, + } +} + +function convertToSlpTxData(slpTxData: proto.SlpTxData): SlpTxData { + if (slpTxData.slpMeta === undefined) { + throw new Error("Invalid slpTxData: slpMeta is undefined") + } + return { + slpMeta: convertToSlpMeta(slpTxData.slpMeta), + genesisInfo: + slpTxData.genesisInfo !== undefined + ? convertToSlpGenesisInfo(slpTxData.genesisInfo) + : undefined, + } +} + +function convertToSlpTokenTxData(slpTxData: proto.SlpTxData): SlpTokenTxData { + if (slpTxData.slpMeta === undefined) { + throw new Error("Invalid slpTxData: slpMeta is undefined") + } + if (slpTxData.genesisInfo === undefined) { + throw new Error("Invalid slpTxData: genesisInfo is undefined") + } + return { + slpMeta: convertToSlpMeta(slpTxData.slpMeta), + genesisInfo: convertToSlpGenesisInfo(slpTxData.genesisInfo), + } +} + +function convertToSlpMeta(slpMeta: proto.SlpMeta): SlpMeta { + let tokenType: SlpTokenType + switch (slpMeta.tokenType) { + case proto.SlpTokenType.FUNGIBLE: + tokenType = "FUNGIBLE" + break + case proto.SlpTokenType.NFT1_GROUP: + tokenType = "NFT1_GROUP" + break + case proto.SlpTokenType.NFT1_CHILD: + tokenType = "NFT1_CHILD" + break + case proto.SlpTokenType.UNKNOWN_TOKEN_TYPE: + tokenType = "UNKNOWN_TOKEN_TYPE" + break + default: + throw new Error(`Invalid token type: ${slpMeta.tokenType}`) + } + let txType: SlpTxType + switch (slpMeta.txType) { + case proto.SlpTxType.GENESIS: + txType = "GENESIS" + break + case proto.SlpTxType.SEND: + txType = "SEND" + break + case proto.SlpTxType.MINT: + txType = "MINT" + break + case proto.SlpTxType.BURN: + txType = "BURN" + break + case proto.SlpTxType.UNKNOWN_TX_TYPE: + txType = "UNKNOWN_TX_TYPE" + break + default: + throw new Error(`Invalid slp tx type: ${slpMeta.txType}`) + } + return { + tokenType, + txType, + tokenId: toHex(slpMeta.tokenId), + groupTokenId: + slpMeta.groupTokenId.length == 32 + ? toHex(slpMeta.groupTokenId) + : undefined, + } +} + +function convertToSlpGenesisInfo(info: proto.SlpGenesisInfo): SlpGenesisInfo { + const decoder = new TextDecoder() + return { + tokenTicker: decoder.decode(info.tokenTicker), + tokenName: decoder.decode(info.tokenName), + tokenDocumentUrl: decoder.decode(info.tokenDocumentUrl), + tokenDocumentHash: toHex(info.tokenDocumentHash), + decimals: info.decimals, + } +} + +function convertToBlockMeta(block: proto.BlockMetadata): BlockMetadata { + return { + height: block.height, + hash: toHexRev(block.hash), + timestamp: block.timestamp, + } +} + +function convertToBlockInfo(block: proto.BlockInfo): BlockInfo { + return { + ...block, + hash: toHexRev(block.hash), + prevHash: toHexRev(block.prevHash), + } +} + +function convertToBlockDetails(blockDetails: proto.BlockDetails): BlockDetails { + return { + ...blockDetails, + merkleRoot: toHexRev(blockDetails.merkleRoot), + } +} + +function convertToSlpBurn(burn: proto.SlpBurn): SlpBurn { + if (burn.token === undefined) { + throw new Error("Invalid burn: token is undefined") + } + return { + token: convertToSlpToken(burn.token), + tokenId: toHex(burn.tokenId), + } +} + +function convertToSlpToken(token: proto.SlpToken): SlpToken { + return { + amount: token.amount, + isMintBaton: token.isMintBaton, + } +} + +function convertToNetwork(network: proto.Network): Network { + switch (network) { + case proto.Network.BCH: + return "BCH" + case proto.Network.XEC: + return "XEC" + case proto.Network.XPI: + return "XPI" + case proto.Network.XRG: + return "XRG" + default: + throw new Error(`Unknown network: ${network}`) + } +} + +function convertToUtxoStateVariant( + variant: proto.UtxoStateVariant, +): UtxoStateVariant { + switch (variant) { + case proto.UtxoStateVariant.UNSPENT: + return "UNSPENT" + case proto.UtxoStateVariant.SPENT: + return "SPENT" + case proto.UtxoStateVariant.NO_SUCH_TX: + return "NO_SUCH_TX" + case proto.UtxoStateVariant.NO_SUCH_OUTPUT: + return "NO_SUCH_OUTPUT" + default: + throw new Error(`Unknown UtxoStateVariant: ${variant}`) + } +} + +/** Current state of the blockchain. */ +export interface BlockchainInfo { + /** Block hash of the current blockchain tip */ + tipHash: string + /** Current height of the blockchain */ + tipHeight: number +} + +/** A transaction on the blockchain or in the mempool. */ +export interface Tx { + /** Transaction ID. + * - On BCH, eCash and Ergon, this is the hash of the tx. + * - On Lotus, this is a special serialization, omitting the input scripts. + */ + txid: string + /** `version` field of the transaction. */ + version: number + /** Inputs of this transaction. */ + inputs: TxInput[] + /** Outputs of this transaction. */ + outputs: TxOutput[] + /** `locktime` field of the transaction, tx is not valid before this time. */ + lockTime: number + /** SLP data about this transaction, if valid. */ + slpTxData: SlpTxData | undefined + /** A human-readable message as to why this tx is not an SLP transaction, + * unless trivially so. */ + slpErrorMsg: string | undefined + /** Block data for this tx, or undefined if not mined yet. */ + block: BlockMetadata | undefined + /** UNIX timestamp when this tx has first been seen in the mempool. + * 0 if unknown -> make sure to check. + */ + timeFirstSeen: string + /** Serialized size of the tx. */ + size: number + /** Whether this tx is a coinbase tx. */ + isCoinbase: boolean + /** Which network this tx is on. */ + network: Network +} + +/** An unspent transaction output (aka. UTXO, aka. "Coin") of a script. */ +export interface Utxo { + /** Outpoint of the UTXO. */ + outpoint: OutPoint + /** Which block this UTXO is in, or -1 if in the mempool. */ + blockHeight: number + /** Whether this UTXO is a coinbase UTXO + * (make sure it's buried 100 blocks before spending!) */ + isCoinbase: boolean + /** Value of the UTXO in satoshis. */ + value: string + /** SLP data in this UTXO. */ + slpMeta: SlpMeta | undefined + /** SLP token of this UTXO (i.e. SLP amount + whether it's a mint baton). */ + slpToken: SlpToken | undefined + /** Which network this UTXO is on. */ + network: Network +} + +/** Data and stats about an SLP token. */ +export interface Token { + /** SLP data of the GENESIS transaction. */ + slpTxData: SlpTokenTxData + /** Current stats about this token, e.g. minted and burned amount. */ + tokenStats: TokenStats + /** Block the GENESIS transaction has been mined in, or undefined if not mined yet. */ + block: BlockMetadata | undefined + /** UNIX timestamp when the GENESIS transaction has first been seen in the mempool. + * 0 if unknown. */ + timeFirstSeen: string + /** How many tokens have been mined in the GENESIS transaction. */ + initialTokenQuantity: string + /** Whether the GENESIS transaction created a mint baton. + * Note: This doesn't indicate whether the mint baton is still alive. */ + containsBaton: boolean + /** Which network this token is on. */ + network: Network +} + +/** Block info about a block */ +export interface BlockInfo { + /** Block hash of the block, in 'human-readable' (big-endian) hex encoding. */ + hash: string + /** Block hash of the previous block, in 'human-readable' (big-endian) hex + * encoding. */ + prevHash: string + /** Height of the block; Genesis block has height 0. */ + height: number + /** nBits field of the block, encodes the target compactly. */ + nBits: number + /** Timestamp of the block. Filled in by the miner, so might not be 100% + * precise. */ + timestamp: string + /** Block size of this block in bytes (including headers etc.). */ + blockSize: string + /** Number of txs in this block. */ + numTxs: string + /** Total number of tx inputs in block (including coinbase). */ + numInputs: string + /** Total number of tx output in block (including coinbase). */ + numOutputs: string + /** Total number of satoshis spent by tx inputs. */ + sumInputSats: string + /** Total block reward for this block. */ + sumCoinbaseOutputSats: string + /** Total number of satoshis in non-coinbase tx outputs. */ + sumNormalOutputSats: string + /** Total number of satoshis burned using OP_RETURN. */ + sumBurnedSats: string +} + +/** Additional details about a block. */ +export interface BlockDetails { + /** nVersion field of the block. */ + version: number + /** Merkle root of the block. */ + merkleRoot: string + /** Nonce of the block (32-bit on XEC, 64-bit on XPI). */ + nonce: string + /** Median-time-past (MTP) of the last 11 blocks. */ + medianTimestamp: string +} + +/** Block on the blockchain. */ +export interface Block { + /** Info about the block. */ + blockInfo: BlockInfo + /** Details about the block. */ + blockDetails: BlockDetails + /** Header encoded as hex. */ + rawHeader: string + /** Txs in this block, in canonical order + * (at least on all supported chains). */ + txs: Tx[] +} + +/** Group of UTXOs by output script. */ +export interface ScriptUtxos { + /** Output script in hex. */ + outputScript: string + /** UTXOs of the output script. */ + utxos: Utxo[] +} + +/** Page of the transaction history. */ +export interface TxHistoryPage { + /** Txs of this page. */ + txs: Tx[] + /** Number of pages of the entire transaction history. + * This changes based on the `pageSize` provided. */ + numPages: number +} + +/** SLP data about an SLP transaction. */ +export interface SlpTxData { + /** SLP metadata. */ + slpMeta: SlpMeta + /** Genesis info, only present for GENESIS txs. */ + genesisInfo: SlpGenesisInfo | undefined +} + +/** SLP data about an SLP transaction. */ +export interface SlpTokenTxData { + /** SLP metadata. */ + slpMeta: SlpMeta + /** Genesis info of the token. */ + genesisInfo: SlpGenesisInfo +} + +/** Metadata about an SLP tx or UTXO. */ +export interface SlpMeta { + /** Whether this token is a normal fungible token, or an NFT or unknown. */ + tokenType: SlpTokenType + /** Whether this tx is a GENESIS, MINT, SEND or UNKNOWN transaction. */ + txType: SlpTxType + /** Token ID of this tx/UTXO, in human-readable (big-endian) hex encoding. */ + tokenId: string + /** Group token ID of this tx/UTXO, NFT only, in human-readable + * (big-endian) hex encoding. + * This is the token ID of the token that went into the GENESIS of this token + * as first input. */ + groupTokenId: string | undefined +} + +/** + * Stats about a token. + * + * `totalMinted` and `totalBurned` don't fit in a 64-bit integer, therefore we + * use a string with the decimal representation. + */ +export interface TokenStats { + /** Total number of tokens minted (including GENESIS). */ + totalMinted: string + /** Total number of tokens burned. */ + totalBurned: string +} + +/** Input of a tx, spends an output of a previous tx. */ +export interface TxInput { + /** Points to an output spent by this input. */ + prevOut: OutPoint + /** Script unlocking the output, in hex encoding. + * Aka. `scriptSig` in bitcoind parlance. */ + inputScript: string + /** Script of the output, in hex encoding. + * Aka. `scriptPubKey` in bitcoind parlance. */ + outputScript: string | undefined + /** Value of the output spent by this input, in satoshis. */ + value: string + /** `sequence` field of the input; can be used for relative time locking. */ + sequenceNo: number + /** SLP tokens burned by this input, or `undefined` if no burn occured. */ + slpBurn: SlpBurn | undefined + /** SLP tokens spent by this input, or `undefined` if the tokens were burned + * or if there were no tokens in the output spent by this input. */ + slpToken: SlpToken | undefined +} + +/** Output of a tx, creates new UTXOs. */ +export interface TxOutput { + /** Value of the output, in satoshis. */ + value: string + /** Script of this output, locking the coins. + * Aka. `scriptPubKey` in bitcoind parlance. */ + outputScript: string + /** SLP tokens locked up in this output, or `undefined` if no tokens were sent + * to this output. */ + slpToken: SlpToken | undefined + /** Transaction & input index spending this output, or undefined if + * unspent. */ + spentBy: OutPoint | undefined +} + +/** Metadata of a block, used in transaction data. */ +export interface BlockMetadata { + /** Height of the block. */ + height: number + /** Hash of the block. */ + hash: string + /** Timestamp of the block; useful if `timeFirstSeen` of a transaction is + * unknown. */ + timestamp: string +} + +/** Outpoint referencing an output on the blockchain (or input for field + * `spentBy`). */ +export interface OutPoint { + /** Transaction referenced by this outpoint. */ + txid: string + /** Index of the output in the tx referenced by this outpoint + * (or input index if used in field `spentBy`). */ + outIdx: number +} + +/** SLP amount or whether this is a mint baton, for inputs and outputs. */ +export interface SlpToken { + /** SLP amount of the input or output, in base units. */ + amount: string + /** Whether this input/output is a mint baton. */ + isMintBaton: boolean +} + +/** SLP burn; indicates burn of some tokens. */ +export interface SlpBurn { + /** SLP amount/mint baton burned by this burn. */ + token: SlpToken + /** Token ID of the burned SLP tokens, in human-readable (big-endian) hex + * encoding. */ + tokenId: string +} + +/** SLP info about a GENESIS transaction. */ +export interface SlpGenesisInfo { + /** Ticker of the token, decoded as UTF-8. */ + tokenTicker: string + /** Name of the token, decoded as UTF-8. */ + tokenName: string + /** URL of the token, decoded as UTF-8. */ + tokenDocumentUrl: string + /** Document hash of the token, encoded in hex (byte order as occuring in the + * OP_RETURN). */ + tokenDocumentHash: string + /** Number of decimals of the GENESIS transaction. */ + decimals: number +} + +/** State of a UTXO (from `validateUtxos`). */ +export interface UtxoState { + /** Height of the UTXO. -1 if the tx doesn't exist or is unconfirmed. + * If it's confirmed (or if the output doesn't exist but the tx does), + * it's the height of the block confirming the tx. */ + height: number + /** Whether the UTXO or the transaction queried is confirmed. */ + isConfirmed: boolean + /** State of the UTXO, can be unconfirmed, confirmed, tx doesn't exist or + * output doesn't exist. */ + state: UtxoStateVariant +} + +/** Message returned from the WebSocket. */ +export type SubscribeMsg = + | Error + | MsgAddedToMempool + | MsgRemovedFromMempool + | MsgConfirmed + | MsgReorg + | MsgBlockConnected + | MsgBlockDisconnected + +/** A transaction has been added to the mempool. */ +export interface MsgAddedToMempool { + type: "AddedToMempool" + /** txid of the transaction, in 'human-readable' (big-endian) hex encoding. */ + txid: string +} + +/** A transaction has been removed from the mempool, + * but not because of a confirmation (e.g. expiry, conflict, etc.). + */ +export interface MsgRemovedFromMempool { + type: "RemovedFromMempool" + /** txid of the transaction, in 'human-readable' (big-endian) hex encoding. */ + txid: string +} + +/** A transaction has been confirmed in a block. */ +export interface MsgConfirmed { + type: "Confirmed" + /** txid of the transaction, in 'human-readable' (big-endian) hex encoding. */ + txid: string +} + +/** A transaction used to be part of a block but now got re-orged. + * Usually, unless something malicious occurs, a "Confirmed" message is sent + * immediately afterwards. + */ +export interface MsgReorg { + type: "Reorg" + /** txid of the transaction, in 'human-readable' (big-endian) hex encoding. */ + txid: string +} + +/** A new block has been added to the chain. Sent regardless of subscriptions. */ +export interface MsgBlockConnected { + type: "BlockConnected" + /** block hash of the block, in 'human-readable' (big-endian) hex encoding. */ + blockHash: string +} + +/** A block has been removed from the chain. Sent regardless of subscriptions. */ +export interface MsgBlockDisconnected { + type: "BlockDisconnected" + /** block hash of the block, in 'human-readable' (big-endian) hex encoding. */ + blockHash: string +} + +/** Reports an error, e.g. when a subscription is malformed. */ +export interface Error { + type: "Error" + /** Code for this error, e.g. "tx-not-found". */ + errorCode: string + /** Human-readable message for this error. */ + msg: string + /** Whether this error is presentable to an end-user. + * This is somewhat subjective, but can be used as a good heuristic. */ + isUserError: boolean +} + +/** Different networks of txs/blocks/UTXOs. + * Supported are BCH, eCash, Lotus and Ergon. */ +export type Network = "BCH" | "XEC" | "XPI" | "XRG" + +/** Which SLP tx type. */ +export type SlpTxType = "GENESIS" | "SEND" | "MINT" | "BURN" | "UNKNOWN_TX_TYPE" + +/** Which SLP token type (normal fungible, NFT, unknown). */ +export type SlpTokenType = + | "FUNGIBLE" + | "NFT1_GROUP" + | "NFT1_CHILD" + | "UNKNOWN_TOKEN_TYPE" + +/** State of a transaction output. + * - `UNSPENT`: The UTXO is unspent. + * - `SPENT`: The output is spent and no longer part of the UTXO set. + * - `NO_SUCH_TX`: The tx queried does not exist. + * - `NO_SUCH_OUTPUT`: The output queried does not exist, but the tx does exist. + */ +export type UtxoStateVariant = + | "UNSPENT" + | "SPENT" + | "NO_SUCH_TX" + | "NO_SUCH_OUTPUT" + +/** Script type queried in the `script` method. + * - `other`: Script type not covered by the standard script types; payload is + * the raw hex. + * - `p2pk`: Pay-to-Public-Key (` OP_CHECKSIG`), payload is the hex of the + * pubkey (compressed (33 bytes) or uncompressed (65 bytes)). + * - `p2pkh`: Pay-to-Public-Key-Hash + * (`OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIG`). + * Payload is the 20 byte public key hash. + * - `p2sh`: Pay-to-Script-Hash (`OP_HASH160 OP_EQUAL`). + * Payload is the 20 byte script hash. + * - `p2tr-commitment`: Pay-to-Taproot + * (`OP_SCRIPTTYPE OP_1 ?`), only on Lotus. + * Queries by the commitment. Payload is the 33 byte commitment. + * - `p2tr-state`: Pay-to-Taproot (`OP_SCRIPTTYPE OP_1 `), + * only on Lotus. Queries by the state. Payload is the 32 byte state. + */ +export type ScriptType = + | "other" + | "p2pk" + | "p2pkh" + | "p2sh" + | "p2tr-commitment" + | "p2tr-state" diff --git a/modules/chronik-client/package-lock.json b/modules/chronik-client/package-lock.json new file mode 100644 index 000000000..15720f860 --- /dev/null +++ b/modules/chronik-client/package-lock.json @@ -0,0 +1,4798 @@ +{ + "name": "chronik-client", + "version": "0.8.2", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "chronik-client", + "version": "0.8.2", + "license": "MIT", + "dependencies": { + "@types/ws": "^8.2.1", + "axios": "^0.21.1", + "isomorphic-ws": "^4.0.1", + "protobufjs": "^6.8.8", + "ws": "^8.3.0" + }, + "devDependencies": { + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.4", + "@types/mocha": "^9.0.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "chai": "^4.3.4", + "chai-as-promised": "^7.1.1", + "eslint": "^8.4.0", + "eslint-config-prettier": "^8.3.0", + "mocha": "^9.1.3", + "prettier": "^2.5.1", + "prettier-plugin-organize-imports": "^2.3.4", + "ts-node": "^10.4.0", + "ts-proto": "^1.92.1", + "typedoc": "^0.22.10", + "typescript": "^4.5.2" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.1", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "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/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.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "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": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.16.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", + "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==" + }, + "node_modules/@types/object-hash": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz", + "integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz", + "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/type-utils": "5.59.1", + "@typescript-eslint/utils": "5.59.1", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz", + "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz", + "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz", + "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.59.1", + "@typescript-eslint/utils": "5.59.1", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz", + "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz", + "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz", + "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz", + "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.59.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "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-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/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/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/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/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/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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/case-anything": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.10.tgz", + "integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, + "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/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "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/chokidar/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/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/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/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/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": 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/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "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/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dprint-node": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.7.tgz", + "integrity": "sha512-NTZOW9A7ipb0n7z7nC3wftvsbceircwVHSgzobJsEQa+7RnOMbhrfX5IflA6CtC4GA63DSAiHYXa4JKEy9F7cA==", + "dev": true, + "dependencies": { + "detect-libc": "^1.0.3" + } + }, + "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==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "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/eslint": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.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==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/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/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==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "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/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/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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-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==", + "dev": true, + "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-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "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/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==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "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/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/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/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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/mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/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/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/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==", + "dev": true + }, + "node_modules/mocha/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/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/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "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/object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "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/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-organize-imports": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-2.3.4.tgz", + "integrity": "sha512-R8o23sf5iVL/U71h9SFUdhdOEPsi3nm42FD/oDYIZ2PQa4TNWWuWecxln6jlIQzpZTDMUeO1NicJP6lLn2TtRw==", + "dev": true, + "peerDependencies": { + "prettier": ">=2.0", + "typescript": ">=2.9" + } + }, + "node_modules/protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "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/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "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/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/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/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "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==", + "dev": true, + "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/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", + "integrity": "sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.0.0", + "vscode-oniguruma": "^1.6.1", + "vscode-textmate": "5.2.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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": "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/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/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/ts-poet": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.4.1.tgz", + "integrity": "sha512-AjZEs4h2w4sDfwpHMxQKHrTlNh2wRbM5NRXmLz0RiH+yPGtSQFbe9hBpNocU8vqVNgfh0BIOiXR80xDz3kKxUQ==", + "dev": true, + "dependencies": { + "dprint-node": "^1.0.7" + } + }, + "node_modules/ts-proto": { + "version": "1.146.0", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.146.0.tgz", + "integrity": "sha512-OyBZRjmqqw+aatLEUbRooWO6VKTtOLJQyaQFMciigEZPNgTsWtApqHpQDtqDMQFWEXhIARqEV+B7ZJx8cljhZA==", + "dev": true, + "dependencies": { + "@types/object-hash": "^1.3.0", + "case-anything": "^2.1.10", + "dataloader": "^1.4.0", + "object-hash": "^1.3.1", + "protobufjs": "^6.11.3", + "ts-poet": "^6.4.1", + "ts-proto-descriptors": "1.8.0" + }, + "bin": { + "protoc-gen-ts_proto": "protoc-gen-ts_proto" + } + }, + "node_modules/ts-proto-descriptors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.8.0.tgz", + "integrity": "sha512-iV20plcI8+GRkeZIAygxOOH0p2xpOsKfw9kI1W20NCwawi1/4bG/YRd9rQY9XSJP+lD9j7XbSy3tFFuikfsljw==", + "dev": true, + "dependencies": { + "long": "^4.0.0", + "protobufjs": "^6.8.8" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-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/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedoc": { + "version": "0.22.18", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.18.tgz", + "integrity": "sha512-NK9RlLhRUGMvc6Rw5USEYgT4DVAUFk7IF7Q6MYfpJ88KnTZP7EneEa4RcP+tX1auAcz7QT1Iy0bUSZBYYHdoyA==", + "dev": true, + "dependencies": { + "glob": "^8.0.3", + "lunr": "^2.3.9", + "marked": "^4.0.16", + "minimatch": "^5.1.0", + "shiki": "^0.10.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 12.10.0" + }, + "peerDependencies": { + "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x || 4.7.x" + } + }, + "node_modules/typedoc/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/typedoc/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.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==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "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==", + "dev": true, + "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/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/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/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/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": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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" + } + } + }, + "dependencies": { + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", + "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", + "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.1", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@eslint/js": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", + "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@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 + }, + "@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 + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@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==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "@types/node": { + "version": "18.16.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", + "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==" + }, + "@types/object-hash": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-1.3.4.tgz", + "integrity": "sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA==", + "dev": true + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.1.tgz", + "integrity": "sha512-AVi0uazY5quFB9hlp2Xv+ogpfpk77xzsgsIEWyVS7uK/c7MZ5tw7ZPbapa0SbfkqE0fsAMkz5UwtgMLVk2BQAg==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/type-utils": "5.59.1", + "@typescript-eslint/utils": "5.59.1", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.1.tgz", + "integrity": "sha512-nzjFAN8WEu6yPRDizIFyzAfgK7nybPodMNFGNH0M9tei2gYnYszRDqVA0xlnRjkl7Hkx2vYrEdb6fP2a21cG1g==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.1.tgz", + "integrity": "sha512-mau0waO5frJctPuAzcxiNWqJR5Z8V0190FTSqRw1Q4Euop6+zTwHAf8YIXNwDOT29tyUDrQ65jSg9aTU/H0omA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.1.tgz", + "integrity": "sha512-ZMWQ+Oh82jWqWzvM3xU+9y5U7MEMVv6GLioM3R5NJk6uvP47kZ7YvlgSHJ7ERD6bOY7Q4uxWm25c76HKEwIjZw==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.59.1", + "@typescript-eslint/utils": "5.59.1", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.1.tgz", + "integrity": "sha512-dg0ICB+RZwHlysIy/Dh1SP+gnXNzwd/KS0JprD3Lmgmdq+dJAJnUPe1gNG34p0U19HvRlGX733d/KqscrGC1Pg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.1.tgz", + "integrity": "sha512-lYLBBOCsFltFy7XVqzX0Ju+Lh3WPIAWxYpmH/Q7ZoqzbscLiCW00LeYCdsUnnfnj29/s1WovXKh2gwCoinHNGA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/visitor-keys": "5.59.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.1.tgz", + "integrity": "sha512-MkTe7FE+K1/GxZkP5gRj3rCztg45bEhsd8HYjczBuYm+qFHP5vtZmjx3B0yUCDotceQ4sHgTyz60Ycl225njmA==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.1", + "@typescript-eslint/types": "5.59.1", + "@typescript-eslint/typescript-estree": "5.59.1", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.1.tgz", + "integrity": "sha512-6waEYwBTCWryx0VJmP7JaM4FpipLsFl9CvYf2foAE8Qh/Y0s+bxWysciwOs0LTBED4JCaNxTZ5rGadB14M6dwA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.59.1", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "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 + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "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 + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "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 + }, + "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 + }, + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "case-anything": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.10.tgz", + "integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==", + "dev": true + }, + "chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "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, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "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, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + }, + "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, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true + }, + "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 + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dprint-node": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.7.tgz", + "integrity": "sha512-NTZOW9A7ipb0n7z7nC3wftvsbceircwVHSgzobJsEQa+7RnOMbhrfX5IflA6CtC4GA63DSAiHYXa4JKEy9F7cA==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", + "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.2", + "@eslint/js": "8.39.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.0", + "espree": "^9.5.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-visitor-keys": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", + "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "dev": true + }, + "espree": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", + "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.0" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "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, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "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 + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "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==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "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 + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "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, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "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, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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 + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-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 + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "requires": {} + }, + "js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "dev": true + }, + "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, + "requires": { + "argparse": "^2.0.1" + } + }, + "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==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "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, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "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 + }, + "marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "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 + } + } + }, + "minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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 + }, + "nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "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 + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true + }, + "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, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "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 + }, + "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 + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true + }, + "prettier-plugin-organize-imports": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-2.3.4.tgz", + "integrity": "sha512-R8o23sf5iVL/U71h9SFUdhdOEPsi3nm42FD/oDYIZ2PQa4TNWWuWecxln6jlIQzpZTDMUeO1NicJP6lLn2TtRw==", + "dev": true, + "requires": {} + }, + "protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "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==", + "dev": true + }, + "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 + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "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==", + "dev": true + }, + "semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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, + "requires": { + "randombytes": "^2.1.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shiki": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", + "integrity": "sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==", + "dev": true, + "requires": { + "jsonc-parser": "^3.0.0", + "vscode-oniguruma": "^1.6.1", + "vscode-textmate": "5.2.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "ts-poet": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.4.1.tgz", + "integrity": "sha512-AjZEs4h2w4sDfwpHMxQKHrTlNh2wRbM5NRXmLz0RiH+yPGtSQFbe9hBpNocU8vqVNgfh0BIOiXR80xDz3kKxUQ==", + "dev": true, + "requires": { + "dprint-node": "^1.0.7" + } + }, + "ts-proto": { + "version": "1.146.0", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.146.0.tgz", + "integrity": "sha512-OyBZRjmqqw+aatLEUbRooWO6VKTtOLJQyaQFMciigEZPNgTsWtApqHpQDtqDMQFWEXhIARqEV+B7ZJx8cljhZA==", + "dev": true, + "requires": { + "@types/object-hash": "^1.3.0", + "case-anything": "^2.1.10", + "dataloader": "^1.4.0", + "object-hash": "^1.3.1", + "protobufjs": "^6.11.3", + "ts-poet": "^6.4.1", + "ts-proto-descriptors": "1.8.0" + } + }, + "ts-proto-descriptors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.8.0.tgz", + "integrity": "sha512-iV20plcI8+GRkeZIAygxOOH0p2xpOsKfw9kI1W20NCwawi1/4bG/YRd9rQY9XSJP+lD9j7XbSy3tFFuikfsljw==", + "dev": true, + "requires": { + "long": "^4.0.0", + "protobufjs": "^6.8.8" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-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 + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typedoc": { + "version": "0.22.18", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.18.tgz", + "integrity": "sha512-NK9RlLhRUGMvc6Rw5USEYgT4DVAUFk7IF7Q6MYfpJ88KnTZP7EneEa4RcP+tX1auAcz7QT1Iy0bUSZBYYHdoyA==", + "dev": true, + "requires": { + "glob": "^8.0.3", + "lunr": "^2.3.9", + "marked": "^4.0.16", + "minimatch": "^5.1.0", + "shiki": "^0.10.1" + }, + "dependencies": { + "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, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "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 + }, + "ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "requires": {} + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "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" + } + }, + "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 + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "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 + } + } +} diff --git a/modules/chronik-client/package.json b/modules/chronik-client/package.json new file mode 100644 index 000000000..5abd9062e --- /dev/null +++ b/modules/chronik-client/package.json @@ -0,0 +1,43 @@ +{ + "name": "chronik-client", + "version": "0.8.2", + "description": "A client for accessing the Chronik Indexer API", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "author": "Tobias Ruck", + "license": "MIT", + "scripts": { + "build-proto": "protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_out=. ../bitcoinsuite-chronik-client/proto/chronik.proto -I=../bitcoinsuite-chronik-client/proto/ --ts_proto_opt=esModuleInterop=true --ts_proto_opt=forceLong=string", + "build": "tsc", + "build-docs": "typedoc --out docs index.ts", + "test": "mocha -r ts-node/register test/test.ts", + "test-long": "mocha -r ts-node/register test/test.ts --timeout 1000000000", + "format": "prettier --write .", + "lint": "eslint . --ext .js,.jsx,.ts,.tsx && prettier --check ." + }, + "devDependencies": { + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.4", + "@types/mocha": "^9.0.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "chai": "^4.3.4", + "chai-as-promised": "^7.1.1", + "eslint": "^8.4.0", + "eslint-config-prettier": "^8.3.0", + "mocha": "^9.1.3", + "prettier": "^2.5.1", + "prettier-plugin-organize-imports": "^2.3.4", + "ts-node": "^10.4.0", + "ts-proto": "^1.92.1", + "typedoc": "^0.22.10", + "typescript": "^4.5.2" + }, + "dependencies": { + "@types/ws": "^8.2.1", + "axios": "^0.21.1", + "isomorphic-ws": "^4.0.1", + "protobufjs": "^6.8.8", + "ws": "^8.3.0" + } +} diff --git a/modules/chronik-client/test/test.ts b/modules/chronik-client/test/test.ts new file mode 100644 index 000000000..804a9e33d --- /dev/null +++ b/modules/chronik-client/test/test.ts @@ -0,0 +1,470 @@ +import * as chai from "chai" +import chaiAsPromised from "chai-as-promised" +import { + BlockDetails, + BlockInfo, + ChronikClient, + SlpTokenTxData, + SubscribeMsg, + Tx, + Utxo, + UtxoState, +} from "../index" + +const expect = chai.expect +const assert = chai.assert +chai.use(chaiAsPromised) + +const TEST_URL = "https://chronik.be.cash/xec" + +const GENESIS_PK = + "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc" + + "3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f" +const GENESIS_BLOCK_INFO: BlockInfo = { + hash: "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", + prevHash: "0000000000000000000000000000000000000000000000000000000000000000", + height: 0, + nBits: 0x1d00ffff, + timestamp: "1231006505", + blockSize: "285", + numTxs: "1", + numInputs: "1", + numOutputs: "1", + sumInputSats: "0", + sumCoinbaseOutputSats: "5000000000", + sumNormalOutputSats: "0", + sumBurnedSats: "0", +} +const GENESIS_BLOCK_DETAILS: BlockDetails = { + version: 1, + merkleRoot: + "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", + nonce: "2083236893", + medianTimestamp: "1231006505", +} +const GENESIS_TX: Tx = { + txid: "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", + version: 1, + inputs: [ + { + prevOut: { + txid: "0000000000000000000000000000000000000000000000000000000000000000", + outIdx: 0xffffffff, + }, + inputScript: + "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e" + + "63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420" + + "666f722062616e6b73", + outputScript: undefined, + value: "0", + sequenceNo: 0xffffffff, + slpBurn: undefined, + slpToken: undefined, + }, + ], + outputs: [ + { + value: "5000000000", + outputScript: "41" + GENESIS_PK + "ac", + slpToken: undefined, + spentBy: undefined, + }, + ], + lockTime: 0, + slpTxData: undefined, + slpErrorMsg: undefined, + block: { + hash: "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", + height: 0, + timestamp: "1231006505", + }, + size: 204, + isCoinbase: true, + timeFirstSeen: "0", + network: "XEC", +} +const GENESIS_UTXO: Utxo = { + outpoint: { txid: GENESIS_TX.txid, outIdx: 0 }, + blockHeight: 0, + isCoinbase: true, + value: "5000000000", + slpMeta: undefined, + slpToken: undefined, + network: "XEC", +} + +describe("new ChronikClient", () => { + it("throws if url ends with a slash", () => { + expect(() => new ChronikClient("https://chronik.be.cash/xec/")).to.throw( + "`url` cannot end with '/', got: https://chronik.be.cash/xec/", + ) + }) + it("throws if url has wrong schema", () => { + expect(() => new ChronikClient("soap://chronik.be.cash/xec")).to.throw( + "`url` must start with 'https://' or 'http://', got: " + + "soap://chronik.be.cash/xec", + ) + }) +}) + +describe("/broadcast-tx", () => { + const chronik = new ChronikClient(TEST_URL) + it("throws a decode error", async () => { + assert.isRejected( + chronik.broadcastTx("00000000"), + Error, + "Failed getting /broadcast-tx (invalid-tx-encoding): Invalid tx " + + "encoding: Bytes error: Index 1 is out of bounds for array with " + + "length 0", + ) + }) +}) + +describe("/blockchain-info", () => { + const chronik = new ChronikClient(TEST_URL) + it("gives us the blockchain info", async () => { + const blockchainInfo = await chronik.blockchainInfo() + expect(blockchainInfo.tipHash.length).to.eql(64) + expect(blockchainInfo.tipHeight).to.gte(739039) + }) +}) + +describe("/block/:hash", () => { + const chronik = new ChronikClient(TEST_URL) + it("gives us the Genesis block by hash", async () => { + const block = await chronik.block( + "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", + ) + expect(block.blockInfo).to.eql(GENESIS_BLOCK_INFO) + expect(block.blockDetails).to.eql(GENESIS_BLOCK_DETAILS) + expect(block.txs).to.eql([GENESIS_TX]) + }) + it("gives us the Genesis block by height", async () => { + const block = await chronik.block(0) + expect(block.blockInfo).to.eql(GENESIS_BLOCK_INFO) + expect(block.blockDetails).to.eql(GENESIS_BLOCK_DETAILS) + expect(block.txs).to.eql([GENESIS_TX]) + }) +}) + +describe("/blocks/:start/:end", () => { + const chronik = new ChronikClient(TEST_URL) + it("gives us the first few blocks", async () => { + const blocks = await chronik.blocks(0, 10) + expect(blocks.length).to.equal(11) + const block0: BlockInfo = GENESIS_BLOCK_INFO + expect(blocks[0]).to.eql(block0) + const block1: BlockInfo = { + ...block0, + hash: "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048", + prevHash: block0.hash, + height: 1, + timestamp: "1231469665", + blockSize: "215", + } + expect(blocks[1]).to.eql(block1) + const block2: BlockInfo = { + ...block1, + hash: "000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd", + prevHash: block1.hash, + height: 2, + timestamp: "1231469744", + } + expect(blocks[2]).to.eql(block2) + const block3: BlockInfo = { + ...block2, + hash: "0000000082b5015589a3fdf2d4baff403e6f0be035a5d9742c1cae6295464449", + prevHash: block2.hash, + height: 3, + timestamp: "1231470173", + } + expect(blocks[3]).to.eql(block3) + }) +}) + +describe("/tx/:txid", () => { + const chronik = new ChronikClient(TEST_URL) + it("results in Not Found", async () => { + assert.isRejected( + chronik.tx( + "0000000000000000000000000000000000000000000000000000000000000000", + ), + Error, + "Failed getting tx " + + "0000000000000000000000000000000000000000000000000000000000000000: " + + "Txid not found: " + + "0000000000000000000000000000000000000000000000000000000000000000", + ) + }) + it("results in the right tx", async () => { + const tx = await chronik.tx( + "0f3c3908a2ddec8dea91d2fe1f77295bbbb158af869bff345d44ae800f0a5498", + ) + expect(tx.txid).to.eql( + "0f3c3908a2ddec8dea91d2fe1f77295bbbb158af869bff345d44ae800f0a5498", + ) + expect(tx.version).to.eql(2) + expect(tx.inputs).to.eql([ + { + inputScript: + "473044022042349e5e9e58c4c7b1fc9cbcdd1a1c9774b2ae95b7704ce40c7058ef" + + "14ba2854022022ba0cd4ead86982e7fc090ad06569a72c165efa3634feac4e722e" + + "ee405b92674121022d577b731fb05971d54951e4cb8bd11120327eba3e0fdd5a4d" + + "18f74a882df1a4", + outputScript: "76a914d15b9793d6af77663f8acf7e2c884f114ef901da88ac", + prevOut: { + txid: "fbe9a326ea525013e11e3f6341b3e03d6ad189bac30f94d5ceaf24ef4388e069", + outIdx: 1, + }, + sequenceNo: 4294967295, + slpBurn: undefined, + slpToken: { + amount: "50000000", + isMintBaton: false, + }, + value: "546", + }, + { + inputScript: + "473044022076e0c764b7d5a5f738304fec1df97db4ba6fc35f8ccb2438de8aabff" + + "781edb5c022002016344d4432a5837569b9c764b88aa71f98dbfb76c48cbd0ad9f" + + "18dc15be0e4121022d577b731fb05971d54951e4cb8bd11120327eba3e0fdd5a4d" + + "18f74a882df1a4", + outputScript: "76a914d15b9793d6af77663f8acf7e2c884f114ef901da88ac", + prevOut: { + txid: "7ded3b52bbe20fc40d147a4e799fda91e589d29e017789ab6361e462dc972094", + outIdx: 0, + }, + sequenceNo: 4294967295, + slpBurn: undefined, + slpToken: undefined, + value: "100000", + }, + ]) + expect(tx.outputs).to.eql([ + { + outputScript: + "6a04534c500001010453454e44200daf200e3418f2df1158efef36fbb507f12928" + + "f1fdcf3543703e64e75a4a90730800000000004c4b40080000000002aea540", + slpToken: undefined, + spentBy: undefined, + value: "0", + }, + { + outputScript: "76a9149c371def7e7cf89b30a62d658147937e679a965388ac", + slpToken: { + amount: "5000000", + isMintBaton: false, + }, + spentBy: { + txid: "962ace9db1a36d06c129dffbe9a92bcf2eafe37d1a44aedfc6f957d2be69f149", + outIdx: 0, + }, + value: "546", + }, + { + outputScript: "76a914e7b4f63ec550ada1aed74960ddc4e0e107cd6cd188ac", + slpToken: { + amount: "45000000", + isMintBaton: false, + }, + spentBy: { + txid: "11ce5e4249c5b43927810129d887ce0df3bbde46d036998dff0180f94d2df6f8", + outIdx: 0, + }, + value: "546", + }, + { + outputScript: "76a914d15b9793d6af77663f8acf7e2c884f114ef901da88ac", + slpToken: undefined, + spentBy: { + txid: "11ce5e4249c5b43927810129d887ce0df3bbde46d036998dff0180f94d2df6f8", + outIdx: 1, + }, + value: "98938", + }, + ]) + expect(tx.lockTime).to.eql(0) + expect(tx.slpTxData).to.eql({ + genesisInfo: undefined, + slpMeta: { + tokenId: + "0daf200e3418f2df1158efef36fbb507f12928f1fdcf3543703e64e75a4a9073", + tokenType: "FUNGIBLE", + txType: "SEND", + groupTokenId: undefined, + }, + }) + expect(tx.slpErrorMsg).to.eql(undefined) + expect(tx.block).to.eql({ + hash: "0000000000000000452f19532a6297ea194eaacac6d3bbcbf7c08a74cad84b44", + height: 697728, + timestamp: "1627790415", + }) + expect(tx.timeFirstSeen).to.eql("0") + expect(tx.network).to.eql("XEC") + }) +}) + +describe("/token/:tokenId", () => { + const chronik = new ChronikClient(TEST_URL) + it("results in Not Found", async () => { + assert.isRejected( + chronik.token( + "0000000000000000000000000000000000000000000000000000000000000000", + ), + Error, + ) + }) + it("results in Not Found", async () => { + assert.isRejected( + chronik.token( + "0f3c3908a2ddec8dea91d2fe1f77295bbbb158af869bff345d44ae800f0a5498", + ), + Error, + ) + }) + it("gives us a token", async () => { + const token = await chronik.token( + "0daf200e3418f2df1158efef36fbb507f12928f1fdcf3543703e64e75a4a9073", + ) + expect(token.slpTxData).to.eql({ + genesisInfo: { + decimals: 4, + tokenDocumentHash: "", + tokenDocumentUrl: "https://www.raiusd.co/etoken", + tokenName: "RaiUSD", + tokenTicker: "USDR", + }, + slpMeta: { + groupTokenId: undefined, + tokenId: + "0daf200e3418f2df1158efef36fbb507f12928f1fdcf3543703e64e75a4a9073", + tokenType: "FUNGIBLE", + txType: "GENESIS", + }, + } as SlpTokenTxData) + expect(token.block).to.eql({ + hash: "00000000000000002686aa5ffa8401c7ed67338fb9475561b2fa9817d6571da8", + height: 697721, + timestamp: "1627783243", + }) + expect(token.timeFirstSeen).to.eql("0") + expect(token.initialTokenQuantity).to.eql("0") + expect(token.containsBaton).to.eql(true) + expect(token.network).to.eql("XEC") + }) +}) + +describe("/validate-utxos", () => { + const chronik = new ChronikClient(TEST_URL) + it("validates the UTXOs", async () => { + const validationResult = await chronik.validateUtxos([ + { + txid: "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", + outIdx: 0, + }, + { + txid: "0f3c3908a2ddec8dea91d2fe1f77295bbbb158af869bff345d44ae800f0a5498", + outIdx: 1, + }, + { + txid: "0f3c3908a2ddec8dea91d2fe1f77295bbbb158af869bff345d44ae800f0a5498", + outIdx: 100, + }, + { + txid: "0000000000000000000000000000000000000000000000000000000000000000", + outIdx: 100, + }, + ]) + const expectedResult: UtxoState[] = [ + { + height: 0, + isConfirmed: true, + state: "UNSPENT", + }, + { + height: 697728, + isConfirmed: true, + state: "SPENT", + }, + { + height: 697728, + isConfirmed: true, + state: "NO_SUCH_OUTPUT", + }, + { + height: -1, + isConfirmed: false, + state: "NO_SUCH_TX", + }, + ] + expect(validationResult).to.eql(expectedResult) + }) +}) + +describe("/script/:type/:payload/history", () => { + const chronik = new ChronikClient(TEST_URL) + it("gives us the first page", async () => { + const script = chronik.script("p2pk", GENESIS_PK) + const history = await script.history() + expect(history.numPages).to.equal(1) + expect(history.txs[history.txs.length - 1]).to.eql(GENESIS_TX) + }) + it("gives us an empty page for ?page=1", async () => { + const script = chronik.script("p2pk", GENESIS_PK) + const history = await script.history(1) + expect(history.numPages).to.equal(1) + expect(history.txs).to.eql([]) + }) + it("gives us just one tx for ?page_size=1", async () => { + const script = chronik.script("p2pk", GENESIS_PK) + const history = await script.history(undefined, 1) + expect(history.numPages).to.equal(2) + expect(history.txs.length).to.equal(1) + }) + it("gives us the Genesis tx for ?page=1&page_size=1", async () => { + const script = chronik.script("p2pk", GENESIS_PK) + const history = await script.history(1, 1) + expect(history.numPages).to.equal(2) + expect(history.txs).to.eql([GENESIS_TX]) + }) +}) + +describe("/script/:type/:payload/utxos", () => { + const chronik = new ChronikClient(TEST_URL) + it("gives us the UTXOs", async () => { + const script = chronik.script("p2pk", GENESIS_PK) + const utxos = await script.utxos() + expect(utxos.length).to.equal(1) + expect(utxos[0].outputScript).to.eql("41" + GENESIS_PK + "ac") + expect(utxos[0].utxos[0]).to.eql(GENESIS_UTXO) + }) +}) + +describe("/ws", () => { + const chronik = new ChronikClient("https://chronik.be.cash/xpi") + xit("gives us a confirmation", async () => { + const promise = new Promise((resolve: (msg: SubscribeMsg) => void) => { + const ws = chronik.ws({ + onMessage: msg => { + resolve(msg) + ws.close() + }, + }) + ws.subscribe("p2pkh", "b8ae1c47effb58f72f7bca819fe7fc252f9e852e") + }) + const msg = await promise + expect(msg.type).to.eql("Confirmed") + }) + it("connects to the ws", async () => { + const promise = new Promise(resolve => { + const ws = chronik.ws({}) + ws.waitForOpen().then(() => { + resolve({}) + ws.close() + }) + }) + await promise + }) +}) diff --git a/modules/chronik-client/tsconfig.json b/modules/chronik-client/tsconfig.json new file mode 100644 index 000000000..44210dede --- /dev/null +++ b/modules/chronik-client/tsconfig.json @@ -0,0 +1,101 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "resolveJsonModule": true, /* Enable importing .json files */ + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */, + "declarationMap": true /* Create sourcemaps for d.ts files. */, + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/modules/chronik-client/typedoc.json b/modules/chronik-client/typedoc.json new file mode 100644 index 000000000..94bd56e74 --- /dev/null +++ b/modules/chronik-client/typedoc.json @@ -0,0 +1,3 @@ +{ + "excludePrivate": true +}