diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..cbff3069ef36c3963b9998f313e2693966f71117 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.devcontainer/ +test/ diff --git a/README.md b/README.md index 8e1e6f28753303627805b53c5837fefb60740738..e159d196c98e5ca9ebb3d09cc5449999487790af 100644 --- a/README.md +++ b/README.md @@ -1,2 +1 @@ -# COM2022 - +# Networking \ No newline at end of file diff --git a/cw/.gitignore b/cw/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..40b878db5b1c97fc77049537a71bb2e249abe5dc --- /dev/null +++ b/cw/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/cw/.vscode/launch.json b/cw/.vscode/launch.json new file mode 100644 index 0000000000000000000000000000000000000000..0385ef7566ca977ef2990d6b272f35c542d8de1e --- /dev/null +++ b/cw/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "ts-node", + "type": "node", + "request": "launch", + "args": [ + "${relativeFile}" + ], + "env": { + "TS_NODE_COMPILER_OPTIONS":"{\"noUnusedLocals\":false}" + }, + "runtimeArgs": [ + "--preserve-symlinks", + "-r", + "ts-node/register" + ], + "cwd": "${workspaceRoot}", + "protocol": "inspector", + "console": "internalConsole", + // "outputCapture": "std" + } + ] +} \ No newline at end of file diff --git a/cw/llama.png b/cw/llama.png new file mode 100644 index 0000000000000000000000000000000000000000..c839beb4cd384f565aa7200ea52dc4689ad80a99 Binary files /dev/null and b/cw/llama.png differ diff --git a/cw/package.json b/cw/package.json new file mode 100644 index 0000000000000000000000000000000000000000..61377c6c0e30b6e8e5de4464ec6577685f3b7997 --- /dev/null +++ b/cw/package.json @@ -0,0 +1,18 @@ +{ + "name": "cw", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "devDependencies": { + "@types/koa-compose": "^3.2.5", + "@types/node": "^17.0.25", + "ts-node": "^10.7.0", + "typescript": "^4.6.3" + }, + "dependencies": { + "@noble/secp256k1": "^1.5.5", + "async-retry": "^1.3.3", + "eciesjs": "^0.3.14", + "koa-compose": "^4.1.0" + } +} diff --git a/cw/recv.png b/cw/recv.png new file mode 100644 index 0000000000000000000000000000000000000000..c839beb4cd384f565aa7200ea52dc4689ad80a99 Binary files /dev/null and b/cw/recv.png differ diff --git a/cw/src/client.ts b/cw/src/client.ts new file mode 100644 index 0000000000000000000000000000000000000000..191378e2f1a8cdbc5d803fd2a0497f4c9d2a88a1 --- /dev/null +++ b/cw/src/client.ts @@ -0,0 +1,118 @@ +import { Socket } from "net"; +import { createConnection } from "net" +import { waitForDataUB, writeUB, destroyUB, setMessageID, waitForEncDataUB, writeEncUB, msgListenerUB, } from "./utils"; +import { genIntro, parseIntro, receiveCapabilities, receiveEncCheck, receivePubKey, receiveSymKey, sendCapabilities, sendEncCheck, sendMsg, sendMsgReq, sendPubKey } from "./messages"; +import { getPublicKey, utils } from "@noble/secp256k1" +import { createCipheriv, createDecipheriv } from "crypto"; +import { createReadStream } from "fs"; + + +export async function connect(): Promise<Socket> { + const sock = createConnection({ host: "localhost", port: 30522 }) + return await new Promise(r => { + sock.on("connect", () => r(sock)) + }) +} + +export type Context = { + conn: Socket +} & Record<any, any> + + +export const capabilities = [ + "text:0.0.1", + "test:0.0.1", + "data:0.0.1" +] + +async function main() { + + const conn = await connect(); + conn.setKeepAlive() + conn.setNoDelay(true) + + conn.on("error", (err) => { + console.error(err) + }) + conn.on("end", () => { + throw new Error(`Stream closed`) + }) + + // @ts-ignore + conn._writableState.highWaterMark = 1; + // @ts-ignore + conn._readableState.highWaterMark = 1; + + const destroy = destroyUB.bind(undefined, conn) + const write = writeUB.bind(undefined, conn) + const waitForData = waitForDataUB.bind(undefined, conn) + + await write(genIntro()) + + if (parseIntro(await waitForData())) destroy("Invalid intro") + + console.log("intro done") + + await sendCapabilities(write, capabilities) + + const serverCaps = await receiveCapabilities(waitForData, destroy) + console.log("server capabilities: ", serverCaps) + + // agreement. + await write(setMessageID(Buffer.alloc(2), 1)) + + const serverPubKey = await receivePubKey(waitForData, destroy) + + // console.log("ServerPubKey: ", serverPubKey) + + const privKey = Buffer.from(utils.randomPrivateKey()) + const pubKey = Buffer.from(getPublicKey(privKey)) + + // console.log("pubKey: ", pubKey) + + await sendPubKey(write, pubKey); + + await receiveEncCheck(write, waitForData, destroy, privKey) + + await sendEncCheck(write, waitForData, destroy, serverPubKey) + + const { key, iv } = await receiveSymKey(waitForData, destroy, write, privKey, serverPubKey) + + let cipher = createCipheriv("aes-256-ctr", key, iv) + let decipher = createDecipheriv("aes-256-ctr", key, iv) + + const writeEnc = writeEncUB.bind(undefined, conn, cipher) + + const waitForEncData = waitForEncDataUB.bind(undefined, conn, decipher) + + console.log("done") + + // await writeEnc(genIntro()) + + // console.log("p2pem:", (await waitForEncData()).toString("utf8")) + + let state = { s: "waiting" } + // @ts-ignore + const msgListener = msgListenerUB.bind(undefined, writeEnc, waitForEncData, destroy, decipher, state, capabilities) + // now we event-emitter bind to the socket to allow for unprompted comms + conn.on("data", async (d) => { + //@ts-ignore + await msgListener(d) + }) + + state.s = "transmitting" + const data = "Hello, World!" + const reqStatus = await sendMsgReq(writeEnc, waitForEncData, "data:0.0.1", BigInt(data.length)); + if (reqStatus) { + //const bData = Buffer.from(data, "utf8") + const bData = createReadStream("./llama.png") + await sendMsg(writeEnc, waitForEncData, bData) + } else { + console.log("validation failed"); + } + + console.log("done") +} + +main() + diff --git a/cw/src/messages.ts b/cw/src/messages.ts new file mode 100644 index 0000000000000000000000000000000000000000..1997ab293c4a239f58da2c01aa7a7af589933efe --- /dev/null +++ b/cw/src/messages.ts @@ -0,0 +1,223 @@ +import { destroy, getMessageID, setMessageID, SizeChunker, waitForData, write } from "./utils"; +import * as Crypto from "crypto"; + +import { encrypt, decrypt } from 'eciesjs' +import { randomBytes } from "crypto"; +import { utils, sign, verify } from "@noble/secp256k1"; +import { Readable } from "stream"; + +export function genIntro(): Buffer { + let t = Buffer.alloc(7) + t.writeIntBE(0, 0, 2) + t.write("P2PEM", 2, "utf8") + return t +} + +export function parseIntro(b: Buffer): boolean { + return (b.readIntBE(0, 2) != 0 || b.toString("utf8", 2) !== "P2PEM") +} + +export async function sendCapabilities(write: (d: any) => Promise<unknown>, capabilities: string[]) { + //cap primer + const capLength = capabilities.length + let t = setMessageID(Buffer.alloc(4), 5) + t.writeUIntBE(capLength, 2, 2) + + await write(t) + + for (let i = 0; i < capLength; i++) { + let cap = capabilities[i] + t = setMessageID(Buffer.alloc(2 + 1 + cap.length), 6) + t.writeIntBE(cap.length, 2, 1) + t.write(cap, 3, "utf8") + await write(t); + } + +} + +export async function receiveCapabilities(waitForData: waitForData, destroy: any): Promise<string[]> { + + const capPrimer = await waitForData(); + if (getMessageID(capPrimer) != 5) destroy("Invalid cap primer message ID") + + const capLength = capPrimer.readUIntBE(2, 2) + + if (capLength > 1024 || capLength < 0) destroy("Invalid capability primer") + + const clientCaps = [] + for (let i = 0; i < capLength; i++) { + let d = await waitForData() + if (getMessageID(d) != 6) destroy("Invalid cap message ID") + const capLength = d.readUIntBE(2, 1) + const recvCap = d.toString("utf8", 3) + if (recvCap.length != capLength) { + destroy(`Received capability wrong length ${capLength} - ${recvCap}`) + } + clientCaps.push(recvCap) + } + return clientCaps +} + +export async function sendPubKey(write: write, pubKey: Buffer) { + let t = setMessageID(Buffer.alloc(pubKey.byteLength + 2), 2) + pubKey.copy(t, 2) + await write(t) +} + + +export async function receivePubKey(waitForData: waitForData, destroy: destroy) { + + let data = await waitForData(); + if (getMessageID(data) !== 2) destroy("Expected pubKey message") + // const serverPubKey = data.toString("binary", 2) + return data.subarray(2) + +} + +export async function sendEncCheck(write: write, waitForData: waitForData, destroy: destroy, clientPubKey: Buffer) { + const byteCount = Crypto.randomInt(1_024, (65_536 - 97)) + + const bytes = Crypto.randomBytes(byteCount) + const message = setMessageID(Buffer.alloc(byteCount + 97 + 2), 3) + const enc = encrypt(clientPubKey, bytes) + enc.copy(message, 2) + + await write(message) + + const data = await waitForData(); + + if (getMessageID(data) !== 4) destroy("Expected message ID 4") + + if (Buffer.compare(bytes, data.subarray(2)) !== 0) destroy("Encryption ID check buffer content mismatch") + + await sendConfirmation(write) + +} + +export async function receiveEncCheck(write: write, waitForData: waitForData, destroy: destroy, privKey: Buffer) { + let d = await waitForData(); + if (getMessageID(d) !== 3) destroy("Expected message ID 3") + + const data = decrypt(privKey, d.subarray(2)) + + let msg = setMessageID(Buffer.alloc(data.length + 2), 4) + data.copy(msg, 2) + + await write(msg) + + d = await waitForData(); + + if (getMessageID(d) !== 1) destroy("Expected message ID 1") + +} + + +export async function genAndSendSymKey(write: write, waitForData: waitForData, destroy: destroy, privKey: Buffer, clientPubKey: Buffer) { + + + const key = randomBytes(32) + const iv = randomBytes(16) + const fullKey = Buffer.alloc(key.length + iv.length) + key.copy(fullKey, 0) + iv.copy(fullKey, 32) + + const sig = Buffer.from(await sign(await utils.sha256(fullKey), privKey)) // 70 bytes + + const encKey = encrypt(clientPubKey, fullKey) //145 bytes + + let t = setMessageID(Buffer.alloc(2 + 2 + encKey.length + 2 + sig.length), 7) + t.writeIntBE(encKey.length, 2, 2) + encKey.copy(t, 4) + t.writeIntBE(sig.length, encKey.length + 4, 2) + sig.copy(t, encKey.length + 6) + + console.log({ + keyLength: encKey.length, sigLength: sig.length, + kfb: encKey.at(0), klb: encKey.at(-1), + sfb: sig.at(0), slb: sig.at(-1) + }) + + + + await write(t) + + + if (getMessageID(await waitForData()) !== 1) destroy("expected confirmation of key validity") + return { key, iv } + +} + +export async function receiveSymKey(waitForData: waitForData, destroy: destroy, write: write, privKey: Buffer, serverPubKey: Buffer) { + + let d = await waitForData() + + if (getMessageID(d) !== 7) destroy("expected ID 7") + + const keyLength = d.readIntBE(2, 2) + const encKey = d.subarray(4, keyLength + 4) + const sigLength = d.readIntBE(keyLength + 4, 2) + const sig = d.subarray(keyLength + 6, keyLength + 6 + sigLength) + + console.log({ + keyLength, sigLength, + kfb: encKey.at(0), klb: encKey.at(-1), + sfb: sig.at(0), slb: sig.at(-1) + }) + + const fullKey = decrypt(privKey, encKey) + + if (!verify(sig, await utils.sha256(fullKey), serverPubKey)) destroy("Invalid signature for encrypted symKey") + await sendConfirmation(write) + + const key = fullKey.subarray(0, 32) + const iv = fullKey.subarray(32) + + return { key, iv } + +} + +export async function sendConfirmation(write: write) { + await write(setMessageID(Buffer.alloc(2), 1)) +} + + +export async function sendMsgReq(write: write, waitForData: waitForData, capability: string, size: bigint): Promise<Boolean> { + let m = setMessageID(Buffer.alloc(2 + 1 + capability.length + 8), 8) + m.writeUIntBE(capability.length, 2, 1) + m.write(capability, 3, "utf8") + m.writeBigUInt64BE(size, capability.length + 3) + // m.writeUBigIntBE(size, capability.length + 2, 8) + await write(m) + const res = await waitForData() + if (getMessageID(res) === 9 && res.readIntBE(2, 1) === 1) return true; + return false +} + +export async function sendMsg(write: write, waitForData: waitForData, data: Readable) { + const ckr = new SizeChunker({ + chunkSize: 1_000_000, + flushTail: true + }) + data.pipe(ckr) + + for await (const chunk of ckr) { + const data: Buffer = chunk.data + let m = setMessageID(Buffer.alloc(2 + 8), 10) + m.writeBigUInt64BE(BigInt(data.length), 2) + const hash = Buffer.from(await utils.sha256(data)) + // hash.copy(m, 10) + // data.copy(m, m.length) + m = Buffer.concat([m, hash, data]) + let i = 0; + do { + await write(m) + const res = await waitForData() + if (getMessageID(res) !== 11) console.warn("Chunk ack bad ID"); + if (res.at(2) === 1) i = 4; + i++ + } while (i < 3); + + } + console.log("done") + +} \ No newline at end of file diff --git a/cw/src/server.ts b/cw/src/server.ts new file mode 100644 index 0000000000000000000000000000000000000000..8c72f69f331b856e578501db2d337f1e6a251a52 --- /dev/null +++ b/cw/src/server.ts @@ -0,0 +1,107 @@ +import { genAndSendSymKey, genIntro, parseIntro, receiveCapabilities, receiveEncCheck, receivePubKey, sendCapabilities, sendEncCheck, sendPubKey } from "./messages" +import { createServer, Socket } from "net" +import { destroyUB, getMessageID, waitForDataUB, waitForEncDataUB, writeEncUB, writeUB, msgListenerUB } from "./utils" + +import { getPublicKey, utils } from "@noble/secp256k1" + +import { createCipheriv, createDecipheriv } from "crypto" + + +export async function listen(port = 30522) { + const server = createServer() + server.listen(port, () => { + console.log(`Listening on ${port}`) + }) + server.on("connection", handleConnection) +} + +export const capabilities = [ + "text:0.0.1", + "data:0.0.1" +] + + +export async function handleConnection(conn: Socket) { + const rAddr = `${conn.remoteAddress}:${conn.remotePort}` + console.log(`New connection from ${rAddr}`) + conn.setKeepAlive() + conn.setNoDelay(true) + conn.on("error", (err) => { + console.error(`${err} from ${rAddr}`); + return; + }) + conn.on("end", () => { + console.error(`Stream from ${rAddr} closed`) + return; + }) + + // @ts-ignore + conn._writableState.highWaterMark = 1; + // @ts-ignore + conn._readableState.highWaterMark = 1; + + const destroy = destroyUB.bind(undefined, conn) + const write = writeUB.bind(undefined, conn) + const waitForData = waitForDataUB.bind(undefined, conn) + + if (parseIntro(await waitForData())) destroy("Invalid intro") + + await write(genIntro()) + + console.log("intro done") + + const clientCaps = await receiveCapabilities(waitForData, destroy) + + // todo: capability negotiation logic + + await sendCapabilities(write, capabilities) + + console.log("client capabilities: ", clientCaps) + + if (getMessageID(await waitForData()) != 1) destroy("No confirmation for capability negotations") + + const privKey = Buffer.from(utils.randomPrivateKey()) + const pubKey = Buffer.from(getPublicKey(privKey)) + + // console.log("pubKey: ", pubKey) + + await sendPubKey(write, pubKey) + + const clientPubKey = await receivePubKey(waitForData, destroy) + + // console.log("ClientPubKey: ", clientPubKey) + + await sendEncCheck(write, waitForData, destroy, clientPubKey) + + await receiveEncCheck(write, waitForData, destroy, privKey) + + const { key, iv } = await genAndSendSymKey(write, waitForData, destroy, privKey, clientPubKey) + + const cipher = createCipheriv("aes-256-ctr", key, iv) + const decipher = createDecipheriv("aes-256-ctr", key, iv) + + + + const writeEnc = writeEncUB.bind(undefined, conn, cipher) + + const waitForEncData = waitForEncDataUB.bind(undefined, conn, decipher) + + console.log("done") + + // console.log("p2pem:", (await waitForEncData()).toString("utf8")) + + // await writeEnc(genIntro()) + + + let state = { s: "waiting" } + //@ts-ignore + const msgListener = msgListenerUB.bind(undefined, writeEnc, waitForEncData, destroy, decipher, state, capabilities) + // now we event-emitter bind to the socket to allow for unprompted comms + conn.on("data", async (d) => { + //@ts-ignore + await msgListener(d) + }) + +} + +listen() \ No newline at end of file diff --git a/cw/src/utils.ts b/cw/src/utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..0010d4ff5f022d78e5a58c2c8ef3305fbbe70ce7 --- /dev/null +++ b/cw/src/utils.ts @@ -0,0 +1,211 @@ + +import { Socket } from "net"; + + +import { Cipher, Decipher } from "crypto" +import { utils } from "@noble/secp256k1"; + +export const sleep = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms)); + +export type waitForData = () => Promise<Buffer> +export type write = (d: any) => Promise<unknown> +export type destroy = (message: any) => void + + + +export const destroyUB = (conn: Socket, msg: string) => { conn.destroy(new Error(msg)) } +let sendDelay = 50; + +export const writeUB = async (conn: Socket, d: any) => { + const diff = sendDelay - performance.now() + if (diff > 0) { + await sleep(diff) + } + sendDelay = performance.now() + 50 + return new Promise((res, rej) => { + conn.write(d, (err) => { + conn.emit("drain"); + if (err) rej(err) + setImmediate(() => res(true)) + // res(true) + }) + }) +} + +// let writes = 0; +// let reads = 0; + +export const writeEncUB = async (conn: Socket, cipher: Cipher, d: any) => { + // console.log("enc writes:", ++writes) + await writeUB(conn, cipher.update(d)) +} + +export async function waitForDataUB(s: Socket): Promise<Buffer> { + return new Promise(res => s.once("data", res)) +} + +export async function waitForEncDataUB(s: Socket, decipher: Decipher) { + // console.log("enc reads:", ++reads) + const eData = await waitForDataUB(s) + const decData = decipher.update(eData) + return decData +} + +export function getMessageID(b: Buffer) { + return b.readIntBE(0, 2) +} + +export function setMessageID(b: Buffer, id: number) { + b.writeIntBE(id, 0, 2) + return b; +} + + +export async function msgListenerUB(write: write, waitForData: waitForData, destroy: destroy, decipher: Decipher, state: any, capabilities: string[], d: Buffer) { + + // const { write, destroy, waitForData } = f + // let state = f.state; + // DO NOT DECRYPT UNLESS NEEDED + // WILL DESYNC COUNTERS + + if (state.s === "waiting") { + const data = decipher.update(d) + if (getMessageID(data) !== 8) destroy("Expected ID 8") + const capLen = data.readIntBE(2, 1) + const cap = data.toString("utf8", 3, capLen + 3) + if (!capabilities.includes(cap)) destroy("Invalid capability") + const dataLen = data.readBigUInt64BE(capLen + 3) + console.log(`Request for ${cap} with size ${dataLen}`) + const res = setMessageID(Buffer.alloc(3), 9) + res.writeIntBE(1, 2, 1) + state.s = "receiving"; + state.rec = 0; + state.size = dataLen; + state.ws = createWriteStream("./recv.data") + console.log(res) + await write(res) + return; + } else if (state.s === "receiving") { + const data = decipher.update(d) + if (getMessageID(data) !== 10) destroy("Expected ID 10 (chunk)") + const chnkSize = data.readBigUInt64BE(2) + const chnkHash = data.subarray(10, 42) + const chnkData = data.subarray(42) + const tstHash = await utils.sha256(chnkData) + const res = setMessageID(Buffer.alloc(3), 11) + if (Buffer.compare(chnkHash, tstHash) !== 0) { + res.writeUIntBE(0, 2, 1) + await write(res) + return; + } + res.writeUIntBE(1, 2, 1) + state.rec += chnkData.length; + if (state.rec >= state.size) { + console.log("done?") + state.ws.end(chnkData) + state.s = "waiting" + } else { + state.ws.write(chnkData) + } + console.log({ chnkSize, chnkHash: chnkHash.length, chnkData: chnkData.length }) + await write(res) + } + +} + + + +import internal, { Transform } from "stream"; +import { createWriteStream } from "fs"; +import { performance } from "perf_hooks"; + +export class SizeChunker extends Transform { + protected bytesPassed = 0 + protected currentChunk = -1 + protected lastEmittedChunk: undefined | number = undefined + protected chunkSize; + protected flushTail; + + constructor(options: internal.TransformOptions & { chunkSize: number, flushTail: boolean }) { + super({ ...options, readableObjectMode: true }); + this.chunkSize = options.chunkSize ?? 10_000 + this.flushTail = options.flushTail ?? false + this.readableObjectMode + this.once("end", () => { + if (this.flushTail && (this.lastEmittedChunk !== undefined) && this.bytesPassed > 0) { + this.emit("chunkEnd", this.currentChunk, () => { return }); + } + }); + + } + protected finishChunk(done: any): void { + if (this.listenerCount("chunkEnd") > 0) { + this.emit("chunkEnd", this.currentChunk, () => { + this.bytesPassed = 0; + this.lastEmittedChunk = undefined; + done(); + }); + } else { + this.bytesPassed = 0; + this.lastEmittedChunk = undefined; + done(); + } + } + + protected startChunk(done: any): void { + this.currentChunk++; + if (this.listenerCount("chunkStart") > 0) { + this.emit("chunkStart", this.currentChunk, done) + } else { + done(); + } + } + + protected pushData(buf: Buffer): void { + this.push({ + data: buf, + id: this.currentChunk + }); + + this.bytesPassed += buf.length; + }; + + protected startIfNeededAndPushData(buf: Buffer): void { + if (this.lastEmittedChunk != this.currentChunk) { + this.startChunk(() => { + this.lastEmittedChunk = this.currentChunk; + this.pushData(buf); + }) + } else { + this.pushData(buf); + } + } + + _transform(chunk: any, _encoding: BufferEncoding, done: internal.TransformCallback): void { + const doTransform = () => { + + const bytesLeave = Math.min(chunk.length, this.chunkSize - this.bytesPassed) + let remainder; + + if (this.bytesPassed + chunk.length < this.chunkSize) { + this.startIfNeededAndPushData(chunk); + done(); + } else { + + remainder = bytesLeave - chunk.length; + + if (remainder === 0) { + this.startIfNeededAndPushData(chunk); + this.finishChunk(done); + } else { + this.startIfNeededAndPushData(chunk.slice(0, bytesLeave)); + chunk = chunk.slice(bytesLeave); + this.finishChunk(doTransform); + } + } + + } + + doTransform(); + } +} diff --git a/cw/tsconfig.json b/cw/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..9f41421b353535f941e33e6787eb8619aeef3bf0 --- /dev/null +++ b/cw/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "allowJs": true, + "allowSyntheticDefaultImports": true, + "baseUrl": "src", + "declaration": true, + "esModuleInterop": true, + "inlineSourceMap": false, + "lib": ["esnext"], + "target": "esnext", + "listEmittedFiles": false, + "listFiles": false, + "moduleResolution": "node", + "noFallthroughCasesInSwitch": true, + "pretty": true, + "resolveJsonModule": true, + "rootDir": "src", + "skipLibCheck": true, + "strict": true, + "traceResolution": false, + "types": ["node"] + }, + "compileOnSave": true, + "exclude": ["node_modules"], + "include": ["src"] + + } \ No newline at end of file diff --git a/cw/yarn-error.log b/cw/yarn-error.log new file mode 100644 index 0000000000000000000000000000000000000000..2d2d00ac17d2732dfb0cb55462530cb0e13c4344 --- /dev/null +++ b/cw/yarn-error.log @@ -0,0 +1,343 @@ +Arguments: + /usr/local/bin/node /usr/share/yarn/bin/yarn.js add -D @types/secp256k1 + +PATH: + /home/node/.vscode-server/bin/dfd34e8260c270da74b5c2d86d61aee4b6d56977/bin/remote-cli:/usr/local/share/npm-global/bin:/usr/local/share/nvm/current/bin:/usr/local/share/npm-global/bin:/usr/local/share/nvm/current/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/node/.local/bin + +Yarn version: + 1.22.17 + +Node version: + 16.14.0 + +Platform: + linux x64 + +Trace: + Error: EACCES: permission denied, unlink '/workspaces/Networking/cw/node_modules/.bin/acorn' + +npm manifest: + { + "name": "cw", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "devDependencies": { + "@types/koa-compose": "^3.2.5", + "@types/node": "^17.0.25", + "ts-node": "^10.7.0", + "typescript": "^4.6.3" + }, + "dependencies": { + "koa-compose": "^4.1.0", + "secp256k1": "^4.0.3" + } + } + +yarn manifest: + No manifest + +Lockfile: + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. + # yarn lockfile v1 + + + "@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + + "@cspotcode/source-map-support@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== + dependencies: + "@cspotcode/source-map-consumer" "0.8.0" + + "@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + + "@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + + "@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + + "@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + + "@types/accepts@*": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== + dependencies: + "@types/node" "*" + + "@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + + "@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + + "@types/content-disposition@*": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.4.tgz#de48cf01c79c9f1560bcfd8ae43217ab028657f8" + integrity sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ== + + "@types/cookies@*": + version "0.7.7" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" + integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + + "@types/express-serve-static-core@^4.17.18": + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + + "@types/express@*": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + + "@types/http-assert@*": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" + integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== + + "@types/http-errors@*": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.2.tgz#7315b4c4c54f82d13fa61c228ec5c2ea5cc9e0e1" + integrity sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w== + + "@types/keygrip@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" + integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== + + "@types/koa-compose@*", "@types/koa-compose@^3.2.5": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" + integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== + dependencies: + "@types/koa" "*" + + "@types/koa@*": + version "2.13.4" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.4.tgz#10620b3f24a8027ef5cbae88b393d1b31205726b" + integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + + "@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + + "@types/node@*": + version "17.0.29" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.29.tgz#7f2e1159231d4a077bb660edab0fde373e375a3d" + integrity sha512-tx5jMmMFwx7wBwq/V7OohKDVb/JwJU5qCVkeLMh1//xycAJ/ESuw9aJ9SEtlCZDYi2pBfe4JkisSoAtbOsBNAA== + + "@types/node@^17.0.25": + version "17.0.25" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.25.tgz#527051f3c2f77aa52e5dc74e45a3da5fb2301448" + integrity sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w== + + "@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + + "@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + + "@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + + acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + + acorn@^8.4.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + + arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + + bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + + brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + + create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + + diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + + elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + + hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + + hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + + inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + + koa-compose@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" + integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== + + make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + + minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + + node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + + node-gyp-build@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + + secp256k1@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + + ts-node@^10.7.0: + version "10.7.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" + integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== + dependencies: + "@cspotcode/source-map-support" "0.7.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.0" + yn "3.1.1" + + typescript@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" + integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== + + v8-compile-cache-lib@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + + yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== diff --git a/cw/yarn.lock b/cw/yarn.lock new file mode 100644 index 0000000000000000000000000000000000000000..7683d11724b53771cd704b4c4d687010ea725ca3 --- /dev/null +++ b/cw/yarn.lock @@ -0,0 +1,341 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== + dependencies: + "@cspotcode/source-map-consumer" "0.8.0" + +"@noble/secp256k1@^1.5.5": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.5.5.tgz#315ab5745509d1a8c8e90d0bdf59823ccf9bcfc3" + integrity sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ== + +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + +"@types/accepts@*": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575" + integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ== + dependencies: + "@types/node" "*" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/content-disposition@*": + version "0.5.4" + resolved "https://registry.yarnpkg.com/@types/content-disposition/-/content-disposition-0.5.4.tgz#de48cf01c79c9f1560bcfd8ae43217ab028657f8" + integrity sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ== + +"@types/cookies@*": + version "0.7.7" + resolved "https://registry.yarnpkg.com/@types/cookies/-/cookies-0.7.7.tgz#7a92453d1d16389c05a5301eef566f34946cfd81" + integrity sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA== + dependencies: + "@types/connect" "*" + "@types/express" "*" + "@types/keygrip" "*" + "@types/node" "*" + +"@types/express-serve-static-core@^4.17.18": + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-assert@*": + version "1.5.3" + resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.3.tgz#ef8e3d1a8d46c387f04ab0f2e8ab8cb0c5078661" + integrity sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA== + +"@types/http-errors@*": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-1.8.2.tgz#7315b4c4c54f82d13fa61c228ec5c2ea5cc9e0e1" + integrity sha512-EqX+YQxINb+MeXaIqYDASb6U6FCHbWjkj4a1CKDBks3d/QiB2+PqBLyO72vLDgAO1wUI4O+9gweRcQK11bTL/w== + +"@types/keygrip@*": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72" + integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw== + +"@types/koa-compose@*", "@types/koa-compose@^3.2.5": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d" + integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ== + dependencies: + "@types/koa" "*" + +"@types/koa@*": + version "2.13.4" + resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.13.4.tgz#10620b3f24a8027ef5cbae88b393d1b31205726b" + integrity sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw== + dependencies: + "@types/accepts" "*" + "@types/content-disposition" "*" + "@types/cookies" "*" + "@types/http-assert" "*" + "@types/http-errors" "*" + "@types/keygrip" "*" + "@types/koa-compose" "*" + "@types/node" "*" + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/node@*": + version "17.0.29" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.29.tgz#7f2e1159231d4a077bb660edab0fde373e375a3d" + integrity sha512-tx5jMmMFwx7wBwq/V7OohKDVb/JwJU5qCVkeLMh1//xycAJ/ESuw9aJ9SEtlCZDYi2pBfe4JkisSoAtbOsBNAA== + +"@types/node@^17.0.25": + version "17.0.25" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.25.tgz#527051f3c2f77aa52e5dc74e45a3da5fb2301448" + integrity sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/secp256k1@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +eciesjs@^0.3.14: + version "0.3.14" + resolved "https://registry.yarnpkg.com/eciesjs/-/eciesjs-0.3.14.tgz#98c98dc519222cdc7b6f9a055b8a7a2e658ab543" + integrity sha512-rBbLawo9HRMksRrroYa32RG0BbZ692fRArt1VjeI/pG6hZoSfGTFxxi6jNztJwwNt9EziIGBV7LBczntChmVFw== + dependencies: + "@types/secp256k1" "^4.0.3" + futoin-hkdf "^1.5.0" + secp256k1 "^4.0.3" + +elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +futoin-hkdf@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/futoin-hkdf/-/futoin-hkdf-1.5.0.tgz#f10cc4d32f1e26568ded58d5a6535a97aa3a064c" + integrity sha512-4CerDhtTgx4i5PKccQIpEp4T9wqmosPIP9Kep35SdCpYkQeriD3zddUVhrO1Fc4QvGhsAnd2rXyoOr5047mJEg== + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +koa-compose@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" + integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-gyp-build@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + +retry@0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +secp256k1@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +ts-node@^10.7.0: + version "10.7.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" + integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== + dependencies: + "@cspotcode/source-map-support" "0.7.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.0" + yn "3.1.1" + +typescript@^4.6.3: + version "4.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" + integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== + +v8-compile-cache-lib@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==