From 8e66869c612c4567037fea0b1943323b32f9049c Mon Sep 17 00:00:00 2001 From: JesseTheRobot <jesse.cruz.wright@gmail.com> Date: Thu, 5 May 2022 09:22:43 +0000 Subject: [PATCH] cw --- .gitignore | 2 + README.md | 3 +- cw/.gitignore | 1 + cw/.vscode/launch.json | 25 +++ cw/llama.png | Bin 0 -> 28809 bytes cw/package.json | 18 +++ cw/recv.png | Bin 0 -> 28809 bytes cw/src/client.ts | 118 ++++++++++++++ cw/src/messages.ts | 223 +++++++++++++++++++++++++++ cw/src/server.ts | 107 +++++++++++++ cw/src/utils.ts | 211 +++++++++++++++++++++++++ cw/tsconfig.json | 27 ++++ cw/yarn-error.log | 343 +++++++++++++++++++++++++++++++++++++++++ cw/yarn.lock | 341 ++++++++++++++++++++++++++++++++++++++++ 14 files changed, 1417 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 cw/.gitignore create mode 100644 cw/.vscode/launch.json create mode 100644 cw/llama.png create mode 100644 cw/package.json create mode 100644 cw/recv.png create mode 100644 cw/src/client.ts create mode 100644 cw/src/messages.ts create mode 100644 cw/src/server.ts create mode 100644 cw/src/utils.ts create mode 100644 cw/tsconfig.json create mode 100644 cw/yarn-error.log create mode 100644 cw/yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cbff306 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.devcontainer/ +test/ diff --git a/README.md b/README.md index 8e1e6f2..e159d19 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 0000000..40b878d --- /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 0000000..0385ef7 --- /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 GIT binary patch literal 28809 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 literal 0 HcmV?d00001 diff --git a/cw/package.json b/cw/package.json new file mode 100644 index 0000000..61377c6 --- /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 GIT binary patch literal 28809 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 literal 0 HcmV?d00001 diff --git a/cw/src/client.ts b/cw/src/client.ts new file mode 100644 index 0000000..191378e --- /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 0000000..1997ab2 --- /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 0000000..8c72f69 --- /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 0000000..0010d4f --- /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 0000000..9f41421 --- /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 0000000..2d2d00a --- /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 0000000..7683d11 --- /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== -- GitLab