From 5ebab3959a771b9e3e3bb7ef29c8f2ce1c648474 Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 2 Jun 2024 21:09:07 +0100 Subject: [PATCH 01/15] Add `as` and `addToPath` options --- action.yml | 8 ++++++++ package-lock.json | 8 ++++---- package.json | 2 +- src/download-settings.ts | 10 ++++++++++ src/input-helper.ts | 4 +++- src/main.ts | 15 +++++++++++++++ 6 files changed, 41 insertions(+), 6 deletions(-) diff --git a/action.yml b/action.yml index b4c80a5a..a88ff451 100644 --- a/action.yml +++ b/action.yml @@ -61,6 +61,14 @@ inputs: description: 'The release id to download the file from' default: '' required: false + as: + description: 'The output name of the asset' + default: '' + required: false + addToPath: + description: 'Whether to add the output path to PATH (so a binary can be global referenced)' + default: 'false' + required: false outputs: tag_name: description: 'The github tag used to download the release' diff --git a/package-lock.json b/package-lock.json index e98fb547..b04049ac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "devDependencies": { "@jest/globals": "^29.7.0", "@types/jest": "^29.5.12", - "@types/node": "^20.12.12", + "@types/node": "^20.13.0", "@types/tar": "^6.1.13", "@typescript-eslint/eslint-plugin": "^7.10.0", "@typescript-eslint/parser": "^7.10.0", @@ -1578,9 +1578,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "version": "20.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.13.0.tgz", + "integrity": "sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" diff --git a/package.json b/package.json index 59339710..1cac22ea 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "devDependencies": { "@jest/globals": "^29.7.0", "@types/jest": "^29.5.12", - "@types/node": "^20.12.12", + "@types/node": "^20.13.0", "@types/tar": "^6.1.13", "@typescript-eslint/eslint-plugin": "^7.10.0", "@typescript-eslint/parser": "^7.10.0", diff --git a/src/download-settings.ts b/src/download-settings.ts index 88f5b6c0..06de0674 100644 --- a/src/download-settings.ts +++ b/src/download-settings.ts @@ -48,4 +48,14 @@ export interface IReleaseDownloadSettings { * Extract downloaded files to outFilePath */ extractAssets: boolean + + /** + * Add downloaded file path to the PATH environment variable + */ + addToPathEnvironmentVariable: boolean + + /** + * Rename output (expected to only download single asset) + */ + as: string } diff --git a/src/input-helper.ts b/src/input-helper.ts index 1d92f406..38f2afcc 100644 --- a/src/input-helper.ts +++ b/src/input-helper.ts @@ -53,6 +53,8 @@ export function getInputs(): IReleaseDownloadSettings { outFilePath: path.resolve( githubWorkspacePath, core.getInput('out-file-path') || '.' - ) + ), + addToPathEnvironmentVariable: core.getBooleanInput('addToPath'), + as: core.getInput('as') } } diff --git a/src/main.ts b/src/main.ts index f94ce06c..72b86fca 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,6 +2,8 @@ import * as core from '@actions/core' import * as handlers from 'typed-rest-client/Handlers' import * as inputHelper from './input-helper' import * as thc from 'typed-rest-client/HttpClient' +import { delimiter } from "node:path"; +import { readdirSync, renameSync } from "node:fs"; import { ReleaseDownloader } from './release-downloader' import { extract } from './unarchive' @@ -30,6 +32,19 @@ async function run(): Promise { } } + if (downloadSettings.as !== "") { + // TODO could move logic to above? + const inOutFilePath = readdirSync(downloadSettings.outFilePath); + if (inOutFilePath.length !== 1) { + throw new Error("`as` can only be used when one file is being downloaded"); + } + renameSync(inOutFilePath[0], downloadSettings.as); + } + + if (downloadSettings.addToPathEnvironmentVariable) { + process.env.PATH += delimiter + downloadSettings.outFilePath; + } + core.info(`Done: ${res}`) } catch (error) { if (error instanceof Error) { From 9d657ce34845c7afe06e78579d628ca07af53be4 Mon Sep 17 00:00:00 2001 From: Ben Date: Sun, 2 Jun 2024 21:22:50 +0100 Subject: [PATCH 02/15] Build action --- action.yml | 4 +- dist/index.js | 2174 +++++++++++++++++++++++++++++-------------------- 2 files changed, 1282 insertions(+), 896 deletions(-) diff --git a/action.yml b/action.yml index a88ff451..9c65247f 100644 --- a/action.yml +++ b/action.yml @@ -66,7 +66,9 @@ inputs: default: '' required: false addToPath: - description: 'Whether to add the output path to PATH (so a binary can be global referenced)' + description: + 'Whether to add the output path to PATH (so a binary can be global + referenced)' default: 'false' required: false outputs: diff --git a/dist/index.js b/dist/index.js index a74e6366..12694f6b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -6735,716 +6735,6 @@ module.exports = function getSideChannel() { }; -/***/ }), - -/***/ 6684: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -const proc = - typeof process === 'object' && process - ? process - : { - stdout: null, - stderr: null, - } -const EE = __nccwpck_require__(2361) -const Stream = __nccwpck_require__(2781) -const stringdecoder = __nccwpck_require__(1576) -const SD = stringdecoder.StringDecoder - -const EOF = Symbol('EOF') -const MAYBE_EMIT_END = Symbol('maybeEmitEnd') -const EMITTED_END = Symbol('emittedEnd') -const EMITTING_END = Symbol('emittingEnd') -const EMITTED_ERROR = Symbol('emittedError') -const CLOSED = Symbol('closed') -const READ = Symbol('read') -const FLUSH = Symbol('flush') -const FLUSHCHUNK = Symbol('flushChunk') -const ENCODING = Symbol('encoding') -const DECODER = Symbol('decoder') -const FLOWING = Symbol('flowing') -const PAUSED = Symbol('paused') -const RESUME = Symbol('resume') -const BUFFER = Symbol('buffer') -const PIPES = Symbol('pipes') -const BUFFERLENGTH = Symbol('bufferLength') -const BUFFERPUSH = Symbol('bufferPush') -const BUFFERSHIFT = Symbol('bufferShift') -const OBJECTMODE = Symbol('objectMode') -// internal event when stream is destroyed -const DESTROYED = Symbol('destroyed') -// internal event when stream has an error -const ERROR = Symbol('error') -const EMITDATA = Symbol('emitData') -const EMITEND = Symbol('emitEnd') -const EMITEND2 = Symbol('emitEnd2') -const ASYNC = Symbol('async') -const ABORT = Symbol('abort') -const ABORTED = Symbol('aborted') -const SIGNAL = Symbol('signal') - -const defer = fn => Promise.resolve().then(fn) - -// TODO remove when Node v8 support drops -const doIter = global._MP_NO_ITERATOR_SYMBOLS_ !== '1' -const ASYNCITERATOR = - (doIter && Symbol.asyncIterator) || Symbol('asyncIterator not implemented') -const ITERATOR = - (doIter && Symbol.iterator) || Symbol('iterator not implemented') - -// events that mean 'the stream is over' -// these are treated specially, and re-emitted -// if they are listened for after emitting. -const isEndish = ev => ev === 'end' || ev === 'finish' || ev === 'prefinish' - -const isArrayBuffer = b => - b instanceof ArrayBuffer || - (typeof b === 'object' && - b.constructor && - b.constructor.name === 'ArrayBuffer' && - b.byteLength >= 0) - -const isArrayBufferView = b => !Buffer.isBuffer(b) && ArrayBuffer.isView(b) - -class Pipe { - constructor(src, dest, opts) { - this.src = src - this.dest = dest - this.opts = opts - this.ondrain = () => src[RESUME]() - dest.on('drain', this.ondrain) - } - unpipe() { - this.dest.removeListener('drain', this.ondrain) - } - // istanbul ignore next - only here for the prototype - proxyErrors() {} - end() { - this.unpipe() - if (this.opts.end) this.dest.end() - } -} - -class PipeProxyErrors extends Pipe { - unpipe() { - this.src.removeListener('error', this.proxyErrors) - super.unpipe() - } - constructor(src, dest, opts) { - super(src, dest, opts) - this.proxyErrors = er => dest.emit('error', er) - src.on('error', this.proxyErrors) - } -} - -class Minipass extends Stream { - constructor(options) { - super() - this[FLOWING] = false - // whether we're explicitly paused - this[PAUSED] = false - this[PIPES] = [] - this[BUFFER] = [] - this[OBJECTMODE] = (options && options.objectMode) || false - if (this[OBJECTMODE]) this[ENCODING] = null - else this[ENCODING] = (options && options.encoding) || null - if (this[ENCODING] === 'buffer') this[ENCODING] = null - this[ASYNC] = (options && !!options.async) || false - this[DECODER] = this[ENCODING] ? new SD(this[ENCODING]) : null - this[EOF] = false - this[EMITTED_END] = false - this[EMITTING_END] = false - this[CLOSED] = false - this[EMITTED_ERROR] = null - this.writable = true - this.readable = true - this[BUFFERLENGTH] = 0 - this[DESTROYED] = false - if (options && options.debugExposeBuffer === true) { - Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] }) - } - if (options && options.debugExposePipes === true) { - Object.defineProperty(this, 'pipes', { get: () => this[PIPES] }) - } - this[SIGNAL] = options && options.signal - this[ABORTED] = false - if (this[SIGNAL]) { - this[SIGNAL].addEventListener('abort', () => this[ABORT]()) - if (this[SIGNAL].aborted) { - this[ABORT]() - } - } - } - - get bufferLength() { - return this[BUFFERLENGTH] - } - - get encoding() { - return this[ENCODING] - } - set encoding(enc) { - if (this[OBJECTMODE]) throw new Error('cannot set encoding in objectMode') - - if ( - this[ENCODING] && - enc !== this[ENCODING] && - ((this[DECODER] && this[DECODER].lastNeed) || this[BUFFERLENGTH]) - ) - throw new Error('cannot change encoding') - - if (this[ENCODING] !== enc) { - this[DECODER] = enc ? new SD(enc) : null - if (this[BUFFER].length) - this[BUFFER] = this[BUFFER].map(chunk => this[DECODER].write(chunk)) - } - - this[ENCODING] = enc - } - - setEncoding(enc) { - this.encoding = enc - } - - get objectMode() { - return this[OBJECTMODE] - } - set objectMode(om) { - this[OBJECTMODE] = this[OBJECTMODE] || !!om - } - - get ['async']() { - return this[ASYNC] - } - set ['async'](a) { - this[ASYNC] = this[ASYNC] || !!a - } - - // drop everything and get out of the flow completely - [ABORT]() { - this[ABORTED] = true - this.emit('abort', this[SIGNAL].reason) - this.destroy(this[SIGNAL].reason) - } - - get aborted() { - return this[ABORTED] - } - set aborted(_) {} - - write(chunk, encoding, cb) { - if (this[ABORTED]) return false - if (this[EOF]) throw new Error('write after end') - - if (this[DESTROYED]) { - this.emit( - 'error', - Object.assign( - new Error('Cannot call write after a stream was destroyed'), - { code: 'ERR_STREAM_DESTROYED' } - ) - ) - return true - } - - if (typeof encoding === 'function') (cb = encoding), (encoding = 'utf8') - - if (!encoding) encoding = 'utf8' - - const fn = this[ASYNC] ? defer : f => f() - - // convert array buffers and typed array views into buffers - // at some point in the future, we may want to do the opposite! - // leave strings and buffers as-is - // anything else switches us into object mode - if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) { - if (isArrayBufferView(chunk)) - chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength) - else if (isArrayBuffer(chunk)) chunk = Buffer.from(chunk) - else if (typeof chunk !== 'string') - // use the setter so we throw if we have encoding set - this.objectMode = true - } - - // handle object mode up front, since it's simpler - // this yields better performance, fewer checks later. - if (this[OBJECTMODE]) { - /* istanbul ignore if - maybe impossible? */ - if (this.flowing && this[BUFFERLENGTH] !== 0) this[FLUSH](true) - - if (this.flowing) this.emit('data', chunk) - else this[BUFFERPUSH](chunk) - - if (this[BUFFERLENGTH] !== 0) this.emit('readable') - - if (cb) fn(cb) - - return this.flowing - } - - // at this point the chunk is a buffer or string - // don't buffer it up or send it to the decoder - if (!chunk.length) { - if (this[BUFFERLENGTH] !== 0) this.emit('readable') - if (cb) fn(cb) - return this.flowing - } - - // fast-path writing strings of same encoding to a stream with - // an empty buffer, skipping the buffer/decoder dance - if ( - typeof chunk === 'string' && - // unless it is a string already ready for us to use - !(encoding === this[ENCODING] && !this[DECODER].lastNeed) - ) { - chunk = Buffer.from(chunk, encoding) - } - - if (Buffer.isBuffer(chunk) && this[ENCODING]) - chunk = this[DECODER].write(chunk) - - // Note: flushing CAN potentially switch us into not-flowing mode - if (this.flowing && this[BUFFERLENGTH] !== 0) this[FLUSH](true) - - if (this.flowing) this.emit('data', chunk) - else this[BUFFERPUSH](chunk) - - if (this[BUFFERLENGTH] !== 0) this.emit('readable') - - if (cb) fn(cb) - - return this.flowing - } - - read(n) { - if (this[DESTROYED]) return null - - if (this[BUFFERLENGTH] === 0 || n === 0 || n > this[BUFFERLENGTH]) { - this[MAYBE_EMIT_END]() - return null - } - - if (this[OBJECTMODE]) n = null - - if (this[BUFFER].length > 1 && !this[OBJECTMODE]) { - if (this.encoding) this[BUFFER] = [this[BUFFER].join('')] - else this[BUFFER] = [Buffer.concat(this[BUFFER], this[BUFFERLENGTH])] - } - - const ret = this[READ](n || null, this[BUFFER][0]) - this[MAYBE_EMIT_END]() - return ret - } - - [READ](n, chunk) { - if (n === chunk.length || n === null) this[BUFFERSHIFT]() - else { - this[BUFFER][0] = chunk.slice(n) - chunk = chunk.slice(0, n) - this[BUFFERLENGTH] -= n - } - - this.emit('data', chunk) - - if (!this[BUFFER].length && !this[EOF]) this.emit('drain') - - return chunk - } - - end(chunk, encoding, cb) { - if (typeof chunk === 'function') (cb = chunk), (chunk = null) - if (typeof encoding === 'function') (cb = encoding), (encoding = 'utf8') - if (chunk) this.write(chunk, encoding) - if (cb) this.once('end', cb) - this[EOF] = true - this.writable = false - - // if we haven't written anything, then go ahead and emit, - // even if we're not reading. - // we'll re-emit if a new 'end' listener is added anyway. - // This makes MP more suitable to write-only use cases. - if (this.flowing || !this[PAUSED]) this[MAYBE_EMIT_END]() - return this - } - - // don't let the internal resume be overwritten - [RESUME]() { - if (this[DESTROYED]) return - - this[PAUSED] = false - this[FLOWING] = true - this.emit('resume') - if (this[BUFFER].length) this[FLUSH]() - else if (this[EOF]) this[MAYBE_EMIT_END]() - else this.emit('drain') - } - - resume() { - return this[RESUME]() - } - - pause() { - this[FLOWING] = false - this[PAUSED] = true - } - - get destroyed() { - return this[DESTROYED] - } - - get flowing() { - return this[FLOWING] - } - - get paused() { - return this[PAUSED] - } - - [BUFFERPUSH](chunk) { - if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1 - else this[BUFFERLENGTH] += chunk.length - this[BUFFER].push(chunk) - } - - [BUFFERSHIFT]() { - if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1 - else this[BUFFERLENGTH] -= this[BUFFER][0].length - return this[BUFFER].shift() - } - - [FLUSH](noDrain) { - do {} while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) && this[BUFFER].length) - - if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain') - } - - [FLUSHCHUNK](chunk) { - this.emit('data', chunk) - return this.flowing - } - - pipe(dest, opts) { - if (this[DESTROYED]) return - - const ended = this[EMITTED_END] - opts = opts || {} - if (dest === proc.stdout || dest === proc.stderr) opts.end = false - else opts.end = opts.end !== false - opts.proxyErrors = !!opts.proxyErrors - - // piping an ended stream ends immediately - if (ended) { - if (opts.end) dest.end() - } else { - this[PIPES].push( - !opts.proxyErrors - ? new Pipe(this, dest, opts) - : new PipeProxyErrors(this, dest, opts) - ) - if (this[ASYNC]) defer(() => this[RESUME]()) - else this[RESUME]() - } - - return dest - } - - unpipe(dest) { - const p = this[PIPES].find(p => p.dest === dest) - if (p) { - this[PIPES].splice(this[PIPES].indexOf(p), 1) - p.unpipe() - } - } - - addListener(ev, fn) { - return this.on(ev, fn) - } - - on(ev, fn) { - const ret = super.on(ev, fn) - if (ev === 'data' && !this[PIPES].length && !this.flowing) this[RESUME]() - else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) - super.emit('readable') - else if (isEndish(ev) && this[EMITTED_END]) { - super.emit(ev) - this.removeAllListeners(ev) - } else if (ev === 'error' && this[EMITTED_ERROR]) { - if (this[ASYNC]) defer(() => fn.call(this, this[EMITTED_ERROR])) - else fn.call(this, this[EMITTED_ERROR]) - } - return ret - } - - get emittedEnd() { - return this[EMITTED_END] - } - - [MAYBE_EMIT_END]() { - if ( - !this[EMITTING_END] && - !this[EMITTED_END] && - !this[DESTROYED] && - this[BUFFER].length === 0 && - this[EOF] - ) { - this[EMITTING_END] = true - this.emit('end') - this.emit('prefinish') - this.emit('finish') - if (this[CLOSED]) this.emit('close') - this[EMITTING_END] = false - } - } - - emit(ev, data, ...extra) { - // error and close are only events allowed after calling destroy() - if (ev !== 'error' && ev !== 'close' && ev !== DESTROYED && this[DESTROYED]) - return - else if (ev === 'data') { - return !this[OBJECTMODE] && !data - ? false - : this[ASYNC] - ? defer(() => this[EMITDATA](data)) - : this[EMITDATA](data) - } else if (ev === 'end') { - return this[EMITEND]() - } else if (ev === 'close') { - this[CLOSED] = true - // don't emit close before 'end' and 'finish' - if (!this[EMITTED_END] && !this[DESTROYED]) return - const ret = super.emit('close') - this.removeAllListeners('close') - return ret - } else if (ev === 'error') { - this[EMITTED_ERROR] = data - super.emit(ERROR, data) - const ret = - !this[SIGNAL] || this.listeners('error').length - ? super.emit('error', data) - : false - this[MAYBE_EMIT_END]() - return ret - } else if (ev === 'resume') { - const ret = super.emit('resume') - this[MAYBE_EMIT_END]() - return ret - } else if (ev === 'finish' || ev === 'prefinish') { - const ret = super.emit(ev) - this.removeAllListeners(ev) - return ret - } - - // Some other unknown event - const ret = super.emit(ev, data, ...extra) - this[MAYBE_EMIT_END]() - return ret - } - - [EMITDATA](data) { - for (const p of this[PIPES]) { - if (p.dest.write(data) === false) this.pause() - } - const ret = super.emit('data', data) - this[MAYBE_EMIT_END]() - return ret - } - - [EMITEND]() { - if (this[EMITTED_END]) return - - this[EMITTED_END] = true - this.readable = false - if (this[ASYNC]) defer(() => this[EMITEND2]()) - else this[EMITEND2]() - } - - [EMITEND2]() { - if (this[DECODER]) { - const data = this[DECODER].end() - if (data) { - for (const p of this[PIPES]) { - p.dest.write(data) - } - super.emit('data', data) - } - } - - for (const p of this[PIPES]) { - p.end() - } - const ret = super.emit('end') - this.removeAllListeners('end') - return ret - } - - // const all = await stream.collect() - collect() { - const buf = [] - if (!this[OBJECTMODE]) buf.dataLength = 0 - // set the promise first, in case an error is raised - // by triggering the flow here. - const p = this.promise() - this.on('data', c => { - buf.push(c) - if (!this[OBJECTMODE]) buf.dataLength += c.length - }) - return p.then(() => buf) - } - - // const data = await stream.concat() - concat() { - return this[OBJECTMODE] - ? Promise.reject(new Error('cannot concat in objectMode')) - : this.collect().then(buf => - this[OBJECTMODE] - ? Promise.reject(new Error('cannot concat in objectMode')) - : this[ENCODING] - ? buf.join('') - : Buffer.concat(buf, buf.dataLength) - ) - } - - // stream.promise().then(() => done, er => emitted error) - promise() { - return new Promise((resolve, reject) => { - this.on(DESTROYED, () => reject(new Error('stream destroyed'))) - this.on('error', er => reject(er)) - this.on('end', () => resolve()) - }) - } - - // for await (let chunk of stream) - [ASYNCITERATOR]() { - let stopped = false - const stop = () => { - this.pause() - stopped = true - return Promise.resolve({ done: true }) - } - const next = () => { - if (stopped) return stop() - const res = this.read() - if (res !== null) return Promise.resolve({ done: false, value: res }) - - if (this[EOF]) return stop() - - let resolve = null - let reject = null - const onerr = er => { - this.removeListener('data', ondata) - this.removeListener('end', onend) - this.removeListener(DESTROYED, ondestroy) - stop() - reject(er) - } - const ondata = value => { - this.removeListener('error', onerr) - this.removeListener('end', onend) - this.removeListener(DESTROYED, ondestroy) - this.pause() - resolve({ value: value, done: !!this[EOF] }) - } - const onend = () => { - this.removeListener('error', onerr) - this.removeListener('data', ondata) - this.removeListener(DESTROYED, ondestroy) - stop() - resolve({ done: true }) - } - const ondestroy = () => onerr(new Error('stream destroyed')) - return new Promise((res, rej) => { - reject = rej - resolve = res - this.once(DESTROYED, ondestroy) - this.once('error', onerr) - this.once('end', onend) - this.once('data', ondata) - }) - } - - return { - next, - throw: stop, - return: stop, - [ASYNCITERATOR]() { - return this - }, - } - } - - // for (let chunk of stream) - [ITERATOR]() { - let stopped = false - const stop = () => { - this.pause() - this.removeListener(ERROR, stop) - this.removeListener(DESTROYED, stop) - this.removeListener('end', stop) - stopped = true - return { done: true } - } - - const next = () => { - if (stopped) return stop() - const value = this.read() - return value === null ? stop() : { value } - } - this.once('end', stop) - this.once(ERROR, stop) - this.once(DESTROYED, stop) - - return { - next, - throw: stop, - return: stop, - [ITERATOR]() { - return this - }, - } - } - - destroy(er) { - if (this[DESTROYED]) { - if (er) this.emit('error', er) - else this.emit(DESTROYED) - return this - } - - this[DESTROYED] = true - - // throw away all buffered data, it's never coming out - this[BUFFER].length = 0 - this[BUFFERLENGTH] = 0 - - if (typeof this.close === 'function' && !this[CLOSED]) this.close() - - if (er) this.emit('error', er) - // if no error to emit, still reject pending promises - else this.emit(DESTROYED) - - return this - } - - static isStream(s) { - return ( - !!s && - (s instanceof Minipass || - s instanceof Stream || - (s instanceof EE && - // readable - (typeof s.pipe === 'function' || - // writable - (typeof s.write === 'function' && typeof s.end === 'function')))) - ) - } -} - -exports.Minipass = Minipass - - /***/ }), /***/ 4294: @@ -31904,7 +31194,9 @@ function getInputs() { tarBall: core.getBooleanInput('tarBall'), zipBall: core.getBooleanInput('zipBall'), extractAssets: core.getBooleanInput('extract'), - outFilePath: path.resolve(githubWorkspacePath, core.getInput('out-file-path') || '.') + outFilePath: path.resolve(githubWorkspacePath, core.getInput('out-file-path') || '.'), + addToPathEnvironmentVariable: core.getBooleanInput('addToPath'), + as: core.getInput('as') }; } exports.getInputs = getInputs; @@ -31945,6 +31237,8 @@ const core = __importStar(__nccwpck_require__(2186)); const handlers = __importStar(__nccwpck_require__(4442)); const inputHelper = __importStar(__nccwpck_require__(6455)); const thc = __importStar(__nccwpck_require__(5538)); +const node_path_1 = __nccwpck_require__(9411); +const node_fs_1 = __nccwpck_require__(7561); const release_downloader_1 = __nccwpck_require__(785); const unarchive_1 = __nccwpck_require__(8512); async function run() { @@ -31963,6 +31257,17 @@ async function run() { await (0, unarchive_1.extract)(asset, downloadSettings.outFilePath); } } + if (downloadSettings.as !== '') { + // TODO could move logic to above? + const inOutFilePath = (0, node_fs_1.readdirSync)(downloadSettings.outFilePath); + if (inOutFilePath.length !== 1) { + throw new Error('`as` can only be used when one file is being downloaded'); + } + (0, node_fs_1.renameSync)(inOutFilePath[0], downloadSettings.as); + } + if (downloadSettings.addToPathEnvironmentVariable) { + process.env.PATH += node_path_1.delimiter + downloadSettings.outFilePath; + } core.info(`Done: ${res}`); } catch (error) { @@ -39151,13 +38456,10 @@ function create(opt_, files, cb) { if (!opt.file && typeof cb === 'function') { throw new TypeError('callback only supported with file option'); } - return (0, options_js_1.isSyncFile)(opt) - ? createFileSync(opt, files) - : (0, options_js_1.isFile)(opt) - ? createFile(opt, files, cb) - : (0, options_js_1.isSync)(opt) - ? createSync(opt, files) - : create_(opt, files); + return ((0, options_js_1.isSyncFile)(opt) ? createFileSync(opt, files) + : (0, options_js_1.isFile)(opt) ? createFile(opt, files, cb) + : (0, options_js_1.isSync)(opt) ? createSync(opt, files) + : create_(opt, files)); } exports.create = create; const createFileSync = (opt, files) => { @@ -39324,13 +38626,10 @@ function extract(opt_, files, cb) { if (files.length) { filesFilter(opt, files); } - return (0, options_js_1.isSyncFile)(opt) - ? extractFileSync(opt) - : (0, options_js_1.isFile)(opt) - ? extractFile(opt, cb) - : (0, options_js_1.isSync)(opt) - ? extractSync(opt) - : extract_(opt); + return ((0, options_js_1.isSyncFile)(opt) ? extractFileSync(opt) + : (0, options_js_1.isFile)(opt) ? extractFile(opt, cb) + : (0, options_js_1.isSync)(opt) ? extractSync(opt) + : extract_(opt)); } exports.extract = extract; // construct a filter that limits the file entries listed @@ -39355,9 +38654,10 @@ const filesFilter = (opt, files) => { map.set(file, ret); return ret; }; - opt.filter = filter - ? (file, entry) => filter(file, entry) && mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file)) - : file => mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file)); + opt.filter = + filter ? + (file, entry) => filter(file, entry) && mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file)) + : file => mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file)); }; const extractFileSync = (opt) => { const u = new unpack_js_1.UnpackSync(opt); @@ -39432,8 +38732,8 @@ const UV_FS_O_FILEMAP = Number(process.env.__FAKE_FS_O_FILENAME__) || const fMapEnabled = isWindows && !!UV_FS_O_FILEMAP; const fMapLimit = 512 * 1024; const fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY; -exports.getWriteFlag = !fMapEnabled - ? () => 'w' +exports.getWriteFlag = !fMapEnabled ? + () => 'w' : (size) => (size < fMapLimit ? fMapFlag : 'w'); //# sourceMappingURL=get-write-flag.js.map @@ -39587,7 +38887,7 @@ class Header { v === undefined || (k === 'path' && gex) || (k === 'linkpath' && gex) || - (k === 'global')); + k === 'global'); }))); } encode(buf, off = 0) { @@ -39655,8 +38955,8 @@ class Header { return this.needPax; } get type() { - return (this.#type === 'Unsupported' - ? this.#type + return (this.#type === 'Unsupported' ? + this.#type : types.name.get(this.#type)); } get typeKey() { @@ -39719,8 +39019,8 @@ const decString = (buf, off, size) => buf .replace(/\0.*/, ''); const decDate = (buf, off, size) => numToDate(decNumber(buf, off, size)); const numToDate = (num) => num === undefined ? undefined : new Date(num * 1000); -const decNumber = (buf, off, size) => Number(buf[off]) & 0x80 - ? large.parse(buf.subarray(off, off + size)) +const decNumber = (buf, off, size) => Number(buf[off]) & 0x80 ? + large.parse(buf.subarray(off, off + size)) : decSmallNumber(buf, off, size); const nanUndef = (value) => (isNaN(value) ? undefined : value); const decSmallNumber = (buf, off, size) => nanUndef(parseInt(buf @@ -39733,26 +39033,21 @@ const MAXNUM = { 12: 0o77777777777, 8: 0o7777777, }; -const encNumber = (buf, off, size, num) => num === undefined - ? false - : num > MAXNUM[size] || num < 0 - ? (large.encode(num, buf.subarray(off, off + size)), true) +const encNumber = (buf, off, size, num) => num === undefined ? false + : num > MAXNUM[size] || num < 0 ? + (large.encode(num, buf.subarray(off, off + size)), true) : (encSmallNumber(buf, off, size, num), false); const encSmallNumber = (buf, off, size, num) => buf.write(octalString(num, size), off, size, 'ascii'); const octalString = (num, size) => padOctal(Math.floor(num).toString(8), size); -const padOctal = (str, size) => (str.length === size - 1 - ? str +const padOctal = (str, size) => (str.length === size - 1 ? + str : new Array(size - str.length - 1).join('0') + str + ' ') + '\0'; -const encDate = (buf, off, size, date) => date === undefined - ? false - : encNumber(buf, off, size, date.getTime() / 1000); +const encDate = (buf, off, size, date) => date === undefined ? false : (encNumber(buf, off, size, date.getTime() / 1000)); // enough to fill the longest string we've got const NULLS = new Array(156).join('\0'); // pad with nulls, return true if it's longer or non-ascii -const encString = (buf, off, size, str) => str === undefined - ? false - : (buf.write(str + NULLS, off, size, 'utf8'), - str.length !== Buffer.byteLength(str) || str.length > size); +const encString = (buf, off, size, str) => str === undefined ? false : ((buf.write(str + NULLS, off, size, 'utf8'), + str.length !== Buffer.byteLength(str) || str.length > size)); //# sourceMappingURL=header.js.map /***/ }), @@ -39996,21 +39291,20 @@ function list(opt_, files, cb) { if (!opt.noResume) { onentryFunction(opt); } - return (0, options_js_1.isSyncFile)(opt) - ? listFileSync(opt) - : (0, options_js_1.isFile)(opt) - ? listFile(opt, cb) - : list_(opt); + return ((0, options_js_1.isSyncFile)(opt) ? listFileSync(opt) + : (0, options_js_1.isFile)(opt) ? listFile(opt, cb) + : list_(opt)); } exports.list = list; const onentryFunction = (opt) => { const onentry = opt.onentry; - opt.onentry = onentry - ? e => { - onentry(e); - e.resume(); - } - : e => e.resume(); + opt.onentry = + onentry ? + e => { + onentry(e); + e.resume(); + } + : e => e.resume(); }; // construct a filter that limits the file entries listed // include child entries if a dir is included @@ -40034,9 +39328,10 @@ const filesFilter = (opt, files) => { map.set(file, ret); return ret; }; - opt.filter = filter - ? (file, entry) => filter(file, entry) && mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file)) - : file => mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file)); + opt.filter = + filter ? + (file, entry) => filter(file, entry) && mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file)) + : file => mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file)); }; const listFileSync = (opt) => { const p = list_(opt); @@ -40386,8 +39681,8 @@ exports.normalizeUnicode = normalizeUnicode; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.normalizeWindowsPath = void 0; const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform; -exports.normalizeWindowsPath = platform !== 'win32' - ? (p) => p +exports.normalizeWindowsPath = platform !== 'win32' ? + (p) => p : (p) => p && p.replace(/\\/g, '/'); //# sourceMappingURL=normalize-windows-path.js.map @@ -40513,7 +39808,7 @@ class PackJob { } } exports.PackJob = PackJob; -const minipass_1 = __nccwpck_require__(6684); +const minipass_1 = __nccwpck_require__(4721); const zlib = __importStar(__nccwpck_require__(6139)); //@ts-ignore const yallist_1 = __nccwpck_require__(3796); @@ -41047,10 +40342,8 @@ class Parser extends events_1.EventEmitter { // if it's a tbr file it MIGHT be brotli, but we don't know until // we look at it and verify it's not a valid tar file. this.brotli = - !opt.gzip && opt.brotli !== undefined - ? opt.brotli - : isTBR - ? undefined + !opt.gzip && opt.brotli !== undefined ? opt.brotli + : isTBR ? undefined : false; // have to set this so that streams are ok piping into it this.on('end', () => this[CLOSESTREAM]()); @@ -41227,8 +40520,8 @@ class Parser extends events_1.EventEmitter { } const br = entry.blockRemain ?? 0; /* c8 ignore stop */ - const c = br >= chunk.length && position === 0 - ? chunk + const c = br >= chunk.length && position === 0 ? + chunk : chunk.subarray(position, position + br); entry.write(c); if (!entry.blockRemain) { @@ -41290,9 +40583,20 @@ class Parser extends events_1.EventEmitter { // always throws, even in non-strict mode this.warn('TAR_ABORT', error, { recoverable: false }); } - write(chunk) { + write(chunk, encoding, cb) { + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, + /* c8 ignore next */ + typeof encoding === 'string' ? encoding : 'utf8'); + } if (this[ABORTED]) { - return; + /* c8 ignore next */ + cb?.(); + return false; } // first write, might be gzipped const needSniff = this[UNZIP] === undefined || @@ -41304,6 +40608,8 @@ class Parser extends events_1.EventEmitter { } if (chunk.length < gzipHeader.length) { this[BUFFER] = chunk; + /* c8 ignore next */ + cb?.(); return true; } // look for gzip header @@ -41324,6 +40630,8 @@ class Parser extends events_1.EventEmitter { } else { this[BUFFER] = chunk; + /* c8 ignore next */ + cb?.(); return true; } } @@ -41344,8 +40652,8 @@ class Parser extends events_1.EventEmitter { const ended = this[ENDED]; this[ENDED] = false; this[UNZIP] = - this[UNZIP] === undefined - ? new minizlib_1.Unzip({}) + this[UNZIP] === undefined ? + new minizlib_1.Unzip({}) : new minizlib_1.BrotliDecompress({}); this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk)); this[UNZIP].on('error', er => this.abort(er)); @@ -41354,8 +40662,9 @@ class Parser extends events_1.EventEmitter { this[CONSUMECHUNK](); }); this[WRITING] = true; - const ret = this[UNZIP][ended ? 'end' : 'write'](chunk); + const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk); this[WRITING] = false; + cb?.(); return ret; } } @@ -41368,22 +40677,21 @@ class Parser extends events_1.EventEmitter { } this[WRITING] = false; // return false if there's a queue, or if the current entry isn't flowing - const ret = this[QUEUE].length - ? false - : this[READENTRY] - ? this[READENTRY].flowing + const ret = this[QUEUE].length ? false + : this[READENTRY] ? this[READENTRY].flowing : true; // if we have no queue, then that means a clogged READENTRY if (!ret && !this[QUEUE].length) { this[READENTRY]?.once('drain', () => this.emit('drain')); } + /* c8 ignore next */ + cb?.(); return ret; } [BUFFERCONCAT](c) { if (c && !this[ABORTED]) { - this[BUFFER] = this[BUFFER] - ? Buffer.concat([this[BUFFER], c]) - : c; + this[BUFFER] = + this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c; } } [MAYBEEND]() { @@ -41476,7 +40784,21 @@ class Parser extends events_1.EventEmitter { } } } - end(chunk) { + end(chunk, encoding, cb) { + if (typeof chunk === 'function') { + cb = chunk; + encoding = undefined; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + if (cb) + this.once('finish', cb); if (!this[ABORTED]) { if (this[UNZIP]) { /* c8 ignore start */ @@ -41494,6 +40816,7 @@ class Parser extends events_1.EventEmitter { this[MAYBEEND](); } } + return this; } } exports.Parser = Parser; @@ -41546,12 +40869,13 @@ class PathReservations { // functions currently running #running = new Set(); reserve(paths, fn) { - paths = isWindows - ? ['win32 parallelization disabled'] - : paths.map(p => { - // don't need normPath, because we skip this entirely for windows - return (0, strip_trailing_slashes_js_1.stripTrailingSlashes)((0, node_path_1.join)((0, normalize_unicode_js_1.normalizeUnicode)(p))).toLowerCase(); - }); + paths = + isWindows ? + ['win32 parallelization disabled'] + : paths.map(p => { + // don't need normPath, because we skip this entirely for windows + return (0, strip_trailing_slashes_js_1.stripTrailingSlashes)((0, node_path_1.join)((0, normalize_unicode_js_1.normalizeUnicode)(p))).toLowerCase(); + }); const dirs = new Set(paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b))); this.#reservations.set(fn, { dirs, paths }); for (const p of paths) { @@ -41788,8 +41112,8 @@ class Pax { const r = this[field]; const v = r instanceof Date ? r.getTime() / 1000 : r; const s = ' ' + - (field === 'dev' || field === 'ino' || field === 'nlink' - ? 'SCHILY.' + (field === 'dev' || field === 'ino' || field === 'nlink' ? + 'SCHILY.' : '') + field + '=' + @@ -41831,11 +41155,11 @@ const parseKVLine = (set, line) => { } const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, '$1'); const v = kv.join('='); - set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) - ? new Date(Number(v) * 1000) - : /^[0-9]+$/.test(v) - ? +v - : v; + set[k] = + /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ? + new Date(Number(v) * 1000) + : /^[0-9]+$/.test(v) ? +v + : v; return set; }; //# sourceMappingURL=pax.js.map @@ -41849,7 +41173,7 @@ const parseKVLine = (set, line) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.ReadEntry = void 0; -const minipass_1 = __nccwpck_require__(6684); +const minipass_1 = __nccwpck_require__(4721); const normalize_windows_path_js_1 = __nccwpck_require__(762); class ReadEntry extends minipass_1.Minipass { extended; @@ -41937,9 +41261,10 @@ class ReadEntry extends minipass_1.Minipass { this.atime = header.atime; this.ctime = header.ctime; /* c8 ignore start */ - this.linkpath = header.linkpath - ? (0, normalize_windows_path_js_1.normalizeWindowsPath)(header.linkpath) - : undefined; + this.linkpath = + header.linkpath ? + (0, normalize_windows_path_js_1.normalizeWindowsPath)(header.linkpath) + : undefined; /* c8 ignore stop */ this.uname = header.uname; this.gname = header.gname; @@ -42021,8 +41346,8 @@ function replace(opt_, files, cb) { throw new TypeError('no files or directories specified'); } files = Array.from(files); - return (0, options_js_1.isSyncFile)(opt) - ? replaceSync(opt, files) + return (0, options_js_1.isSyncFile)(opt) ? + replaceSync(opt, files) : replace_(opt, files, cb); } exports.replace = replace; @@ -42240,8 +41565,8 @@ const stripAbsolutePath = (path) => { while (isAbsolute(path) || parsed.root) { // windows will think that //x/y/z has a "root" of //x/y/ // but strip the //?/C:/ off of //?/C:/path - const root = path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' - ? '/' + const root = path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' ? + '/' : parsed.root; path = path.slice(root.length); r += root; @@ -42482,10 +41807,8 @@ const unlinkFileSync = (path) => { }; /* c8 ignore stop */ // this.gid, entry.gid, this.processUid -const uint32 = (a, b, c) => a !== undefined && a === a >>> 0 - ? a - : b !== undefined && b === b >>> 0 - ? b +const uint32 = (a, b, c) => a !== undefined && a === a >>> 0 ? a + : b !== undefined && b === b >>> 0 ? b : c; // clear the cache if it's a case-insensitive unicode-squashing match. // we can't know if the current file system is case-sensitive or supports @@ -42578,18 +41901,18 @@ class Unpack extends parse_js_1.Parser { this.preserveOwner = !!opt.preserveOwner; } this.processUid = - (this.preserveOwner || this.setOwner) && process.getuid - ? process.getuid() + (this.preserveOwner || this.setOwner) && process.getuid ? + process.getuid() : undefined; this.processGid = - (this.preserveOwner || this.setOwner) && process.getgid - ? process.getgid() + (this.preserveOwner || this.setOwner) && process.getgid ? + process.getgid() : undefined; // prevent excessively deep nesting of subfolders // set to `Infinity` to remove this restriction this.maxDepth = - typeof opt.maxDepth === 'number' - ? opt.maxDepth + typeof opt.maxDepth === 'number' ? + opt.maxDepth : DEFAULT_MAX_DEPTH; // mostly just for testing, but useful in some cases. // Forcibly trigger a chown on every entry, no matter what @@ -42612,11 +41935,10 @@ class Unpack extends parse_js_1.Parser { this.cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(opt.cwd || process.cwd())); this.strip = Number(opt.strip) || 0; // if we're not chmodding, then we don't need the process umask - this.processUmask = !this.chmod - ? 0 - : typeof opt.processUmask === 'number' - ? opt.processUmask - : process.umask(); + this.processUmask = + !this.chmod ? 0 + : typeof opt.processUmask === 'number' ? opt.processUmask + : process.umask(); this.umask = typeof opt.umask === 'number' ? opt.umask : this.processUmask; // default mode for dirs created as parents @@ -42800,8 +42122,8 @@ class Unpack extends parse_js_1.Parser { return uint32(this.gid, entry.gid, this.processGid); } [FILE](entry, fullyDone) { - const mode = typeof entry.mode === 'number' - ? entry.mode & 0o7777 + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 : this.fmode; const stream = new fsm.WriteStream(String(entry.absolute), { // slight lie, but it can be numeric flags @@ -42856,8 +42178,8 @@ class Unpack extends parse_js_1.Parser { actions++; const atime = entry.atime || new Date(); const mtime = entry.mtime; - node_fs_1.default.futimes(fd, atime, mtime, er => er - ? node_fs_1.default.utimes(abs, atime, mtime, er2 => done(er2 && er)) + node_fs_1.default.futimes(fd, atime, mtime, er => er ? + node_fs_1.default.utimes(abs, atime, mtime, er2 => done(er2 && er)) : done()); } if (typeof fd === 'number' && this[DOCHOWN](entry)) { @@ -42865,8 +42187,8 @@ class Unpack extends parse_js_1.Parser { const uid = this[UID](entry); const gid = this[GID](entry); if (typeof uid === 'number' && typeof gid === 'number') { - node_fs_1.default.fchown(fd, uid, gid, er => er - ? node_fs_1.default.chown(abs, uid, gid, er2 => done(er2 && er)) + node_fs_1.default.fchown(fd, uid, gid, er => er ? + node_fs_1.default.chown(abs, uid, gid, er2 => done(er2 && er)) : done()); } } @@ -42883,8 +42205,8 @@ class Unpack extends parse_js_1.Parser { tx.pipe(stream); } [DIRECTORY](entry, fullyDone) { - const mode = typeof entry.mode === 'number' - ? entry.mode & 0o7777 + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 : this.dmode; this[MKDIR](String(entry.absolute), mode, er => { if (er) { @@ -43136,8 +42458,8 @@ class UnpackSync extends Unpack { const needChmod = this.chmod && entry.mode && (st.mode & 0o7777) !== entry.mode; - const [er] = needChmod - ? callSync(() => { + const [er] = needChmod ? + callSync(() => { node_fs_1.default.chmodSync(String(entry.absolute), Number(entry.mode)); }) : []; @@ -43149,14 +42471,14 @@ class UnpackSync extends Unpack { } // not a dir, and not reusable. // don't remove if it's the cwd, since we want that error. - const [er] = entry.absolute === this.cwd - ? [] + const [er] = entry.absolute === this.cwd ? + [] : callSync(() => unlinkFileSync(String(entry.absolute))); this[MAKEFS](er, entry); } [FILE](entry, done) { - const mode = typeof entry.mode === 'number' - ? entry.mode & 0o7777 + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 : this.fmode; const oner = (er) => { let closeError; @@ -43229,8 +42551,8 @@ class UnpackSync extends Unpack { }); } [DIRECTORY](entry, done) { - const mode = typeof entry.mode === 'number' - ? entry.mode & 0o7777 + const mode = typeof entry.mode === 'number' ? + entry.mode & 0o7777 : this.dmode; const er = this[MKDIR](String(entry.absolute), mode); if (er) { @@ -43325,20 +42647,21 @@ const mtimeFilter = (opt) => { if (!opt.mtimeCache) { opt.mtimeCache = new Map(); } - opt.filter = filter - ? (path, stat) => filter(path, stat) && - !( + opt.filter = + filter ? + (path, stat) => filter(path, stat) && + !( + /* c8 ignore start */ + ((opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) > + (stat.mtime ?? 0)) + /* c8 ignore stop */ + ) + : (path, stat) => !( /* c8 ignore start */ - (opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) > - (stat.mtime ?? 0) + ((opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) > + (stat.mtime ?? 0)) /* c8 ignore stop */ - ) - : (path, stat) => !( - /* c8 ignore start */ - (opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) > - (stat.mtime ?? 0) - /* c8 ignore stop */ - ); + ); }; //# sourceMappingURL=update.js.map @@ -43437,7 +42760,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.WriteEntryTar = exports.WriteEntrySync = exports.WriteEntry = void 0; const fs_1 = __importDefault(__nccwpck_require__(7147)); -const minipass_1 = __nccwpck_require__(6684); +const minipass_1 = __nccwpck_require__(4721); const path_1 = __importDefault(__nccwpck_require__(1017)); const header_js_1 = __nccwpck_require__(2374); const mode_fix_js_1 = __nccwpck_require__(1810); @@ -43521,9 +42844,8 @@ class WriteEntry extends minipass_1.Minipass { this.noPax = !!opt.noPax; this.noMtime = !!opt.noMtime; this.mtime = opt.mtime; - this.prefix = opt.prefix - ? (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.prefix) - : undefined; + this.prefix = + opt.prefix ? (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.prefix) : undefined; if (typeof opt.onwarn === 'function') { this.on('warn', opt.onwarn); } @@ -43618,8 +42940,8 @@ class WriteEntry extends minipass_1.Minipass { this.header = new header_js_1.Header({ path: this[PREFIX](this.path), // only apply the prefix to hard links. - linkpath: this.type === 'Link' && this.linkpath !== undefined - ? this[PREFIX](this.linkpath) + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) : this.linkpath, // only the permissions and setuid/setgid/sticky bitflags // not the higher-order bits that specify file type @@ -43630,10 +42952,8 @@ class WriteEntry extends minipass_1.Minipass { mtime: this.noMtime ? undefined : this.mtime || this.stat.mtime, /* c8 ignore next */ type: this.type === 'Unsupported' ? undefined : this.type, - uname: this.portable - ? undefined - : this.stat.uid === this.myuid - ? this.myuser + uname: this.portable ? undefined + : this.stat.uid === this.myuid ? this.myuser : '', atime: this.portable ? undefined : this.stat.atime, ctime: this.portable ? undefined : this.stat.ctime, @@ -43643,12 +42963,10 @@ class WriteEntry extends minipass_1.Minipass { atime: this.portable ? undefined : this.header.atime, ctime: this.portable ? undefined : this.header.ctime, gid: this.portable ? undefined : this.header.gid, - mtime: this.noMtime - ? undefined - : this.mtime || this.header.mtime, + mtime: this.noMtime ? undefined : (this.mtime || this.header.mtime), path: this[PREFIX](this.path), - linkpath: this.type === 'Link' && this.linkpath !== undefined - ? this[PREFIX](this.linkpath) + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) : this.linkpath, size: this.header.size, uid: this.portable ? undefined : this.header.uid, @@ -43807,10 +43125,10 @@ class WriteEntry extends minipass_1.Minipass { this.remain++; } } - const writeBuf = this.offset === 0 && bytesRead === this.buf.length - ? this.buf + const chunk = this.offset === 0 && bytesRead === this.buf.length ? + this.buf : this.buf.subarray(this.offset, this.offset + bytesRead); - const flushed = this.write(writeBuf); + const flushed = this.write(chunk); if (!flushed) { this[AWAITDRAIN](() => this[ONDRAIN]()); } @@ -43821,18 +43139,27 @@ class WriteEntry extends minipass_1.Minipass { [AWAITDRAIN](cb) { this.once('drain', cb); } - write(writeBuf) { - if (this.blockRemain < writeBuf.length) { + write(chunk, encoding, cb) { + /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8'); + } + /* c8 ignore stop */ + if (this.blockRemain < chunk.length) { const er = Object.assign(new Error('writing more data than expected'), { path: this.absolute, }); return this.emit('error', er); } - this.remain -= writeBuf.length; - this.blockRemain -= writeBuf.length; - this.pos += writeBuf.length; - this.offset += writeBuf.length; - return super.write(writeBuf); + this.remain -= chunk.length; + this.blockRemain -= chunk.length; + this.pos += chunk.length; + this.offset += chunk.length; + return super.write(chunk, null, cb); } [ONDRAIN]() { if (!this.remain) { @@ -43955,22 +43282,21 @@ class WriteEntryTar extends minipass_1.Minipass { this.prefix = opt.prefix; this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(readEntry.path); this.mode = - readEntry.mode !== undefined - ? this[MODE](readEntry.mode) + readEntry.mode !== undefined ? + this[MODE](readEntry.mode) : undefined; this.uid = this.portable ? undefined : readEntry.uid; this.gid = this.portable ? undefined : readEntry.gid; this.uname = this.portable ? undefined : readEntry.uname; this.gname = this.portable ? undefined : readEntry.gname; this.size = readEntry.size; - this.mtime = this.noMtime - ? undefined - : opt.mtime || readEntry.mtime; + this.mtime = + this.noMtime ? undefined : opt.mtime || readEntry.mtime; this.atime = this.portable ? undefined : readEntry.atime; this.ctime = this.portable ? undefined : readEntry.ctime; this.linkpath = - readEntry.linkpath !== undefined - ? (0, normalize_windows_path_js_1.normalizeWindowsPath)(readEntry.linkpath) + readEntry.linkpath !== undefined ? + (0, normalize_windows_path_js_1.normalizeWindowsPath)(readEntry.linkpath) : undefined; if (typeof opt.onwarn === 'function') { this.on('warn', opt.onwarn); @@ -43987,8 +43313,8 @@ class WriteEntryTar extends minipass_1.Minipass { this.blockRemain = readEntry.startBlockSize; this.header = new header_js_1.Header({ path: this[PREFIX](this.path), - linkpath: this.type === 'Link' && this.linkpath !== undefined - ? this[PREFIX](this.linkpath) + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) : this.linkpath, // only the permissions and setuid/setgid/sticky bitflags // not the higher-order bits that specify file type @@ -44015,8 +43341,8 @@ class WriteEntryTar extends minipass_1.Minipass { gid: this.portable ? undefined : this.gid, mtime: this.noMtime ? undefined : this.mtime, path: this[PREFIX](this.path), - linkpath: this.type === 'Link' && this.linkpath !== undefined - ? this[PREFIX](this.linkpath) + linkpath: this.type === 'Link' && this.linkpath !== undefined ? + this[PREFIX](this.linkpath) : this.linkpath, size: this.size, uid: this.portable ? undefined : this.uid, @@ -44040,33 +43366,1091 @@ class WriteEntryTar extends minipass_1.Minipass { [MODE](mode) { return (0, mode_fix_js_1.modeFix)(mode, this.type === 'Directory', this.portable); } - write(data) { - const writeLen = data.length; + write(chunk, encoding, cb) { + /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8'); + } + /* c8 ignore stop */ + const writeLen = chunk.length; if (writeLen > this.blockRemain) { throw new Error('writing more to entry than is appropriate'); } this.blockRemain -= writeLen; - return super.write(data); + return super.write(chunk, cb); } - end() { + end(chunk, encoding, cb) { if (this.blockRemain) { super.write(Buffer.alloc(this.blockRemain)); } - return super.end(); + /* c8 ignore start - just junk to comply with NodeJS.WritableStream */ + if (typeof chunk === 'function') { + cb = chunk; + encoding = undefined; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = undefined; + } + if (typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding ?? 'utf8'); + } + if (cb) + this.once('finish', cb); + chunk ? super.end(chunk, cb) : super.end(cb); + /* c8 ignore stop */ + return this; } } exports.WriteEntryTar = WriteEntryTar; -const getType = (stat) => stat.isFile() - ? 'File' - : stat.isDirectory() - ? 'Directory' - : stat.isSymbolicLink() - ? 'SymbolicLink' +const getType = (stat) => stat.isFile() ? 'File' + : stat.isDirectory() ? 'Directory' + : stat.isSymbolicLink() ? 'SymbolicLink' : 'Unsupported'; //# sourceMappingURL=write-entry.js.map /***/ }), +/***/ 4721: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Minipass = exports.isWritable = exports.isReadable = exports.isStream = void 0; +const proc = typeof process === 'object' && process + ? process + : { + stdout: null, + stderr: null, + }; +const events_1 = __nccwpck_require__(2361); +const stream_1 = __importDefault(__nccwpck_require__(2781)); +const string_decoder_1 = __nccwpck_require__(1576); +/** + * Return true if the argument is a Minipass stream, Node stream, or something + * else that Minipass can interact with. + */ +const isStream = (s) => !!s && + typeof s === 'object' && + (s instanceof Minipass || + s instanceof stream_1.default || + (0, exports.isReadable)(s) || + (0, exports.isWritable)(s)); +exports.isStream = isStream; +/** + * Return true if the argument is a valid {@link Minipass.Readable} + */ +const isReadable = (s) => !!s && + typeof s === 'object' && + s instanceof events_1.EventEmitter && + typeof s.pipe === 'function' && + // node core Writable streams have a pipe() method, but it throws + s.pipe !== stream_1.default.Writable.prototype.pipe; +exports.isReadable = isReadable; +/** + * Return true if the argument is a valid {@link Minipass.Writable} + */ +const isWritable = (s) => !!s && + typeof s === 'object' && + s instanceof events_1.EventEmitter && + typeof s.write === 'function' && + typeof s.end === 'function'; +exports.isWritable = isWritable; +const EOF = Symbol('EOF'); +const MAYBE_EMIT_END = Symbol('maybeEmitEnd'); +const EMITTED_END = Symbol('emittedEnd'); +const EMITTING_END = Symbol('emittingEnd'); +const EMITTED_ERROR = Symbol('emittedError'); +const CLOSED = Symbol('closed'); +const READ = Symbol('read'); +const FLUSH = Symbol('flush'); +const FLUSHCHUNK = Symbol('flushChunk'); +const ENCODING = Symbol('encoding'); +const DECODER = Symbol('decoder'); +const FLOWING = Symbol('flowing'); +const PAUSED = Symbol('paused'); +const RESUME = Symbol('resume'); +const BUFFER = Symbol('buffer'); +const PIPES = Symbol('pipes'); +const BUFFERLENGTH = Symbol('bufferLength'); +const BUFFERPUSH = Symbol('bufferPush'); +const BUFFERSHIFT = Symbol('bufferShift'); +const OBJECTMODE = Symbol('objectMode'); +// internal event when stream is destroyed +const DESTROYED = Symbol('destroyed'); +// internal event when stream has an error +const ERROR = Symbol('error'); +const EMITDATA = Symbol('emitData'); +const EMITEND = Symbol('emitEnd'); +const EMITEND2 = Symbol('emitEnd2'); +const ASYNC = Symbol('async'); +const ABORT = Symbol('abort'); +const ABORTED = Symbol('aborted'); +const SIGNAL = Symbol('signal'); +const DATALISTENERS = Symbol('dataListeners'); +const DISCARDED = Symbol('discarded'); +const defer = (fn) => Promise.resolve().then(fn); +const nodefer = (fn) => fn(); +const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish'; +const isArrayBufferLike = (b) => b instanceof ArrayBuffer || + (!!b && + typeof b === 'object' && + b.constructor && + b.constructor.name === 'ArrayBuffer' && + b.byteLength >= 0); +const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b); +/** + * Internal class representing a pipe to a destination stream. + * + * @internal + */ +class Pipe { + src; + dest; + opts; + ondrain; + constructor(src, dest, opts) { + this.src = src; + this.dest = dest; + this.opts = opts; + this.ondrain = () => src[RESUME](); + this.dest.on('drain', this.ondrain); + } + unpipe() { + this.dest.removeListener('drain', this.ondrain); + } + // only here for the prototype + /* c8 ignore start */ + proxyErrors(_er) { } + /* c8 ignore stop */ + end() { + this.unpipe(); + if (this.opts.end) + this.dest.end(); + } +} +/** + * Internal class representing a pipe to a destination stream where + * errors are proxied. + * + * @internal + */ +class PipeProxyErrors extends Pipe { + unpipe() { + this.src.removeListener('error', this.proxyErrors); + super.unpipe(); + } + constructor(src, dest, opts) { + super(src, dest, opts); + this.proxyErrors = er => dest.emit('error', er); + src.on('error', this.proxyErrors); + } +} +const isObjectModeOptions = (o) => !!o.objectMode; +const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer'; +/** + * Main export, the Minipass class + * + * `RType` is the type of data emitted, defaults to Buffer + * + * `WType` is the type of data to be written, if RType is buffer or string, + * then any {@link Minipass.ContiguousData} is allowed. + * + * `Events` is the set of event handler signatures that this object + * will emit, see {@link Minipass.Events} + */ +class Minipass extends events_1.EventEmitter { + [FLOWING] = false; + [PAUSED] = false; + [PIPES] = []; + [BUFFER] = []; + [OBJECTMODE]; + [ENCODING]; + [ASYNC]; + [DECODER]; + [EOF] = false; + [EMITTED_END] = false; + [EMITTING_END] = false; + [CLOSED] = false; + [EMITTED_ERROR] = null; + [BUFFERLENGTH] = 0; + [DESTROYED] = false; + [SIGNAL]; + [ABORTED] = false; + [DATALISTENERS] = 0; + [DISCARDED] = false; + /** + * true if the stream can be written + */ + writable = true; + /** + * true if the stream can be read + */ + readable = true; + /** + * If `RType` is Buffer, then options do not need to be provided. + * Otherwise, an options object must be provided to specify either + * {@link Minipass.SharedOptions.objectMode} or + * {@link Minipass.SharedOptions.encoding}, as appropriate. + */ + constructor(...args) { + const options = (args[0] || + {}); + super(); + if (options.objectMode && typeof options.encoding === 'string') { + throw new TypeError('Encoding and objectMode may not be used together'); + } + if (isObjectModeOptions(options)) { + this[OBJECTMODE] = true; + this[ENCODING] = null; + } + else if (isEncodingOptions(options)) { + this[ENCODING] = options.encoding; + this[OBJECTMODE] = false; + } + else { + this[OBJECTMODE] = false; + this[ENCODING] = null; + } + this[ASYNC] = !!options.async; + this[DECODER] = this[ENCODING] + ? new string_decoder_1.StringDecoder(this[ENCODING]) + : null; + //@ts-ignore - private option for debugging and testing + if (options && options.debugExposeBuffer === true) { + Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] }); + } + //@ts-ignore - private option for debugging and testing + if (options && options.debugExposePipes === true) { + Object.defineProperty(this, 'pipes', { get: () => this[PIPES] }); + } + const { signal } = options; + if (signal) { + this[SIGNAL] = signal; + if (signal.aborted) { + this[ABORT](); + } + else { + signal.addEventListener('abort', () => this[ABORT]()); + } + } + } + /** + * The amount of data stored in the buffer waiting to be read. + * + * For Buffer strings, this will be the total byte length. + * For string encoding streams, this will be the string character length, + * according to JavaScript's `string.length` logic. + * For objectMode streams, this is a count of the items waiting to be + * emitted. + */ + get bufferLength() { + return this[BUFFERLENGTH]; + } + /** + * The `BufferEncoding` currently in use, or `null` + */ + get encoding() { + return this[ENCODING]; + } + /** + * @deprecated - This is a read only property + */ + set encoding(_enc) { + throw new Error('Encoding must be set at instantiation time'); + } + /** + * @deprecated - Encoding may only be set at instantiation time + */ + setEncoding(_enc) { + throw new Error('Encoding must be set at instantiation time'); + } + /** + * True if this is an objectMode stream + */ + get objectMode() { + return this[OBJECTMODE]; + } + /** + * @deprecated - This is a read-only property + */ + set objectMode(_om) { + throw new Error('objectMode must be set at instantiation time'); + } + /** + * true if this is an async stream + */ + get ['async']() { + return this[ASYNC]; + } + /** + * Set to true to make this stream async. + * + * Once set, it cannot be unset, as this would potentially cause incorrect + * behavior. Ie, a sync stream can be made async, but an async stream + * cannot be safely made sync. + */ + set ['async'](a) { + this[ASYNC] = this[ASYNC] || !!a; + } + // drop everything and get out of the flow completely + [ABORT]() { + this[ABORTED] = true; + this.emit('abort', this[SIGNAL]?.reason); + this.destroy(this[SIGNAL]?.reason); + } + /** + * True if the stream has been aborted. + */ + get aborted() { + return this[ABORTED]; + } + /** + * No-op setter. Stream aborted status is set via the AbortSignal provided + * in the constructor options. + */ + set aborted(_) { } + write(chunk, encoding, cb) { + if (this[ABORTED]) + return false; + if (this[EOF]) + throw new Error('write after end'); + if (this[DESTROYED]) { + this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' })); + return true; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = 'utf8'; + } + if (!encoding) + encoding = 'utf8'; + const fn = this[ASYNC] ? defer : nodefer; + // convert array buffers and typed array views into buffers + // at some point in the future, we may want to do the opposite! + // leave strings and buffers as-is + // anything is only allowed if in object mode, so throw + if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) { + if (isArrayBufferView(chunk)) { + //@ts-ignore - sinful unsafe type changing + chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength); + } + else if (isArrayBufferLike(chunk)) { + //@ts-ignore - sinful unsafe type changing + chunk = Buffer.from(chunk); + } + else if (typeof chunk !== 'string') { + throw new Error('Non-contiguous data written to non-objectMode stream'); + } + } + // handle object mode up front, since it's simpler + // this yields better performance, fewer checks later. + if (this[OBJECTMODE]) { + // maybe impossible? + /* c8 ignore start */ + if (this[FLOWING] && this[BUFFERLENGTH] !== 0) + this[FLUSH](true); + /* c8 ignore stop */ + if (this[FLOWING]) + this.emit('data', chunk); + else + this[BUFFERPUSH](chunk); + if (this[BUFFERLENGTH] !== 0) + this.emit('readable'); + if (cb) + fn(cb); + return this[FLOWING]; + } + // at this point the chunk is a buffer or string + // don't buffer it up or send it to the decoder + if (!chunk.length) { + if (this[BUFFERLENGTH] !== 0) + this.emit('readable'); + if (cb) + fn(cb); + return this[FLOWING]; + } + // fast-path writing strings of same encoding to a stream with + // an empty buffer, skipping the buffer/decoder dance + if (typeof chunk === 'string' && + // unless it is a string already ready for us to use + !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) { + //@ts-ignore - sinful unsafe type change + chunk = Buffer.from(chunk, encoding); + } + if (Buffer.isBuffer(chunk) && this[ENCODING]) { + //@ts-ignore - sinful unsafe type change + chunk = this[DECODER].write(chunk); + } + // Note: flushing CAN potentially switch us into not-flowing mode + if (this[FLOWING] && this[BUFFERLENGTH] !== 0) + this[FLUSH](true); + if (this[FLOWING]) + this.emit('data', chunk); + else + this[BUFFERPUSH](chunk); + if (this[BUFFERLENGTH] !== 0) + this.emit('readable'); + if (cb) + fn(cb); + return this[FLOWING]; + } + /** + * Low-level explicit read method. + * + * In objectMode, the argument is ignored, and one item is returned if + * available. + * + * `n` is the number of bytes (or in the case of encoding streams, + * characters) to consume. If `n` is not provided, then the entire buffer + * is returned, or `null` is returned if no data is available. + * + * If `n` is greater that the amount of data in the internal buffer, + * then `null` is returned. + */ + read(n) { + if (this[DESTROYED]) + return null; + this[DISCARDED] = false; + if (this[BUFFERLENGTH] === 0 || + n === 0 || + (n && n > this[BUFFERLENGTH])) { + this[MAYBE_EMIT_END](); + return null; + } + if (this[OBJECTMODE]) + n = null; + if (this[BUFFER].length > 1 && !this[OBJECTMODE]) { + // not object mode, so if we have an encoding, then RType is string + // otherwise, must be Buffer + this[BUFFER] = [ + (this[ENCODING] + ? this[BUFFER].join('') + : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])), + ]; + } + const ret = this[READ](n || null, this[BUFFER][0]); + this[MAYBE_EMIT_END](); + return ret; + } + [READ](n, chunk) { + if (this[OBJECTMODE]) + this[BUFFERSHIFT](); + else { + const c = chunk; + if (n === c.length || n === null) + this[BUFFERSHIFT](); + else if (typeof c === 'string') { + this[BUFFER][0] = c.slice(n); + chunk = c.slice(0, n); + this[BUFFERLENGTH] -= n; + } + else { + this[BUFFER][0] = c.subarray(n); + chunk = c.subarray(0, n); + this[BUFFERLENGTH] -= n; + } + } + this.emit('data', chunk); + if (!this[BUFFER].length && !this[EOF]) + this.emit('drain'); + return chunk; + } + end(chunk, encoding, cb) { + if (typeof chunk === 'function') { + cb = chunk; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = 'utf8'; + } + if (chunk !== undefined) + this.write(chunk, encoding); + if (cb) + this.once('end', cb); + this[EOF] = true; + this.writable = false; + // if we haven't written anything, then go ahead and emit, + // even if we're not reading. + // we'll re-emit if a new 'end' listener is added anyway. + // This makes MP more suitable to write-only use cases. + if (this[FLOWING] || !this[PAUSED]) + this[MAYBE_EMIT_END](); + return this; + } + // don't let the internal resume be overwritten + [RESUME]() { + if (this[DESTROYED]) + return; + if (!this[DATALISTENERS] && !this[PIPES].length) { + this[DISCARDED] = true; + } + this[PAUSED] = false; + this[FLOWING] = true; + this.emit('resume'); + if (this[BUFFER].length) + this[FLUSH](); + else if (this[EOF]) + this[MAYBE_EMIT_END](); + else + this.emit('drain'); + } + /** + * Resume the stream if it is currently in a paused state + * + * If called when there are no pipe destinations or `data` event listeners, + * this will place the stream in a "discarded" state, where all data will + * be thrown away. The discarded state is removed if a pipe destination or + * data handler is added, if pause() is called, or if any synchronous or + * asynchronous iteration is started. + */ + resume() { + return this[RESUME](); + } + /** + * Pause the stream + */ + pause() { + this[FLOWING] = false; + this[PAUSED] = true; + this[DISCARDED] = false; + } + /** + * true if the stream has been forcibly destroyed + */ + get destroyed() { + return this[DESTROYED]; + } + /** + * true if the stream is currently in a flowing state, meaning that + * any writes will be immediately emitted. + */ + get flowing() { + return this[FLOWING]; + } + /** + * true if the stream is currently in a paused state + */ + get paused() { + return this[PAUSED]; + } + [BUFFERPUSH](chunk) { + if (this[OBJECTMODE]) + this[BUFFERLENGTH] += 1; + else + this[BUFFERLENGTH] += chunk.length; + this[BUFFER].push(chunk); + } + [BUFFERSHIFT]() { + if (this[OBJECTMODE]) + this[BUFFERLENGTH] -= 1; + else + this[BUFFERLENGTH] -= this[BUFFER][0].length; + return this[BUFFER].shift(); + } + [FLUSH](noDrain = false) { + do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) && + this[BUFFER].length); + if (!noDrain && !this[BUFFER].length && !this[EOF]) + this.emit('drain'); + } + [FLUSHCHUNK](chunk) { + this.emit('data', chunk); + return this[FLOWING]; + } + /** + * Pipe all data emitted by this stream into the destination provided. + * + * Triggers the flow of data. + */ + pipe(dest, opts) { + if (this[DESTROYED]) + return dest; + this[DISCARDED] = false; + const ended = this[EMITTED_END]; + opts = opts || {}; + if (dest === proc.stdout || dest === proc.stderr) + opts.end = false; + else + opts.end = opts.end !== false; + opts.proxyErrors = !!opts.proxyErrors; + // piping an ended stream ends immediately + if (ended) { + if (opts.end) + dest.end(); + } + else { + // "as" here just ignores the WType, which pipes don't care about, + // since they're only consuming from us, and writing to the dest + this[PIPES].push(!opts.proxyErrors + ? new Pipe(this, dest, opts) + : new PipeProxyErrors(this, dest, opts)); + if (this[ASYNC]) + defer(() => this[RESUME]()); + else + this[RESUME](); + } + return dest; + } + /** + * Fully unhook a piped destination stream. + * + * If the destination stream was the only consumer of this stream (ie, + * there are no other piped destinations or `'data'` event listeners) + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + unpipe(dest) { + const p = this[PIPES].find(p => p.dest === dest); + if (p) { + if (this[PIPES].length === 1) { + if (this[FLOWING] && this[DATALISTENERS] === 0) { + this[FLOWING] = false; + } + this[PIPES] = []; + } + else + this[PIPES].splice(this[PIPES].indexOf(p), 1); + p.unpipe(); + } + } + /** + * Alias for {@link Minipass#on} + */ + addListener(ev, handler) { + return this.on(ev, handler); + } + /** + * Mostly identical to `EventEmitter.on`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * - Adding a 'data' event handler will trigger the flow of data + * + * - Adding a 'readable' event handler when there is data waiting to be read + * will cause 'readable' to be emitted immediately. + * + * - Adding an 'endish' event handler ('end', 'finish', etc.) which has + * already passed will cause the event to be emitted immediately and all + * handlers removed. + * + * - Adding an 'error' event handler after an error has been emitted will + * cause the event to be re-emitted immediately with the error previously + * raised. + */ + on(ev, handler) { + const ret = super.on(ev, handler); + if (ev === 'data') { + this[DISCARDED] = false; + this[DATALISTENERS]++; + if (!this[PIPES].length && !this[FLOWING]) { + this[RESUME](); + } + } + else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) { + super.emit('readable'); + } + else if (isEndish(ev) && this[EMITTED_END]) { + super.emit(ev); + this.removeAllListeners(ev); + } + else if (ev === 'error' && this[EMITTED_ERROR]) { + const h = handler; + if (this[ASYNC]) + defer(() => h.call(this, this[EMITTED_ERROR])); + else + h.call(this, this[EMITTED_ERROR]); + } + return ret; + } + /** + * Alias for {@link Minipass#off} + */ + removeListener(ev, handler) { + return this.off(ev, handler); + } + /** + * Mostly identical to `EventEmitter.off` + * + * If a 'data' event handler is removed, and it was the last consumer + * (ie, there are no pipe destinations or other 'data' event listeners), + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + off(ev, handler) { + const ret = super.off(ev, handler); + // if we previously had listeners, and now we don't, and we don't + // have any pipes, then stop the flow, unless it's been explicitly + // put in a discarded flowing state via stream.resume(). + if (ev === 'data') { + this[DATALISTENERS] = this.listeners('data').length; + if (this[DATALISTENERS] === 0 && + !this[DISCARDED] && + !this[PIPES].length) { + this[FLOWING] = false; + } + } + return ret; + } + /** + * Mostly identical to `EventEmitter.removeAllListeners` + * + * If all 'data' event handlers are removed, and they were the last consumer + * (ie, there are no pipe destinations), then the flow of data will stop + * until there is another consumer or {@link Minipass#resume} is explicitly + * called. + */ + removeAllListeners(ev) { + const ret = super.removeAllListeners(ev); + if (ev === 'data' || ev === undefined) { + this[DATALISTENERS] = 0; + if (!this[DISCARDED] && !this[PIPES].length) { + this[FLOWING] = false; + } + } + return ret; + } + /** + * true if the 'end' event has been emitted + */ + get emittedEnd() { + return this[EMITTED_END]; + } + [MAYBE_EMIT_END]() { + if (!this[EMITTING_END] && + !this[EMITTED_END] && + !this[DESTROYED] && + this[BUFFER].length === 0 && + this[EOF]) { + this[EMITTING_END] = true; + this.emit('end'); + this.emit('prefinish'); + this.emit('finish'); + if (this[CLOSED]) + this.emit('close'); + this[EMITTING_END] = false; + } + } + /** + * Mostly identical to `EventEmitter.emit`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * If the stream has been destroyed, and the event is something other + * than 'close' or 'error', then `false` is returned and no handlers + * are called. + * + * If the event is 'end', and has already been emitted, then the event + * is ignored. If the stream is in a paused or non-flowing state, then + * the event will be deferred until data flow resumes. If the stream is + * async, then handlers will be called on the next tick rather than + * immediately. + * + * If the event is 'close', and 'end' has not yet been emitted, then + * the event will be deferred until after 'end' is emitted. + * + * If the event is 'error', and an AbortSignal was provided for the stream, + * and there are no listeners, then the event is ignored, matching the + * behavior of node core streams in the presense of an AbortSignal. + * + * If the event is 'finish' or 'prefinish', then all listeners will be + * removed after emitting the event, to prevent double-firing. + */ + emit(ev, ...args) { + const data = args[0]; + // error and close are only events allowed after calling destroy() + if (ev !== 'error' && + ev !== 'close' && + ev !== DESTROYED && + this[DESTROYED]) { + return false; + } + else if (ev === 'data') { + return !this[OBJECTMODE] && !data + ? false + : this[ASYNC] + ? (defer(() => this[EMITDATA](data)), true) + : this[EMITDATA](data); + } + else if (ev === 'end') { + return this[EMITEND](); + } + else if (ev === 'close') { + this[CLOSED] = true; + // don't emit close before 'end' and 'finish' + if (!this[EMITTED_END] && !this[DESTROYED]) + return false; + const ret = super.emit('close'); + this.removeAllListeners('close'); + return ret; + } + else if (ev === 'error') { + this[EMITTED_ERROR] = data; + super.emit(ERROR, data); + const ret = !this[SIGNAL] || this.listeners('error').length + ? super.emit('error', data) + : false; + this[MAYBE_EMIT_END](); + return ret; + } + else if (ev === 'resume') { + const ret = super.emit('resume'); + this[MAYBE_EMIT_END](); + return ret; + } + else if (ev === 'finish' || ev === 'prefinish') { + const ret = super.emit(ev); + this.removeAllListeners(ev); + return ret; + } + // Some other unknown event + const ret = super.emit(ev, ...args); + this[MAYBE_EMIT_END](); + return ret; + } + [EMITDATA](data) { + for (const p of this[PIPES]) { + if (p.dest.write(data) === false) + this.pause(); + } + const ret = this[DISCARDED] ? false : super.emit('data', data); + this[MAYBE_EMIT_END](); + return ret; + } + [EMITEND]() { + if (this[EMITTED_END]) + return false; + this[EMITTED_END] = true; + this.readable = false; + return this[ASYNC] + ? (defer(() => this[EMITEND2]()), true) + : this[EMITEND2](); + } + [EMITEND2]() { + if (this[DECODER]) { + const data = this[DECODER].end(); + if (data) { + for (const p of this[PIPES]) { + p.dest.write(data); + } + if (!this[DISCARDED]) + super.emit('data', data); + } + } + for (const p of this[PIPES]) { + p.end(); + } + const ret = super.emit('end'); + this.removeAllListeners('end'); + return ret; + } + /** + * Return a Promise that resolves to an array of all emitted data once + * the stream ends. + */ + async collect() { + const buf = Object.assign([], { + dataLength: 0, + }); + if (!this[OBJECTMODE]) + buf.dataLength = 0; + // set the promise first, in case an error is raised + // by triggering the flow here. + const p = this.promise(); + this.on('data', c => { + buf.push(c); + if (!this[OBJECTMODE]) + buf.dataLength += c.length; + }); + await p; + return buf; + } + /** + * Return a Promise that resolves to the concatenation of all emitted data + * once the stream ends. + * + * Not allowed on objectMode streams. + */ + async concat() { + if (this[OBJECTMODE]) { + throw new Error('cannot concat in objectMode'); + } + const buf = await this.collect(); + return (this[ENCODING] + ? buf.join('') + : Buffer.concat(buf, buf.dataLength)); + } + /** + * Return a void Promise that resolves once the stream ends. + */ + async promise() { + return new Promise((resolve, reject) => { + this.on(DESTROYED, () => reject(new Error('stream destroyed'))); + this.on('error', er => reject(er)); + this.on('end', () => resolve()); + }); + } + /** + * Asynchronous `for await of` iteration. + * + * This will continue emitting all chunks until the stream terminates. + */ + [Symbol.asyncIterator]() { + // set this up front, in case the consumer doesn't call next() + // right away. + this[DISCARDED] = false; + let stopped = false; + const stop = async () => { + this.pause(); + stopped = true; + return { value: undefined, done: true }; + }; + const next = () => { + if (stopped) + return stop(); + const res = this.read(); + if (res !== null) + return Promise.resolve({ done: false, value: res }); + if (this[EOF]) + return stop(); + let resolve; + let reject; + const onerr = (er) => { + this.off('data', ondata); + this.off('end', onend); + this.off(DESTROYED, ondestroy); + stop(); + reject(er); + }; + const ondata = (value) => { + this.off('error', onerr); + this.off('end', onend); + this.off(DESTROYED, ondestroy); + this.pause(); + resolve({ value, done: !!this[EOF] }); + }; + const onend = () => { + this.off('error', onerr); + this.off('data', ondata); + this.off(DESTROYED, ondestroy); + stop(); + resolve({ done: true, value: undefined }); + }; + const ondestroy = () => onerr(new Error('stream destroyed')); + return new Promise((res, rej) => { + reject = rej; + resolve = res; + this.once(DESTROYED, ondestroy); + this.once('error', onerr); + this.once('end', onend); + this.once('data', ondata); + }); + }; + return { + next, + throw: stop, + return: stop, + [Symbol.asyncIterator]() { + return this; + }, + }; + } + /** + * Synchronous `for of` iteration. + * + * The iteration will terminate when the internal buffer runs out, even + * if the stream has not yet terminated. + */ + [Symbol.iterator]() { + // set this up front, in case the consumer doesn't call next() + // right away. + this[DISCARDED] = false; + let stopped = false; + const stop = () => { + this.pause(); + this.off(ERROR, stop); + this.off(DESTROYED, stop); + this.off('end', stop); + stopped = true; + return { done: true, value: undefined }; + }; + const next = () => { + if (stopped) + return stop(); + const value = this.read(); + return value === null ? stop() : { done: false, value }; + }; + this.once('end', stop); + this.once(ERROR, stop); + this.once(DESTROYED, stop); + return { + next, + throw: stop, + return: stop, + [Symbol.iterator]() { + return this; + }, + }; + } + /** + * Destroy a stream, preventing it from being used for any further purpose. + * + * If the stream has a `close()` method, then it will be called on + * destruction. + * + * After destruction, any attempt to write data, read data, or emit most + * events will be ignored. + * + * If an error argument is provided, then it will be emitted in an + * 'error' event. + */ + destroy(er) { + if (this[DESTROYED]) { + if (er) + this.emit('error', er); + else + this.emit(DESTROYED); + return this; + } + this[DESTROYED] = true; + this[DISCARDED] = true; + // throw away all buffered data, it's never coming out + this[BUFFER].length = 0; + this[BUFFERLENGTH] = 0; + const wc = this; + if (typeof wc.close === 'function' && !this[CLOSED]) + wc.close(); + if (er) + this.emit('error', er); + // if no error to emit, still reject pending promises + else + this.emit(DESTROYED); + return this; + } + /** + * Alias for {@link isStream} + * + * Former export location, maintained for backwards compatibility. + * + * @deprecated + */ + static get isStream() { + return exports.isStream; + } +} +exports.Minipass = Minipass; +//# sourceMappingURL=index.js.map + +/***/ }), + /***/ 3796: /***/ ((__unused_webpack_module, exports) => { From e5f79b97b31714e2b34f75d662372d6079034683 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 18 Jun 2024 10:42:36 +0100 Subject: [PATCH 03/15] Change to use IO and `res` output --- dist/index.js | 7 +++---- src/main.ts | 17 +++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dist/index.js b/dist/index.js index 12694f6b..97dc6a33 100644 --- a/dist/index.js +++ b/dist/index.js @@ -31238,7 +31238,7 @@ const handlers = __importStar(__nccwpck_require__(4442)); const inputHelper = __importStar(__nccwpck_require__(6455)); const thc = __importStar(__nccwpck_require__(5538)); const node_path_1 = __nccwpck_require__(9411); -const node_fs_1 = __nccwpck_require__(7561); +const io = __importStar(__nccwpck_require__(7436)); const release_downloader_1 = __nccwpck_require__(785); const unarchive_1 = __nccwpck_require__(8512); async function run() { @@ -31259,11 +31259,10 @@ async function run() { } if (downloadSettings.as !== '') { // TODO could move logic to above? - const inOutFilePath = (0, node_fs_1.readdirSync)(downloadSettings.outFilePath); - if (inOutFilePath.length !== 1) { + if (res.length !== 1) { throw new Error('`as` can only be used when one file is being downloaded'); } - (0, node_fs_1.renameSync)(inOutFilePath[0], downloadSettings.as); + io.mv(res[0], downloadSettings.as); } if (downloadSettings.addToPathEnvironmentVariable) { process.env.PATH += node_path_1.delimiter + downloadSettings.outFilePath; diff --git a/src/main.ts b/src/main.ts index 72b86fca..3765bd1c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,8 +2,8 @@ import * as core from '@actions/core' import * as handlers from 'typed-rest-client/Handlers' import * as inputHelper from './input-helper' import * as thc from 'typed-rest-client/HttpClient' -import { delimiter } from "node:path"; -import { readdirSync, renameSync } from "node:fs"; +import { delimiter } from 'node:path' +import * as io from '@actions/io' import { ReleaseDownloader } from './release-downloader' import { extract } from './unarchive' @@ -32,17 +32,18 @@ async function run(): Promise { } } - if (downloadSettings.as !== "") { + if (downloadSettings.as !== '') { // TODO could move logic to above? - const inOutFilePath = readdirSync(downloadSettings.outFilePath); - if (inOutFilePath.length !== 1) { - throw new Error("`as` can only be used when one file is being downloaded"); + if (res.length !== 1) { + throw new Error( + '`as` can only be used when one file is being downloaded' + ) } - renameSync(inOutFilePath[0], downloadSettings.as); + io.mv(res[0], downloadSettings.as) } if (downloadSettings.addToPathEnvironmentVariable) { - process.env.PATH += delimiter + downloadSettings.outFilePath; + process.env.PATH += delimiter + downloadSettings.outFilePath } core.info(`Done: ${res}`) From 57a829f41bd9e2786a26e294c47979dc0f20b542 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 18 Jun 2024 11:25:31 +0100 Subject: [PATCH 04/15] PATH fix --- dist/index.js | 8 ++++---- src/main.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/dist/index.js b/dist/index.js index 97dc6a33..1cbaf128 100644 --- a/dist/index.js +++ b/dist/index.js @@ -31237,8 +31237,8 @@ const core = __importStar(__nccwpck_require__(2186)); const handlers = __importStar(__nccwpck_require__(4442)); const inputHelper = __importStar(__nccwpck_require__(6455)); const thc = __importStar(__nccwpck_require__(5538)); -const node_path_1 = __nccwpck_require__(9411); const io = __importStar(__nccwpck_require__(7436)); +const node_path_1 = __nccwpck_require__(9411); const release_downloader_1 = __nccwpck_require__(785); const unarchive_1 = __nccwpck_require__(8512); async function run() { @@ -31260,12 +31260,12 @@ async function run() { if (downloadSettings.as !== '') { // TODO could move logic to above? if (res.length !== 1) { - throw new Error('`as` can only be used when one file is being downloaded'); + throw new Error(`'as' can only be used when one file is being downloaded. Downloading ${res}`); } io.mv(res[0], downloadSettings.as); } - if (downloadSettings.addToPathEnvironmentVariable) { - process.env.PATH += node_path_1.delimiter + downloadSettings.outFilePath; + if (downloadSettings.addToPathEnvironmentVariable && process.env.GITHUB_PATH) { + process.env.PATH += node_path_1.delimiter + (0, node_path_1.join)(process.env.GITHUB_PATH, downloadSettings.outFilePath); } core.info(`Done: ${res}`); } diff --git a/src/main.ts b/src/main.ts index 3765bd1c..7bd18f46 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,8 +2,8 @@ import * as core from '@actions/core' import * as handlers from 'typed-rest-client/Handlers' import * as inputHelper from './input-helper' import * as thc from 'typed-rest-client/HttpClient' -import { delimiter } from 'node:path' import * as io from '@actions/io' +import { delimiter, join } from 'node:path' import { ReleaseDownloader } from './release-downloader' import { extract } from './unarchive' @@ -36,14 +36,14 @@ async function run(): Promise { // TODO could move logic to above? if (res.length !== 1) { throw new Error( - '`as` can only be used when one file is being downloaded' + `'as' can only be used when one file is being downloaded. Downloading ${res}` ) } io.mv(res[0], downloadSettings.as) } - if (downloadSettings.addToPathEnvironmentVariable) { - process.env.PATH += delimiter + downloadSettings.outFilePath + if (downloadSettings.addToPathEnvironmentVariable && process.env.GITHUB_PATH) { + process.env.PATH += delimiter + join(process.env.GITHUB_PATH, downloadSettings.outFilePath) } core.info(`Done: ${res}`) From 0fa27f62c749fced65f8597f63e5b6df5e85c5b9 Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 18 Jun 2024 11:37:23 +0100 Subject: [PATCH 05/15] another fix --- dist/index.js | 2 +- src/main.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/index.js b/dist/index.js index 1cbaf128..28ebd6f5 100644 --- a/dist/index.js +++ b/dist/index.js @@ -31262,7 +31262,7 @@ async function run() { if (res.length !== 1) { throw new Error(`'as' can only be used when one file is being downloaded. Downloading ${res}`); } - io.mv(res[0], downloadSettings.as); + io.mv(res[0], (0, node_path_1.join)(downloadSettings.outFilePath, downloadSettings.as)); } if (downloadSettings.addToPathEnvironmentVariable && process.env.GITHUB_PATH) { process.env.PATH += node_path_1.delimiter + (0, node_path_1.join)(process.env.GITHUB_PATH, downloadSettings.outFilePath); diff --git a/src/main.ts b/src/main.ts index 7bd18f46..87ebca06 100644 --- a/src/main.ts +++ b/src/main.ts @@ -39,7 +39,7 @@ async function run(): Promise { `'as' can only be used when one file is being downloaded. Downloading ${res}` ) } - io.mv(res[0], downloadSettings.as) + io.mv(res[0], join(downloadSettings.outFilePath, downloadSettings.as)) } if (downloadSettings.addToPathEnvironmentVariable && process.env.GITHUB_PATH) { From d7a82e5517f0638e4f5186e9de40d6a6dca0166e Mon Sep 17 00:00:00 2001 From: Ben Date: Tue, 18 Jun 2024 11:49:14 +0100 Subject: [PATCH 06/15] core.addPath --- dist/index.js | 2 +- src/main.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/index.js b/dist/index.js index 28ebd6f5..9ef7f683 100644 --- a/dist/index.js +++ b/dist/index.js @@ -31265,7 +31265,7 @@ async function run() { io.mv(res[0], (0, node_path_1.join)(downloadSettings.outFilePath, downloadSettings.as)); } if (downloadSettings.addToPathEnvironmentVariable && process.env.GITHUB_PATH) { - process.env.PATH += node_path_1.delimiter + (0, node_path_1.join)(process.env.GITHUB_PATH, downloadSettings.outFilePath); + core.addPath((0, node_path_1.join)(process.env.GITHUB_PATH, downloadSettings.outFilePath)); } core.info(`Done: ${res}`); } diff --git a/src/main.ts b/src/main.ts index 87ebca06..53fb03e6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -43,7 +43,7 @@ async function run(): Promise { } if (downloadSettings.addToPathEnvironmentVariable && process.env.GITHUB_PATH) { - process.env.PATH += delimiter + join(process.env.GITHUB_PATH, downloadSettings.outFilePath) + core.addPath(join(process.env.GITHUB_PATH, downloadSettings.outFilePath)) } core.info(`Done: ${res}`) From 7d49e7fa3b9de6b4021dafa515d71c5f179e234f Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 21 Jun 2024 18:04:47 +0100 Subject: [PATCH 07/15] Trying to fix path --- dist/index.js | 4 ++-- src/main.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/index.js b/dist/index.js index 9ef7f683..41adc107 100644 --- a/dist/index.js +++ b/dist/index.js @@ -31264,8 +31264,8 @@ async function run() { } io.mv(res[0], (0, node_path_1.join)(downloadSettings.outFilePath, downloadSettings.as)); } - if (downloadSettings.addToPathEnvironmentVariable && process.env.GITHUB_PATH) { - core.addPath((0, node_path_1.join)(process.env.GITHUB_PATH, downloadSettings.outFilePath)); + if (downloadSettings.addToPathEnvironmentVariable && downloadSettings.as !== '' && process.env.GITHUB_PATH) { + core.addPath((0, node_path_1.join)(process.env.GITHUB_PATH, downloadSettings.outFilePath, downloadSettings.as)); } core.info(`Done: ${res}`); } diff --git a/src/main.ts b/src/main.ts index 53fb03e6..b0516b28 100644 --- a/src/main.ts +++ b/src/main.ts @@ -42,8 +42,8 @@ async function run(): Promise { io.mv(res[0], join(downloadSettings.outFilePath, downloadSettings.as)) } - if (downloadSettings.addToPathEnvironmentVariable && process.env.GITHUB_PATH) { - core.addPath(join(process.env.GITHUB_PATH, downloadSettings.outFilePath)) + if (downloadSettings.addToPathEnvironmentVariable && downloadSettings.as !== '' && process.env.GITHUB_PATH) { + core.addPath(join(process.env.GITHUB_PATH, downloadSettings.outFilePath, downloadSettings.as)) } core.info(`Done: ${res}`) From b861abb6f9d0e578ca787220a976362db369fdc2 Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 21 Jun 2024 18:32:19 +0100 Subject: [PATCH 08/15] Update addPath --- dist/index.js | 4 +++- src/main.ts | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dist/index.js b/dist/index.js index 41adc107..85b0fa7b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -31265,7 +31265,9 @@ async function run() { io.mv(res[0], (0, node_path_1.join)(downloadSettings.outFilePath, downloadSettings.as)); } if (downloadSettings.addToPathEnvironmentVariable && downloadSettings.as !== '' && process.env.GITHUB_PATH) { - core.addPath((0, node_path_1.join)(process.env.GITHUB_PATH, downloadSettings.outFilePath, downloadSettings.as)); + const pathToExecutable = (0, node_path_1.join)(downloadSettings.outFilePath, downloadSettings.as); + core.info(`Added ${pathToExecutable} to PATH`); + core.addPath(pathToExecutable); } core.info(`Done: ${res}`); } diff --git a/src/main.ts b/src/main.ts index b0516b28..9f5092da 100644 --- a/src/main.ts +++ b/src/main.ts @@ -43,7 +43,9 @@ async function run(): Promise { } if (downloadSettings.addToPathEnvironmentVariable && downloadSettings.as !== '' && process.env.GITHUB_PATH) { - core.addPath(join(process.env.GITHUB_PATH, downloadSettings.outFilePath, downloadSettings.as)) + const pathToExecutable = join(downloadSettings.outFilePath, downloadSettings.as); + core.info(`Added ${pathToExecutable} to PATH`); + core.addPath(pathToExecutable); } core.info(`Done: ${res}`) From c2e036d7ca5b441aa306e438746ad4da305e50cb Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 21 Jun 2024 19:56:15 +0100 Subject: [PATCH 09/15] Update path logic --- dist/index.js | 6 +++--- src/main.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dist/index.js b/dist/index.js index 85b0fa7b..2f825f4a 100644 --- a/dist/index.js +++ b/dist/index.js @@ -31265,9 +31265,9 @@ async function run() { io.mv(res[0], (0, node_path_1.join)(downloadSettings.outFilePath, downloadSettings.as)); } if (downloadSettings.addToPathEnvironmentVariable && downloadSettings.as !== '' && process.env.GITHUB_PATH) { - const pathToExecutable = (0, node_path_1.join)(downloadSettings.outFilePath, downloadSettings.as); - core.info(`Added ${pathToExecutable} to PATH`); - core.addPath(pathToExecutable); + const out = downloadSettings.outFilePath; + core.addPath(out); + core.info(`Added ${out} to PATH`); } core.info(`Done: ${res}`); } diff --git a/src/main.ts b/src/main.ts index 9f5092da..af871dd5 100644 --- a/src/main.ts +++ b/src/main.ts @@ -43,9 +43,9 @@ async function run(): Promise { } if (downloadSettings.addToPathEnvironmentVariable && downloadSettings.as !== '' && process.env.GITHUB_PATH) { - const pathToExecutable = join(downloadSettings.outFilePath, downloadSettings.as); - core.info(`Added ${pathToExecutable} to PATH`); - core.addPath(pathToExecutable); + const out = downloadSettings.outFilePath; + core.addPath(out); + core.info(`Added ${out} to PATH`); } core.info(`Done: ${res}`) From 20a15318d2dacedde7641a3ef235dfbe538c8ee1 Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 21 Jun 2024 20:08:20 +0100 Subject: [PATCH 10/15] Make executables executable --- dist/index.js | 9 ++++++++- src/main.ts | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/dist/index.js b/dist/index.js index 2f825f4a..c6468e03 100644 --- a/dist/index.js +++ b/dist/index.js @@ -31239,8 +31239,10 @@ const inputHelper = __importStar(__nccwpck_require__(6455)); const thc = __importStar(__nccwpck_require__(5538)); const io = __importStar(__nccwpck_require__(7436)); const node_path_1 = __nccwpck_require__(9411); +const fs_1 = __nccwpck_require__(7147); const release_downloader_1 = __nccwpck_require__(785); const unarchive_1 = __nccwpck_require__(8512); +const node_fs_1 = __nccwpck_require__(7561); async function run() { try { const downloadSettings = inputHelper.getInputs(); @@ -31264,8 +31266,13 @@ async function run() { } io.mv(res[0], (0, node_path_1.join)(downloadSettings.outFilePath, downloadSettings.as)); } - if (downloadSettings.addToPathEnvironmentVariable && downloadSettings.as !== '' && process.env.GITHUB_PATH) { + if (downloadSettings.addToPathEnvironmentVariable) { const out = downloadSettings.outFilePath; + // Make executables executable + for (const file of (0, fs_1.readdirSync)(out)) { + const newMode = (0, node_fs_1.statSync)(file).mode | fs_1.constants.S_IXUSR | fs_1.constants.S_IXGRP | fs_1.constants.S_IXOTH; + (0, fs_1.chmodSync)(file, newMode); + } core.addPath(out); core.info(`Added ${out} to PATH`); } diff --git a/src/main.ts b/src/main.ts index af871dd5..6e1b8b22 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,9 +4,11 @@ import * as inputHelper from './input-helper' import * as thc from 'typed-rest-client/HttpClient' import * as io from '@actions/io' import { delimiter, join } from 'node:path' +import { readdirSync, chmodSync, constants } from 'fs' import { ReleaseDownloader } from './release-downloader' import { extract } from './unarchive' +import { statSync } from 'node:fs' async function run(): Promise { try { @@ -42,8 +44,13 @@ async function run(): Promise { io.mv(res[0], join(downloadSettings.outFilePath, downloadSettings.as)) } - if (downloadSettings.addToPathEnvironmentVariable && downloadSettings.as !== '' && process.env.GITHUB_PATH) { + if (downloadSettings.addToPathEnvironmentVariable) { const out = downloadSettings.outFilePath; + // Make executables executable + for (const file of readdirSync(out)) { + const newMode = statSync(file).mode | constants.S_IXUSR | constants.S_IXGRP | constants.S_IXOTH + chmodSync(file, newMode); + } core.addPath(out); core.info(`Added ${out} to PATH`); } From 8b132af8d2eac417123e84cbdc4e6db1d62b5fc2 Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 21 Jun 2024 20:20:08 +0100 Subject: [PATCH 11/15] Use renameSync --- dist/index.js | 14 ++++++-------- src/main.ts | 10 ++++------ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/dist/index.js b/dist/index.js index c6468e03..c2eb8247 100644 --- a/dist/index.js +++ b/dist/index.js @@ -31237,12 +31237,9 @@ const core = __importStar(__nccwpck_require__(2186)); const handlers = __importStar(__nccwpck_require__(4442)); const inputHelper = __importStar(__nccwpck_require__(6455)); const thc = __importStar(__nccwpck_require__(5538)); -const io = __importStar(__nccwpck_require__(7436)); -const node_path_1 = __nccwpck_require__(9411); -const fs_1 = __nccwpck_require__(7147); +const node_fs_1 = __nccwpck_require__(7561); const release_downloader_1 = __nccwpck_require__(785); const unarchive_1 = __nccwpck_require__(8512); -const node_fs_1 = __nccwpck_require__(7561); async function run() { try { const downloadSettings = inputHelper.getInputs(); @@ -31264,14 +31261,15 @@ async function run() { if (res.length !== 1) { throw new Error(`'as' can only be used when one file is being downloaded. Downloading ${res}`); } - io.mv(res[0], (0, node_path_1.join)(downloadSettings.outFilePath, downloadSettings.as)); + (0, node_fs_1.renameSync)(res[0], downloadSettings.as); } if (downloadSettings.addToPathEnvironmentVariable) { const out = downloadSettings.outFilePath; // Make executables executable - for (const file of (0, fs_1.readdirSync)(out)) { - const newMode = (0, node_fs_1.statSync)(file).mode | fs_1.constants.S_IXUSR | fs_1.constants.S_IXGRP | fs_1.constants.S_IXOTH; - (0, fs_1.chmodSync)(file, newMode); + for (const file of (0, node_fs_1.readdirSync)(out)) { + core.info(`Making ${file} executable`); + const newMode = (0, node_fs_1.statSync)(file).mode | node_fs_1.constants.S_IXUSR | node_fs_1.constants.S_IXGRP | node_fs_1.constants.S_IXOTH; + (0, node_fs_1.chmodSync)(file, newMode); } core.addPath(out); core.info(`Added ${out} to PATH`); diff --git a/src/main.ts b/src/main.ts index 6e1b8b22..d2e566e3 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,13 +2,10 @@ import * as core from '@actions/core' import * as handlers from 'typed-rest-client/Handlers' import * as inputHelper from './input-helper' import * as thc from 'typed-rest-client/HttpClient' -import * as io from '@actions/io' -import { delimiter, join } from 'node:path' -import { readdirSync, chmodSync, constants } from 'fs' +import { readdirSync, chmodSync, constants, renameSync, statSync } from 'node:fs' import { ReleaseDownloader } from './release-downloader' import { extract } from './unarchive' -import { statSync } from 'node:fs' async function run(): Promise { try { @@ -41,14 +38,15 @@ async function run(): Promise { `'as' can only be used when one file is being downloaded. Downloading ${res}` ) } - io.mv(res[0], join(downloadSettings.outFilePath, downloadSettings.as)) + renameSync(res[0], downloadSettings.as) } if (downloadSettings.addToPathEnvironmentVariable) { const out = downloadSettings.outFilePath; // Make executables executable for (const file of readdirSync(out)) { - const newMode = statSync(file).mode | constants.S_IXUSR | constants.S_IXGRP | constants.S_IXOTH + core.info(`Making ${file} executable`); + const newMode = statSync(file).mode | constants.S_IXUSR | constants.S_IXGRP | constants.S_IXOTH; chmodSync(file, newMode); } core.addPath(out); From 3835bd9a0c64f36ab20e3e74d5f43d40ff126d76 Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 21 Jun 2024 20:58:01 +0100 Subject: [PATCH 12/15] Remove `as` --- action.yml | 4 ---- dist/index.js | 23 ++++++++++++----------- src/download-settings.ts | 5 ----- src/input-helper.ts | 1 - src/main.ts | 25 ++++++++++++------------- 5 files changed, 24 insertions(+), 34 deletions(-) diff --git a/action.yml b/action.yml index 9c65247f..b2bc024b 100644 --- a/action.yml +++ b/action.yml @@ -61,10 +61,6 @@ inputs: description: 'The release id to download the file from' default: '' required: false - as: - description: 'The output name of the asset' - default: '' - required: false addToPath: description: 'Whether to add the output path to PATH (so a binary can be global diff --git a/dist/index.js b/dist/index.js index c2eb8247..e17b9d31 100644 --- a/dist/index.js +++ b/dist/index.js @@ -31196,7 +31196,6 @@ function getInputs() { extractAssets: core.getBooleanInput('extract'), outFilePath: path.resolve(githubWorkspacePath, core.getInput('out-file-path') || '.'), addToPathEnvironmentVariable: core.getBooleanInput('addToPath'), - as: core.getInput('as') }; } exports.getInputs = getInputs; @@ -31238,6 +31237,7 @@ const handlers = __importStar(__nccwpck_require__(4442)); const inputHelper = __importStar(__nccwpck_require__(6455)); const thc = __importStar(__nccwpck_require__(5538)); const node_fs_1 = __nccwpck_require__(7561); +const node_path_1 = __nccwpck_require__(9411); const release_downloader_1 = __nccwpck_require__(785); const unarchive_1 = __nccwpck_require__(8512); async function run() { @@ -31256,20 +31256,21 @@ async function run() { await (0, unarchive_1.extract)(asset, downloadSettings.outFilePath); } } - if (downloadSettings.as !== '') { - // TODO could move logic to above? - if (res.length !== 1) { - throw new Error(`'as' can only be used when one file is being downloaded. Downloading ${res}`); - } - (0, node_fs_1.renameSync)(res[0], downloadSettings.as); - } if (downloadSettings.addToPathEnvironmentVariable) { const out = downloadSettings.outFilePath; // Make executables executable for (const file of (0, node_fs_1.readdirSync)(out)) { - core.info(`Making ${file} executable`); - const newMode = (0, node_fs_1.statSync)(file).mode | node_fs_1.constants.S_IXUSR | node_fs_1.constants.S_IXGRP | node_fs_1.constants.S_IXOTH; - (0, node_fs_1.chmodSync)(file, newMode); + let full = (0, node_path_1.join)(out, file); + const toSliceTo = /-[0-9]/.exec(file); + if (toSliceTo) { + const old = full; + full = (0, node_path_1.join)(out, file.slice(0, toSliceTo.index)); + (0, node_fs_1.renameSync)(old, full); + core.debug(`Renamed ${old} to ${full}`); + } + const newMode = (0, node_fs_1.statSync)(full).mode | node_fs_1.constants.S_IXUSR | node_fs_1.constants.S_IXGRP | node_fs_1.constants.S_IXOTH; + (0, node_fs_1.chmodSync)(full, newMode); + core.info(`Added ${full} executable`); } core.addPath(out); core.info(`Added ${out} to PATH`); diff --git a/src/download-settings.ts b/src/download-settings.ts index 06de0674..0643e894 100644 --- a/src/download-settings.ts +++ b/src/download-settings.ts @@ -53,9 +53,4 @@ export interface IReleaseDownloadSettings { * Add downloaded file path to the PATH environment variable */ addToPathEnvironmentVariable: boolean - - /** - * Rename output (expected to only download single asset) - */ - as: string } diff --git a/src/input-helper.ts b/src/input-helper.ts index 38f2afcc..4689fd93 100644 --- a/src/input-helper.ts +++ b/src/input-helper.ts @@ -55,6 +55,5 @@ export function getInputs(): IReleaseDownloadSettings { core.getInput('out-file-path') || '.' ), addToPathEnvironmentVariable: core.getBooleanInput('addToPath'), - as: core.getInput('as') } } diff --git a/src/main.ts b/src/main.ts index d2e566e3..a02caa21 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,6 +3,7 @@ import * as handlers from 'typed-rest-client/Handlers' import * as inputHelper from './input-helper' import * as thc from 'typed-rest-client/HttpClient' import { readdirSync, chmodSync, constants, renameSync, statSync } from 'node:fs' +import { basename, join } from 'node:path' import { ReleaseDownloader } from './release-downloader' import { extract } from './unarchive' @@ -31,23 +32,21 @@ async function run(): Promise { } } - if (downloadSettings.as !== '') { - // TODO could move logic to above? - if (res.length !== 1) { - throw new Error( - `'as' can only be used when one file is being downloaded. Downloading ${res}` - ) - } - renameSync(res[0], downloadSettings.as) - } - if (downloadSettings.addToPathEnvironmentVariable) { const out = downloadSettings.outFilePath; // Make executables executable for (const file of readdirSync(out)) { - core.info(`Making ${file} executable`); - const newMode = statSync(file).mode | constants.S_IXUSR | constants.S_IXGRP | constants.S_IXOTH; - chmodSync(file, newMode); + let full = join(out, file); + const toSliceTo = /-[0-9]/.exec(file); + if (toSliceTo) { + const old = full; + full = join(out, file.slice(0, toSliceTo.index)); + renameSync(old, full); + core.debug(`Renamed ${old} to ${full}`); + } + const newMode = statSync(full).mode | constants.S_IXUSR | constants.S_IXGRP | constants.S_IXOTH; + chmodSync(full, newMode); + core.info(`Added ${full} executable`); } core.addPath(out); core.info(`Added ${out} to PATH`); From 1b99522e8616dbece1a2102f6f63550c86dfccc2 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 10 Jul 2024 12:48:57 +0100 Subject: [PATCH 13/15] Added test (with assets) + fix for 'v' names --- README.md | 7 + __tests__/main.test.ts | 88 ++- __tests__/resource/7-add-assets-to-path.json | 597 ++++++++++++++++++ __tests__/resource/assets/assets-path.json | 34 + .../resource/assets/sharkdp-hyperfine.tar.gz | Bin 0 -> 159906 bytes .../resource/assets/sharkdp-hyperfine.zip | Bin 0 -> 180409 bytes src/main.ts | 38 +- 7 files changed, 735 insertions(+), 29 deletions(-) create mode 100644 __tests__/resource/7-add-assets-to-path.json create mode 100644 __tests__/resource/assets/assets-path.json create mode 100644 __tests__/resource/assets/sharkdp-hyperfine.tar.gz create mode 100644 __tests__/resource/assets/sharkdp-hyperfine.zip diff --git a/README.md b/README.md index a68d4ff7..c97e0486 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,13 @@ specified files from both private and public repositories. # Default: "https://api.github.com" # Use http(s)://[hostname]/api/v3 to access the API for GitHub Enterprise Server github-api-url: '' + + # Add downloaded file path to the PATH environment variable + # Default: false + # Also strips any information after `-(v?)[0-9]` (which is commonly version and platform information), so that + # the binary is name matches its standard name. + # Also makes binaries executable via chmod + addToPath: false ``` ### Output variables diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index 5ba78cfc..5be9005d 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -8,6 +8,7 @@ import { IReleaseDownloadSettings } from '../src/download-settings' import { ReleaseDownloader } from '../src/release-downloader' import nock from 'nock' import { extract } from '../src/unarchive' +import { which } from '@actions/io' let downloader: ReleaseDownloader let httpClent: thc.HttpClient @@ -123,6 +124,26 @@ beforeEach(() => { 200, `${__dirname}/resource/assets/tar-zip-ball-only-repo.zip` ) + + nock('https://api.github.com') + .get('/repos/sharkdp/hyperfine/releases/latest') + .replyWithFile(200, `${__dirname}/resource/7-add-assets-to-path.json`) + + nock('https://api.github.com') + .get('/repos/sharkdp/hyperfine/releases/assets/129136486') + .replyWithFile(200, `${__dirname}/resource/assets/assets-path.json`) + + nock('https://api.github.com', { + reqheaders: { accept: '*/*' } + }) + .get('/repos/sharkdp/hyperfine/zipball/v1.18.0') + .replyWithFile(200, `${__dirname}/resource/assets/sharkdp-hyperfine.zip`) + + nock('https://api.github.com', { + reqheaders: { accept: '*/*' } + }) + .get('/repos/sharkdp/hyperfine/tarball/v1.18.0') + .replyWithFile(200, `${__dirname}/resource/assets/sharkdp-hyperfine.tar.gz`) }) afterEach(async () => { @@ -152,7 +173,8 @@ test('Download all files from public repo', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = await downloader.download(downloadSettings) expect(result.length).toBe(7) @@ -169,7 +191,8 @@ test('Download single file from public repo', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = await downloader.download(downloadSettings) expect(result.length).toBe(1) @@ -186,7 +209,8 @@ test('Fail loudly if given filename is not found in a release', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = downloader.download(downloadSettings) await expect(result).rejects.toThrow( @@ -205,7 +229,8 @@ test('Fail loudly if release is not identified', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = downloader.download(downloadSettings) await expect(result).rejects.toThrow( @@ -224,7 +249,8 @@ test('Download files with wildcard from public repo', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = await downloader.download(downloadSettings) expect(result.length).toBe(2) @@ -241,7 +267,8 @@ test('Download single file with wildcard from public repo', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = await downloader.download(downloadSettings) expect(result.length).toBe(1) @@ -258,7 +285,8 @@ test('Download multiple pdf files with wildcard filename', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = await downloader.download(downloadSettings) expect(result.length).toBe(2) @@ -275,7 +303,8 @@ test('Download a csv file with wildcard filename', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = await downloader.download(downloadSettings) expect(result.length).toBe(1) @@ -294,7 +323,8 @@ test('Download file from Github Enterprise server', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = await downloader.download(downloadSettings) expect(result.length).toBe(1) @@ -311,7 +341,8 @@ test('Download file from release identified by ID', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = await downloader.download(downloadSettings) expect(result.length).toBe(1) @@ -328,7 +359,8 @@ test('Download all archive files from public repo', async () => { tarBall: false, zipBall: false, extractAssets: true, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = await downloader.download(downloadSettings) if (downloadSettings.extractAssets) { @@ -367,7 +399,8 @@ test('Fail when a release with no assets are obtained', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = downloader.download(downloadSettings) await expect(result).rejects.toThrow( @@ -386,7 +419,8 @@ test('Download from latest prerelease', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = await downloader.download(downloadSettings) expect(result.length).toBe(1) @@ -403,7 +437,8 @@ test('Fail when a release with no prerelease is obtained', async () => { tarBall: false, zipBall: false, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = downloader.download(downloadSettings) await expect(result).rejects.toThrow('No prereleases found!') @@ -420,9 +455,32 @@ test('Download from a release containing only tarBall & zipBall', async () => { tarBall: true, zipBall: true, extractAssets: false, - outFilePath: outputFilePath + outFilePath: outputFilePath, + addToPathEnvironmentVariable: false } const result = await downloader.download(downloadSettings) expect(result.length).toBe(2) }) + +test('Download from a release and add binary to PATH', async () => { + const downloadSettings: IReleaseDownloadSettings = { + sourceRepoPath: 'sharkdp/hyperfine', + isLatest: true, + preRelease: false, + tag: '', + id: '', + fileName: '*-x86_64-unknown-linux-gnu*', + tarBall: true, + zipBall: true, + extractAssets: true, + outFilePath: outputFilePath, + addToPathEnvironmentVariable: true + } + + const result = await downloader.download(downloadSettings) + expect(result.length).toBeGreaterThan(0) + + const binaryPath = await which('hyperfine', true) + expect(binaryPath) +}) diff --git a/__tests__/resource/7-add-assets-to-path.json b/__tests__/resource/7-add-assets-to-path.json new file mode 100644 index 00000000..1d10694c --- /dev/null +++ b/__tests__/resource/7-add-assets-to-path.json @@ -0,0 +1,597 @@ +{ + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/123814329", + "assets_url": "https://api.github.com/repos/sharkdp/hyperfine/releases/123814329/assets", + "upload_url": "https://uploads.github.com/repos/sharkdp/hyperfine/releases/123814329/assets{?name,label}", + "html_url": "https://github.com/sharkdp/hyperfine/releases/tag/v1.18.0", + "id": 123814329, + "author": { + "login": "sharkdp", + "id": 4209276, + "node_id": "MDQ6VXNlcjQyMDkyNzY=", + "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/sharkdp", + "html_url": "https://github.com/sharkdp", + "followers_url": "https://api.github.com/users/sharkdp/followers", + "following_url": "https://api.github.com/users/sharkdp/following{/other_user}", + "gists_url": "https://api.github.com/users/sharkdp/gists{/gist_id}", + "starred_url": "https://api.github.com/users/sharkdp/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/sharkdp/subscriptions", + "organizations_url": "https://api.github.com/users/sharkdp/orgs", + "repos_url": "https://api.github.com/users/sharkdp/repos", + "events_url": "https://api.github.com/users/sharkdp/events{/privacy}", + "received_events_url": "https://api.github.com/users/sharkdp/received_events", + "type": "User", + "site_admin": false + }, + "node_id": "RE_kwDOBv62x84HYUG5", + "tag_name": "v1.18.0", + "target_commitish": "master", + "name": "v1.18.0", + "draft": false, + "prerelease": false, + "created_at": "2023-10-05T07:58:16Z", + "published_at": "2023-10-05T08:07:11Z", + "assets": [ + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136268", + "id": 129136268, + "node_id": "RA_kwDOBv62x84HsnaM", + "name": "hyperfine-musl_1.18.0_amd64.deb", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 554468, + "download_count": 2787, + "created_at": "2023-10-05T08:10:50Z", + "updated_at": "2023-10-05T08:10:50Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-musl_1.18.0_amd64.deb" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136033", + "id": 129136033, + "node_id": "RA_kwDOBv62x84HsnWh", + "name": "hyperfine-musl_1.18.0_i686.deb", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 570024, + "download_count": 1930, + "created_at": "2023-10-05T08:09:55Z", + "updated_at": "2023-10-05T08:09:55Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-musl_1.18.0_i686.deb" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136452", + "id": 129136452, + "node_id": "RA_kwDOBv62x84HsndE", + "name": "hyperfine-v1.18.0-aarch64-unknown-linux-gnu.tar.gz", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/gzip", + "state": "uploaded", + "size": 598999, + "download_count": 5915, + "created_at": "2023-10-05T08:11:30Z", + "updated_at": "2023-10-05T08:11:31Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-v1.18.0-aarch64-unknown-linux-gnu.tar.gz" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136140", + "id": 129136140, + "node_id": "RA_kwDOBv62x84HsnYM", + "name": "hyperfine-v1.18.0-arm-unknown-linux-gnueabihf.tar.gz", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/gzip", + "state": "uploaded", + "size": 626661, + "download_count": 1960, + "created_at": "2023-10-05T08:10:23Z", + "updated_at": "2023-10-05T08:10:23Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-v1.18.0-arm-unknown-linux-gnueabihf.tar.gz" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136386", + "id": 129136386, + "node_id": "RA_kwDOBv62x84HsncC", + "name": "hyperfine-v1.18.0-arm-unknown-linux-musleabihf.tar.gz", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/gzip", + "state": "uploaded", + "size": 655748, + "download_count": 1930, + "created_at": "2023-10-05T08:11:07Z", + "updated_at": "2023-10-05T08:11:08Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-v1.18.0-arm-unknown-linux-musleabihf.tar.gz" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136657", + "id": 129136657, + "node_id": "RA_kwDOBv62x84HsngR", + "name": "hyperfine-v1.18.0-i686-pc-windows-msvc.zip", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/zip", + "state": "uploaded", + "size": 544129, + "download_count": 2199, + "created_at": "2023-10-05T08:13:22Z", + "updated_at": "2023-10-05T08:13:22Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-v1.18.0-i686-pc-windows-msvc.zip" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136138", + "id": 129136138, + "node_id": "RA_kwDOBv62x84HsnYK", + "name": "hyperfine-v1.18.0-i686-unknown-linux-gnu.tar.gz", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/gzip", + "state": "uploaded", + "size": 659952, + "download_count": 2040, + "created_at": "2023-10-05T08:10:22Z", + "updated_at": "2023-10-05T08:10:23Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-v1.18.0-i686-unknown-linux-gnu.tar.gz" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136032", + "id": 129136032, + "node_id": "RA_kwDOBv62x84HsnWg", + "name": "hyperfine-v1.18.0-i686-unknown-linux-musl.tar.gz", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/gzip", + "state": "uploaded", + "size": 692610, + "download_count": 2061, + "created_at": "2023-10-05T08:09:55Z", + "updated_at": "2023-10-05T08:09:55Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-v1.18.0-i686-unknown-linux-musl.tar.gz" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136202", + "id": 129136202, + "node_id": "RA_kwDOBv62x84HsnZK", + "name": "hyperfine-v1.18.0-x86_64-apple-darwin.tar.gz", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/gzip", + "state": "uploaded", + "size": 592580, + "download_count": 22077, + "created_at": "2023-10-05T08:10:37Z", + "updated_at": "2023-10-05T08:10:37Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-v1.18.0-x86_64-apple-darwin.tar.gz" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136514", + "id": 129136514, + "node_id": "RA_kwDOBv62x84HsneC", + "name": "hyperfine-v1.18.0-x86_64-pc-windows-msvc.zip", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/zip", + "state": "uploaded", + "size": 582727, + "download_count": 15135, + "created_at": "2023-10-05T08:11:55Z", + "updated_at": "2023-10-05T08:11:55Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-v1.18.0-x86_64-pc-windows-msvc.zip" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136486", + "id": 129136486, + "node_id": "RA_kwDOBv62x84Hsndm", + "name": "hyperfine-v1.18.0-x86_64-unknown-linux-gnu.tar.gz", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/gzip", + "state": "uploaded", + "size": 641859, + "download_count": 29510, + "created_at": "2023-10-05T08:11:46Z", + "updated_at": "2023-10-05T08:11:47Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-v1.18.0-x86_64-unknown-linux-gnu.tar.gz" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136269", + "id": 129136269, + "node_id": "RA_kwDOBv62x84HsnaN", + "name": "hyperfine-v1.18.0-x86_64-unknown-linux-musl.tar.gz", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/gzip", + "state": "uploaded", + "size": 694152, + "download_count": 37168, + "created_at": "2023-10-05T08:10:50Z", + "updated_at": "2023-10-05T08:10:50Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-v1.18.0-x86_64-unknown-linux-musl.tar.gz" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136487", + "id": 129136487, + "node_id": "RA_kwDOBv62x84Hsndn", + "name": "hyperfine_1.18.0_amd64.deb", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 511336, + "download_count": 10641, + "created_at": "2023-10-05T08:11:46Z", + "updated_at": "2023-10-05T08:11:47Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine_1.18.0_amd64.deb" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136451", + "id": 129136451, + "node_id": "RA_kwDOBv62x84HsndD", + "name": "hyperfine_1.18.0_arm64.deb", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 448112, + "download_count": 179, + "created_at": "2023-10-05T08:11:30Z", + "updated_at": "2023-10-05T08:11:31Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine_1.18.0_arm64.deb" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136389", + "id": 129136389, + "node_id": "RA_kwDOBv62x84HsncF", + "name": "hyperfine_1.18.0_armhf.deb", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 493324, + "download_count": 202, + "created_at": "2023-10-05T08:11:08Z", + "updated_at": "2023-10-05T08:11:08Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine_1.18.0_armhf.deb" + }, + { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136139", + "id": 129136139, + "node_id": "RA_kwDOBv62x84HsnYL", + "name": "hyperfine_1.18.0_i686.deb", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/octet-stream", + "state": "uploaded", + "size": 536760, + "download_count": 38, + "created_at": "2023-10-05T08:10:22Z", + "updated_at": "2023-10-05T08:10:23Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine_1.18.0_i686.deb" + } + ], + "tarball_url": "https://api.github.com/repos/sharkdp/hyperfine/tarball/v1.18.0", + "zipball_url": "https://api.github.com/repos/sharkdp/hyperfine/zipball/v1.18.0", + "body": "## Features\r\n\r\n- Add support for microseconds via `--time-unit microsecond`, see #684 (@sharkdp)\r\n\r\n## Bugfixes\r\n\r\n- Proper argument quoting on Windows CMD, see #296 and #678 (@PedroWitzel)\r\n", + "reactions": { + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/123814329/reactions", + "total_count": 15, + "+1": 0, + "-1": 0, + "laugh": 0, + "hooray": 12, + "confused": 0, + "heart": 2, + "rocket": 1, + "eyes": 0 + }, + "mentions_count": 2 +} \ No newline at end of file diff --git a/__tests__/resource/assets/assets-path.json b/__tests__/resource/assets/assets-path.json new file mode 100644 index 00000000..bf31fdc9 --- /dev/null +++ b/__tests__/resource/assets/assets-path.json @@ -0,0 +1,34 @@ +{ + "url": "https://api.github.com/repos/sharkdp/hyperfine/releases/assets/129136486", + "id": 129136486, + "node_id": "RA_kwDOBv62x84Hsndm", + "name": "hyperfine-v1.18.0-x86_64-unknown-linux-gnu.tar.gz", + "label": "", + "uploader": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "site_admin": false + }, + "content_type": "application/gzip", + "state": "uploaded", + "size": 641859, + "download_count": 29510, + "created_at": "2023-10-05T08:11:46Z", + "updated_at": "2023-10-05T08:11:47Z", + "browser_download_url": "https://github.com/sharkdp/hyperfine/releases/download/v1.18.0/hyperfine-v1.18.0-x86_64-unknown-linux-gnu.tar.gz" +} \ No newline at end of file diff --git a/__tests__/resource/assets/sharkdp-hyperfine.tar.gz b/__tests__/resource/assets/sharkdp-hyperfine.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6ee513b48c1b1b9db42d7aafc311cc7a21204bc6 GIT binary patch literal 159906 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
  • krK#TM(AFh&?>J4UoA7{)il|UCsqb)I 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 g;=KN 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 JLm~h$2LOAQfWH6$ literal 0 HcmV?d00001 diff --git a/__tests__/resource/assets/sharkdp-hyperfine.zip b/__tests__/resource/assets/sharkdp-hyperfine.zip new file mode 100644 index 0000000000000000000000000000000000000000..8bb097bd12000dbafe3128cc8a0e6b5f75952ccc GIT binary patch literal 180409 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

    9&bYugDsuHoY#n%?U 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 literal 0 HcmV?d00001 diff --git a/src/main.ts b/src/main.ts index a02caa21..b56ec601 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,8 +2,14 @@ import * as core from '@actions/core' import * as handlers from 'typed-rest-client/Handlers' import * as inputHelper from './input-helper' import * as thc from 'typed-rest-client/HttpClient' -import { readdirSync, chmodSync, constants, renameSync, statSync } from 'node:fs' -import { basename, join } from 'node:path' +import { + readdirSync, + chmodSync, + constants, + renameSync, + statSync +} from 'node:fs' +import { join } from 'node:path' import { ReleaseDownloader } from './release-downloader' import { extract } from './unarchive' @@ -33,23 +39,27 @@ async function run(): Promise { } if (downloadSettings.addToPathEnvironmentVariable) { - const out = downloadSettings.outFilePath; + const out = downloadSettings.outFilePath // Make executables executable for (const file of readdirSync(out)) { - let full = join(out, file); - const toSliceTo = /-[0-9]/.exec(file); + let full = join(out, file) + const toSliceTo = /-(v?)[0-9]/.exec(file) if (toSliceTo) { - const old = full; - full = join(out, file.slice(0, toSliceTo.index)); - renameSync(old, full); - core.debug(`Renamed ${old} to ${full}`); + const old = full + full = join(out, file.slice(0, toSliceTo.index)) + renameSync(old, full) + core.debug(`Renamed ${old} to ${full}`) } - const newMode = statSync(full).mode | constants.S_IXUSR | constants.S_IXGRP | constants.S_IXOTH; - chmodSync(full, newMode); - core.info(`Added ${full} executable`); + const newMode = + statSync(full).mode | + constants.S_IXUSR | + constants.S_IXGRP | + constants.S_IXOTH + chmodSync(full, newMode) + core.info(`Made ${full} executable`) } - core.addPath(out); - core.info(`Added ${out} to PATH`); + core.addPath(out) + core.info(`Added ${out} to PATH`) } core.info(`Done: ${res}`) From cf3fa9891dfddfbfbf859705d0475e35c9e0ed15 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 10 Jul 2024 13:00:59 +0100 Subject: [PATCH 14/15] Fixes --- README.md | 2 +- dist/index.js | 89766 ++++++++++++++++++++++++------------------------ package.json | 6 +- 3 files changed, 44520 insertions(+), 45254 deletions(-) diff --git a/README.md b/README.md index 21a74bf1..831eaf0e 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ specified files from both private and public repositories. # Add downloaded file path to the PATH environment variable # Default: false - # Also strips any information after `-(v?)[0-9]` (which is commonly version and platform information), so that + # Also strips any information after `-(v?)[0-9]` (which is commonly version and platform information), so that # the binary is name matches its standard name. # Also makes binaries executable via chmod addToPath: false diff --git a/dist/index.js b/dist/index.js index 7c65059f..3c303c8b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2,47813 +2,47083 @@ /******/ var __webpack_modules__ = ({ /***/ 7351: -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) { - - "use strict"; - - var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } }); - }) : (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function (o, v) { - o["default"] = v; - }); - var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.issue = exports.issueCommand = void 0; - const os = __importStar(__nccwpck_require__(2037)); - const utils_1 = __nccwpck_require__(5278); - /** - * Commands - * - * Command Format: - * ::name key=value,key=value::message - * - * Examples: - * ::warning::This is the message - * ::set-env name=MY_VAR::some value - */ - function issueCommand(command, properties, message) { - const cmd = new Command(command, properties, message); - process.stdout.write(cmd.toString() + os.EOL); - } - exports.issueCommand = issueCommand; - function issue(name, message = '') { - issueCommand(name, {}, message); - } - exports.issue = issue; - const CMD_STRING = '::'; - class Command { - constructor(command, properties, message) { - if (!command) { - command = 'missing.command'; +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.issue = exports.issueCommand = void 0; +const os = __importStar(__nccwpck_require__(2037)); +const utils_1 = __nccwpck_require__(5278); +/** + * Commands + * + * Command Format: + * ::name key=value,key=value::message + * + * Examples: + * ::warning::This is the message + * ::set-env name=MY_VAR::some value + */ +function issueCommand(command, properties, message) { + const cmd = new Command(command, properties, message); + process.stdout.write(cmd.toString() + os.EOL); +} +exports.issueCommand = issueCommand; +function issue(name, message = '') { + issueCommand(name, {}, message); +} +exports.issue = issue; +const CMD_STRING = '::'; +class Command { + constructor(command, properties, message) { + if (!command) { + command = 'missing.command'; + } + this.command = command; + this.properties = properties; + this.message = message; + } + toString() { + let cmdStr = CMD_STRING + this.command; + if (this.properties && Object.keys(this.properties).length > 0) { + cmdStr += ' '; + let first = true; + for (const key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + const val = this.properties[key]; + if (val) { + if (first) { + first = false; } - this.command = command; - this.properties = properties; - this.message = message; - } - toString() { - let cmdStr = CMD_STRING + this.command; - if (this.properties && Object.keys(this.properties).length > 0) { - cmdStr += ' '; - let first = true; - for (const key in this.properties) { - if (this.properties.hasOwnProperty(key)) { - const val = this.properties[key]; - if (val) { - if (first) { - first = false; - } - else { - cmdStr += ','; - } - cmdStr += `${key}=${escapeProperty(val)}`; - } - } - } + else { + cmdStr += ','; } - cmdStr += `${CMD_STRING}${escapeData(this.message)}`; - return cmdStr; + cmdStr += `${key}=${escapeProperty(val)}`; } } - function escapeData(s) { - return utils_1.toCommandValue(s) - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A'); - } - function escapeProperty(s) { - return utils_1.toCommandValue(s) - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A') - .replace(/:/g, '%3A') - .replace(/,/g, '%2C'); - } - //# sourceMappingURL=command.js.map + } + } + cmdStr += `${CMD_STRING}${escapeData(this.message)}`; + return cmdStr; + } +} +function escapeData(s) { + return utils_1.toCommandValue(s) + .replace(/%/g, '%25') + .replace(/\r/g, '%0D') + .replace(/\n/g, '%0A'); +} +function escapeProperty(s) { + return utils_1.toCommandValue(s) + .replace(/%/g, '%25') + .replace(/\r/g, '%0D') + .replace(/\n/g, '%0A') + .replace(/:/g, '%3A') + .replace(/,/g, '%2C'); +} +//# sourceMappingURL=command.js.map - /***/ -}), +/***/ }), /***/ 2186: -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) { - - "use strict"; - - var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } }); - }) : (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function (o, v) { - o["default"] = v; - }); - var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0; - const command_1 = __nccwpck_require__(7351); - const file_command_1 = __nccwpck_require__(717); - const utils_1 = __nccwpck_require__(5278); - const os = __importStar(__nccwpck_require__(2037)); - const path = __importStar(__nccwpck_require__(1017)); - const oidc_utils_1 = __nccwpck_require__(8041); - /** - * The code to exit an action - */ - var ExitCode; - (function (ExitCode) { - /** - * A code indicating that the action was successful - */ - ExitCode[ExitCode["Success"] = 0] = "Success"; - /** - * A code indicating that the action was a failure - */ - ExitCode[ExitCode["Failure"] = 1] = "Failure"; - })(ExitCode = exports.ExitCode || (exports.ExitCode = {})); - //----------------------------------------------------------------------- - // Variables - //----------------------------------------------------------------------- - /** - * Sets env variable for this action and future actions in the job - * @param name the name of the variable to set - * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function exportVariable(name, val) { - const convertedVal = utils_1.toCommandValue(val); - process.env[name] = convertedVal; - const filePath = process.env['GITHUB_ENV'] || ''; - if (filePath) { - return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val)); - } - command_1.issueCommand('set-env', { name }, convertedVal); - } - exports.exportVariable = exportVariable; - /** - * Registers a secret which will get masked from logs - * @param secret value of the secret - */ - function setSecret(secret) { - command_1.issueCommand('add-mask', {}, secret); - } - exports.setSecret = setSecret; - /** - * Prepends inputPath to the PATH (for this action and future actions) - * @param inputPath - */ - function addPath(inputPath) { - const filePath = process.env['GITHUB_PATH'] || ''; - if (filePath) { - file_command_1.issueFileCommand('PATH', inputPath); - } - else { - command_1.issueCommand('add-path', {}, inputPath); - } - process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; - } - exports.addPath = addPath; - /** - * Gets the value of an input. - * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed. - * Returns an empty string if the value is not defined. - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns string - */ - function getInput(name, options) { - const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; - if (options && options.required && !val) { - throw new Error(`Input required and not supplied: ${name}`); - } - if (options && options.trimWhitespace === false) { - return val; - } - return val.trim(); - } - exports.getInput = getInput; - /** - * Gets the values of an multiline input. Each value is also trimmed. - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns string[] - * - */ - function getMultilineInput(name, options) { - const inputs = getInput(name, options) - .split('\n') - .filter(x => x !== ''); - if (options && options.trimWhitespace === false) { - return inputs; - } - return inputs.map(input => input.trim()); - } - exports.getMultilineInput = getMultilineInput; - /** - * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. - * Support boolean input list: `true | True | TRUE | false | False | FALSE` . - * The return value is also in boolean type. - * ref: https://yaml.org/spec/1.2/spec.html#id2804923 - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns boolean - */ - function getBooleanInput(name, options) { - const trueValue = ['true', 'True', 'TRUE']; - const falseValue = ['false', 'False', 'FALSE']; - const val = getInput(name, options); - if (trueValue.includes(val)) - return true; - if (falseValue.includes(val)) - return false; - throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + - `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); - } - exports.getBooleanInput = getBooleanInput; - /** - * Sets the value of an output. - * - * @param name name of the output to set - * @param value value to store. Non-string values will be converted to a string via JSON.stringify - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function setOutput(name, value) { - const filePath = process.env['GITHUB_OUTPUT'] || ''; - if (filePath) { - return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value)); - } - process.stdout.write(os.EOL); - command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value)); - } - exports.setOutput = setOutput; - /** - * Enables or disables the echoing of commands into stdout for the rest of the step. - * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. - * - */ - function setCommandEcho(enabled) { - command_1.issue('echo', enabled ? 'on' : 'off'); - } - exports.setCommandEcho = setCommandEcho; - //----------------------------------------------------------------------- - // Results - //----------------------------------------------------------------------- - /** - * Sets the action status to failed. - * When the action exits it will be with an exit code of 1 - * @param message add error issue message - */ - function setFailed(message) { - process.exitCode = ExitCode.Failure; - error(message); - } - exports.setFailed = setFailed; - //----------------------------------------------------------------------- - // Logging Commands - //----------------------------------------------------------------------- - /** - * Gets whether Actions Step Debug is on or not - */ - function isDebug() { - return process.env['RUNNER_DEBUG'] === '1'; - } - exports.isDebug = isDebug; - /** - * Writes debug message to user log - * @param message debug message - */ - function debug(message) { - command_1.issueCommand('debug', {}, message); - } - exports.debug = debug; - /** - * Adds an error issue - * @param message error issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ - function error(message, properties = {}) { - command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); - } - exports.error = error; - /** - * Adds a warning issue - * @param message warning issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ - function warning(message, properties = {}) { - command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); - } - exports.warning = warning; - /** - * Adds a notice issue - * @param message notice issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ - function notice(message, properties = {}) { - command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); - } - exports.notice = notice; - /** - * Writes info to log with console.log. - * @param message info message - */ - function info(message) { - process.stdout.write(message + os.EOL); - } - exports.info = info; - /** - * Begin an output group. - * - * Output until the next `groupEnd` will be foldable in this group - * - * @param name The name of the output group - */ - function startGroup(name) { - command_1.issue('group', name); - } - exports.startGroup = startGroup; - /** - * End an output group. - */ - function endGroup() { - command_1.issue('endgroup'); - } - exports.endGroup = endGroup; - /** - * Wrap an asynchronous function call in a group. - * - * Returns the same type as the function itself. - * - * @param name The name of the group - * @param fn The function to wrap in the group - */ - function group(name, fn) { - return __awaiter(this, void 0, void 0, function* () { - startGroup(name); - let result; - try { - result = yield fn(); - } - finally { - endGroup(); - } - return result; - }); - } - exports.group = group; - //----------------------------------------------------------------------- - // Wrapper action state - //----------------------------------------------------------------------- - /** - * Saves state for current action, the state can only be retrieved by this action's post job execution. - * - * @param name name of the state to store - * @param value value to store. Non-string values will be converted to a string via JSON.stringify - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function saveState(name, value) { - const filePath = process.env['GITHUB_STATE'] || ''; - if (filePath) { - return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value)); - } - command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value)); - } - exports.saveState = saveState; - /** - * Gets the value of an state set by this action's main execution. - * - * @param name name of the state to get - * @returns string - */ - function getState(name) { - return process.env[`STATE_${name}`] || ''; - } - exports.getState = getState; - function getIDToken(aud) { - return __awaiter(this, void 0, void 0, function* () { - return yield oidc_utils_1.OidcClient.getIDToken(aud); - }); - } - exports.getIDToken = getIDToken; - /** - * Summary exports - */ - var summary_1 = __nccwpck_require__(1327); - Object.defineProperty(exports, "summary", ({ enumerable: true, get: function () { return summary_1.summary; } })); - /** - * @deprecated use core.summary - */ - var summary_2 = __nccwpck_require__(1327); - Object.defineProperty(exports, "markdownSummary", ({ enumerable: true, get: function () { return summary_2.markdownSummary; } })); - /** - * Path exports - */ - var path_utils_1 = __nccwpck_require__(2981); - Object.defineProperty(exports, "toPosixPath", ({ enumerable: true, get: function () { return path_utils_1.toPosixPath; } })); - Object.defineProperty(exports, "toWin32Path", ({ enumerable: true, get: function () { return path_utils_1.toWin32Path; } })); - Object.defineProperty(exports, "toPlatformPath", ({ enumerable: true, get: function () { return path_utils_1.toPlatformPath; } })); - //# sourceMappingURL=core.js.map - - /***/ -}), +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0; +const command_1 = __nccwpck_require__(7351); +const file_command_1 = __nccwpck_require__(717); +const utils_1 = __nccwpck_require__(5278); +const os = __importStar(__nccwpck_require__(2037)); +const path = __importStar(__nccwpck_require__(1017)); +const oidc_utils_1 = __nccwpck_require__(8041); +/** + * The code to exit an action + */ +var ExitCode; +(function (ExitCode) { + /** + * A code indicating that the action was successful + */ + ExitCode[ExitCode["Success"] = 0] = "Success"; + /** + * A code indicating that the action was a failure + */ + ExitCode[ExitCode["Failure"] = 1] = "Failure"; +})(ExitCode = exports.ExitCode || (exports.ExitCode = {})); +//----------------------------------------------------------------------- +// Variables +//----------------------------------------------------------------------- +/** + * Sets env variable for this action and future actions in the job + * @param name the name of the variable to set + * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function exportVariable(name, val) { + const convertedVal = utils_1.toCommandValue(val); + process.env[name] = convertedVal; + const filePath = process.env['GITHUB_ENV'] || ''; + if (filePath) { + return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val)); + } + command_1.issueCommand('set-env', { name }, convertedVal); +} +exports.exportVariable = exportVariable; +/** + * Registers a secret which will get masked from logs + * @param secret value of the secret + */ +function setSecret(secret) { + command_1.issueCommand('add-mask', {}, secret); +} +exports.setSecret = setSecret; +/** + * Prepends inputPath to the PATH (for this action and future actions) + * @param inputPath + */ +function addPath(inputPath) { + const filePath = process.env['GITHUB_PATH'] || ''; + if (filePath) { + file_command_1.issueFileCommand('PATH', inputPath); + } + else { + command_1.issueCommand('add-path', {}, inputPath); + } + process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; +} +exports.addPath = addPath; +/** + * Gets the value of an input. + * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed. + * Returns an empty string if the value is not defined. + * + * @param name name of the input to get + * @param options optional. See InputOptions. + * @returns string + */ +function getInput(name, options) { + const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; + if (options && options.required && !val) { + throw new Error(`Input required and not supplied: ${name}`); + } + if (options && options.trimWhitespace === false) { + return val; + } + return val.trim(); +} +exports.getInput = getInput; +/** + * Gets the values of an multiline input. Each value is also trimmed. + * + * @param name name of the input to get + * @param options optional. See InputOptions. + * @returns string[] + * + */ +function getMultilineInput(name, options) { + const inputs = getInput(name, options) + .split('\n') + .filter(x => x !== ''); + if (options && options.trimWhitespace === false) { + return inputs; + } + return inputs.map(input => input.trim()); +} +exports.getMultilineInput = getMultilineInput; +/** + * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. + * Support boolean input list: `true | True | TRUE | false | False | FALSE` . + * The return value is also in boolean type. + * ref: https://yaml.org/spec/1.2/spec.html#id2804923 + * + * @param name name of the input to get + * @param options optional. See InputOptions. + * @returns boolean + */ +function getBooleanInput(name, options) { + const trueValue = ['true', 'True', 'TRUE']; + const falseValue = ['false', 'False', 'FALSE']; + const val = getInput(name, options); + if (trueValue.includes(val)) + return true; + if (falseValue.includes(val)) + return false; + throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + + `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); +} +exports.getBooleanInput = getBooleanInput; +/** + * Sets the value of an output. + * + * @param name name of the output to set + * @param value value to store. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function setOutput(name, value) { + const filePath = process.env['GITHUB_OUTPUT'] || ''; + if (filePath) { + return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value)); + } + process.stdout.write(os.EOL); + command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value)); +} +exports.setOutput = setOutput; +/** + * Enables or disables the echoing of commands into stdout for the rest of the step. + * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. + * + */ +function setCommandEcho(enabled) { + command_1.issue('echo', enabled ? 'on' : 'off'); +} +exports.setCommandEcho = setCommandEcho; +//----------------------------------------------------------------------- +// Results +//----------------------------------------------------------------------- +/** + * Sets the action status to failed. + * When the action exits it will be with an exit code of 1 + * @param message add error issue message + */ +function setFailed(message) { + process.exitCode = ExitCode.Failure; + error(message); +} +exports.setFailed = setFailed; +//----------------------------------------------------------------------- +// Logging Commands +//----------------------------------------------------------------------- +/** + * Gets whether Actions Step Debug is on or not + */ +function isDebug() { + return process.env['RUNNER_DEBUG'] === '1'; +} +exports.isDebug = isDebug; +/** + * Writes debug message to user log + * @param message debug message + */ +function debug(message) { + command_1.issueCommand('debug', {}, message); +} +exports.debug = debug; +/** + * Adds an error issue + * @param message error issue message. Errors will be converted to string via toString() + * @param properties optional properties to add to the annotation. + */ +function error(message, properties = {}) { + command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); +} +exports.error = error; +/** + * Adds a warning issue + * @param message warning issue message. Errors will be converted to string via toString() + * @param properties optional properties to add to the annotation. + */ +function warning(message, properties = {}) { + command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); +} +exports.warning = warning; +/** + * Adds a notice issue + * @param message notice issue message. Errors will be converted to string via toString() + * @param properties optional properties to add to the annotation. + */ +function notice(message, properties = {}) { + command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); +} +exports.notice = notice; +/** + * Writes info to log with console.log. + * @param message info message + */ +function info(message) { + process.stdout.write(message + os.EOL); +} +exports.info = info; +/** + * Begin an output group. + * + * Output until the next `groupEnd` will be foldable in this group + * + * @param name The name of the output group + */ +function startGroup(name) { + command_1.issue('group', name); +} +exports.startGroup = startGroup; +/** + * End an output group. + */ +function endGroup() { + command_1.issue('endgroup'); +} +exports.endGroup = endGroup; +/** + * Wrap an asynchronous function call in a group. + * + * Returns the same type as the function itself. + * + * @param name The name of the group + * @param fn The function to wrap in the group + */ +function group(name, fn) { + return __awaiter(this, void 0, void 0, function* () { + startGroup(name); + let result; + try { + result = yield fn(); + } + finally { + endGroup(); + } + return result; + }); +} +exports.group = group; +//----------------------------------------------------------------------- +// Wrapper action state +//----------------------------------------------------------------------- +/** + * Saves state for current action, the state can only be retrieved by this action's post job execution. + * + * @param name name of the state to store + * @param value value to store. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function saveState(name, value) { + const filePath = process.env['GITHUB_STATE'] || ''; + if (filePath) { + return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value)); + } + command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value)); +} +exports.saveState = saveState; +/** + * Gets the value of an state set by this action's main execution. + * + * @param name name of the state to get + * @returns string + */ +function getState(name) { + return process.env[`STATE_${name}`] || ''; +} +exports.getState = getState; +function getIDToken(aud) { + return __awaiter(this, void 0, void 0, function* () { + return yield oidc_utils_1.OidcClient.getIDToken(aud); + }); +} +exports.getIDToken = getIDToken; +/** + * Summary exports + */ +var summary_1 = __nccwpck_require__(1327); +Object.defineProperty(exports, "summary", ({ enumerable: true, get: function () { return summary_1.summary; } })); +/** + * @deprecated use core.summary + */ +var summary_2 = __nccwpck_require__(1327); +Object.defineProperty(exports, "markdownSummary", ({ enumerable: true, get: function () { return summary_2.markdownSummary; } })); +/** + * Path exports + */ +var path_utils_1 = __nccwpck_require__(2981); +Object.defineProperty(exports, "toPosixPath", ({ enumerable: true, get: function () { return path_utils_1.toPosixPath; } })); +Object.defineProperty(exports, "toWin32Path", ({ enumerable: true, get: function () { return path_utils_1.toWin32Path; } })); +Object.defineProperty(exports, "toPlatformPath", ({ enumerable: true, get: function () { return path_utils_1.toPlatformPath; } })); +//# sourceMappingURL=core.js.map + +/***/ }), /***/ 717: -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) { - - "use strict"; - - // For internal use, subject to change. - var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } }); - }) : (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function (o, v) { - o["default"] = v; - }); - var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.prepareKeyValueMessage = exports.issueFileCommand = void 0; - // We use any as a valid input type - /* eslint-disable @typescript-eslint/no-explicit-any */ - const fs = __importStar(__nccwpck_require__(7147)); - const os = __importStar(__nccwpck_require__(2037)); - const uuid_1 = __nccwpck_require__(5840); - const utils_1 = __nccwpck_require__(5278); - function issueFileCommand(command, message) { - const filePath = process.env[`GITHUB_${command}`]; - if (!filePath) { - throw new Error(`Unable to find environment variable for file command ${command}`); - } - if (!fs.existsSync(filePath)) { - throw new Error(`Missing file at path: ${filePath}`); - } - fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, { - encoding: 'utf8' - }); - } - exports.issueFileCommand = issueFileCommand; - function prepareKeyValueMessage(key, value) { - const delimiter = `ghadelimiter_${uuid_1.v4()}`; - const convertedValue = utils_1.toCommandValue(value); - // These should realistically never happen, but just in case someone finds a - // way to exploit uuid generation let's not allow keys or values that contain - // the delimiter. - if (key.includes(delimiter)) { - throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`); - } - if (convertedValue.includes(delimiter)) { - throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); - } - return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; - } - exports.prepareKeyValueMessage = prepareKeyValueMessage; - //# sourceMappingURL=file-command.js.map +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// For internal use, subject to change. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.prepareKeyValueMessage = exports.issueFileCommand = void 0; +// We use any as a valid input type +/* eslint-disable @typescript-eslint/no-explicit-any */ +const fs = __importStar(__nccwpck_require__(7147)); +const os = __importStar(__nccwpck_require__(2037)); +const uuid_1 = __nccwpck_require__(5840); +const utils_1 = __nccwpck_require__(5278); +function issueFileCommand(command, message) { + const filePath = process.env[`GITHUB_${command}`]; + if (!filePath) { + throw new Error(`Unable to find environment variable for file command ${command}`); + } + if (!fs.existsSync(filePath)) { + throw new Error(`Missing file at path: ${filePath}`); + } + fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, { + encoding: 'utf8' + }); +} +exports.issueFileCommand = issueFileCommand; +function prepareKeyValueMessage(key, value) { + const delimiter = `ghadelimiter_${uuid_1.v4()}`; + const convertedValue = utils_1.toCommandValue(value); + // These should realistically never happen, but just in case someone finds a + // way to exploit uuid generation let's not allow keys or values that contain + // the delimiter. + if (key.includes(delimiter)) { + throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`); + } + if (convertedValue.includes(delimiter)) { + throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); + } + return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; +} +exports.prepareKeyValueMessage = prepareKeyValueMessage; +//# sourceMappingURL=file-command.js.map - /***/ -}), +/***/ }), /***/ 8041: -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) { - - "use strict"; - - var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.OidcClient = void 0; - const http_client_1 = __nccwpck_require__(6255); - const auth_1 = __nccwpck_require__(5526); - const core_1 = __nccwpck_require__(2186); - class OidcClient { - static createHttpClient(allowRetry = true, maxRetry = 10) { - const requestOptions = { - allowRetries: allowRetry, - maxRetries: maxRetry - }; - return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); - } - static getRequestToken() { - const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN']; - if (!token) { - throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable'); - } - return token; - } - static getIDTokenUrl() { - const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL']; - if (!runtimeUrl) { - throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable'); - } - return runtimeUrl; - } - static getCall(id_token_url) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const httpclient = OidcClient.createHttpClient(); - const res = yield httpclient - .getJson(id_token_url) - .catch(error => { - throw new Error(`Failed to get ID Token. \n +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.OidcClient = void 0; +const http_client_1 = __nccwpck_require__(6255); +const auth_1 = __nccwpck_require__(5526); +const core_1 = __nccwpck_require__(2186); +class OidcClient { + static createHttpClient(allowRetry = true, maxRetry = 10) { + const requestOptions = { + allowRetries: allowRetry, + maxRetries: maxRetry + }; + return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); + } + static getRequestToken() { + const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN']; + if (!token) { + throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable'); + } + return token; + } + static getIDTokenUrl() { + const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL']; + if (!runtimeUrl) { + throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable'); + } + return runtimeUrl; + } + static getCall(id_token_url) { + var _a; + return __awaiter(this, void 0, void 0, function* () { + const httpclient = OidcClient.createHttpClient(); + const res = yield httpclient + .getJson(id_token_url) + .catch(error => { + throw new Error(`Failed to get ID Token. \n Error Code : ${error.statusCode}\n Error Message: ${error.message}`); - }); - const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; - if (!id_token) { - throw new Error('Response json body do not have ID Token field'); - } - return id_token; - }); - } - static getIDToken(audience) { - return __awaiter(this, void 0, void 0, function* () { - try { - // New ID Token is requested from action service - let id_token_url = OidcClient.getIDTokenUrl(); - if (audience) { - const encodedAudience = encodeURIComponent(audience); - id_token_url = `${id_token_url}&audience=${encodedAudience}`; - } - core_1.debug(`ID token url is ${id_token_url}`); - const id_token = yield OidcClient.getCall(id_token_url); - core_1.setSecret(id_token); - return id_token; - } - catch (error) { - throw new Error(`Error message: ${error.message}`); - } - }); - } - } - exports.OidcClient = OidcClient; - //# sourceMappingURL=oidc-utils.js.map + }); + const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; + if (!id_token) { + throw new Error('Response json body do not have ID Token field'); + } + return id_token; + }); + } + static getIDToken(audience) { + return __awaiter(this, void 0, void 0, function* () { + try { + // New ID Token is requested from action service + let id_token_url = OidcClient.getIDTokenUrl(); + if (audience) { + const encodedAudience = encodeURIComponent(audience); + id_token_url = `${id_token_url}&audience=${encodedAudience}`; + } + core_1.debug(`ID token url is ${id_token_url}`); + const id_token = yield OidcClient.getCall(id_token_url); + core_1.setSecret(id_token); + return id_token; + } + catch (error) { + throw new Error(`Error message: ${error.message}`); + } + }); + } +} +exports.OidcClient = OidcClient; +//# sourceMappingURL=oidc-utils.js.map - /***/ -}), +/***/ }), /***/ 2981: -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) { - - "use strict"; - - var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } }); - }) : (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function (o, v) { - o["default"] = v; - }); - var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0; - const path = __importStar(__nccwpck_require__(1017)); - /** - * toPosixPath converts the given path to the posix form. On Windows, \\ will be - * replaced with /. - * - * @param pth. Path to transform. - * @return string Posix path. - */ - function toPosixPath(pth) { - return pth.replace(/[\\]/g, '/'); - } - exports.toPosixPath = toPosixPath; - /** - * toWin32Path converts the given path to the win32 form. On Linux, / will be - * replaced with \\. - * - * @param pth. Path to transform. - * @return string Win32 path. - */ - function toWin32Path(pth) { - return pth.replace(/[/]/g, '\\'); - } - exports.toWin32Path = toWin32Path; - /** - * toPlatformPath converts the given path to a platform-specific path. It does - * this by replacing instances of / and \ with the platform-specific path - * separator. - * - * @param pth The path to platformize. - * @return string The platform-specific path. - */ - function toPlatformPath(pth) { - return pth.replace(/[/\\]/g, path.sep); - } - exports.toPlatformPath = toPlatformPath; - //# sourceMappingURL=path-utils.js.map +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0; +const path = __importStar(__nccwpck_require__(1017)); +/** + * toPosixPath converts the given path to the posix form. On Windows, \\ will be + * replaced with /. + * + * @param pth. Path to transform. + * @return string Posix path. + */ +function toPosixPath(pth) { + return pth.replace(/[\\]/g, '/'); +} +exports.toPosixPath = toPosixPath; +/** + * toWin32Path converts the given path to the win32 form. On Linux, / will be + * replaced with \\. + * + * @param pth. Path to transform. + * @return string Win32 path. + */ +function toWin32Path(pth) { + return pth.replace(/[/]/g, '\\'); +} +exports.toWin32Path = toWin32Path; +/** + * toPlatformPath converts the given path to a platform-specific path. It does + * this by replacing instances of / and \ with the platform-specific path + * separator. + * + * @param pth The path to platformize. + * @return string The platform-specific path. + */ +function toPlatformPath(pth) { + return pth.replace(/[/\\]/g, path.sep); +} +exports.toPlatformPath = toPlatformPath; +//# sourceMappingURL=path-utils.js.map - /***/ -}), +/***/ }), /***/ 1327: -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) { - - "use strict"; - - var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0; - const os_1 = __nccwpck_require__(2037); - const fs_1 = __nccwpck_require__(7147); - const { access, appendFile, writeFile } = fs_1.promises; - exports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; - exports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary'; - class Summary { - constructor() { - this._buffer = ''; - } - /** - * Finds the summary file path from the environment, rejects if env var is not found or file does not exist - * Also checks r/w permissions. - * - * @returns step summary file path - */ - filePath() { - return __awaiter(this, void 0, void 0, function* () { - if (this._filePath) { - return this._filePath; - } - const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR]; - if (!pathFromEnv) { - throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); - } - try { - yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); - } - catch (_a) { - throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); - } - this._filePath = pathFromEnv; - return this._filePath; - }); - } - /** - * Wraps content in an HTML tag, adding any HTML attributes - * - * @param {string} tag HTML tag to wrap - * @param {string | null} content content within the tag - * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add - * - * @returns {string} content wrapped in HTML element - */ - wrap(tag, content, attrs = {}) { - const htmlAttrs = Object.entries(attrs) - .map(([key, value]) => ` ${key}="${value}"`) - .join(''); - if (!content) { - return `<${tag}${htmlAttrs}>`; - } - return `<${tag}${htmlAttrs}>${content}`; - } - /** - * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. - * - * @param {SummaryWriteOptions} [options] (optional) options for write operation - * - * @returns {Promise

    } summary instance - */ - write(options) { - return __awaiter(this, void 0, void 0, function* () { - const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); - const filePath = yield this.filePath(); - const writeFunc = overwrite ? writeFile : appendFile; - yield writeFunc(filePath, this._buffer, { encoding: 'utf8' }); - return this.emptyBuffer(); - }); - } - /** - * Clears the summary buffer and wipes the summary file - * - * @returns {Summary} summary instance - */ - clear() { - return __awaiter(this, void 0, void 0, function* () { - return this.emptyBuffer().write({ overwrite: true }); - }); - } - /** - * Returns the current summary buffer as a string - * - * @returns {string} string of summary buffer - */ - stringify() { - return this._buffer; - } - /** - * If the summary buffer is empty - * - * @returns {boolen} true if the buffer is empty - */ - isEmptyBuffer() { - return this._buffer.length === 0; - } - /** - * Resets the summary buffer without writing to summary file - * - * @returns {Summary} summary instance - */ - emptyBuffer() { - this._buffer = ''; - return this; - } - /** - * Adds raw text to the summary buffer - * - * @param {string} text content to add - * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) - * - * @returns {Summary} summary instance - */ - addRaw(text, addEOL = false) { - this._buffer += text; - return addEOL ? this.addEOL() : this; - } - /** - * Adds the operating system-specific end-of-line marker to the buffer - * - * @returns {Summary} summary instance - */ - addEOL() { - return this.addRaw(os_1.EOL); - } - /** - * Adds an HTML codeblock to the summary buffer - * - * @param {string} code content to render within fenced code block - * @param {string} lang (optional) language to syntax highlight code - * - * @returns {Summary} summary instance - */ - addCodeBlock(code, lang) { - const attrs = Object.assign({}, (lang && { lang })); - const element = this.wrap('pre', this.wrap('code', code), attrs); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML list to the summary buffer - * - * @param {string[]} items list of items to render - * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) - * - * @returns {Summary} summary instance - */ - addList(items, ordered = false) { - const tag = ordered ? 'ol' : 'ul'; - const listItems = items.map(item => this.wrap('li', item)).join(''); - const element = this.wrap(tag, listItems); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML table to the summary buffer - * - * @param {SummaryTableCell[]} rows table rows - * - * @returns {Summary} summary instance - */ - addTable(rows) { - const tableBody = rows - .map(row => { - const cells = row - .map(cell => { - if (typeof cell === 'string') { - return this.wrap('td', cell); - } - const { header, data, colspan, rowspan } = cell; - const tag = header ? 'th' : 'td'; - const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan })); - return this.wrap(tag, data, attrs); - }) - .join(''); - return this.wrap('tr', cells); - }) - .join(''); - const element = this.wrap('table', tableBody); - return this.addRaw(element).addEOL(); - } - /** - * Adds a collapsable HTML details element to the summary buffer - * - * @param {string} label text for the closed state - * @param {string} content collapsable content - * - * @returns {Summary} summary instance - */ - addDetails(label, content) { - const element = this.wrap('details', this.wrap('summary', label) + content); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML image tag to the summary buffer - * - * @param {string} src path to the image you to embed - * @param {string} alt text description of the image - * @param {SummaryImageOptions} options (optional) addition image attributes - * - * @returns {Summary} summary instance - */ - addImage(src, alt, options) { - const { width, height } = options || {}; - const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height })); - const element = this.wrap('img', null, Object.assign({ src, alt }, attrs)); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML section heading element - * - * @param {string} text heading text - * @param {number | string} [level=1] (optional) the heading level, default: 1 - * - * @returns {Summary} summary instance - */ - addHeading(text, level) { - const tag = `h${level}`; - const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag) - ? tag - : 'h1'; - const element = this.wrap(allowedTag, text); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML thematic break (
    ) to the summary buffer - * - * @returns {Summary} summary instance - */ - addSeparator() { - const element = this.wrap('hr', null); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML line break (
    ) to the summary buffer - * - * @returns {Summary} summary instance - */ - addBreak() { - const element = this.wrap('br', null); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML blockquote to the summary buffer - * - * @param {string} text quote text - * @param {string} cite (optional) citation url - * - * @returns {Summary} summary instance - */ - addQuote(text, cite) { - const attrs = Object.assign({}, (cite && { cite })); - const element = this.wrap('blockquote', text, attrs); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML anchor tag to the summary buffer - * - * @param {string} text link text/content - * @param {string} href hyperlink - * - * @returns {Summary} summary instance - */ - addLink(text, href) { - const element = this.wrap('a', text, { href }); - return this.addRaw(element).addEOL(); - } - } - const _summary = new Summary(); - /** - * @deprecated use `core.summary` - */ - exports.markdownSummary = _summary; - exports.summary = _summary; - //# sourceMappingURL=summary.js.map +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0; +const os_1 = __nccwpck_require__(2037); +const fs_1 = __nccwpck_require__(7147); +const { access, appendFile, writeFile } = fs_1.promises; +exports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; +exports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary'; +class Summary { + constructor() { + this._buffer = ''; + } + /** + * Finds the summary file path from the environment, rejects if env var is not found or file does not exist + * Also checks r/w permissions. + * + * @returns step summary file path + */ + filePath() { + return __awaiter(this, void 0, void 0, function* () { + if (this._filePath) { + return this._filePath; + } + const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR]; + if (!pathFromEnv) { + throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); + } + try { + yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); + } + catch (_a) { + throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); + } + this._filePath = pathFromEnv; + return this._filePath; + }); + } + /** + * Wraps content in an HTML tag, adding any HTML attributes + * + * @param {string} tag HTML tag to wrap + * @param {string | null} content content within the tag + * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add + * + * @returns {string} content wrapped in HTML element + */ + wrap(tag, content, attrs = {}) { + const htmlAttrs = Object.entries(attrs) + .map(([key, value]) => ` ${key}="${value}"`) + .join(''); + if (!content) { + return `<${tag}${htmlAttrs}>`; + } + return `<${tag}${htmlAttrs}>${content}`; + } + /** + * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. + * + * @param {SummaryWriteOptions} [options] (optional) options for write operation + * + * @returns {Promise} summary instance + */ + write(options) { + return __awaiter(this, void 0, void 0, function* () { + const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); + const filePath = yield this.filePath(); + const writeFunc = overwrite ? writeFile : appendFile; + yield writeFunc(filePath, this._buffer, { encoding: 'utf8' }); + return this.emptyBuffer(); + }); + } + /** + * Clears the summary buffer and wipes the summary file + * + * @returns {Summary} summary instance + */ + clear() { + return __awaiter(this, void 0, void 0, function* () { + return this.emptyBuffer().write({ overwrite: true }); + }); + } + /** + * Returns the current summary buffer as a string + * + * @returns {string} string of summary buffer + */ + stringify() { + return this._buffer; + } + /** + * If the summary buffer is empty + * + * @returns {boolen} true if the buffer is empty + */ + isEmptyBuffer() { + return this._buffer.length === 0; + } + /** + * Resets the summary buffer without writing to summary file + * + * @returns {Summary} summary instance + */ + emptyBuffer() { + this._buffer = ''; + return this; + } + /** + * Adds raw text to the summary buffer + * + * @param {string} text content to add + * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) + * + * @returns {Summary} summary instance + */ + addRaw(text, addEOL = false) { + this._buffer += text; + return addEOL ? this.addEOL() : this; + } + /** + * Adds the operating system-specific end-of-line marker to the buffer + * + * @returns {Summary} summary instance + */ + addEOL() { + return this.addRaw(os_1.EOL); + } + /** + * Adds an HTML codeblock to the summary buffer + * + * @param {string} code content to render within fenced code block + * @param {string} lang (optional) language to syntax highlight code + * + * @returns {Summary} summary instance + */ + addCodeBlock(code, lang) { + const attrs = Object.assign({}, (lang && { lang })); + const element = this.wrap('pre', this.wrap('code', code), attrs); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML list to the summary buffer + * + * @param {string[]} items list of items to render + * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) + * + * @returns {Summary} summary instance + */ + addList(items, ordered = false) { + const tag = ordered ? 'ol' : 'ul'; + const listItems = items.map(item => this.wrap('li', item)).join(''); + const element = this.wrap(tag, listItems); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML table to the summary buffer + * + * @param {SummaryTableCell[]} rows table rows + * + * @returns {Summary} summary instance + */ + addTable(rows) { + const tableBody = rows + .map(row => { + const cells = row + .map(cell => { + if (typeof cell === 'string') { + return this.wrap('td', cell); + } + const { header, data, colspan, rowspan } = cell; + const tag = header ? 'th' : 'td'; + const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan })); + return this.wrap(tag, data, attrs); + }) + .join(''); + return this.wrap('tr', cells); + }) + .join(''); + const element = this.wrap('table', tableBody); + return this.addRaw(element).addEOL(); + } + /** + * Adds a collapsable HTML details element to the summary buffer + * + * @param {string} label text for the closed state + * @param {string} content collapsable content + * + * @returns {Summary} summary instance + */ + addDetails(label, content) { + const element = this.wrap('details', this.wrap('summary', label) + content); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML image tag to the summary buffer + * + * @param {string} src path to the image you to embed + * @param {string} alt text description of the image + * @param {SummaryImageOptions} options (optional) addition image attributes + * + * @returns {Summary} summary instance + */ + addImage(src, alt, options) { + const { width, height } = options || {}; + const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height })); + const element = this.wrap('img', null, Object.assign({ src, alt }, attrs)); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML section heading element + * + * @param {string} text heading text + * @param {number | string} [level=1] (optional) the heading level, default: 1 + * + * @returns {Summary} summary instance + */ + addHeading(text, level) { + const tag = `h${level}`; + const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag) + ? tag + : 'h1'; + const element = this.wrap(allowedTag, text); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML thematic break (
    ) to the summary buffer + * + * @returns {Summary} summary instance + */ + addSeparator() { + const element = this.wrap('hr', null); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML line break (
    ) to the summary buffer + * + * @returns {Summary} summary instance + */ + addBreak() { + const element = this.wrap('br', null); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML blockquote to the summary buffer + * + * @param {string} text quote text + * @param {string} cite (optional) citation url + * + * @returns {Summary} summary instance + */ + addQuote(text, cite) { + const attrs = Object.assign({}, (cite && { cite })); + const element = this.wrap('blockquote', text, attrs); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML anchor tag to the summary buffer + * + * @param {string} text link text/content + * @param {string} href hyperlink + * + * @returns {Summary} summary instance + */ + addLink(text, href) { + const element = this.wrap('a', text, { href }); + return this.addRaw(element).addEOL(); + } +} +const _summary = new Summary(); +/** + * @deprecated use `core.summary` + */ +exports.markdownSummary = _summary; +exports.summary = _summary; +//# sourceMappingURL=summary.js.map - /***/ -}), +/***/ }), /***/ 5278: /***/ ((__unused_webpack_module, exports) => { - "use strict"; - - // We use any as a valid input type - /* eslint-disable @typescript-eslint/no-explicit-any */ - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.toCommandProperties = exports.toCommandValue = void 0; - /** - * Sanitizes an input into a string so it can be passed into issueCommand safely - * @param input input to sanitize into a string - */ - function toCommandValue(input) { - if (input === null || input === undefined) { - return ''; - } - else if (typeof input === 'string' || input instanceof String) { - return input; - } - return JSON.stringify(input); - } - exports.toCommandValue = toCommandValue; - /** - * - * @param annotationProperties - * @returns The command properties to send with the actual annotation command - * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646 - */ - function toCommandProperties(annotationProperties) { - if (!Object.keys(annotationProperties).length) { - return {}; - } - return { - title: annotationProperties.title, - file: annotationProperties.file, - line: annotationProperties.startLine, - endLine: annotationProperties.endLine, - col: annotationProperties.startColumn, - endColumn: annotationProperties.endColumn - }; - } - exports.toCommandProperties = toCommandProperties; - //# sourceMappingURL=utils.js.map +"use strict"; + +// We use any as a valid input type +/* eslint-disable @typescript-eslint/no-explicit-any */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.toCommandProperties = exports.toCommandValue = void 0; +/** + * Sanitizes an input into a string so it can be passed into issueCommand safely + * @param input input to sanitize into a string + */ +function toCommandValue(input) { + if (input === null || input === undefined) { + return ''; + } + else if (typeof input === 'string' || input instanceof String) { + return input; + } + return JSON.stringify(input); +} +exports.toCommandValue = toCommandValue; +/** + * + * @param annotationProperties + * @returns The command properties to send with the actual annotation command + * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646 + */ +function toCommandProperties(annotationProperties) { + if (!Object.keys(annotationProperties).length) { + return {}; + } + return { + title: annotationProperties.title, + file: annotationProperties.file, + line: annotationProperties.startLine, + endLine: annotationProperties.endLine, + col: annotationProperties.startColumn, + endColumn: annotationProperties.endColumn + }; +} +exports.toCommandProperties = toCommandProperties; +//# sourceMappingURL=utils.js.map - /***/ -}), +/***/ }), /***/ 5526: -/***/ (function (__unused_webpack_module, exports) { +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0; +class BasicCredentialHandler { + constructor(username, password) { + this.username = username; + this.password = password; + } + prepareRequest(options) { + if (!options.headers) { + throw Error('The request has no headers'); + } + options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error('not implemented'); + }); + } +} +exports.BasicCredentialHandler = BasicCredentialHandler; +class BearerCredentialHandler { + constructor(token) { + this.token = token; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!options.headers) { + throw Error('The request has no headers'); + } + options.headers['Authorization'] = `Bearer ${this.token}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error('not implemented'); + }); + } +} +exports.BearerCredentialHandler = BearerCredentialHandler; +class PersonalAccessTokenCredentialHandler { + constructor(token) { + this.token = token; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!options.headers) { + throw Error('The request has no headers'); + } + options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error('not implemented'); + }); + } +} +exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; +//# sourceMappingURL=auth.js.map - "use strict"; +/***/ }), - var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0; - class BasicCredentialHandler { - constructor(username, password) { - this.username = username; - this.password = password; - } - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); +/***/ 6255: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +/* eslint-disable @typescript-eslint/no-explicit-any */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; +const http = __importStar(__nccwpck_require__(3685)); +const https = __importStar(__nccwpck_require__(5687)); +const pm = __importStar(__nccwpck_require__(9835)); +const tunnel = __importStar(__nccwpck_require__(4294)); +const undici_1 = __nccwpck_require__(1773); +var HttpCodes; +(function (HttpCodes) { + HttpCodes[HttpCodes["OK"] = 200] = "OK"; + HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; + HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; + HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; + HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; + HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; + HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; + HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; + HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; + HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; + HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; + HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; + HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; + HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; + HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; + HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; + HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; + HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; + HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; + HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; + HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; + HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; + HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; + HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; + HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; + HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; + HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; +})(HttpCodes || (exports.HttpCodes = HttpCodes = {})); +var Headers; +(function (Headers) { + Headers["Accept"] = "accept"; + Headers["ContentType"] = "content-type"; +})(Headers || (exports.Headers = Headers = {})); +var MediaTypes; +(function (MediaTypes) { + MediaTypes["ApplicationJson"] = "application/json"; +})(MediaTypes || (exports.MediaTypes = MediaTypes = {})); +/** + * Returns the proxy URL, depending upon the supplied url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ +function getProxyUrl(serverUrl) { + const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); + return proxyUrl ? proxyUrl.href : ''; +} +exports.getProxyUrl = getProxyUrl; +const HttpRedirectCodes = [ + HttpCodes.MovedPermanently, + HttpCodes.ResourceMoved, + HttpCodes.SeeOther, + HttpCodes.TemporaryRedirect, + HttpCodes.PermanentRedirect +]; +const HttpResponseRetryCodes = [ + HttpCodes.BadGateway, + HttpCodes.ServiceUnavailable, + HttpCodes.GatewayTimeout +]; +const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; +const ExponentialBackoffCeiling = 10; +const ExponentialBackoffTimeSlice = 5; +class HttpClientError extends Error { + constructor(message, statusCode) { + super(message); + this.name = 'HttpClientError'; + this.statusCode = statusCode; + Object.setPrototypeOf(this, HttpClientError.prototype); + } +} +exports.HttpClientError = HttpClientError; +class HttpClientResponse { + constructor(message) { + this.message = message; + } + readBody() { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { + let output = Buffer.alloc(0); + this.message.on('data', (chunk) => { + output = Buffer.concat([output, chunk]); + }); + this.message.on('end', () => { + resolve(output.toString()); + }); + })); + }); + } + readBodyBuffer() { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { + const chunks = []; + this.message.on('data', (chunk) => { + chunks.push(chunk); + }); + this.message.on('end', () => { + resolve(Buffer.concat(chunks)); + }); + })); + }); + } +} +exports.HttpClientResponse = HttpClientResponse; +function isHttps(requestUrl) { + const parsedUrl = new URL(requestUrl); + return parsedUrl.protocol === 'https:'; +} +exports.isHttps = isHttps; +class HttpClient { + constructor(userAgent, handlers, requestOptions) { + this._ignoreSslError = false; + this._allowRedirects = true; + this._allowRedirectDowngrade = false; + this._maxRedirects = 50; + this._allowRetries = false; + this._maxRetries = 1; + this._keepAlive = false; + this._disposed = false; + this.userAgent = userAgent; + this.handlers = handlers || []; + this.requestOptions = requestOptions; + if (requestOptions) { + if (requestOptions.ignoreSslError != null) { + this._ignoreSslError = requestOptions.ignoreSslError; + } + this._socketTimeout = requestOptions.socketTimeout; + if (requestOptions.allowRedirects != null) { + this._allowRedirects = requestOptions.allowRedirects; + } + if (requestOptions.allowRedirectDowngrade != null) { + this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; + } + if (requestOptions.maxRedirects != null) { + this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); + } + if (requestOptions.keepAlive != null) { + this._keepAlive = requestOptions.keepAlive; + } + if (requestOptions.allowRetries != null) { + this._allowRetries = requestOptions.allowRetries; + } + if (requestOptions.maxRetries != null) { + this._maxRetries = requestOptions.maxRetries; + } + } + } + options(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); + }); + } + get(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('GET', requestUrl, null, additionalHeaders || {}); + }); + } + del(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('DELETE', requestUrl, null, additionalHeaders || {}); + }); + } + post(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('POST', requestUrl, data, additionalHeaders || {}); + }); + } + patch(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('PATCH', requestUrl, data, additionalHeaders || {}); + }); + } + put(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('PUT', requestUrl, data, additionalHeaders || {}); + }); + } + head(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('HEAD', requestUrl, null, additionalHeaders || {}); + }); + } + sendStream(verb, requestUrl, stream, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request(verb, requestUrl, stream, additionalHeaders); + }); + } + /** + * Gets a typed object from an endpoint + * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise + */ + getJson(requestUrl, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + const res = yield this.get(requestUrl, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + postJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.post(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + putJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.put(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + patchJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.patch(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + /** + * Makes a raw http request. + * All other methods such as get, post, patch, and request ultimately call this. + * Prefer get, del, post and patch + */ + request(verb, requestUrl, data, headers) { + return __awaiter(this, void 0, void 0, function* () { + if (this._disposed) { + throw new Error('Client has already been disposed.'); + } + const parsedUrl = new URL(requestUrl); + let info = this._prepareRequest(verb, parsedUrl, headers); + // Only perform retries on reads since writes may not be idempotent. + const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) + ? this._maxRetries + 1 + : 1; + let numTries = 0; + let response; + do { + response = yield this.requestRaw(info, data); + // Check if it's an authentication challenge + if (response && + response.message && + response.message.statusCode === HttpCodes.Unauthorized) { + let authenticationHandler; + for (const handler of this.handlers) { + if (handler.canHandleAuthentication(response)) { + authenticationHandler = handler; + break; } - options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); - } - } - exports.BasicCredentialHandler = BasicCredentialHandler; - class BearerCredentialHandler { - constructor(token) { - this.token = token; } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); - } - options.headers['Authorization'] = `Bearer ${this.token}`; + if (authenticationHandler) { + return authenticationHandler.handleAuthentication(this, info, data); } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; + else { + // We have received an unauthorized response but have no handlers to handle it. + // Let the response return to the caller. + return response; + } + } + let redirectsRemaining = this._maxRedirects; + while (response.message.statusCode && + HttpRedirectCodes.includes(response.message.statusCode) && + this._allowRedirects && + redirectsRemaining > 0) { + const redirectUrl = response.message.headers['location']; + if (!redirectUrl) { + // if there's no location to redirect to, we won't + break; + } + const parsedRedirectUrl = new URL(redirectUrl); + if (parsedUrl.protocol === 'https:' && + parsedUrl.protocol !== parsedRedirectUrl.protocol && + !this._allowRedirectDowngrade) { + throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); + } + // we need to finish reading the response before reassigning response + // which will leak the open socket. + yield response.readBody(); + // strip authorization header if redirected to a different hostname + if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { + for (const header in headers) { + // header names are case insensitive + if (header.toLowerCase() === 'authorization') { + delete headers[header]; + } + } + } + // let's make the request with the new redirectUrl + info = this._prepareRequest(verb, parsedRedirectUrl, headers); + response = yield this.requestRaw(info, data); + redirectsRemaining--; + } + if (!response.message.statusCode || + !HttpResponseRetryCodes.includes(response.message.statusCode)) { + // If not a retry code, return immediately instead of retrying + return response; + } + numTries += 1; + if (numTries < maxTries) { + yield response.readBody(); + yield this._performExponentialBackoff(numTries); + } + } while (numTries < maxTries); + return response; + }); + } + /** + * Needs to be called if keepAlive is set to true in request options. + */ + dispose() { + if (this._agent) { + this._agent.destroy(); + } + this._disposed = true; + } + /** + * Raw request. + * @param info + * @param data + */ + requestRaw(info, data) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + function callbackForResult(err, res) { + if (err) { + reject(err); } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); + else if (!res) { + // If `err` is not passed, then `res` must be passed. + reject(new Error('Unknown error')); } + else { + resolve(res); + } + } + this.requestRawWithCallback(info, data, callbackForResult); + }); + }); + } + /** + * Raw request with callback. + * @param info + * @param data + * @param onResult + */ + requestRawWithCallback(info, data, onResult) { + if (typeof data === 'string') { + if (!info.options.headers) { + info.options.headers = {}; + } + info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); + } + let callbackCalled = false; + function handleResult(err, res) { + if (!callbackCalled) { + callbackCalled = true; + onResult(err, res); + } + } + const req = info.httpModule.request(info.options, (msg) => { + const res = new HttpClientResponse(msg); + handleResult(undefined, res); + }); + let socket; + req.on('socket', sock => { + socket = sock; + }); + // If we ever get disconnected, we want the socket to timeout eventually + req.setTimeout(this._socketTimeout || 3 * 60000, () => { + if (socket) { + socket.end(); + } + handleResult(new Error(`Request timeout: ${info.options.path}`)); + }); + req.on('error', function (err) { + // err has statusCode property + // res should have headers + handleResult(err); + }); + if (data && typeof data === 'string') { + req.write(data, 'utf8'); + } + if (data && typeof data !== 'string') { + data.on('close', function () { + req.end(); + }); + data.pipe(req); + } + else { + req.end(); + } + } + /** + * Gets an http agent. This function is useful when you need an http agent that handles + * routing through a proxy server - depending upon the url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ + getAgent(serverUrl) { + const parsedUrl = new URL(serverUrl); + return this._getAgent(parsedUrl); + } + getAgentDispatcher(serverUrl) { + const parsedUrl = new URL(serverUrl); + const proxyUrl = pm.getProxyUrl(parsedUrl); + const useProxy = proxyUrl && proxyUrl.hostname; + if (!useProxy) { + return; + } + return this._getProxyAgentDispatcher(parsedUrl, proxyUrl); + } + _prepareRequest(method, requestUrl, headers) { + const info = {}; + info.parsedUrl = requestUrl; + const usingSsl = info.parsedUrl.protocol === 'https:'; + info.httpModule = usingSsl ? https : http; + const defaultPort = usingSsl ? 443 : 80; + info.options = {}; + info.options.host = info.parsedUrl.hostname; + info.options.port = info.parsedUrl.port + ? parseInt(info.parsedUrl.port) + : defaultPort; + info.options.path = + (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); + info.options.method = method; + info.options.headers = this._mergeHeaders(headers); + if (this.userAgent != null) { + info.options.headers['user-agent'] = this.userAgent; + } + info.options.agent = this._getAgent(info.parsedUrl); + // gives handlers an opportunity to participate + if (this.handlers) { + for (const handler of this.handlers) { + handler.prepareRequest(info.options); + } + } + return info; + } + _mergeHeaders(headers) { + if (this.requestOptions && this.requestOptions.headers) { + return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); + } + return lowercaseKeys(headers || {}); + } + _getExistingOrDefaultHeader(additionalHeaders, header, _default) { + let clientHeader; + if (this.requestOptions && this.requestOptions.headers) { + clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; + } + return additionalHeaders[header] || clientHeader || _default; + } + _getAgent(parsedUrl) { + let agent; + const proxyUrl = pm.getProxyUrl(parsedUrl); + const useProxy = proxyUrl && proxyUrl.hostname; + if (this._keepAlive && useProxy) { + agent = this._proxyAgent; + } + if (!useProxy) { + agent = this._agent; + } + // if agent is already assigned use that agent. + if (agent) { + return agent; + } + const usingSsl = parsedUrl.protocol === 'https:'; + let maxSockets = 100; + if (this.requestOptions) { + maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; + } + // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis. + if (proxyUrl && proxyUrl.hostname) { + const agentOptions = { + maxSockets, + keepAlive: this._keepAlive, + proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { + proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` + })), { host: proxyUrl.hostname, port: proxyUrl.port }) + }; + let tunnelAgent; + const overHttps = proxyUrl.protocol === 'https:'; + if (usingSsl) { + tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; + } + else { + tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; + } + agent = tunnelAgent(agentOptions); + this._proxyAgent = agent; + } + // if tunneling agent isn't assigned create a new agent + if (!agent) { + const options = { keepAlive: this._keepAlive, maxSockets }; + agent = usingSsl ? new https.Agent(options) : new http.Agent(options); + this._agent = agent; + } + if (usingSsl && this._ignoreSslError) { + // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process + // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options + // we have to cast it to any and change it directly + agent.options = Object.assign(agent.options || {}, { + rejectUnauthorized: false + }); + } + return agent; + } + _getProxyAgentDispatcher(parsedUrl, proxyUrl) { + let proxyAgent; + if (this._keepAlive) { + proxyAgent = this._proxyAgentDispatcher; + } + // if agent is already assigned use that agent. + if (proxyAgent) { + return proxyAgent; + } + const usingSsl = parsedUrl.protocol === 'https:'; + proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && { + token: `${proxyUrl.username}:${proxyUrl.password}` + }))); + this._proxyAgentDispatcher = proxyAgent; + if (usingSsl && this._ignoreSslError) { + // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process + // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options + // we have to cast it to any and change it directly + proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, { + rejectUnauthorized: false + }); + } + return proxyAgent; + } + _performExponentialBackoff(retryNumber) { + return __awaiter(this, void 0, void 0, function* () { + retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); + const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); + return new Promise(resolve => setTimeout(() => resolve(), ms)); + }); + } + _processResponse(res, options) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + const statusCode = res.message.statusCode || 0; + const response = { + statusCode, + result: null, + headers: {} + }; + // not found leads to null obj returned + if (statusCode === HttpCodes.NotFound) { + resolve(response); } - exports.BearerCredentialHandler = BearerCredentialHandler; - class PersonalAccessTokenCredentialHandler { - constructor(token) { - this.token = token; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); + // get the result from the body + function dateTimeDeserializer(key, value) { + if (typeof value === 'string') { + const a = new Date(value); + if (!isNaN(a.valueOf())) { + return a; } - options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); } + return value; } - exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; - //# sourceMappingURL=auth.js.map - - /***/ -}), - -/***/ 6255: -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) { - - "use strict"; - - /* eslint-disable @typescript-eslint/no-explicit-any */ - var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function () { return m[k]; } }; + let obj; + let contents; + try { + contents = yield res.readBody(); + if (contents && contents.length > 0) { + if (options && options.deserializeDates) { + obj = JSON.parse(contents, dateTimeDeserializer); + } + else { + obj = JSON.parse(contents); + } + response.result = obj; } - Object.defineProperty(o, k2, desc); - }) : (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function (o, v) { - o["default"] = v; - }); - var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; - const http = __importStar(__nccwpck_require__(3685)); - const https = __importStar(__nccwpck_require__(5687)); - const pm = __importStar(__nccwpck_require__(9835)); - const tunnel = __importStar(__nccwpck_require__(4294)); - const undici_1 = __nccwpck_require__(1773); - var HttpCodes; - (function (HttpCodes) { - HttpCodes[HttpCodes["OK"] = 200] = "OK"; - HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; - HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; - HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; - HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; - HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; - HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; - HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; - HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; - HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; - HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; - HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; - HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; - HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; - HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; - HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; - HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; - HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; - HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; - HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; - HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; - HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; - })(HttpCodes || (exports.HttpCodes = HttpCodes = {})); - var Headers; - (function (Headers) { - Headers["Accept"] = "accept"; - Headers["ContentType"] = "content-type"; - })(Headers || (exports.Headers = Headers = {})); - var MediaTypes; - (function (MediaTypes) { - MediaTypes["ApplicationJson"] = "application/json"; - })(MediaTypes || (exports.MediaTypes = MediaTypes = {})); - /** - * Returns the proxy URL, depending upon the supplied url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - function getProxyUrl(serverUrl) { - const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); - return proxyUrl ? proxyUrl.href : ''; + response.headers = res.message.headers; } - exports.getProxyUrl = getProxyUrl; - const HttpRedirectCodes = [ - HttpCodes.MovedPermanently, - HttpCodes.ResourceMoved, - HttpCodes.SeeOther, - HttpCodes.TemporaryRedirect, - HttpCodes.PermanentRedirect - ]; - const HttpResponseRetryCodes = [ - HttpCodes.BadGateway, - HttpCodes.ServiceUnavailable, - HttpCodes.GatewayTimeout - ]; - const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; - const ExponentialBackoffCeiling = 10; - const ExponentialBackoffTimeSlice = 5; - class HttpClientError extends Error { - constructor(message, statusCode) { - super(message); - this.name = 'HttpClientError'; - this.statusCode = statusCode; - Object.setPrototypeOf(this, HttpClientError.prototype); - } + catch (err) { + // Invalid resource (contents not json); leaving result obj null } - exports.HttpClientError = HttpClientError; - class HttpClientResponse { - constructor(message) { - this.message = message; + // note that 3xx redirects are handled by the http layer. + if (statusCode > 299) { + let msg; + // if exception/error in body, attempt to get better error + if (obj && obj.message) { + msg = obj.message; } - readBody() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - let output = Buffer.alloc(0); - this.message.on('data', (chunk) => { - output = Buffer.concat([output, chunk]); - }); - this.message.on('end', () => { - resolve(output.toString()); - }); - })); - }); + else if (contents && contents.length > 0) { + // it may be the case that the exception is in the body message as string + msg = contents; } - readBodyBuffer() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - const chunks = []; - this.message.on('data', (chunk) => { - chunks.push(chunk); - }); - this.message.on('end', () => { - resolve(Buffer.concat(chunks)); - }); - })); - }); + else { + msg = `Failed request: (${statusCode})`; } + const err = new HttpClientError(msg, statusCode); + err.result = response.result; + reject(err); } - exports.HttpClientResponse = HttpClientResponse; - function isHttps(requestUrl) { - const parsedUrl = new URL(requestUrl); - return parsedUrl.protocol === 'https:'; + else { + resolve(response); } - exports.isHttps = isHttps; - class HttpClient { - constructor(userAgent, handlers, requestOptions) { - this._ignoreSslError = false; - this._allowRedirects = true; - this._allowRedirectDowngrade = false; - this._maxRedirects = 50; - this._allowRetries = false; - this._maxRetries = 1; - this._keepAlive = false; - this._disposed = false; - this.userAgent = userAgent; - this.handlers = handlers || []; - this.requestOptions = requestOptions; - if (requestOptions) { - if (requestOptions.ignoreSslError != null) { - this._ignoreSslError = requestOptions.ignoreSslError; - } - this._socketTimeout = requestOptions.socketTimeout; - if (requestOptions.allowRedirects != null) { - this._allowRedirects = requestOptions.allowRedirects; - } - if (requestOptions.allowRedirectDowngrade != null) { - this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; - } - if (requestOptions.maxRedirects != null) { - this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); - } - if (requestOptions.keepAlive != null) { - this._keepAlive = requestOptions.keepAlive; - } - if (requestOptions.allowRetries != null) { - this._allowRetries = requestOptions.allowRetries; - } - if (requestOptions.maxRetries != null) { - this._maxRetries = requestOptions.maxRetries; + })); + }); + } +} +exports.HttpClient = HttpClient; +const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ 9835: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkBypass = exports.getProxyUrl = void 0; +function getProxyUrl(reqUrl) { + const usingSsl = reqUrl.protocol === 'https:'; + if (checkBypass(reqUrl)) { + return undefined; + } + const proxyVar = (() => { + if (usingSsl) { + return process.env['https_proxy'] || process.env['HTTPS_PROXY']; + } + else { + return process.env['http_proxy'] || process.env['HTTP_PROXY']; + } + })(); + if (proxyVar) { + try { + return new URL(proxyVar); + } + catch (_a) { + if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://')) + return new URL(`http://${proxyVar}`); + } + } + else { + return undefined; + } +} +exports.getProxyUrl = getProxyUrl; +function checkBypass(reqUrl) { + if (!reqUrl.hostname) { + return false; + } + const reqHost = reqUrl.hostname; + if (isLoopbackAddress(reqHost)) { + return true; + } + const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; + if (!noProxy) { + return false; + } + // Determine the request port + let reqPort; + if (reqUrl.port) { + reqPort = Number(reqUrl.port); + } + else if (reqUrl.protocol === 'http:') { + reqPort = 80; + } + else if (reqUrl.protocol === 'https:') { + reqPort = 443; + } + // Format the request hostname and hostname with port + const upperReqHosts = [reqUrl.hostname.toUpperCase()]; + if (typeof reqPort === 'number') { + upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); + } + // Compare request host against noproxy + for (const upperNoProxyItem of noProxy + .split(',') + .map(x => x.trim().toUpperCase()) + .filter(x => x)) { + if (upperNoProxyItem === '*' || + upperReqHosts.some(x => x === upperNoProxyItem || + x.endsWith(`.${upperNoProxyItem}`) || + (upperNoProxyItem.startsWith('.') && + x.endsWith(`${upperNoProxyItem}`)))) { + return true; + } + } + return false; +} +exports.checkBypass = checkBypass; +function isLoopbackAddress(host) { + const hostLower = host.toLowerCase(); + return (hostLower === 'localhost' || + hostLower.startsWith('127.') || + hostLower.startsWith('[::1]') || + hostLower.startsWith('[0:0:0:0:0:0:0:1]')); +} +//# sourceMappingURL=proxy.js.map + +/***/ }), + +/***/ 1962: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var _a; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getCmdPath = exports.tryGetExecutablePath = exports.isRooted = exports.isDirectory = exports.exists = exports.READONLY = exports.UV_FS_O_EXLOCK = exports.IS_WINDOWS = exports.unlink = exports.symlink = exports.stat = exports.rmdir = exports.rm = exports.rename = exports.readlink = exports.readdir = exports.open = exports.mkdir = exports.lstat = exports.copyFile = exports.chmod = void 0; +const fs = __importStar(__nccwpck_require__(7147)); +const path = __importStar(__nccwpck_require__(1017)); +_a = fs.promises +// export const {open} = 'fs' +, exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.open = _a.open, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rm = _a.rm, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink; +// export const {open} = 'fs' +exports.IS_WINDOWS = process.platform === 'win32'; +// See https://github.com/nodejs/node/blob/d0153aee367422d0858105abec186da4dff0a0c5/deps/uv/include/uv/win.h#L691 +exports.UV_FS_O_EXLOCK = 0x10000000; +exports.READONLY = fs.constants.O_RDONLY; +function exists(fsPath) { + return __awaiter(this, void 0, void 0, function* () { + try { + yield exports.stat(fsPath); + } + catch (err) { + if (err.code === 'ENOENT') { + return false; + } + throw err; + } + return true; + }); +} +exports.exists = exists; +function isDirectory(fsPath, useStat = false) { + return __awaiter(this, void 0, void 0, function* () { + const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath); + return stats.isDirectory(); + }); +} +exports.isDirectory = isDirectory; +/** + * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like: + * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases). + */ +function isRooted(p) { + p = normalizeSeparators(p); + if (!p) { + throw new Error('isRooted() parameter "p" cannot be empty'); + } + if (exports.IS_WINDOWS) { + return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello + ); // e.g. C: or C:\hello + } + return p.startsWith('/'); +} +exports.isRooted = isRooted; +/** + * Best effort attempt to determine whether a file exists and is executable. + * @param filePath file path to check + * @param extensions additional file extensions to try + * @return if file exists and is executable, returns the file path. otherwise empty string. + */ +function tryGetExecutablePath(filePath, extensions) { + return __awaiter(this, void 0, void 0, function* () { + let stats = undefined; + try { + // test file exists + stats = yield exports.stat(filePath); + } + catch (err) { + if (err.code !== 'ENOENT') { + // eslint-disable-next-line no-console + console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); + } + } + if (stats && stats.isFile()) { + if (exports.IS_WINDOWS) { + // on Windows, test for valid extension + const upperExt = path.extname(filePath).toUpperCase(); + if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) { + return filePath; + } + } + else { + if (isUnixExecutable(stats)) { + return filePath; + } + } + } + // try each extension + const originalFilePath = filePath; + for (const extension of extensions) { + filePath = originalFilePath + extension; + stats = undefined; + try { + stats = yield exports.stat(filePath); + } + catch (err) { + if (err.code !== 'ENOENT') { + // eslint-disable-next-line no-console + console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); + } + } + if (stats && stats.isFile()) { + if (exports.IS_WINDOWS) { + // preserve the case of the actual file (since an extension was appended) + try { + const directory = path.dirname(filePath); + const upperName = path.basename(filePath).toUpperCase(); + for (const actualName of yield exports.readdir(directory)) { + if (upperName === actualName.toUpperCase()) { + filePath = path.join(directory, actualName); + break; } } } - options(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); - }); - } - get(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('GET', requestUrl, null, additionalHeaders || {}); - }); - } - del(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('DELETE', requestUrl, null, additionalHeaders || {}); - }); + catch (err) { + // eslint-disable-next-line no-console + console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); } - post(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('POST', requestUrl, data, additionalHeaders || {}); - }); + return filePath; + } + else { + if (isUnixExecutable(stats)) { + return filePath; } - patch(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PATCH', requestUrl, data, additionalHeaders || {}); - }); - } - put(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PUT', requestUrl, data, additionalHeaders || {}); - }); - } - head(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('HEAD', requestUrl, null, additionalHeaders || {}); - }); - } - sendStream(verb, requestUrl, stream, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request(verb, requestUrl, stream, additionalHeaders); - }); - } - /** - * Gets a typed object from an endpoint - * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise - */ - getJson(requestUrl, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - const res = yield this.get(requestUrl, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - postJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.post(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - putJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.put(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - patchJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.patch(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - /** - * Makes a raw http request. - * All other methods such as get, post, patch, and request ultimately call this. - * Prefer get, del, post and patch - */ - request(verb, requestUrl, data, headers) { - return __awaiter(this, void 0, void 0, function* () { - if (this._disposed) { - throw new Error('Client has already been disposed.'); - } - const parsedUrl = new URL(requestUrl); - let info = this._prepareRequest(verb, parsedUrl, headers); - // Only perform retries on reads since writes may not be idempotent. - const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) - ? this._maxRetries + 1 - : 1; - let numTries = 0; - let response; - do { - response = yield this.requestRaw(info, data); - // Check if it's an authentication challenge - if (response && - response.message && - response.message.statusCode === HttpCodes.Unauthorized) { - let authenticationHandler; - for (const handler of this.handlers) { - if (handler.canHandleAuthentication(response)) { - authenticationHandler = handler; - break; - } - } - if (authenticationHandler) { - return authenticationHandler.handleAuthentication(this, info, data); - } - else { - // We have received an unauthorized response but have no handlers to handle it. - // Let the response return to the caller. - return response; - } - } - let redirectsRemaining = this._maxRedirects; - while (response.message.statusCode && - HttpRedirectCodes.includes(response.message.statusCode) && - this._allowRedirects && - redirectsRemaining > 0) { - const redirectUrl = response.message.headers['location']; - if (!redirectUrl) { - // if there's no location to redirect to, we won't - break; - } - const parsedRedirectUrl = new URL(redirectUrl); - if (parsedUrl.protocol === 'https:' && - parsedUrl.protocol !== parsedRedirectUrl.protocol && - !this._allowRedirectDowngrade) { - throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); - } - // we need to finish reading the response before reassigning response - // which will leak the open socket. - yield response.readBody(); - // strip authorization header if redirected to a different hostname - if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { - for (const header in headers) { - // header names are case insensitive - if (header.toLowerCase() === 'authorization') { - delete headers[header]; - } - } - } - // let's make the request with the new redirectUrl - info = this._prepareRequest(verb, parsedRedirectUrl, headers); - response = yield this.requestRaw(info, data); - redirectsRemaining--; - } - if (!response.message.statusCode || - !HttpResponseRetryCodes.includes(response.message.statusCode)) { - // If not a retry code, return immediately instead of retrying - return response; - } - numTries += 1; - if (numTries < maxTries) { - yield response.readBody(); - yield this._performExponentialBackoff(numTries); - } - } while (numTries < maxTries); - return response; - }); - } - /** - * Needs to be called if keepAlive is set to true in request options. - */ - dispose() { - if (this._agent) { - this._agent.destroy(); - } - this._disposed = true; - } - /** - * Raw request. - * @param info - * @param data - */ - requestRaw(info, data) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => { - function callbackForResult(err, res) { - if (err) { - reject(err); - } - else if (!res) { - // If `err` is not passed, then `res` must be passed. - reject(new Error('Unknown error')); - } - else { - resolve(res); - } - } - this.requestRawWithCallback(info, data, callbackForResult); - }); - }); - } - /** - * Raw request with callback. - * @param info - * @param data - * @param onResult - */ - requestRawWithCallback(info, data, onResult) { - if (typeof data === 'string') { - if (!info.options.headers) { - info.options.headers = {}; - } - info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); - } - let callbackCalled = false; - function handleResult(err, res) { - if (!callbackCalled) { - callbackCalled = true; - onResult(err, res); - } - } - const req = info.httpModule.request(info.options, (msg) => { - const res = new HttpClientResponse(msg); - handleResult(undefined, res); - }); - let socket; - req.on('socket', sock => { - socket = sock; - }); - // If we ever get disconnected, we want the socket to timeout eventually - req.setTimeout(this._socketTimeout || 3 * 60000, () => { - if (socket) { - socket.end(); - } - handleResult(new Error(`Request timeout: ${info.options.path}`)); - }); - req.on('error', function (err) { - // err has statusCode property - // res should have headers - handleResult(err); - }); - if (data && typeof data === 'string') { - req.write(data, 'utf8'); - } - if (data && typeof data !== 'string') { - data.on('close', function () { - req.end(); - }); - data.pipe(req); - } - else { - req.end(); - } - } - /** - * Gets an http agent. This function is useful when you need an http agent that handles - * routing through a proxy server - depending upon the url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - getAgent(serverUrl) { - const parsedUrl = new URL(serverUrl); - return this._getAgent(parsedUrl); - } - getAgentDispatcher(serverUrl) { - const parsedUrl = new URL(serverUrl); - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (!useProxy) { - return; - } - return this._getProxyAgentDispatcher(parsedUrl, proxyUrl); - } - _prepareRequest(method, requestUrl, headers) { - const info = {}; - info.parsedUrl = requestUrl; - const usingSsl = info.parsedUrl.protocol === 'https:'; - info.httpModule = usingSsl ? https : http; - const defaultPort = usingSsl ? 443 : 80; - info.options = {}; - info.options.host = info.parsedUrl.hostname; - info.options.port = info.parsedUrl.port - ? parseInt(info.parsedUrl.port) - : defaultPort; - info.options.path = - (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); - info.options.method = method; - info.options.headers = this._mergeHeaders(headers); - if (this.userAgent != null) { - info.options.headers['user-agent'] = this.userAgent; - } - info.options.agent = this._getAgent(info.parsedUrl); - // gives handlers an opportunity to participate - if (this.handlers) { - for (const handler of this.handlers) { - handler.prepareRequest(info.options); - } - } - return info; - } - _mergeHeaders(headers) { - if (this.requestOptions && this.requestOptions.headers) { - return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); - } - return lowercaseKeys(headers || {}); - } - _getExistingOrDefaultHeader(additionalHeaders, header, _default) { - let clientHeader; - if (this.requestOptions && this.requestOptions.headers) { - clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; - } - return additionalHeaders[header] || clientHeader || _default; - } - _getAgent(parsedUrl) { - let agent; - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (this._keepAlive && useProxy) { - agent = this._proxyAgent; - } - if (!useProxy) { - agent = this._agent; - } - // if agent is already assigned use that agent. - if (agent) { - return agent; - } - const usingSsl = parsedUrl.protocol === 'https:'; - let maxSockets = 100; - if (this.requestOptions) { - maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; - } - // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis. - if (proxyUrl && proxyUrl.hostname) { - const agentOptions = { - maxSockets, - keepAlive: this._keepAlive, - proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { - proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` - })), { host: proxyUrl.hostname, port: proxyUrl.port }) - }; - let tunnelAgent; - const overHttps = proxyUrl.protocol === 'https:'; - if (usingSsl) { - tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; - } - else { - tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; - } - agent = tunnelAgent(agentOptions); - this._proxyAgent = agent; - } - // if tunneling agent isn't assigned create a new agent - if (!agent) { - const options = { keepAlive: this._keepAlive, maxSockets }; - agent = usingSsl ? new https.Agent(options) : new http.Agent(options); - this._agent = agent; - } - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - agent.options = Object.assign(agent.options || {}, { - rejectUnauthorized: false - }); - } - return agent; - } - _getProxyAgentDispatcher(parsedUrl, proxyUrl) { - let proxyAgent; - if (this._keepAlive) { - proxyAgent = this._proxyAgentDispatcher; - } - // if agent is already assigned use that agent. - if (proxyAgent) { - return proxyAgent; - } - const usingSsl = parsedUrl.protocol === 'https:'; - proxyAgent = new undici_1.ProxyAgent(Object.assign({ uri: proxyUrl.href, pipelining: !this._keepAlive ? 0 : 1 }, ((proxyUrl.username || proxyUrl.password) && { - token: `${proxyUrl.username}:${proxyUrl.password}` - }))); - this._proxyAgentDispatcher = proxyAgent; - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - proxyAgent.options = Object.assign(proxyAgent.options.requestTls || {}, { - rejectUnauthorized: false - }); - } - return proxyAgent; - } - _performExponentialBackoff(retryNumber) { - return __awaiter(this, void 0, void 0, function* () { - retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); - const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); - return new Promise(resolve => setTimeout(() => resolve(), ms)); - }); - } - _processResponse(res, options) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - const statusCode = res.message.statusCode || 0; - const response = { - statusCode, - result: null, - headers: {} - }; - // not found leads to null obj returned - if (statusCode === HttpCodes.NotFound) { - resolve(response); - } - // get the result from the body - function dateTimeDeserializer(key, value) { - if (typeof value === 'string') { - const a = new Date(value); - if (!isNaN(a.valueOf())) { - return a; - } - } - return value; - } - let obj; - let contents; - try { - contents = yield res.readBody(); - if (contents && contents.length > 0) { - if (options && options.deserializeDates) { - obj = JSON.parse(contents, dateTimeDeserializer); - } - else { - obj = JSON.parse(contents); - } - response.result = obj; - } - response.headers = res.message.headers; - } - catch (err) { - // Invalid resource (contents not json); leaving result obj null - } - // note that 3xx redirects are handled by the http layer. - if (statusCode > 299) { - let msg; - // if exception/error in body, attempt to get better error - if (obj && obj.message) { - msg = obj.message; - } - else if (contents && contents.length > 0) { - // it may be the case that the exception is in the body message as string - msg = contents; - } - else { - msg = `Failed request: (${statusCode})`; - } - const err = new HttpClientError(msg, statusCode); - err.result = response.result; - reject(err); - } - else { - resolve(response); - } - })); - }); - } - } - exports.HttpClient = HttpClient; - const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); - //# sourceMappingURL=index.js.map - - /***/ -}), - -/***/ 9835: -/***/ ((__unused_webpack_module, exports) => { - - "use strict"; - - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.checkBypass = exports.getProxyUrl = void 0; - function getProxyUrl(reqUrl) { - const usingSsl = reqUrl.protocol === 'https:'; - if (checkBypass(reqUrl)) { - return undefined; - } - const proxyVar = (() => { - if (usingSsl) { - return process.env['https_proxy'] || process.env['HTTPS_PROXY']; - } - else { - return process.env['http_proxy'] || process.env['HTTP_PROXY']; - } - })(); - if (proxyVar) { - try { - return new URL(proxyVar); - } - catch (_a) { - if (!proxyVar.startsWith('http://') && !proxyVar.startsWith('https://')) - return new URL(`http://${proxyVar}`); - } - } - else { - return undefined; - } - } - exports.getProxyUrl = getProxyUrl; - function checkBypass(reqUrl) { - if (!reqUrl.hostname) { - return false; - } - const reqHost = reqUrl.hostname; - if (isLoopbackAddress(reqHost)) { - return true; - } - const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; - if (!noProxy) { - return false; - } - // Determine the request port - let reqPort; - if (reqUrl.port) { - reqPort = Number(reqUrl.port); - } - else if (reqUrl.protocol === 'http:') { - reqPort = 80; - } - else if (reqUrl.protocol === 'https:') { - reqPort = 443; - } - // Format the request hostname and hostname with port - const upperReqHosts = [reqUrl.hostname.toUpperCase()]; - if (typeof reqPort === 'number') { - upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); - } - // Compare request host against noproxy - for (const upperNoProxyItem of noProxy - .split(',') - .map(x => x.trim().toUpperCase()) - .filter(x => x)) { - if (upperNoProxyItem === '*' || - upperReqHosts.some(x => x === upperNoProxyItem || - x.endsWith(`.${upperNoProxyItem}`) || - (upperNoProxyItem.startsWith('.') && - x.endsWith(`${upperNoProxyItem}`)))) { - return true; - } - } - return false; - } - exports.checkBypass = checkBypass; - function isLoopbackAddress(host) { - const hostLower = host.toLowerCase(); - return (hostLower === 'localhost' || - hostLower.startsWith('127.') || - hostLower.startsWith('[::1]') || - hostLower.startsWith('[0:0:0:0:0:0:0:1]')); - } - //# sourceMappingURL=proxy.js.map - - /***/ -}), - -/***/ 1962: -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) { - - "use strict"; - - var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } }); - }) : (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function (o, v) { - o["default"] = v; - }); - var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - var _a; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.getCmdPath = exports.tryGetExecutablePath = exports.isRooted = exports.isDirectory = exports.exists = exports.READONLY = exports.UV_FS_O_EXLOCK = exports.IS_WINDOWS = exports.unlink = exports.symlink = exports.stat = exports.rmdir = exports.rm = exports.rename = exports.readlink = exports.readdir = exports.open = exports.mkdir = exports.lstat = exports.copyFile = exports.chmod = void 0; - const fs = __importStar(__nccwpck_require__(7147)); - const path = __importStar(__nccwpck_require__(1017)); - _a = fs.promises - // export const {open} = 'fs' - , exports.chmod = _a.chmod, exports.copyFile = _a.copyFile, exports.lstat = _a.lstat, exports.mkdir = _a.mkdir, exports.open = _a.open, exports.readdir = _a.readdir, exports.readlink = _a.readlink, exports.rename = _a.rename, exports.rm = _a.rm, exports.rmdir = _a.rmdir, exports.stat = _a.stat, exports.symlink = _a.symlink, exports.unlink = _a.unlink; - // export const {open} = 'fs' - exports.IS_WINDOWS = process.platform === 'win32'; - // See https://github.com/nodejs/node/blob/d0153aee367422d0858105abec186da4dff0a0c5/deps/uv/include/uv/win.h#L691 - exports.UV_FS_O_EXLOCK = 0x10000000; - exports.READONLY = fs.constants.O_RDONLY; - function exists(fsPath) { - return __awaiter(this, void 0, void 0, function* () { - try { - yield exports.stat(fsPath); - } - catch (err) { - if (err.code === 'ENOENT') { - return false; - } - throw err; - } - return true; - }); - } - exports.exists = exists; - function isDirectory(fsPath, useStat = false) { - return __awaiter(this, void 0, void 0, function* () { - const stats = useStat ? yield exports.stat(fsPath) : yield exports.lstat(fsPath); - return stats.isDirectory(); - }); - } - exports.isDirectory = isDirectory; - /** - * On OSX/Linux, true if path starts with '/'. On Windows, true for paths like: - * \, \hello, \\hello\share, C:, and C:\hello (and corresponding alternate separator cases). - */ - function isRooted(p) { - p = normalizeSeparators(p); - if (!p) { - throw new Error('isRooted() parameter "p" cannot be empty'); - } - if (exports.IS_WINDOWS) { - return (p.startsWith('\\') || /^[A-Z]:/i.test(p) // e.g. \ or \hello or \\hello - ); // e.g. C: or C:\hello - } - return p.startsWith('/'); - } - exports.isRooted = isRooted; - /** - * Best effort attempt to determine whether a file exists and is executable. - * @param filePath file path to check - * @param extensions additional file extensions to try - * @return if file exists and is executable, returns the file path. otherwise empty string. - */ - function tryGetExecutablePath(filePath, extensions) { - return __awaiter(this, void 0, void 0, function* () { - let stats = undefined; - try { - // test file exists - stats = yield exports.stat(filePath); - } - catch (err) { - if (err.code !== 'ENOENT') { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports.IS_WINDOWS) { - // on Windows, test for valid extension - const upperExt = path.extname(filePath).toUpperCase(); - if (extensions.some(validExt => validExt.toUpperCase() === upperExt)) { - return filePath; - } - } - else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - // try each extension - const originalFilePath = filePath; - for (const extension of extensions) { - filePath = originalFilePath + extension; - stats = undefined; - try { - stats = yield exports.stat(filePath); - } - catch (err) { - if (err.code !== 'ENOENT') { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine if executable file exists '${filePath}': ${err}`); - } - } - if (stats && stats.isFile()) { - if (exports.IS_WINDOWS) { - // preserve the case of the actual file (since an extension was appended) - try { - const directory = path.dirname(filePath); - const upperName = path.basename(filePath).toUpperCase(); - for (const actualName of yield exports.readdir(directory)) { - if (upperName === actualName.toUpperCase()) { - filePath = path.join(directory, actualName); - break; - } - } - } - catch (err) { - // eslint-disable-next-line no-console - console.log(`Unexpected error attempting to determine the actual case of the file '${filePath}': ${err}`); - } - return filePath; - } - else { - if (isUnixExecutable(stats)) { - return filePath; - } - } - } - } - return ''; - }); } - exports.tryGetExecutablePath = tryGetExecutablePath; - function normalizeSeparators(p) { - p = p || ''; - if (exports.IS_WINDOWS) { - // convert slashes on Windows - p = p.replace(/\//g, '\\'); - // remove redundant slashes - return p.replace(/\\\\+/g, '\\'); - } - // remove redundant slashes - return p.replace(/\/\/+/g, '/'); - } - // on Mac/Linux, test the execute bit - // R W X R W X R W X - // 256 128 64 32 16 8 4 2 1 - function isUnixExecutable(stats) { - return ((stats.mode & 1) > 0 || - ((stats.mode & 8) > 0 && stats.gid === process.getgid()) || - ((stats.mode & 64) > 0 && stats.uid === process.getuid())); - } - // Get the path of cmd.exe in windows - function getCmdPath() { - var _a; - return (_a = process.env['COMSPEC']) !== null && _a !== void 0 ? _a : `cmd.exe`; - } - exports.getCmdPath = getCmdPath; - //# sourceMappingURL=io-util.js.map + } + } + return ''; + }); +} +exports.tryGetExecutablePath = tryGetExecutablePath; +function normalizeSeparators(p) { + p = p || ''; + if (exports.IS_WINDOWS) { + // convert slashes on Windows + p = p.replace(/\//g, '\\'); + // remove redundant slashes + return p.replace(/\\\\+/g, '\\'); + } + // remove redundant slashes + return p.replace(/\/\/+/g, '/'); +} +// on Mac/Linux, test the execute bit +// R W X R W X R W X +// 256 128 64 32 16 8 4 2 1 +function isUnixExecutable(stats) { + return ((stats.mode & 1) > 0 || + ((stats.mode & 8) > 0 && stats.gid === process.getgid()) || + ((stats.mode & 64) > 0 && stats.uid === process.getuid())); +} +// Get the path of cmd.exe in windows +function getCmdPath() { + var _a; + return (_a = process.env['COMSPEC']) !== null && _a !== void 0 ? _a : `cmd.exe`; +} +exports.getCmdPath = getCmdPath; +//# sourceMappingURL=io-util.js.map - /***/ -}), +/***/ }), /***/ 7436: -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) { - - "use strict"; - - var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } }); - }) : (function (o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; - })); - var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - }) : function (o, v) { - o["default"] = v; - }); - var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; - }; - var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.findInPath = exports.which = exports.mkdirP = exports.rmRF = exports.mv = exports.cp = void 0; - const assert_1 = __nccwpck_require__(9491); - const path = __importStar(__nccwpck_require__(1017)); - const ioUtil = __importStar(__nccwpck_require__(1962)); - /** - * Copies a file or folder. - * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js - * - * @param source source path - * @param dest destination path - * @param options optional. See CopyOptions. - */ - function cp(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { - const { force, recursive, copySourceDirectory } = readCopyOptions(options); - const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null; - // Dest is an existing file, but not forcing - if (destStat && destStat.isFile() && !force) { - return; - } - // If dest is an existing directory, should copy inside. - const newDest = destStat && destStat.isDirectory() && copySourceDirectory - ? path.join(dest, path.basename(source)) - : dest; - if (!(yield ioUtil.exists(source))) { - throw new Error(`no such file or directory: ${source}`); - } - const sourceStat = yield ioUtil.stat(source); - if (sourceStat.isDirectory()) { - if (!recursive) { - throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`); - } - else { - yield cpDirRecursive(source, newDest, 0, force); - } - } - else { - if (path.relative(source, newDest) === '') { - // a file cannot be copied to itself - throw new Error(`'${newDest}' and '${source}' are the same file`); - } - yield copyFile(source, newDest, force); - } - }); - } - exports.cp = cp; - /** - * Moves a path. - * - * @param source source path - * @param dest destination path - * @param options optional. See MoveOptions. - */ - function mv(source, dest, options = {}) { - return __awaiter(this, void 0, void 0, function* () { - if (yield ioUtil.exists(dest)) { - let destExists = true; - if (yield ioUtil.isDirectory(dest)) { - // If dest is directory copy src into dest - dest = path.join(dest, path.basename(source)); - destExists = yield ioUtil.exists(dest); - } - if (destExists) { - if (options.force == null || options.force) { - yield rmRF(dest); - } - else { - throw new Error('Destination already exists'); - } - } - } - yield mkdirP(path.dirname(dest)); - yield ioUtil.rename(source, dest); - }); - } - exports.mv = mv; - /** - * Remove a path recursively with force - * - * @param inputPath path to remove - */ - function rmRF(inputPath) { - return __awaiter(this, void 0, void 0, function* () { - if (ioUtil.IS_WINDOWS) { - // Check for invalid characters - // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file - if (/[*"<>|]/.test(inputPath)) { - throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows'); - } - } - try { - // note if path does not exist, error is silent - yield ioUtil.rm(inputPath, { - force: true, - maxRetries: 3, - recursive: true, - retryDelay: 300 - }); - } - catch (err) { - throw new Error(`File was unable to be removed ${err}`); - } - }); - } - exports.rmRF = rmRF; - /** - * Make a directory. Creates the full path with folders in between - * Will throw if it fails - * - * @param fsPath path to create - * @returns Promise - */ - function mkdirP(fsPath) { - return __awaiter(this, void 0, void 0, function* () { - assert_1.ok(fsPath, 'a path argument must be provided'); - yield ioUtil.mkdir(fsPath, { recursive: true }); - }); - } - exports.mkdirP = mkdirP; - /** - * Returns path of a tool had the tool actually been invoked. Resolves via paths. - * If you check and the tool does not exist, it will throw. - * - * @param tool name of the tool - * @param check whether to check if tool exists - * @returns Promise path to tool - */ - function which(tool, check) { - return __awaiter(this, void 0, void 0, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - // recursive when check=true - if (check) { - const result = yield which(tool, false); - if (!result) { - if (ioUtil.IS_WINDOWS) { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); - } - else { - throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`); - } - } - return result; - } - const matches = yield findInPath(tool); - if (matches && matches.length > 0) { - return matches[0]; - } - return ''; - }); - } - exports.which = which; - /** - * Returns a list of all occurrences of the given tool on the system path. - * - * @returns Promise the paths of the tool - */ - function findInPath(tool) { - return __awaiter(this, void 0, void 0, function* () { - if (!tool) { - throw new Error("parameter 'tool' is required"); - } - // build the list of extensions to try - const extensions = []; - if (ioUtil.IS_WINDOWS && process.env['PATHEXT']) { - for (const extension of process.env['PATHEXT'].split(path.delimiter)) { - if (extension) { - extensions.push(extension); - } - } - } - // if it's rooted, return it if exists. otherwise return empty. - if (ioUtil.isRooted(tool)) { - const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions); - if (filePath) { - return [filePath]; - } - return []; - } - // if any path separators, return empty - if (tool.includes(path.sep)) { - return []; - } - // build the list of directories - // - // Note, technically "where" checks the current directory on Windows. From a toolkit perspective, - // it feels like we should not do this. Checking the current directory seems like more of a use - // case of a shell, and the which() function exposed by the toolkit should strive for consistency - // across platforms. - const directories = []; - if (process.env.PATH) { - for (const p of process.env.PATH.split(path.delimiter)) { - if (p) { - directories.push(p); - } - } - } - // find all matches - const matches = []; - for (const directory of directories) { - const filePath = yield ioUtil.tryGetExecutablePath(path.join(directory, tool), extensions); - if (filePath) { - matches.push(filePath); - } - } - return matches; - }); - } - exports.findInPath = findInPath; - function readCopyOptions(options) { - const force = options.force == null ? true : options.force; - const recursive = Boolean(options.recursive); - const copySourceDirectory = options.copySourceDirectory == null - ? true - : Boolean(options.copySourceDirectory); - return { force, recursive, copySourceDirectory }; - } - function cpDirRecursive(sourceDir, destDir, currentDepth, force) { - return __awaiter(this, void 0, void 0, function* () { - // Ensure there is not a run away recursive copy - if (currentDepth >= 255) - return; - currentDepth++; - yield mkdirP(destDir); - const files = yield ioUtil.readdir(sourceDir); - for (const fileName of files) { - const srcFile = `${sourceDir}/${fileName}`; - const destFile = `${destDir}/${fileName}`; - const srcFileStat = yield ioUtil.lstat(srcFile); - if (srcFileStat.isDirectory()) { - // Recurse - yield cpDirRecursive(srcFile, destFile, currentDepth, force); - } - else { - yield copyFile(srcFile, destFile, force); - } - } - // Change the mode for the newly created directory - yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode); - }); - } - // Buffered file copy - function copyFile(srcFile, destFile, force) { - return __awaiter(this, void 0, void 0, function* () { - if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) { - // unlink/re-link it - try { - yield ioUtil.lstat(destFile); - yield ioUtil.unlink(destFile); - } - catch (e) { - // Try to override file permission - if (e.code === 'EPERM') { - yield ioUtil.chmod(destFile, '0666'); - yield ioUtil.unlink(destFile); - } - // other errors = it doesn't exist, no work to do - } - // Copy over symlink - const symlinkFull = yield ioUtil.readlink(srcFile); - yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null); - } - else if (!(yield ioUtil.exists(destFile)) || force) { - yield ioUtil.copyFile(srcFile, destFile); - } - }); - } - //# sourceMappingURL=io.js.map +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.findInPath = exports.which = exports.mkdirP = exports.rmRF = exports.mv = exports.cp = void 0; +const assert_1 = __nccwpck_require__(9491); +const path = __importStar(__nccwpck_require__(1017)); +const ioUtil = __importStar(__nccwpck_require__(1962)); +/** + * Copies a file or folder. + * Based off of shelljs - https://github.com/shelljs/shelljs/blob/9237f66c52e5daa40458f94f9565e18e8132f5a6/src/cp.js + * + * @param source source path + * @param dest destination path + * @param options optional. See CopyOptions. + */ +function cp(source, dest, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + const { force, recursive, copySourceDirectory } = readCopyOptions(options); + const destStat = (yield ioUtil.exists(dest)) ? yield ioUtil.stat(dest) : null; + // Dest is an existing file, but not forcing + if (destStat && destStat.isFile() && !force) { + return; + } + // If dest is an existing directory, should copy inside. + const newDest = destStat && destStat.isDirectory() && copySourceDirectory + ? path.join(dest, path.basename(source)) + : dest; + if (!(yield ioUtil.exists(source))) { + throw new Error(`no such file or directory: ${source}`); + } + const sourceStat = yield ioUtil.stat(source); + if (sourceStat.isDirectory()) { + if (!recursive) { + throw new Error(`Failed to copy. ${source} is a directory, but tried to copy without recursive flag.`); + } + else { + yield cpDirRecursive(source, newDest, 0, force); + } + } + else { + if (path.relative(source, newDest) === '') { + // a file cannot be copied to itself + throw new Error(`'${newDest}' and '${source}' are the same file`); + } + yield copyFile(source, newDest, force); + } + }); +} +exports.cp = cp; +/** + * Moves a path. + * + * @param source source path + * @param dest destination path + * @param options optional. See MoveOptions. + */ +function mv(source, dest, options = {}) { + return __awaiter(this, void 0, void 0, function* () { + if (yield ioUtil.exists(dest)) { + let destExists = true; + if (yield ioUtil.isDirectory(dest)) { + // If dest is directory copy src into dest + dest = path.join(dest, path.basename(source)); + destExists = yield ioUtil.exists(dest); + } + if (destExists) { + if (options.force == null || options.force) { + yield rmRF(dest); + } + else { + throw new Error('Destination already exists'); + } + } + } + yield mkdirP(path.dirname(dest)); + yield ioUtil.rename(source, dest); + }); +} +exports.mv = mv; +/** + * Remove a path recursively with force + * + * @param inputPath path to remove + */ +function rmRF(inputPath) { + return __awaiter(this, void 0, void 0, function* () { + if (ioUtil.IS_WINDOWS) { + // Check for invalid characters + // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file + if (/[*"<>|]/.test(inputPath)) { + throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows'); + } + } + try { + // note if path does not exist, error is silent + yield ioUtil.rm(inputPath, { + force: true, + maxRetries: 3, + recursive: true, + retryDelay: 300 + }); + } + catch (err) { + throw new Error(`File was unable to be removed ${err}`); + } + }); +} +exports.rmRF = rmRF; +/** + * Make a directory. Creates the full path with folders in between + * Will throw if it fails + * + * @param fsPath path to create + * @returns Promise + */ +function mkdirP(fsPath) { + return __awaiter(this, void 0, void 0, function* () { + assert_1.ok(fsPath, 'a path argument must be provided'); + yield ioUtil.mkdir(fsPath, { recursive: true }); + }); +} +exports.mkdirP = mkdirP; +/** + * Returns path of a tool had the tool actually been invoked. Resolves via paths. + * If you check and the tool does not exist, it will throw. + * + * @param tool name of the tool + * @param check whether to check if tool exists + * @returns Promise path to tool + */ +function which(tool, check) { + return __awaiter(this, void 0, void 0, function* () { + if (!tool) { + throw new Error("parameter 'tool' is required"); + } + // recursive when check=true + if (check) { + const result = yield which(tool, false); + if (!result) { + if (ioUtil.IS_WINDOWS) { + throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`); + } + else { + throw new Error(`Unable to locate executable file: ${tool}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`); + } + } + return result; + } + const matches = yield findInPath(tool); + if (matches && matches.length > 0) { + return matches[0]; + } + return ''; + }); +} +exports.which = which; +/** + * Returns a list of all occurrences of the given tool on the system path. + * + * @returns Promise the paths of the tool + */ +function findInPath(tool) { + return __awaiter(this, void 0, void 0, function* () { + if (!tool) { + throw new Error("parameter 'tool' is required"); + } + // build the list of extensions to try + const extensions = []; + if (ioUtil.IS_WINDOWS && process.env['PATHEXT']) { + for (const extension of process.env['PATHEXT'].split(path.delimiter)) { + if (extension) { + extensions.push(extension); + } + } + } + // if it's rooted, return it if exists. otherwise return empty. + if (ioUtil.isRooted(tool)) { + const filePath = yield ioUtil.tryGetExecutablePath(tool, extensions); + if (filePath) { + return [filePath]; + } + return []; + } + // if any path separators, return empty + if (tool.includes(path.sep)) { + return []; + } + // build the list of directories + // + // Note, technically "where" checks the current directory on Windows. From a toolkit perspective, + // it feels like we should not do this. Checking the current directory seems like more of a use + // case of a shell, and the which() function exposed by the toolkit should strive for consistency + // across platforms. + const directories = []; + if (process.env.PATH) { + for (const p of process.env.PATH.split(path.delimiter)) { + if (p) { + directories.push(p); + } + } + } + // find all matches + const matches = []; + for (const directory of directories) { + const filePath = yield ioUtil.tryGetExecutablePath(path.join(directory, tool), extensions); + if (filePath) { + matches.push(filePath); + } + } + return matches; + }); +} +exports.findInPath = findInPath; +function readCopyOptions(options) { + const force = options.force == null ? true : options.force; + const recursive = Boolean(options.recursive); + const copySourceDirectory = options.copySourceDirectory == null + ? true + : Boolean(options.copySourceDirectory); + return { force, recursive, copySourceDirectory }; +} +function cpDirRecursive(sourceDir, destDir, currentDepth, force) { + return __awaiter(this, void 0, void 0, function* () { + // Ensure there is not a run away recursive copy + if (currentDepth >= 255) + return; + currentDepth++; + yield mkdirP(destDir); + const files = yield ioUtil.readdir(sourceDir); + for (const fileName of files) { + const srcFile = `${sourceDir}/${fileName}`; + const destFile = `${destDir}/${fileName}`; + const srcFileStat = yield ioUtil.lstat(srcFile); + if (srcFileStat.isDirectory()) { + // Recurse + yield cpDirRecursive(srcFile, destFile, currentDepth, force); + } + else { + yield copyFile(srcFile, destFile, force); + } + } + // Change the mode for the newly created directory + yield ioUtil.chmod(destDir, (yield ioUtil.stat(sourceDir)).mode); + }); +} +// Buffered file copy +function copyFile(srcFile, destFile, force) { + return __awaiter(this, void 0, void 0, function* () { + if ((yield ioUtil.lstat(srcFile)).isSymbolicLink()) { + // unlink/re-link it + try { + yield ioUtil.lstat(destFile); + yield ioUtil.unlink(destFile); + } + catch (e) { + // Try to override file permission + if (e.code === 'EPERM') { + yield ioUtil.chmod(destFile, '0666'); + yield ioUtil.unlink(destFile); + } + // other errors = it doesn't exist, no work to do + } + // Copy over symlink + const symlinkFull = yield ioUtil.readlink(srcFile); + yield ioUtil.symlink(symlinkFull, destFile, ioUtil.IS_WINDOWS ? 'junction' : null); + } + else if (!(yield ioUtil.exists(destFile)) || force) { + yield ioUtil.copyFile(srcFile, destFile); + } + }); +} +//# sourceMappingURL=io.js.map - /***/ -}), +/***/ }), /***/ 9417: /***/ ((module) => { - "use strict"; +"use strict"; - module.exports = balanced; - function balanced(a, b, str) { - if (a instanceof RegExp) a = maybeMatch(a, str); - if (b instanceof RegExp) b = maybeMatch(b, str); +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); - var r = range(a, b, str); + var r = range(a, b, str); - return r && { - start: r[0], - end: r[1], - pre: str.slice(0, r[0]), - body: str.slice(r[0] + a.length, r[1]), - post: str.slice(r[1] + b.length) - }; - } + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} - function maybeMatch(reg, str) { - var m = str.match(reg); - return m ? m[0] : null; - } +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} - balanced.range = range; - function range(a, b, str) { - var begs, beg, left, right, result; - var ai = str.indexOf(a); - var bi = str.indexOf(b, ai + 1); - var i = ai; +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + if(a===b) { + return [ai, bi]; + } + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} - if (ai >= 0 && bi > 0) { - if (a === b) { - return [ai, bi]; - } - begs = []; - left = str.length; - - while (i >= 0 && !result) { - if (i == ai) { - begs.push(i); - ai = str.indexOf(a, i + 1); - } else if (begs.length == 1) { - result = [begs.pop(), bi]; - } else { - beg = begs.pop(); - if (beg < left) { - left = beg; - right = bi; - } - bi = str.indexOf(b, i + 1); - } +/***/ }), - i = ai < bi && ai >= 0 ? ai : bi; - } +/***/ 3717: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (begs.length) { - result = [left, right]; - } - } +var balanced = __nccwpck_require__(9417); - return result; - } +module.exports = expandTop; +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; - /***/ -}), +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} -/***/ 3717: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} - var balanced = __nccwpck_require__(9417); +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} - module.exports = expandTop; - var escSlash = '\0SLASH' + Math.random() + '\0'; - var escOpen = '\0OPEN' + Math.random() + '\0'; - var escClose = '\0CLOSE' + Math.random() + '\0'; - var escComma = '\0COMMA' + Math.random() + '\0'; - var escPeriod = '\0PERIOD' + Math.random() + '\0'; +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; - function numeric(str) { - return parseInt(str, 10) == str - ? parseInt(str, 10) - : str.charCodeAt(0); - } + var parts = []; + var m = balanced('{', '}', str); - function escapeBraces(str) { - return str.split('\\\\').join(escSlash) - .split('\\{').join(escOpen) - .split('\\}').join(escClose) - .split('\\,').join(escComma) - .split('\\.').join(escPeriod); - } + if (!m) + return str.split(','); - function unescapeBraces(str) { - return str.split(escSlash).join('\\') - .split(escOpen).join('{') - .split(escClose).join('}') - .split(escComma).join(',') - .split(escPeriod).join('.'); - } + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } - // Basically just str.split(","), but handling cases - // where we have nested braced sections, which should be - // treated as individual members, like {a,{b,c},d} - function parseCommaParts(str) { - if (!str) - return ['']; + parts.push.apply(parts, p); - var parts = []; - var m = balanced('{', '}', str); + return parts; +} - if (!m) - return str.split(','); - - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(','); - - p[p.length - 1] += '{' + body + '}'; - var postParts = parseCommaParts(post); - if (post.length) { - p[p.length - 1] += postParts.shift(); - p.push.apply(p, postParts); - } - - parts.push.apply(parts, p); - - return parts; - } - - function expandTop(str) { - if (!str) - return []; - - // I don't know why Bash 4.3 does this, but it does. - // Anything starting with {} will have the first two bytes preserved - // but *only* at the top level, so {},a}b will not expand to anything, - // but a{},b}c will be expanded to [a}c,abc]. - // One could argue that this is a bug in Bash, but since the goal of - // this module is to match Bash's rules, we escape a leading {} - if (str.substr(0, 2) === '{}') { - str = '\\{\\}' + str.substr(2); - } - - return expand(escapeBraces(str), true).map(unescapeBraces); - } - - function embrace(str) { - return '{' + str + '}'; - } - function isPadded(el) { - return /^-?0\d/.test(el); - } - - function lte(i, y) { - return i <= y; - } - function gte(i, y) { - return i >= y; - } - - function expand(str, isTop) { - var expansions = []; - - var m = balanced('{', '}', str); - if (!m) return [str]; - - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post, false) - : ['']; - - if (/\$$/.test(m.pre)) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + '{' + m.body + '}' + post[k]; - expansions.push(expansion); - } - } else { - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = m.body.indexOf(',') >= 0; - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,.*\}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str); - } - return [str]; - } - - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0], false).map(embrace); - if (n.length === 1) { - return post.map(function (p) { - return m.pre + n[0] + p; - }); - } - } - } - - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. - var N; - - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length) - var incr = n.length == 3 - ? Math.abs(numeric(n[2])) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); - - N = []; - - for (var i = x; test(i, y); i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; - } - } - } - N.push(c); - } - } else { - N = []; +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} - for (var j = 0; j < n.length; j++) { - N.push.apply(N, expand(n[j], false)); - } - } +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) - expansions.push(expansion); - } - } - } +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} - return expansions; - } +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m) return [str]; + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + if (/\$$/.test(m.pre)) { + for (var k = 0; k < post.length; k++) { + var expansion = pre+ '{' + m.body + '}' + post[k]; + expansions.push(expansion); + } + } else { + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = []; + + for (var j = 0; j < n.length; j++) { + N.push.apply(N, expand(n[j], false)); + } + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + } + + return expansions; +} - /***/ -}), +/***/ }), /***/ 8803: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +"use strict"; - var GetIntrinsic = __nccwpck_require__(4538); +var GetIntrinsic = __nccwpck_require__(4538); - var callBind = __nccwpck_require__(2977); +var callBind = __nccwpck_require__(2977); - var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf')); +var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf')); - module.exports = function callBoundIntrinsic(name, allowMissing) { - var intrinsic = GetIntrinsic(name, !!allowMissing); - if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) { - return callBind(intrinsic); - } - return intrinsic; - }; +module.exports = function callBoundIntrinsic(name, allowMissing) { + var intrinsic = GetIntrinsic(name, !!allowMissing); + if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) { + return callBind(intrinsic); + } + return intrinsic; +}; - /***/ -}), +/***/ }), /***/ 2977: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +"use strict"; - var bind = __nccwpck_require__(8334); - var GetIntrinsic = __nccwpck_require__(4538); - var setFunctionLength = __nccwpck_require__(4056); +var bind = __nccwpck_require__(8334); +var GetIntrinsic = __nccwpck_require__(4538); +var setFunctionLength = __nccwpck_require__(4056); - var $TypeError = __nccwpck_require__(6361); - var $apply = GetIntrinsic('%Function.prototype.apply%'); - var $call = GetIntrinsic('%Function.prototype.call%'); - var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply); +var $TypeError = __nccwpck_require__(6361); +var $apply = GetIntrinsic('%Function.prototype.apply%'); +var $call = GetIntrinsic('%Function.prototype.call%'); +var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply); - var $defineProperty = __nccwpck_require__(6123); - var $max = GetIntrinsic('%Math.max%'); +var $defineProperty = __nccwpck_require__(6123); +var $max = GetIntrinsic('%Math.max%'); - module.exports = function callBind(originalFunction) { - if (typeof originalFunction !== 'function') { - throw new $TypeError('a function is required'); - } - var func = $reflectApply(bind, $call, arguments); - return setFunctionLength( - func, - 1 + $max(0, originalFunction.length - (arguments.length - 1)), - true - ); - }; +module.exports = function callBind(originalFunction) { + if (typeof originalFunction !== 'function') { + throw new $TypeError('a function is required'); + } + var func = $reflectApply(bind, $call, arguments); + return setFunctionLength( + func, + 1 + $max(0, originalFunction.length - (arguments.length - 1)), + true + ); +}; - var applyBind = function applyBind() { - return $reflectApply(bind, $apply, arguments); - }; +var applyBind = function applyBind() { + return $reflectApply(bind, $apply, arguments); +}; - if ($defineProperty) { - $defineProperty(module.exports, 'apply', { value: applyBind }); - } else { - module.exports.apply = applyBind; - } +if ($defineProperty) { + $defineProperty(module.exports, 'apply', { value: applyBind }); +} else { + module.exports.apply = applyBind; +} - /***/ -}), +/***/ }), /***/ 4564: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; - - - var $defineProperty = __nccwpck_require__(6123); - - var $SyntaxError = __nccwpck_require__(5474); - var $TypeError = __nccwpck_require__(6361); +"use strict"; + + +var $defineProperty = __nccwpck_require__(6123); + +var $SyntaxError = __nccwpck_require__(5474); +var $TypeError = __nccwpck_require__(6361); + +var gopd = __nccwpck_require__(8501); + +/** @type {import('.')} */ +module.exports = function defineDataProperty( + obj, + property, + value +) { + if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { + throw new $TypeError('`obj` must be an object or a function`'); + } + if (typeof property !== 'string' && typeof property !== 'symbol') { + throw new $TypeError('`property` must be a string or a symbol`'); + } + if (arguments.length > 3 && typeof arguments[3] !== 'boolean' && arguments[3] !== null) { + throw new $TypeError('`nonEnumerable`, if provided, must be a boolean or null'); + } + if (arguments.length > 4 && typeof arguments[4] !== 'boolean' && arguments[4] !== null) { + throw new $TypeError('`nonWritable`, if provided, must be a boolean or null'); + } + if (arguments.length > 5 && typeof arguments[5] !== 'boolean' && arguments[5] !== null) { + throw new $TypeError('`nonConfigurable`, if provided, must be a boolean or null'); + } + if (arguments.length > 6 && typeof arguments[6] !== 'boolean') { + throw new $TypeError('`loose`, if provided, must be a boolean'); + } + + var nonEnumerable = arguments.length > 3 ? arguments[3] : null; + var nonWritable = arguments.length > 4 ? arguments[4] : null; + var nonConfigurable = arguments.length > 5 ? arguments[5] : null; + var loose = arguments.length > 6 ? arguments[6] : false; + + /* @type {false | TypedPropertyDescriptor} */ + var desc = !!gopd && gopd(obj, property); + + if ($defineProperty) { + $defineProperty(obj, property, { + configurable: nonConfigurable === null && desc ? desc.configurable : !nonConfigurable, + enumerable: nonEnumerable === null && desc ? desc.enumerable : !nonEnumerable, + value: value, + writable: nonWritable === null && desc ? desc.writable : !nonWritable + }); + } else if (loose || (!nonEnumerable && !nonWritable && !nonConfigurable)) { + // must fall back to [[Set]], and was not explicitly asked to make non-enumerable, non-writable, or non-configurable + obj[property] = value; // eslint-disable-line no-param-reassign + } else { + throw new $SyntaxError('This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.'); + } +}; - var gopd = __nccwpck_require__(8501); - /** @type {import('.')} */ - module.exports = function defineDataProperty( - obj, - property, - value - ) { - if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) { - throw new $TypeError('`obj` must be an object or a function`'); - } - if (typeof property !== 'string' && typeof property !== 'symbol') { - throw new $TypeError('`property` must be a string or a symbol`'); - } - if (arguments.length > 3 && typeof arguments[3] !== 'boolean' && arguments[3] !== null) { - throw new $TypeError('`nonEnumerable`, if provided, must be a boolean or null'); - } - if (arguments.length > 4 && typeof arguments[4] !== 'boolean' && arguments[4] !== null) { - throw new $TypeError('`nonWritable`, if provided, must be a boolean or null'); - } - if (arguments.length > 5 && typeof arguments[5] !== 'boolean' && arguments[5] !== null) { - throw new $TypeError('`nonConfigurable`, if provided, must be a boolean or null'); - } - if (arguments.length > 6 && typeof arguments[6] !== 'boolean') { - throw new $TypeError('`loose`, if provided, must be a boolean'); - } +/***/ }), - var nonEnumerable = arguments.length > 3 ? arguments[3] : null; - var nonWritable = arguments.length > 4 ? arguments[4] : null; - var nonConfigurable = arguments.length > 5 ? arguments[5] : null; - var loose = arguments.length > 6 ? arguments[6] : false; +/***/ 6123: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - /* @type {false | TypedPropertyDescriptor} */ - var desc = !!gopd && gopd(obj, property); +"use strict"; - if ($defineProperty) { - $defineProperty(obj, property, { - configurable: nonConfigurable === null && desc ? desc.configurable : !nonConfigurable, - enumerable: nonEnumerable === null && desc ? desc.enumerable : !nonEnumerable, - value: value, - writable: nonWritable === null && desc ? desc.writable : !nonWritable - }); - } else if (loose || (!nonEnumerable && !nonWritable && !nonConfigurable)) { - // must fall back to [[Set]], and was not explicitly asked to make non-enumerable, non-writable, or non-configurable - obj[property] = value; // eslint-disable-line no-param-reassign - } else { - throw new $SyntaxError('This environment does not support defining a property as non-configurable, non-writable, or non-enumerable.'); - } - }; +var GetIntrinsic = __nccwpck_require__(4538); - /***/ -}), +/** @type {import('.')} */ +var $defineProperty = GetIntrinsic('%Object.defineProperty%', true) || false; +if ($defineProperty) { + try { + $defineProperty({}, 'a', { value: 1 }); + } catch (e) { + // IE 8 has a broken defineProperty + $defineProperty = false; + } +} -/***/ 8743: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +module.exports = $defineProperty; - "use strict"; +/***/ }), - exports.utils = __nccwpck_require__(4171); - exports.Cipher = __nccwpck_require__(5068); - exports.DES = __nccwpck_require__(2957); - exports.CBC = __nccwpck_require__(9594); - exports.EDE = __nccwpck_require__(3408); +/***/ 1933: +/***/ ((module) => { +"use strict"; - /***/ -}), -/***/ 9594: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/** @type {import('./eval')} */ +module.exports = EvalError; - "use strict"; +/***/ }), - var assert = __nccwpck_require__(910); - var inherits = __nccwpck_require__(4124); +/***/ 8015: +/***/ ((module) => { - var proto = {}; +"use strict"; - function CBCState(iv) { - assert.equal(iv.length, 8, 'Invalid IV length'); - this.iv = new Array(8); - for (var i = 0; i < this.iv.length; i++) - this.iv[i] = iv[i]; - } +/** @type {import('.')} */ +module.exports = Error; - function instantiate(Base) { - function CBC(options) { - Base.call(this, options); - this._cbcInit(); - } - inherits(CBC, Base); - var keys = Object.keys(proto); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - CBC.prototype[key] = proto[key]; - } +/***/ }), - CBC.create = function create(options) { - return new CBC(options); - }; +/***/ 4415: +/***/ ((module) => { - return CBC; - } +"use strict"; - exports.instantiate = instantiate; - proto._cbcInit = function _cbcInit() { - var state = new CBCState(this.options.iv); - this._cbcState = state; - }; +/** @type {import('./range')} */ +module.exports = RangeError; - proto._update = function _update(inp, inOff, out, outOff) { - var state = this._cbcState; - var superProto = this.constructor.super_.prototype; - var iv = state.iv; - if (this.type === 'encrypt') { - for (var i = 0; i < this.blockSize; i++) - iv[i] ^= inp[inOff + i]; +/***/ }), - superProto._update.call(this, iv, 0, out, outOff); +/***/ 6279: +/***/ ((module) => { - for (var i = 0; i < this.blockSize; i++) - iv[i] = out[outOff + i]; - } else { - superProto._update.call(this, inp, inOff, out, outOff); +"use strict"; - for (var i = 0; i < this.blockSize; i++) - out[outOff + i] ^= iv[i]; - for (var i = 0; i < this.blockSize; i++) - iv[i] = inp[inOff + i]; - } - }; +/** @type {import('./ref')} */ +module.exports = ReferenceError; - /***/ -}), +/***/ }), -/***/ 5068: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ 5474: +/***/ ((module) => { - "use strict"; +"use strict"; - var assert = __nccwpck_require__(910); +/** @type {import('./syntax')} */ +module.exports = SyntaxError; - function Cipher(options) { - this.options = options; - this.type = this.options.type; - this.blockSize = 8; - this._init(); +/***/ }), - this.buffer = new Array(this.blockSize); - this.bufferOff = 0; - this.padding = options.padding !== false - } - module.exports = Cipher; +/***/ 6361: +/***/ ((module) => { - Cipher.prototype._init = function _init() { - // Might be overrided - }; +"use strict"; - Cipher.prototype.update = function update(data) { - if (data.length === 0) - return []; - if (this.type === 'decrypt') - return this._updateDecrypt(data); - else - return this._updateEncrypt(data); - }; +/** @type {import('./type')} */ +module.exports = TypeError; - Cipher.prototype._buffer = function _buffer(data, off) { - // Append data to buffer - var min = Math.min(this.buffer.length - this.bufferOff, data.length - off); - for (var i = 0; i < min; i++) - this.buffer[this.bufferOff + i] = data[off + i]; - this.bufferOff += min; - // Shift next - return min; - }; +/***/ }), - Cipher.prototype._flushBuffer = function _flushBuffer(out, off) { - this._update(this.buffer, 0, out, off); - this.bufferOff = 0; - return this.blockSize; - }; +/***/ 5065: +/***/ ((module) => { - Cipher.prototype._updateEncrypt = function _updateEncrypt(data) { - var inputOff = 0; - var outputOff = 0; +"use strict"; - var count = ((this.bufferOff + data.length) / this.blockSize) | 0; - var out = new Array(count * this.blockSize); - if (this.bufferOff !== 0) { - inputOff += this._buffer(data, inputOff); +/** @type {import('./uri')} */ +module.exports = URIError; - if (this.bufferOff === this.buffer.length) - outputOff += this._flushBuffer(out, outputOff); - } - // Write blocks - var max = data.length - ((data.length - inputOff) % this.blockSize); - for (; inputOff < max; inputOff += this.blockSize) { - this._update(data, inputOff, out, outputOff); - outputOff += this.blockSize; - } +/***/ }), - // Queue rest - for (; inputOff < data.length; inputOff++, this.bufferOff++) - this.buffer[this.bufferOff] = data[inputOff]; +/***/ 9320: +/***/ ((module) => { - return out; - }; +"use strict"; - Cipher.prototype._updateDecrypt = function _updateDecrypt(data) { - var inputOff = 0; - var outputOff = 0; - var count = Math.ceil((this.bufferOff + data.length) / this.blockSize) - 1; - var out = new Array(count * this.blockSize); +/* eslint no-invalid-this: 1 */ - // TODO(indutny): optimize it, this is far from optimal - for (; count > 0; count--) { - inputOff += this._buffer(data, inputOff); - outputOff += this._flushBuffer(out, outputOff); - } +var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; +var toStr = Object.prototype.toString; +var max = Math.max; +var funcType = '[object Function]'; - // Buffer rest of the input - inputOff += this._buffer(data, inputOff); +var concatty = function concatty(a, b) { + var arr = []; - return out; - }; + for (var i = 0; i < a.length; i += 1) { + arr[i] = a[i]; + } + for (var j = 0; j < b.length; j += 1) { + arr[j + a.length] = b[j]; + } - Cipher.prototype.final = function final(buffer) { - var first; - if (buffer) - first = this.update(buffer); + return arr; +}; - var last; - if (this.type === 'encrypt') - last = this._finalEncrypt(); - else - last = this._finalDecrypt(); +var slicy = function slicy(arrLike, offset) { + var arr = []; + for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) { + arr[j] = arrLike[i]; + } + return arr; +}; - if (first) - return first.concat(last); - else - return last; - }; +var joiny = function (arr, joiner) { + var str = ''; + for (var i = 0; i < arr.length; i += 1) { + str += arr[i]; + if (i + 1 < arr.length) { + str += joiner; + } + } + return str; +}; - Cipher.prototype._pad = function _pad(buffer, off) { - if (off === 0) - return false; +module.exports = function bind(that) { + var target = this; + if (typeof target !== 'function' || toStr.apply(target) !== funcType) { + throw new TypeError(ERROR_MESSAGE + target); + } + var args = slicy(arguments, 1); + + var bound; + var binder = function () { + if (this instanceof bound) { + var result = target.apply( + this, + concatty(args, arguments) + ); + if (Object(result) === result) { + return result; + } + return this; + } + return target.apply( + that, + concatty(args, arguments) + ); + + }; + + var boundLength = max(0, target.length - args.length); + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + boundArgs[i] = '$' + i; + } + + bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder); + + if (target.prototype) { + var Empty = function Empty() {}; + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + + return bound; +}; - while (off < buffer.length) - buffer[off++] = 0; - return true; - }; +/***/ }), - Cipher.prototype._finalEncrypt = function _finalEncrypt() { - if (!this._pad(this.buffer, this.bufferOff)) - return []; +/***/ 8334: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - var out = new Array(this.blockSize); - this._update(this.buffer, 0, out, 0); - return out; - }; +"use strict"; - Cipher.prototype._unpad = function _unpad(buffer) { - return buffer; - }; - Cipher.prototype._finalDecrypt = function _finalDecrypt() { - assert.equal(this.bufferOff, this.blockSize, 'Not enough data to decrypt'); - var out = new Array(this.blockSize); - this._flushBuffer(out, 0); +var implementation = __nccwpck_require__(9320); - return this._unpad(out); - }; +module.exports = Function.prototype.bind || implementation; - /***/ -}), +/***/ }), -/***/ 2957: +/***/ 4538: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +"use strict"; - var assert = __nccwpck_require__(910); - var inherits = __nccwpck_require__(4124); +var undefined; - var utils = __nccwpck_require__(4171); - var Cipher = __nccwpck_require__(5068); +var $Error = __nccwpck_require__(8015); +var $EvalError = __nccwpck_require__(1933); +var $RangeError = __nccwpck_require__(4415); +var $ReferenceError = __nccwpck_require__(6279); +var $SyntaxError = __nccwpck_require__(5474); +var $TypeError = __nccwpck_require__(6361); +var $URIError = __nccwpck_require__(5065); - function DESState() { - this.tmp = new Array(2); - this.keys = null; - } - - function DES(options) { - Cipher.call(this, options); - - var state = new DESState(); - this._desState = state; - - this.deriveKeys(state, options.key); - } - inherits(DES, Cipher); - module.exports = DES; - - DES.create = function create(options) { - return new DES(options); - }; - - var shiftTable = [ - 1, 1, 2, 2, 2, 2, 2, 2, - 1, 2, 2, 2, 2, 2, 2, 1 - ]; +var $Function = Function; - DES.prototype.deriveKeys = function deriveKeys(state, key) { - state.keys = new Array(16 * 2); - - assert.equal(key.length, this.blockSize, 'Invalid key length'); +// eslint-disable-next-line consistent-return +var getEvalledConstructor = function (expressionSyntax) { + try { + return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')(); + } catch (e) {} +}; - var kL = utils.readUInt32BE(key, 0); - var kR = utils.readUInt32BE(key, 4); +var $gOPD = Object.getOwnPropertyDescriptor; +if ($gOPD) { + try { + $gOPD({}, ''); + } catch (e) { + $gOPD = null; // this is IE 8, which has a broken gOPD + } +} - utils.pc1(kL, kR, state.tmp, 0); - kL = state.tmp[0]; - kR = state.tmp[1]; - for (var i = 0; i < state.keys.length; i += 2) { - var shift = shiftTable[i >>> 1]; - kL = utils.r28shl(kL, shift); - kR = utils.r28shl(kR, shift); - utils.pc2(kL, kR, state.keys, i); - } - }; +var throwTypeError = function () { + throw new $TypeError(); +}; +var ThrowTypeError = $gOPD + ? (function () { + try { + // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties + arguments.callee; // IE 8 does not throw here + return throwTypeError; + } catch (calleeThrows) { + try { + // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '') + return $gOPD(arguments, 'callee').get; + } catch (gOPDthrows) { + return throwTypeError; + } + } + }()) + : throwTypeError; + +var hasSymbols = __nccwpck_require__(587)(); +var hasProto = __nccwpck_require__(5894)(); + +var getProto = Object.getPrototypeOf || ( + hasProto + ? function (x) { return x.__proto__; } // eslint-disable-line no-proto + : null +); + +var needsEval = {}; + +var TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array); + +var INTRINSICS = { + __proto__: null, + '%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError, + '%Array%': Array, + '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer, + '%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined, + '%AsyncFromSyncIteratorPrototype%': undefined, + '%AsyncFunction%': needsEval, + '%AsyncGenerator%': needsEval, + '%AsyncGeneratorFunction%': needsEval, + '%AsyncIteratorPrototype%': needsEval, + '%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics, + '%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt, + '%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array, + '%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array, + '%Boolean%': Boolean, + '%DataView%': typeof DataView === 'undefined' ? undefined : DataView, + '%Date%': Date, + '%decodeURI%': decodeURI, + '%decodeURIComponent%': decodeURIComponent, + '%encodeURI%': encodeURI, + '%encodeURIComponent%': encodeURIComponent, + '%Error%': $Error, + '%eval%': eval, // eslint-disable-line no-eval + '%EvalError%': $EvalError, + '%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array, + '%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array, + '%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry, + '%Function%': $Function, + '%GeneratorFunction%': needsEval, + '%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array, + '%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array, + '%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array, + '%isFinite%': isFinite, + '%isNaN%': isNaN, + '%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined, + '%JSON%': typeof JSON === 'object' ? JSON : undefined, + '%Map%': typeof Map === 'undefined' ? undefined : Map, + '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()), + '%Math%': Math, + '%Number%': Number, + '%Object%': Object, + '%parseFloat%': parseFloat, + '%parseInt%': parseInt, + '%Promise%': typeof Promise === 'undefined' ? undefined : Promise, + '%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy, + '%RangeError%': $RangeError, + '%ReferenceError%': $ReferenceError, + '%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect, + '%RegExp%': RegExp, + '%Set%': typeof Set === 'undefined' ? undefined : Set, + '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()), + '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer, + '%String%': String, + '%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined, + '%Symbol%': hasSymbols ? Symbol : undefined, + '%SyntaxError%': $SyntaxError, + '%ThrowTypeError%': ThrowTypeError, + '%TypedArray%': TypedArray, + '%TypeError%': $TypeError, + '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array, + '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray, + '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array, + '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array, + '%URIError%': $URIError, + '%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap, + '%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef, + '%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet +}; - DES.prototype._update = function _update(inp, inOff, out, outOff) { - var state = this._desState; +if (getProto) { + try { + null.error; // eslint-disable-line no-unused-expressions + } catch (e) { + // https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229 + var errorProto = getProto(getProto(e)); + INTRINSICS['%Error.prototype%'] = errorProto; + } +} - var l = utils.readUInt32BE(inp, inOff); - var r = utils.readUInt32BE(inp, inOff + 4); +var doEval = function doEval(name) { + var value; + if (name === '%AsyncFunction%') { + value = getEvalledConstructor('async function () {}'); + } else if (name === '%GeneratorFunction%') { + value = getEvalledConstructor('function* () {}'); + } else if (name === '%AsyncGeneratorFunction%') { + value = getEvalledConstructor('async function* () {}'); + } else if (name === '%AsyncGenerator%') { + var fn = doEval('%AsyncGeneratorFunction%'); + if (fn) { + value = fn.prototype; + } + } else if (name === '%AsyncIteratorPrototype%') { + var gen = doEval('%AsyncGenerator%'); + if (gen && getProto) { + value = getProto(gen.prototype); + } + } + + INTRINSICS[name] = value; + + return value; +}; - // Initial Permutation - utils.ip(l, r, state.tmp, 0); - l = state.tmp[0]; - r = state.tmp[1]; +var LEGACY_ALIASES = { + __proto__: null, + '%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'], + '%ArrayPrototype%': ['Array', 'prototype'], + '%ArrayProto_entries%': ['Array', 'prototype', 'entries'], + '%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'], + '%ArrayProto_keys%': ['Array', 'prototype', 'keys'], + '%ArrayProto_values%': ['Array', 'prototype', 'values'], + '%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'], + '%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'], + '%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'], + '%BooleanPrototype%': ['Boolean', 'prototype'], + '%DataViewPrototype%': ['DataView', 'prototype'], + '%DatePrototype%': ['Date', 'prototype'], + '%ErrorPrototype%': ['Error', 'prototype'], + '%EvalErrorPrototype%': ['EvalError', 'prototype'], + '%Float32ArrayPrototype%': ['Float32Array', 'prototype'], + '%Float64ArrayPrototype%': ['Float64Array', 'prototype'], + '%FunctionPrototype%': ['Function', 'prototype'], + '%Generator%': ['GeneratorFunction', 'prototype'], + '%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'], + '%Int8ArrayPrototype%': ['Int8Array', 'prototype'], + '%Int16ArrayPrototype%': ['Int16Array', 'prototype'], + '%Int32ArrayPrototype%': ['Int32Array', 'prototype'], + '%JSONParse%': ['JSON', 'parse'], + '%JSONStringify%': ['JSON', 'stringify'], + '%MapPrototype%': ['Map', 'prototype'], + '%NumberPrototype%': ['Number', 'prototype'], + '%ObjectPrototype%': ['Object', 'prototype'], + '%ObjProto_toString%': ['Object', 'prototype', 'toString'], + '%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'], + '%PromisePrototype%': ['Promise', 'prototype'], + '%PromiseProto_then%': ['Promise', 'prototype', 'then'], + '%Promise_all%': ['Promise', 'all'], + '%Promise_reject%': ['Promise', 'reject'], + '%Promise_resolve%': ['Promise', 'resolve'], + '%RangeErrorPrototype%': ['RangeError', 'prototype'], + '%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'], + '%RegExpPrototype%': ['RegExp', 'prototype'], + '%SetPrototype%': ['Set', 'prototype'], + '%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'], + '%StringPrototype%': ['String', 'prototype'], + '%SymbolPrototype%': ['Symbol', 'prototype'], + '%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'], + '%TypedArrayPrototype%': ['TypedArray', 'prototype'], + '%TypeErrorPrototype%': ['TypeError', 'prototype'], + '%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'], + '%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'], + '%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'], + '%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'], + '%URIErrorPrototype%': ['URIError', 'prototype'], + '%WeakMapPrototype%': ['WeakMap', 'prototype'], + '%WeakSetPrototype%': ['WeakSet', 'prototype'] +}; - if (this.type === 'encrypt') - this._encrypt(state, l, r, state.tmp, 0); - else - this._decrypt(state, l, r, state.tmp, 0); +var bind = __nccwpck_require__(8334); +var hasOwn = __nccwpck_require__(2157); +var $concat = bind.call(Function.call, Array.prototype.concat); +var $spliceApply = bind.call(Function.apply, Array.prototype.splice); +var $replace = bind.call(Function.call, String.prototype.replace); +var $strSlice = bind.call(Function.call, String.prototype.slice); +var $exec = bind.call(Function.call, RegExp.prototype.exec); + +/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */ +var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; +var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */ +var stringToPath = function stringToPath(string) { + var first = $strSlice(string, 0, 1); + var last = $strSlice(string, -1); + if (first === '%' && last !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`'); + } else if (last === '%' && first !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`'); + } + var result = []; + $replace(string, rePropName, function (match, number, quote, subString) { + result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match; + }); + return result; +}; +/* end adaptation */ + +var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) { + var intrinsicName = name; + var alias; + if (hasOwn(LEGACY_ALIASES, intrinsicName)) { + alias = LEGACY_ALIASES[intrinsicName]; + intrinsicName = '%' + alias[0] + '%'; + } + + if (hasOwn(INTRINSICS, intrinsicName)) { + var value = INTRINSICS[intrinsicName]; + if (value === needsEval) { + value = doEval(intrinsicName); + } + if (typeof value === 'undefined' && !allowMissing) { + throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!'); + } + + return { + alias: alias, + name: intrinsicName, + value: value + }; + } + + throw new $SyntaxError('intrinsic ' + name + ' does not exist!'); +}; - l = state.tmp[0]; - r = state.tmp[1]; +module.exports = function GetIntrinsic(name, allowMissing) { + if (typeof name !== 'string' || name.length === 0) { + throw new $TypeError('intrinsic name must be a non-empty string'); + } + if (arguments.length > 1 && typeof allowMissing !== 'boolean') { + throw new $TypeError('"allowMissing" argument must be a boolean'); + } + + if ($exec(/^%?[^%]*%?$/, name) === null) { + throw new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name'); + } + var parts = stringToPath(name); + var intrinsicBaseName = parts.length > 0 ? parts[0] : ''; + + var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing); + var intrinsicRealName = intrinsic.name; + var value = intrinsic.value; + var skipFurtherCaching = false; + + var alias = intrinsic.alias; + if (alias) { + intrinsicBaseName = alias[0]; + $spliceApply(parts, $concat([0, 1], alias)); + } + + for (var i = 1, isOwn = true; i < parts.length; i += 1) { + var part = parts[i]; + var first = $strSlice(part, 0, 1); + var last = $strSlice(part, -1); + if ( + ( + (first === '"' || first === "'" || first === '`') + || (last === '"' || last === "'" || last === '`') + ) + && first !== last + ) { + throw new $SyntaxError('property names with quotes must have matching quotes'); + } + if (part === 'constructor' || !isOwn) { + skipFurtherCaching = true; + } + + intrinsicBaseName += '.' + part; + intrinsicRealName = '%' + intrinsicBaseName + '%'; + + if (hasOwn(INTRINSICS, intrinsicRealName)) { + value = INTRINSICS[intrinsicRealName]; + } else if (value != null) { + if (!(part in value)) { + if (!allowMissing) { + throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.'); + } + return void undefined; + } + if ($gOPD && (i + 1) >= parts.length) { + var desc = $gOPD(value, part); + isOwn = !!desc; + + // By convention, when a data property is converted to an accessor + // property to emulate a data property that does not suffer from + // the override mistake, that accessor's getter is marked with + // an `originalValue` property. Here, when we detect this, we + // uphold the illusion by pretending to see that original data + // property, i.e., returning the value rather than the getter + // itself. + if (isOwn && 'get' in desc && !('originalValue' in desc.get)) { + value = desc.get; + } else { + value = value[part]; + } + } else { + isOwn = hasOwn(value, part); + value = value[part]; + } + + if (isOwn && !skipFurtherCaching) { + INTRINSICS[intrinsicRealName] = value; + } + } + } + return value; +}; - utils.writeUInt32BE(out, l, outOff); - utils.writeUInt32BE(out, r, outOff + 4); - }; - DES.prototype._pad = function _pad(buffer, off) { - if (this.padding === false) { - return false; - } +/***/ }), - var value = buffer.length - off; - for (var i = off; i < buffer.length; i++) - buffer[i] = value; +/***/ 8501: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - return true; - }; +"use strict"; - DES.prototype._unpad = function _unpad(buffer) { - if (this.padding === false) { - return buffer; - } - var pad = buffer[buffer.length - 1]; - for (var i = buffer.length - pad; i < buffer.length; i++) - assert.equal(buffer[i], pad); +var GetIntrinsic = __nccwpck_require__(4538); - return buffer.slice(0, buffer.length - pad); - }; +var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true); - DES.prototype._encrypt = function _encrypt(state, lStart, rStart, out, off) { - var l = lStart; - var r = rStart; +if ($gOPD) { + try { + $gOPD([], 'length'); + } catch (e) { + // IE 8 has a broken gOPD + $gOPD = null; + } +} - // Apply f() x16 times - for (var i = 0; i < state.keys.length; i += 2) { - var keyL = state.keys[i]; - var keyR = state.keys[i + 1]; +module.exports = $gOPD; - // f(r, k) - utils.expand(r, state.tmp, 0); - keyL ^= state.tmp[0]; - keyR ^= state.tmp[1]; - var s = utils.substitute(keyL, keyR); - var f = utils.permute(s); +/***/ }), - var t = r; - r = (l ^ f) >>> 0; - l = t; - } +/***/ 176: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // Reverse Initial Permutation - utils.rip(r, l, out, off); - }; +"use strict"; - DES.prototype._decrypt = function _decrypt(state, lStart, rStart, out, off) { - var l = rStart; - var r = lStart; - // Apply f() x16 times - for (var i = state.keys.length - 2; i >= 0; i -= 2) { - var keyL = state.keys[i]; - var keyR = state.keys[i + 1]; +var $defineProperty = __nccwpck_require__(6123); - // f(r, k) - utils.expand(l, state.tmp, 0); +var hasPropertyDescriptors = function hasPropertyDescriptors() { + return !!$defineProperty; +}; - keyL ^= state.tmp[0]; - keyR ^= state.tmp[1]; - var s = utils.substitute(keyL, keyR); - var f = utils.permute(s); +hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() { + // node v0.6 has a bug where array lengths can be Set but not Defined + if (!$defineProperty) { + return null; + } + try { + return $defineProperty([], 'length', { value: 1 }).length !== 1; + } catch (e) { + // In Firefox 4-22, defining length on an array throws an exception. + return true; + } +}; - var t = l; - l = (r ^ f) >>> 0; - r = t; - } +module.exports = hasPropertyDescriptors; - // Reverse Initial Permutation - utils.rip(l, r, out, off); - }; +/***/ }), - /***/ -}), +/***/ 5894: +/***/ ((module) => { -/***/ 3408: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +"use strict"; - "use strict"; +var test = { + __proto__: null, + foo: {} +}; - var assert = __nccwpck_require__(910); - var inherits = __nccwpck_require__(4124); +var $Object = Object; - var Cipher = __nccwpck_require__(5068); - var DES = __nccwpck_require__(2957); +/** @type {import('.')} */ +module.exports = function hasProto() { + // @ts-expect-error: TS errors on an inherited property for some reason + return { __proto__: test }.foo === test.foo + && !(test instanceof $Object); +}; - function EDEState(type, key) { - assert.equal(key.length, 24, 'Invalid key length'); - var k1 = key.slice(0, 8); - var k2 = key.slice(8, 16); - var k3 = key.slice(16, 24); +/***/ }), - if (type === 'encrypt') { - this.ciphers = [ - DES.create({ type: 'encrypt', key: k1 }), - DES.create({ type: 'decrypt', key: k2 }), - DES.create({ type: 'encrypt', key: k3 }) - ]; - } else { - this.ciphers = [ - DES.create({ type: 'decrypt', key: k3 }), - DES.create({ type: 'encrypt', key: k2 }), - DES.create({ type: 'decrypt', key: k1 }) - ]; - } - } +/***/ 587: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - function EDE(options) { - Cipher.call(this, options); +"use strict"; - var state = new EDEState(this.type, this.options.key); - this._edeState = state; - } - inherits(EDE, Cipher); - module.exports = EDE; +var origSymbol = typeof Symbol !== 'undefined' && Symbol; +var hasSymbolSham = __nccwpck_require__(7747); - EDE.create = function create(options) { - return new EDE(options); - }; +module.exports = function hasNativeSymbols() { + if (typeof origSymbol !== 'function') { return false; } + if (typeof Symbol !== 'function') { return false; } + if (typeof origSymbol('foo') !== 'symbol') { return false; } + if (typeof Symbol('bar') !== 'symbol') { return false; } - EDE.prototype._update = function _update(inp, inOff, out, outOff) { - var state = this._edeState; + return hasSymbolSham(); +}; - state.ciphers[0]._update(inp, inOff, out, outOff); - state.ciphers[1]._update(out, outOff, out, outOff); - state.ciphers[2]._update(out, outOff, out, outOff); - }; - EDE.prototype._pad = DES.prototype._pad; - EDE.prototype._unpad = DES.prototype._unpad; +/***/ }), +/***/ 7747: +/***/ ((module) => { - /***/ -}), +"use strict"; -/***/ 4171: -/***/ ((__unused_webpack_module, exports) => { - "use strict"; +/* eslint complexity: [2, 18], max-statements: [2, 33] */ +module.exports = function hasSymbols() { + if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } + if (typeof Symbol.iterator === 'symbol') { return true; } + var obj = {}; + var sym = Symbol('test'); + var symObj = Object(sym); + if (typeof sym === 'string') { return false; } - exports.readUInt32BE = function readUInt32BE(bytes, off) { - var res = (bytes[0 + off] << 24) | - (bytes[1 + off] << 16) | - (bytes[2 + off] << 8) | - bytes[3 + off]; - return res >>> 0; - }; + if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; } + if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; } - exports.writeUInt32BE = function writeUInt32BE(bytes, value, off) { - bytes[0 + off] = value >>> 24; - bytes[1 + off] = (value >>> 16) & 0xff; - bytes[2 + off] = (value >>> 8) & 0xff; - bytes[3 + off] = value & 0xff; - }; + // temp disabled per https://github.com/ljharb/object.assign/issues/17 + // if (sym instanceof Symbol) { return false; } + // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 + // if (!(symObj instanceof Symbol)) { return false; } - exports.ip = function ip(inL, inR, out, off) { - var outL = 0; - var outR = 0; + // if (typeof Symbol.prototype.toString !== 'function') { return false; } + // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } - for (var i = 6; i >= 0; i -= 2) { - for (var j = 0; j <= 24; j += 8) { - outL <<= 1; - outL |= (inR >>> (j + i)) & 1; - } - for (var j = 0; j <= 24; j += 8) { - outL <<= 1; - outL |= (inL >>> (j + i)) & 1; - } - } + var symVal = 42; + obj[sym] = symVal; + for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop + if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } - for (var i = 6; i >= 0; i -= 2) { - for (var j = 1; j <= 25; j += 8) { - outR <<= 1; - outR |= (inR >>> (j + i)) & 1; - } - for (var j = 1; j <= 25; j += 8) { - outR <<= 1; - outR |= (inL >>> (j + i)) & 1; - } - } + if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } - out[off + 0] = outL >>> 0; - out[off + 1] = outR >>> 0; - }; + var syms = Object.getOwnPropertySymbols(obj); + if (syms.length !== 1 || syms[0] !== sym) { return false; } - exports.rip = function rip(inL, inR, out, off) { - var outL = 0; - var outR = 0; + if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } - for (var i = 0; i < 4; i++) { - for (var j = 24; j >= 0; j -= 8) { - outL <<= 1; - outL |= (inR >>> (j + i)) & 1; - outL <<= 1; - outL |= (inL >>> (j + i)) & 1; - } - } - for (var i = 4; i < 8; i++) { - for (var j = 24; j >= 0; j -= 8) { - outR <<= 1; - outR |= (inR >>> (j + i)) & 1; - outR <<= 1; - outR |= (inL >>> (j + i)) & 1; - } - } + if (typeof Object.getOwnPropertyDescriptor === 'function') { + var descriptor = Object.getOwnPropertyDescriptor(obj, sym); + if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } + } - out[off + 0] = outL >>> 0; - out[off + 1] = outR >>> 0; - }; + return true; +}; - exports.pc1 = function pc1(inL, inR, out, off) { - var outL = 0; - var outR = 0; - - // 7, 15, 23, 31, 39, 47, 55, 63 - // 6, 14, 22, 30, 39, 47, 55, 63 - // 5, 13, 21, 29, 39, 47, 55, 63 - // 4, 12, 20, 28 - for (var i = 7; i >= 5; i--) { - for (var j = 0; j <= 24; j += 8) { - outL <<= 1; - outL |= (inR >> (j + i)) & 1; - } - for (var j = 0; j <= 24; j += 8) { - outL <<= 1; - outL |= (inL >> (j + i)) & 1; - } - } - for (var j = 0; j <= 24; j += 8) { - outL <<= 1; - outL |= (inR >> (j + i)) & 1; - } - // 1, 9, 17, 25, 33, 41, 49, 57 - // 2, 10, 18, 26, 34, 42, 50, 58 - // 3, 11, 19, 27, 35, 43, 51, 59 - // 36, 44, 52, 60 - for (var i = 1; i <= 3; i++) { - for (var j = 0; j <= 24; j += 8) { - outR <<= 1; - outR |= (inR >> (j + i)) & 1; - } - for (var j = 0; j <= 24; j += 8) { - outR <<= 1; - outR |= (inL >> (j + i)) & 1; - } - } - for (var j = 0; j <= 24; j += 8) { - outR <<= 1; - outR |= (inL >> (j + i)) & 1; - } +/***/ }), - out[off + 0] = outL >>> 0; - out[off + 1] = outR >>> 0; - }; +/***/ 2157: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - exports.r28shl = function r28shl(num, shift) { - return ((num << shift) & 0xfffffff) | (num >>> (28 - shift)); - }; +"use strict"; - var pc2table = [ - // inL => outL - 14, 11, 17, 4, 27, 23, 25, 0, - 13, 22, 7, 18, 5, 9, 16, 24, - 2, 20, 12, 21, 1, 8, 15, 26, - - // inR => outR - 15, 4, 25, 19, 9, 1, 26, 16, - 5, 11, 23, 8, 12, 7, 17, 0, - 22, 3, 10, 14, 6, 20, 27, 24 - ]; - - exports.pc2 = function pc2(inL, inR, out, off) { - var outL = 0; - var outR = 0; - - var len = pc2table.length >>> 1; - for (var i = 0; i < len; i++) { - outL <<= 1; - outL |= (inL >>> pc2table[i]) & 0x1; - } - for (var i = len; i < pc2table.length; i++) { - outR <<= 1; - outR |= (inR >>> pc2table[i]) & 0x1; - } - out[off + 0] = outL >>> 0; - out[off + 1] = outR >>> 0; - }; +var call = Function.prototype.call; +var $hasOwn = Object.prototype.hasOwnProperty; +var bind = __nccwpck_require__(8334); - exports.expand = function expand(r, out, off) { - var outL = 0; - var outR = 0; +/** @type {import('.')} */ +module.exports = bind.call(call, $hasOwn); - outL = ((r & 1) << 5) | (r >>> 27); - for (var i = 23; i >= 15; i -= 4) { - outL <<= 6; - outL |= (r >>> i) & 0x3f; - } - for (var i = 11; i >= 3; i -= 4) { - outR |= (r >>> i) & 0x3f; - outR <<= 6; - } - outR |= ((r & 0x1f) << 1) | (r >>> 31); - out[off + 0] = outL >>> 0; - out[off + 1] = outR >>> 0; - }; +/***/ }), - var sTable = [ - 14, 0, 4, 15, 13, 7, 1, 4, 2, 14, 15, 2, 11, 13, 8, 1, - 3, 10, 10, 6, 6, 12, 12, 11, 5, 9, 9, 5, 0, 3, 7, 8, - 4, 15, 1, 12, 14, 8, 8, 2, 13, 4, 6, 9, 2, 1, 11, 7, - 15, 5, 12, 11, 9, 3, 7, 14, 3, 10, 10, 0, 5, 6, 0, 13, - - 15, 3, 1, 13, 8, 4, 14, 7, 6, 15, 11, 2, 3, 8, 4, 14, - 9, 12, 7, 0, 2, 1, 13, 10, 12, 6, 0, 9, 5, 11, 10, 5, - 0, 13, 14, 8, 7, 10, 11, 1, 10, 3, 4, 15, 13, 4, 1, 2, - 5, 11, 8, 6, 12, 7, 6, 12, 9, 0, 3, 5, 2, 14, 15, 9, - - 10, 13, 0, 7, 9, 0, 14, 9, 6, 3, 3, 4, 15, 6, 5, 10, - 1, 2, 13, 8, 12, 5, 7, 14, 11, 12, 4, 11, 2, 15, 8, 1, - 13, 1, 6, 10, 4, 13, 9, 0, 8, 6, 15, 9, 3, 8, 0, 7, - 11, 4, 1, 15, 2, 14, 12, 3, 5, 11, 10, 5, 14, 2, 7, 12, - - 7, 13, 13, 8, 14, 11, 3, 5, 0, 6, 6, 15, 9, 0, 10, 3, - 1, 4, 2, 7, 8, 2, 5, 12, 11, 1, 12, 10, 4, 14, 15, 9, - 10, 3, 6, 15, 9, 0, 0, 6, 12, 10, 11, 1, 7, 13, 13, 8, - 15, 9, 1, 4, 3, 5, 14, 11, 5, 12, 2, 7, 8, 2, 4, 14, - - 2, 14, 12, 11, 4, 2, 1, 12, 7, 4, 10, 7, 11, 13, 6, 1, - 8, 5, 5, 0, 3, 15, 15, 10, 13, 3, 0, 9, 14, 8, 9, 6, - 4, 11, 2, 8, 1, 12, 11, 7, 10, 1, 13, 14, 7, 2, 8, 13, - 15, 6, 9, 15, 12, 0, 5, 9, 6, 10, 3, 4, 0, 5, 14, 3, - - 12, 10, 1, 15, 10, 4, 15, 2, 9, 7, 2, 12, 6, 9, 8, 5, - 0, 6, 13, 1, 3, 13, 4, 14, 14, 0, 7, 11, 5, 3, 11, 8, - 9, 4, 14, 3, 15, 2, 5, 12, 2, 9, 8, 5, 12, 15, 3, 10, - 7, 11, 0, 14, 4, 1, 10, 7, 1, 6, 13, 0, 11, 8, 6, 13, - - 4, 13, 11, 0, 2, 11, 14, 7, 15, 4, 0, 9, 8, 1, 13, 10, - 3, 14, 12, 3, 9, 5, 7, 12, 5, 2, 10, 15, 6, 8, 1, 6, - 1, 6, 4, 11, 11, 13, 13, 8, 12, 1, 3, 4, 7, 10, 14, 7, - 10, 9, 15, 5, 6, 0, 8, 15, 0, 14, 5, 2, 9, 3, 2, 12, - - 13, 1, 2, 15, 8, 13, 4, 8, 6, 10, 15, 3, 11, 7, 1, 4, - 10, 12, 9, 5, 3, 6, 14, 11, 5, 0, 0, 14, 12, 9, 7, 2, - 7, 2, 11, 1, 4, 14, 1, 7, 9, 4, 12, 10, 14, 8, 2, 13, - 0, 15, 6, 12, 10, 9, 13, 0, 15, 3, 3, 5, 5, 6, 8, 11 - ]; - - exports.substitute = function substitute(inL, inR) { - var out = 0; - for (var i = 0; i < 4; i++) { - var b = (inL >>> (18 - i * 6)) & 0x3f; - var sb = sTable[i * 0x40 + b]; - - out <<= 4; - out |= sb; - } - for (var i = 0; i < 4; i++) { - var b = (inR >>> (18 - i * 6)) & 0x3f; - var sb = sTable[4 * 0x40 + i * 0x40 + b]; +/***/ 354: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - out <<= 4; - out |= sb; - } - return out >>> 0; - }; +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.findMadeSync = exports.findMade = void 0; +const path_1 = __nccwpck_require__(1017); +const findMade = async (opts, parent, path) => { + // we never want the 'made' return value to be a root directory + if (path === parent) { + return; + } + return opts.statAsync(parent).then(st => (st.isDirectory() ? path : undefined), // will fail later + // will fail later + er => { + const fer = er; + return fer && fer.code === 'ENOENT' + ? (0, exports.findMade)(opts, (0, path_1.dirname)(parent), parent) + : undefined; + }); +}; +exports.findMade = findMade; +const findMadeSync = (opts, parent, path) => { + if (path === parent) { + return undefined; + } + try { + return opts.statSync(parent).isDirectory() ? path : undefined; + } + catch (er) { + const fer = er; + return fer && fer.code === 'ENOENT' + ? (0, exports.findMadeSync)(opts, (0, path_1.dirname)(parent), parent) + : undefined; + } +}; +exports.findMadeSync = findMadeSync; +//# sourceMappingURL=find-made.js.map - var permuteTable = [ - 16, 25, 12, 11, 3, 20, 4, 15, 31, 17, 9, 6, 27, 14, 1, 22, - 30, 24, 8, 18, 0, 5, 29, 23, 13, 19, 2, 26, 10, 21, 28, 7 - ]; +/***/ }), - exports.permute = function permute(num) { - var out = 0; - for (var i = 0; i < permuteTable.length; i++) { - out <<= 1; - out |= (num >>> permuteTable[i]) & 0x1; - } - return out >>> 0; - }; +/***/ 7280: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - exports.padSplit = function padSplit(num, size, group) { - var str = num.toString(2); - while (str.length < size) - str = '0' + str; +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.mkdirp = exports.nativeSync = exports.native = exports.manualSync = exports.manual = exports.sync = exports.mkdirpSync = exports.useNativeSync = exports.useNative = exports.mkdirpNativeSync = exports.mkdirpNative = exports.mkdirpManualSync = exports.mkdirpManual = void 0; +const mkdirp_manual_js_1 = __nccwpck_require__(6386); +const mkdirp_native_js_1 = __nccwpck_require__(3842); +const opts_arg_js_1 = __nccwpck_require__(2110); +const path_arg_js_1 = __nccwpck_require__(8577); +const use_native_js_1 = __nccwpck_require__(8918); +/* c8 ignore start */ +var mkdirp_manual_js_2 = __nccwpck_require__(6386); +Object.defineProperty(exports, "mkdirpManual", ({ enumerable: true, get: function () { return mkdirp_manual_js_2.mkdirpManual; } })); +Object.defineProperty(exports, "mkdirpManualSync", ({ enumerable: true, get: function () { return mkdirp_manual_js_2.mkdirpManualSync; } })); +var mkdirp_native_js_2 = __nccwpck_require__(3842); +Object.defineProperty(exports, "mkdirpNative", ({ enumerable: true, get: function () { return mkdirp_native_js_2.mkdirpNative; } })); +Object.defineProperty(exports, "mkdirpNativeSync", ({ enumerable: true, get: function () { return mkdirp_native_js_2.mkdirpNativeSync; } })); +var use_native_js_2 = __nccwpck_require__(8918); +Object.defineProperty(exports, "useNative", ({ enumerable: true, get: function () { return use_native_js_2.useNative; } })); +Object.defineProperty(exports, "useNativeSync", ({ enumerable: true, get: function () { return use_native_js_2.useNativeSync; } })); +/* c8 ignore stop */ +const mkdirpSync = (path, opts) => { + path = (0, path_arg_js_1.pathArg)(path); + const resolved = (0, opts_arg_js_1.optsArg)(opts); + return (0, use_native_js_1.useNativeSync)(resolved) + ? (0, mkdirp_native_js_1.mkdirpNativeSync)(path, resolved) + : (0, mkdirp_manual_js_1.mkdirpManualSync)(path, resolved); +}; +exports.mkdirpSync = mkdirpSync; +exports.sync = exports.mkdirpSync; +exports.manual = mkdirp_manual_js_1.mkdirpManual; +exports.manualSync = mkdirp_manual_js_1.mkdirpManualSync; +exports.native = mkdirp_native_js_1.mkdirpNative; +exports.nativeSync = mkdirp_native_js_1.mkdirpNativeSync; +exports.mkdirp = Object.assign(async (path, opts) => { + path = (0, path_arg_js_1.pathArg)(path); + const resolved = (0, opts_arg_js_1.optsArg)(opts); + return (0, use_native_js_1.useNative)(resolved) + ? (0, mkdirp_native_js_1.mkdirpNative)(path, resolved) + : (0, mkdirp_manual_js_1.mkdirpManual)(path, resolved); +}, { + mkdirpSync: exports.mkdirpSync, + mkdirpNative: mkdirp_native_js_1.mkdirpNative, + mkdirpNativeSync: mkdirp_native_js_1.mkdirpNativeSync, + mkdirpManual: mkdirp_manual_js_1.mkdirpManual, + mkdirpManualSync: mkdirp_manual_js_1.mkdirpManualSync, + sync: exports.mkdirpSync, + native: mkdirp_native_js_1.mkdirpNative, + nativeSync: mkdirp_native_js_1.mkdirpNativeSync, + manual: mkdirp_manual_js_1.mkdirpManual, + manualSync: mkdirp_manual_js_1.mkdirpManualSync, + useNative: use_native_js_1.useNative, + useNativeSync: use_native_js_1.useNativeSync, +}); +//# sourceMappingURL=index.js.map - var out = []; - for (var i = 0; i < size; i += group) - out.push(str.slice(i, i + group)); - return out.join(' '); - }; +/***/ }), +/***/ 6386: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - /***/ -}), +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.mkdirpManual = exports.mkdirpManualSync = void 0; +const path_1 = __nccwpck_require__(1017); +const opts_arg_js_1 = __nccwpck_require__(2110); +const mkdirpManualSync = (path, options, made) => { + const parent = (0, path_1.dirname)(path); + const opts = { ...(0, opts_arg_js_1.optsArg)(options), recursive: false }; + if (parent === path) { + try { + return opts.mkdirSync(path, opts); + } + catch (er) { + // swallowed by recursive implementation on posix systems + // any other error is a failure + const fer = er; + if (fer && fer.code !== 'EISDIR') { + throw er; + } + return; + } + } + try { + opts.mkdirSync(path, opts); + return made || path; + } + catch (er) { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return (0, exports.mkdirpManualSync)(path, opts, (0, exports.mkdirpManualSync)(parent, opts, made)); + } + if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') { + throw er; + } + try { + if (!opts.statSync(path).isDirectory()) + throw er; + } + catch (_) { + throw er; + } + } +}; +exports.mkdirpManualSync = mkdirpManualSync; +exports.mkdirpManual = Object.assign(async (path, options, made) => { + const opts = (0, opts_arg_js_1.optsArg)(options); + opts.recursive = false; + const parent = (0, path_1.dirname)(path); + if (parent === path) { + return opts.mkdirAsync(path, opts).catch(er => { + // swallowed by recursive implementation on posix systems + // any other error is a failure + const fer = er; + if (fer && fer.code !== 'EISDIR') { + throw er; + } + }); + } + return opts.mkdirAsync(path, opts).then(() => made || path, async (er) => { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return (0, exports.mkdirpManual)(parent, opts).then((made) => (0, exports.mkdirpManual)(path, opts, made)); + } + if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') { + throw er; + } + return opts.statAsync(path).then(st => { + if (st.isDirectory()) { + return made; + } + else { + throw er; + } + }, () => { + throw er; + }); + }); +}, { sync: exports.mkdirpManualSync }); +//# sourceMappingURL=mkdirp-manual.js.map + +/***/ }), -/***/ 6123: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ 3842: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - "use strict"; +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.mkdirpNative = exports.mkdirpNativeSync = void 0; +const path_1 = __nccwpck_require__(1017); +const find_made_js_1 = __nccwpck_require__(354); +const mkdirp_manual_js_1 = __nccwpck_require__(6386); +const opts_arg_js_1 = __nccwpck_require__(2110); +const mkdirpNativeSync = (path, options) => { + const opts = (0, opts_arg_js_1.optsArg)(options); + opts.recursive = true; + const parent = (0, path_1.dirname)(path); + if (parent === path) { + return opts.mkdirSync(path, opts); + } + const made = (0, find_made_js_1.findMadeSync)(opts, path); + try { + opts.mkdirSync(path, opts); + return made; + } + catch (er) { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return (0, mkdirp_manual_js_1.mkdirpManualSync)(path, opts); + } + else { + throw er; + } + } +}; +exports.mkdirpNativeSync = mkdirpNativeSync; +exports.mkdirpNative = Object.assign(async (path, options) => { + const opts = { ...(0, opts_arg_js_1.optsArg)(options), recursive: true }; + const parent = (0, path_1.dirname)(path); + if (parent === path) { + return await opts.mkdirAsync(path, opts); + } + return (0, find_made_js_1.findMade)(opts, path).then((made) => opts + .mkdirAsync(path, opts) + .then(m => made || m) + .catch(er => { + const fer = er; + if (fer && fer.code === 'ENOENT') { + return (0, mkdirp_manual_js_1.mkdirpManual)(path, opts); + } + else { + throw er; + } + })); +}, { sync: exports.mkdirpNativeSync }); +//# sourceMappingURL=mkdirp-native.js.map + +/***/ }), +/***/ 2110: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - var GetIntrinsic = __nccwpck_require__(4538); +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.optsArg = void 0; +const fs_1 = __nccwpck_require__(7147); +const optsArg = (opts) => { + if (!opts) { + opts = { mode: 0o777 }; + } + else if (typeof opts === 'object') { + opts = { mode: 0o777, ...opts }; + } + else if (typeof opts === 'number') { + opts = { mode: opts }; + } + else if (typeof opts === 'string') { + opts = { mode: parseInt(opts, 8) }; + } + else { + throw new TypeError('invalid options argument'); + } + const resolved = opts; + const optsFs = opts.fs || {}; + opts.mkdir = opts.mkdir || optsFs.mkdir || fs_1.mkdir; + opts.mkdirAsync = opts.mkdirAsync + ? opts.mkdirAsync + : async (path, options) => { + return new Promise((res, rej) => resolved.mkdir(path, options, (er, made) => er ? rej(er) : res(made))); + }; + opts.stat = opts.stat || optsFs.stat || fs_1.stat; + opts.statAsync = opts.statAsync + ? opts.statAsync + : async (path) => new Promise((res, rej) => resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))); + opts.statSync = opts.statSync || optsFs.statSync || fs_1.statSync; + opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || fs_1.mkdirSync; + return resolved; +}; +exports.optsArg = optsArg; +//# sourceMappingURL=opts-arg.js.map - /** @type {import('.')} */ - var $defineProperty = GetIntrinsic('%Object.defineProperty%', true) || false; - if ($defineProperty) { - try { - $defineProperty({}, 'a', { value: 1 }); - } catch (e) { - // IE 8 has a broken defineProperty - $defineProperty = false; - } - } +/***/ }), - module.exports = $defineProperty; +/***/ 8577: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.pathArg = void 0; +const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform; +const path_1 = __nccwpck_require__(1017); +const pathArg = (path) => { + if (/\0/.test(path)) { + // simulate same failure that node raises + throw Object.assign(new TypeError('path must be a string without null bytes'), { + path, + code: 'ERR_INVALID_ARG_VALUE', + }); + } + path = (0, path_1.resolve)(path); + if (platform === 'win32') { + const badWinChars = /[*|"<>?:]/; + const { root } = (0, path_1.parse)(path); + if (badWinChars.test(path.substring(root.length))) { + throw Object.assign(new Error('Illegal characters in path.'), { + path, + code: 'EINVAL', + }); + } + } + return path; +}; +exports.pathArg = pathArg; +//# sourceMappingURL=path-arg.js.map - /***/ -}), +/***/ }), -/***/ 1933: -/***/ ((module) => { +/***/ 8918: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - "use strict"; +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.useNative = exports.useNativeSync = void 0; +const fs_1 = __nccwpck_require__(7147); +const opts_arg_js_1 = __nccwpck_require__(2110); +const version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version; +const versArr = version.replace(/^v/, '').split('.'); +const hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12); +exports.useNativeSync = !hasNative + ? () => false + : (opts) => (0, opts_arg_js_1.optsArg)(opts).mkdirSync === fs_1.mkdirSync; +exports.useNative = Object.assign(!hasNative + ? () => false + : (opts) => (0, opts_arg_js_1.optsArg)(opts).mkdir === fs_1.mkdir, { + sync: exports.useNativeSync, +}); +//# sourceMappingURL=use-native.js.map +/***/ }), - /** @type {import('./eval')} */ - module.exports = EvalError; +/***/ 8119: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/** + * @license node-stream-zip | (c) 2020 Antelle | https://github.com/antelle/node-stream-zip/blob/master/LICENSE + * Portions copyright https://github.com/cthackers/adm-zip | https://raw.githubusercontent.com/cthackers/adm-zip/master/LICENSE + */ + +let fs = __nccwpck_require__(7147); +const util = __nccwpck_require__(3837); +const path = __nccwpck_require__(1017); +const events = __nccwpck_require__(2361); +const zlib = __nccwpck_require__(9796); +const stream = __nccwpck_require__(2781); + +const consts = { + /* The local file header */ + LOCHDR: 30, // LOC header size + LOCSIG: 0x04034b50, // "PK\003\004" + LOCVER: 4, // version needed to extract + LOCFLG: 6, // general purpose bit flag + LOCHOW: 8, // compression method + LOCTIM: 10, // modification time (2 bytes time, 2 bytes date) + LOCCRC: 14, // uncompressed file crc-32 value + LOCSIZ: 18, // compressed size + LOCLEN: 22, // uncompressed size + LOCNAM: 26, // filename length + LOCEXT: 28, // extra field length + + /* The Data descriptor */ + EXTSIG: 0x08074b50, // "PK\007\008" + EXTHDR: 16, // EXT header size + EXTCRC: 4, // uncompressed file crc-32 value + EXTSIZ: 8, // compressed size + EXTLEN: 12, // uncompressed size + + /* The central directory file header */ + CENHDR: 46, // CEN header size + CENSIG: 0x02014b50, // "PK\001\002" + CENVEM: 4, // version made by + CENVER: 6, // version needed to extract + CENFLG: 8, // encrypt, decrypt flags + CENHOW: 10, // compression method + CENTIM: 12, // modification time (2 bytes time, 2 bytes date) + CENCRC: 16, // uncompressed file crc-32 value + CENSIZ: 20, // compressed size + CENLEN: 24, // uncompressed size + CENNAM: 28, // filename length + CENEXT: 30, // extra field length + CENCOM: 32, // file comment length + CENDSK: 34, // volume number start + CENATT: 36, // internal file attributes + CENATX: 38, // external file attributes (host system dependent) + CENOFF: 42, // LOC header offset + + /* The entries in the end of central directory */ + ENDHDR: 22, // END header size + ENDSIG: 0x06054b50, // "PK\005\006" + ENDSIGFIRST: 0x50, + ENDSUB: 8, // number of entries on this disk + ENDTOT: 10, // total number of entries + ENDSIZ: 12, // central directory size in bytes + ENDOFF: 16, // offset of first CEN header + ENDCOM: 20, // zip file comment length + MAXFILECOMMENT: 0xffff, + + /* The entries in the end of ZIP64 central directory locator */ + ENDL64HDR: 20, // ZIP64 end of central directory locator header size + ENDL64SIG: 0x07064b50, // ZIP64 end of central directory locator signature + ENDL64SIGFIRST: 0x50, + ENDL64OFS: 8, // ZIP64 end of central directory offset + + /* The entries in the end of ZIP64 central directory */ + END64HDR: 56, // ZIP64 end of central directory header size + END64SIG: 0x06064b50, // ZIP64 end of central directory signature + END64SIGFIRST: 0x50, + END64SUB: 24, // number of entries on this disk + END64TOT: 32, // total number of entries + END64SIZ: 40, + END64OFF: 48, + + /* Compression methods */ + STORED: 0, // no compression + SHRUNK: 1, // shrunk + REDUCED1: 2, // reduced with compression factor 1 + REDUCED2: 3, // reduced with compression factor 2 + REDUCED3: 4, // reduced with compression factor 3 + REDUCED4: 5, // reduced with compression factor 4 + IMPLODED: 6, // imploded + // 7 reserved + DEFLATED: 8, // deflated + ENHANCED_DEFLATED: 9, // deflate64 + PKWARE: 10, // PKWare DCL imploded + // 11 reserved + BZIP2: 12, // compressed using BZIP2 + // 13 reserved + LZMA: 14, // LZMA + // 15-17 reserved + IBM_TERSE: 18, // compressed using IBM TERSE + IBM_LZ77: 19, //IBM LZ77 z + + /* General purpose bit flag */ + FLG_ENC: 0, // encrypted file + FLG_COMP1: 1, // compression option + FLG_COMP2: 2, // compression option + FLG_DESC: 4, // data descriptor + FLG_ENH: 8, // enhanced deflation + FLG_STR: 16, // strong encryption + FLG_LNG: 1024, // language encoding + FLG_MSK: 4096, // mask header values + FLG_ENTRY_ENC: 1, + + /* 4.5 Extensible data fields */ + EF_ID: 0, + EF_SIZE: 2, + + /* Header IDs */ + ID_ZIP64: 0x0001, + ID_AVINFO: 0x0007, + ID_PFS: 0x0008, + ID_OS2: 0x0009, + ID_NTFS: 0x000a, + ID_OPENVMS: 0x000c, + ID_UNIX: 0x000d, + ID_FORK: 0x000e, + ID_PATCH: 0x000f, + ID_X509_PKCS7: 0x0014, + ID_X509_CERTID_F: 0x0015, + ID_X509_CERTID_C: 0x0016, + ID_STRONGENC: 0x0017, + ID_RECORD_MGT: 0x0018, + ID_X509_PKCS7_RL: 0x0019, + ID_IBM1: 0x0065, + ID_IBM2: 0x0066, + ID_POSZIP: 0x4690, + + EF_ZIP64_OR_32: 0xffffffff, + EF_ZIP64_OR_16: 0xffff, +}; - /***/ -}), +const StreamZip = function (config) { + let fd, fileSize, chunkSize, op, centralDirectory, closed; + const ready = false, + that = this, + entries = config.storeEntries !== false ? {} : null, + fileName = config.file, + textDecoder = config.nameEncoding ? new TextDecoder(config.nameEncoding) : null; + + open(); + + function open() { + if (config.fd) { + fd = config.fd; + readFile(); + } else { + fs.open(fileName, 'r', (err, f) => { + if (err) { + return that.emit('error', err); + } + fd = f; + readFile(); + }); + } + } + + function readFile() { + fs.fstat(fd, (err, stat) => { + if (err) { + return that.emit('error', err); + } + fileSize = stat.size; + chunkSize = config.chunkSize || Math.round(fileSize / 1000); + chunkSize = Math.max( + Math.min(chunkSize, Math.min(128 * 1024, fileSize)), + Math.min(1024, fileSize) + ); + readCentralDirectory(); + }); + } + + function readUntilFoundCallback(err, bytesRead) { + if (err || !bytesRead) { + return that.emit('error', err || new Error('Archive read error')); + } + let pos = op.lastPos; + let bufferPosition = pos - op.win.position; + const buffer = op.win.buffer; + const minPos = op.minPos; + while (--pos >= minPos && --bufferPosition >= 0) { + if (buffer.length - bufferPosition >= 4 && buffer[bufferPosition] === op.firstByte) { + // quick check first signature byte + if (buffer.readUInt32LE(bufferPosition) === op.sig) { + op.lastBufferPosition = bufferPosition; + op.lastBytesRead = bytesRead; + op.complete(); + return; + } + } + } + if (pos === minPos) { + return that.emit('error', new Error('Bad archive')); + } + op.lastPos = pos + 1; + op.chunkSize *= 2; + if (pos <= minPos) { + return that.emit('error', new Error('Bad archive')); + } + const expandLength = Math.min(op.chunkSize, pos - minPos); + op.win.expandLeft(expandLength, readUntilFoundCallback); + } + + function readCentralDirectory() { + const totalReadLength = Math.min(consts.ENDHDR + consts.MAXFILECOMMENT, fileSize); + op = { + win: new FileWindowBuffer(fd), + totalReadLength, + minPos: fileSize - totalReadLength, + lastPos: fileSize, + chunkSize: Math.min(1024, chunkSize), + firstByte: consts.ENDSIGFIRST, + sig: consts.ENDSIG, + complete: readCentralDirectoryComplete, + }; + op.win.read(fileSize - op.chunkSize, op.chunkSize, readUntilFoundCallback); + } + + function readCentralDirectoryComplete() { + const buffer = op.win.buffer; + const pos = op.lastBufferPosition; + try { + centralDirectory = new CentralDirectoryHeader(); + centralDirectory.read(buffer.slice(pos, pos + consts.ENDHDR)); + centralDirectory.headerOffset = op.win.position + pos; + if (centralDirectory.commentLength) { + that.comment = buffer + .slice( + pos + consts.ENDHDR, + pos + consts.ENDHDR + centralDirectory.commentLength + ) + .toString(); + } else { + that.comment = null; + } + that.entriesCount = centralDirectory.volumeEntries; + that.centralDirectory = centralDirectory; + if ( + (centralDirectory.volumeEntries === consts.EF_ZIP64_OR_16 && + centralDirectory.totalEntries === consts.EF_ZIP64_OR_16) || + centralDirectory.size === consts.EF_ZIP64_OR_32 || + centralDirectory.offset === consts.EF_ZIP64_OR_32 + ) { + readZip64CentralDirectoryLocator(); + } else { + op = {}; + readEntries(); + } + } catch (err) { + that.emit('error', err); + } + } + + function readZip64CentralDirectoryLocator() { + const length = consts.ENDL64HDR; + if (op.lastBufferPosition > length) { + op.lastBufferPosition -= length; + readZip64CentralDirectoryLocatorComplete(); + } else { + op = { + win: op.win, + totalReadLength: length, + minPos: op.win.position - length, + lastPos: op.win.position, + chunkSize: op.chunkSize, + firstByte: consts.ENDL64SIGFIRST, + sig: consts.ENDL64SIG, + complete: readZip64CentralDirectoryLocatorComplete, + }; + op.win.read(op.lastPos - op.chunkSize, op.chunkSize, readUntilFoundCallback); + } + } + + function readZip64CentralDirectoryLocatorComplete() { + const buffer = op.win.buffer; + const locHeader = new CentralDirectoryLoc64Header(); + locHeader.read( + buffer.slice(op.lastBufferPosition, op.lastBufferPosition + consts.ENDL64HDR) + ); + const readLength = fileSize - locHeader.headerOffset; + op = { + win: op.win, + totalReadLength: readLength, + minPos: locHeader.headerOffset, + lastPos: op.lastPos, + chunkSize: op.chunkSize, + firstByte: consts.END64SIGFIRST, + sig: consts.END64SIG, + complete: readZip64CentralDirectoryComplete, + }; + op.win.read(fileSize - op.chunkSize, op.chunkSize, readUntilFoundCallback); + } + + function readZip64CentralDirectoryComplete() { + const buffer = op.win.buffer; + const zip64cd = new CentralDirectoryZip64Header(); + zip64cd.read(buffer.slice(op.lastBufferPosition, op.lastBufferPosition + consts.END64HDR)); + that.centralDirectory.volumeEntries = zip64cd.volumeEntries; + that.centralDirectory.totalEntries = zip64cd.totalEntries; + that.centralDirectory.size = zip64cd.size; + that.centralDirectory.offset = zip64cd.offset; + that.entriesCount = zip64cd.volumeEntries; + op = {}; + readEntries(); + } + + function readEntries() { + op = { + win: new FileWindowBuffer(fd), + pos: centralDirectory.offset, + chunkSize, + entriesLeft: centralDirectory.volumeEntries, + }; + op.win.read(op.pos, Math.min(chunkSize, fileSize - op.pos), readEntriesCallback); + } + + function readEntriesCallback(err, bytesRead) { + if (err || !bytesRead) { + return that.emit('error', err || new Error('Entries read error')); + } + let bufferPos = op.pos - op.win.position; + let entry = op.entry; + const buffer = op.win.buffer; + const bufferLength = buffer.length; + try { + while (op.entriesLeft > 0) { + if (!entry) { + entry = new ZipEntry(); + entry.readHeader(buffer, bufferPos); + entry.headerOffset = op.win.position + bufferPos; + op.entry = entry; + op.pos += consts.CENHDR; + bufferPos += consts.CENHDR; + } + const entryHeaderSize = entry.fnameLen + entry.extraLen + entry.comLen; + const advanceBytes = entryHeaderSize + (op.entriesLeft > 1 ? consts.CENHDR : 0); + if (bufferLength - bufferPos < advanceBytes) { + op.win.moveRight(chunkSize, readEntriesCallback, bufferPos); + op.move = true; + return; + } + entry.read(buffer, bufferPos, textDecoder); + if (!config.skipEntryNameValidation) { + entry.validateName(); + } + if (entries) { + entries[entry.name] = entry; + } + that.emit('entry', entry); + op.entry = entry = null; + op.entriesLeft--; + op.pos += entryHeaderSize; + bufferPos += entryHeaderSize; + } + that.emit('ready'); + } catch (err) { + that.emit('error', err); + } + } + + function checkEntriesExist() { + if (!entries) { + throw new Error('storeEntries disabled'); + } + } + + Object.defineProperty(this, 'ready', { + get() { + return ready; + }, + }); + + this.entry = function (name) { + checkEntriesExist(); + return entries[name]; + }; + + this.entries = function () { + checkEntriesExist(); + return entries; + }; + + this.stream = function (entry, callback) { + return this.openEntry( + entry, + (err, entry) => { + if (err) { + return callback(err); + } + const offset = dataOffset(entry); + let entryStream = new EntryDataReaderStream(fd, offset, entry.compressedSize); + if (entry.method === consts.STORED) { + // nothing to do + } else if (entry.method === consts.DEFLATED) { + entryStream = entryStream.pipe(zlib.createInflateRaw()); + } else { + return callback(new Error('Unknown compression method: ' + entry.method)); + } + if (canVerifyCrc(entry)) { + entryStream = entryStream.pipe( + new EntryVerifyStream(entryStream, entry.crc, entry.size) + ); + } + callback(null, entryStream); + }, + false + ); + }; + + this.entryDataSync = function (entry) { + let err = null; + this.openEntry( + entry, + (e, en) => { + err = e; + entry = en; + }, + true + ); + if (err) { + throw err; + } + let data = Buffer.alloc(entry.compressedSize); + new FsRead(fd, data, 0, entry.compressedSize, dataOffset(entry), (e) => { + err = e; + }).read(true); + if (err) { + throw err; + } + if (entry.method === consts.STORED) { + // nothing to do + } else if (entry.method === consts.DEFLATED || entry.method === consts.ENHANCED_DEFLATED) { + data = zlib.inflateRawSync(data); + } else { + throw new Error('Unknown compression method: ' + entry.method); + } + if (data.length !== entry.size) { + throw new Error('Invalid size'); + } + if (canVerifyCrc(entry)) { + const verify = new CrcVerify(entry.crc, entry.size); + verify.data(data); + } + return data; + }; + + this.openEntry = function (entry, callback, sync) { + if (typeof entry === 'string') { + checkEntriesExist(); + entry = entries[entry]; + if (!entry) { + return callback(new Error('Entry not found')); + } + } + if (!entry.isFile) { + return callback(new Error('Entry is not file')); + } + if (!fd) { + return callback(new Error('Archive closed')); + } + const buffer = Buffer.alloc(consts.LOCHDR); + new FsRead(fd, buffer, 0, buffer.length, entry.offset, (err) => { + if (err) { + return callback(err); + } + let readEx; + try { + entry.readDataHeader(buffer); + if (entry.encrypted) { + readEx = new Error('Entry encrypted'); + } + } catch (ex) { + readEx = ex; + } + callback(readEx, entry); + }).read(sync); + }; + + function dataOffset(entry) { + return entry.offset + consts.LOCHDR + entry.fnameLen + entry.extraLen; + } + + function canVerifyCrc(entry) { + // if bit 3 (0x08) of the general-purpose flags field is set, then the CRC-32 and file sizes are not known when the header is written + return (entry.flags & 0x8) !== 0x8; + } + + function extract(entry, outPath, callback) { + that.stream(entry, (err, stm) => { + if (err) { + callback(err); + } else { + let fsStm, errThrown; + stm.on('error', (err) => { + errThrown = err; + if (fsStm) { + stm.unpipe(fsStm); + fsStm.close(() => { + callback(err); + }); + } + }); + fs.open(outPath, 'w', (err, fdFile) => { + if (err) { + return callback(err); + } + if (errThrown) { + fs.close(fd, () => { + callback(errThrown); + }); + return; + } + fsStm = fs.createWriteStream(outPath, { fd: fdFile }); + fsStm.on('finish', () => { + that.emit('extract', entry, outPath); + if (!errThrown) { + callback(); + } + }); + stm.pipe(fsStm); + }); + } + }); + } + + function createDirectories(baseDir, dirs, callback) { + if (!dirs.length) { + return callback(); + } + let dir = dirs.shift(); + dir = path.join(baseDir, path.join(...dir)); + fs.mkdir(dir, { recursive: true }, (err) => { + if (err && err.code !== 'EEXIST') { + return callback(err); + } + createDirectories(baseDir, dirs, callback); + }); + } + + function extractFiles(baseDir, baseRelPath, files, callback, extractedCount) { + if (!files.length) { + return callback(null, extractedCount); + } + const file = files.shift(); + const targetPath = path.join(baseDir, file.name.replace(baseRelPath, '')); + extract(file, targetPath, (err) => { + if (err) { + return callback(err, extractedCount); + } + extractFiles(baseDir, baseRelPath, files, callback, extractedCount + 1); + }); + } + + this.extract = function (entry, outPath, callback) { + let entryName = entry || ''; + if (typeof entry === 'string') { + entry = this.entry(entry); + if (entry) { + entryName = entry.name; + } else { + if (entryName.length && entryName[entryName.length - 1] !== '/') { + entryName += '/'; + } + } + } + if (!entry || entry.isDirectory) { + const files = [], + dirs = [], + allDirs = {}; + for (const e in entries) { + if ( + Object.prototype.hasOwnProperty.call(entries, e) && + e.lastIndexOf(entryName, 0) === 0 + ) { + let relPath = e.replace(entryName, ''); + const childEntry = entries[e]; + if (childEntry.isFile) { + files.push(childEntry); + relPath = path.dirname(relPath); + } + if (relPath && !allDirs[relPath] && relPath !== '.') { + allDirs[relPath] = true; + let parts = relPath.split('/').filter((f) => { + return f; + }); + if (parts.length) { + dirs.push(parts); + } + while (parts.length > 1) { + parts = parts.slice(0, parts.length - 1); + const partsPath = parts.join('/'); + if (allDirs[partsPath] || partsPath === '.') { + break; + } + allDirs[partsPath] = true; + dirs.push(parts); + } + } + } + } + dirs.sort((x, y) => { + return x.length - y.length; + }); + if (dirs.length) { + createDirectories(outPath, dirs, (err) => { + if (err) { + callback(err); + } else { + extractFiles(outPath, entryName, files, callback, 0); + } + }); + } else { + extractFiles(outPath, entryName, files, callback, 0); + } + } else { + fs.stat(outPath, (err, stat) => { + if (stat && stat.isDirectory()) { + extract(entry, path.join(outPath, path.basename(entry.name)), callback); + } else { + extract(entry, outPath, callback); + } + }); + } + }; + + this.close = function (callback) { + if (closed || !fd) { + closed = true; + if (callback) { + callback(); + } + } else { + closed = true; + fs.close(fd, (err) => { + fd = null; + if (callback) { + callback(err); + } + }); + } + }; + + const originalEmit = events.EventEmitter.prototype.emit; + this.emit = function (...args) { + if (!closed) { + return originalEmit.call(this, ...args); + } + }; +}; -/***/ 8015: -/***/ ((module) => { +StreamZip.setFs = function (customFs) { + fs = customFs; +}; - "use strict"; +StreamZip.debugLog = (...args) => { + if (StreamZip.debug) { + // eslint-disable-next-line no-console + console.log(...args); + } +}; +util.inherits(StreamZip, events.EventEmitter); - /** @type {import('.')} */ - module.exports = Error; +const propZip = Symbol('zip'); +StreamZip.async = class StreamZipAsync extends events.EventEmitter { + constructor(config) { + super(); - /***/ -}), + const zip = new StreamZip(config); -/***/ 4415: -/***/ ((module) => { + zip.on('entry', (entry) => this.emit('entry', entry)); + zip.on('extract', (entry, outPath) => this.emit('extract', entry, outPath)); - "use strict"; + this[propZip] = new Promise((resolve, reject) => { + zip.on('ready', () => { + zip.removeListener('error', reject); + resolve(zip); + }); + zip.on('error', reject); + }); + } + get entriesCount() { + return this[propZip].then((zip) => zip.entriesCount); + } - /** @type {import('./range')} */ - module.exports = RangeError; + get comment() { + return this[propZip].then((zip) => zip.comment); + } + async entry(name) { + const zip = await this[propZip]; + return zip.entry(name); + } - /***/ -}), + async entries() { + const zip = await this[propZip]; + return zip.entries(); + } -/***/ 6279: -/***/ ((module) => { + async stream(entry) { + const zip = await this[propZip]; + return new Promise((resolve, reject) => { + zip.stream(entry, (err, stm) => { + if (err) { + reject(err); + } else { + resolve(stm); + } + }); + }); + } + + async entryData(entry) { + const stm = await this.stream(entry); + return new Promise((resolve, reject) => { + const data = []; + stm.on('data', (chunk) => data.push(chunk)); + stm.on('end', () => { + resolve(Buffer.concat(data)); + }); + stm.on('error', (err) => { + stm.removeAllListeners('end'); + reject(err); + }); + }); + } + + async extract(entry, outPath) { + const zip = await this[propZip]; + return new Promise((resolve, reject) => { + zip.extract(entry, outPath, (err, res) => { + if (err) { + reject(err); + } else { + resolve(res); + } + }); + }); + } + + async close() { + const zip = await this[propZip]; + return new Promise((resolve, reject) => { + zip.close((err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + }); + } +}; - "use strict"; +class CentralDirectoryHeader { + read(data) { + if (data.length !== consts.ENDHDR || data.readUInt32LE(0) !== consts.ENDSIG) { + throw new Error('Invalid central directory'); + } + // number of entries on this volume + this.volumeEntries = data.readUInt16LE(consts.ENDSUB); + // total number of entries + this.totalEntries = data.readUInt16LE(consts.ENDTOT); + // central directory size in bytes + this.size = data.readUInt32LE(consts.ENDSIZ); + // offset of first CEN header + this.offset = data.readUInt32LE(consts.ENDOFF); + // zip file comment length + this.commentLength = data.readUInt16LE(consts.ENDCOM); + } +} +class CentralDirectoryLoc64Header { + read(data) { + if (data.length !== consts.ENDL64HDR || data.readUInt32LE(0) !== consts.ENDL64SIG) { + throw new Error('Invalid zip64 central directory locator'); + } + // ZIP64 EOCD header offset + this.headerOffset = readUInt64LE(data, consts.ENDSUB); + } +} - /** @type {import('./ref')} */ - module.exports = ReferenceError; +class CentralDirectoryZip64Header { + read(data) { + if (data.length !== consts.END64HDR || data.readUInt32LE(0) !== consts.END64SIG) { + throw new Error('Invalid central directory'); + } + // number of entries on this volume + this.volumeEntries = readUInt64LE(data, consts.END64SUB); + // total number of entries + this.totalEntries = readUInt64LE(data, consts.END64TOT); + // central directory size in bytes + this.size = readUInt64LE(data, consts.END64SIZ); + // offset of first CEN header + this.offset = readUInt64LE(data, consts.END64OFF); + } +} +class ZipEntry { + readHeader(data, offset) { + // data should be 46 bytes and start with "PK 01 02" + if (data.length < offset + consts.CENHDR || data.readUInt32LE(offset) !== consts.CENSIG) { + throw new Error('Invalid entry header'); + } + // version made by + this.verMade = data.readUInt16LE(offset + consts.CENVEM); + // version needed to extract + this.version = data.readUInt16LE(offset + consts.CENVER); + // encrypt, decrypt flags + this.flags = data.readUInt16LE(offset + consts.CENFLG); + // compression method + this.method = data.readUInt16LE(offset + consts.CENHOW); + // modification time (2 bytes time, 2 bytes date) + const timebytes = data.readUInt16LE(offset + consts.CENTIM); + const datebytes = data.readUInt16LE(offset + consts.CENTIM + 2); + this.time = parseZipTime(timebytes, datebytes); + + // uncompressed file crc-32 value + this.crc = data.readUInt32LE(offset + consts.CENCRC); + // compressed size + this.compressedSize = data.readUInt32LE(offset + consts.CENSIZ); + // uncompressed size + this.size = data.readUInt32LE(offset + consts.CENLEN); + // filename length + this.fnameLen = data.readUInt16LE(offset + consts.CENNAM); + // extra field length + this.extraLen = data.readUInt16LE(offset + consts.CENEXT); + // file comment length + this.comLen = data.readUInt16LE(offset + consts.CENCOM); + // volume number start + this.diskStart = data.readUInt16LE(offset + consts.CENDSK); + // internal file attributes + this.inattr = data.readUInt16LE(offset + consts.CENATT); + // external file attributes + this.attr = data.readUInt32LE(offset + consts.CENATX); + // LOC header offset + this.offset = data.readUInt32LE(offset + consts.CENOFF); + } + + readDataHeader(data) { + // 30 bytes and should start with "PK\003\004" + if (data.readUInt32LE(0) !== consts.LOCSIG) { + throw new Error('Invalid local header'); + } + // version needed to extract + this.version = data.readUInt16LE(consts.LOCVER); + // general purpose bit flag + this.flags = data.readUInt16LE(consts.LOCFLG); + // compression method + this.method = data.readUInt16LE(consts.LOCHOW); + // modification time (2 bytes time ; 2 bytes date) + const timebytes = data.readUInt16LE(consts.LOCTIM); + const datebytes = data.readUInt16LE(consts.LOCTIM + 2); + this.time = parseZipTime(timebytes, datebytes); + + // uncompressed file crc-32 value + this.crc = data.readUInt32LE(consts.LOCCRC) || this.crc; + // compressed size + const compressedSize = data.readUInt32LE(consts.LOCSIZ); + if (compressedSize && compressedSize !== consts.EF_ZIP64_OR_32) { + this.compressedSize = compressedSize; + } + // uncompressed size + const size = data.readUInt32LE(consts.LOCLEN); + if (size && size !== consts.EF_ZIP64_OR_32) { + this.size = size; + } + // filename length + this.fnameLen = data.readUInt16LE(consts.LOCNAM); + // extra field length + this.extraLen = data.readUInt16LE(consts.LOCEXT); + } + + read(data, offset, textDecoder) { + const nameData = data.slice(offset, (offset += this.fnameLen)); + this.name = textDecoder + ? textDecoder.decode(new Uint8Array(nameData)) + : nameData.toString('utf8'); + const lastChar = data[offset - 1]; + this.isDirectory = lastChar === 47 || lastChar === 92; + + if (this.extraLen) { + this.readExtra(data, offset); + offset += this.extraLen; + } + this.comment = this.comLen ? data.slice(offset, offset + this.comLen).toString() : null; + } + + validateName() { + if (/\\|^\w+:|^\/|(^|\/)\.\.(\/|$)/.test(this.name)) { + throw new Error('Malicious entry: ' + this.name); + } + } + + readExtra(data, offset) { + let signature, size; + const maxPos = offset + this.extraLen; + while (offset < maxPos) { + signature = data.readUInt16LE(offset); + offset += 2; + size = data.readUInt16LE(offset); + offset += 2; + if (consts.ID_ZIP64 === signature) { + this.parseZip64Extra(data, offset, size); + } + offset += size; + } + } + + parseZip64Extra(data, offset, length) { + if (length >= 8 && this.size === consts.EF_ZIP64_OR_32) { + this.size = readUInt64LE(data, offset); + offset += 8; + length -= 8; + } + if (length >= 8 && this.compressedSize === consts.EF_ZIP64_OR_32) { + this.compressedSize = readUInt64LE(data, offset); + offset += 8; + length -= 8; + } + if (length >= 8 && this.offset === consts.EF_ZIP64_OR_32) { + this.offset = readUInt64LE(data, offset); + offset += 8; + length -= 8; + } + if (length >= 4 && this.diskStart === consts.EF_ZIP64_OR_16) { + this.diskStart = data.readUInt32LE(offset); + // offset += 4; length -= 4; + } + } + + get encrypted() { + return (this.flags & consts.FLG_ENTRY_ENC) === consts.FLG_ENTRY_ENC; + } + + get isFile() { + return !this.isDirectory; + } +} - /***/ -}), +class FsRead { + constructor(fd, buffer, offset, length, position, callback) { + this.fd = fd; + this.buffer = buffer; + this.offset = offset; + this.length = length; + this.position = position; + this.callback = callback; + this.bytesRead = 0; + this.waiting = false; + } + + read(sync) { + StreamZip.debugLog('read', this.position, this.bytesRead, this.length, this.offset); + this.waiting = true; + let err; + if (sync) { + let bytesRead = 0; + try { + bytesRead = fs.readSync( + this.fd, + this.buffer, + this.offset + this.bytesRead, + this.length - this.bytesRead, + this.position + this.bytesRead + ); + } catch (e) { + err = e; + } + this.readCallback(sync, err, err ? bytesRead : null); + } else { + fs.read( + this.fd, + this.buffer, + this.offset + this.bytesRead, + this.length - this.bytesRead, + this.position + this.bytesRead, + this.readCallback.bind(this, sync) + ); + } + } + + readCallback(sync, err, bytesRead) { + if (typeof bytesRead === 'number') { + this.bytesRead += bytesRead; + } + if (err || !bytesRead || this.bytesRead === this.length) { + this.waiting = false; + return this.callback(err, this.bytesRead); + } else { + this.read(sync); + } + } +} -/***/ 5474: -/***/ ((module) => { +class FileWindowBuffer { + constructor(fd) { + this.position = 0; + this.buffer = Buffer.alloc(0); + this.fd = fd; + this.fsOp = null; + } + + checkOp() { + if (this.fsOp && this.fsOp.waiting) { + throw new Error('Operation in progress'); + } + } + + read(pos, length, callback) { + this.checkOp(); + if (this.buffer.length < length) { + this.buffer = Buffer.alloc(length); + } + this.position = pos; + this.fsOp = new FsRead(this.fd, this.buffer, 0, length, this.position, callback).read(); + } + + expandLeft(length, callback) { + this.checkOp(); + this.buffer = Buffer.concat([Buffer.alloc(length), this.buffer]); + this.position -= length; + if (this.position < 0) { + this.position = 0; + } + this.fsOp = new FsRead(this.fd, this.buffer, 0, length, this.position, callback).read(); + } + + expandRight(length, callback) { + this.checkOp(); + const offset = this.buffer.length; + this.buffer = Buffer.concat([this.buffer, Buffer.alloc(length)]); + this.fsOp = new FsRead( + this.fd, + this.buffer, + offset, + length, + this.position + offset, + callback + ).read(); + } + + moveRight(length, callback, shift) { + this.checkOp(); + if (shift) { + this.buffer.copy(this.buffer, 0, shift); + } else { + shift = 0; + } + this.position += shift; + this.fsOp = new FsRead( + this.fd, + this.buffer, + this.buffer.length - shift, + shift, + this.position + this.buffer.length - shift, + callback + ).read(); + } +} - "use strict"; +class EntryDataReaderStream extends stream.Readable { + constructor(fd, offset, length) { + super(); + this.fd = fd; + this.offset = offset; + this.length = length; + this.pos = 0; + this.readCallback = this.readCallback.bind(this); + } + + _read(n) { + const buffer = Buffer.alloc(Math.min(n, this.length - this.pos)); + if (buffer.length) { + fs.read(this.fd, buffer, 0, buffer.length, this.offset + this.pos, this.readCallback); + } else { + this.push(null); + } + } + + readCallback(err, bytesRead, buffer) { + this.pos += bytesRead; + if (err) { + this.emit('error', err); + this.push(null); + } else if (!bytesRead) { + this.push(null); + } else { + if (bytesRead !== buffer.length) { + buffer = buffer.slice(0, bytesRead); + } + this.push(buffer); + } + } +} +class EntryVerifyStream extends stream.Transform { + constructor(baseStm, crc, size) { + super(); + this.verify = new CrcVerify(crc, size); + baseStm.on('error', (e) => { + this.emit('error', e); + }); + } + + _transform(data, encoding, callback) { + let err; + try { + this.verify.data(data); + } catch (e) { + err = e; + } + callback(err, data); + } +} - /** @type {import('./syntax')} */ - module.exports = SyntaxError; +class CrcVerify { + constructor(crc, size) { + this.crc = crc; + this.size = size; + this.state = { + crc: ~0, + size: 0, + }; + } + + data(data) { + const crcTable = CrcVerify.getCrcTable(); + let crc = this.state.crc; + let off = 0; + let len = data.length; + while (--len >= 0) { + crc = crcTable[(crc ^ data[off++]) & 0xff] ^ (crc >>> 8); + } + this.state.crc = crc; + this.state.size += data.length; + if (this.state.size >= this.size) { + const buf = Buffer.alloc(4); + buf.writeInt32LE(~this.state.crc & 0xffffffff, 0); + crc = buf.readUInt32LE(0); + if (crc !== this.crc) { + throw new Error('Invalid CRC'); + } + if (this.state.size !== this.size) { + throw new Error('Invalid size'); + } + } + } + + static getCrcTable() { + let crcTable = CrcVerify.crcTable; + if (!crcTable) { + CrcVerify.crcTable = crcTable = []; + const b = Buffer.alloc(4); + for (let n = 0; n < 256; n++) { + let c = n; + for (let k = 8; --k >= 0; ) { + if ((c & 1) !== 0) { + c = 0xedb88320 ^ (c >>> 1); + } else { + c = c >>> 1; + } + } + if (c < 0) { + b.writeInt32LE(c, 0); + c = b.readUInt32LE(0); + } + crcTable[n] = c; + } + } + return crcTable; + } +} +function parseZipTime(timebytes, datebytes) { + const timebits = toBits(timebytes, 16); + const datebits = toBits(datebytes, 16); + + const mt = { + h: parseInt(timebits.slice(0, 5).join(''), 2), + m: parseInt(timebits.slice(5, 11).join(''), 2), + s: parseInt(timebits.slice(11, 16).join(''), 2) * 2, + Y: parseInt(datebits.slice(0, 7).join(''), 2) + 1980, + M: parseInt(datebits.slice(7, 11).join(''), 2), + D: parseInt(datebits.slice(11, 16).join(''), 2), + }; + const dt_str = [mt.Y, mt.M, mt.D].join('-') + ' ' + [mt.h, mt.m, mt.s].join(':') + ' GMT+0'; + return new Date(dt_str).getTime(); +} - /***/ -}), +function toBits(dec, size) { + let b = (dec >>> 0).toString(2); + while (b.length < size) { + b = '0' + b; + } + return b.split(''); +} -/***/ 6361: -/***/ ((module) => { +function readUInt64LE(buffer, offset) { + return buffer.readUInt32LE(offset + 4) * 0x0000000100000000 + buffer.readUInt32LE(offset); +} - "use strict"; +module.exports = StreamZip; - /** @type {import('./type')} */ - module.exports = TypeError; +/***/ }), +/***/ 504: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - /***/ -}), +var hasMap = typeof Map === 'function' && Map.prototype; +var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null; +var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null; +var mapForEach = hasMap && Map.prototype.forEach; +var hasSet = typeof Set === 'function' && Set.prototype; +var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null; +var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null; +var setForEach = hasSet && Set.prototype.forEach; +var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype; +var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null; +var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype; +var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null; +var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype; +var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null; +var booleanValueOf = Boolean.prototype.valueOf; +var objectToString = Object.prototype.toString; +var functionToString = Function.prototype.toString; +var $match = String.prototype.match; +var $slice = String.prototype.slice; +var $replace = String.prototype.replace; +var $toUpperCase = String.prototype.toUpperCase; +var $toLowerCase = String.prototype.toLowerCase; +var $test = RegExp.prototype.test; +var $concat = Array.prototype.concat; +var $join = Array.prototype.join; +var $arrSlice = Array.prototype.slice; +var $floor = Math.floor; +var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null; +var gOPS = Object.getOwnPropertySymbols; +var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null; +var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object'; +// ie, `has-tostringtag/shams +var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol') + ? Symbol.toStringTag + : null; +var isEnumerable = Object.prototype.propertyIsEnumerable; + +var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || ( + [].__proto__ === Array.prototype // eslint-disable-line no-proto + ? function (O) { + return O.__proto__; // eslint-disable-line no-proto + } + : null +); + +function addNumericSeparator(num, str) { + if ( + num === Infinity + || num === -Infinity + || num !== num + || (num && num > -1000 && num < 1000) + || $test.call(/e/, str) + ) { + return str; + } + var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g; + if (typeof num === 'number') { + var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num) + if (int !== num) { + var intStr = String(int); + var dec = $slice.call(str, intStr.length + 1); + return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, ''); + } + } + return $replace.call(str, sepRegex, '$&_'); +} -/***/ 5065: -/***/ ((module) => { +var utilInspect = __nccwpck_require__(7265); +var inspectCustom = utilInspect.custom; +var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null; + +module.exports = function inspect_(obj, options, depth, seen) { + var opts = options || {}; + + if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) { + throw new TypeError('option "quoteStyle" must be "single" or "double"'); + } + if ( + has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number' + ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity + : opts.maxStringLength !== null + ) + ) { + throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`'); + } + var customInspect = has(opts, 'customInspect') ? opts.customInspect : true; + if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') { + throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`'); + } + + if ( + has(opts, 'indent') + && opts.indent !== null + && opts.indent !== '\t' + && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0) + ) { + throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`'); + } + if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') { + throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`'); + } + var numericSeparator = opts.numericSeparator; + + if (typeof obj === 'undefined') { + return 'undefined'; + } + if (obj === null) { + return 'null'; + } + if (typeof obj === 'boolean') { + return obj ? 'true' : 'false'; + } + + if (typeof obj === 'string') { + return inspectString(obj, opts); + } + if (typeof obj === 'number') { + if (obj === 0) { + return Infinity / obj > 0 ? '0' : '-0'; + } + var str = String(obj); + return numericSeparator ? addNumericSeparator(obj, str) : str; + } + if (typeof obj === 'bigint') { + var bigIntStr = String(obj) + 'n'; + return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr; + } + + var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth; + if (typeof depth === 'undefined') { depth = 0; } + if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') { + return isArray(obj) ? '[Array]' : '[Object]'; + } + + var indent = getIndent(opts, depth); + + if (typeof seen === 'undefined') { + seen = []; + } else if (indexOf(seen, obj) >= 0) { + return '[Circular]'; + } + + function inspect(value, from, noIndent) { + if (from) { + seen = $arrSlice.call(seen); + seen.push(from); + } + if (noIndent) { + var newOpts = { + depth: opts.depth + }; + if (has(opts, 'quoteStyle')) { + newOpts.quoteStyle = opts.quoteStyle; + } + return inspect_(value, newOpts, depth + 1, seen); + } + return inspect_(value, opts, depth + 1, seen); + } + + if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable + var name = nameOf(obj); + var keys = arrObjKeys(obj, inspect); + return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : ''); + } + if (isSymbol(obj)) { + var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj); + return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString; + } + if (isElement(obj)) { + var s = '<' + $toLowerCase.call(String(obj.nodeName)); + var attrs = obj.attributes || []; + for (var i = 0; i < attrs.length; i++) { + s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts); + } + s += '>'; + if (obj.childNodes && obj.childNodes.length) { s += '...'; } + s += ''; + return s; + } + if (isArray(obj)) { + if (obj.length === 0) { return '[]'; } + var xs = arrObjKeys(obj, inspect); + if (indent && !singleLineValues(xs)) { + return '[' + indentedJoin(xs, indent) + ']'; + } + return '[ ' + $join.call(xs, ', ') + ' ]'; + } + if (isError(obj)) { + var parts = arrObjKeys(obj, inspect); + if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) { + return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }'; + } + if (parts.length === 0) { return '[' + String(obj) + ']'; } + return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }'; + } + if (typeof obj === 'object' && customInspect) { + if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) { + return utilInspect(obj, { depth: maxDepth - depth }); + } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') { + return obj.inspect(); + } + } + if (isMap(obj)) { + var mapParts = []; + if (mapForEach) { + mapForEach.call(obj, function (value, key) { + mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj)); + }); + } + return collectionOf('Map', mapSize.call(obj), mapParts, indent); + } + if (isSet(obj)) { + var setParts = []; + if (setForEach) { + setForEach.call(obj, function (value) { + setParts.push(inspect(value, obj)); + }); + } + return collectionOf('Set', setSize.call(obj), setParts, indent); + } + if (isWeakMap(obj)) { + return weakCollectionOf('WeakMap'); + } + if (isWeakSet(obj)) { + return weakCollectionOf('WeakSet'); + } + if (isWeakRef(obj)) { + return weakCollectionOf('WeakRef'); + } + if (isNumber(obj)) { + return markBoxed(inspect(Number(obj))); + } + if (isBigInt(obj)) { + return markBoxed(inspect(bigIntValueOf.call(obj))); + } + if (isBoolean(obj)) { + return markBoxed(booleanValueOf.call(obj)); + } + if (isString(obj)) { + return markBoxed(inspect(String(obj))); + } + // note: in IE 8, sometimes `global !== window` but both are the prototypes of each other + /* eslint-env browser */ + if (typeof window !== 'undefined' && obj === window) { + return '{ [object Window] }'; + } + if (obj === global) { + return '{ [object globalThis] }'; + } + if (!isDate(obj) && !isRegExp(obj)) { + var ys = arrObjKeys(obj, inspect); + var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object; + var protoTag = obj instanceof Object ? '' : 'null prototype'; + var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : ''; + var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : ''; + var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : ''); + if (ys.length === 0) { return tag + '{}'; } + if (indent) { + return tag + '{' + indentedJoin(ys, indent) + '}'; + } + return tag + '{ ' + $join.call(ys, ', ') + ' }'; + } + return String(obj); +}; - "use strict"; +function wrapQuotes(s, defaultStyle, opts) { + var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'"; + return quoteChar + s + quoteChar; +} +function quote(s) { + return $replace.call(String(s), /"/g, '"'); +} - /** @type {import('./uri')} */ - module.exports = URIError; +function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } + +// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives +function isSymbol(obj) { + if (hasShammedSymbols) { + return obj && typeof obj === 'object' && obj instanceof Symbol; + } + if (typeof obj === 'symbol') { + return true; + } + if (!obj || typeof obj !== 'object' || !symToString) { + return false; + } + try { + symToString.call(obj); + return true; + } catch (e) {} + return false; +} +function isBigInt(obj) { + if (!obj || typeof obj !== 'object' || !bigIntValueOf) { + return false; + } + try { + bigIntValueOf.call(obj); + return true; + } catch (e) {} + return false; +} - /***/ -}), +var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; }; +function has(obj, key) { + return hasOwn.call(obj, key); +} -/***/ 9320: -/***/ ((module) => { +function toStr(obj) { + return objectToString.call(obj); +} - "use strict"; +function nameOf(f) { + if (f.name) { return f.name; } + var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/); + if (m) { return m[1]; } + return null; +} +function indexOf(xs, x) { + if (xs.indexOf) { return xs.indexOf(x); } + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) { return i; } + } + return -1; +} - /* eslint no-invalid-this: 1 */ +function isMap(x) { + if (!mapSize || !x || typeof x !== 'object') { + return false; + } + try { + mapSize.call(x); + try { + setSize.call(x); + } catch (s) { + return true; + } + return x instanceof Map; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} - var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; - var toStr = Object.prototype.toString; - var max = Math.max; - var funcType = '[object Function]'; +function isWeakMap(x) { + if (!weakMapHas || !x || typeof x !== 'object') { + return false; + } + try { + weakMapHas.call(x, weakMapHas); + try { + weakSetHas.call(x, weakSetHas); + } catch (s) { + return true; + } + return x instanceof WeakMap; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} - var concatty = function concatty(a, b) { - var arr = []; +function isWeakRef(x) { + if (!weakRefDeref || !x || typeof x !== 'object') { + return false; + } + try { + weakRefDeref.call(x); + return true; + } catch (e) {} + return false; +} - for (var i = 0; i < a.length; i += 1) { - arr[i] = a[i]; - } - for (var j = 0; j < b.length; j += 1) { - arr[j + a.length] = b[j]; - } +function isSet(x) { + if (!setSize || !x || typeof x !== 'object') { + return false; + } + try { + setSize.call(x); + try { + mapSize.call(x); + } catch (m) { + return true; + } + return x instanceof Set; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} - return arr; - }; +function isWeakSet(x) { + if (!weakSetHas || !x || typeof x !== 'object') { + return false; + } + try { + weakSetHas.call(x, weakSetHas); + try { + weakMapHas.call(x, weakMapHas); + } catch (s) { + return true; + } + return x instanceof WeakSet; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} - var slicy = function slicy(arrLike, offset) { - var arr = []; - for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) { - arr[j] = arrLike[i]; - } - return arr; - }; +function isElement(x) { + if (!x || typeof x !== 'object') { return false; } + if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) { + return true; + } + return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function'; +} - var joiny = function (arr, joiner) { - var str = ''; - for (var i = 0; i < arr.length; i += 1) { - str += arr[i]; - if (i + 1 < arr.length) { - str += joiner; - } - } - return str; - }; +function inspectString(str, opts) { + if (str.length > opts.maxStringLength) { + var remaining = str.length - opts.maxStringLength; + var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : ''); + return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer; + } + // eslint-disable-next-line no-control-regex + var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte); + return wrapQuotes(s, 'single', opts); +} - module.exports = function bind(that) { - var target = this; - if (typeof target !== 'function' || toStr.apply(target) !== funcType) { - throw new TypeError(ERROR_MESSAGE + target); - } - var args = slicy(arguments, 1); - - var bound; - var binder = function () { - if (this instanceof bound) { - var result = target.apply( - this, - concatty(args, arguments) - ); - if (Object(result) === result) { - return result; - } - return this; - } - return target.apply( - that, - concatty(args, arguments) - ); +function lowbyte(c) { + var n = c.charCodeAt(0); + var x = { + 8: 'b', + 9: 't', + 10: 'n', + 12: 'f', + 13: 'r' + }[n]; + if (x) { return '\\' + x; } + return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16)); +} - }; +function markBoxed(str) { + return 'Object(' + str + ')'; +} - var boundLength = max(0, target.length - args.length); - var boundArgs = []; - for (var i = 0; i < boundLength; i++) { - boundArgs[i] = '$' + i; - } +function weakCollectionOf(type) { + return type + ' { ? }'; +} + +function collectionOf(type, size, entries, indent) { + var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', '); + return type + ' (' + size + ') {' + joinedEntries + '}'; +} - bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder); +function singleLineValues(xs) { + for (var i = 0; i < xs.length; i++) { + if (indexOf(xs[i], '\n') >= 0) { + return false; + } + } + return true; +} - if (target.prototype) { - var Empty = function Empty() { }; - Empty.prototype = target.prototype; - bound.prototype = new Empty(); - Empty.prototype = null; - } +function getIndent(opts, depth) { + var baseIndent; + if (opts.indent === '\t') { + baseIndent = '\t'; + } else if (typeof opts.indent === 'number' && opts.indent > 0) { + baseIndent = $join.call(Array(opts.indent + 1), ' '); + } else { + return null; + } + return { + base: baseIndent, + prev: $join.call(Array(depth + 1), baseIndent) + }; +} - return bound; - }; +function indentedJoin(xs, indent) { + if (xs.length === 0) { return ''; } + var lineJoiner = '\n' + indent.prev + indent.base; + return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev; +} +function arrObjKeys(obj, inspect) { + var isArr = isArray(obj); + var xs = []; + if (isArr) { + xs.length = obj.length; + for (var i = 0; i < obj.length; i++) { + xs[i] = has(obj, i) ? inspect(obj[i], obj) : ''; + } + } + var syms = typeof gOPS === 'function' ? gOPS(obj) : []; + var symMap; + if (hasShammedSymbols) { + symMap = {}; + for (var k = 0; k < syms.length; k++) { + symMap['$' + syms[k]] = syms[k]; + } + } + + for (var key in obj) { // eslint-disable-line no-restricted-syntax + if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue + if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue + if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) { + // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section + continue; // eslint-disable-line no-restricted-syntax, no-continue + } else if ($test.call(/[^\w$]/, key)) { + xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj)); + } else { + xs.push(key + ': ' + inspect(obj[key], obj)); + } + } + if (typeof gOPS === 'function') { + for (var j = 0; j < syms.length; j++) { + if (isEnumerable.call(obj, syms[j])) { + xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj)); + } + } + } + return xs; +} - /***/ -}), -/***/ 8334: +/***/ }), + +/***/ 7265: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +module.exports = __nccwpck_require__(3837).inspect; + + +/***/ }), +/***/ 4907: +/***/ ((module) => { - var implementation = __nccwpck_require__(9320); +"use strict"; - module.exports = Function.prototype.bind || implementation; +var replace = String.prototype.replace; +var percentTwenties = /%20/g; - /***/ -}), +var Format = { + RFC1738: 'RFC1738', + RFC3986: 'RFC3986' +}; -/***/ 4538: +module.exports = { + 'default': Format.RFC3986, + formatters: { + RFC1738: function (value) { + return replace.call(value, percentTwenties, '+'); + }, + RFC3986: function (value) { + return String(value); + } + }, + RFC1738: Format.RFC1738, + RFC3986: Format.RFC3986 +}; + + +/***/ }), + +/***/ 2760: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +"use strict"; - var undefined; +var stringify = __nccwpck_require__(9954); +var parse = __nccwpck_require__(3912); +var formats = __nccwpck_require__(4907); - var $Error = __nccwpck_require__(8015); - var $EvalError = __nccwpck_require__(1933); - var $RangeError = __nccwpck_require__(4415); - var $ReferenceError = __nccwpck_require__(6279); - var $SyntaxError = __nccwpck_require__(5474); - var $TypeError = __nccwpck_require__(6361); - var $URIError = __nccwpck_require__(5065); +module.exports = { + formats: formats, + parse: parse, + stringify: stringify +}; - var $Function = Function; - // eslint-disable-next-line consistent-return - var getEvalledConstructor = function (expressionSyntax) { - try { - return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')(); - } catch (e) { } - }; +/***/ }), - var $gOPD = Object.getOwnPropertyDescriptor; - if ($gOPD) { - try { - $gOPD({}, ''); - } catch (e) { - $gOPD = null; // this is IE 8, which has a broken gOPD - } - } +/***/ 3912: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - var throwTypeError = function () { - throw new $TypeError(); - }; - var ThrowTypeError = $gOPD - ? (function () { - try { - // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties - arguments.callee; // IE 8 does not throw here - return throwTypeError; - } catch (calleeThrows) { - try { - // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '') - return $gOPD(arguments, 'callee').get; - } catch (gOPDthrows) { - return throwTypeError; - } - } - }()) - : throwTypeError; +"use strict"; + + +var utils = __nccwpck_require__(2360); + +var has = Object.prototype.hasOwnProperty; +var isArray = Array.isArray; + +var defaults = { + allowDots: false, + allowEmptyArrays: false, + allowPrototypes: false, + allowSparse: false, + arrayLimit: 20, + charset: 'utf-8', + charsetSentinel: false, + comma: false, + decodeDotInKeys: true, + decoder: utils.decode, + delimiter: '&', + depth: 5, + duplicates: 'combine', + ignoreQueryPrefix: false, + interpretNumericEntities: false, + parameterLimit: 1000, + parseArrays: true, + plainObjects: false, + strictNullHandling: false +}; - var hasSymbols = __nccwpck_require__(587)(); - var hasProto = __nccwpck_require__(5894)(); +var interpretNumericEntities = function (str) { + return str.replace(/&#(\d+);/g, function ($0, numberStr) { + return String.fromCharCode(parseInt(numberStr, 10)); + }); +}; - var getProto = Object.getPrototypeOf || ( - hasProto - ? function (x) { return x.__proto__; } // eslint-disable-line no-proto - : null - ); +var parseArrayValue = function (val, options) { + if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) { + return val.split(','); + } - var needsEval = {}; - - var TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array); - - var INTRINSICS = { - __proto__: null, - '%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError, - '%Array%': Array, - '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer, - '%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined, - '%AsyncFromSyncIteratorPrototype%': undefined, - '%AsyncFunction%': needsEval, - '%AsyncGenerator%': needsEval, - '%AsyncGeneratorFunction%': needsEval, - '%AsyncIteratorPrototype%': needsEval, - '%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics, - '%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt, - '%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array, - '%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array, - '%Boolean%': Boolean, - '%DataView%': typeof DataView === 'undefined' ? undefined : DataView, - '%Date%': Date, - '%decodeURI%': decodeURI, - '%decodeURIComponent%': decodeURIComponent, - '%encodeURI%': encodeURI, - '%encodeURIComponent%': encodeURIComponent, - '%Error%': $Error, - '%eval%': eval, // eslint-disable-line no-eval - '%EvalError%': $EvalError, - '%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array, - '%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array, - '%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry, - '%Function%': $Function, - '%GeneratorFunction%': needsEval, - '%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array, - '%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array, - '%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array, - '%isFinite%': isFinite, - '%isNaN%': isNaN, - '%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined, - '%JSON%': typeof JSON === 'object' ? JSON : undefined, - '%Map%': typeof Map === 'undefined' ? undefined : Map, - '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()), - '%Math%': Math, - '%Number%': Number, - '%Object%': Object, - '%parseFloat%': parseFloat, - '%parseInt%': parseInt, - '%Promise%': typeof Promise === 'undefined' ? undefined : Promise, - '%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy, - '%RangeError%': $RangeError, - '%ReferenceError%': $ReferenceError, - '%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect, - '%RegExp%': RegExp, - '%Set%': typeof Set === 'undefined' ? undefined : Set, - '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()), - '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer, - '%String%': String, - '%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined, - '%Symbol%': hasSymbols ? Symbol : undefined, - '%SyntaxError%': $SyntaxError, - '%ThrowTypeError%': ThrowTypeError, - '%TypedArray%': TypedArray, - '%TypeError%': $TypeError, - '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array, - '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray, - '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array, - '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array, - '%URIError%': $URIError, - '%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap, - '%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef, - '%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet - }; + return val; +}; - if (getProto) { - try { - null.error; // eslint-disable-line no-unused-expressions - } catch (e) { - // https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229 - var errorProto = getProto(getProto(e)); - INTRINSICS['%Error.prototype%'] = errorProto; - } - } +// This is what browsers will submit when the ✓ character occurs in an +// application/x-www-form-urlencoded body and the encoding of the page containing +// the form is iso-8859-1, or when the submitted form has an accept-charset +// attribute of iso-8859-1. Presumably also with other charsets that do not contain +// the ✓ character, such as us-ascii. +var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓') + +// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded. +var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓') + +var parseValues = function parseQueryStringValues(str, options) { + var obj = { __proto__: null }; + + var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; + var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; + var parts = cleanStr.split(options.delimiter, limit); + var skipIndex = -1; // Keep track of where the utf8 sentinel was found + var i; + + var charset = options.charset; + if (options.charsetSentinel) { + for (i = 0; i < parts.length; ++i) { + if (parts[i].indexOf('utf8=') === 0) { + if (parts[i] === charsetSentinel) { + charset = 'utf-8'; + } else if (parts[i] === isoSentinel) { + charset = 'iso-8859-1'; + } + skipIndex = i; + i = parts.length; // The eslint settings do not allow break; + } + } + } + + for (i = 0; i < parts.length; ++i) { + if (i === skipIndex) { + continue; + } + var part = parts[i]; + + var bracketEqualsPos = part.indexOf(']='); + var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; + + var key, val; + if (pos === -1) { + key = options.decoder(part, defaults.decoder, charset, 'key'); + val = options.strictNullHandling ? null : ''; + } else { + key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key'); + val = utils.maybeMap( + parseArrayValue(part.slice(pos + 1), options), + function (encodedVal) { + return options.decoder(encodedVal, defaults.decoder, charset, 'value'); + } + ); + } + + if (val && options.interpretNumericEntities && charset === 'iso-8859-1') { + val = interpretNumericEntities(val); + } + + if (part.indexOf('[]=') > -1) { + val = isArray(val) ? [val] : val; + } + + var existing = has.call(obj, key); + if (existing && options.duplicates === 'combine') { + obj[key] = utils.combine(obj[key], val); + } else if (!existing || options.duplicates === 'last') { + obj[key] = val; + } + } + + return obj; +}; - var doEval = function doEval(name) { - var value; - if (name === '%AsyncFunction%') { - value = getEvalledConstructor('async function () {}'); - } else if (name === '%GeneratorFunction%') { - value = getEvalledConstructor('function* () {}'); - } else if (name === '%AsyncGeneratorFunction%') { - value = getEvalledConstructor('async function* () {}'); - } else if (name === '%AsyncGenerator%') { - var fn = doEval('%AsyncGeneratorFunction%'); - if (fn) { - value = fn.prototype; - } - } else if (name === '%AsyncIteratorPrototype%') { - var gen = doEval('%AsyncGenerator%'); - if (gen && getProto) { - value = getProto(gen.prototype); - } - } +var parseObject = function (chain, val, options, valuesParsed) { + var leaf = valuesParsed ? val : parseArrayValue(val, options); + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]' && options.parseArrays) { + obj = options.allowEmptyArrays && leaf === '' ? [] : [].concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var decodedRoot = options.decodeDotInKeys ? cleanRoot.replace(/%2E/g, '.') : cleanRoot; + var index = parseInt(decodedRoot, 10); + if (!options.parseArrays && decodedRoot === '') { + obj = { 0: leaf }; + } else if ( + !isNaN(index) + && root !== decodedRoot + && String(index) === decodedRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else if (decodedRoot !== '__proto__') { + obj[decodedRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; - INTRINSICS[name] = value; +var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) { + if (!givenKey) { + return; + } - return value; - }; + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; - var LEGACY_ALIASES = { - __proto__: null, - '%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'], - '%ArrayPrototype%': ['Array', 'prototype'], - '%ArrayProto_entries%': ['Array', 'prototype', 'entries'], - '%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'], - '%ArrayProto_keys%': ['Array', 'prototype', 'keys'], - '%ArrayProto_values%': ['Array', 'prototype', 'values'], - '%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'], - '%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'], - '%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'], - '%BooleanPrototype%': ['Boolean', 'prototype'], - '%DataViewPrototype%': ['DataView', 'prototype'], - '%DatePrototype%': ['Date', 'prototype'], - '%ErrorPrototype%': ['Error', 'prototype'], - '%EvalErrorPrototype%': ['EvalError', 'prototype'], - '%Float32ArrayPrototype%': ['Float32Array', 'prototype'], - '%Float64ArrayPrototype%': ['Float64Array', 'prototype'], - '%FunctionPrototype%': ['Function', 'prototype'], - '%Generator%': ['GeneratorFunction', 'prototype'], - '%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'], - '%Int8ArrayPrototype%': ['Int8Array', 'prototype'], - '%Int16ArrayPrototype%': ['Int16Array', 'prototype'], - '%Int32ArrayPrototype%': ['Int32Array', 'prototype'], - '%JSONParse%': ['JSON', 'parse'], - '%JSONStringify%': ['JSON', 'stringify'], - '%MapPrototype%': ['Map', 'prototype'], - '%NumberPrototype%': ['Number', 'prototype'], - '%ObjectPrototype%': ['Object', 'prototype'], - '%ObjProto_toString%': ['Object', 'prototype', 'toString'], - '%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'], - '%PromisePrototype%': ['Promise', 'prototype'], - '%PromiseProto_then%': ['Promise', 'prototype', 'then'], - '%Promise_all%': ['Promise', 'all'], - '%Promise_reject%': ['Promise', 'reject'], - '%Promise_resolve%': ['Promise', 'resolve'], - '%RangeErrorPrototype%': ['RangeError', 'prototype'], - '%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'], - '%RegExpPrototype%': ['RegExp', 'prototype'], - '%SetPrototype%': ['Set', 'prototype'], - '%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'], - '%StringPrototype%': ['String', 'prototype'], - '%SymbolPrototype%': ['Symbol', 'prototype'], - '%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'], - '%TypedArrayPrototype%': ['TypedArray', 'prototype'], - '%TypeErrorPrototype%': ['TypeError', 'prototype'], - '%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'], - '%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'], - '%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'], - '%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'], - '%URIErrorPrototype%': ['URIError', 'prototype'], - '%WeakMapPrototype%': ['WeakMap', 'prototype'], - '%WeakSetPrototype%': ['WeakSet', 'prototype'] - }; + // The regex chunks - var bind = __nccwpck_require__(8334); - var hasOwn = __nccwpck_require__(2157); - var $concat = bind.call(Function.call, Array.prototype.concat); - var $spliceApply = bind.call(Function.apply, Array.prototype.splice); - var $replace = bind.call(Function.call, String.prototype.replace); - var $strSlice = bind.call(Function.call, String.prototype.slice); - var $exec = bind.call(Function.call, RegExp.prototype.exec); - - /* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */ - var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; - var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */ - var stringToPath = function stringToPath(string) { - var first = $strSlice(string, 0, 1); - var last = $strSlice(string, -1); - if (first === '%' && last !== '%') { - throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`'); - } else if (last === '%' && first !== '%') { - throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`'); - } - var result = []; - $replace(string, rePropName, function (match, number, quote, subString) { - result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match; - }); - return result; - }; - /* end adaptation */ - - var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) { - var intrinsicName = name; - var alias; - if (hasOwn(LEGACY_ALIASES, intrinsicName)) { - alias = LEGACY_ALIASES[intrinsicName]; - intrinsicName = '%' + alias[0] + '%'; - } + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; - if (hasOwn(INTRINSICS, intrinsicName)) { - var value = INTRINSICS[intrinsicName]; - if (value === needsEval) { - value = doEval(intrinsicName); - } - if (typeof value === 'undefined' && !allowMissing) { - throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!'); - } + // Get the parent - return { - alias: alias, - name: intrinsicName, - value: value - }; - } + var segment = options.depth > 0 && brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; - throw new $SyntaxError('intrinsic ' + name + ' does not exist!'); - }; + // Stash the parent if it exists - module.exports = function GetIntrinsic(name, allowMissing) { - if (typeof name !== 'string' || name.length === 0) { - throw new $TypeError('intrinsic name must be a non-empty string'); - } - if (arguments.length > 1 && typeof allowMissing !== 'boolean') { - throw new $TypeError('"allowMissing" argument must be a boolean'); - } + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties + if (!options.plainObjects && has.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } - if ($exec(/^%?[^%]*%?$/, name) === null) { - throw new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name'); - } - var parts = stringToPath(name); - var intrinsicBaseName = parts.length > 0 ? parts[0] : ''; - - var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing); - var intrinsicRealName = intrinsic.name; - var value = intrinsic.value; - var skipFurtherCaching = false; - - var alias = intrinsic.alias; - if (alias) { - intrinsicBaseName = alias[0]; - $spliceApply(parts, $concat([0, 1], alias)); - } + keys.push(parent); + } - for (var i = 1, isOwn = true; i < parts.length; i += 1) { - var part = parts[i]; - var first = $strSlice(part, 0, 1); - var last = $strSlice(part, -1); - if ( - ( - (first === '"' || first === "'" || first === '`') - || (last === '"' || last === "'" || last === '`') - ) - && first !== last - ) { - throw new $SyntaxError('property names with quotes must have matching quotes'); - } - if (part === 'constructor' || !isOwn) { - skipFurtherCaching = true; - } + // Loop through children appending to the array until we hit depth - intrinsicBaseName += '.' + part; - intrinsicRealName = '%' + intrinsicBaseName + '%'; + var i = 0; + while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } - if (hasOwn(INTRINSICS, intrinsicRealName)) { - value = INTRINSICS[intrinsicRealName]; - } else if (value != null) { - if (!(part in value)) { - if (!allowMissing) { - throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.'); - } - return void undefined; - } - if ($gOPD && (i + 1) >= parts.length) { - var desc = $gOPD(value, part); - isOwn = !!desc; - - // By convention, when a data property is converted to an accessor - // property to emulate a data property that does not suffer from - // the override mistake, that accessor's getter is marked with - // an `originalValue` property. Here, when we detect this, we - // uphold the illusion by pretending to see that original data - // property, i.e., returning the value rather than the getter - // itself. - if (isOwn && 'get' in desc && !('originalValue' in desc.get)) { - value = desc.get; - } else { - value = value[part]; - } - } else { - isOwn = hasOwn(value, part); - value = value[part]; - } + // If there's a remainder, just add whatever is left - if (isOwn && !skipFurtherCaching) { - INTRINSICS[intrinsicRealName] = value; - } - } - } - return value; - }; + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + return parseObject(keys, val, options, valuesParsed); +}; - /***/ -}), +var normalizeParseOptions = function normalizeParseOptions(opts) { + if (!opts) { + return defaults; + } + + if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') { + throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided'); + } + + if (typeof opts.decodeDotInKeys !== 'undefined' && typeof opts.decodeDotInKeys !== 'boolean') { + throw new TypeError('`decodeDotInKeys` option can only be `true` or `false`, when provided'); + } + + if (opts.decoder !== null && typeof opts.decoder !== 'undefined' && typeof opts.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; + + var duplicates = typeof opts.duplicates === 'undefined' ? defaults.duplicates : opts.duplicates; + + if (duplicates !== 'combine' && duplicates !== 'first' && duplicates !== 'last') { + throw new TypeError('The duplicates option must be either combine, first, or last'); + } + + var allowDots = typeof opts.allowDots === 'undefined' ? opts.decodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots; + + return { + allowDots: allowDots, + allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays, + allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, + allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse, + arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, + decodeDotInKeys: typeof opts.decodeDotInKeys === 'boolean' ? opts.decodeDotInKeys : defaults.decodeDotInKeys, + decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, + delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, + // eslint-disable-next-line no-implicit-coercion, no-extra-parens + depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth, + duplicates: duplicates, + ignoreQueryPrefix: opts.ignoreQueryPrefix === true, + interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, + parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, + parseArrays: opts.parseArrays !== false, + plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; -/***/ 8501: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +module.exports = function (str, opts) { + var options = normalizeParseOptions(opts); - "use strict"; + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; - var GetIntrinsic = __nccwpck_require__(4538); + // Iterate over the keys and setup the new object - var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true); + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string'); + obj = utils.merge(obj, newObj, options); + } - if ($gOPD) { - try { - $gOPD([], 'length'); - } catch (e) { - // IE 8 has a broken gOPD - $gOPD = null; - } - } + if (options.allowSparse === true) { + return obj; + } - module.exports = $gOPD; + return utils.compact(obj); +}; - /***/ -}), +/***/ }), -/***/ 176: +/***/ 9954: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +"use strict"; + + +var getSideChannel = __nccwpck_require__(4334); +var utils = __nccwpck_require__(2360); +var formats = __nccwpck_require__(4907); +var has = Object.prototype.hasOwnProperty; + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { + return prefix + '[]'; + }, + comma: 'comma', + indices: function indices(prefix, key) { + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { + return prefix; + } +}; +var isArray = Array.isArray; +var push = Array.prototype.push; +var pushToArray = function (arr, valueOrArray) { + push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); +}; - var $defineProperty = __nccwpck_require__(6123); +var toISO = Date.prototype.toISOString; + +var defaultFormat = formats['default']; +var defaults = { + addQueryPrefix: false, + allowDots: false, + allowEmptyArrays: false, + arrayFormat: 'indices', + charset: 'utf-8', + charsetSentinel: false, + delimiter: '&', + encode: true, + encodeDotInKeys: false, + encoder: utils.encode, + encodeValuesOnly: false, + format: defaultFormat, + formatter: formats.formatters[defaultFormat], + // deprecated + indices: false, + serializeDate: function serializeDate(date) { + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; - var hasPropertyDescriptors = function hasPropertyDescriptors() { - return !!$defineProperty; - }; +var isNonNullishPrimitive = function isNonNullishPrimitive(v) { + return typeof v === 'string' + || typeof v === 'number' + || typeof v === 'boolean' + || typeof v === 'symbol' + || typeof v === 'bigint'; +}; - hasPropertyDescriptors.hasArrayLengthDefineBug = function hasArrayLengthDefineBug() { - // node v0.6 has a bug where array lengths can be Set but not Defined - if (!$defineProperty) { - return null; - } - try { - return $defineProperty([], 'length', { value: 1 }).length !== 1; - } catch (e) { - // In Firefox 4-22, defining length on an array throws an exception. - return true; - } - }; +var sentinel = {}; + +var stringify = function stringify( + object, + prefix, + generateArrayPrefix, + commaRoundTrip, + allowEmptyArrays, + strictNullHandling, + skipNulls, + encodeDotInKeys, + encoder, + filter, + sort, + allowDots, + serializeDate, + format, + formatter, + encodeValuesOnly, + charset, + sideChannel +) { + var obj = object; + + var tmpSc = sideChannel; + var step = 0; + var findFlag = false; + while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) { + // Where object last appeared in the ref tree + var pos = tmpSc.get(object); + step += 1; + if (typeof pos !== 'undefined') { + if (pos === step) { + throw new RangeError('Cyclic object value'); + } else { + findFlag = true; // Break while + } + } + if (typeof tmpSc.get(sentinel) === 'undefined') { + step = 0; + } + } + + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (generateArrayPrefix === 'comma' && isArray(obj)) { + obj = utils.maybeMap(obj, function (value) { + if (value instanceof Date) { + return serializeDate(value); + } + return value; + }); + } + + if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix; + } + + obj = ''; + } + + if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format); + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (generateArrayPrefix === 'comma' && isArray(obj)) { + // we need to join elements in + if (encodeValuesOnly && encoder) { + obj = utils.maybeMap(obj, encoder); + } + objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }]; + } else if (isArray(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + var encodedPrefix = encodeDotInKeys ? prefix.replace(/\./g, '%2E') : prefix; + + var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? encodedPrefix + '[]' : encodedPrefix; + + if (allowEmptyArrays && isArray(obj) && obj.length === 0) { + return adjustedPrefix + '[]'; + } + + for (var j = 0; j < objKeys.length; ++j) { + var key = objKeys[j]; + var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key]; + + if (skipNulls && value === null) { + continue; + } + + var encodedKey = allowDots && encodeDotInKeys ? key.replace(/\./g, '%2E') : key; + var keyPrefix = isArray(obj) + ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, encodedKey) : adjustedPrefix + : adjustedPrefix + (allowDots ? '.' + encodedKey : '[' + encodedKey + ']'); + + sideChannel.set(object, step); + var valueSideChannel = getSideChannel(); + valueSideChannel.set(sentinel, sideChannel); + pushToArray(values, stringify( + value, + keyPrefix, + generateArrayPrefix, + commaRoundTrip, + allowEmptyArrays, + strictNullHandling, + skipNulls, + encodeDotInKeys, + generateArrayPrefix === 'comma' && encodeValuesOnly && isArray(obj) ? null : encoder, + filter, + sort, + allowDots, + serializeDate, + format, + formatter, + encodeValuesOnly, + charset, + valueSideChannel + )); + } + + return values; +}; - module.exports = hasPropertyDescriptors; +var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { + if (!opts) { + return defaults; + } + + if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') { + throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided'); + } + + if (typeof opts.encodeDotInKeys !== 'undefined' && typeof opts.encodeDotInKeys !== 'boolean') { + throw new TypeError('`encodeDotInKeys` option can only be `true` or `false`, when provided'); + } + + if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var charset = opts.charset || defaults.charset; + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + + var format = formats['default']; + if (typeof opts.format !== 'undefined') { + if (!has.call(formats.formatters, opts.format)) { + throw new TypeError('Unknown format option provided.'); + } + format = opts.format; + } + var formatter = formats.formatters[format]; + + var filter = defaults.filter; + if (typeof opts.filter === 'function' || isArray(opts.filter)) { + filter = opts.filter; + } + + var arrayFormat; + if (opts.arrayFormat in arrayPrefixGenerators) { + arrayFormat = opts.arrayFormat; + } else if ('indices' in opts) { + arrayFormat = opts.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = defaults.arrayFormat; + } + + if ('commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') { + throw new TypeError('`commaRoundTrip` must be a boolean, or absent'); + } + + var allowDots = typeof opts.allowDots === 'undefined' ? opts.encodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots; + + return { + addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, + allowDots: allowDots, + allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays, + arrayFormat: arrayFormat, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + commaRoundTrip: opts.commaRoundTrip, + delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, + encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, + encodeDotInKeys: typeof opts.encodeDotInKeys === 'boolean' ? opts.encodeDotInKeys : defaults.encodeDotInKeys, + encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, + encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, + filter: filter, + format: format, + formatter: formatter, + serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, + skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, + sort: typeof opts.sort === 'function' ? opts.sort : null, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; +module.exports = function (object, opts) { + var obj = object; + var options = normalizeStringifyOptions(opts); + + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (isArray(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var generateArrayPrefix = arrayPrefixGenerators[options.arrayFormat]; + var commaRoundTrip = generateArrayPrefix === 'comma' && options.commaRoundTrip; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (options.sort) { + objKeys.sort(options.sort); + } + + var sideChannel = getSideChannel(); + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (options.skipNulls && obj[key] === null) { + continue; + } + pushToArray(keys, stringify( + obj[key], + key, + generateArrayPrefix, + commaRoundTrip, + options.allowEmptyArrays, + options.strictNullHandling, + options.skipNulls, + options.encodeDotInKeys, + options.encode ? options.encoder : null, + options.filter, + options.sort, + options.allowDots, + options.serializeDate, + options.format, + options.formatter, + options.encodeValuesOnly, + options.charset, + sideChannel + )); + } + + var joined = keys.join(options.delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + if (options.charsetSentinel) { + if (options.charset === 'iso-8859-1') { + // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark + prefix += 'utf8=%26%2310003%3B&'; + } else { + // encodeURIComponent('✓') + prefix += 'utf8=%E2%9C%93&'; + } + } + + return joined.length > 0 ? prefix + joined : ''; +}; - /***/ -}), -/***/ 5894: -/***/ ((module) => { +/***/ }), - "use strict"; +/***/ 2360: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +"use strict"; - var test = { - __proto__: null, - foo: {} - }; - var $Object = Object; +var formats = __nccwpck_require__(4907); - /** @type {import('.')} */ - module.exports = function hasProto() { - // @ts-expect-error: TS errors on an inherited property for some reason - return { __proto__: test }.foo === test.foo - && !(test instanceof $Object); - }; +var has = Object.prototype.hasOwnProperty; +var isArray = Array.isArray; +var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } - /***/ -}), + return array; +}()); -/***/ 587: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +var compactQueue = function compactQueue(queue) { + while (queue.length > 1) { + var item = queue.pop(); + var obj = item.obj[item.prop]; - "use strict"; + if (isArray(obj)) { + var compacted = []; + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } - var origSymbol = typeof Symbol !== 'undefined' && Symbol; - var hasSymbolSham = __nccwpck_require__(7747); + item.obj[item.prop] = compacted; + } + } +}; - module.exports = function hasNativeSymbols() { - if (typeof origSymbol !== 'function') { return false; } - if (typeof Symbol !== 'function') { return false; } - if (typeof origSymbol('foo') !== 'symbol') { return false; } - if (typeof Symbol('bar') !== 'symbol') { return false; } +var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } - return hasSymbolSham(); - }; + return obj; +}; +var merge = function merge(target, source, options) { + /* eslint no-param-reassign: 0 */ + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (isArray(target)) { + target.push(source); + } else if (target && typeof target === 'object') { + if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (!target || typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (isArray(target) && !isArray(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (isArray(target) && isArray(source)) { + source.forEach(function (item, i) { + if (has.call(target, i)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { + target[i] = merge(targetItem, item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); +}; - /***/ -}), +var assign = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); +}; -/***/ 7747: -/***/ ((module) => { +var decode = function (str, decoder, charset) { + var strWithoutPlus = str.replace(/\+/g, ' '); + if (charset === 'iso-8859-1') { + // unescape never throws, no try...catch needed: + return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); + } + // utf-8 + try { + return decodeURIComponent(strWithoutPlus); + } catch (e) { + return strWithoutPlus; + } +}; - "use strict"; +var encode = function encode(str, defaultEncoder, charset, kind, format) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; + } + + var string = str; + if (typeof str === 'symbol') { + string = Symbol.prototype.toString.call(str); + } else if (typeof str !== 'string') { + string = String(str); + } + + if (charset === 'iso-8859-1') { + return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { + return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; + }); + } + + var out = ''; + for (var i = 0; i < string.length; ++i) { + var c = string.charCodeAt(i); + + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( ) + ) { + out += string.charAt(i); + continue; + } + + if (c < 0x80) { + out = out + hexTable[c]; + continue; + } + + if (c < 0x800) { + out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + /* eslint operator-linebreak: [2, "before"] */ + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + } + + return out; +}; +var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; - /* eslint complexity: [2, 18], max-statements: [2, 33] */ - module.exports = function hasSymbols() { - if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } - if (typeof Symbol.iterator === 'symbol') { return true; } + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; - var obj = {}; - var sym = Symbol('test'); - var symObj = Object(sym); - if (typeof sym === 'string') { return false; } + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } + } + } - if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; } - if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; } + compactQueue(queue); - // temp disabled per https://github.com/ljharb/object.assign/issues/17 - // if (sym instanceof Symbol) { return false; } - // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 - // if (!(symObj instanceof Symbol)) { return false; } + return value; +}; - // if (typeof Symbol.prototype.toString !== 'function') { return false; } - // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; - var symVal = 42; - obj[sym] = symVal; - for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop - if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } +var isBuffer = function isBuffer(obj) { + if (!obj || typeof obj !== 'object') { + return false; + } - if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; - var syms = Object.getOwnPropertySymbols(obj); - if (syms.length !== 1 || syms[0] !== sym) { return false; } +var combine = function combine(a, b) { + return [].concat(a, b); +}; - if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } +var maybeMap = function maybeMap(val, fn) { + if (isArray(val)) { + var mapped = []; + for (var i = 0; i < val.length; i += 1) { + mapped.push(fn(val[i])); + } + return mapped; + } + return fn(val); +}; - if (typeof Object.getOwnPropertyDescriptor === 'function') { - var descriptor = Object.getOwnPropertyDescriptor(obj, sym); - if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } - } +module.exports = { + arrayToObject: arrayToObject, + assign: assign, + combine: combine, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + maybeMap: maybeMap, + merge: merge +}; - return true; - }; +/***/ }), + +/***/ 4056: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var GetIntrinsic = __nccwpck_require__(4538); +var define = __nccwpck_require__(4564); +var hasDescriptors = __nccwpck_require__(176)(); +var gOPD = __nccwpck_require__(8501); + +var $TypeError = __nccwpck_require__(6361); +var $floor = GetIntrinsic('%Math.floor%'); + +/** @type {import('.')} */ +module.exports = function setFunctionLength(fn, length) { + if (typeof fn !== 'function') { + throw new $TypeError('`fn` is not a function'); + } + if (typeof length !== 'number' || length < 0 || length > 0xFFFFFFFF || $floor(length) !== length) { + throw new $TypeError('`length` must be a positive 32-bit integer'); + } + + var loose = arguments.length > 2 && !!arguments[2]; + + var functionLengthIsConfigurable = true; + var functionLengthIsWritable = true; + if ('length' in fn && gOPD) { + var desc = gOPD(fn, 'length'); + if (desc && !desc.configurable) { + functionLengthIsConfigurable = false; + } + if (desc && !desc.writable) { + functionLengthIsWritable = false; + } + } + + if (functionLengthIsConfigurable || functionLengthIsWritable || !loose) { + if (hasDescriptors) { + define(/** @type {Parameters[0]} */ (fn), 'length', length, true, true); + } else { + define(/** @type {Parameters[0]} */ (fn), 'length', length); + } + } + return fn; +}; - /***/ -}), -/***/ 2157: +/***/ }), + +/***/ 4334: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +"use strict"; + + +var GetIntrinsic = __nccwpck_require__(4538); +var callBound = __nccwpck_require__(8803); +var inspect = __nccwpck_require__(504); + +var $TypeError = __nccwpck_require__(6361); +var $WeakMap = GetIntrinsic('%WeakMap%', true); +var $Map = GetIntrinsic('%Map%', true); + +var $weakMapGet = callBound('WeakMap.prototype.get', true); +var $weakMapSet = callBound('WeakMap.prototype.set', true); +var $weakMapHas = callBound('WeakMap.prototype.has', true); +var $mapGet = callBound('Map.prototype.get', true); +var $mapSet = callBound('Map.prototype.set', true); +var $mapHas = callBound('Map.prototype.has', true); + +/* +* This function traverses the list returning the node corresponding to the given key. +* +* That node is also moved to the head of the list, so that if it's accessed again we don't need to traverse the whole list. By doing so, all the recently used nodes can be accessed relatively quickly. +*/ +/** @type {import('.').listGetNode} */ +var listGetNode = function (list, key) { // eslint-disable-line consistent-return + /** @type {typeof list | NonNullable<(typeof list)['next']>} */ + var prev = list; + /** @type {(typeof list)['next']} */ + var curr; + for (; (curr = prev.next) !== null; prev = curr) { + if (curr.key === key) { + prev.next = curr.next; + // eslint-disable-next-line no-extra-parens + curr.next = /** @type {NonNullable} */ (list.next); + list.next = curr; // eslint-disable-line no-param-reassign + return curr; + } + } +}; +/** @type {import('.').listGet} */ +var listGet = function (objects, key) { + var node = listGetNode(objects, key); + return node && node.value; +}; +/** @type {import('.').listSet} */ +var listSet = function (objects, key, value) { + var node = listGetNode(objects, key); + if (node) { + node.value = value; + } else { + // Prepend the new node to the beginning of the list + objects.next = /** @type {import('.').ListNode} */ ({ // eslint-disable-line no-param-reassign, no-extra-parens + key: key, + next: objects.next, + value: value + }); + } +}; +/** @type {import('.').listHas} */ +var listHas = function (objects, key) { + return !!listGetNode(objects, key); +}; - var call = Function.prototype.call; - var $hasOwn = Object.prototype.hasOwnProperty; - var bind = __nccwpck_require__(8334); +/** @type {import('.')} */ +module.exports = function getSideChannel() { + /** @type {WeakMap} */ var $wm; + /** @type {Map} */ var $m; + /** @type {import('.').RootNode} */ var $o; - /** @type {import('.')} */ - module.exports = bind.call(call, $hasOwn); + /** @type {import('.').Channel} */ + var channel = { + assert: function (key) { + if (!channel.has(key)) { + throw new $TypeError('Side channel does not contain ' + inspect(key)); + } + }, + get: function (key) { // eslint-disable-line consistent-return + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if ($wm) { + return $weakMapGet($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapGet($m, key); + } + } else { + if ($o) { // eslint-disable-line no-lonely-if + return listGet($o, key); + } + } + }, + has: function (key) { + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if ($wm) { + return $weakMapHas($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapHas($m, key); + } + } else { + if ($o) { // eslint-disable-line no-lonely-if + return listHas($o, key); + } + } + return false; + }, + set: function (key, value) { + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if (!$wm) { + $wm = new $WeakMap(); + } + $weakMapSet($wm, key, value); + } else if ($Map) { + if (!$m) { + $m = new $Map(); + } + $mapSet($m, key, value); + } else { + if (!$o) { + // Initialize the linked list as an empty node, so that we don't have to special-case handling of the first node: we can always refer to it as (previous node).next, instead of something like (list).head + $o = { key: {}, next: null }; + } + listSet($o, key, value); + } + } + }; + return channel; +}; - /***/ -}), +/***/ }), -/***/ 4124: +/***/ 4294: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - try { - var util = __nccwpck_require__(3837); - /* istanbul ignore next */ - if (typeof util.inherits !== 'function') throw ''; - module.exports = util.inherits; - } catch (e) { - /* istanbul ignore next */ - module.exports = __nccwpck_require__(8544); - } +module.exports = __nccwpck_require__(4219); - /***/ -}), +/***/ }), -/***/ 8544: -/***/ ((module) => { +/***/ 4219: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }) - } - }; - } else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor - var TempCtor = function () { } - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } - } - } +"use strict"; - /***/ -}), +var net = __nccwpck_require__(1808); +var tls = __nccwpck_require__(4404); +var http = __nccwpck_require__(3685); +var https = __nccwpck_require__(5687); +var events = __nccwpck_require__(2361); +var assert = __nccwpck_require__(9491); +var util = __nccwpck_require__(3837); -/***/ 561: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - /** - * [js-md4]{@link https://github.com/emn178/js-md4} - * - * @namespace md4 - * @version 0.3.2 - * @author Yi-Cyuan Chen [emn178@gmail.com] - * @copyright Yi-Cyuan Chen 2015-2027 - * @license MIT - */ - /*jslint bitwise: true */ - (function () { - 'use strict'; - - var root = typeof window === 'object' ? window : {}; - var NODE_JS = !root.JS_MD4_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node; - if (NODE_JS) { - root = global; - } - var COMMON_JS = !root.JS_MD4_NO_COMMON_JS && "object" === 'object' && module.exports; - var AMD = typeof define === 'function' && define.amd; - var ARRAY_BUFFER = !root.JS_MD4_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined'; - var HEX_CHARS = '0123456789abcdef'.split(''); - var EXTRA = [128, 32768, 8388608, -2147483648]; - var SHIFT = [0, 8, 16, 24]; - var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer']; - - var blocks = [], buffer8; - if (ARRAY_BUFFER) { - var buffer = new ArrayBuffer(68); - buffer8 = new Uint8Array(buffer); - blocks = new Uint32Array(buffer); - } +exports.httpOverHttp = httpOverHttp; +exports.httpsOverHttp = httpsOverHttp; +exports.httpOverHttps = httpOverHttps; +exports.httpsOverHttps = httpsOverHttps; - /** - * @method hex - * @memberof md4 - * @description Output hash as hex string - * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash - * @returns {String} Hex string - * @example - * md4.hex('The quick brown fox jumps over the lazy dog'); - * // equal to - * md4('The quick brown fox jumps over the lazy dog'); - */ - /** - * @method digest - * @memberof md4 - * @description Output hash as bytes array - * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash - * @returns {Array} Bytes array - * @example - * md4.digest('The quick brown fox jumps over the lazy dog'); - */ - /** - * @method array - * @memberof md4 - * @description Output hash as bytes array - * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash - * @returns {Array} Bytes array - * @example - * md4.array('The quick brown fox jumps over the lazy dog'); - */ - /** - * @method buffer - * @memberof md4 - * @description Output hash as ArrayBuffer - * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash - * @returns {ArrayBuffer} ArrayBuffer - * @example - * md4.buffer('The quick brown fox jumps over the lazy dog'); - */ - var createOutputMethod = function (outputType) { - return function (message) { - return new Md4(true).update(message)[outputType](); - } - }; - /** - * @method create - * @memberof md4 - * @description Create Md4 object - * @returns {Md4} MD4 object. - * @example - * var hash = md4.create(); - */ - /** - * @method update - * @memberof md4 - * @description Create and update Md4 object - * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash - * @returns {Md4} MD4 object. - * @example - * var hash = md4.update('The quick brown fox jumps over the lazy dog'); - * // equal to - * var hash = md4.create(); - * hash.update('The quick brown fox jumps over the lazy dog'); - */ - var createMethod = function () { - var method = createOutputMethod('hex'); - if (NODE_JS) { - method = nodeWrap(method); - } - method.create = function () { - return new Md4(); - }; - method.update = function (message) { - return method.create().update(message); - }; - for (var i = 0; i < OUTPUT_TYPES.length; ++i) { - var type = OUTPUT_TYPES[i]; - method[type] = createOutputMethod(type); - } - return method; - }; +function httpOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + return agent; +} - var nodeWrap = function (method) { - var crypto = __nccwpck_require__(6113); - var Buffer = (__nccwpck_require__(4300).Buffer); - var nodeMethod = function (message) { - if (typeof message === 'string') { - return crypto.createHash('md4').update(message, 'utf8').digest('hex'); - } else if (ARRAY_BUFFER && message instanceof ArrayBuffer) { - message = new Uint8Array(message); - } else if (message.length === undefined) { - return method(message); - } - return crypto.createHash('md4').update(new Buffer(message)).digest('hex'); - }; - return nodeMethod; - }; +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} - /** - * Md4 class - * @class Md4 - * @description This is internal class. - * @see {@link md4.create} - */ - function Md4(sharedMemory) { - if (sharedMemory) { - blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] = - blocks[4] = blocks[5] = blocks[6] = blocks[7] = - blocks[8] = blocks[9] = blocks[10] = blocks[11] = - blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; - this.blocks = blocks; - this.buffer8 = buffer8; - } else { - if (ARRAY_BUFFER) { - var buffer = new ArrayBuffer(68); - this.buffer8 = new Uint8Array(buffer); - this.blocks = new Uint32Array(buffer); - } else { - this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - } - } - this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = 0; - this.finalized = this.hashed = false; - this.first = true; - } +function httpOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + return agent; +} - /** - * @method update - * @memberof Md4 - * @instance - * @description Update hash - * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash - * @returns {Md4} MD4 object. - * @see {@link md4.update} - */ - Md4.prototype.update = function (message) { - if (this.finalized) { - return; - } - var notString = typeof message !== 'string'; - if (notString && ARRAY_BUFFER && message instanceof ArrayBuffer) { - message = new Uint8Array(message); - } - var code, index = 0, i, length = message.length || 0, blocks = this.blocks; - var buffer8 = this.buffer8; - - while (index < length) { - if (this.hashed) { - this.hashed = false; - blocks[0] = blocks[16]; - blocks[16] = blocks[1] = blocks[2] = blocks[3] = - blocks[4] = blocks[5] = blocks[6] = blocks[7] = - blocks[8] = blocks[9] = blocks[10] = blocks[11] = - blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; - } +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} - if (notString) { - if (ARRAY_BUFFER) { - for (i = this.start; index < length && i < 64; ++index) { - buffer8[i++] = message[index]; - } - } else { - for (i = this.start; index < length && i < 64; ++index) { - blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; - } - } - } else { - if (ARRAY_BUFFER) { - for (i = this.start; index < length && i < 64; ++index) { - code = message.charCodeAt(index); - if (code < 0x80) { - buffer8[i++] = code; - } else if (code < 0x800) { - buffer8[i++] = 0xc0 | (code >> 6); - buffer8[i++] = 0x80 | (code & 0x3f); - } else if (code < 0xd800 || code >= 0xe000) { - buffer8[i++] = 0xe0 | (code >> 12); - buffer8[i++] = 0x80 | ((code >> 6) & 0x3f); - buffer8[i++] = 0x80 | (code & 0x3f); - } else { - code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); - buffer8[i++] = 0xf0 | (code >> 18); - buffer8[i++] = 0x80 | ((code >> 12) & 0x3f); - buffer8[i++] = 0x80 | ((code >> 6) & 0x3f); - buffer8[i++] = 0x80 | (code & 0x3f); - } - } - } else { - for (i = this.start; index < length && i < 64; ++index) { - code = message.charCodeAt(index); - if (code < 0x80) { - blocks[i >> 2] |= code << SHIFT[i++ & 3]; - } else if (code < 0x800) { - blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; - blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; - } else if (code < 0xd800 || code >= 0xe000) { - blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; - blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; - blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; - } else { - code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); - blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; - blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; - blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; - blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; - } - } - } - } - this.lastByteIndex = i; - this.bytes += i - this.start; - if (i >= 64) { - this.start = i - 64; - this.hash(); - this.hashed = true; - } else { - this.start = i; - } - } - return this; - }; - Md4.prototype.finalize = function () { - if (this.finalized) { - return; - } - this.finalized = true; - var blocks = this.blocks, i = this.lastByteIndex; - blocks[i >> 2] |= EXTRA[i & 3]; - if (i >= 56) { - if (!this.hashed) { - this.hash(); - } - blocks[0] = blocks[16]; - blocks[16] = blocks[1] = blocks[2] = blocks[3] = - blocks[4] = blocks[5] = blocks[6] = blocks[7] = - blocks[8] = blocks[9] = blocks[10] = blocks[11] = - blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; - } - blocks[14] = this.bytes << 3; - this.hash(); - }; +function TunnelingAgent(options) { + var self = this; + self.options = options || {}; + self.proxyOptions = self.options.proxy || {}; + self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; + self.requests = []; + self.sockets = []; + + self.on('free', function onFree(socket, host, port, localAddress) { + var options = toOptions(host, port, localAddress); + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i]; + if (pending.host === options.host && pending.port === options.port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1); + pending.request.onSocket(socket); + return; + } + } + socket.destroy(); + self.removeSocket(socket); + }); +} +util.inherits(TunnelingAgent, events.EventEmitter); + +TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { + var self = this; + var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress)); + + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push(options); + return; + } + + // If we are under maxSockets create a new one. + self.createSocket(options, function(socket) { + socket.on('free', onFree); + socket.on('close', onCloseOrRemove); + socket.on('agentRemove', onCloseOrRemove); + req.onSocket(socket); + + function onFree() { + self.emit('free', socket, options); + } + + function onCloseOrRemove(err) { + self.removeSocket(socket); + socket.removeListener('free', onFree); + socket.removeListener('close', onCloseOrRemove); + socket.removeListener('agentRemove', onCloseOrRemove); + } + }); +}; - Md4.prototype.hash = function () { - var a, b, c, d, ab, bc, cd, da, blocks = this.blocks; - - if (this.first) { - a = blocks[0] - 1; - a = (a << 3) | (a >>> 29); - d = ((a & 0xefcdab89) | (~a & 0x98badcfe)) + blocks[1] + 271733878; - d = (d << 7) | (d >>> 25); - c = ((d & a) | (~d & 0xefcdab89)) + blocks[2] - 1732584194; - c = (c << 11) | (c >>> 21); - b = ((c & d) | (~c & a)) + blocks[3] - 271733879; - b = (b << 19) | (b >>> 13); - } else { - a = this.h0; - b = this.h1; - c = this.h2; - d = this.h3; - a += ((b & c) | (~b & d)) + blocks[0]; - a = (a << 3) | (a >>> 29); - d += ((a & b) | (~a & c)) + blocks[1]; - d = (d << 7) | (d >>> 25); - c += ((d & a) | (~d & b)) + blocks[2]; - c = (c << 11) | (c >>> 21); - b += ((c & d) | (~c & a)) + blocks[3]; - b = (b << 19) | (b >>> 13); - } - a += ((b & c) | (~b & d)) + blocks[4]; - a = (a << 3) | (a >>> 29); - d += ((a & b) | (~a & c)) + blocks[5]; - d = (d << 7) | (d >>> 25); - c += ((d & a) | (~d & b)) + blocks[6]; - c = (c << 11) | (c >>> 21); - b += ((c & d) | (~c & a)) + blocks[7]; - b = (b << 19) | (b >>> 13); - a += ((b & c) | (~b & d)) + blocks[8]; - a = (a << 3) | (a >>> 29); - d += ((a & b) | (~a & c)) + blocks[9]; - d = (d << 7) | (d >>> 25); - c += ((d & a) | (~d & b)) + blocks[10]; - c = (c << 11) | (c >>> 21); - b += ((c & d) | (~c & a)) + blocks[11]; - b = (b << 19) | (b >>> 13); - a += ((b & c) | (~b & d)) + blocks[12]; - a = (a << 3) | (a >>> 29); - d += ((a & b) | (~a & c)) + blocks[13]; - d = (d << 7) | (d >>> 25); - c += ((d & a) | (~d & b)) + blocks[14]; - c = (c << 11) | (c >>> 21); - b += ((c & d) | (~c & a)) + blocks[15]; - b = (b << 19) | (b >>> 13); - - bc = b & c; - a += (bc | (b & d) | (c & d)) + blocks[0] + 1518500249; - a = (a << 3) | (a >>> 29); - ab = a & b; - d += (ab | (a & c) | bc) + blocks[4] + 1518500249; - d = (d << 5) | (d >>> 27); - da = d & a; - c += (da | (d & b) | ab) + blocks[8] + 1518500249; - c = (c << 9) | (c >>> 23); - cd = c & d; - b += (cd | (c & a) | da) + blocks[12] + 1518500249; - b = (b << 13) | (b >>> 19); - bc = b & c; - a += (bc | (b & d) | cd) + blocks[1] + 1518500249; - a = (a << 3) | (a >>> 29); - ab = a & b; - d += (ab | (a & c) | bc) + blocks[5] + 1518500249; - d = (d << 5) | (d >>> 27); - da = d & a; - c += (da | (d & b) | ab) + blocks[9] + 1518500249; - c = (c << 9) | (c >>> 23); - cd = c & d; - b += (cd | (c & a) | da) + blocks[13] + 1518500249; - b = (b << 13) | (b >>> 19); - bc = b & c; - a += (bc | (b & d) | cd) + blocks[2] + 1518500249; - a = (a << 3) | (a >>> 29); - ab = a & b; - d += (ab | (a & c) | bc) + blocks[6] + 1518500249; - d = (d << 5) | (d >>> 27); - da = d & a; - c += (da | (d & b) | ab) + blocks[10] + 1518500249; - c = (c << 9) | (c >>> 23); - cd = c & d; - b += (cd | (c & a) | da) + blocks[14] + 1518500249; - b = (b << 13) | (b >>> 19); - bc = b & c; - a += (bc | (b & d) | cd) + blocks[3] + 1518500249; - a = (a << 3) | (a >>> 29); - ab = a & b; - d += (ab | (a & c) | bc) + blocks[7] + 1518500249; - d = (d << 5) | (d >>> 27); - da = d & a; - c += (da | (d & b) | ab) + blocks[11] + 1518500249; - c = (c << 9) | (c >>> 23); - b += ((c & d) | (c & a) | da) + blocks[15] + 1518500249; - b = (b << 13) | (b >>> 19); - - bc = b ^ c; - a += (bc ^ d) + blocks[0] + 1859775393; - a = (a << 3) | (a >>> 29); - d += (bc ^ a) + blocks[8] + 1859775393; - d = (d << 9) | (d >>> 23); - da = d ^ a; - c += (da ^ b) + blocks[4] + 1859775393; - c = (c << 11) | (c >>> 21); - b += (da ^ c) + blocks[12] + 1859775393; - b = (b << 15) | (b >>> 17); - bc = b ^ c; - a += (bc ^ d) + blocks[2] + 1859775393; - a = (a << 3) | (a >>> 29); - d += (bc ^ a) + blocks[10] + 1859775393; - d = (d << 9) | (d >>> 23); - da = d ^ a; - c += (da ^ b) + blocks[6] + 1859775393; - c = (c << 11) | (c >>> 21); - b += (da ^ c) + blocks[14] + 1859775393; - b = (b << 15) | (b >>> 17); - bc = b ^ c; - a += (bc ^ d) + blocks[1] + 1859775393; - a = (a << 3) | (a >>> 29); - d += (bc ^ a) + blocks[9] + 1859775393; - d = (d << 9) | (d >>> 23); - da = d ^ a; - c += (da ^ b) + blocks[5] + 1859775393; - c = (c << 11) | (c >>> 21); - b += (da ^ c) + blocks[13] + 1859775393; - b = (b << 15) | (b >>> 17); - bc = b ^ c; - a += (bc ^ d) + blocks[3] + 1859775393; - a = (a << 3) | (a >>> 29); - d += (bc ^ a) + blocks[11] + 1859775393; - d = (d << 9) | (d >>> 23); - da = d ^ a; - c += (da ^ b) + blocks[7] + 1859775393; - c = (c << 11) | (c >>> 21); - b += (da ^ c) + blocks[15] + 1859775393; - b = (b << 15) | (b >>> 17); - - if (this.first) { - this.h0 = a + 1732584193 << 0; - this.h1 = b - 271733879 << 0; - this.h2 = c - 1732584194 << 0; - this.h3 = d + 271733878 << 0; - this.first = false; - } else { - this.h0 = this.h0 + a << 0; - this.h1 = this.h1 + b << 0; - this.h2 = this.h2 + c << 0; - this.h3 = this.h3 + d << 0; - } - }; +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this; + var placeholder = {}; + self.sockets.push(placeholder); + + var connectOptions = mergeOptions({}, self.proxyOptions, { + method: 'CONNECT', + path: options.host + ':' + options.port, + agent: false, + headers: { + host: options.host + ':' + options.port + } + }); + if (options.localAddress) { + connectOptions.localAddress = options.localAddress; + } + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {}; + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + new Buffer(connectOptions.proxyAuth).toString('base64'); + } + + debug('making CONNECT request'); + var connectReq = self.request(connectOptions); + connectReq.useChunkedEncodingByDefault = false; // for v0.6 + connectReq.once('response', onResponse); // for v0.6 + connectReq.once('upgrade', onUpgrade); // for v0.6 + connectReq.once('connect', onConnect); // for v0.7 or later + connectReq.once('error', onError); + connectReq.end(); + + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true; + } + + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head); + }); + } + + function onConnect(res, socket, head) { + connectReq.removeAllListeners(); + socket.removeAllListeners(); + + if (res.statusCode !== 200) { + debug('tunneling socket could not be established, statusCode=%d', + res.statusCode); + socket.destroy(); + var error = new Error('tunneling socket could not be established, ' + + 'statusCode=' + res.statusCode); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; + } + if (head.length > 0) { + debug('got illegal response body from proxy'); + socket.destroy(); + var error = new Error('got illegal response body from proxy'); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; + } + debug('tunneling connection has established'); + self.sockets[self.sockets.indexOf(placeholder)] = socket; + return cb(socket); + } + + function onError(cause) { + connectReq.removeAllListeners(); + + debug('tunneling socket could not be established, cause=%s\n', + cause.message, cause.stack); + var error = new Error('tunneling socket could not be established, ' + + 'cause=' + cause.message); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + } +}; - /** - * @method hex - * @memberof Md4 - * @instance - * @description Output hash as hex string - * @returns {String} Hex string - * @see {@link md4.hex} - * @example - * hash.hex(); - */ - Md4.prototype.hex = function () { - this.finalize(); - - var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3; - - return HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] + - HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] + - HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] + - HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] + - HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] + - HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] + - HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] + - HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] + - HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] + - HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] + - HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] + - HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] + - HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] + - HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] + - HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] + - HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F]; - }; +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket) + if (pos === -1) { + return; + } + this.sockets.splice(pos, 1); + + var pending = this.requests.shift(); + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createSocket(pending, function(socket) { + pending.request.onSocket(socket); + }); + } +}; - /** - * @method toString - * @memberof Md4 - * @instance - * @description Output hash as hex string - * @returns {String} Hex string - * @see {@link md4.hex} - * @example - * hash.toString(); - */ - Md4.prototype.toString = Md4.prototype.hex; - - /** - * @method digest - * @memberof Md4 - * @instance - * @description Output hash as bytes array - * @returns {Array} Bytes array - * @see {@link md4.digest} - * @example - * hash.digest(); - */ - Md4.prototype.digest = function () { - this.finalize(); - - var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3; - return [ - h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 24) & 0xFF, - h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 24) & 0xFF, - h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 24) & 0xFF, - h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 24) & 0xFF - ]; - }; +function createSecureSocket(options, cb) { + var self = this; + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + var hostHeader = options.request.getHeader('host'); + var tlsOptions = mergeOptions({}, self.options, { + socket: socket, + servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host + }); + + // 0 is dummy port for v0.6 + var secureSocket = tls.connect(0, tlsOptions); + self.sockets[self.sockets.indexOf(socket)] = secureSocket; + cb(secureSocket); + }); +} - /** - * @method array - * @memberof Md4 - * @instance - * @description Output hash as bytes array - * @returns {Array} Bytes array - * @see {@link md4.array} - * @example - * hash.array(); - */ - Md4.prototype.array = Md4.prototype.digest; - - /** - * @method arrayBuffer - * @memberof Md4 - * @instance - * @description Output hash as ArrayBuffer - * @returns {ArrayBuffer} ArrayBuffer - * @see {@link md4.arrayBuffer} - * @example - * hash.arrayBuffer(); - */ - Md4.prototype.arrayBuffer = function () { - this.finalize(); - - var buffer = new ArrayBuffer(16); - var blocks = new Uint32Array(buffer); - blocks[0] = this.h0; - blocks[1] = this.h1; - blocks[2] = this.h2; - blocks[3] = this.h3; - return buffer; - }; - /** - * @method buffer - * @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead. - * @memberof Md4 - * @instance - * @description Output hash as ArrayBuffer - * @returns {ArrayBuffer} ArrayBuffer - * @see {@link md4.buffer} - * @example - * hash.buffer(); - */ - Md4.prototype.buffer = Md4.prototype.arrayBuffer; - - var exports = createMethod(); - - if (COMMON_JS) { - module.exports = exports; - } else { - /** - * @method md4 - * @description MD4 hash function, export to global in browsers. - * @param {String|Array|Uint8Array|ArrayBuffer} message message to hash - * @returns {String} md4 hashes - * @example - * md4(''); // 31d6cfe0d16ae931b73c59d7e0c089c0 - * md4('The quick brown fox jumps over the lazy dog'); // 1bee69a46ba811185c194762abaeae90 - * md4('The quick brown fox jumps over the lazy dog.'); // 2812c6c7136898c51f6f6739ad08750e - * - * // It also supports UTF-8 encoding - * md4('中文'); // 223088bf7bd45a16436b15360c5fc5a0 - * - * // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer` - * md4([]); // 31d6cfe0d16ae931b73c59d7e0c089c0 - * md4(new Uint8Array([])); // 31d6cfe0d16ae931b73c59d7e0c089c0 - */ - root.md4 = exports; - if (AMD) { - define(function () { - return exports; - }); - } - } - })(); +function toOptions(host, port, localAddress) { + if (typeof host === 'string') { // since v0.10 + return { + host: host, + port: port, + localAddress: localAddress + }; + } + return host; // for v0.11 or later +} +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i]; + if (typeof overrides === 'object') { + var keys = Object.keys(overrides); + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j]; + if (overrides[k] !== undefined) { + target[k] = overrides[k]; + } + } + } + } + return target; +} - /***/ -}), -/***/ 910: -/***/ ((module) => { +var debug; +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments); + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0]; + } else { + args.unshift('TUNNEL:'); + } + console.error.apply(console, args); + } +} else { + debug = function() {}; +} +exports.debug = debug; // for test - module.exports = assert; - function assert(val, msg) { - if (!val) - throw new Error(msg || 'Assertion failed'); - } +/***/ }), - assert.equal = function assertEqual(l, r, msg) { - if (l != r) - throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r)); - }; +/***/ 4442: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +"use strict"; - /***/ -}), +Object.defineProperty(exports, "__esModule", ({ value: true })); +var basiccreds_1 = __nccwpck_require__(7954); +exports.BasicCredentialHandler = basiccreds_1.BasicCredentialHandler; +var bearertoken_1 = __nccwpck_require__(7431); +exports.BearerCredentialHandler = bearertoken_1.BearerCredentialHandler; +var ntlm_1 = __nccwpck_require__(4157); +exports.NtlmCredentialHandler = ntlm_1.NtlmCredentialHandler; +var personalaccesstoken_1 = __nccwpck_require__(7799); +exports.PersonalAccessTokenCredentialHandler = personalaccesstoken_1.PersonalAccessTokenCredentialHandler; -/***/ 354: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - "use strict"; +/***/ }), - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.findMadeSync = exports.findMade = void 0; - const path_1 = __nccwpck_require__(1017); - const findMade = async (opts, parent, path) => { - // we never want the 'made' return value to be a root directory - if (path === parent) { - return; +/***/ 5538: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const url = __nccwpck_require__(7310); +const http = __nccwpck_require__(3685); +const https = __nccwpck_require__(5687); +const util = __nccwpck_require__(9470); +let fs; +let tunnel; +var HttpCodes; +(function (HttpCodes) { + HttpCodes[HttpCodes["OK"] = 200] = "OK"; + HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; + HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; + HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; + HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; + HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; + HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; + HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; + HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; + HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; + HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; + HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; + HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; + HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; + HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; + HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; + HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; + HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; + HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; + HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; + HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; + HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; + HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; + HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; + HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; + HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; + HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; +})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); +const HttpRedirectCodes = [HttpCodes.MovedPermanently, HttpCodes.ResourceMoved, HttpCodes.SeeOther, HttpCodes.TemporaryRedirect, HttpCodes.PermanentRedirect]; +const HttpResponseRetryCodes = [HttpCodes.BadGateway, HttpCodes.ServiceUnavailable, HttpCodes.GatewayTimeout]; +const NetworkRetryErrors = ['ECONNRESET', 'ENOTFOUND', 'ESOCKETTIMEDOUT', 'ETIMEDOUT', 'ECONNREFUSED']; +const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; +const ExponentialBackoffCeiling = 10; +const ExponentialBackoffTimeSlice = 5; +class HttpClientResponse { + constructor(message) { + this.message = message; + } + readBody() { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + const chunks = []; + const encodingCharset = util.obtainContentCharset(this); + // Extract Encoding from header: 'content-encoding' + // Match `gzip`, `gzip, deflate` variations of GZIP encoding + const contentEncoding = this.message.headers['content-encoding'] || ''; + const isGzippedEncoded = new RegExp('(gzip$)|(gzip, *deflate)').test(contentEncoding); + this.message.on('data', function (data) { + const chunk = (typeof data === 'string') ? Buffer.from(data, encodingCharset) : data; + chunks.push(chunk); + }).on('end', function () { + return __awaiter(this, void 0, void 0, function* () { + const buffer = Buffer.concat(chunks); + if (isGzippedEncoded) { // Process GZipped Response Body HERE + const gunzippedBody = yield util.decompressGzippedContent(buffer, encodingCharset); + resolve(gunzippedBody); } - return opts.statAsync(parent).then(st => (st.isDirectory() ? path : undefined), // will fail later - // will fail later - er => { - const fer = er; - return fer && fer.code === 'ENOENT' - ? (0, exports.findMade)(opts, (0, path_1.dirname)(parent), parent) - : undefined; - }); - }; - exports.findMade = findMade; - const findMadeSync = (opts, parent, path) => { - if (path === parent) { - return undefined; + else { + resolve(buffer.toString(encodingCharset)); } - try { - return opts.statSync(parent).isDirectory() ? path : undefined; + }); + }).on('error', function (err) { + reject(err); + }); + })); + } +} +exports.HttpClientResponse = HttpClientResponse; +function isHttps(requestUrl) { + let parsedUrl = url.parse(requestUrl); + return parsedUrl.protocol === 'https:'; +} +exports.isHttps = isHttps; +var EnvironmentVariables; +(function (EnvironmentVariables) { + EnvironmentVariables["HTTP_PROXY"] = "HTTP_PROXY"; + EnvironmentVariables["HTTPS_PROXY"] = "HTTPS_PROXY"; + EnvironmentVariables["NO_PROXY"] = "NO_PROXY"; +})(EnvironmentVariables || (EnvironmentVariables = {})); +class HttpClient { + constructor(userAgent, handlers, requestOptions) { + this._ignoreSslError = false; + this._allowRedirects = true; + this._allowRedirectDowngrade = false; + this._maxRedirects = 50; + this._allowRetries = false; + this._maxRetries = 1; + this._keepAlive = false; + this._disposed = false; + this.userAgent = userAgent; + this.handlers = handlers || []; + let no_proxy = process.env[EnvironmentVariables.NO_PROXY]; + if (no_proxy) { + this._httpProxyBypassHosts = []; + no_proxy.split(',').forEach(bypass => { + this._httpProxyBypassHosts.push(util.buildProxyBypassRegexFromEnv(bypass)); + }); + } + this.requestOptions = requestOptions; + if (requestOptions) { + if (requestOptions.ignoreSslError != null) { + this._ignoreSslError = requestOptions.ignoreSslError; + } + this._socketTimeout = requestOptions.socketTimeout; + this._httpProxy = requestOptions.proxy; + if (requestOptions.proxy && requestOptions.proxy.proxyBypassHosts) { + this._httpProxyBypassHosts = []; + requestOptions.proxy.proxyBypassHosts.forEach(bypass => { + this._httpProxyBypassHosts.push(new RegExp(bypass, 'i')); + }); + } + this._certConfig = requestOptions.cert; + if (this._certConfig) { + // If using cert, need fs + fs = __nccwpck_require__(7147); + // cache the cert content into memory, so we don't have to read it from disk every time + if (this._certConfig.caFile && fs.existsSync(this._certConfig.caFile)) { + this._ca = fs.readFileSync(this._certConfig.caFile, 'utf8'); + } + if (this._certConfig.certFile && fs.existsSync(this._certConfig.certFile)) { + this._cert = fs.readFileSync(this._certConfig.certFile, 'utf8'); + } + if (this._certConfig.keyFile && fs.existsSync(this._certConfig.keyFile)) { + this._key = fs.readFileSync(this._certConfig.keyFile, 'utf8'); + } + } + if (requestOptions.allowRedirects != null) { + this._allowRedirects = requestOptions.allowRedirects; + } + if (requestOptions.allowRedirectDowngrade != null) { + this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; + } + if (requestOptions.maxRedirects != null) { + this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); + } + if (requestOptions.keepAlive != null) { + this._keepAlive = requestOptions.keepAlive; + } + if (requestOptions.allowRetries != null) { + this._allowRetries = requestOptions.allowRetries; + } + if (requestOptions.maxRetries != null) { + this._maxRetries = requestOptions.maxRetries; + } + } + } + options(requestUrl, additionalHeaders) { + return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); + } + get(requestUrl, additionalHeaders) { + return this.request('GET', requestUrl, null, additionalHeaders || {}); + } + del(requestUrl, additionalHeaders) { + return this.request('DELETE', requestUrl, null, additionalHeaders || {}); + } + post(requestUrl, data, additionalHeaders) { + return this.request('POST', requestUrl, data, additionalHeaders || {}); + } + patch(requestUrl, data, additionalHeaders) { + return this.request('PATCH', requestUrl, data, additionalHeaders || {}); + } + put(requestUrl, data, additionalHeaders) { + return this.request('PUT', requestUrl, data, additionalHeaders || {}); + } + head(requestUrl, additionalHeaders) { + return this.request('HEAD', requestUrl, null, additionalHeaders || {}); + } + sendStream(verb, requestUrl, stream, additionalHeaders) { + return this.request(verb, requestUrl, stream, additionalHeaders); + } + /** + * Makes a raw http request. + * All other methods such as get, post, patch, and request ultimately call this. + * Prefer get, del, post and patch + */ + request(verb, requestUrl, data, headers) { + return __awaiter(this, void 0, void 0, function* () { + if (this._disposed) { + throw new Error("Client has already been disposed."); + } + let parsedUrl = url.parse(requestUrl); + let info = this._prepareRequest(verb, parsedUrl, headers); + // Only perform retries on reads since writes may not be idempotent. + let maxTries = (this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1) ? this._maxRetries + 1 : 1; + let numTries = 0; + let response; + while (numTries < maxTries) { + try { + response = yield this.requestRaw(info, data); + } + catch (err) { + numTries++; + if (err && err.code && NetworkRetryErrors.indexOf(err.code) > -1 && numTries < maxTries) { + yield this._performExponentialBackoff(numTries); + continue; + } + throw err; + } + // Check if it's an authentication challenge + if (response && response.message && response.message.statusCode === HttpCodes.Unauthorized) { + let authenticationHandler; + for (let i = 0; i < this.handlers.length; i++) { + if (this.handlers[i].canHandleAuthentication(response)) { + authenticationHandler = this.handlers[i]; + break; + } } - catch (er) { - const fer = er; - return fer && fer.code === 'ENOENT' - ? (0, exports.findMadeSync)(opts, (0, path_1.dirname)(parent), parent) - : undefined; + if (authenticationHandler) { + return authenticationHandler.handleAuthentication(this, info, data); } + else { + // We have received an unauthorized response but have no handlers to handle it. + // Let the response return to the caller. + return response; + } + } + let redirectsRemaining = this._maxRedirects; + while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 + && this._allowRedirects + && redirectsRemaining > 0) { + const redirectUrl = response.message.headers["location"]; + if (!redirectUrl) { + // if there's no location to redirect to, we won't + break; + } + let parsedRedirectUrl = url.parse(redirectUrl); + if (parsedUrl.protocol == 'https:' && parsedUrl.protocol != parsedRedirectUrl.protocol && !this._allowRedirectDowngrade) { + throw new Error("Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true."); + } + // we need to finish reading the response before reassigning response + // which will leak the open socket. + yield response.readBody(); + // let's make the request with the new redirectUrl + info = this._prepareRequest(verb, parsedRedirectUrl, headers); + response = yield this.requestRaw(info, data); + redirectsRemaining--; + } + if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) { + // If not a retry code, return immediately instead of retrying + return response; + } + numTries += 1; + if (numTries < maxTries) { + yield response.readBody(); + yield this._performExponentialBackoff(numTries); + } + } + return response; + }); + } + /** + * Needs to be called if keepAlive is set to true in request options. + */ + dispose() { + if (this._agent) { + this._agent.destroy(); + } + this._disposed = true; + } + /** + * Raw request. + * @param info + * @param data + */ + requestRaw(info, data) { + return new Promise((resolve, reject) => { + let callbackForResult = function (err, res) { + if (err) { + reject(err); + } + resolve(res); + }; + this.requestRawWithCallback(info, data, callbackForResult); + }); + } + /** + * Raw request with callback. + * @param info + * @param data + * @param onResult + */ + requestRawWithCallback(info, data, onResult) { + let socket; + if (typeof (data) === 'string') { + info.options.headers["Content-Length"] = Buffer.byteLength(data, 'utf8'); + } + let callbackCalled = false; + let handleResult = (err, res) => { + if (!callbackCalled) { + callbackCalled = true; + onResult(err, res); + } + }; + let req = info.httpModule.request(info.options, (msg) => { + let res = new HttpClientResponse(msg); + handleResult(null, res); + }); + req.on('socket', (sock) => { + socket = sock; + }); + // If we ever get disconnected, we want the socket to timeout eventually + req.setTimeout(this._socketTimeout || 3 * 60000, () => { + if (socket) { + socket.destroy(); + } + handleResult(new Error('Request timeout: ' + info.options.path), null); + }); + req.on('error', function (err) { + // err has statusCode property + // res should have headers + handleResult(err, null); + }); + if (data && typeof (data) === 'string') { + req.write(data, 'utf8'); + } + if (data && typeof (data) !== 'string') { + data.on('close', function () { + req.end(); + }); + data.pipe(req); + } + else { + req.end(); + } + } + _prepareRequest(method, requestUrl, headers) { + const info = {}; + info.parsedUrl = requestUrl; + const usingSsl = info.parsedUrl.protocol === 'https:'; + info.httpModule = usingSsl ? https : http; + const defaultPort = usingSsl ? 443 : 80; + info.options = {}; + info.options.host = info.parsedUrl.hostname; + info.options.port = info.parsedUrl.port ? parseInt(info.parsedUrl.port) : defaultPort; + info.options.path = (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); + info.options.method = method; + info.options.timeout = (this.requestOptions && this.requestOptions.socketTimeout) || this._socketTimeout; + this._socketTimeout = info.options.timeout; + info.options.headers = this._mergeHeaders(headers); + if (this.userAgent != null) { + info.options.headers["user-agent"] = this.userAgent; + } + info.options.agent = this._getAgent(info.parsedUrl); + // gives handlers an opportunity to participate + if (this.handlers && !this._isPresigned(url.format(requestUrl))) { + this.handlers.forEach((handler) => { + handler.prepareRequest(info.options); + }); + } + return info; + } + _isPresigned(requestUrl) { + if (this.requestOptions && this.requestOptions.presignedUrlPatterns) { + const patterns = this.requestOptions.presignedUrlPatterns; + for (let i = 0; i < patterns.length; i++) { + if (requestUrl.match(patterns[i])) { + return true; + } + } + } + return false; + } + _mergeHeaders(headers) { + const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {}); + if (this.requestOptions && this.requestOptions.headers) { + return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers)); + } + return lowercaseKeys(headers || {}); + } + _getAgent(parsedUrl) { + let agent; + let proxy = this._getProxy(parsedUrl); + let useProxy = proxy.proxyUrl && proxy.proxyUrl.hostname && !this._isMatchInBypassProxyList(parsedUrl); + if (this._keepAlive && useProxy) { + agent = this._proxyAgent; + } + if (this._keepAlive && !useProxy) { + agent = this._agent; + } + // if agent is already assigned use that agent. + if (!!agent) { + return agent; + } + const usingSsl = parsedUrl.protocol === 'https:'; + let maxSockets = 100; + if (!!this.requestOptions) { + maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; + } + if (useProxy) { + // If using proxy, need tunnel + if (!tunnel) { + tunnel = __nccwpck_require__(4294); + } + const agentOptions = { + maxSockets: maxSockets, + keepAlive: this._keepAlive, + proxy: { + proxyAuth: proxy.proxyAuth, + host: proxy.proxyUrl.hostname, + port: proxy.proxyUrl.port + }, + }; + let tunnelAgent; + const overHttps = proxy.proxyUrl.protocol === 'https:'; + if (usingSsl) { + tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; + } + else { + tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; + } + agent = tunnelAgent(agentOptions); + this._proxyAgent = agent; + } + // if reusing agent across request and tunneling agent isn't assigned create a new agent + if (this._keepAlive && !agent) { + const options = { keepAlive: this._keepAlive, maxSockets: maxSockets }; + agent = usingSsl ? new https.Agent(options) : new http.Agent(options); + this._agent = agent; + } + // if not using private agent and tunnel agent isn't setup then use global agent + if (!agent) { + agent = usingSsl ? https.globalAgent : http.globalAgent; + } + if (usingSsl && this._ignoreSslError) { + // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process + // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options + // we have to cast it to any and change it directly + agent.options = Object.assign(agent.options || {}, { rejectUnauthorized: false }); + } + if (usingSsl && this._certConfig) { + agent.options = Object.assign(agent.options || {}, { ca: this._ca, cert: this._cert, key: this._key, passphrase: this._certConfig.passphrase }); + } + return agent; + } + _getProxy(parsedUrl) { + let usingSsl = parsedUrl.protocol === 'https:'; + let proxyConfig = this._httpProxy; + // fallback to http_proxy and https_proxy env + let https_proxy = process.env[EnvironmentVariables.HTTPS_PROXY]; + let http_proxy = process.env[EnvironmentVariables.HTTP_PROXY]; + if (!proxyConfig) { + if (https_proxy && usingSsl) { + proxyConfig = { + proxyUrl: https_proxy }; - exports.findMadeSync = findMadeSync; - //# sourceMappingURL=find-made.js.map + } + else if (http_proxy) { + proxyConfig = { + proxyUrl: http_proxy + }; + } + } + let proxyUrl; + let proxyAuth; + if (proxyConfig) { + if (proxyConfig.proxyUrl.length > 0) { + proxyUrl = url.parse(proxyConfig.proxyUrl); + } + if (proxyConfig.proxyUsername || proxyConfig.proxyPassword) { + proxyAuth = proxyConfig.proxyUsername + ":" + proxyConfig.proxyPassword; + } + } + return { proxyUrl: proxyUrl, proxyAuth: proxyAuth }; + } + _isMatchInBypassProxyList(parsedUrl) { + if (!this._httpProxyBypassHosts) { + return false; + } + let bypass = false; + this._httpProxyBypassHosts.forEach(bypassHost => { + if (bypassHost.test(parsedUrl.href)) { + bypass = true; + } + }); + return bypass; + } + _performExponentialBackoff(retryNumber) { + retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); + const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); + return new Promise(resolve => setTimeout(() => resolve(), ms)); + } +} +exports.HttpClient = HttpClient; - /***/ -}), -/***/ 7280: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ }), - "use strict"; +/***/ 9470: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const qs = __nccwpck_require__(2760); +const url = __nccwpck_require__(7310); +const path = __nccwpck_require__(1017); +const zlib = __nccwpck_require__(9796); +/** + * creates an url from a request url and optional base url (http://server:8080) + * @param {string} resource - a fully qualified url or relative path + * @param {string} baseUrl - an optional baseUrl (http://server:8080) + * @param {IRequestOptions} options - an optional options object, could include QueryParameters e.g. + * @return {string} - resultant url + */ +function getUrl(resource, baseUrl, queryParams) { + const pathApi = path.posix || path; + let requestUrl = ''; + if (!baseUrl) { + requestUrl = resource; + } + else if (!resource) { + requestUrl = baseUrl; + } + else { + const base = url.parse(baseUrl); + const resultantUrl = url.parse(resource); + // resource (specific per request) elements take priority + resultantUrl.protocol = resultantUrl.protocol || base.protocol; + resultantUrl.auth = resultantUrl.auth || base.auth; + resultantUrl.host = resultantUrl.host || base.host; + resultantUrl.pathname = pathApi.resolve(base.pathname, resultantUrl.pathname); + if (!resultantUrl.pathname.endsWith('/') && resource.endsWith('/')) { + resultantUrl.pathname += '/'; + } + requestUrl = url.format(resultantUrl); + } + return queryParams ? + getUrlWithParsedQueryParams(requestUrl, queryParams) : + requestUrl; +} +exports.getUrl = getUrl; +/** + * + * @param {string} requestUrl + * @param {IRequestQueryParams} queryParams + * @return {string} - Request's URL with Query Parameters appended/parsed. + */ +function getUrlWithParsedQueryParams(requestUrl, queryParams) { + const url = requestUrl.replace(/\?$/g, ''); // Clean any extra end-of-string "?" character + const parsedQueryParams = qs.stringify(queryParams.params, buildParamsStringifyOptions(queryParams)); + return `${url}${parsedQueryParams}`; +} +/** + * Build options for QueryParams Stringifying. + * + * @param {IRequestQueryParams} queryParams + * @return {object} + */ +function buildParamsStringifyOptions(queryParams) { + let options = { + addQueryPrefix: true, + delimiter: (queryParams.options || {}).separator || '&', + allowDots: (queryParams.options || {}).shouldAllowDots || false, + arrayFormat: (queryParams.options || {}).arrayFormat || 'repeat', + encodeValuesOnly: (queryParams.options || {}).shouldOnlyEncodeValues || true + }; + return options; +} +/** + * Decompress/Decode gzip encoded JSON + * Using Node.js built-in zlib module + * + * @param {Buffer} buffer + * @param {string} charset? - optional; defaults to 'utf-8' + * @return {Promise} + */ +function decompressGzippedContent(buffer, charset) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + zlib.gunzip(buffer, function (error, buffer) { + if (error) { + reject(error); + } + else { + resolve(buffer.toString(charset || 'utf-8')); + } + }); + })); + }); +} +exports.decompressGzippedContent = decompressGzippedContent; +/** + * Builds a RegExp to test urls against for deciding + * wether to bypass proxy from an entry of the + * environment variable setting NO_PROXY + * + * @param {string} bypass + * @return {RegExp} + */ +function buildProxyBypassRegexFromEnv(bypass) { + try { + // We need to keep this around for back-compat purposes + return new RegExp(bypass, 'i'); + } + catch (err) { + if (err instanceof SyntaxError && (bypass || "").startsWith("*")) { + let wildcardEscaped = bypass.replace('*', '(.*)'); + return new RegExp(wildcardEscaped, 'i'); + } + throw err; + } +} +exports.buildProxyBypassRegexFromEnv = buildProxyBypassRegexFromEnv; +/** + * Obtain Response's Content Charset. + * Through inspecting `content-type` response header. + * It Returns 'utf-8' if NO charset specified/matched. + * + * @param {IHttpClientResponse} response + * @return {string} - Content Encoding Charset; Default=utf-8 + */ +function obtainContentCharset(response) { + // Find the charset, if specified. + // Search for the `charset=CHARSET` string, not including `;,\r\n` + // Example: content-type: 'application/json;charset=utf-8' + // |__ matches would be ['charset=utf-8', 'utf-8', index: 18, input: 'application/json; charset=utf-8'] + // |_____ matches[1] would have the charset :tada: , in our example it's utf-8 + // However, if the matches Array was empty or no charset found, 'utf-8' would be returned by default. + const nodeSupportedEncodings = ['ascii', 'utf8', 'utf16le', 'ucs2', 'base64', 'binary', 'hex']; + const contentType = response.message.headers['content-type'] || ''; + const matches = contentType.match(/charset=([^;,\r\n]+)/i); + return (matches && matches[1] && nodeSupportedEncodings.indexOf(matches[1]) != -1) ? matches[1] : 'utf-8'; +} +exports.obtainContentCharset = obtainContentCharset; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.mkdirp = exports.nativeSync = exports.native = exports.manualSync = exports.manual = exports.sync = exports.mkdirpSync = exports.useNativeSync = exports.useNative = exports.mkdirpNativeSync = exports.mkdirpNative = exports.mkdirpManualSync = exports.mkdirpManual = void 0; - const mkdirp_manual_js_1 = __nccwpck_require__(6386); - const mkdirp_native_js_1 = __nccwpck_require__(3842); - const opts_arg_js_1 = __nccwpck_require__(2110); - const path_arg_js_1 = __nccwpck_require__(8577); - const use_native_js_1 = __nccwpck_require__(8918); - /* c8 ignore start */ - var mkdirp_manual_js_2 = __nccwpck_require__(6386); - Object.defineProperty(exports, "mkdirpManual", ({ enumerable: true, get: function () { return mkdirp_manual_js_2.mkdirpManual; } })); - Object.defineProperty(exports, "mkdirpManualSync", ({ enumerable: true, get: function () { return mkdirp_manual_js_2.mkdirpManualSync; } })); - var mkdirp_native_js_2 = __nccwpck_require__(3842); - Object.defineProperty(exports, "mkdirpNative", ({ enumerable: true, get: function () { return mkdirp_native_js_2.mkdirpNative; } })); - Object.defineProperty(exports, "mkdirpNativeSync", ({ enumerable: true, get: function () { return mkdirp_native_js_2.mkdirpNativeSync; } })); - var use_native_js_2 = __nccwpck_require__(8918); - Object.defineProperty(exports, "useNative", ({ enumerable: true, get: function () { return use_native_js_2.useNative; } })); - Object.defineProperty(exports, "useNativeSync", ({ enumerable: true, get: function () { return use_native_js_2.useNativeSync; } })); - /* c8 ignore stop */ - const mkdirpSync = (path, opts) => { - path = (0, path_arg_js_1.pathArg)(path); - const resolved = (0, opts_arg_js_1.optsArg)(opts); - return (0, use_native_js_1.useNativeSync)(resolved) - ? (0, mkdirp_native_js_1.mkdirpNativeSync)(path, resolved) - : (0, mkdirp_manual_js_1.mkdirpManualSync)(path, resolved); - }; - exports.mkdirpSync = mkdirpSync; - exports.sync = exports.mkdirpSync; - exports.manual = mkdirp_manual_js_1.mkdirpManual; - exports.manualSync = mkdirp_manual_js_1.mkdirpManualSync; - exports.native = mkdirp_native_js_1.mkdirpNative; - exports.nativeSync = mkdirp_native_js_1.mkdirpNativeSync; - exports.mkdirp = Object.assign(async (path, opts) => { - path = (0, path_arg_js_1.pathArg)(path); - const resolved = (0, opts_arg_js_1.optsArg)(opts); - return (0, use_native_js_1.useNative)(resolved) - ? (0, mkdirp_native_js_1.mkdirpNative)(path, resolved) - : (0, mkdirp_manual_js_1.mkdirpManual)(path, resolved); - }, { - mkdirpSync: exports.mkdirpSync, - mkdirpNative: mkdirp_native_js_1.mkdirpNative, - mkdirpNativeSync: mkdirp_native_js_1.mkdirpNativeSync, - mkdirpManual: mkdirp_manual_js_1.mkdirpManual, - mkdirpManualSync: mkdirp_manual_js_1.mkdirpManualSync, - sync: exports.mkdirpSync, - native: mkdirp_native_js_1.mkdirpNative, - nativeSync: mkdirp_native_js_1.mkdirpNativeSync, - manual: mkdirp_manual_js_1.mkdirpManual, - manualSync: mkdirp_manual_js_1.mkdirpManualSync, - useNative: use_native_js_1.useNative, - useNativeSync: use_native_js_1.useNativeSync, - }); - //# sourceMappingURL=index.js.map - /***/ -}), +/***/ }), -/***/ 6386: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ 7954: +/***/ ((__unused_webpack_module, exports) => { - "use strict"; - - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.mkdirpManual = exports.mkdirpManualSync = void 0; - const path_1 = __nccwpck_require__(1017); - const opts_arg_js_1 = __nccwpck_require__(2110); - const mkdirpManualSync = (path, options, made) => { - const parent = (0, path_1.dirname)(path); - const opts = { ...(0, opts_arg_js_1.optsArg)(options), recursive: false }; - if (parent === path) { - try { - return opts.mkdirSync(path, opts); - } - catch (er) { - // swallowed by recursive implementation on posix systems - // any other error is a failure - const fer = er; - if (fer && fer.code !== 'EISDIR') { - throw er; - } - return; - } - } - try { - opts.mkdirSync(path, opts); - return made || path; - } - catch (er) { - const fer = er; - if (fer && fer.code === 'ENOENT') { - return (0, exports.mkdirpManualSync)(path, opts, (0, exports.mkdirpManualSync)(parent, opts, made)); - } - if (fer && fer.code !== 'EEXIST' && fer && fer.code !== 'EROFS') { - throw er; - } - try { - if (!opts.statSync(path).isDirectory()) - throw er; - } - catch (_) { - throw er; - } - } - }; - exports.mkdirpManualSync = mkdirpManualSync; - exports.mkdirpManual = Object.assign(async (path, options, made) => { - const opts = (0, opts_arg_js_1.optsArg)(options); - opts.recursive = false; - const parent = (0, path_1.dirname)(path); - if (parent === path) { - return opts.mkdirAsync(path, opts).catch(er => { - // swallowed by recursive implementation on posix systems - // any other error is a failure - const fer = er; - if (fer && fer.code !== 'EISDIR') { - throw er; - } - }); - } - return opts.mkdirAsync(path, opts).then(() => made || path, async (er) => { - const fer = er; - if (fer && fer.code === 'ENOENT') { - return (0, exports.mkdirpManual)(parent, opts).then((made) => (0, exports.mkdirpManual)(path, opts, made)); - } - if (fer && fer.code !== 'EEXIST' && fer.code !== 'EROFS') { - throw er; - } - return opts.statAsync(path).then(st => { - if (st.isDirectory()) { - return made; - } - else { - throw er; - } - }, () => { - throw er; - }); - }); - }, { sync: exports.mkdirpManualSync }); - //# sourceMappingURL=mkdirp-manual.js.map +"use strict"; + +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +Object.defineProperty(exports, "__esModule", ({ value: true })); +class BasicCredentialHandler { + constructor(username, password, allowCrossOriginAuthentication) { + this.username = username; + this.password = password; + this.allowCrossOriginAuthentication = allowCrossOriginAuthentication; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!this.origin) { + this.origin = options.host; + } + // If this is a redirection, don't set the Authorization header + if (this.origin === options.host || this.allowCrossOriginAuthentication) { + options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`; + } + options.headers['X-TFS-FedAuthRedirect'] = 'Suppress'; + } + // This handler cannot handle 401 + canHandleAuthentication(response) { + return false; + } + handleAuthentication(httpClient, requestInfo, objs) { + return null; + } +} +exports.BasicCredentialHandler = BasicCredentialHandler; - /***/ -}), -/***/ 3842: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/***/ }), - "use strict"; - - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.mkdirpNative = exports.mkdirpNativeSync = void 0; - const path_1 = __nccwpck_require__(1017); - const find_made_js_1 = __nccwpck_require__(354); - const mkdirp_manual_js_1 = __nccwpck_require__(6386); - const opts_arg_js_1 = __nccwpck_require__(2110); - const mkdirpNativeSync = (path, options) => { - const opts = (0, opts_arg_js_1.optsArg)(options); - opts.recursive = true; - const parent = (0, path_1.dirname)(path); - if (parent === path) { - return opts.mkdirSync(path, opts); - } - const made = (0, find_made_js_1.findMadeSync)(opts, path); - try { - opts.mkdirSync(path, opts); - return made; - } - catch (er) { - const fer = er; - if (fer && fer.code === 'ENOENT') { - return (0, mkdirp_manual_js_1.mkdirpManualSync)(path, opts); - } - else { - throw er; - } - } - }; - exports.mkdirpNativeSync = mkdirpNativeSync; - exports.mkdirpNative = Object.assign(async (path, options) => { - const opts = { ...(0, opts_arg_js_1.optsArg)(options), recursive: true }; - const parent = (0, path_1.dirname)(path); - if (parent === path) { - return await opts.mkdirAsync(path, opts); - } - return (0, find_made_js_1.findMade)(opts, path).then((made) => opts - .mkdirAsync(path, opts) - .then(m => made || m) - .catch(er => { - const fer = er; - if (fer && fer.code === 'ENOENT') { - return (0, mkdirp_manual_js_1.mkdirpManual)(path, opts); - } - else { - throw er; - } - })); - }, { sync: exports.mkdirpNativeSync }); - //# sourceMappingURL=mkdirp-native.js.map +/***/ 7431: +/***/ ((__unused_webpack_module, exports) => { - /***/ -}), +"use strict"; + +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +Object.defineProperty(exports, "__esModule", ({ value: true })); +class BearerCredentialHandler { + constructor(token, allowCrossOriginAuthentication) { + this.token = token; + this.allowCrossOriginAuthentication = allowCrossOriginAuthentication; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!this.origin) { + this.origin = options.host; + } + // If this is a redirection, don't set the Authorization header + if (this.origin === options.host || this.allowCrossOriginAuthentication) { + options.headers['Authorization'] = `Bearer ${this.token}`; + } + options.headers['X-TFS-FedAuthRedirect'] = 'Suppress'; + } + // This handler cannot handle 401 + canHandleAuthentication(response) { + return false; + } + handleAuthentication(httpClient, requestInfo, objs) { + return null; + } +} +exports.BearerCredentialHandler = BearerCredentialHandler; -/***/ 2110: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - "use strict"; +/***/ }), - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.optsArg = void 0; - const fs_1 = __nccwpck_require__(7147); - const optsArg = (opts) => { - if (!opts) { - opts = { mode: 0o777 }; - } - else if (typeof opts === 'object') { - opts = { mode: 0o777, ...opts }; - } - else if (typeof opts === 'number') { - opts = { mode: opts }; - } - else if (typeof opts === 'string') { - opts = { mode: parseInt(opts, 8) }; - } - else { - throw new TypeError('invalid options argument'); - } - const resolved = opts; - const optsFs = opts.fs || {}; - opts.mkdir = opts.mkdir || optsFs.mkdir || fs_1.mkdir; - opts.mkdirAsync = opts.mkdirAsync - ? opts.mkdirAsync - : async (path, options) => { - return new Promise((res, rej) => resolved.mkdir(path, options, (er, made) => er ? rej(er) : res(made))); - }; - opts.stat = opts.stat || optsFs.stat || fs_1.stat; - opts.statAsync = opts.statAsync - ? opts.statAsync - : async (path) => new Promise((res, rej) => resolved.stat(path, (err, stats) => (err ? rej(err) : res(stats)))); - opts.statSync = opts.statSync || optsFs.statSync || fs_1.statSync; - opts.mkdirSync = opts.mkdirSync || optsFs.mkdirSync || fs_1.mkdirSync; - return resolved; - }; - exports.optsArg = optsArg; - //# sourceMappingURL=opts-arg.js.map +/***/ 4157: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - /***/ -}), +"use strict"; + +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +Object.defineProperty(exports, "__esModule", ({ value: true })); +const http = __nccwpck_require__(3685); +const https = __nccwpck_require__(5687); +const _ = __nccwpck_require__(5067); +const ntlm = __nccwpck_require__(2673); +class NtlmCredentialHandler { + constructor(username, password, workstation, domain) { + this._ntlmOptions = {}; + this._ntlmOptions.username = username; + this._ntlmOptions.password = password; + this._ntlmOptions.domain = domain || ''; + this._ntlmOptions.workstation = workstation || ''; + } + prepareRequest(options) { + // No headers or options need to be set. We keep the credentials on the handler itself. + // If a (proxy) agent is set, remove it as we don't support proxy for NTLM at this time + if (options.agent) { + delete options.agent; + } + } + canHandleAuthentication(response) { + if (response && response.message && response.message.statusCode === 401) { + // Ensure that we're talking NTLM here + // Once we have the www-authenticate header, split it so we can ensure we can talk NTLM + const wwwAuthenticate = response.message.headers['www-authenticate']; + return wwwAuthenticate && (wwwAuthenticate.split(', ').indexOf("NTLM") >= 0); + } + return false; + } + handleAuthentication(httpClient, requestInfo, objs) { + return new Promise((resolve, reject) => { + const callbackForResult = function (err, res) { + if (err) { + reject(err); + } + // We have to readbody on the response before continuing otherwise there is a hang. + res.readBody().then(() => { + resolve(res); + }); + }; + this.handleAuthenticationPrivate(httpClient, requestInfo, objs, callbackForResult); + }); + } + handleAuthenticationPrivate(httpClient, requestInfo, objs, finalCallback) { + // Set up the headers for NTLM authentication + requestInfo.options = _.extend(requestInfo.options, { + username: this._ntlmOptions.username, + password: this._ntlmOptions.password, + domain: this._ntlmOptions.domain, + workstation: this._ntlmOptions.workstation + }); + requestInfo.options.agent = httpClient.isSsl ? + new https.Agent({ keepAlive: true }) : + new http.Agent({ keepAlive: true }); + let self = this; + // The following pattern of sending the type1 message following immediately (in a setImmediate) is + // critical for the NTLM exchange to happen. If we removed setImmediate (or call in a different manner) + // the NTLM exchange will always fail with a 401. + this.sendType1Message(httpClient, requestInfo, objs, function (err, res) { + if (err) { + return finalCallback(err, null, null); + } + /// We have to readbody on the response before continuing otherwise there is a hang. + res.readBody().then(() => { + // It is critical that we have setImmediate here due to how connection requests are queued. + // If setImmediate is removed then the NTLM handshake will not work. + // setImmediate allows us to queue a second request on the same connection. If this second + // request is not queued on the connection when the first request finishes then node closes + // the connection. NTLM requires both requests to be on the same connection so we need this. + setImmediate(function () { + self.sendType3Message(httpClient, requestInfo, objs, res, finalCallback); + }); + }); + }); + } + // The following method is an adaptation of code found at https://github.com/SamDecrock/node-http-ntlm/blob/master/httpntlm.js + sendType1Message(httpClient, requestInfo, objs, finalCallback) { + const type1HexBuffer = ntlm.encodeType1(this._ntlmOptions.workstation, this._ntlmOptions.domain); + const type1msg = `NTLM ${type1HexBuffer.toString('base64')}`; + const type1options = { + headers: { + 'Connection': 'keep-alive', + 'Authorization': type1msg + }, + timeout: requestInfo.options.timeout || 0, + agent: requestInfo.httpModule, + }; + const type1info = {}; + type1info.httpModule = requestInfo.httpModule; + type1info.parsedUrl = requestInfo.parsedUrl; + type1info.options = _.extend(type1options, _.omit(requestInfo.options, 'headers')); + return httpClient.requestRawWithCallback(type1info, objs, finalCallback); + } + // The following method is an adaptation of code found at https://github.com/SamDecrock/node-http-ntlm/blob/master/httpntlm.js + sendType3Message(httpClient, requestInfo, objs, res, callback) { + if (!res.message.headers && !res.message.headers['www-authenticate']) { + throw new Error('www-authenticate not found on response of second request'); + } + /** + * Server will respond with challenge/nonce + * assigned to response's "WWW-AUTHENTICATE" header + * and should adhere to RegExp /^NTLM\s+(.+?)(,|\s+|$)/ + */ + const serverNonceRegex = /^NTLM\s+(.+?)(,|\s+|$)/; + const serverNonce = Buffer.from((res.message.headers['www-authenticate'].match(serverNonceRegex) || [])[1], 'base64'); + let type2msg; + /** + * Wrap decoding the Server's challenge/nonce in + * try-catch block to throw more comprehensive + * Error with clear message to consumer + */ + try { + type2msg = ntlm.decodeType2(serverNonce); + } + catch (error) { + throw new Error(`Decoding Server's Challenge to Obtain Type2Message failed with error: ${error.message}`); + } + const type3msg = ntlm.encodeType3(this._ntlmOptions.username, this._ntlmOptions.workstation, this._ntlmOptions.domain, type2msg, this._ntlmOptions.password).toString('base64'); + const type3options = { + headers: { + 'Authorization': `NTLM ${type3msg}`, + 'Connection': 'Close' + }, + agent: requestInfo.httpModule, + }; + const type3info = {}; + type3info.httpModule = requestInfo.httpModule; + type3info.parsedUrl = requestInfo.parsedUrl; + type3options.headers = _.extend(type3options.headers, requestInfo.options.headers); + type3info.options = _.extend(type3options, _.omit(requestInfo.options, 'headers')); + return httpClient.requestRawWithCallback(type3info, objs, callback); + } +} +exports.NtlmCredentialHandler = NtlmCredentialHandler; -/***/ 8577: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - "use strict"; - - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.pathArg = void 0; - const platform = process.env.__TESTING_MKDIRP_PLATFORM__ || process.platform; - const path_1 = __nccwpck_require__(1017); - const pathArg = (path) => { - if (/\0/.test(path)) { - // simulate same failure that node raises - throw Object.assign(new TypeError('path must be a string without null bytes'), { - path, - code: 'ERR_INVALID_ARG_VALUE', - }); - } - path = (0, path_1.resolve)(path); - if (platform === 'win32') { - const badWinChars = /[*|"<>?:]/; - const { root } = (0, path_1.parse)(path); - if (badWinChars.test(path.substring(root.length))) { - throw Object.assign(new Error('Illegal characters in path.'), { - path, - code: 'EINVAL', - }); - } - } - return path; - }; - exports.pathArg = pathArg; - //# sourceMappingURL=path-arg.js.map +/***/ }), - /***/ -}), +/***/ 7799: +/***/ ((__unused_webpack_module, exports) => { -/***/ 8918: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +"use strict"; + +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +Object.defineProperty(exports, "__esModule", ({ value: true })); +class PersonalAccessTokenCredentialHandler { + constructor(token, allowCrossOriginAuthentication) { + this.token = token; + this.allowCrossOriginAuthentication = allowCrossOriginAuthentication; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!this.origin) { + this.origin = options.host; + } + // If this is a redirection, don't set the Authorization header + if (this.origin === options.host || this.allowCrossOriginAuthentication) { + options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`; + } + options.headers['X-TFS-FedAuthRedirect'] = 'Suppress'; + } + // This handler cannot handle 401 + canHandleAuthentication(response) { + return false; + } + handleAuthentication(httpClient, requestInfo, objs) { + return null; + } +} +exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; - "use strict"; - - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.useNative = exports.useNativeSync = void 0; - const fs_1 = __nccwpck_require__(7147); - const opts_arg_js_1 = __nccwpck_require__(2110); - const version = process.env.__TESTING_MKDIRP_NODE_VERSION__ || process.version; - const versArr = version.replace(/^v/, '').split('.'); - const hasNative = +versArr[0] > 10 || (+versArr[0] === 10 && +versArr[1] >= 12); - exports.useNativeSync = !hasNative - ? () => false - : (opts) => (0, opts_arg_js_1.optsArg)(opts).mkdirSync === fs_1.mkdirSync; - exports.useNative = Object.assign(!hasNative - ? () => false - : (opts) => (0, opts_arg_js_1.optsArg)(opts).mkdir === fs_1.mkdir, { - sync: exports.useNativeSync, - }); - //# sourceMappingURL=use-native.js.map - /***/ -}), +/***/ }), -/***/ 8119: +/***/ 2352: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - /** - * @license node-stream-zip | (c) 2020 Antelle | https://github.com/antelle/node-stream-zip/blob/master/LICENSE - * Portions copyright https://github.com/cthackers/adm-zip | https://raw.githubusercontent.com/cthackers/adm-zip/master/LICENSE - */ - - let fs = __nccwpck_require__(7147); - const util = __nccwpck_require__(3837); - const path = __nccwpck_require__(1017); - const events = __nccwpck_require__(2361); - const zlib = __nccwpck_require__(9796); - const stream = __nccwpck_require__(2781); - - const consts = { - /* The local file header */ - LOCHDR: 30, // LOC header size - LOCSIG: 0x04034b50, // "PK\003\004" - LOCVER: 4, // version needed to extract - LOCFLG: 6, // general purpose bit flag - LOCHOW: 8, // compression method - LOCTIM: 10, // modification time (2 bytes time, 2 bytes date) - LOCCRC: 14, // uncompressed file crc-32 value - LOCSIZ: 18, // compressed size - LOCLEN: 22, // uncompressed size - LOCNAM: 26, // filename length - LOCEXT: 28, // extra field length - - /* The Data descriptor */ - EXTSIG: 0x08074b50, // "PK\007\008" - EXTHDR: 16, // EXT header size - EXTCRC: 4, // uncompressed file crc-32 value - EXTSIZ: 8, // compressed size - EXTLEN: 12, // uncompressed size - - /* The central directory file header */ - CENHDR: 46, // CEN header size - CENSIG: 0x02014b50, // "PK\001\002" - CENVEM: 4, // version made by - CENVER: 6, // version needed to extract - CENFLG: 8, // encrypt, decrypt flags - CENHOW: 10, // compression method - CENTIM: 12, // modification time (2 bytes time, 2 bytes date) - CENCRC: 16, // uncompressed file crc-32 value - CENSIZ: 20, // compressed size - CENLEN: 24, // uncompressed size - CENNAM: 28, // filename length - CENEXT: 30, // extra field length - CENCOM: 32, // file comment length - CENDSK: 34, // volume number start - CENATT: 36, // internal file attributes - CENATX: 38, // external file attributes (host system dependent) - CENOFF: 42, // LOC header offset - - /* The entries in the end of central directory */ - ENDHDR: 22, // END header size - ENDSIG: 0x06054b50, // "PK\005\006" - ENDSIGFIRST: 0x50, - ENDSUB: 8, // number of entries on this disk - ENDTOT: 10, // total number of entries - ENDSIZ: 12, // central directory size in bytes - ENDOFF: 16, // offset of first CEN header - ENDCOM: 20, // zip file comment length - MAXFILECOMMENT: 0xffff, - - /* The entries in the end of ZIP64 central directory locator */ - ENDL64HDR: 20, // ZIP64 end of central directory locator header size - ENDL64SIG: 0x07064b50, // ZIP64 end of central directory locator signature - ENDL64SIGFIRST: 0x50, - ENDL64OFS: 8, // ZIP64 end of central directory offset - - /* The entries in the end of ZIP64 central directory */ - END64HDR: 56, // ZIP64 end of central directory header size - END64SIG: 0x06064b50, // ZIP64 end of central directory signature - END64SIGFIRST: 0x50, - END64SUB: 24, // number of entries on this disk - END64TOT: 32, // total number of entries - END64SIZ: 40, - END64OFF: 48, - - /* Compression methods */ - STORED: 0, // no compression - SHRUNK: 1, // shrunk - REDUCED1: 2, // reduced with compression factor 1 - REDUCED2: 3, // reduced with compression factor 2 - REDUCED3: 4, // reduced with compression factor 3 - REDUCED4: 5, // reduced with compression factor 4 - IMPLODED: 6, // imploded - // 7 reserved - DEFLATED: 8, // deflated - ENHANCED_DEFLATED: 9, // deflate64 - PKWARE: 10, // PKWare DCL imploded - // 11 reserved - BZIP2: 12, // compressed using BZIP2 - // 13 reserved - LZMA: 14, // LZMA - // 15-17 reserved - IBM_TERSE: 18, // compressed using IBM TERSE - IBM_LZ77: 19, //IBM LZ77 z - - /* General purpose bit flag */ - FLG_ENC: 0, // encrypted file - FLG_COMP1: 1, // compression option - FLG_COMP2: 2, // compression option - FLG_DESC: 4, // data descriptor - FLG_ENH: 8, // enhanced deflation - FLG_STR: 16, // strong encryption - FLG_LNG: 1024, // language encoding - FLG_MSK: 4096, // mask header values - FLG_ENTRY_ENC: 1, - - /* 4.5 Extensible data fields */ - EF_ID: 0, - EF_SIZE: 2, - - /* Header IDs */ - ID_ZIP64: 0x0001, - ID_AVINFO: 0x0007, - ID_PFS: 0x0008, - ID_OS2: 0x0009, - ID_NTFS: 0x000a, - ID_OPENVMS: 0x000c, - ID_UNIX: 0x000d, - ID_FORK: 0x000e, - ID_PATCH: 0x000f, - ID_X509_PKCS7: 0x0014, - ID_X509_CERTID_F: 0x0015, - ID_X509_CERTID_C: 0x0016, - ID_STRONGENC: 0x0017, - ID_RECORD_MGT: 0x0018, - ID_X509_PKCS7_RL: 0x0019, - ID_IBM1: 0x0065, - ID_IBM2: 0x0066, - ID_POSZIP: 0x4690, - - EF_ZIP64_OR_32: 0xffffffff, - EF_ZIP64_OR_16: 0xffff, - }; +var crypto = __nccwpck_require__(6113); - const StreamZip = function (config) { - let fd, fileSize, chunkSize, op, centralDirectory, closed; - const ready = false, - that = this, - entries = config.storeEntries !== false ? {} : null, - fileName = config.file, - textDecoder = config.nameEncoding ? new TextDecoder(config.nameEncoding) : null; - - open(); - - function open() { - if (config.fd) { - fd = config.fd; - readFile(); - } else { - fs.open(fileName, 'r', (err, f) => { - if (err) { - return that.emit('error', err); - } - fd = f; - readFile(); - }); - } - } +function zeroextend(str, len) +{ + while (str.length < len) + str = '0' + str; + return (str); +} - function readFile() { - fs.fstat(fd, (err, stat) => { - if (err) { - return that.emit('error', err); - } - fileSize = stat.size; - chunkSize = config.chunkSize || Math.round(fileSize / 1000); - chunkSize = Math.max( - Math.min(chunkSize, Math.min(128 * 1024, fileSize)), - Math.min(1024, fileSize) - ); - readCentralDirectory(); - }); - } +/* + * Fix (odd) parity bits in a 64-bit DES key. + */ +function oddpar(buf) +{ + for (var j = 0; j < buf.length; j++) { + var par = 1; + for (var i = 1; i < 8; i++) { + par = (par + ((buf[j] >> i) & 1)) % 2; + } + buf[j] |= par & 1; + } + return buf; +} - function readUntilFoundCallback(err, bytesRead) { - if (err || !bytesRead) { - return that.emit('error', err || new Error('Archive read error')); - } - let pos = op.lastPos; - let bufferPosition = pos - op.win.position; - const buffer = op.win.buffer; - const minPos = op.minPos; - while (--pos >= minPos && --bufferPosition >= 0) { - if (buffer.length - bufferPosition >= 4 && buffer[bufferPosition] === op.firstByte) { - // quick check first signature byte - if (buffer.readUInt32LE(bufferPosition) === op.sig) { - op.lastBufferPosition = bufferPosition; - op.lastBytesRead = bytesRead; - op.complete(); - return; - } - } - } - if (pos === minPos) { - return that.emit('error', new Error('Bad archive')); - } - op.lastPos = pos + 1; - op.chunkSize *= 2; - if (pos <= minPos) { - return that.emit('error', new Error('Bad archive')); - } - const expandLength = Math.min(op.chunkSize, pos - minPos); - op.win.expandLeft(expandLength, readUntilFoundCallback); - } +/* + * Expand a 56-bit key buffer to the full 64-bits for DES. + * + * Based on code sample in: + * http://www.innovation.ch/personal/ronald/ntlm.html + */ +function expandkey(key56) +{ + var key64 = new Buffer(8); + + key64[0] = key56[0] & 0xFE; + key64[1] = ((key56[0] << 7) & 0xFF) | (key56[1] >> 1); + key64[2] = ((key56[1] << 6) & 0xFF) | (key56[2] >> 2); + key64[3] = ((key56[2] << 5) & 0xFF) | (key56[3] >> 3); + key64[4] = ((key56[3] << 4) & 0xFF) | (key56[4] >> 4); + key64[5] = ((key56[4] << 3) & 0xFF) | (key56[5] >> 5); + key64[6] = ((key56[5] << 2) & 0xFF) | (key56[6] >> 6); + key64[7] = (key56[6] << 1) & 0xFF; + + return key64; +} - function readCentralDirectory() { - const totalReadLength = Math.min(consts.ENDHDR + consts.MAXFILECOMMENT, fileSize); - op = { - win: new FileWindowBuffer(fd), - totalReadLength, - minPos: fileSize - totalReadLength, - lastPos: fileSize, - chunkSize: Math.min(1024, chunkSize), - firstByte: consts.ENDSIGFIRST, - sig: consts.ENDSIG, - complete: readCentralDirectoryComplete, - }; - op.win.read(fileSize - op.chunkSize, op.chunkSize, readUntilFoundCallback); - } +/* + * Convert a binary string to a hex string + */ +function bintohex(bin) +{ + var buf = (Buffer.isBuffer(buf) ? buf : new Buffer(bin, 'binary')); + var str = buf.toString('hex').toUpperCase(); + return zeroextend(str, 32); +} - function readCentralDirectoryComplete() { - const buffer = op.win.buffer; - const pos = op.lastBufferPosition; - try { - centralDirectory = new CentralDirectoryHeader(); - centralDirectory.read(buffer.slice(pos, pos + consts.ENDHDR)); - centralDirectory.headerOffset = op.win.position + pos; - if (centralDirectory.commentLength) { - that.comment = buffer - .slice( - pos + consts.ENDHDR, - pos + consts.ENDHDR + centralDirectory.commentLength - ) - .toString(); - } else { - that.comment = null; - } - that.entriesCount = centralDirectory.volumeEntries; - that.centralDirectory = centralDirectory; - if ( - (centralDirectory.volumeEntries === consts.EF_ZIP64_OR_16 && - centralDirectory.totalEntries === consts.EF_ZIP64_OR_16) || - centralDirectory.size === consts.EF_ZIP64_OR_32 || - centralDirectory.offset === consts.EF_ZIP64_OR_32 - ) { - readZip64CentralDirectoryLocator(); - } else { - op = {}; - readEntries(); - } - } catch (err) { - that.emit('error', err); - } - } - function readZip64CentralDirectoryLocator() { - const length = consts.ENDL64HDR; - if (op.lastBufferPosition > length) { - op.lastBufferPosition -= length; - readZip64CentralDirectoryLocatorComplete(); - } else { - op = { - win: op.win, - totalReadLength: length, - minPos: op.win.position - length, - lastPos: op.win.position, - chunkSize: op.chunkSize, - firstByte: consts.ENDL64SIGFIRST, - sig: consts.ENDL64SIG, - complete: readZip64CentralDirectoryLocatorComplete, - }; - op.win.read(op.lastPos - op.chunkSize, op.chunkSize, readUntilFoundCallback); - } - } +module.exports.zeroextend = zeroextend; +module.exports.oddpar = oddpar; +module.exports.expandkey = expandkey; +module.exports.bintohex = bintohex; - function readZip64CentralDirectoryLocatorComplete() { - const buffer = op.win.buffer; - const locHeader = new CentralDirectoryLoc64Header(); - locHeader.read( - buffer.slice(op.lastBufferPosition, op.lastBufferPosition + consts.ENDL64HDR) - ); - const readLength = fileSize - locHeader.headerOffset; - op = { - win: op.win, - totalReadLength: readLength, - minPos: locHeader.headerOffset, - lastPos: op.lastPos, - chunkSize: op.chunkSize, - firstByte: consts.END64SIGFIRST, - sig: consts.END64SIG, - complete: readZip64CentralDirectoryComplete, - }; - op.win.read(fileSize - op.chunkSize, op.chunkSize, readUntilFoundCallback); - } - function readZip64CentralDirectoryComplete() { - const buffer = op.win.buffer; - const zip64cd = new CentralDirectoryZip64Header(); - zip64cd.read(buffer.slice(op.lastBufferPosition, op.lastBufferPosition + consts.END64HDR)); - that.centralDirectory.volumeEntries = zip64cd.volumeEntries; - that.centralDirectory.totalEntries = zip64cd.totalEntries; - that.centralDirectory.size = zip64cd.size; - that.centralDirectory.offset = zip64cd.offset; - that.entriesCount = zip64cd.volumeEntries; - op = {}; - readEntries(); - } +/***/ }), - function readEntries() { - op = { - win: new FileWindowBuffer(fd), - pos: centralDirectory.offset, - chunkSize, - entriesLeft: centralDirectory.volumeEntries, - }; - op.win.read(op.pos, Math.min(chunkSize, fileSize - op.pos), readEntriesCallback); - } +/***/ 2673: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - function readEntriesCallback(err, bytesRead) { - if (err || !bytesRead) { - return that.emit('error', err || new Error('Entries read error')); - } - let bufferPos = op.pos - op.win.position; - let entry = op.entry; - const buffer = op.win.buffer; - const bufferLength = buffer.length; - try { - while (op.entriesLeft > 0) { - if (!entry) { - entry = new ZipEntry(); - entry.readHeader(buffer, bufferPos); - entry.headerOffset = op.win.position + bufferPos; - op.entry = entry; - op.pos += consts.CENHDR; - bufferPos += consts.CENHDR; - } - const entryHeaderSize = entry.fnameLen + entry.extraLen + entry.comLen; - const advanceBytes = entryHeaderSize + (op.entriesLeft > 1 ? consts.CENHDR : 0); - if (bufferLength - bufferPos < advanceBytes) { - op.win.moveRight(chunkSize, readEntriesCallback, bufferPos); - op.move = true; - return; - } - entry.read(buffer, bufferPos, textDecoder); - if (!config.skipEntryNameValidation) { - entry.validateName(); - } - if (entries) { - entries[entry.name] = entry; - } - that.emit('entry', entry); - op.entry = entry = null; - op.entriesLeft--; - op.pos += entryHeaderSize; - bufferPos += entryHeaderSize; - } - that.emit('ready'); - } catch (err) { - that.emit('error', err); - } - } +var log = console.log; +var crypto = __nccwpck_require__(6113); +var $ = __nccwpck_require__(2352); +var lmhashbuf = (__nccwpck_require__(8657).lmhashbuf); +var nthashbuf = (__nccwpck_require__(8657).nthashbuf); - function checkEntriesExist() { - if (!entries) { - throw new Error('storeEntries disabled'); - } - } - Object.defineProperty(this, 'ready', { - get() { - return ready; - }, - }); +function encodeType1(hostname, ntdomain) { + hostname = hostname.toUpperCase(); + ntdomain = ntdomain.toUpperCase(); + var hostnamelen = Buffer.byteLength(hostname, 'ascii'); + var ntdomainlen = Buffer.byteLength(ntdomain, 'ascii'); - this.entry = function (name) { - checkEntriesExist(); - return entries[name]; - }; + var pos = 0; + var buf = new Buffer(32 + hostnamelen + ntdomainlen); - this.entries = function () { - checkEntriesExist(); - return entries; - }; + buf.write('NTLMSSP', pos, 7, 'ascii'); // byte protocol[8]; + pos += 7; + buf.writeUInt8(0, pos); + pos++; - this.stream = function (entry, callback) { - return this.openEntry( - entry, - (err, entry) => { - if (err) { - return callback(err); - } - const offset = dataOffset(entry); - let entryStream = new EntryDataReaderStream(fd, offset, entry.compressedSize); - if (entry.method === consts.STORED) { - // nothing to do - } else if (entry.method === consts.DEFLATED) { - entryStream = entryStream.pipe(zlib.createInflateRaw()); - } else { - return callback(new Error('Unknown compression method: ' + entry.method)); - } - if (canVerifyCrc(entry)) { - entryStream = entryStream.pipe( - new EntryVerifyStream(entryStream, entry.crc, entry.size) - ); - } - callback(null, entryStream); - }, - false - ); - }; + buf.writeUInt8(0x01, pos); // byte type; + pos++; - this.entryDataSync = function (entry) { - let err = null; - this.openEntry( - entry, - (e, en) => { - err = e; - entry = en; - }, - true - ); - if (err) { - throw err; - } - let data = Buffer.alloc(entry.compressedSize); - new FsRead(fd, data, 0, entry.compressedSize, dataOffset(entry), (e) => { - err = e; - }).read(true); - if (err) { - throw err; - } - if (entry.method === consts.STORED) { - // nothing to do - } else if (entry.method === consts.DEFLATED || entry.method === consts.ENHANCED_DEFLATED) { - data = zlib.inflateRawSync(data); - } else { - throw new Error('Unknown compression method: ' + entry.method); - } - if (data.length !== entry.size) { - throw new Error('Invalid size'); - } - if (canVerifyCrc(entry)) { - const verify = new CrcVerify(entry.crc, entry.size); - verify.data(data); - } - return data; - }; + buf.fill(0x00, pos, pos + 3); // byte zero[3]; + pos += 3; - this.openEntry = function (entry, callback, sync) { - if (typeof entry === 'string') { - checkEntriesExist(); - entry = entries[entry]; - if (!entry) { - return callback(new Error('Entry not found')); - } - } - if (!entry.isFile) { - return callback(new Error('Entry is not file')); - } - if (!fd) { - return callback(new Error('Archive closed')); - } - const buffer = Buffer.alloc(consts.LOCHDR); - new FsRead(fd, buffer, 0, buffer.length, entry.offset, (err) => { - if (err) { - return callback(err); - } - let readEx; - try { - entry.readDataHeader(buffer); - if (entry.encrypted) { - readEx = new Error('Entry encrypted'); - } - } catch (ex) { - readEx = ex; - } - callback(readEx, entry); - }).read(sync); - }; + buf.writeUInt16LE(0xb203, pos); // short flags; + pos += 2; - function dataOffset(entry) { - return entry.offset + consts.LOCHDR + entry.fnameLen + entry.extraLen; - } + buf.fill(0x00, pos, pos + 2); // byte zero[2]; + pos += 2; - function canVerifyCrc(entry) { - // if bit 3 (0x08) of the general-purpose flags field is set, then the CRC-32 and file sizes are not known when the header is written - return (entry.flags & 0x8) !== 0x8; - } + buf.writeUInt16LE(ntdomainlen, pos); // short dom_len; + pos += 2; + buf.writeUInt16LE(ntdomainlen, pos); // short dom_len; + pos += 2; - function extract(entry, outPath, callback) { - that.stream(entry, (err, stm) => { - if (err) { - callback(err); - } else { - let fsStm, errThrown; - stm.on('error', (err) => { - errThrown = err; - if (fsStm) { - stm.unpipe(fsStm); - fsStm.close(() => { - callback(err); - }); - } - }); - fs.open(outPath, 'w', (err, fdFile) => { - if (err) { - return callback(err); - } - if (errThrown) { - fs.close(fd, () => { - callback(errThrown); - }); - return; - } - fsStm = fs.createWriteStream(outPath, { fd: fdFile }); - fsStm.on('finish', () => { - that.emit('extract', entry, outPath); - if (!errThrown) { - callback(); - } - }); - stm.pipe(fsStm); - }); - } - }); - } + var ntdomainoff = 0x20 + hostnamelen; + buf.writeUInt16LE(ntdomainoff, pos); // short dom_off; + pos += 2; - function createDirectories(baseDir, dirs, callback) { - if (!dirs.length) { - return callback(); - } - let dir = dirs.shift(); - dir = path.join(baseDir, path.join(...dir)); - fs.mkdir(dir, { recursive: true }, (err) => { - if (err && err.code !== 'EEXIST') { - return callback(err); - } - createDirectories(baseDir, dirs, callback); - }); - } + buf.fill(0x00, pos, pos + 2); // byte zero[2]; + pos += 2; - function extractFiles(baseDir, baseRelPath, files, callback, extractedCount) { - if (!files.length) { - return callback(null, extractedCount); - } - const file = files.shift(); - const targetPath = path.join(baseDir, file.name.replace(baseRelPath, '')); - extract(file, targetPath, (err) => { - if (err) { - return callback(err, extractedCount); - } - extractFiles(baseDir, baseRelPath, files, callback, extractedCount + 1); - }); - } + buf.writeUInt16LE(hostnamelen, pos); // short host_len; + pos += 2; + buf.writeUInt16LE(hostnamelen, pos); // short host_len; + pos += 2; - this.extract = function (entry, outPath, callback) { - let entryName = entry || ''; - if (typeof entry === 'string') { - entry = this.entry(entry); - if (entry) { - entryName = entry.name; - } else { - if (entryName.length && entryName[entryName.length - 1] !== '/') { - entryName += '/'; - } - } - } - if (!entry || entry.isDirectory) { - const files = [], - dirs = [], - allDirs = {}; - for (const e in entries) { - if ( - Object.prototype.hasOwnProperty.call(entries, e) && - e.lastIndexOf(entryName, 0) === 0 - ) { - let relPath = e.replace(entryName, ''); - const childEntry = entries[e]; - if (childEntry.isFile) { - files.push(childEntry); - relPath = path.dirname(relPath); - } - if (relPath && !allDirs[relPath] && relPath !== '.') { - allDirs[relPath] = true; - let parts = relPath.split('/').filter((f) => { - return f; - }); - if (parts.length) { - dirs.push(parts); - } - while (parts.length > 1) { - parts = parts.slice(0, parts.length - 1); - const partsPath = parts.join('/'); - if (allDirs[partsPath] || partsPath === '.') { - break; - } - allDirs[partsPath] = true; - dirs.push(parts); - } - } - } - } - dirs.sort((x, y) => { - return x.length - y.length; - }); - if (dirs.length) { - createDirectories(outPath, dirs, (err) => { - if (err) { - callback(err); - } else { - extractFiles(outPath, entryName, files, callback, 0); - } - }); - } else { - extractFiles(outPath, entryName, files, callback, 0); - } - } else { - fs.stat(outPath, (err, stat) => { - if (stat && stat.isDirectory()) { - extract(entry, path.join(outPath, path.basename(entry.name)), callback); - } else { - extract(entry, outPath, callback); - } - }); - } - }; + buf.writeUInt16LE(0x20, pos); // short host_off; + pos += 2; - this.close = function (callback) { - if (closed || !fd) { - closed = true; - if (callback) { - callback(); - } - } else { - closed = true; - fs.close(fd, (err) => { - fd = null; - if (callback) { - callback(err); - } - }); - } - }; + buf.fill(0x00, pos, pos + 2); // byte zero[2]; + pos += 2; - const originalEmit = events.EventEmitter.prototype.emit; - this.emit = function (...args) { - if (!closed) { - return originalEmit.call(this, ...args); - } - }; - }; + buf.write(hostname, 0x20, hostnamelen, 'ascii'); + buf.write(ntdomain, ntdomainoff, ntdomainlen, 'ascii'); - StreamZip.setFs = function (customFs) { - fs = customFs; - }; + return buf; +} - StreamZip.debugLog = (...args) => { - if (StreamZip.debug) { - // eslint-disable-next-line no-console - console.log(...args); - } - }; - util.inherits(StreamZip, events.EventEmitter); +/* + * + */ +function decodeType2(buf) +{ + var proto = buf.toString('ascii', 0, 7); + if (buf[7] !== 0x00 || proto !== 'NTLMSSP') + throw new Error('magic was not NTLMSSP'); - const propZip = Symbol('zip'); + var type = buf.readUInt8(8); + if (type !== 0x02) + throw new Error('message was not NTLMSSP type 0x02'); - StreamZip.async = class StreamZipAsync extends events.EventEmitter { - constructor(config) { - super(); + //var msg_len = buf.readUInt16LE(16); - const zip = new StreamZip(config); + //var flags = buf.readUInt16LE(20); - zip.on('entry', (entry) => this.emit('entry', entry)); - zip.on('extract', (entry, outPath) => this.emit('extract', entry, outPath)); + var nonce = buf.slice(24, 32); + return nonce; +} - this[propZip] = new Promise((resolve, reject) => { - zip.on('ready', () => { - zip.removeListener('error', reject); - resolve(zip); - }); - zip.on('error', reject); - }); - } +function encodeType3(username, hostname, ntdomain, nonce, password) { + hostname = hostname.toUpperCase(); + ntdomain = ntdomain.toUpperCase(); + + var lmh = new Buffer(21); + lmhashbuf(password).copy(lmh); + lmh.fill(0x00, 16); // null pad to 21 bytes + var nth = new Buffer(21); + nthashbuf(password).copy(nth); + nth.fill(0x00, 16); // null pad to 21 bytes + + var lmr = makeResponse(lmh, nonce); + var ntr = makeResponse(nth, nonce); + + var usernamelen = Buffer.byteLength(username, 'ucs2'); + var hostnamelen = Buffer.byteLength(hostname, 'ucs2'); + var ntdomainlen = Buffer.byteLength(ntdomain, 'ucs2'); + var lmrlen = 0x18; + var ntrlen = 0x18; + + var ntdomainoff = 0x40; + var usernameoff = ntdomainoff + ntdomainlen; + var hostnameoff = usernameoff + usernamelen; + var lmroff = hostnameoff + hostnamelen; + var ntroff = lmroff + lmrlen; + + var pos = 0; + var msg_len = 64 + ntdomainlen + usernamelen + hostnamelen + lmrlen + ntrlen; + var buf = new Buffer(msg_len); + + buf.write('NTLMSSP', pos, 7, 'ascii'); // byte protocol[8]; + pos += 7; + buf.writeUInt8(0, pos); + pos++; + + buf.writeUInt8(0x03, pos); // byte type; + pos++; + + buf.fill(0x00, pos, pos + 3); // byte zero[3]; + pos += 3; + + buf.writeUInt16LE(lmrlen, pos); // short lm_resp_len; + pos += 2; + buf.writeUInt16LE(lmrlen, pos); // short lm_resp_len; + pos += 2; + buf.writeUInt16LE(lmroff, pos); // short lm_resp_off; + pos += 2; + buf.fill(0x00, pos, pos + 2); // byte zero[2]; + pos += 2; + + buf.writeUInt16LE(ntrlen, pos); // short nt_resp_len; + pos += 2; + buf.writeUInt16LE(ntrlen, pos); // short nt_resp_len; + pos += 2; + buf.writeUInt16LE(ntroff, pos); // short nt_resp_off; + pos += 2; + buf.fill(0x00, pos, pos + 2); // byte zero[2]; + pos += 2; + + buf.writeUInt16LE(ntdomainlen, pos); // short dom_len; + pos += 2; + buf.writeUInt16LE(ntdomainlen, pos); // short dom_len; + pos += 2; + buf.writeUInt16LE(ntdomainoff, pos); // short dom_off; + pos += 2; + buf.fill(0x00, pos, pos + 2); // byte zero[2]; + pos += 2; + + buf.writeUInt16LE(usernamelen, pos); // short user_len; + pos += 2; + buf.writeUInt16LE(usernamelen, pos); // short user_len; + pos += 2; + buf.writeUInt16LE(usernameoff, pos); // short user_off; + pos += 2; + buf.fill(0x00, pos, pos + 2); // byte zero[2]; + pos += 2; + + buf.writeUInt16LE(hostnamelen, pos); // short host_len; + pos += 2; + buf.writeUInt16LE(hostnamelen, pos); // short host_len; + pos += 2; + buf.writeUInt16LE(hostnameoff, pos); // short host_off; + pos += 2; + buf.fill(0x00, pos, pos + 6); // byte zero[6]; + pos += 6; + + buf.writeUInt16LE(msg_len, pos); // short msg_len; + pos += 2; + buf.fill(0x00, pos, pos + 2); // byte zero[2]; + pos += 2; + + buf.writeUInt16LE(0x8201, pos); // short flags; + pos += 2; + buf.fill(0x00, pos, pos + 2); // byte zero[2]; + pos += 2; + + buf.write(ntdomain, ntdomainoff, ntdomainlen, 'ucs2'); + buf.write(username, usernameoff, usernamelen, 'ucs2'); + buf.write(hostname, hostnameoff, hostnamelen, 'ucs2'); + lmr.copy(buf, lmroff, 0, lmrlen); + ntr.copy(buf, ntroff, 0, ntrlen); + + return buf; +} - get entriesCount() { - return this[propZip].then((zip) => zip.entriesCount); - } +function makeResponse(hash, nonce) +{ + var out = new Buffer(24); + for (var i = 0; i < 3; i++) { + var keybuf = $.oddpar($.expandkey(hash.slice(i * 7, i * 7 + 7))); + var des = crypto.createCipheriv('DES-ECB', keybuf, ''); + var str = des.update(nonce.toString('binary'), 'binary', 'binary'); + out.write(str, i * 8, i * 8 + 8, 'binary'); + } + return out; +} - get comment() { - return this[propZip].then((zip) => zip.comment); - } +exports.encodeType1 = encodeType1; +exports.decodeType2 = decodeType2; +exports.encodeType3 = encodeType3; - async entry(name) { - const zip = await this[propZip]; - return zip.entry(name); - } +// Convenience methods. - async entries() { - const zip = await this[propZip]; - return zip.entries(); - } +exports.challengeHeader = function (hostname, domain) { + return 'NTLM ' + exports.encodeType1(hostname, domain).toString('base64'); +}; - async stream(entry) { - const zip = await this[propZip]; - return new Promise((resolve, reject) => { - zip.stream(entry, (err, stm) => { - if (err) { - reject(err); - } else { - resolve(stm); - } - }); - }); - } +exports.responseHeader = function (res, url, domain, username, password) { + var serverNonce = new Buffer((res.headers['www-authenticate'].match(/^NTLM\s+(.+?)(,|\s+|$)/) || [])[1], 'base64'); + var hostname = (__nccwpck_require__(7310).parse)(url).hostname; + return 'NTLM ' + exports.encodeType3(username, hostname, domain, exports.decodeType2(serverNonce), password).toString('base64') +}; - async entryData(entry) { - const stm = await this.stream(entry); - return new Promise((resolve, reject) => { - const data = []; - stm.on('data', (chunk) => data.push(chunk)); - stm.on('end', () => { - resolve(Buffer.concat(data)); - }); - stm.on('error', (err) => { - stm.removeAllListeners('end'); - reject(err); - }); - }); - } +// Import smbhash module. - async extract(entry, outPath) { - const zip = await this[propZip]; - return new Promise((resolve, reject) => { - zip.extract(entry, outPath, (err, res) => { - if (err) { - reject(err); - } else { - resolve(res); - } - }); - }); - } +exports.smbhash = __nccwpck_require__(8657); - async close() { - const zip = await this[propZip]; - return new Promise((resolve, reject) => { - zip.close((err) => { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); - } - }; - class CentralDirectoryHeader { - read(data) { - if (data.length !== consts.ENDHDR || data.readUInt32LE(0) !== consts.ENDSIG) { - throw new Error('Invalid central directory'); - } - // number of entries on this volume - this.volumeEntries = data.readUInt16LE(consts.ENDSUB); - // total number of entries - this.totalEntries = data.readUInt16LE(consts.ENDTOT); - // central directory size in bytes - this.size = data.readUInt32LE(consts.ENDSIZ); - // offset of first CEN header - this.offset = data.readUInt32LE(consts.ENDOFF); - // zip file comment length - this.commentLength = data.readUInt16LE(consts.ENDCOM); - } - } +/***/ }), - class CentralDirectoryLoc64Header { - read(data) { - if (data.length !== consts.ENDL64HDR || data.readUInt32LE(0) !== consts.ENDL64SIG) { - throw new Error('Invalid zip64 central directory locator'); - } - // ZIP64 EOCD header offset - this.headerOffset = readUInt64LE(data, consts.ENDSUB); - } - } +/***/ 8657: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - class CentralDirectoryZip64Header { - read(data) { - if (data.length !== consts.END64HDR || data.readUInt32LE(0) !== consts.END64SIG) { - throw new Error('Invalid central directory'); - } - // number of entries on this volume - this.volumeEntries = readUInt64LE(data, consts.END64SUB); - // total number of entries - this.totalEntries = readUInt64LE(data, consts.END64TOT); - // central directory size in bytes - this.size = readUInt64LE(data, consts.END64SIZ); - // offset of first CEN header - this.offset = readUInt64LE(data, consts.END64OFF); - } - } +var crypto = __nccwpck_require__(6113); +var $ = __nccwpck_require__(2352); + +/* + * Generate the LM Hash + */ +function lmhashbuf(inputstr) +{ + /* ASCII --> uppercase */ + var x = inputstr.substring(0, 14).toUpperCase(); + var xl = Buffer.byteLength(x, 'ascii'); + + /* null pad to 14 bytes */ + var y = new Buffer(14); + y.write(x, 0, xl, 'ascii'); + y.fill(0, xl); + + /* insert odd parity bits in key */ + var halves = [ + $.oddpar($.expandkey(y.slice(0, 7))), + $.oddpar($.expandkey(y.slice(7, 14))) + ]; + + /* DES encrypt magic number "KGS!@#$%" to two + * 8-byte ciphertexts, (ECB, no padding) + */ + var buf = new Buffer(16); + var pos = 0; + var cts = halves.forEach(function(z) { + var des = crypto.createCipheriv('DES-ECB', z, ''); + var str = des.update('KGS!@#$%', 'binary', 'binary'); + buf.write(str, pos, pos + 8, 'binary'); + pos += 8; + }); + + /* concat the two ciphertexts to form 16byte value, + * the LM hash */ + return buf; +} - class ZipEntry { - readHeader(data, offset) { - // data should be 46 bytes and start with "PK 01 02" - if (data.length < offset + consts.CENHDR || data.readUInt32LE(offset) !== consts.CENSIG) { - throw new Error('Invalid entry header'); - } - // version made by - this.verMade = data.readUInt16LE(offset + consts.CENVEM); - // version needed to extract - this.version = data.readUInt16LE(offset + consts.CENVER); - // encrypt, decrypt flags - this.flags = data.readUInt16LE(offset + consts.CENFLG); - // compression method - this.method = data.readUInt16LE(offset + consts.CENHOW); - // modification time (2 bytes time, 2 bytes date) - const timebytes = data.readUInt16LE(offset + consts.CENTIM); - const datebytes = data.readUInt16LE(offset + consts.CENTIM + 2); - this.time = parseZipTime(timebytes, datebytes); - - // uncompressed file crc-32 value - this.crc = data.readUInt32LE(offset + consts.CENCRC); - // compressed size - this.compressedSize = data.readUInt32LE(offset + consts.CENSIZ); - // uncompressed size - this.size = data.readUInt32LE(offset + consts.CENLEN); - // filename length - this.fnameLen = data.readUInt16LE(offset + consts.CENNAM); - // extra field length - this.extraLen = data.readUInt16LE(offset + consts.CENEXT); - // file comment length - this.comLen = data.readUInt16LE(offset + consts.CENCOM); - // volume number start - this.diskStart = data.readUInt16LE(offset + consts.CENDSK); - // internal file attributes - this.inattr = data.readUInt16LE(offset + consts.CENATT); - // external file attributes - this.attr = data.readUInt32LE(offset + consts.CENATX); - // LOC header offset - this.offset = data.readUInt32LE(offset + consts.CENOFF); - } +function nthashbuf(str) +{ + /* take MD4 hash of UCS-2 encoded password */ + var ucs2 = new Buffer(str, 'ucs2'); + var md4 = crypto.createHash('md4'); + md4.update(ucs2); + return new Buffer(md4.digest('binary'), 'binary'); +} - readDataHeader(data) { - // 30 bytes and should start with "PK\003\004" - if (data.readUInt32LE(0) !== consts.LOCSIG) { - throw new Error('Invalid local header'); - } - // version needed to extract - this.version = data.readUInt16LE(consts.LOCVER); - // general purpose bit flag - this.flags = data.readUInt16LE(consts.LOCFLG); - // compression method - this.method = data.readUInt16LE(consts.LOCHOW); - // modification time (2 bytes time ; 2 bytes date) - const timebytes = data.readUInt16LE(consts.LOCTIM); - const datebytes = data.readUInt16LE(consts.LOCTIM + 2); - this.time = parseZipTime(timebytes, datebytes); - - // uncompressed file crc-32 value - this.crc = data.readUInt32LE(consts.LOCCRC) || this.crc; - // compressed size - const compressedSize = data.readUInt32LE(consts.LOCSIZ); - if (compressedSize && compressedSize !== consts.EF_ZIP64_OR_32) { - this.compressedSize = compressedSize; - } - // uncompressed size - const size = data.readUInt32LE(consts.LOCLEN); - if (size && size !== consts.EF_ZIP64_OR_32) { - this.size = size; - } - // filename length - this.fnameLen = data.readUInt16LE(consts.LOCNAM); - // extra field length - this.extraLen = data.readUInt16LE(consts.LOCEXT); - } +function lmhash(is) +{ + return $.bintohex(lmhashbuf(is)); +} - read(data, offset, textDecoder) { - const nameData = data.slice(offset, (offset += this.fnameLen)); - this.name = textDecoder - ? textDecoder.decode(new Uint8Array(nameData)) - : nameData.toString('utf8'); - const lastChar = data[offset - 1]; - this.isDirectory = lastChar === 47 || lastChar === 92; - - if (this.extraLen) { - this.readExtra(data, offset); - offset += this.extraLen; - } - this.comment = this.comLen ? data.slice(offset, offset + this.comLen).toString() : null; - } +function nthash(is) +{ + return $.bintohex(nthashbuf(is)); +} - validateName() { - if (/\\|^\w+:|^\/|(^|\/)\.\.(\/|$)/.test(this.name)) { - throw new Error('Malicious entry: ' + this.name); - } - } +module.exports.nthashbuf = nthashbuf; +module.exports.lmhashbuf = lmhashbuf; - readExtra(data, offset) { - let signature, size; - const maxPos = offset + this.extraLen; - while (offset < maxPos) { - signature = data.readUInt16LE(offset); - offset += 2; - size = data.readUInt16LE(offset); - offset += 2; - if (consts.ID_ZIP64 === signature) { - this.parseZip64Extra(data, offset, size); - } - offset += size; - } - } +module.exports.nthash = nthash; +module.exports.lmhash = lmhash; - parseZip64Extra(data, offset, length) { - if (length >= 8 && this.size === consts.EF_ZIP64_OR_32) { - this.size = readUInt64LE(data, offset); - offset += 8; - length -= 8; - } - if (length >= 8 && this.compressedSize === consts.EF_ZIP64_OR_32) { - this.compressedSize = readUInt64LE(data, offset); - offset += 8; - length -= 8; - } - if (length >= 8 && this.offset === consts.EF_ZIP64_OR_32) { - this.offset = readUInt64LE(data, offset); - offset += 8; - length -= 8; - } - if (length >= 4 && this.diskStart === consts.EF_ZIP64_OR_16) { - this.diskStart = data.readUInt32LE(offset); - // offset += 4; length -= 4; - } - } - get encrypted() { - return (this.flags & consts.FLG_ENTRY_ENC) === consts.FLG_ENTRY_ENC; - } +/***/ }), - get isFile() { - return !this.isDirectory; - } - } +/***/ 1773: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - class FsRead { - constructor(fd, buffer, offset, length, position, callback) { - this.fd = fd; - this.buffer = buffer; - this.offset = offset; - this.length = length; - this.position = position; - this.callback = callback; - this.bytesRead = 0; - this.waiting = false; - } +"use strict"; + + +const Client = __nccwpck_require__(3598) +const Dispatcher = __nccwpck_require__(412) +const errors = __nccwpck_require__(8045) +const Pool = __nccwpck_require__(4634) +const BalancedPool = __nccwpck_require__(7931) +const Agent = __nccwpck_require__(7890) +const util = __nccwpck_require__(3983) +const { InvalidArgumentError } = errors +const api = __nccwpck_require__(4059) +const buildConnector = __nccwpck_require__(2067) +const MockClient = __nccwpck_require__(8687) +const MockAgent = __nccwpck_require__(6771) +const MockPool = __nccwpck_require__(6193) +const mockErrors = __nccwpck_require__(888) +const ProxyAgent = __nccwpck_require__(7858) +const RetryHandler = __nccwpck_require__(2286) +const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(1892) +const DecoratorHandler = __nccwpck_require__(6930) +const RedirectHandler = __nccwpck_require__(2860) +const createRedirectInterceptor = __nccwpck_require__(8861) + +let hasCrypto +try { + __nccwpck_require__(6113) + hasCrypto = true +} catch { + hasCrypto = false +} - read(sync) { - StreamZip.debugLog('read', this.position, this.bytesRead, this.length, this.offset); - this.waiting = true; - let err; - if (sync) { - let bytesRead = 0; - try { - bytesRead = fs.readSync( - this.fd, - this.buffer, - this.offset + this.bytesRead, - this.length - this.bytesRead, - this.position + this.bytesRead - ); - } catch (e) { - err = e; - } - this.readCallback(sync, err, err ? bytesRead : null); - } else { - fs.read( - this.fd, - this.buffer, - this.offset + this.bytesRead, - this.length - this.bytesRead, - this.position + this.bytesRead, - this.readCallback.bind(this, sync) - ); - } - } +Object.assign(Dispatcher.prototype, api) + +module.exports.Dispatcher = Dispatcher +module.exports.Client = Client +module.exports.Pool = Pool +module.exports.BalancedPool = BalancedPool +module.exports.Agent = Agent +module.exports.ProxyAgent = ProxyAgent +module.exports.RetryHandler = RetryHandler + +module.exports.DecoratorHandler = DecoratorHandler +module.exports.RedirectHandler = RedirectHandler +module.exports.createRedirectInterceptor = createRedirectInterceptor + +module.exports.buildConnector = buildConnector +module.exports.errors = errors + +function makeDispatcher (fn) { + return (url, opts, handler) => { + if (typeof opts === 'function') { + handler = opts + opts = null + } + + if (!url || (typeof url !== 'string' && typeof url !== 'object' && !(url instanceof URL))) { + throw new InvalidArgumentError('invalid url') + } + + if (opts != null && typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } + + if (opts && opts.path != null) { + if (typeof opts.path !== 'string') { + throw new InvalidArgumentError('invalid opts.path') + } + + let path = opts.path + if (!opts.path.startsWith('/')) { + path = `/${path}` + } + + url = new URL(util.parseOrigin(url).origin + path) + } else { + if (!opts) { + opts = typeof url === 'object' ? url : {} + } + + url = util.parseURL(url) + } + + const { agent, dispatcher = getGlobalDispatcher() } = opts + + if (agent) { + throw new InvalidArgumentError('unsupported opts.agent. Did you mean opts.client?') + } + + return fn.call(dispatcher, { + ...opts, + origin: url.origin, + path: url.search ? `${url.pathname}${url.search}` : url.pathname, + method: opts.method || (opts.body ? 'PUT' : 'GET') + }, handler) + } +} - readCallback(sync, err, bytesRead) { - if (typeof bytesRead === 'number') { - this.bytesRead += bytesRead; - } - if (err || !bytesRead || this.bytesRead === this.length) { - this.waiting = false; - return this.callback(err, this.bytesRead); - } else { - this.read(sync); - } - } - } +module.exports.setGlobalDispatcher = setGlobalDispatcher +module.exports.getGlobalDispatcher = getGlobalDispatcher + +if (util.nodeMajor > 16 || (util.nodeMajor === 16 && util.nodeMinor >= 8)) { + let fetchImpl = null + module.exports.fetch = async function fetch (resource) { + if (!fetchImpl) { + fetchImpl = (__nccwpck_require__(4881).fetch) + } + + try { + return await fetchImpl(...arguments) + } catch (err) { + if (typeof err === 'object') { + Error.captureStackTrace(err, this) + } + + throw err + } + } + module.exports.Headers = __nccwpck_require__(554).Headers + module.exports.Response = __nccwpck_require__(7823).Response + module.exports.Request = __nccwpck_require__(8359).Request + module.exports.FormData = __nccwpck_require__(2015).FormData + module.exports.File = __nccwpck_require__(8511).File + module.exports.FileReader = __nccwpck_require__(1446).FileReader + + const { setGlobalOrigin, getGlobalOrigin } = __nccwpck_require__(1246) + + module.exports.setGlobalOrigin = setGlobalOrigin + module.exports.getGlobalOrigin = getGlobalOrigin + + const { CacheStorage } = __nccwpck_require__(7907) + const { kConstruct } = __nccwpck_require__(9174) + + // Cache & CacheStorage are tightly coupled with fetch. Even if it may run + // in an older version of Node, it doesn't have any use without fetch. + module.exports.caches = new CacheStorage(kConstruct) +} - class FileWindowBuffer { - constructor(fd) { - this.position = 0; - this.buffer = Buffer.alloc(0); - this.fd = fd; - this.fsOp = null; - } +if (util.nodeMajor >= 16) { + const { deleteCookie, getCookies, getSetCookies, setCookie } = __nccwpck_require__(1724) - checkOp() { - if (this.fsOp && this.fsOp.waiting) { - throw new Error('Operation in progress'); - } - } + module.exports.deleteCookie = deleteCookie + module.exports.getCookies = getCookies + module.exports.getSetCookies = getSetCookies + module.exports.setCookie = setCookie - read(pos, length, callback) { - this.checkOp(); - if (this.buffer.length < length) { - this.buffer = Buffer.alloc(length); - } - this.position = pos; - this.fsOp = new FsRead(this.fd, this.buffer, 0, length, this.position, callback).read(); - } + const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685) - expandLeft(length, callback) { - this.checkOp(); - this.buffer = Buffer.concat([Buffer.alloc(length), this.buffer]); - this.position -= length; - if (this.position < 0) { - this.position = 0; - } - this.fsOp = new FsRead(this.fd, this.buffer, 0, length, this.position, callback).read(); - } + module.exports.parseMIMEType = parseMIMEType + module.exports.serializeAMimeType = serializeAMimeType +} - expandRight(length, callback) { - this.checkOp(); - const offset = this.buffer.length; - this.buffer = Buffer.concat([this.buffer, Buffer.alloc(length)]); - this.fsOp = new FsRead( - this.fd, - this.buffer, - offset, - length, - this.position + offset, - callback - ).read(); - } +if (util.nodeMajor >= 18 && hasCrypto) { + const { WebSocket } = __nccwpck_require__(4284) - moveRight(length, callback, shift) { - this.checkOp(); - if (shift) { - this.buffer.copy(this.buffer, 0, shift); - } else { - shift = 0; - } - this.position += shift; - this.fsOp = new FsRead( - this.fd, - this.buffer, - this.buffer.length - shift, - shift, - this.position + this.buffer.length - shift, - callback - ).read(); - } - } + module.exports.WebSocket = WebSocket +} - class EntryDataReaderStream extends stream.Readable { - constructor(fd, offset, length) { - super(); - this.fd = fd; - this.offset = offset; - this.length = length; - this.pos = 0; - this.readCallback = this.readCallback.bind(this); - } +module.exports.request = makeDispatcher(api.request) +module.exports.stream = makeDispatcher(api.stream) +module.exports.pipeline = makeDispatcher(api.pipeline) +module.exports.connect = makeDispatcher(api.connect) +module.exports.upgrade = makeDispatcher(api.upgrade) - _read(n) { - const buffer = Buffer.alloc(Math.min(n, this.length - this.pos)); - if (buffer.length) { - fs.read(this.fd, buffer, 0, buffer.length, this.offset + this.pos, this.readCallback); - } else { - this.push(null); - } - } +module.exports.MockClient = MockClient +module.exports.MockPool = MockPool +module.exports.MockAgent = MockAgent +module.exports.mockErrors = mockErrors - readCallback(err, bytesRead, buffer) { - this.pos += bytesRead; - if (err) { - this.emit('error', err); - this.push(null); - } else if (!bytesRead) { - this.push(null); - } else { - if (bytesRead !== buffer.length) { - buffer = buffer.slice(0, bytesRead); - } - this.push(buffer); - } - } - } - class EntryVerifyStream extends stream.Transform { - constructor(baseStm, crc, size) { - super(); - this.verify = new CrcVerify(crc, size); - baseStm.on('error', (e) => { - this.emit('error', e); - }); - } +/***/ }), - _transform(data, encoding, callback) { - let err; - try { - this.verify.data(data); - } catch (e) { - err = e; - } - callback(err, data); - } - } +/***/ 7890: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - class CrcVerify { - constructor(crc, size) { - this.crc = crc; - this.size = size; - this.state = { - crc: ~0, - size: 0, - }; - } +"use strict"; + + +const { InvalidArgumentError } = __nccwpck_require__(8045) +const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(2785) +const DispatcherBase = __nccwpck_require__(4839) +const Pool = __nccwpck_require__(4634) +const Client = __nccwpck_require__(3598) +const util = __nccwpck_require__(3983) +const createRedirectInterceptor = __nccwpck_require__(8861) +const { WeakRef, FinalizationRegistry } = __nccwpck_require__(6436)() + +const kOnConnect = Symbol('onConnect') +const kOnDisconnect = Symbol('onDisconnect') +const kOnConnectionError = Symbol('onConnectionError') +const kMaxRedirections = Symbol('maxRedirections') +const kOnDrain = Symbol('onDrain') +const kFactory = Symbol('factory') +const kFinalizer = Symbol('finalizer') +const kOptions = Symbol('options') + +function defaultFactory (origin, opts) { + return opts && opts.connections === 1 + ? new Client(origin, opts) + : new Pool(origin, opts) +} - data(data) { - const crcTable = CrcVerify.getCrcTable(); - let crc = this.state.crc; - let off = 0; - let len = data.length; - while (--len >= 0) { - crc = crcTable[(crc ^ data[off++]) & 0xff] ^ (crc >>> 8); - } - this.state.crc = crc; - this.state.size += data.length; - if (this.state.size >= this.size) { - const buf = Buffer.alloc(4); - buf.writeInt32LE(~this.state.crc & 0xffffffff, 0); - crc = buf.readUInt32LE(0); - if (crc !== this.crc) { - throw new Error('Invalid CRC'); - } - if (this.state.size !== this.size) { - throw new Error('Invalid size'); - } - } - } +class Agent extends DispatcherBase { + constructor ({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { + super() + + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') + } + + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') + } + + if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } + + if (connect && typeof connect !== 'function') { + connect = { ...connect } + } + + this[kInterceptors] = options.interceptors && options.interceptors.Agent && Array.isArray(options.interceptors.Agent) + ? options.interceptors.Agent + : [createRedirectInterceptor({ maxRedirections })] + + this[kOptions] = { ...util.deepClone(options), connect } + this[kOptions].interceptors = options.interceptors + ? { ...options.interceptors } + : undefined + this[kMaxRedirections] = maxRedirections + this[kFactory] = factory + this[kClients] = new Map() + this[kFinalizer] = new FinalizationRegistry(/* istanbul ignore next: gc is undeterministic */ key => { + const ref = this[kClients].get(key) + if (ref !== undefined && ref.deref() === undefined) { + this[kClients].delete(key) + } + }) + + const agent = this + + this[kOnDrain] = (origin, targets) => { + agent.emit('drain', origin, [agent, ...targets]) + } + + this[kOnConnect] = (origin, targets) => { + agent.emit('connect', origin, [agent, ...targets]) + } + + this[kOnDisconnect] = (origin, targets, err) => { + agent.emit('disconnect', origin, [agent, ...targets], err) + } + + this[kOnConnectionError] = (origin, targets, err) => { + agent.emit('connectionError', origin, [agent, ...targets], err) + } + } + + get [kRunning] () { + let ret = 0 + for (const ref of this[kClients].values()) { + const client = ref.deref() + /* istanbul ignore next: gc is undeterministic */ + if (client) { + ret += client[kRunning] + } + } + return ret + } + + [kDispatch] (opts, handler) { + let key + if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) { + key = String(opts.origin) + } else { + throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.') + } + + const ref = this[kClients].get(key) + + let dispatcher = ref ? ref.deref() : null + if (!dispatcher) { + dispatcher = this[kFactory](opts.origin, this[kOptions]) + .on('drain', this[kOnDrain]) + .on('connect', this[kOnConnect]) + .on('disconnect', this[kOnDisconnect]) + .on('connectionError', this[kOnConnectionError]) + + this[kClients].set(key, new WeakRef(dispatcher)) + this[kFinalizer].register(dispatcher, key) + } + + return dispatcher.dispatch(opts, handler) + } + + async [kClose] () { + const closePromises = [] + for (const ref of this[kClients].values()) { + const client = ref.deref() + /* istanbul ignore else: gc is undeterministic */ + if (client) { + closePromises.push(client.close()) + } + } + + await Promise.all(closePromises) + } + + async [kDestroy] (err) { + const destroyPromises = [] + for (const ref of this[kClients].values()) { + const client = ref.deref() + /* istanbul ignore else: gc is undeterministic */ + if (client) { + destroyPromises.push(client.destroy(err)) + } + } + + await Promise.all(destroyPromises) + } +} - static getCrcTable() { - let crcTable = CrcVerify.crcTable; - if (!crcTable) { - CrcVerify.crcTable = crcTable = []; - const b = Buffer.alloc(4); - for (let n = 0; n < 256; n++) { - let c = n; - for (let k = 8; --k >= 0;) { - if ((c & 1) !== 0) { - c = 0xedb88320 ^ (c >>> 1); - } else { - c = c >>> 1; - } - } - if (c < 0) { - b.writeInt32LE(c, 0); - c = b.readUInt32LE(0); - } - crcTable[n] = c; - } - } - return crcTable; - } - } +module.exports = Agent - function parseZipTime(timebytes, datebytes) { - const timebits = toBits(timebytes, 16); - const datebits = toBits(datebytes, 16); - - const mt = { - h: parseInt(timebits.slice(0, 5).join(''), 2), - m: parseInt(timebits.slice(5, 11).join(''), 2), - s: parseInt(timebits.slice(11, 16).join(''), 2) * 2, - Y: parseInt(datebits.slice(0, 7).join(''), 2) + 1980, - M: parseInt(datebits.slice(7, 11).join(''), 2), - D: parseInt(datebits.slice(11, 16).join(''), 2), - }; - const dt_str = [mt.Y, mt.M, mt.D].join('-') + ' ' + [mt.h, mt.m, mt.s].join(':') + ' GMT+0'; - return new Date(dt_str).getTime(); - } - function toBits(dec, size) { - let b = (dec >>> 0).toString(2); - while (b.length < size) { - b = '0' + b; - } - return b.split(''); - } +/***/ }), - function readUInt64LE(buffer, offset) { - return buffer.readUInt32LE(offset + 4) * 0x0000000100000000 + buffer.readUInt32LE(offset); - } +/***/ 7032: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - module.exports = StreamZip; +const { addAbortListener } = __nccwpck_require__(3983) +const { RequestAbortedError } = __nccwpck_require__(8045) +const kListener = Symbol('kListener') +const kSignal = Symbol('kSignal') - /***/ -}), +function abort (self) { + if (self.abort) { + self.abort() + } else { + self.onError(new RequestAbortedError()) + } +} -/***/ 504: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +function addSignal (self, signal) { + self[kSignal] = null + self[kListener] = null - var hasMap = typeof Map === 'function' && Map.prototype; - var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null; - var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null; - var mapForEach = hasMap && Map.prototype.forEach; - var hasSet = typeof Set === 'function' && Set.prototype; - var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null; - var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null; - var setForEach = hasSet && Set.prototype.forEach; - var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype; - var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null; - var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype; - var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null; - var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype; - var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null; - var booleanValueOf = Boolean.prototype.valueOf; - var objectToString = Object.prototype.toString; - var functionToString = Function.prototype.toString; - var $match = String.prototype.match; - var $slice = String.prototype.slice; - var $replace = String.prototype.replace; - var $toUpperCase = String.prototype.toUpperCase; - var $toLowerCase = String.prototype.toLowerCase; - var $test = RegExp.prototype.test; - var $concat = Array.prototype.concat; - var $join = Array.prototype.join; - var $arrSlice = Array.prototype.slice; - var $floor = Math.floor; - var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null; - var gOPS = Object.getOwnPropertySymbols; - var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null; - var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object'; - // ie, `has-tostringtag/shams - var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol') - ? Symbol.toStringTag - : null; - var isEnumerable = Object.prototype.propertyIsEnumerable; - - var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || ( - [].__proto__ === Array.prototype // eslint-disable-line no-proto - ? function (O) { - return O.__proto__; // eslint-disable-line no-proto - } - : null - ); + if (!signal) { + return + } - function addNumericSeparator(num, str) { - if ( - num === Infinity - || num === -Infinity - || num !== num - || (num && num > -1000 && num < 1000) - || $test.call(/e/, str) - ) { - return str; - } - var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g; - if (typeof num === 'number') { - var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num) - if (int !== num) { - var intStr = String(int); - var dec = $slice.call(str, intStr.length + 1); - return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, ''); - } - } - return $replace.call(str, sepRegex, '$&_'); - } + if (signal.aborted) { + abort(self) + return + } - var utilInspect = __nccwpck_require__(7265); - var inspectCustom = utilInspect.custom; - var inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null; + self[kSignal] = signal + self[kListener] = () => { + abort(self) + } - module.exports = function inspect_(obj, options, depth, seen) { - var opts = options || {}; + addAbortListener(self[kSignal], self[kListener]) +} - if (has(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) { - throw new TypeError('option "quoteStyle" must be "single" or "double"'); - } - if ( - has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number' - ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity - : opts.maxStringLength !== null - ) - ) { - throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`'); - } - var customInspect = has(opts, 'customInspect') ? opts.customInspect : true; - if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') { - throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`'); - } +function removeSignal (self) { + if (!self[kSignal]) { + return + } - if ( - has(opts, 'indent') - && opts.indent !== null - && opts.indent !== '\t' - && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0) - ) { - throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`'); - } - if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') { - throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`'); - } - var numericSeparator = opts.numericSeparator; + if ('removeEventListener' in self[kSignal]) { + self[kSignal].removeEventListener('abort', self[kListener]) + } else { + self[kSignal].removeListener('abort', self[kListener]) + } - if (typeof obj === 'undefined') { - return 'undefined'; - } - if (obj === null) { - return 'null'; - } - if (typeof obj === 'boolean') { - return obj ? 'true' : 'false'; - } + self[kSignal] = null + self[kListener] = null +} - if (typeof obj === 'string') { - return inspectString(obj, opts); - } - if (typeof obj === 'number') { - if (obj === 0) { - return Infinity / obj > 0 ? '0' : '-0'; - } - var str = String(obj); - return numericSeparator ? addNumericSeparator(obj, str) : str; - } - if (typeof obj === 'bigint') { - var bigIntStr = String(obj) + 'n'; - return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr; - } +module.exports = { + addSignal, + removeSignal +} - var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth; - if (typeof depth === 'undefined') { depth = 0; } - if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') { - return isArray(obj) ? '[Array]' : '[Object]'; - } - var indent = getIndent(opts, depth); +/***/ }), - if (typeof seen === 'undefined') { - seen = []; - } else if (indexOf(seen, obj) >= 0) { - return '[Circular]'; - } +/***/ 9744: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - function inspect(value, from, noIndent) { - if (from) { - seen = $arrSlice.call(seen); - seen.push(from); - } - if (noIndent) { - var newOpts = { - depth: opts.depth - }; - if (has(opts, 'quoteStyle')) { - newOpts.quoteStyle = opts.quoteStyle; - } - return inspect_(value, newOpts, depth + 1, seen); - } - return inspect_(value, opts, depth + 1, seen); - } +"use strict"; - if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable - var name = nameOf(obj); - var keys = arrObjKeys(obj, inspect); - return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : ''); - } - if (isSymbol(obj)) { - var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj); - return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString; - } - if (isElement(obj)) { - var s = '<' + $toLowerCase.call(String(obj.nodeName)); - var attrs = obj.attributes || []; - for (var i = 0; i < attrs.length; i++) { - s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts); - } - s += '>'; - if (obj.childNodes && obj.childNodes.length) { s += '...'; } - s += ''; - return s; - } - if (isArray(obj)) { - if (obj.length === 0) { return '[]'; } - var xs = arrObjKeys(obj, inspect); - if (indent && !singleLineValues(xs)) { - return '[' + indentedJoin(xs, indent) + ']'; - } - return '[ ' + $join.call(xs, ', ') + ' ]'; - } - if (isError(obj)) { - var parts = arrObjKeys(obj, inspect); - if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) { - return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }'; - } - if (parts.length === 0) { return '[' + String(obj) + ']'; } - return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }'; - } - if (typeof obj === 'object' && customInspect) { - if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) { - return utilInspect(obj, { depth: maxDepth - depth }); - } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') { - return obj.inspect(); - } - } - if (isMap(obj)) { - var mapParts = []; - if (mapForEach) { - mapForEach.call(obj, function (value, key) { - mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj)); - }); - } - return collectionOf('Map', mapSize.call(obj), mapParts, indent); - } - if (isSet(obj)) { - var setParts = []; - if (setForEach) { - setForEach.call(obj, function (value) { - setParts.push(inspect(value, obj)); - }); - } - return collectionOf('Set', setSize.call(obj), setParts, indent); - } - if (isWeakMap(obj)) { - return weakCollectionOf('WeakMap'); - } - if (isWeakSet(obj)) { - return weakCollectionOf('WeakSet'); - } - if (isWeakRef(obj)) { - return weakCollectionOf('WeakRef'); - } - if (isNumber(obj)) { - return markBoxed(inspect(Number(obj))); - } - if (isBigInt(obj)) { - return markBoxed(inspect(bigIntValueOf.call(obj))); - } - if (isBoolean(obj)) { - return markBoxed(booleanValueOf.call(obj)); - } - if (isString(obj)) { - return markBoxed(inspect(String(obj))); - } - // note: in IE 8, sometimes `global !== window` but both are the prototypes of each other - /* eslint-env browser */ - if (typeof window !== 'undefined' && obj === window) { - return '{ [object Window] }'; - } - if (obj === global) { - return '{ [object globalThis] }'; - } - if (!isDate(obj) && !isRegExp(obj)) { - var ys = arrObjKeys(obj, inspect); - var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object; - var protoTag = obj instanceof Object ? '' : 'null prototype'; - var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : ''; - var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : ''; - var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : ''); - if (ys.length === 0) { return tag + '{}'; } - if (indent) { - return tag + '{' + indentedJoin(ys, indent) + '}'; - } - return tag + '{ ' + $join.call(ys, ', ') + ' }'; - } - return String(obj); - }; - function wrapQuotes(s, defaultStyle, opts) { - var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'"; - return quoteChar + s + quoteChar; - } +const { AsyncResource } = __nccwpck_require__(852) +const { InvalidArgumentError, RequestAbortedError, SocketError } = __nccwpck_require__(8045) +const util = __nccwpck_require__(3983) +const { addSignal, removeSignal } = __nccwpck_require__(7032) - function quote(s) { - return $replace.call(String(s), /"/g, '"'); - } +class ConnectHandler extends AsyncResource { + constructor (opts, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } - function isArray(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } - function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } - function isRegExp(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } - function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } - function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } - function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } - function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } - - // Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives - function isSymbol(obj) { - if (hasShammedSymbols) { - return obj && typeof obj === 'object' && obj instanceof Symbol; - } - if (typeof obj === 'symbol') { - return true; - } - if (!obj || typeof obj !== 'object' || !symToString) { - return false; - } - try { - symToString.call(obj); - return true; - } catch (e) { } - return false; - } + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } - function isBigInt(obj) { - if (!obj || typeof obj !== 'object' || !bigIntValueOf) { - return false; - } - try { - bigIntValueOf.call(obj); - return true; - } catch (e) { } - return false; - } + const { signal, opaque, responseHeaders } = opts - var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; }; - function has(obj, key) { - return hasOwn.call(obj, key); - } + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') + } - function toStr(obj) { - return objectToString.call(obj); - } + super('UNDICI_CONNECT') - function nameOf(f) { - if (f.name) { return f.name; } - var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/); - if (m) { return m[1]; } - return null; - } + this.opaque = opaque || null + this.responseHeaders = responseHeaders || null + this.callback = callback + this.abort = null - function indexOf(xs, x) { - if (xs.indexOf) { return xs.indexOf(x); } - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) { return i; } - } - return -1; - } + addSignal(this, signal) + } - function isMap(x) { - if (!mapSize || !x || typeof x !== 'object') { - return false; - } - try { - mapSize.call(x); - try { - setSize.call(x); - } catch (s) { - return true; - } - return x instanceof Map; // core-js workaround, pre-v2.5.0 - } catch (e) { } - return false; - } + onConnect (abort, context) { + if (!this.callback) { + throw new RequestAbortedError() + } - function isWeakMap(x) { - if (!weakMapHas || !x || typeof x !== 'object') { - return false; - } - try { - weakMapHas.call(x, weakMapHas); - try { - weakSetHas.call(x, weakSetHas); - } catch (s) { - return true; - } - return x instanceof WeakMap; // core-js workaround, pre-v2.5.0 - } catch (e) { } - return false; - } + this.abort = abort + this.context = context + } - function isWeakRef(x) { - if (!weakRefDeref || !x || typeof x !== 'object') { - return false; - } - try { - weakRefDeref.call(x); - return true; - } catch (e) { } - return false; - } + onHeaders () { + throw new SocketError('bad connect', null) + } - function isSet(x) { - if (!setSize || !x || typeof x !== 'object') { - return false; - } - try { - setSize.call(x); - try { - mapSize.call(x); - } catch (m) { - return true; - } - return x instanceof Set; // core-js workaround, pre-v2.5.0 - } catch (e) { } - return false; - } + onUpgrade (statusCode, rawHeaders, socket) { + const { callback, opaque, context } = this - function isWeakSet(x) { - if (!weakSetHas || !x || typeof x !== 'object') { - return false; - } - try { - weakSetHas.call(x, weakSetHas); - try { - weakMapHas.call(x, weakMapHas); - } catch (s) { - return true; - } - return x instanceof WeakSet; // core-js workaround, pre-v2.5.0 - } catch (e) { } - return false; - } + removeSignal(this) - function isElement(x) { - if (!x || typeof x !== 'object') { return false; } - if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) { - return true; - } - return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function'; - } + this.callback = null - function inspectString(str, opts) { - if (str.length > opts.maxStringLength) { - var remaining = str.length - opts.maxStringLength; - var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : ''); - return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer; - } - // eslint-disable-next-line no-control-regex - var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte); - return wrapQuotes(s, 'single', opts); - } + let headers = rawHeaders + // Indicates is an HTTP2Session + if (headers != null) { + headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) + } - function lowbyte(c) { - var n = c.charCodeAt(0); - var x = { - 8: 'b', - 9: 't', - 10: 'n', - 12: 'f', - 13: 'r' - }[n]; - if (x) { return '\\' + x; } - return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16)); - } + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + socket, + opaque, + context + }) + } - function markBoxed(str) { - return 'Object(' + str + ')'; - } + onError (err) { + const { callback, opaque } = this - function weakCollectionOf(type) { - return type + ' { ? }'; - } + removeSignal(this) - function collectionOf(type, size, entries, indent) { - var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', '); - return type + ' (' + size + ') {' + joinedEntries + '}'; - } + if (callback) { + this.callback = null + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }) + }) + } + } +} - function singleLineValues(xs) { - for (var i = 0; i < xs.length; i++) { - if (indexOf(xs[i], '\n') >= 0) { - return false; - } - } - return true; - } +function connect (opts, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + connect.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data) + }) + }) + } + + try { + const connectHandler = new ConnectHandler(opts, callback) + this.dispatch({ ...opts, method: 'CONNECT' }, connectHandler) + } catch (err) { + if (typeof callback !== 'function') { + throw err + } + const opaque = opts && opts.opaque + queueMicrotask(() => callback(err, { opaque })) + } +} - function getIndent(opts, depth) { - var baseIndent; - if (opts.indent === '\t') { - baseIndent = '\t'; - } else if (typeof opts.indent === 'number' && opts.indent > 0) { - baseIndent = $join.call(Array(opts.indent + 1), ' '); - } else { - return null; - } - return { - base: baseIndent, - prev: $join.call(Array(depth + 1), baseIndent) - }; - } +module.exports = connect - function indentedJoin(xs, indent) { - if (xs.length === 0) { return ''; } - var lineJoiner = '\n' + indent.prev + indent.base; - return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev; - } - function arrObjKeys(obj, inspect) { - var isArr = isArray(obj); - var xs = []; - if (isArr) { - xs.length = obj.length; - for (var i = 0; i < obj.length; i++) { - xs[i] = has(obj, i) ? inspect(obj[i], obj) : ''; - } - } - var syms = typeof gOPS === 'function' ? gOPS(obj) : []; - var symMap; - if (hasShammedSymbols) { - symMap = {}; - for (var k = 0; k < syms.length; k++) { - symMap['$' + syms[k]] = syms[k]; - } - } +/***/ }), - for (var key in obj) { // eslint-disable-line no-restricted-syntax - if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue - if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue - if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) { - // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section - continue; // eslint-disable-line no-restricted-syntax, no-continue - } else if ($test.call(/[^\w$]/, key)) { - xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj)); - } else { - xs.push(key + ': ' + inspect(obj[key], obj)); - } - } - if (typeof gOPS === 'function') { - for (var j = 0; j < syms.length; j++) { - if (isEnumerable.call(obj, syms[j])) { - xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj)); - } - } - } - return xs; - } +/***/ 8752: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +"use strict"; - /***/ -}), -/***/ 7265: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +const { + Readable, + Duplex, + PassThrough +} = __nccwpck_require__(2781) +const { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError +} = __nccwpck_require__(8045) +const util = __nccwpck_require__(3983) +const { AsyncResource } = __nccwpck_require__(852) +const { addSignal, removeSignal } = __nccwpck_require__(7032) +const assert = __nccwpck_require__(9491) - module.exports = __nccwpck_require__(3837).inspect; +const kResume = Symbol('resume') +class PipelineRequest extends Readable { + constructor () { + super({ autoDestroy: true }) - /***/ -}), + this[kResume] = null + } -/***/ 4907: -/***/ ((module) => { + _read () { + const { [kResume]: resume } = this - "use strict"; + if (resume) { + this[kResume] = null + resume() + } + } + _destroy (err, callback) { + this._read() - var replace = String.prototype.replace; - var percentTwenties = /%20/g; + callback(err) + } +} - var Format = { - RFC1738: 'RFC1738', - RFC3986: 'RFC3986' - }; +class PipelineResponse extends Readable { + constructor (resume) { + super({ autoDestroy: true }) + this[kResume] = resume + } - module.exports = { - 'default': Format.RFC3986, - formatters: { - RFC1738: function (value) { - return replace.call(value, percentTwenties, '+'); - }, - RFC3986: function (value) { - return String(value); - } - }, - RFC1738: Format.RFC1738, - RFC3986: Format.RFC3986 - }; + _read () { + this[kResume]() + } + _destroy (err, callback) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError() + } - /***/ -}), + callback(err) + } +} -/***/ 2760: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +class PipelineHandler extends AsyncResource { + constructor (opts, handler) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } - "use strict"; + if (typeof handler !== 'function') { + throw new InvalidArgumentError('invalid handler') + } + const { signal, method, opaque, onInfo, responseHeaders } = opts - var stringify = __nccwpck_require__(9954); - var parse = __nccwpck_require__(3912); - var formats = __nccwpck_require__(4907); + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') + } + + if (method === 'CONNECT') { + throw new InvalidArgumentError('invalid method') + } + + if (onInfo && typeof onInfo !== 'function') { + throw new InvalidArgumentError('invalid onInfo callback') + } + + super('UNDICI_PIPELINE') + + this.opaque = opaque || null + this.responseHeaders = responseHeaders || null + this.handler = handler + this.abort = null + this.context = null + this.onInfo = onInfo || null + + this.req = new PipelineRequest().on('error', util.nop) + + this.ret = new Duplex({ + readableObjectMode: opts.objectMode, + autoDestroy: true, + read: () => { + const { body } = this + + if (body && body.resume) { + body.resume() + } + }, + write: (chunk, encoding, callback) => { + const { req } = this + + if (req.push(chunk, encoding) || req._readableState.destroyed) { + callback() + } else { + req[kResume] = callback + } + }, + destroy: (err, callback) => { + const { body, req, res, ret, abort } = this + + if (!err && !ret._readableState.endEmitted) { + err = new RequestAbortedError() + } + + if (abort && err) { + abort() + } + + util.destroy(body, err) + util.destroy(req, err) + util.destroy(res, err) + + removeSignal(this) + + callback(err) + } + }).on('prefinish', () => { + const { req } = this + + // Node < 15 does not call _final in same tick. + req.push(null) + }) + + this.res = null + + addSignal(this, signal) + } + + onConnect (abort, context) { + const { ret, res } = this + + assert(!res, 'pipeline cannot be retried') + + if (ret.destroyed) { + throw new RequestAbortedError() + } + + this.abort = abort + this.context = context + } + + onHeaders (statusCode, rawHeaders, resume) { + const { opaque, handler, context } = this + + if (statusCode < 200) { + if (this.onInfo) { + const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) + this.onInfo({ statusCode, headers }) + } + return + } + + this.res = new PipelineResponse(resume) + + let body + try { + this.handler = null + const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) + body = this.runInAsyncScope(handler, null, { + statusCode, + headers, + opaque, + body: this.res, + context + }) + } catch (err) { + this.res.on('error', util.nop) + throw err + } + + if (!body || typeof body.on !== 'function') { + throw new InvalidReturnValueError('expected Readable') + } + + body + .on('data', (chunk) => { + const { ret, body } = this + + if (!ret.push(chunk) && body.pause) { + body.pause() + } + }) + .on('error', (err) => { + const { ret } = this + + util.destroy(ret, err) + }) + .on('end', () => { + const { ret } = this + + ret.push(null) + }) + .on('close', () => { + const { ret } = this + + if (!ret._readableState.ended) { + util.destroy(ret, new RequestAbortedError()) + } + }) + + this.body = body + } + + onData (chunk) { + const { res } = this + return res.push(chunk) + } + + onComplete (trailers) { + const { res } = this + res.push(null) + } + + onError (err) { + const { ret } = this + this.handler = null + util.destroy(ret, err) + } +} - module.exports = { - formats: formats, - parse: parse, - stringify: stringify - }; +function pipeline (opts, handler) { + try { + const pipelineHandler = new PipelineHandler(opts, handler) + this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler) + return pipelineHandler.ret + } catch (err) { + return new PassThrough().destroy(err) + } +} +module.exports = pipeline - /***/ -}), -/***/ 3912: +/***/ }), + +/***/ 5448: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; - - - var utils = __nccwpck_require__(2360); - - var has = Object.prototype.hasOwnProperty; - var isArray = Array.isArray; - - var defaults = { - allowDots: false, - allowEmptyArrays: false, - allowPrototypes: false, - allowSparse: false, - arrayLimit: 20, - charset: 'utf-8', - charsetSentinel: false, - comma: false, - decodeDotInKeys: true, - decoder: utils.decode, - delimiter: '&', - depth: 5, - duplicates: 'combine', - ignoreQueryPrefix: false, - interpretNumericEntities: false, - parameterLimit: 1000, - parseArrays: true, - plainObjects: false, - strictNullHandling: false - }; +"use strict"; + + +const Readable = __nccwpck_require__(3858) +const { + InvalidArgumentError, + RequestAbortedError +} = __nccwpck_require__(8045) +const util = __nccwpck_require__(3983) +const { getResolveErrorBodyCallback } = __nccwpck_require__(7474) +const { AsyncResource } = __nccwpck_require__(852) +const { addSignal, removeSignal } = __nccwpck_require__(7032) + +class RequestHandler extends AsyncResource { + constructor (opts, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } + + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts + + try { + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } + + if (highWaterMark && (typeof highWaterMark !== 'number' || highWaterMark < 0)) { + throw new InvalidArgumentError('invalid highWaterMark') + } + + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') + } + + if (method === 'CONNECT') { + throw new InvalidArgumentError('invalid method') + } + + if (onInfo && typeof onInfo !== 'function') { + throw new InvalidArgumentError('invalid onInfo callback') + } + + super('UNDICI_REQUEST') + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on('error', util.nop), err) + } + throw err + } + + this.responseHeaders = responseHeaders || null + this.opaque = opaque || null + this.callback = callback + this.res = null + this.abort = null + this.body = body + this.trailers = {} + this.context = null + this.onInfo = onInfo || null + this.throwOnError = throwOnError + this.highWaterMark = highWaterMark + + if (util.isStream(body)) { + body.on('error', (err) => { + this.onError(err) + }) + } + + addSignal(this, signal) + } + + onConnect (abort, context) { + if (!this.callback) { + throw new RequestAbortedError() + } + + this.abort = abort + this.context = context + } + + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this + + const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) + + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }) + } + return + } + + const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers + const contentType = parsedHeaders['content-type'] + const body = new Readable({ resume, abort, contentType, highWaterMark }) + + this.callback = null + this.res = body + if (callback !== null) { + if (this.throwOnError && statusCode >= 400) { + this.runInAsyncScope(getResolveErrorBodyCallback, null, + { callback, body, contentType, statusCode, statusMessage, headers } + ) + } else { + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + trailers: this.trailers, + opaque, + body, + context + }) + } + } + } + + onData (chunk) { + const { res } = this + return res.push(chunk) + } + + onComplete (trailers) { + const { res } = this + + removeSignal(this) + + util.parseHeaders(trailers, this.trailers) + + res.push(null) + } + + onError (err) { + const { res, callback, body, opaque } = this + + removeSignal(this) + + if (callback) { + // TODO: Does this need queueMicrotask? + this.callback = null + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }) + }) + } + + if (res) { + this.res = null + // Ensure all queued handlers are invoked before destroying res. + queueMicrotask(() => { + util.destroy(res, err) + }) + } + + if (body) { + this.body = null + util.destroy(body, err) + } + } +} - var interpretNumericEntities = function (str) { - return str.replace(/&#(\d+);/g, function ($0, numberStr) { - return String.fromCharCode(parseInt(numberStr, 10)); - }); - }; +function request (opts, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + request.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data) + }) + }) + } + + try { + this.dispatch(opts, new RequestHandler(opts, callback)) + } catch (err) { + if (typeof callback !== 'function') { + throw err + } + const opaque = opts && opts.opaque + queueMicrotask(() => callback(err, { opaque })) + } +} - var parseArrayValue = function (val, options) { - if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) { - return val.split(','); - } +module.exports = request +module.exports.RequestHandler = RequestHandler - return val; - }; - // This is what browsers will submit when the ✓ character occurs in an - // application/x-www-form-urlencoded body and the encoding of the page containing - // the form is iso-8859-1, or when the submitted form has an accept-charset - // attribute of iso-8859-1. Presumably also with other charsets that do not contain - // the ✓ character, such as us-ascii. - var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓') - - // These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded. - var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓') - - var parseValues = function parseQueryStringValues(str, options) { - var obj = { __proto__: null }; - - var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; - var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; - var parts = cleanStr.split(options.delimiter, limit); - var skipIndex = -1; // Keep track of where the utf8 sentinel was found - var i; - - var charset = options.charset; - if (options.charsetSentinel) { - for (i = 0; i < parts.length; ++i) { - if (parts[i].indexOf('utf8=') === 0) { - if (parts[i] === charsetSentinel) { - charset = 'utf-8'; - } else if (parts[i] === isoSentinel) { - charset = 'iso-8859-1'; - } - skipIndex = i; - i = parts.length; // The eslint settings do not allow break; - } - } - } +/***/ }), - for (i = 0; i < parts.length; ++i) { - if (i === skipIndex) { - continue; - } - var part = parts[i]; - - var bracketEqualsPos = part.indexOf(']='); - var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; - - var key, val; - if (pos === -1) { - key = options.decoder(part, defaults.decoder, charset, 'key'); - val = options.strictNullHandling ? null : ''; - } else { - key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key'); - val = utils.maybeMap( - parseArrayValue(part.slice(pos + 1), options), - function (encodedVal) { - return options.decoder(encodedVal, defaults.decoder, charset, 'value'); - } - ); - } +/***/ 5395: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (val && options.interpretNumericEntities && charset === 'iso-8859-1') { - val = interpretNumericEntities(val); - } +"use strict"; + + +const { finished, PassThrough } = __nccwpck_require__(2781) +const { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError +} = __nccwpck_require__(8045) +const util = __nccwpck_require__(3983) +const { getResolveErrorBodyCallback } = __nccwpck_require__(7474) +const { AsyncResource } = __nccwpck_require__(852) +const { addSignal, removeSignal } = __nccwpck_require__(7032) + +class StreamHandler extends AsyncResource { + constructor (opts, factory, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } + + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts + + try { + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } + + if (typeof factory !== 'function') { + throw new InvalidArgumentError('invalid factory') + } + + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') + } + + if (method === 'CONNECT') { + throw new InvalidArgumentError('invalid method') + } + + if (onInfo && typeof onInfo !== 'function') { + throw new InvalidArgumentError('invalid onInfo callback') + } + + super('UNDICI_STREAM') + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on('error', util.nop), err) + } + throw err + } + + this.responseHeaders = responseHeaders || null + this.opaque = opaque || null + this.factory = factory + this.callback = callback + this.res = null + this.abort = null + this.context = null + this.trailers = null + this.body = body + this.onInfo = onInfo || null + this.throwOnError = throwOnError || false + + if (util.isStream(body)) { + body.on('error', (err) => { + this.onError(err) + }) + } + + addSignal(this, signal) + } + + onConnect (abort, context) { + if (!this.callback) { + throw new RequestAbortedError() + } + + this.abort = abort + this.context = context + } + + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const { factory, opaque, context, callback, responseHeaders } = this + + const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) + + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }) + } + return + } + + this.factory = null + + let res + + if (this.throwOnError && statusCode >= 400) { + const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers + const contentType = parsedHeaders['content-type'] + res = new PassThrough() + + this.callback = null + this.runInAsyncScope(getResolveErrorBodyCallback, null, + { callback, body: res, contentType, statusCode, statusMessage, headers } + ) + } else { + if (factory === null) { + return + } + + res = this.runInAsyncScope(factory, null, { + statusCode, + headers, + opaque, + context + }) + + if ( + !res || + typeof res.write !== 'function' || + typeof res.end !== 'function' || + typeof res.on !== 'function' + ) { + throw new InvalidReturnValueError('expected Writable') + } + + // TODO: Avoid finished. It registers an unnecessary amount of listeners. + finished(res, { readable: false }, (err) => { + const { callback, res, opaque, trailers, abort } = this + + this.res = null + if (err || !res.readable) { + util.destroy(res, err) + } + + this.callback = null + this.runInAsyncScope(callback, null, err || null, { opaque, trailers }) + + if (err) { + abort() + } + }) + } + + res.on('drain', resume) + + this.res = res + + const needDrain = res.writableNeedDrain !== undefined + ? res.writableNeedDrain + : res._writableState && res._writableState.needDrain + + return needDrain !== true + } + + onData (chunk) { + const { res } = this + + return res ? res.write(chunk) : true + } + + onComplete (trailers) { + const { res } = this + + removeSignal(this) + + if (!res) { + return + } + + this.trailers = util.parseHeaders(trailers) + + res.end() + } - if (part.indexOf('[]=') > -1) { - val = isArray(val) ? [val] : val; - } + onError (err) { + const { res, callback, opaque, body } = this + + removeSignal(this) - var existing = has.call(obj, key); - if (existing && options.duplicates === 'combine') { - obj[key] = utils.combine(obj[key], val); - } else if (!existing || options.duplicates === 'last') { - obj[key] = val; - } - } + this.factory = null + + if (res) { + this.res = null + util.destroy(res, err) + } else if (callback) { + this.callback = null + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }) + }) + } - return obj; - }; + if (body) { + this.body = null + util.destroy(body, err) + } + } +} - var parseObject = function (chain, val, options, valuesParsed) { - var leaf = valuesParsed ? val : parseArrayValue(val, options); - - for (var i = chain.length - 1; i >= 0; --i) { - var obj; - var root = chain[i]; - - if (root === '[]' && options.parseArrays) { - obj = options.allowEmptyArrays && leaf === '' ? [] : [].concat(leaf); - } else { - obj = options.plainObjects ? Object.create(null) : {}; - var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; - var decodedRoot = options.decodeDotInKeys ? cleanRoot.replace(/%2E/g, '.') : cleanRoot; - var index = parseInt(decodedRoot, 10); - if (!options.parseArrays && decodedRoot === '') { - obj = { 0: leaf }; - } else if ( - !isNaN(index) - && root !== decodedRoot - && String(index) === decodedRoot - && index >= 0 - && (options.parseArrays && index <= options.arrayLimit) - ) { - obj = []; - obj[index] = leaf; - } else if (decodedRoot !== '__proto__') { - obj[decodedRoot] = leaf; - } - } +function stream (opts, factory, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + stream.call(this, opts, factory, (err, data) => { + return err ? reject(err) : resolve(data) + }) + }) + } + + try { + this.dispatch(opts, new StreamHandler(opts, factory, callback)) + } catch (err) { + if (typeof callback !== 'function') { + throw err + } + const opaque = opts && opts.opaque + queueMicrotask(() => callback(err, { opaque })) + } +} - leaf = obj; - } +module.exports = stream - return leaf; - }; - var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) { - if (!givenKey) { - return; - } +/***/ }), - // Transform dot notation to bracket notation - var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; +/***/ 6923: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // The regex chunks +"use strict"; - var brackets = /(\[[^[\]]*])/; - var child = /(\[[^[\]]*])/g; - // Get the parent +const { InvalidArgumentError, RequestAbortedError, SocketError } = __nccwpck_require__(8045) +const { AsyncResource } = __nccwpck_require__(852) +const util = __nccwpck_require__(3983) +const { addSignal, removeSignal } = __nccwpck_require__(7032) +const assert = __nccwpck_require__(9491) - var segment = options.depth > 0 && brackets.exec(key); - var parent = segment ? key.slice(0, segment.index) : key; +class UpgradeHandler extends AsyncResource { + constructor (opts, callback) { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('invalid opts') + } - // Stash the parent if it exists + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } - var keys = []; - if (parent) { - // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties - if (!options.plainObjects && has.call(Object.prototype, parent)) { - if (!options.allowPrototypes) { - return; - } - } + const { signal, opaque, responseHeaders } = opts - keys.push(parent); - } + if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { + throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') + } - // Loop through children appending to the array until we hit depth + super('UNDICI_UPGRADE') - var i = 0; - while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) { - i += 1; - if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { - if (!options.allowPrototypes) { - return; - } - } - keys.push(segment[1]); - } + this.responseHeaders = responseHeaders || null + this.opaque = opaque || null + this.callback = callback + this.abort = null + this.context = null - // If there's a remainder, just add whatever is left + addSignal(this, signal) + } - if (segment) { - keys.push('[' + key.slice(segment.index) + ']'); - } + onConnect (abort, context) { + if (!this.callback) { + throw new RequestAbortedError() + } - return parseObject(keys, val, options, valuesParsed); - }; + this.abort = abort + this.context = null + } - var normalizeParseOptions = function normalizeParseOptions(opts) { - if (!opts) { - return defaults; - } + onHeaders () { + throw new SocketError('bad upgrade', null) + } - if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') { - throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided'); - } + onUpgrade (statusCode, rawHeaders, socket) { + const { callback, opaque, context } = this - if (typeof opts.decodeDotInKeys !== 'undefined' && typeof opts.decodeDotInKeys !== 'boolean') { - throw new TypeError('`decodeDotInKeys` option can only be `true` or `false`, when provided'); - } + assert.strictEqual(statusCode, 101) - if (opts.decoder !== null && typeof opts.decoder !== 'undefined' && typeof opts.decoder !== 'function') { - throw new TypeError('Decoder has to be a function.'); - } + removeSignal(this) - if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { - throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); - } - var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; + this.callback = null + const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) + this.runInAsyncScope(callback, null, null, { + headers, + socket, + opaque, + context + }) + } - var duplicates = typeof opts.duplicates === 'undefined' ? defaults.duplicates : opts.duplicates; + onError (err) { + const { callback, opaque } = this - if (duplicates !== 'combine' && duplicates !== 'first' && duplicates !== 'last') { - throw new TypeError('The duplicates option must be either combine, first, or last'); - } + removeSignal(this) - var allowDots = typeof opts.allowDots === 'undefined' ? opts.decodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots; - - return { - allowDots: allowDots, - allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays, - allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, - allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse, - arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, - charset: charset, - charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, - comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, - decodeDotInKeys: typeof opts.decodeDotInKeys === 'boolean' ? opts.decodeDotInKeys : defaults.decodeDotInKeys, - decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, - delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, - // eslint-disable-next-line no-implicit-coercion, no-extra-parens - depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth, - duplicates: duplicates, - ignoreQueryPrefix: opts.ignoreQueryPrefix === true, - interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, - parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, - parseArrays: opts.parseArrays !== false, - plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, - strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling - }; - }; + if (callback) { + this.callback = null + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }) + }) + } + } +} - module.exports = function (str, opts) { - var options = normalizeParseOptions(opts); +function upgrade (opts, callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + upgrade.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data) + }) + }) + } + + try { + const upgradeHandler = new UpgradeHandler(opts, callback) + this.dispatch({ + ...opts, + method: opts.method || 'GET', + upgrade: opts.protocol || 'Websocket' + }, upgradeHandler) + } catch (err) { + if (typeof callback !== 'function') { + throw err + } + const opaque = opts && opts.opaque + queueMicrotask(() => callback(err, { opaque })) + } +} - if (str === '' || str === null || typeof str === 'undefined') { - return options.plainObjects ? Object.create(null) : {}; - } +module.exports = upgrade - var tempObj = typeof str === 'string' ? parseValues(str, options) : str; - var obj = options.plainObjects ? Object.create(null) : {}; - // Iterate over the keys and setup the new object +/***/ }), - var keys = Object.keys(tempObj); - for (var i = 0; i < keys.length; ++i) { - var key = keys[i]; - var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string'); - obj = utils.merge(obj, newObj, options); - } +/***/ 4059: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (options.allowSparse === true) { - return obj; - } +"use strict"; - return utils.compact(obj); - }; +module.exports.request = __nccwpck_require__(5448) +module.exports.stream = __nccwpck_require__(5395) +module.exports.pipeline = __nccwpck_require__(8752) +module.exports.upgrade = __nccwpck_require__(6923) +module.exports.connect = __nccwpck_require__(9744) - /***/ -}), -/***/ 9954: +/***/ }), + +/***/ 3858: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +"use strict"; +// Ported from https://github.com/nodejs/undici/pull/907 + + + +const assert = __nccwpck_require__(9491) +const { Readable } = __nccwpck_require__(2781) +const { RequestAbortedError, NotSupportedError, InvalidArgumentError } = __nccwpck_require__(8045) +const util = __nccwpck_require__(3983) +const { ReadableStreamFrom, toUSVString } = __nccwpck_require__(3983) + +let Blob + +const kConsume = Symbol('kConsume') +const kReading = Symbol('kReading') +const kBody = Symbol('kBody') +const kAbort = Symbol('abort') +const kContentType = Symbol('kContentType') + +const noop = () => {} + +module.exports = class BodyReadable extends Readable { + constructor ({ + resume, + abort, + contentType = '', + highWaterMark = 64 * 1024 // Same as nodejs fs streams. + }) { + super({ + autoDestroy: true, + read: resume, + highWaterMark + }) + + this._readableState.dataEmitted = false + + this[kAbort] = abort + this[kConsume] = null + this[kBody] = null + this[kContentType] = contentType + + // Is stream being consumed through Readable API? + // This is an optimization so that we avoid checking + // for 'data' and 'readable' listeners in the hot path + // inside push(). + this[kReading] = false + } + + destroy (err) { + if (this.destroyed) { + // Node < 16 + return this + } + + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError() + } + + if (err) { + this[kAbort]() + } + + return super.destroy(err) + } + + emit (ev, ...args) { + if (ev === 'data') { + // Node < 16.7 + this._readableState.dataEmitted = true + } else if (ev === 'error') { + // Node < 16 + this._readableState.errorEmitted = true + } + return super.emit(ev, ...args) + } + + on (ev, ...args) { + if (ev === 'data' || ev === 'readable') { + this[kReading] = true + } + return super.on(ev, ...args) + } + + addListener (ev, ...args) { + return this.on(ev, ...args) + } + + off (ev, ...args) { + const ret = super.off(ev, ...args) + if (ev === 'data' || ev === 'readable') { + this[kReading] = ( + this.listenerCount('data') > 0 || + this.listenerCount('readable') > 0 + ) + } + return ret + } + + removeListener (ev, ...args) { + return this.off(ev, ...args) + } + + push (chunk) { + if (this[kConsume] && chunk !== null && this.readableLength === 0) { + consumePush(this[kConsume], chunk) + return this[kReading] ? super.push(chunk) : true + } + return super.push(chunk) + } + + // https://fetch.spec.whatwg.org/#dom-body-text + async text () { + return consume(this, 'text') + } + + // https://fetch.spec.whatwg.org/#dom-body-json + async json () { + return consume(this, 'json') + } + + // https://fetch.spec.whatwg.org/#dom-body-blob + async blob () { + return consume(this, 'blob') + } + + // https://fetch.spec.whatwg.org/#dom-body-arraybuffer + async arrayBuffer () { + return consume(this, 'arrayBuffer') + } + + // https://fetch.spec.whatwg.org/#dom-body-formdata + async formData () { + // TODO: Implement. + throw new NotSupportedError() + } + + // https://fetch.spec.whatwg.org/#dom-body-bodyused + get bodyUsed () { + return util.isDisturbed(this) + } + + // https://fetch.spec.whatwg.org/#dom-body-body + get body () { + if (!this[kBody]) { + this[kBody] = ReadableStreamFrom(this) + if (this[kConsume]) { + // TODO: Is this the best way to force a lock? + this[kBody].getReader() // Ensure stream is locked. + assert(this[kBody].locked) + } + } + return this[kBody] + } + + dump (opts) { + let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144 + const signal = opts && opts.signal + + if (signal) { + try { + if (typeof signal !== 'object' || !('aborted' in signal)) { + throw new InvalidArgumentError('signal must be an AbortSignal') + } + util.throwIfAborted(signal) + } catch (err) { + return Promise.reject(err) + } + } + + if (this.closed) { + return Promise.resolve(null) + } + + return new Promise((resolve, reject) => { + const signalListenerCleanup = signal + ? util.addAbortListener(signal, () => { + this.destroy() + }) + : noop + + this + .on('close', function () { + signalListenerCleanup() + if (signal && signal.aborted) { + reject(signal.reason || Object.assign(new Error('The operation was aborted'), { name: 'AbortError' })) + } else { + resolve(null) + } + }) + .on('error', noop) + .on('data', function (chunk) { + limit -= chunk.length + if (limit <= 0) { + this.destroy() + } + }) + .resume() + }) + } +} +// https://streams.spec.whatwg.org/#readablestream-locked +function isLocked (self) { + // Consume is an implicit lock. + return (self[kBody] && self[kBody].locked === true) || self[kConsume] +} - var getSideChannel = __nccwpck_require__(4334); - var utils = __nccwpck_require__(2360); - var formats = __nccwpck_require__(4907); - var has = Object.prototype.hasOwnProperty; +// https://fetch.spec.whatwg.org/#body-unusable +function isUnusable (self) { + return util.isDisturbed(self) || isLocked(self) +} - var arrayPrefixGenerators = { - brackets: function brackets(prefix) { - return prefix + '[]'; - }, - comma: 'comma', - indices: function indices(prefix, key) { - return prefix + '[' + key + ']'; - }, - repeat: function repeat(prefix) { - return prefix; - } - }; +async function consume (stream, type) { + if (isUnusable(stream)) { + throw new TypeError('unusable') + } + + assert(!stream[kConsume]) + + return new Promise((resolve, reject) => { + stream[kConsume] = { + type, + stream, + resolve, + reject, + length: 0, + body: [] + } + + stream + .on('error', function (err) { + consumeFinish(this[kConsume], err) + }) + .on('close', function () { + if (this[kConsume].body !== null) { + consumeFinish(this[kConsume], new RequestAbortedError()) + } + }) + + process.nextTick(consumeStart, stream[kConsume]) + }) +} - var isArray = Array.isArray; - var push = Array.prototype.push; - var pushToArray = function (arr, valueOrArray) { - push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]); - }; +function consumeStart (consume) { + if (consume.body === null) { + return + } - var toISO = Date.prototype.toISOString; - - var defaultFormat = formats['default']; - var defaults = { - addQueryPrefix: false, - allowDots: false, - allowEmptyArrays: false, - arrayFormat: 'indices', - charset: 'utf-8', - charsetSentinel: false, - delimiter: '&', - encode: true, - encodeDotInKeys: false, - encoder: utils.encode, - encodeValuesOnly: false, - format: defaultFormat, - formatter: formats.formatters[defaultFormat], - // deprecated - indices: false, - serializeDate: function serializeDate(date) { - return toISO.call(date); - }, - skipNulls: false, - strictNullHandling: false - }; + const { _readableState: state } = consume.stream - var isNonNullishPrimitive = function isNonNullishPrimitive(v) { - return typeof v === 'string' - || typeof v === 'number' - || typeof v === 'boolean' - || typeof v === 'symbol' - || typeof v === 'bigint'; - }; + for (const chunk of state.buffer) { + consumePush(consume, chunk) + } - var sentinel = {}; - - var stringify = function stringify( - object, - prefix, - generateArrayPrefix, - commaRoundTrip, - allowEmptyArrays, - strictNullHandling, - skipNulls, - encodeDotInKeys, - encoder, - filter, - sort, - allowDots, - serializeDate, - format, - formatter, - encodeValuesOnly, - charset, - sideChannel - ) { - var obj = object; - - var tmpSc = sideChannel; - var step = 0; - var findFlag = false; - while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) { - // Where object last appeared in the ref tree - var pos = tmpSc.get(object); - step += 1; - if (typeof pos !== 'undefined') { - if (pos === step) { - throw new RangeError('Cyclic object value'); - } else { - findFlag = true; // Break while - } - } - if (typeof tmpSc.get(sentinel) === 'undefined') { - step = 0; - } - } + if (state.endEmitted) { + consumeEnd(this[kConsume]) + } else { + consume.stream.on('end', function () { + consumeEnd(this[kConsume]) + }) + } - if (typeof filter === 'function') { - obj = filter(prefix, obj); - } else if (obj instanceof Date) { - obj = serializeDate(obj); - } else if (generateArrayPrefix === 'comma' && isArray(obj)) { - obj = utils.maybeMap(obj, function (value) { - if (value instanceof Date) { - return serializeDate(value); - } - return value; - }); - } + consume.stream.resume() - if (obj === null) { - if (strictNullHandling) { - return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix; - } + while (consume.stream.read() != null) { + // Loop + } +} - obj = ''; - } +function consumeEnd (consume) { + const { type, body, resolve, stream, length } = consume + + try { + if (type === 'text') { + resolve(toUSVString(Buffer.concat(body))) + } else if (type === 'json') { + resolve(JSON.parse(Buffer.concat(body))) + } else if (type === 'arrayBuffer') { + const dst = new Uint8Array(length) + + let pos = 0 + for (const buf of body) { + dst.set(buf, pos) + pos += buf.byteLength + } + + resolve(dst.buffer) + } else if (type === 'blob') { + if (!Blob) { + Blob = (__nccwpck_require__(4300).Blob) + } + resolve(new Blob(body, { type: stream[kContentType] })) + } + + consumeFinish(consume) + } catch (err) { + stream.destroy(err) + } +} - if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { - if (encoder) { - var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format); - return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))]; - } - return [formatter(prefix) + '=' + formatter(String(obj))]; - } +function consumePush (consume, chunk) { + consume.length += chunk.length + consume.body.push(chunk) +} - var values = []; +function consumeFinish (consume, err) { + if (consume.body === null) { + return + } + + if (err) { + consume.reject(err) + } else { + consume.resolve() + } + + consume.type = null + consume.stream = null + consume.resolve = null + consume.reject = null + consume.length = 0 + consume.body = null +} - if (typeof obj === 'undefined') { - return values; - } - var objKeys; - if (generateArrayPrefix === 'comma' && isArray(obj)) { - // we need to join elements in - if (encodeValuesOnly && encoder) { - obj = utils.maybeMap(obj, encoder); - } - objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }]; - } else if (isArray(filter)) { - objKeys = filter; - } else { - var keys = Object.keys(obj); - objKeys = sort ? keys.sort(sort) : keys; - } +/***/ }), - var encodedPrefix = encodeDotInKeys ? prefix.replace(/\./g, '%2E') : prefix; +/***/ 7474: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? encodedPrefix + '[]' : encodedPrefix; +const assert = __nccwpck_require__(9491) +const { + ResponseStatusCodeError +} = __nccwpck_require__(8045) +const { toUSVString } = __nccwpck_require__(3983) + +async function getResolveErrorBodyCallback ({ callback, body, contentType, statusCode, statusMessage, headers }) { + assert(body) + + let chunks = [] + let limit = 0 + + for await (const chunk of body) { + chunks.push(chunk) + limit += chunk.length + if (limit > 128 * 1024) { + chunks = null + break + } + } + + if (statusCode === 204 || !contentType || !chunks) { + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers)) + return + } + + try { + if (contentType.startsWith('application/json')) { + const payload = JSON.parse(toUSVString(Buffer.concat(chunks))) + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload)) + return + } + + if (contentType.startsWith('text/')) { + const payload = toUSVString(Buffer.concat(chunks)) + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload)) + return + } + } catch (err) { + // Process in a fallback if error + } + + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers)) +} - if (allowEmptyArrays && isArray(obj) && obj.length === 0) { - return adjustedPrefix + '[]'; - } +module.exports = { getResolveErrorBodyCallback } - for (var j = 0; j < objKeys.length; ++j) { - var key = objKeys[j]; - var value = typeof key === 'object' && typeof key.value !== 'undefined' ? key.value : obj[key]; - if (skipNulls && value === null) { - continue; - } +/***/ }), - var encodedKey = allowDots && encodeDotInKeys ? key.replace(/\./g, '%2E') : key; - var keyPrefix = isArray(obj) - ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, encodedKey) : adjustedPrefix - : adjustedPrefix + (allowDots ? '.' + encodedKey : '[' + encodedKey + ']'); - - sideChannel.set(object, step); - var valueSideChannel = getSideChannel(); - valueSideChannel.set(sentinel, sideChannel); - pushToArray(values, stringify( - value, - keyPrefix, - generateArrayPrefix, - commaRoundTrip, - allowEmptyArrays, - strictNullHandling, - skipNulls, - encodeDotInKeys, - generateArrayPrefix === 'comma' && encodeValuesOnly && isArray(obj) ? null : encoder, - filter, - sort, - allowDots, - serializeDate, - format, - formatter, - encodeValuesOnly, - charset, - valueSideChannel - )); - } +/***/ 7931: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - return values; - }; +"use strict"; + + +const { + BalancedPoolMissingUpstreamError, + InvalidArgumentError +} = __nccwpck_require__(8045) +const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher +} = __nccwpck_require__(3198) +const Pool = __nccwpck_require__(4634) +const { kUrl, kInterceptors } = __nccwpck_require__(2785) +const { parseOrigin } = __nccwpck_require__(3983) +const kFactory = Symbol('factory') + +const kOptions = Symbol('options') +const kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor') +const kCurrentWeight = Symbol('kCurrentWeight') +const kIndex = Symbol('kIndex') +const kWeight = Symbol('kWeight') +const kMaxWeightPerServer = Symbol('kMaxWeightPerServer') +const kErrorPenalty = Symbol('kErrorPenalty') + +function getGreatestCommonDivisor (a, b) { + if (b === 0) return a + return getGreatestCommonDivisor(b, a % b) +} - var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { - if (!opts) { - return defaults; - } +function defaultFactory (origin, opts) { + return new Pool(origin, opts) +} - if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') { - throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided'); - } +class BalancedPool extends PoolBase { + constructor (upstreams = [], { factory = defaultFactory, ...opts } = {}) { + super() + + this[kOptions] = opts + this[kIndex] = -1 + this[kCurrentWeight] = 0 + + this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100 + this[kErrorPenalty] = this[kOptions].errorPenalty || 15 + + if (!Array.isArray(upstreams)) { + upstreams = [upstreams] + } + + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') + } + + this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) + ? opts.interceptors.BalancedPool + : [] + this[kFactory] = factory + + for (const upstream of upstreams) { + this.addUpstream(upstream) + } + this._updateBalancedPoolStats() + } + + addUpstream (upstream) { + const upstreamOrigin = parseOrigin(upstream).origin + + if (this[kClients].find((pool) => ( + pool[kUrl].origin === upstreamOrigin && + pool.closed !== true && + pool.destroyed !== true + ))) { + return this + } + const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])) + + this[kAddClient](pool) + pool.on('connect', () => { + pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]) + }) + + pool.on('connectionError', () => { + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]) + this._updateBalancedPoolStats() + }) + + pool.on('disconnect', (...args) => { + const err = args[2] + if (err && err.code === 'UND_ERR_SOCKET') { + // decrease the weight of the pool. + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]) + this._updateBalancedPoolStats() + } + }) + + for (const client of this[kClients]) { + client[kWeight] = this[kMaxWeightPerServer] + } + + this._updateBalancedPoolStats() + + return this + } + + _updateBalancedPoolStats () { + this[kGreatestCommonDivisor] = this[kClients].map(p => p[kWeight]).reduce(getGreatestCommonDivisor, 0) + } + + removeUpstream (upstream) { + const upstreamOrigin = parseOrigin(upstream).origin + + const pool = this[kClients].find((pool) => ( + pool[kUrl].origin === upstreamOrigin && + pool.closed !== true && + pool.destroyed !== true + )) + + if (pool) { + this[kRemoveClient](pool) + } + + return this + } + + get upstreams () { + return this[kClients] + .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true) + .map((p) => p[kUrl].origin) + } + + [kGetDispatcher] () { + // We validate that pools is greater than 0, + // otherwise we would have to wait until an upstream + // is added, which might never happen. + if (this[kClients].length === 0) { + throw new BalancedPoolMissingUpstreamError() + } + + const dispatcher = this[kClients].find(dispatcher => ( + !dispatcher[kNeedDrain] && + dispatcher.closed !== true && + dispatcher.destroyed !== true + )) + + if (!dispatcher) { + return + } + + const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true) + + if (allClientsBusy) { + return + } + + let counter = 0 + + let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]) + + while (counter++ < this[kClients].length) { + this[kIndex] = (this[kIndex] + 1) % this[kClients].length + const pool = this[kClients][this[kIndex]] + + // find pool index with the largest weight + if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { + maxWeightIndex = this[kIndex] + } + + // decrease the current weight every `this[kClients].length`. + if (this[kIndex] === 0) { + // Set the current weight to the next lower weight. + this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor] + + if (this[kCurrentWeight] <= 0) { + this[kCurrentWeight] = this[kMaxWeightPerServer] + } + } + if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) { + return pool + } + } + + this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight] + this[kIndex] = maxWeightIndex + return this[kClients][maxWeightIndex] + } +} - if (typeof opts.encodeDotInKeys !== 'undefined' && typeof opts.encodeDotInKeys !== 'boolean') { - throw new TypeError('`encodeDotInKeys` option can only be `true` or `false`, when provided'); - } +module.exports = BalancedPool - if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') { - throw new TypeError('Encoder has to be a function.'); - } - var charset = opts.charset || defaults.charset; - if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { - throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); - } +/***/ }), - var format = formats['default']; - if (typeof opts.format !== 'undefined') { - if (!has.call(formats.formatters, opts.format)) { - throw new TypeError('Unknown format option provided.'); - } - format = opts.format; - } - var formatter = formats.formatters[format]; +/***/ 6101: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - var filter = defaults.filter; - if (typeof opts.filter === 'function' || isArray(opts.filter)) { - filter = opts.filter; - } +"use strict"; + + +const { kConstruct } = __nccwpck_require__(9174) +const { urlEquals, fieldValues: getFieldValues } = __nccwpck_require__(2396) +const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(3983) +const { kHeadersList } = __nccwpck_require__(2785) +const { webidl } = __nccwpck_require__(1744) +const { Response, cloneResponse } = __nccwpck_require__(7823) +const { Request } = __nccwpck_require__(8359) +const { kState, kHeaders, kGuard, kRealm } = __nccwpck_require__(5861) +const { fetching } = __nccwpck_require__(4881) +const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(2538) +const assert = __nccwpck_require__(9491) +const { getGlobalDispatcher } = __nccwpck_require__(1892) + +/** + * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation + * @typedef {Object} CacheBatchOperation + * @property {'delete' | 'put'} type + * @property {any} request + * @property {any} response + * @property {import('../../types/cache').CacheQueryOptions} options + */ + +/** + * @see https://w3c.github.io/ServiceWorker/#dfn-request-response-list + * @typedef {[any, any][]} requestResponseList + */ + +class Cache { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list + * @type {requestResponseList} + */ + #relevantRequestResponseList + + constructor () { + if (arguments[0] !== kConstruct) { + webidl.illegalConstructor() + } + + this.#relevantRequestResponseList = arguments[1] + } + + async match (request, options = {}) { + webidl.brandCheck(this, Cache) + webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.match' }) + + request = webidl.converters.RequestInfo(request) + options = webidl.converters.CacheQueryOptions(options) + + const p = await this.matchAll(request, options) + + if (p.length === 0) { + return + } + + return p[0] + } + + async matchAll (request = undefined, options = {}) { + webidl.brandCheck(this, Cache) + + if (request !== undefined) request = webidl.converters.RequestInfo(request) + options = webidl.converters.CacheQueryOptions(options) + + // 1. + let r = null + + // 2. + if (request !== undefined) { + if (request instanceof Request) { + // 2.1.1 + r = request[kState] + + // 2.1.2 + if (r.method !== 'GET' && !options.ignoreMethod) { + return [] + } + } else if (typeof request === 'string') { + // 2.2.1 + r = new Request(request)[kState] + } + } + + // 5. + // 5.1 + const responses = [] + + // 5.2 + if (request === undefined) { + // 5.2.1 + for (const requestResponse of this.#relevantRequestResponseList) { + responses.push(requestResponse[1]) + } + } else { // 5.3 + // 5.3.1 + const requestResponses = this.#queryCache(r, options) + + // 5.3.2 + for (const requestResponse of requestResponses) { + responses.push(requestResponse[1]) + } + } + + // 5.4 + // We don't implement CORs so we don't need to loop over the responses, yay! + + // 5.5.1 + const responseList = [] + + // 5.5.2 + for (const response of responses) { + // 5.5.2.1 + const responseObject = new Response(response.body?.source ?? null) + const body = responseObject[kState].body + responseObject[kState] = response + responseObject[kState].body = body + responseObject[kHeaders][kHeadersList] = response.headersList + responseObject[kHeaders][kGuard] = 'immutable' + + responseList.push(responseObject) + } + + // 6. + return Object.freeze(responseList) + } + + async add (request) { + webidl.brandCheck(this, Cache) + webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.add' }) + + request = webidl.converters.RequestInfo(request) + + // 1. + const requests = [request] + + // 2. + const responseArrayPromise = this.addAll(requests) + + // 3. + return await responseArrayPromise + } + + async addAll (requests) { + webidl.brandCheck(this, Cache) + webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.addAll' }) + + requests = webidl.converters['sequence'](requests) + + // 1. + const responsePromises = [] + + // 2. + const requestList = [] + + // 3. + for (const request of requests) { + if (typeof request === 'string') { + continue + } + + // 3.1 + const r = request[kState] + + // 3.2 + if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') { + throw webidl.errors.exception({ + header: 'Cache.addAll', + message: 'Expected http/s scheme when method is not GET.' + }) + } + } + + // 4. + /** @type {ReturnType[]} */ + const fetchControllers = [] + + // 5. + for (const request of requests) { + // 5.1 + const r = new Request(request)[kState] + + // 5.2 + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: 'Cache.addAll', + message: 'Expected http/s scheme.' + }) + } + + // 5.4 + r.initiator = 'fetch' + r.destination = 'subresource' + + // 5.5 + requestList.push(r) + + // 5.6 + const responsePromise = createDeferredPromise() + + // 5.7 + fetchControllers.push(fetching({ + request: r, + dispatcher: getGlobalDispatcher(), + processResponse (response) { + // 1. + if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) { + responsePromise.reject(webidl.errors.exception({ + header: 'Cache.addAll', + message: 'Received an invalid status code or the request failed.' + })) + } else if (response.headersList.contains('vary')) { // 2. + // 2.1 + const fieldValues = getFieldValues(response.headersList.get('vary')) + + // 2.2 + for (const fieldValue of fieldValues) { + // 2.2.1 + if (fieldValue === '*') { + responsePromise.reject(webidl.errors.exception({ + header: 'Cache.addAll', + message: 'invalid vary field value' + })) + + for (const controller of fetchControllers) { + controller.abort() + } + + return + } + } + } + }, + processResponseEndOfBody (response) { + // 1. + if (response.aborted) { + responsePromise.reject(new DOMException('aborted', 'AbortError')) + return + } + + // 2. + responsePromise.resolve(response) + } + })) + + // 5.8 + responsePromises.push(responsePromise.promise) + } + + // 6. + const p = Promise.all(responsePromises) + + // 7. + const responses = await p + + // 7.1 + const operations = [] + + // 7.2 + let index = 0 + + // 7.3 + for (const response of responses) { + // 7.3.1 + /** @type {CacheBatchOperation} */ + const operation = { + type: 'put', // 7.3.2 + request: requestList[index], // 7.3.3 + response // 7.3.4 + } + + operations.push(operation) // 7.3.5 + + index++ // 7.3.6 + } + + // 7.5 + const cacheJobPromise = createDeferredPromise() + + // 7.6.1 + let errorData = null + + // 7.6.2 + try { + this.#batchCacheOperations(operations) + } catch (e) { + errorData = e + } + + // 7.6.3 + queueMicrotask(() => { + // 7.6.3.1 + if (errorData === null) { + cacheJobPromise.resolve(undefined) + } else { + // 7.6.3.2 + cacheJobPromise.reject(errorData) + } + }) + + // 7.7 + return cacheJobPromise.promise + } + + async put (request, response) { + webidl.brandCheck(this, Cache) + webidl.argumentLengthCheck(arguments, 2, { header: 'Cache.put' }) + + request = webidl.converters.RequestInfo(request) + response = webidl.converters.Response(response) + + // 1. + let innerRequest = null + + // 2. + if (request instanceof Request) { + innerRequest = request[kState] + } else { // 3. + innerRequest = new Request(request)[kState] + } + + // 4. + if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') { + throw webidl.errors.exception({ + header: 'Cache.put', + message: 'Expected an http/s scheme when method is not GET' + }) + } + + // 5. + const innerResponse = response[kState] + + // 6. + if (innerResponse.status === 206) { + throw webidl.errors.exception({ + header: 'Cache.put', + message: 'Got 206 status' + }) + } + + // 7. + if (innerResponse.headersList.contains('vary')) { + // 7.1. + const fieldValues = getFieldValues(innerResponse.headersList.get('vary')) + + // 7.2. + for (const fieldValue of fieldValues) { + // 7.2.1 + if (fieldValue === '*') { + throw webidl.errors.exception({ + header: 'Cache.put', + message: 'Got * vary field value' + }) + } + } + } + + // 8. + if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { + throw webidl.errors.exception({ + header: 'Cache.put', + message: 'Response body is locked or disturbed' + }) + } + + // 9. + const clonedResponse = cloneResponse(innerResponse) + + // 10. + const bodyReadPromise = createDeferredPromise() + + // 11. + if (innerResponse.body != null) { + // 11.1 + const stream = innerResponse.body.stream + + // 11.2 + const reader = stream.getReader() + + // 11.3 + readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject) + } else { + bodyReadPromise.resolve(undefined) + } + + // 12. + /** @type {CacheBatchOperation[]} */ + const operations = [] + + // 13. + /** @type {CacheBatchOperation} */ + const operation = { + type: 'put', // 14. + request: innerRequest, // 15. + response: clonedResponse // 16. + } + + // 17. + operations.push(operation) + + // 19. + const bytes = await bodyReadPromise.promise + + if (clonedResponse.body != null) { + clonedResponse.body.source = bytes + } + + // 19.1 + const cacheJobPromise = createDeferredPromise() + + // 19.2.1 + let errorData = null + + // 19.2.2 + try { + this.#batchCacheOperations(operations) + } catch (e) { + errorData = e + } + + // 19.2.3 + queueMicrotask(() => { + // 19.2.3.1 + if (errorData === null) { + cacheJobPromise.resolve() + } else { // 19.2.3.2 + cacheJobPromise.reject(errorData) + } + }) + + return cacheJobPromise.promise + } + + async delete (request, options = {}) { + webidl.brandCheck(this, Cache) + webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.delete' }) + + request = webidl.converters.RequestInfo(request) + options = webidl.converters.CacheQueryOptions(options) + + /** + * @type {Request} + */ + let r = null + + if (request instanceof Request) { + r = request[kState] + + if (r.method !== 'GET' && !options.ignoreMethod) { + return false + } + } else { + assert(typeof request === 'string') + + r = new Request(request)[kState] + } + + /** @type {CacheBatchOperation[]} */ + const operations = [] + + /** @type {CacheBatchOperation} */ + const operation = { + type: 'delete', + request: r, + options + } + + operations.push(operation) + + const cacheJobPromise = createDeferredPromise() + + let errorData = null + let requestResponses + + try { + requestResponses = this.#batchCacheOperations(operations) + } catch (e) { + errorData = e + } + + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(!!requestResponses?.length) + } else { + cacheJobPromise.reject(errorData) + } + }) + + return cacheJobPromise.promise + } + + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys + * @param {any} request + * @param {import('../../types/cache').CacheQueryOptions} options + * @returns {readonly Request[]} + */ + async keys (request = undefined, options = {}) { + webidl.brandCheck(this, Cache) + + if (request !== undefined) request = webidl.converters.RequestInfo(request) + options = webidl.converters.CacheQueryOptions(options) + + // 1. + let r = null + + // 2. + if (request !== undefined) { + // 2.1 + if (request instanceof Request) { + // 2.1.1 + r = request[kState] + + // 2.1.2 + if (r.method !== 'GET' && !options.ignoreMethod) { + return [] + } + } else if (typeof request === 'string') { // 2.2 + r = new Request(request)[kState] + } + } + + // 4. + const promise = createDeferredPromise() + + // 5. + // 5.1 + const requests = [] + + // 5.2 + if (request === undefined) { + // 5.2.1 + for (const requestResponse of this.#relevantRequestResponseList) { + // 5.2.1.1 + requests.push(requestResponse[0]) + } + } else { // 5.3 + // 5.3.1 + const requestResponses = this.#queryCache(r, options) + + // 5.3.2 + for (const requestResponse of requestResponses) { + // 5.3.2.1 + requests.push(requestResponse[0]) + } + } + + // 5.4 + queueMicrotask(() => { + // 5.4.1 + const requestList = [] + + // 5.4.2 + for (const request of requests) { + const requestObject = new Request('https://a') + requestObject[kState] = request + requestObject[kHeaders][kHeadersList] = request.headersList + requestObject[kHeaders][kGuard] = 'immutable' + requestObject[kRealm] = request.client + + // 5.4.2.1 + requestList.push(requestObject) + } + + // 5.4.3 + promise.resolve(Object.freeze(requestList)) + }) + + return promise.promise + } + + /** + * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm + * @param {CacheBatchOperation[]} operations + * @returns {requestResponseList} + */ + #batchCacheOperations (operations) { + // 1. + const cache = this.#relevantRequestResponseList + + // 2. + const backupCache = [...cache] + + // 3. + const addedItems = [] + + // 4.1 + const resultList = [] + + try { + // 4.2 + for (const operation of operations) { + // 4.2.1 + if (operation.type !== 'delete' && operation.type !== 'put') { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'operation type does not match "delete" or "put"' + }) + } + + // 4.2.2 + if (operation.type === 'delete' && operation.response != null) { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'delete operation should not have an associated response' + }) + } + + // 4.2.3 + if (this.#queryCache(operation.request, operation.options, addedItems).length) { + throw new DOMException('???', 'InvalidStateError') + } + + // 4.2.4 + let requestResponses + + // 4.2.5 + if (operation.type === 'delete') { + // 4.2.5.1 + requestResponses = this.#queryCache(operation.request, operation.options) + + // TODO: the spec is wrong, this is needed to pass WPTs + if (requestResponses.length === 0) { + return [] + } + + // 4.2.5.2 + for (const requestResponse of requestResponses) { + const idx = cache.indexOf(requestResponse) + assert(idx !== -1) + + // 4.2.5.2.1 + cache.splice(idx, 1) + } + } else if (operation.type === 'put') { // 4.2.6 + // 4.2.6.1 + if (operation.response == null) { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'put operation should have an associated response' + }) + } + + // 4.2.6.2 + const r = operation.request + + // 4.2.6.3 + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'expected http or https scheme' + }) + } + + // 4.2.6.4 + if (r.method !== 'GET') { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'not get method' + }) + } + + // 4.2.6.5 + if (operation.options != null) { + throw webidl.errors.exception({ + header: 'Cache.#batchCacheOperations', + message: 'options must not be defined' + }) + } + + // 4.2.6.6 + requestResponses = this.#queryCache(operation.request) + + // 4.2.6.7 + for (const requestResponse of requestResponses) { + const idx = cache.indexOf(requestResponse) + assert(idx !== -1) + + // 4.2.6.7.1 + cache.splice(idx, 1) + } + + // 4.2.6.8 + cache.push([operation.request, operation.response]) + + // 4.2.6.10 + addedItems.push([operation.request, operation.response]) + } + + // 4.2.7 + resultList.push([operation.request, operation.response]) + } + + // 4.3 + return resultList + } catch (e) { // 5. + // 5.1 + this.#relevantRequestResponseList.length = 0 + + // 5.2 + this.#relevantRequestResponseList = backupCache + + // 5.3 + throw e + } + } + + /** + * @see https://w3c.github.io/ServiceWorker/#query-cache + * @param {any} requestQuery + * @param {import('../../types/cache').CacheQueryOptions} options + * @param {requestResponseList} targetStorage + * @returns {requestResponseList} + */ + #queryCache (requestQuery, options, targetStorage) { + /** @type {requestResponseList} */ + const resultList = [] + + const storage = targetStorage ?? this.#relevantRequestResponseList + + for (const requestResponse of storage) { + const [cachedRequest, cachedResponse] = requestResponse + if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { + resultList.push(requestResponse) + } + } + + return resultList + } + + /** + * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm + * @param {any} requestQuery + * @param {any} request + * @param {any | null} response + * @param {import('../../types/cache').CacheQueryOptions | undefined} options + * @returns {boolean} + */ + #requestMatchesCachedItem (requestQuery, request, response = null, options) { + // if (options?.ignoreMethod === false && request.method === 'GET') { + // return false + // } + + const queryURL = new URL(requestQuery.url) + + const cachedURL = new URL(request.url) + + if (options?.ignoreSearch) { + cachedURL.search = '' + + queryURL.search = '' + } + + if (!urlEquals(queryURL, cachedURL, true)) { + return false + } + + if ( + response == null || + options?.ignoreVary || + !response.headersList.contains('vary') + ) { + return true + } + + const fieldValues = getFieldValues(response.headersList.get('vary')) + + for (const fieldValue of fieldValues) { + if (fieldValue === '*') { + return false + } + + const requestValue = request.headersList.get(fieldValue) + const queryValue = requestQuery.headersList.get(fieldValue) + + // If one has the header and the other doesn't, or one has + // a different value than the other, return false + if (requestValue !== queryValue) { + return false + } + } + + return true + } +} - var arrayFormat; - if (opts.arrayFormat in arrayPrefixGenerators) { - arrayFormat = opts.arrayFormat; - } else if ('indices' in opts) { - arrayFormat = opts.indices ? 'indices' : 'repeat'; - } else { - arrayFormat = defaults.arrayFormat; - } +Object.defineProperties(Cache.prototype, { + [Symbol.toStringTag]: { + value: 'Cache', + configurable: true + }, + match: kEnumerableProperty, + matchAll: kEnumerableProperty, + add: kEnumerableProperty, + addAll: kEnumerableProperty, + put: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty +}) - if ('commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') { - throw new TypeError('`commaRoundTrip` must be a boolean, or absent'); - } +const cacheQueryOptionConverters = [ + { + key: 'ignoreSearch', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'ignoreMethod', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'ignoreVary', + converter: webidl.converters.boolean, + defaultValue: false + } +] + +webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters) + +webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ + ...cacheQueryOptionConverters, + { + key: 'cacheName', + converter: webidl.converters.DOMString + } +]) + +webidl.converters.Response = webidl.interfaceConverter(Response) + +webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.RequestInfo +) + +module.exports = { + Cache +} - var allowDots = typeof opts.allowDots === 'undefined' ? opts.encodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots; - - return { - addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix, - allowDots: allowDots, - allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays, - arrayFormat: arrayFormat, - charset: charset, - charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, - commaRoundTrip: opts.commaRoundTrip, - delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter, - encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode, - encodeDotInKeys: typeof opts.encodeDotInKeys === 'boolean' ? opts.encodeDotInKeys : defaults.encodeDotInKeys, - encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder, - encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly, - filter: filter, - format: format, - formatter: formatter, - serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate, - skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls, - sort: typeof opts.sort === 'function' ? opts.sort : null, - strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling - }; - }; - module.exports = function (object, opts) { - var obj = object; - var options = normalizeStringifyOptions(opts); +/***/ }), - var objKeys; - var filter; +/***/ 7907: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (typeof options.filter === 'function') { - filter = options.filter; - obj = filter('', obj); - } else if (isArray(options.filter)) { - filter = options.filter; - objKeys = filter; - } +"use strict"; + + +const { kConstruct } = __nccwpck_require__(9174) +const { Cache } = __nccwpck_require__(6101) +const { webidl } = __nccwpck_require__(1744) +const { kEnumerableProperty } = __nccwpck_require__(3983) + +class CacheStorage { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map + * @type {Map} + */ + async has (cacheName) { + webidl.brandCheck(this, CacheStorage) + webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.has' }) + + cacheName = webidl.converters.DOMString(cacheName) + + // 2.1.1 + // 2.2 + return this.#caches.has(cacheName) + } + + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open + * @param {string} cacheName + * @returns {Promise} + */ + async open (cacheName) { + webidl.brandCheck(this, CacheStorage) + webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.open' }) + + cacheName = webidl.converters.DOMString(cacheName) + + // 2.1 + if (this.#caches.has(cacheName)) { + // await caches.open('v1') !== await caches.open('v1') + + // 2.1.1 + const cache = this.#caches.get(cacheName) + + // 2.1.1.1 + return new Cache(kConstruct, cache) + } + + // 2.2 + const cache = [] + + // 2.3 + this.#caches.set(cacheName, cache) + + // 2.4 + return new Cache(kConstruct, cache) + } + + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete + * @param {string} cacheName + * @returns {Promise} + */ + async delete (cacheName) { + webidl.brandCheck(this, CacheStorage) + webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.delete' }) + + cacheName = webidl.converters.DOMString(cacheName) + + return this.#caches.delete(cacheName) + } + + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys + * @returns {string[]} + */ + async keys () { + webidl.brandCheck(this, CacheStorage) + + // 2.1 + const keys = this.#caches.keys() + + // 2.2 + return [...keys] + } +} - var keys = []; +Object.defineProperties(CacheStorage.prototype, { + [Symbol.toStringTag]: { + value: 'CacheStorage', + configurable: true + }, + match: kEnumerableProperty, + has: kEnumerableProperty, + open: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty +}) - if (typeof obj !== 'object' || obj === null) { - return ''; - } +module.exports = { + CacheStorage +} - var generateArrayPrefix = arrayPrefixGenerators[options.arrayFormat]; - var commaRoundTrip = generateArrayPrefix === 'comma' && options.commaRoundTrip; - if (!objKeys) { - objKeys = Object.keys(obj); - } +/***/ }), - if (options.sort) { - objKeys.sort(options.sort); - } +/***/ 9174: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - var sideChannel = getSideChannel(); - for (var i = 0; i < objKeys.length; ++i) { - var key = objKeys[i]; +"use strict"; - if (options.skipNulls && obj[key] === null) { - continue; - } - pushToArray(keys, stringify( - obj[key], - key, - generateArrayPrefix, - commaRoundTrip, - options.allowEmptyArrays, - options.strictNullHandling, - options.skipNulls, - options.encodeDotInKeys, - options.encode ? options.encoder : null, - options.filter, - options.sort, - options.allowDots, - options.serializeDate, - options.format, - options.formatter, - options.encodeValuesOnly, - options.charset, - sideChannel - )); - } - var joined = keys.join(options.delimiter); - var prefix = options.addQueryPrefix === true ? '?' : ''; +module.exports = { + kConstruct: (__nccwpck_require__(2785).kConstruct) +} - if (options.charsetSentinel) { - if (options.charset === 'iso-8859-1') { - // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark - prefix += 'utf8=%26%2310003%3B&'; - } else { - // encodeURIComponent('✓') - prefix += 'utf8=%E2%9C%93&'; - } - } - return joined.length > 0 ? prefix + joined : ''; - }; +/***/ }), +/***/ 2396: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - /***/ -}), +"use strict"; -/***/ 2360: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +const assert = __nccwpck_require__(9491) +const { URLSerializer } = __nccwpck_require__(685) +const { isValidHeaderName } = __nccwpck_require__(2538) +/** + * @see https://url.spec.whatwg.org/#concept-url-equals + * @param {URL} A + * @param {URL} B + * @param {boolean | undefined} excludeFragment + * @returns {boolean} + */ +function urlEquals (A, B, excludeFragment = false) { + const serializedA = URLSerializer(A, excludeFragment) - var formats = __nccwpck_require__(4907); + const serializedB = URLSerializer(B, excludeFragment) - var has = Object.prototype.hasOwnProperty; - var isArray = Array.isArray; + return serializedA === serializedB +} - var hexTable = (function () { - var array = []; - for (var i = 0; i < 256; ++i) { - array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); - } +/** + * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262 + * @param {string} header + */ +function fieldValues (header) { + assert(header !== null) - return array; - }()); + const values = [] - var compactQueue = function compactQueue(queue) { - while (queue.length > 1) { - var item = queue.pop(); - var obj = item.obj[item.prop]; + for (let value of header.split(',')) { + value = value.trim() - if (isArray(obj)) { - var compacted = []; + if (!value.length) { + continue + } else if (!isValidHeaderName(value)) { + continue + } - for (var j = 0; j < obj.length; ++j) { - if (typeof obj[j] !== 'undefined') { - compacted.push(obj[j]); - } - } + values.push(value) + } - item.obj[item.prop] = compacted; - } - } - }; + return values +} - var arrayToObject = function arrayToObject(source, options) { - var obj = options && options.plainObjects ? Object.create(null) : {}; - for (var i = 0; i < source.length; ++i) { - if (typeof source[i] !== 'undefined') { - obj[i] = source[i]; - } - } +module.exports = { + urlEquals, + fieldValues +} - return obj; - }; - var merge = function merge(target, source, options) { - /* eslint no-param-reassign: 0 */ - if (!source) { - return target; - } +/***/ }), - if (typeof source !== 'object') { - if (isArray(target)) { - target.push(source); - } else if (target && typeof target === 'object') { - if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) { - target[source] = true; - } - } else { - return [target, source]; - } +/***/ 3598: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - return target; - } +"use strict"; +// @ts-check + + + +/* global WebAssembly */ + +const assert = __nccwpck_require__(9491) +const net = __nccwpck_require__(1808) +const http = __nccwpck_require__(3685) +const { pipeline } = __nccwpck_require__(2781) +const util = __nccwpck_require__(3983) +const timers = __nccwpck_require__(9459) +const Request = __nccwpck_require__(2905) +const DispatcherBase = __nccwpck_require__(4839) +const { + RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, + InvalidArgumentError, + RequestAbortedError, + HeadersTimeoutError, + HeadersOverflowError, + SocketError, + InformationalError, + BodyTimeoutError, + HTTPParserError, + ResponseExceededMaxSizeError, + ClientDestroyedError +} = __nccwpck_require__(8045) +const buildConnector = __nccwpck_require__(2067) +const { + kUrl, + kReset, + kServerName, + kClient, + kBusy, + kParser, + kConnect, + kBlocking, + kResuming, + kRunning, + kPending, + kSize, + kWriting, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kNoRef, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kSocket, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRedirections, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kInterceptors, + kLocalAddress, + kMaxResponseSize, + kHTTPConnVersion, + // HTTP2 + kHost, + kHTTP2Session, + kHTTP2SessionState, + kHTTP2BuildRequest, + kHTTP2CopyHeaders, + kHTTP1BuildRequest +} = __nccwpck_require__(2785) + +/** @type {import('http2')} */ +let http2 +try { + http2 = __nccwpck_require__(5158) +} catch { + // @ts-ignore + http2 = { constants: {} } +} - if (!target || typeof target !== 'object') { - return [target].concat(source); - } +const { + constants: { + HTTP2_HEADER_AUTHORITY, + HTTP2_HEADER_METHOD, + HTTP2_HEADER_PATH, + HTTP2_HEADER_SCHEME, + HTTP2_HEADER_CONTENT_LENGTH, + HTTP2_HEADER_EXPECT, + HTTP2_HEADER_STATUS + } +} = http2 + +// Experimental +let h2ExperimentalWarned = false + +const FastBuffer = Buffer[Symbol.species] + +const kClosedResolve = Symbol('kClosedResolve') + +const channels = {} + +try { + const diagnosticsChannel = __nccwpck_require__(7643) + channels.sendHeaders = diagnosticsChannel.channel('undici:client:sendHeaders') + channels.beforeConnect = diagnosticsChannel.channel('undici:client:beforeConnect') + channels.connectError = diagnosticsChannel.channel('undici:client:connectError') + channels.connected = diagnosticsChannel.channel('undici:client:connected') +} catch { + channels.sendHeaders = { hasSubscribers: false } + channels.beforeConnect = { hasSubscribers: false } + channels.connectError = { hasSubscribers: false } + channels.connected = { hasSubscribers: false } +} - var mergeTarget = target; - if (isArray(target) && !isArray(source)) { - mergeTarget = arrayToObject(target, options); - } +/** + * @type {import('../types/client').default} + */ +class Client extends DispatcherBase { + /** + * + * @param {string|URL} url + * @param {import('../types/client').Client.Options} options + */ + constructor (url, { + interceptors, + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, + connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, + tls, + strictContentLength, + maxCachedSessions, + maxRedirections, + connect, + maxRequestsPerClient, + localAddress, + maxResponseSize, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + // h2 + allowH2, + maxConcurrentStreams + } = {}) { + super() + + if (keepAlive !== undefined) { + throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') + } + + if (socketTimeout !== undefined) { + throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead') + } + + if (requestTimeout !== undefined) { + throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead') + } + + if (idleTimeout !== undefined) { + throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead') + } + + if (maxKeepAliveTimeout !== undefined) { + throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') + } + + if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { + throw new InvalidArgumentError('invalid maxHeaderSize') + } + + if (socketPath != null && typeof socketPath !== 'string') { + throw new InvalidArgumentError('invalid socketPath') + } + + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError('invalid connectTimeout') + } + + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError('invalid keepAliveTimeout') + } + + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError('invalid keepAliveMaxTimeout') + } + + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold') + } + + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError('headersTimeout must be a positive integer or zero') + } + + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero') + } + + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') + } + + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } + + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') + } + + if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError('localAddress must be valid string IP address') + } + + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError('maxResponseSize must be a positive number') + } + + if ( + autoSelectFamilyAttemptTimeout != null && + (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1) + ) { + throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number') + } + + // h2 + if (allowH2 != null && typeof allowH2 !== 'boolean') { + throw new InvalidArgumentError('allowH2 must be a valid boolean value') + } + + if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) { + throw new InvalidArgumentError('maxConcurrentStreams must be a possitive integer, greater than 0') + } + + if (typeof connect !== 'function') { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), + ...connect + }) + } + + this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) + ? interceptors.Client + : [createRedirectInterceptor({ maxRedirections })] + this[kUrl] = util.parseOrigin(url) + this[kConnector] = connect + this[kSocket] = null + this[kPipelining] = pipelining != null ? pipelining : 1 + this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout] + this[kServerName] = null + this[kLocalAddress] = localAddress != null ? localAddress : null + this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming + this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n` + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3 + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3 + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength + this[kMaxRedirections] = maxRedirections + this[kMaxRequests] = maxRequestsPerClient + this[kClosedResolve] = null + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1 + this[kHTTPConnVersion] = 'h1' + + // HTTP/2 + this[kHTTP2Session] = null + this[kHTTP2SessionState] = !allowH2 + ? null + : { + // streams: null, // Fixed queue of streams - For future support of `push` + openStreams: 0, // Keep track of them to decide wether or not unref the session + maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server + } + this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}` + + // kQueue is built up of 3 sections separated by + // the kRunningIdx and kPendingIdx indices. + // | complete | running | pending | + // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length + // kRunningIdx points to the first running element. + // kPendingIdx points to the first pending element. + // This implements a fast queue with an amortized + // time of O(1). + + this[kQueue] = [] + this[kRunningIdx] = 0 + this[kPendingIdx] = 0 + } + + get pipelining () { + return this[kPipelining] + } + + set pipelining (value) { + this[kPipelining] = value + resume(this, true) + } + + get [kPending] () { + return this[kQueue].length - this[kPendingIdx] + } + + get [kRunning] () { + return this[kPendingIdx] - this[kRunningIdx] + } + + get [kSize] () { + return this[kQueue].length - this[kRunningIdx] + } + + get [kConnected] () { + return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed + } + + get [kBusy] () { + const socket = this[kSocket] + return ( + (socket && (socket[kReset] || socket[kWriting] || socket[kBlocking])) || + (this[kSize] >= (this[kPipelining] || 1)) || + this[kPending] > 0 + ) + } + + /* istanbul ignore: only used for test */ + [kConnect] (cb) { + connect(this) + this.once('connect', cb) + } + + [kDispatch] (opts, handler) { + const origin = opts.origin || this[kUrl].origin + + const request = this[kHTTPConnVersion] === 'h2' + ? Request[kHTTP2BuildRequest](origin, opts, handler) + : Request[kHTTP1BuildRequest](origin, opts, handler) + + this[kQueue].push(request) + if (this[kResuming]) { + // Do nothing. + } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { + // Wait a tick in case stream/iterator is ended in the same tick. + this[kResuming] = 1 + process.nextTick(resume, this) + } else { + resume(this, true) + } + + if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { + this[kNeedDrain] = 2 + } + + return this[kNeedDrain] < 2 + } + + async [kClose] () { + // TODO: for H2 we need to gracefully flush the remaining enqueued + // request and close each stream. + return new Promise((resolve) => { + if (!this[kSize]) { + resolve(null) + } else { + this[kClosedResolve] = resolve + } + }) + } + + async [kDestroy] (err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]) + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + errorRequest(this, request, err) + } + + const callback = () => { + if (this[kClosedResolve]) { + // TODO (fix): Should we error here with ClientDestroyedError? + this[kClosedResolve]() + this[kClosedResolve] = null + } + resolve() + } + + if (this[kHTTP2Session] != null) { + util.destroy(this[kHTTP2Session], err) + this[kHTTP2Session] = null + this[kHTTP2SessionState] = null + } + + if (!this[kSocket]) { + queueMicrotask(callback) + } else { + util.destroy(this[kSocket].on('close', callback), err) + } + + resume(this) + }) + } +} - if (isArray(target) && isArray(source)) { - source.forEach(function (item, i) { - if (has.call(target, i)) { - var targetItem = target[i]; - if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { - target[i] = merge(targetItem, item, options); - } else { - target.push(item); - } - } else { - target[i] = item; - } - }); - return target; - } +function onHttp2SessionError (err) { + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - return Object.keys(source).reduce(function (acc, key) { - var value = source[key]; + this[kSocket][kError] = err - if (has.call(acc, key)) { - acc[key] = merge(acc[key], value, options); - } else { - acc[key] = value; - } - return acc; - }, mergeTarget); - }; + onError(this[kClient], err) +} - var assign = function assignSingleSource(target, source) { - return Object.keys(source).reduce(function (acc, key) { - acc[key] = source[key]; - return acc; - }, target); - }; +function onHttp2FrameError (type, code, id) { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`) - var decode = function (str, decoder, charset) { - var strWithoutPlus = str.replace(/\+/g, ' '); - if (charset === 'iso-8859-1') { - // unescape never throws, no try...catch needed: - return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); - } - // utf-8 - try { - return decodeURIComponent(strWithoutPlus); - } catch (e) { - return strWithoutPlus; - } - }; + if (id === 0) { + this[kSocket][kError] = err + onError(this[kClient], err) + } +} - var encode = function encode(str, defaultEncoder, charset, kind, format) { - // This code was originally written by Brian White (mscdex) for the io.js core querystring library. - // It has been adapted here for stricter adherence to RFC 3986 - if (str.length === 0) { - return str; - } +function onHttp2SessionEnd () { + util.destroy(this, new SocketError('other side closed')) + util.destroy(this[kSocket], new SocketError('other side closed')) +} - var string = str; - if (typeof str === 'symbol') { - string = Symbol.prototype.toString.call(str); - } else if (typeof str !== 'string') { - string = String(str); - } +function onHTTP2GoAway (code) { + const client = this[kClient] + const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`) + client[kSocket] = null + client[kHTTP2Session] = null - if (charset === 'iso-8859-1') { - return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { - return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; - }); - } + if (client.destroyed) { + assert(this[kPending] === 0) - var out = ''; - for (var i = 0; i < string.length; ++i) { - var c = string.charCodeAt(i); - - if ( - c === 0x2D // - - || c === 0x2E // . - || c === 0x5F // _ - || c === 0x7E // ~ - || (c >= 0x30 && c <= 0x39) // 0-9 - || (c >= 0x41 && c <= 0x5A) // a-z - || (c >= 0x61 && c <= 0x7A) // A-Z - || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( ) - ) { - out += string.charAt(i); - continue; - } + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]) + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + errorRequest(this, request, err) + } + } else if (client[kRunning] > 0) { + // Fail head of pipeline. + const request = client[kQueue][client[kRunningIdx]] + client[kQueue][client[kRunningIdx]++] = null - if (c < 0x80) { - out = out + hexTable[c]; - continue; - } + errorRequest(client, request, err) + } - if (c < 0x800) { - out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); - continue; - } + client[kPendingIdx] = client[kRunningIdx] - if (c < 0xD800 || c >= 0xE000) { - out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); - continue; - } + assert(client[kRunning] === 0) - i += 1; - c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); - /* eslint operator-linebreak: [2, "before"] */ - out += hexTable[0xF0 | (c >> 18)] - + hexTable[0x80 | ((c >> 12) & 0x3F)] - + hexTable[0x80 | ((c >> 6) & 0x3F)] - + hexTable[0x80 | (c & 0x3F)]; - } + client.emit('disconnect', + client[kUrl], + [client], + err + ) - return out; - }; + resume(client) +} - var compact = function compact(value) { - var queue = [{ obj: { o: value }, prop: 'o' }]; - var refs = []; - - for (var i = 0; i < queue.length; ++i) { - var item = queue[i]; - var obj = item.obj[item.prop]; - - var keys = Object.keys(obj); - for (var j = 0; j < keys.length; ++j) { - var key = keys[j]; - var val = obj[key]; - if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { - queue.push({ obj: obj, prop: key }); - refs.push(val); - } - } - } +const constants = __nccwpck_require__(953) +const createRedirectInterceptor = __nccwpck_require__(8861) +const EMPTY_BUF = Buffer.alloc(0) + +async function lazyllhttp () { + const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(1145) : undefined + + let mod + try { + mod = await WebAssembly.compile(Buffer.from(__nccwpck_require__(5627), 'base64')) + } catch (e) { + /* istanbul ignore next */ + + // We could check if the error was caused by the simd option not + // being enabled, but the occurring of this other error + // * https://github.com/emscripten-core/emscripten/issues/11495 + // got me to remove that check to avoid breaking Node 12. + mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || __nccwpck_require__(1145), 'base64')) + } + + return await WebAssembly.instantiate(mod, { + env: { + /* eslint-disable camelcase */ + + wasm_on_url: (p, at, len) => { + /* istanbul ignore next */ + return 0 + }, + wasm_on_status: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p) + const start = at - currentBufferPtr + currentBufferRef.byteOffset + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_message_begin: (p) => { + assert.strictEqual(currentParser.ptr, p) + return currentParser.onMessageBegin() || 0 + }, + wasm_on_header_field: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p) + const start = at - currentBufferPtr + currentBufferRef.byteOffset + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_header_value: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p) + const start = at - currentBufferPtr + currentBufferRef.byteOffset + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + assert.strictEqual(currentParser.ptr, p) + return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 + }, + wasm_on_body: (p, at, len) => { + assert.strictEqual(currentParser.ptr, p) + const start = at - currentBufferPtr + currentBufferRef.byteOffset + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 + }, + wasm_on_message_complete: (p) => { + assert.strictEqual(currentParser.ptr, p) + return currentParser.onMessageComplete() || 0 + } + + /* eslint-enable camelcase */ + } + }) +} - compactQueue(queue); +let llhttpInstance = null +let llhttpPromise = lazyllhttp() +llhttpPromise.catch() + +let currentParser = null +let currentBufferRef = null +let currentBufferSize = 0 +let currentBufferPtr = null + +const TIMEOUT_HEADERS = 1 +const TIMEOUT_BODY = 2 +const TIMEOUT_IDLE = 3 + +class Parser { + constructor (client, socket, { exports }) { + assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0) + + this.llhttp = exports + this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE) + this.client = client + this.socket = socket + this.timeout = null + this.timeoutValue = null + this.timeoutType = null + this.statusCode = null + this.statusText = '' + this.upgrade = false + this.headers = [] + this.headersSize = 0 + this.headersMaxSize = client[kMaxHeadersSize] + this.shouldKeepAlive = false + this.paused = false + this.resume = this.resume.bind(this) + + this.bytesRead = 0 + + this.keepAlive = '' + this.contentLength = '' + this.connection = '' + this.maxResponseSize = client[kMaxResponseSize] + } + + setTimeout (value, type) { + this.timeoutType = type + if (value !== this.timeoutValue) { + timers.clearTimeout(this.timeout) + if (value) { + this.timeout = timers.setTimeout(onParserTimeout, value, this) + // istanbul ignore else: only for jest + if (this.timeout.unref) { + this.timeout.unref() + } + } else { + this.timeout = null + } + this.timeoutValue = value + } else if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh() + } + } + } + + resume () { + if (this.socket.destroyed || !this.paused) { + return + } + + assert(this.ptr != null) + assert(currentParser == null) + + this.llhttp.llhttp_resume(this.ptr) + + assert(this.timeoutType === TIMEOUT_BODY) + if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh() + } + } + + this.paused = false + this.execute(this.socket.read() || EMPTY_BUF) // Flush parser. + this.readMore() + } + + readMore () { + while (!this.paused && this.ptr) { + const chunk = this.socket.read() + if (chunk === null) { + break + } + this.execute(chunk) + } + } + + execute (data) { + assert(this.ptr != null) + assert(currentParser == null) + assert(!this.paused) + + const { socket, llhttp } = this + + if (data.length > currentBufferSize) { + if (currentBufferPtr) { + llhttp.free(currentBufferPtr) + } + currentBufferSize = Math.ceil(data.length / 4096) * 4096 + currentBufferPtr = llhttp.malloc(currentBufferSize) + } + + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data) + + // Call `execute` on the wasm parser. + // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, + // and finally the length of bytes to parse. + // The return value is an error code or `constants.ERROR.OK`. + try { + let ret + + try { + currentBufferRef = data + currentParser = this + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length) + /* eslint-disable-next-line no-useless-catch */ + } catch (err) { + /* istanbul ignore next: difficult to make a test case for */ + throw err + } finally { + currentParser = null + currentBufferRef = null + } + + const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr + + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data.slice(offset)) + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true + socket.unshift(data.slice(offset)) + } else if (ret !== constants.ERROR.OK) { + const ptr = llhttp.llhttp_get_error_reason(this.ptr) + let message = '' + /* istanbul ignore else: difficult to make a test case for */ + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0) + message = + 'Response does not match the HTTP/1.1 protocol (' + + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + + ')' + } + throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) + } + } catch (err) { + util.destroy(socket, err) + } + } + + destroy () { + assert(this.ptr != null) + assert(currentParser == null) + + this.llhttp.llhttp_free(this.ptr) + this.ptr = null + + timers.clearTimeout(this.timeout) + this.timeout = null + this.timeoutValue = null + this.timeoutType = null + + this.paused = false + } + + onStatus (buf) { + this.statusText = buf.toString() + } + + onMessageBegin () { + const { socket, client } = this + + /* istanbul ignore next: difficult to make a test case for */ + if (socket.destroyed) { + return -1 + } + + const request = client[kQueue][client[kRunningIdx]] + if (!request) { + return -1 + } + } + + onHeaderField (buf) { + const len = this.headers.length + + if ((len & 1) === 0) { + this.headers.push(buf) + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]) + } + + this.trackHeader(buf.length) + } + + onHeaderValue (buf) { + let len = this.headers.length + + if ((len & 1) === 1) { + this.headers.push(buf) + len += 1 + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]) + } + + const key = this.headers[len - 2] + if (key.length === 10 && key.toString().toLowerCase() === 'keep-alive') { + this.keepAlive += buf.toString() + } else if (key.length === 10 && key.toString().toLowerCase() === 'connection') { + this.connection += buf.toString() + } else if (key.length === 14 && key.toString().toLowerCase() === 'content-length') { + this.contentLength += buf.toString() + } + + this.trackHeader(buf.length) + } + + trackHeader (len) { + this.headersSize += len + if (this.headersSize >= this.headersMaxSize) { + util.destroy(this.socket, new HeadersOverflowError()) + } + } + + onUpgrade (head) { + const { upgrade, client, socket, headers, statusCode } = this + + assert(upgrade) + + const request = client[kQueue][client[kRunningIdx]] + assert(request) + + assert(!socket.destroyed) + assert(socket === client[kSocket]) + assert(!this.paused) + assert(request.upgrade || request.method === 'CONNECT') + + this.statusCode = null + this.statusText = '' + this.shouldKeepAlive = null + + assert(this.headers.length % 2 === 0) + this.headers = [] + this.headersSize = 0 + + socket.unshift(head) + + socket[kParser].destroy() + socket[kParser] = null + + socket[kClient] = null + socket[kError] = null + socket + .removeListener('error', onSocketError) + .removeListener('readable', onSocketReadable) + .removeListener('end', onSocketEnd) + .removeListener('close', onSocketClose) + + client[kSocket] = null + client[kQueue][client[kRunningIdx]++] = null + client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')) + + try { + request.onUpgrade(statusCode, headers, socket) + } catch (err) { + util.destroy(socket, err) + } + + resume(client) + } + + onHeadersComplete (statusCode, upgrade, shouldKeepAlive) { + const { client, socket, headers, statusText } = this + + /* istanbul ignore next: difficult to make a test case for */ + if (socket.destroyed) { + return -1 + } + + const request = client[kQueue][client[kRunningIdx]] + + /* istanbul ignore next: difficult to make a test case for */ + if (!request) { + return -1 + } + + assert(!this.upgrade) + assert(this.statusCode < 200) + + if (statusCode === 100) { + util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) + return -1 + } + + /* this can only happen if server is misbehaving */ + if (upgrade && !request.upgrade) { + util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket))) + return -1 + } + + assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS) + + this.statusCode = statusCode + this.shouldKeepAlive = ( + shouldKeepAlive || + // Override llhttp value which does not allow keepAlive for HEAD. + (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive') + ) + + if (this.statusCode >= 200) { + const bodyTimeout = request.bodyTimeout != null + ? request.bodyTimeout + : client[kBodyTimeout] + this.setTimeout(bodyTimeout, TIMEOUT_BODY) + } else if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh() + } + } + + if (request.method === 'CONNECT') { + assert(client[kRunning] === 1) + this.upgrade = true + return 2 + } + + if (upgrade) { + assert(client[kRunning] === 1) + this.upgrade = true + return 2 + } + + assert(this.headers.length % 2 === 0) + this.headers = [] + this.headersSize = 0 + + if (this.shouldKeepAlive && client[kPipelining]) { + const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null + + if (keepAliveTimeout != null) { + const timeout = Math.min( + keepAliveTimeout - client[kKeepAliveTimeoutThreshold], + client[kKeepAliveMaxTimeout] + ) + if (timeout <= 0) { + socket[kReset] = true + } else { + client[kKeepAliveTimeoutValue] = timeout + } + } else { + client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout] + } + } else { + // Stop more requests from being dispatched. + socket[kReset] = true + } + + const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false + + if (request.aborted) { + return -1 + } + + if (request.method === 'HEAD') { + return 1 + } + + if (statusCode < 200) { + return 1 + } + + if (socket[kBlocking]) { + socket[kBlocking] = false + resume(client) + } + + return pause ? constants.ERROR.PAUSED : 0 + } + + onBody (buf) { + const { client, socket, statusCode, maxResponseSize } = this + + if (socket.destroyed) { + return -1 + } + + const request = client[kQueue][client[kRunningIdx]] + assert(request) + + assert.strictEqual(this.timeoutType, TIMEOUT_BODY) + if (this.timeout) { + // istanbul ignore else: only for jest + if (this.timeout.refresh) { + this.timeout.refresh() + } + } + + assert(statusCode >= 200) + + if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { + util.destroy(socket, new ResponseExceededMaxSizeError()) + return -1 + } + + this.bytesRead += buf.length + + if (request.onData(buf) === false) { + return constants.ERROR.PAUSED + } + } + + onMessageComplete () { + const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this + + if (socket.destroyed && (!statusCode || shouldKeepAlive)) { + return -1 + } + + if (upgrade) { + return + } + + const request = client[kQueue][client[kRunningIdx]] + assert(request) + + assert(statusCode >= 100) + + this.statusCode = null + this.statusText = '' + this.bytesRead = 0 + this.contentLength = '' + this.keepAlive = '' + this.connection = '' + + assert(this.headers.length % 2 === 0) + this.headers = [] + this.headersSize = 0 + + if (statusCode < 200) { + return + } + + /* istanbul ignore next: should be handled by llhttp? */ + if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util.destroy(socket, new ResponseContentLengthMismatchError()) + return -1 + } + + request.onComplete(headers) + + client[kQueue][client[kRunningIdx]++] = null + + if (socket[kWriting]) { + assert.strictEqual(client[kRunning], 0) + // Response completed before request. + util.destroy(socket, new InformationalError('reset')) + return constants.ERROR.PAUSED + } else if (!shouldKeepAlive) { + util.destroy(socket, new InformationalError('reset')) + return constants.ERROR.PAUSED + } else if (socket[kReset] && client[kRunning] === 0) { + // Destroy socket once all requests have completed. + // The request at the tail of the pipeline is the one + // that requested reset and no further requests should + // have been queued since then. + util.destroy(socket, new InformationalError('reset')) + return constants.ERROR.PAUSED + } else if (client[kPipelining] === 1) { + // We must wait a full event loop cycle to reuse this socket to make sure + // that non-spec compliant servers are not closing the connection even if they + // said they won't. + setImmediate(resume, client) + } else { + resume(client) + } + } +} - return value; - }; +function onParserTimeout (parser) { + const { socket, timeoutType, client } = parser + + /* istanbul ignore else */ + if (timeoutType === TIMEOUT_HEADERS) { + if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { + assert(!parser.paused, 'cannot be paused while waiting for headers') + util.destroy(socket, new HeadersTimeoutError()) + } + } else if (timeoutType === TIMEOUT_BODY) { + if (!parser.paused) { + util.destroy(socket, new BodyTimeoutError()) + } + } else if (timeoutType === TIMEOUT_IDLE) { + assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]) + util.destroy(socket, new InformationalError('socket idle timeout')) + } +} - var isRegExp = function isRegExp(obj) { - return Object.prototype.toString.call(obj) === '[object RegExp]'; - }; +function onSocketReadable () { + const { [kParser]: parser } = this + if (parser) { + parser.readMore() + } +} - var isBuffer = function isBuffer(obj) { - if (!obj || typeof obj !== 'object') { - return false; - } +function onSocketError (err) { + const { [kClient]: client, [kParser]: parser } = this - return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); - }; + assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') - var combine = function combine(a, b) { - return [].concat(a, b); - }; + if (client[kHTTPConnVersion] !== 'h2') { + // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded + // to the user. + if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so for as a valid response. + parser.onMessageComplete() + return + } + } - var maybeMap = function maybeMap(val, fn) { - if (isArray(val)) { - var mapped = []; - for (var i = 0; i < val.length; i += 1) { - mapped.push(fn(val[i])); - } - return mapped; - } - return fn(val); - }; + this[kError] = err - module.exports = { - arrayToObject: arrayToObject, - assign: assign, - combine: combine, - compact: compact, - decode: decode, - encode: encode, - isBuffer: isBuffer, - isRegExp: isRegExp, - maybeMap: maybeMap, - merge: merge - }; + onError(this[kClient], err) +} +function onError (client, err) { + if ( + client[kRunning] === 0 && + err.code !== 'UND_ERR_INFO' && + err.code !== 'UND_ERR_SOCKET' + ) { + // Error is not caused by running request and not a recoverable + // socket error. + + assert(client[kPendingIdx] === client[kRunningIdx]) + + const requests = client[kQueue].splice(client[kRunningIdx]) + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + errorRequest(client, request, err) + } + assert(client[kSize] === 0) + } +} - /***/ -}), +function onSocketEnd () { + const { [kParser]: parser, [kClient]: client } = this -/***/ 4056: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + if (client[kHTTPConnVersion] !== 'h2') { + if (parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so far as a valid response. + parser.onMessageComplete() + return + } + } - "use strict"; + util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) +} +function onSocketClose () { + const { [kClient]: client, [kParser]: parser } = this - var GetIntrinsic = __nccwpck_require__(4538); - var define = __nccwpck_require__(4564); - var hasDescriptors = __nccwpck_require__(176)(); - var gOPD = __nccwpck_require__(8501); + if (client[kHTTPConnVersion] === 'h1' && parser) { + if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { + // We treat all incoming data so far as a valid response. + parser.onMessageComplete() + } - var $TypeError = __nccwpck_require__(6361); - var $floor = GetIntrinsic('%Math.floor%'); + this[kParser].destroy() + this[kParser] = null + } - /** @type {import('.')} */ - module.exports = function setFunctionLength(fn, length) { - if (typeof fn !== 'function') { - throw new $TypeError('`fn` is not a function'); - } - if (typeof length !== 'number' || length < 0 || length > 0xFFFFFFFF || $floor(length) !== length) { - throw new $TypeError('`length` must be a positive 32-bit integer'); - } + const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)) - var loose = arguments.length > 2 && !!arguments[2]; + client[kSocket] = null - var functionLengthIsConfigurable = true; - var functionLengthIsWritable = true; - if ('length' in fn && gOPD) { - var desc = gOPD(fn, 'length'); - if (desc && !desc.configurable) { - functionLengthIsConfigurable = false; - } - if (desc && !desc.writable) { - functionLengthIsWritable = false; - } - } + if (client.destroyed) { + assert(client[kPending] === 0) - if (functionLengthIsConfigurable || functionLengthIsWritable || !loose) { - if (hasDescriptors) { - define(/** @type {Parameters[0]} */(fn), 'length', length, true, true); - } else { - define(/** @type {Parameters[0]} */(fn), 'length', length); - } - } - return fn; - }; + // Fail entire queue. + const requests = client[kQueue].splice(client[kRunningIdx]) + for (let i = 0; i < requests.length; i++) { + const request = requests[i] + errorRequest(client, request, err) + } + } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { + // Fail head of pipeline. + const request = client[kQueue][client[kRunningIdx]] + client[kQueue][client[kRunningIdx]++] = null + errorRequest(client, request, err) + } - /***/ -}), + client[kPendingIdx] = client[kRunningIdx] -/***/ 4334: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + assert(client[kRunning] === 0) - "use strict"; - - - var GetIntrinsic = __nccwpck_require__(4538); - var callBound = __nccwpck_require__(8803); - var inspect = __nccwpck_require__(504); - - var $TypeError = __nccwpck_require__(6361); - var $WeakMap = GetIntrinsic('%WeakMap%', true); - var $Map = GetIntrinsic('%Map%', true); - - var $weakMapGet = callBound('WeakMap.prototype.get', true); - var $weakMapSet = callBound('WeakMap.prototype.set', true); - var $weakMapHas = callBound('WeakMap.prototype.has', true); - var $mapGet = callBound('Map.prototype.get', true); - var $mapSet = callBound('Map.prototype.set', true); - var $mapHas = callBound('Map.prototype.has', true); - - /* - * This function traverses the list returning the node corresponding to the given key. - * - * That node is also moved to the head of the list, so that if it's accessed again we don't need to traverse the whole list. By doing so, all the recently used nodes can be accessed relatively quickly. - */ - /** @type {import('.').listGetNode} */ - var listGetNode = function (list, key) { // eslint-disable-line consistent-return - /** @type {typeof list | NonNullable<(typeof list)['next']>} */ - var prev = list; - /** @type {(typeof list)['next']} */ - var curr; - for (; (curr = prev.next) !== null; prev = curr) { - if (curr.key === key) { - prev.next = curr.next; - // eslint-disable-next-line no-extra-parens - curr.next = /** @type {NonNullable} */ (list.next); - list.next = curr; // eslint-disable-line no-param-reassign - return curr; - } - } - }; + client.emit('disconnect', client[kUrl], [client], err) - /** @type {import('.').listGet} */ - var listGet = function (objects, key) { - var node = listGetNode(objects, key); - return node && node.value; - }; - /** @type {import('.').listSet} */ - var listSet = function (objects, key, value) { - var node = listGetNode(objects, key); - if (node) { - node.value = value; - } else { - // Prepend the new node to the beginning of the list - objects.next = /** @type {import('.').ListNode} */ ({ // eslint-disable-line no-param-reassign, no-extra-parens - key: key, - next: objects.next, - value: value - }); - } - }; - /** @type {import('.').listHas} */ - var listHas = function (objects, key) { - return !!listGetNode(objects, key); - }; + resume(client) +} - /** @type {import('.')} */ - module.exports = function getSideChannel() { - /** @type {WeakMap} */ var $wm; - /** @type {Map} */ var $m; - /** @type {import('.').RootNode} */ var $o; +async function connect (client) { + assert(!client[kConnecting]) + assert(!client[kSocket]) + + let { host, hostname, protocol, port } = client[kUrl] + + // Resolve ipv6 + if (hostname[0] === '[') { + const idx = hostname.indexOf(']') + + assert(idx !== -1) + const ip = hostname.substring(1, idx) + + assert(net.isIP(ip)) + hostname = ip + } + + client[kConnecting] = true + + if (channels.beforeConnect.hasSubscribers) { + channels.beforeConnect.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector] + }) + } + + try { + const socket = await new Promise((resolve, reject) => { + client[kConnector]({ + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, (err, socket) => { + if (err) { + reject(err) + } else { + resolve(socket) + } + }) + }) + + if (client.destroyed) { + util.destroy(socket.on('error', () => {}), new ClientDestroyedError()) + return + } + + client[kConnecting] = false + + assert(socket) + + const isH2 = socket.alpnProtocol === 'h2' + if (isH2) { + if (!h2ExperimentalWarned) { + h2ExperimentalWarned = true + process.emitWarning('H2 support is experimental, expect them to change at any time.', { + code: 'UNDICI-H2' + }) + } + + const session = http2.connect(client[kUrl], { + createConnection: () => socket, + peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams + }) + + client[kHTTPConnVersion] = 'h2' + session[kClient] = client + session[kSocket] = socket + session.on('error', onHttp2SessionError) + session.on('frameError', onHttp2FrameError) + session.on('end', onHttp2SessionEnd) + session.on('goaway', onHTTP2GoAway) + session.on('close', onSocketClose) + session.unref() + + client[kHTTP2Session] = session + socket[kHTTP2Session] = session + } else { + if (!llhttpInstance) { + llhttpInstance = await llhttpPromise + llhttpPromise = null + } + + socket[kNoRef] = false + socket[kWriting] = false + socket[kReset] = false + socket[kBlocking] = false + socket[kParser] = new Parser(client, socket, llhttpInstance) + } + + socket[kCounter] = 0 + socket[kMaxRequests] = client[kMaxRequests] + socket[kClient] = client + socket[kError] = null + + socket + .on('error', onSocketError) + .on('readable', onSocketReadable) + .on('end', onSocketEnd) + .on('close', onSocketClose) + + client[kSocket] = socket + + if (channels.connected.hasSubscribers) { + channels.connected.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + socket + }) + } + client.emit('connect', client[kUrl], [client]) + } catch (err) { + if (client.destroyed) { + return + } + + client[kConnecting] = false + + if (channels.connectError.hasSubscribers) { + channels.connectError.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + error: err + }) + } + + if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') { + assert(client[kRunning] === 0) + while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { + const request = client[kQueue][client[kPendingIdx]++] + errorRequest(client, request, err) + } + } else { + onError(client, err) + } + + client.emit('connectionError', client[kUrl], [client], err) + } + + resume(client) +} - /** @type {import('.').Channel} */ - var channel = { - assert: function (key) { - if (!channel.has(key)) { - throw new $TypeError('Side channel does not contain ' + inspect(key)); - } - }, - get: function (key) { // eslint-disable-line consistent-return - if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { - if ($wm) { - return $weakMapGet($wm, key); - } - } else if ($Map) { - if ($m) { - return $mapGet($m, key); - } - } else { - if ($o) { // eslint-disable-line no-lonely-if - return listGet($o, key); - } - } - }, - has: function (key) { - if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { - if ($wm) { - return $weakMapHas($wm, key); - } - } else if ($Map) { - if ($m) { - return $mapHas($m, key); - } - } else { - if ($o) { // eslint-disable-line no-lonely-if - return listHas($o, key); - } - } - return false; - }, - set: function (key, value) { - if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { - if (!$wm) { - $wm = new $WeakMap(); - } - $weakMapSet($wm, key, value); - } else if ($Map) { - if (!$m) { - $m = new $Map(); - } - $mapSet($m, key, value); - } else { - if (!$o) { - // Initialize the linked list as an empty node, so that we don't have to special-case handling of the first node: we can always refer to it as (previous node).next, instead of something like (list).head - $o = { key: {}, next: null }; - } - listSet($o, key, value); - } - } - }; - return channel; - }; +function emitDrain (client) { + client[kNeedDrain] = 0 + client.emit('drain', client[kUrl], [client]) +} +function resume (client, sync) { + if (client[kResuming] === 2) { + return + } - /***/ -}), + client[kResuming] = 2 -/***/ 4294: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + _resume(client, sync) + client[kResuming] = 0 - module.exports = __nccwpck_require__(4219); + if (client[kRunningIdx] > 256) { + client[kQueue].splice(0, client[kRunningIdx]) + client[kPendingIdx] -= client[kRunningIdx] + client[kRunningIdx] = 0 + } +} +function _resume (client, sync) { + while (true) { + if (client.destroyed) { + assert(client[kPending] === 0) + return + } + + if (client[kClosedResolve] && !client[kSize]) { + client[kClosedResolve]() + client[kClosedResolve] = null + return + } + + const socket = client[kSocket] + + if (socket && !socket.destroyed && socket.alpnProtocol !== 'h2') { + if (client[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref() + socket[kNoRef] = true + } + } else if (socket[kNoRef] && socket.ref) { + socket.ref() + socket[kNoRef] = false + } + + if (client[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { + socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE) + } + } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request = client[kQueue][client[kRunningIdx]] + const headersTimeout = request.headersTimeout != null + ? request.headersTimeout + : client[kHeadersTimeout] + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS) + } + } + } + + if (client[kBusy]) { + client[kNeedDrain] = 2 + } else if (client[kNeedDrain] === 2) { + if (sync) { + client[kNeedDrain] = 1 + process.nextTick(emitDrain, client) + } else { + emitDrain(client) + } + continue + } + + if (client[kPending] === 0) { + return + } + + if (client[kRunning] >= (client[kPipelining] || 1)) { + return + } + + const request = client[kQueue][client[kPendingIdx]] + + if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) { + if (client[kRunning] > 0) { + return + } + + client[kServerName] = request.servername + + if (socket && socket.servername !== request.servername) { + util.destroy(socket, new InformationalError('servername changed')) + return + } + } + + if (client[kConnecting]) { + return + } + + if (!socket && !client[kHTTP2Session]) { + connect(client) + return + } + + if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { + return + } + + if (client[kRunning] > 0 && !request.idempotent) { + // Non-idempotent request cannot be retried. + // Ensure that no other requests are inflight and + // could cause failure. + return + } + + if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) { + // Don't dispatch an upgrade until all preceding requests have completed. + // A misbehaving server might upgrade the connection before all pipelined + // request has completed. + return + } + + if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && + (util.isStream(request.body) || util.isAsyncIterable(request.body))) { + // Request with stream or iterator body can error while other requests + // are inflight and indirectly error those as well. + // Ensure this doesn't happen by waiting for inflight + // to complete before dispatching. + + // Request with stream or iterator body cannot be retried. + // Ensure that no other requests are inflight and + // could cause failure. + return + } + + if (!request.aborted && write(client, request)) { + client[kPendingIdx]++ + } else { + client[kQueue].splice(client[kPendingIdx], 1) + } + } +} - /***/ -}), +// https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 +function shouldSendContentLength (method) { + return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' +} -/***/ 4219: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +function write (client, request) { + if (client[kHTTPConnVersion] === 'h2') { + writeH2(client, client[kHTTP2Session], request) + return + } - "use strict"; + const { body, method, path, host, upgrade, headers, blocking, reset } = request + // https://tools.ietf.org/html/rfc7231#section-4.3.1 + // https://tools.ietf.org/html/rfc7231#section-4.3.2 + // https://tools.ietf.org/html/rfc7231#section-4.3.5 - var net = __nccwpck_require__(1808); - var tls = __nccwpck_require__(4404); - var http = __nccwpck_require__(3685); - var https = __nccwpck_require__(5687); - var events = __nccwpck_require__(2361); - var assert = __nccwpck_require__(9491); - var util = __nccwpck_require__(3837); + // Sending a payload body on a request that does not + // expect it can cause undefined behavior on some + // servers and corrupt connection state. Do not + // re-use the connection for further requests. + + const expectsPayload = ( + method === 'PUT' || + method === 'POST' || + method === 'PATCH' + ) + + if (body && typeof body.read === 'function') { + // Try to read EOF in order to get length. + body.read(0) + } + + const bodyLength = util.bodyLength(body) + + let contentLength = bodyLength + + if (contentLength === null) { + contentLength = request.contentLength + } + + if (contentLength === 0 && !expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD NOT send a Content-Length header field when + // the request message does not contain a payload body and the method + // semantics do not anticipate such a body. + + contentLength = null + } + + // https://github.com/nodejs/undici/issues/2046 + // A user agent may send a Content-Length header with 0 value, this should be allowed. + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + errorRequest(client, request, new RequestContentLengthMismatchError()) + return false + } + + process.emitWarning(new RequestContentLengthMismatchError()) + } + + const socket = client[kSocket] + + try { + request.onConnect((err) => { + if (request.aborted || request.completed) { + return + } + + errorRequest(client, request, err || new RequestAbortedError()) + + util.destroy(socket, new InformationalError('aborted')) + }) + } catch (err) { + errorRequest(client, request, err) + } + + if (request.aborted) { + return false + } + + if (method === 'HEAD') { + // https://github.com/mcollina/undici/issues/258 + // Close after a HEAD request to interop with misbehaving servers + // that may send a body in the response. + + socket[kReset] = true + } + + if (upgrade || method === 'CONNECT') { + // On CONNECT or upgrade, block pipeline from dispatching further + // requests on this connection. + + socket[kReset] = true + } + + if (reset != null) { + socket[kReset] = reset + } + + if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { + socket[kReset] = true + } + + if (blocking) { + socket[kBlocking] = true + } + + let header = `${method} ${path} HTTP/1.1\r\n` + + if (typeof host === 'string') { + header += `host: ${host}\r\n` + } else { + header += client[kHostHeader] + } + + if (upgrade) { + header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n` + } else if (client[kPipelining] && !socket[kReset]) { + header += 'connection: keep-alive\r\n' + } else { + header += 'connection: close\r\n' + } + + if (headers) { + header += headers + } + + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request, headers: header, socket }) + } + + /* istanbul ignore else: assertion */ + if (!body || bodyLength === 0) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1') + } else { + assert(contentLength === null, 'no body must not have content length') + socket.write(`${header}\r\n`, 'latin1') + } + request.onRequestSent() + } else if (util.isBuffer(body)) { + assert(contentLength === body.byteLength, 'buffer body must have content length') + + socket.cork() + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') + socket.write(body) + socket.uncork() + request.onBodySent(body) + request.onRequestSent() + if (!expectsPayload) { + socket[kReset] = true + } + } else if (util.isBlobLike(body)) { + if (typeof body.stream === 'function') { + writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }) + } else { + writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }) + } + } else if (util.isStream(body)) { + writeStream({ body, client, request, socket, contentLength, header, expectsPayload }) + } else if (util.isIterable(body)) { + writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }) + } else { + assert(false) + } + + return true +} +function writeH2 (client, session, request) { + const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request + + let headers + if (typeof reqHeaders === 'string') headers = Request[kHTTP2CopyHeaders](reqHeaders.trim()) + else headers = reqHeaders + + if (upgrade) { + errorRequest(client, request, new Error('Upgrade not supported for H2')) + return false + } + + try { + // TODO(HTTP/2): Should we call onConnect immediately or on stream ready event? + request.onConnect((err) => { + if (request.aborted || request.completed) { + return + } + + errorRequest(client, request, err || new RequestAbortedError()) + }) + } catch (err) { + errorRequest(client, request, err) + } + + if (request.aborted) { + return false + } + + /** @type {import('node:http2').ClientHttp2Stream} */ + let stream + const h2State = client[kHTTP2SessionState] + + headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost] + headers[HTTP2_HEADER_METHOD] = method + + if (method === 'CONNECT') { + session.ref() + // we are already connected, streams are pending, first request + // will create a new stream. We trigger a request to create the stream and wait until + // `ready` event is triggered + // We disabled endStream to allow the user to write to the stream + stream = session.request(headers, { endStream: false, signal }) + + if (stream.id && !stream.pending) { + request.onUpgrade(null, null, stream) + ++h2State.openStreams + } else { + stream.once('ready', () => { + request.onUpgrade(null, null, stream) + ++h2State.openStreams + }) + } + + stream.once('close', () => { + h2State.openStreams -= 1 + // TODO(HTTP/2): unref only if current streams count is 0 + if (h2State.openStreams === 0) session.unref() + }) + + return true + } + + // https://tools.ietf.org/html/rfc7540#section-8.3 + // :path and :scheme headers must be omited when sending CONNECT + + headers[HTTP2_HEADER_PATH] = path + headers[HTTP2_HEADER_SCHEME] = 'https' + + // https://tools.ietf.org/html/rfc7231#section-4.3.1 + // https://tools.ietf.org/html/rfc7231#section-4.3.2 + // https://tools.ietf.org/html/rfc7231#section-4.3.5 + + // Sending a payload body on a request that does not + // expect it can cause undefined behavior on some + // servers and corrupt connection state. Do not + // re-use the connection for further requests. + + const expectsPayload = ( + method === 'PUT' || + method === 'POST' || + method === 'PATCH' + ) + + if (body && typeof body.read === 'function') { + // Try to read EOF in order to get length. + body.read(0) + } + + let contentLength = util.bodyLength(body) + + if (contentLength == null) { + contentLength = request.contentLength + } + + if (contentLength === 0 || !expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD NOT send a Content-Length header field when + // the request message does not contain a payload body and the method + // semantics do not anticipate such a body. + + contentLength = null + } + + // https://github.com/nodejs/undici/issues/2046 + // A user agent may send a Content-Length header with 0 value, this should be allowed. + if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + errorRequest(client, request, new RequestContentLengthMismatchError()) + return false + } + + process.emitWarning(new RequestContentLengthMismatchError()) + } + + if (contentLength != null) { + assert(body, 'no body must not have content length') + headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}` + } + + session.ref() + + const shouldEndStream = method === 'GET' || method === 'HEAD' + if (expectContinue) { + headers[HTTP2_HEADER_EXPECT] = '100-continue' + stream = session.request(headers, { endStream: shouldEndStream, signal }) + + stream.once('continue', writeBodyH2) + } else { + stream = session.request(headers, { + endStream: shouldEndStream, + signal + }) + writeBodyH2() + } + + // Increment counter as we have new several streams open + ++h2State.openStreams + + stream.once('response', headers => { + const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers + + if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), '') === false) { + stream.pause() + } + }) + + stream.once('end', () => { + request.onComplete([]) + }) + + stream.on('data', (chunk) => { + if (request.onData(chunk) === false) { + stream.pause() + } + }) + + stream.once('close', () => { + h2State.openStreams -= 1 + // TODO(HTTP/2): unref only if current streams count is 0 + if (h2State.openStreams === 0) { + session.unref() + } + }) + + stream.once('error', function (err) { + if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { + h2State.streams -= 1 + util.destroy(stream, err) + } + }) + + stream.once('frameError', (type, code) => { + const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`) + errorRequest(client, request, err) + + if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { + h2State.streams -= 1 + util.destroy(stream, err) + } + }) + + // stream.on('aborted', () => { + // // TODO(HTTP/2): Support aborted + // }) + + // stream.on('timeout', () => { + // // TODO(HTTP/2): Support timeout + // }) + + // stream.on('push', headers => { + // // TODO(HTTP/2): Suppor push + // }) + + // stream.on('trailers', headers => { + // // TODO(HTTP/2): Support trailers + // }) + + return true + + function writeBodyH2 () { + /* istanbul ignore else: assertion */ + if (!body) { + request.onRequestSent() + } else if (util.isBuffer(body)) { + assert(contentLength === body.byteLength, 'buffer body must have content length') + stream.cork() + stream.write(body) + stream.uncork() + stream.end() + request.onBodySent(body) + request.onRequestSent() + } else if (util.isBlobLike(body)) { + if (typeof body.stream === 'function') { + writeIterable({ + client, + request, + contentLength, + h2stream: stream, + expectsPayload, + body: body.stream(), + socket: client[kSocket], + header: '' + }) + } else { + writeBlob({ + body, + client, + request, + contentLength, + expectsPayload, + h2stream: stream, + header: '', + socket: client[kSocket] + }) + } + } else if (util.isStream(body)) { + writeStream({ + body, + client, + request, + contentLength, + expectsPayload, + socket: client[kSocket], + h2stream: stream, + header: '' + }) + } else if (util.isIterable(body)) { + writeIterable({ + body, + client, + request, + contentLength, + expectsPayload, + header: '', + h2stream: stream, + socket: client[kSocket] + }) + } else { + assert(false) + } + } +} - exports.httpOverHttp = httpOverHttp; - exports.httpsOverHttp = httpsOverHttp; - exports.httpOverHttps = httpOverHttps; - exports.httpsOverHttps = httpsOverHttps; +function writeStream ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { + assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined') + + if (client[kHTTPConnVersion] === 'h2') { + // For HTTP/2, is enough to pipe the stream + const pipe = pipeline( + body, + h2stream, + (err) => { + if (err) { + util.destroy(body, err) + util.destroy(h2stream, err) + } else { + request.onRequestSent() + } + } + ) + + pipe.on('data', onPipeData) + pipe.once('end', () => { + pipe.removeListener('data', onPipeData) + util.destroy(pipe) + }) + + function onPipeData (chunk) { + request.onBodySent(chunk) + } + + return + } + + let finished = false + + const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }) + + const onData = function (chunk) { + if (finished) { + return + } + + try { + if (!writer.write(chunk) && this.pause) { + this.pause() + } + } catch (err) { + util.destroy(this, err) + } + } + const onDrain = function () { + if (finished) { + return + } + + if (body.resume) { + body.resume() + } + } + const onAbort = function () { + if (finished) { + return + } + const err = new RequestAbortedError() + queueMicrotask(() => onFinished(err)) + } + const onFinished = function (err) { + if (finished) { + return + } + + finished = true + + assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1)) + + socket + .off('drain', onDrain) + .off('error', onFinished) + + body + .removeListener('data', onData) + .removeListener('end', onFinished) + .removeListener('error', onFinished) + .removeListener('close', onAbort) + + if (!err) { + try { + writer.end() + } catch (er) { + err = er + } + } + + writer.destroy(err) + + if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) { + util.destroy(body, err) + } else { + util.destroy(body) + } + } + + body + .on('data', onData) + .on('end', onFinished) + .on('error', onFinished) + .on('close', onAbort) + + if (body.resume) { + body.resume() + } + + socket + .on('drain', onDrain) + .on('error', onFinished) +} +async function writeBlob ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { + assert(contentLength === body.size, 'blob body must have content length') + + const isH2 = client[kHTTPConnVersion] === 'h2' + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError() + } + + const buffer = Buffer.from(await body.arrayBuffer()) + + if (isH2) { + h2stream.cork() + h2stream.write(buffer) + h2stream.uncork() + } else { + socket.cork() + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') + socket.write(buffer) + socket.uncork() + } + + request.onBodySent(buffer) + request.onRequestSent() + + if (!expectsPayload) { + socket[kReset] = true + } + + resume(client) + } catch (err) { + util.destroy(isH2 ? h2stream : socket, err) + } +} - function httpOverHttp(options) { - var agent = new TunnelingAgent(options); - agent.request = http.request; - return agent; - } +async function writeIterable ({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { + assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined') + + let callback = null + function onDrain () { + if (callback) { + const cb = callback + callback = null + cb() + } + } + + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null) + + if (socket[kError]) { + reject(socket[kError]) + } else { + callback = resolve + } + }) + + if (client[kHTTPConnVersion] === 'h2') { + h2stream + .on('close', onDrain) + .on('drain', onDrain) + + try { + // It's up to the user to somehow abort the async iterable. + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError] + } + + const res = h2stream.write(chunk) + request.onBodySent(chunk) + if (!res) { + await waitForDrain() + } + } + } catch (err) { + h2stream.destroy(err) + } finally { + request.onRequestSent() + h2stream.end() + h2stream + .off('close', onDrain) + .off('drain', onDrain) + } + + return + } + + socket + .on('close', onDrain) + .on('drain', onDrain) + + const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }) + try { + // It's up to the user to somehow abort the async iterable. + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError] + } + + if (!writer.write(chunk)) { + await waitForDrain() + } + } + + writer.end() + } catch (err) { + writer.destroy(err) + } finally { + socket + .off('close', onDrain) + .off('drain', onDrain) + } +} - function httpsOverHttp(options) { - var agent = new TunnelingAgent(options); - agent.request = http.request; - agent.createSocket = createSecureSocket; - agent.defaultPort = 443; - return agent; - } +class AsyncWriter { + constructor ({ socket, request, contentLength, client, expectsPayload, header }) { + this.socket = socket + this.request = request + this.contentLength = contentLength + this.client = client + this.bytesWritten = 0 + this.expectsPayload = expectsPayload + this.header = header + + socket[kWriting] = true + } + + write (chunk) { + const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this + + if (socket[kError]) { + throw socket[kError] + } + + if (socket.destroyed) { + return false + } + + const len = Buffer.byteLength(chunk) + if (!len) { + return true + } + + // We should defer writing chunks. + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError() + } + + process.emitWarning(new RequestContentLengthMismatchError()) + } + + socket.cork() + + if (bytesWritten === 0) { + if (!expectsPayload) { + socket[kReset] = true + } + + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1') + } else { + socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') + } + } + + if (contentLength === null) { + socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1') + } + + this.bytesWritten += len + + const ret = socket.write(chunk) + + socket.uncork() + + request.onBodySent(chunk) + + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + // istanbul ignore else: only for jest + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh() + } + } + } + + return ret + } + + end () { + const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this + request.onRequestSent() + + socket[kWriting] = false + + if (socket[kError]) { + throw socket[kError] + } + + if (socket.destroyed) { + return + } + + if (bytesWritten === 0) { + if (expectsPayload) { + // https://tools.ietf.org/html/rfc7230#section-3.3.2 + // A user agent SHOULD send a Content-Length in a request message when + // no Transfer-Encoding is sent and the request method defines a meaning + // for an enclosed payload body. + + socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1') + } else { + socket.write(`${header}\r\n`, 'latin1') + } + } else if (contentLength === null) { + socket.write('\r\n0\r\n\r\n', 'latin1') + } + + if (contentLength !== null && bytesWritten !== contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError() + } else { + process.emitWarning(new RequestContentLengthMismatchError()) + } + } + + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + // istanbul ignore else: only for jest + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh() + } + } + + resume(client) + } + + destroy (err) { + const { socket, client } = this + + socket[kWriting] = false + + if (err) { + assert(client[kRunning] <= 1, 'pipeline should only contain this request') + util.destroy(socket, err) + } + } +} - function httpOverHttps(options) { - var agent = new TunnelingAgent(options); - agent.request = https.request; - return agent; - } +function errorRequest (client, request, err) { + try { + request.onError(err) + assert(request.aborted) + } catch (err) { + client.emit('error', err) + } +} - function httpsOverHttps(options) { - var agent = new TunnelingAgent(options); - agent.request = https.request; - agent.createSocket = createSecureSocket; - agent.defaultPort = 443; - return agent; - } +module.exports = Client - function TunnelingAgent(options) { - var self = this; - self.options = options || {}; - self.proxyOptions = self.options.proxy || {}; - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; - self.requests = []; - self.sockets = []; - - self.on('free', function onFree(socket, host, port, localAddress) { - var options = toOptions(host, port, localAddress); - for (var i = 0, len = self.requests.length; i < len; ++i) { - var pending = self.requests[i]; - if (pending.host === options.host && pending.port === options.port) { - // Detect the request to connect same origin server, - // reuse the connection. - self.requests.splice(i, 1); - pending.request.onSocket(socket); - return; - } - } - socket.destroy(); - self.removeSocket(socket); - }); - } - util.inherits(TunnelingAgent, events.EventEmitter); +/***/ }), - TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { - var self = this; - var options = mergeOptions({ request: req }, self.options, toOptions(host, port, localAddress)); +/***/ 6436: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (self.sockets.length >= this.maxSockets) { - // We are over limit so we'll add it to the queue. - self.requests.push(options); - return; - } +"use strict"; - // If we are under maxSockets create a new one. - self.createSocket(options, function (socket) { - socket.on('free', onFree); - socket.on('close', onCloseOrRemove); - socket.on('agentRemove', onCloseOrRemove); - req.onSocket(socket); - function onFree() { - self.emit('free', socket, options); - } +/* istanbul ignore file: only for Node 12 */ - function onCloseOrRemove(err) { - self.removeSocket(socket); - socket.removeListener('free', onFree); - socket.removeListener('close', onCloseOrRemove); - socket.removeListener('agentRemove', onCloseOrRemove); - } - }); - }; +const { kConnected, kSize } = __nccwpck_require__(2785) - TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this; - var placeholder = {}; - self.sockets.push(placeholder); - - var connectOptions = mergeOptions({}, self.proxyOptions, { - method: 'CONNECT', - path: options.host + ':' + options.port, - agent: false, - headers: { - host: options.host + ':' + options.port - } - }); - if (options.localAddress) { - connectOptions.localAddress = options.localAddress; - } - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {}; - connectOptions.headers['Proxy-Authorization'] = 'Basic ' + - new Buffer(connectOptions.proxyAuth).toString('base64'); - } +class CompatWeakRef { + constructor (value) { + this.value = value + } - debug('making CONNECT request'); - var connectReq = self.request(connectOptions); - connectReq.useChunkedEncodingByDefault = false; // for v0.6 - connectReq.once('response', onResponse); // for v0.6 - connectReq.once('upgrade', onUpgrade); // for v0.6 - connectReq.once('connect', onConnect); // for v0.7 or later - connectReq.once('error', onError); - connectReq.end(); - - function onResponse(res) { - // Very hacky. This is necessary to avoid http-parser leaks. - res.upgrade = true; - } + deref () { + return this.value[kConnected] === 0 && this.value[kSize] === 0 + ? undefined + : this.value + } +} - function onUpgrade(res, socket, head) { - // Hacky. - process.nextTick(function () { - onConnect(res, socket, head); - }); - } +class CompatFinalizer { + constructor (finalizer) { + this.finalizer = finalizer + } + + register (dispatcher, key) { + if (dispatcher.on) { + dispatcher.on('disconnect', () => { + if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { + this.finalizer(key) + } + }) + } + } +} - function onConnect(res, socket, head) { - connectReq.removeAllListeners(); - socket.removeAllListeners(); - - if (res.statusCode !== 200) { - debug('tunneling socket could not be established, statusCode=%d', - res.statusCode); - socket.destroy(); - var error = new Error('tunneling socket could not be established, ' + - 'statusCode=' + res.statusCode); - error.code = 'ECONNRESET'; - options.request.emit('error', error); - self.removeSocket(placeholder); - return; - } - if (head.length > 0) { - debug('got illegal response body from proxy'); - socket.destroy(); - var error = new Error('got illegal response body from proxy'); - error.code = 'ECONNRESET'; - options.request.emit('error', error); - self.removeSocket(placeholder); - return; - } - debug('tunneling connection has established'); - self.sockets[self.sockets.indexOf(placeholder)] = socket; - return cb(socket); - } +module.exports = function () { + // FIXME: remove workaround when the Node bug is fixed + // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 + if (process.env.NODE_V8_COVERAGE) { + return { + WeakRef: CompatWeakRef, + FinalizationRegistry: CompatFinalizer + } + } + return { + WeakRef: global.WeakRef || CompatWeakRef, + FinalizationRegistry: global.FinalizationRegistry || CompatFinalizer + } +} - function onError(cause) { - connectReq.removeAllListeners(); - debug('tunneling socket could not be established, cause=%s\n', - cause.message, cause.stack); - var error = new Error('tunneling socket could not be established, ' + - 'cause=' + cause.message); - error.code = 'ECONNRESET'; - options.request.emit('error', error); - self.removeSocket(placeholder); - } - }; +/***/ }), - TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket) - if (pos === -1) { - return; - } - this.sockets.splice(pos, 1); - - var pending = this.requests.shift(); - if (pending) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createSocket(pending, function (socket) { - pending.request.onSocket(socket); - }); - } - }; +/***/ 663: +/***/ ((module) => { - function createSecureSocket(options, cb) { - var self = this; - TunnelingAgent.prototype.createSocket.call(self, options, function (socket) { - var hostHeader = options.request.getHeader('host'); - var tlsOptions = mergeOptions({}, self.options, { - socket: socket, - servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host - }); +"use strict"; - // 0 is dummy port for v0.6 - var secureSocket = tls.connect(0, tlsOptions); - self.sockets[self.sockets.indexOf(socket)] = secureSocket; - cb(secureSocket); - }); - } +// https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size +const maxAttributeValueSize = 1024 - function toOptions(host, port, localAddress) { - if (typeof host === 'string') { // since v0.10 - return { - host: host, - port: port, - localAddress: localAddress - }; - } - return host; // for v0.11 or later - } +// https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size +const maxNameValuePairSize = 4096 - function mergeOptions(target) { - for (var i = 1, len = arguments.length; i < len; ++i) { - var overrides = arguments[i]; - if (typeof overrides === 'object') { - var keys = Object.keys(overrides); - for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { - var k = keys[j]; - if (overrides[k] !== undefined) { - target[k] = overrides[k]; - } - } - } - } - return target; - } +module.exports = { + maxAttributeValueSize, + maxNameValuePairSize +} - var debug; - if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function () { - var args = Array.prototype.slice.call(arguments); - if (typeof args[0] === 'string') { - args[0] = 'TUNNEL: ' + args[0]; - } else { - args.unshift('TUNNEL:'); - } - console.error.apply(console, args); - } - } else { - debug = function () { }; - } - exports.debug = debug; // for test +/***/ }), +/***/ 1724: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - /***/ -}), +"use strict"; -/***/ 4442: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - "use strict"; +const { parseSetCookie } = __nccwpck_require__(4408) +const { stringify, getHeadersList } = __nccwpck_require__(3121) +const { webidl } = __nccwpck_require__(1744) +const { Headers } = __nccwpck_require__(554) - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.PersonalAccessTokenCredentialHandler = exports.NtlmCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0; - var basiccreds_1 = __nccwpck_require__(7954); - Object.defineProperty(exports, "BasicCredentialHandler", ({ enumerable: true, get: function () { return basiccreds_1.BasicCredentialHandler; } })); - var bearertoken_1 = __nccwpck_require__(7431); - Object.defineProperty(exports, "BearerCredentialHandler", ({ enumerable: true, get: function () { return bearertoken_1.BearerCredentialHandler; } })); - var ntlm_1 = __nccwpck_require__(4157); - Object.defineProperty(exports, "NtlmCredentialHandler", ({ enumerable: true, get: function () { return ntlm_1.NtlmCredentialHandler; } })); - var personalaccesstoken_1 = __nccwpck_require__(7799); - Object.defineProperty(exports, "PersonalAccessTokenCredentialHandler", ({ enumerable: true, get: function () { return personalaccesstoken_1.PersonalAccessTokenCredentialHandler; } })); +/** + * @typedef {Object} Cookie + * @property {string} name + * @property {string} value + * @property {Date|number|undefined} expires + * @property {number|undefined} maxAge + * @property {string|undefined} domain + * @property {string|undefined} path + * @property {boolean|undefined} secure + * @property {boolean|undefined} httpOnly + * @property {'Strict'|'Lax'|'None'} sameSite + * @property {string[]} unparsed + */ +/** + * @param {Headers} headers + * @returns {Record} + */ +function getCookies (headers) { + webidl.argumentLengthCheck(arguments, 1, { header: 'getCookies' }) - /***/ -}), + webidl.brandCheck(headers, Headers, { strict: false }) -/***/ 5538: -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) { - - "use strict"; - - // Copyright (c) Microsoft. All rights reserved. - // Licensed under the MIT license. See LICENSE file in the project root for full license information. - var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpCodes = void 0; - const url = __nccwpck_require__(7310); - const http = __nccwpck_require__(3685); - const https = __nccwpck_require__(5687); - const util = __nccwpck_require__(9470); - let fs; - let tunnel; - var HttpCodes; - (function (HttpCodes) { - HttpCodes[HttpCodes["OK"] = 200] = "OK"; - HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; - HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; - HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; - HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; - HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; - HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; - HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; - HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; - HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; - HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; - HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; - HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; - HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; - HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; - HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; - HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; - HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; - HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; - HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; - HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; - HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; - })(HttpCodes || (exports.HttpCodes = HttpCodes = {})); - const HttpRedirectCodes = [HttpCodes.MovedPermanently, HttpCodes.ResourceMoved, HttpCodes.SeeOther, HttpCodes.TemporaryRedirect, HttpCodes.PermanentRedirect]; - const HttpResponseRetryCodes = [HttpCodes.BadGateway, HttpCodes.ServiceUnavailable, HttpCodes.GatewayTimeout]; - const NetworkRetryErrors = ['ECONNRESET', 'ENOTFOUND', 'ESOCKETTIMEDOUT', 'ETIMEDOUT', 'ECONNREFUSED']; - const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; - const ExponentialBackoffCeiling = 10; - const ExponentialBackoffTimeSlice = 5; - class HttpClientResponse { - constructor(message) { - this.message = message; - } - readBody() { - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - const chunks = []; - const encodingCharset = util.obtainContentCharset(this); - // Extract Encoding from header: 'content-encoding' - // Match `gzip`, `gzip, deflate` variations of GZIP encoding - const contentEncoding = this.message.headers['content-encoding'] || ''; - const isGzippedEncoded = new RegExp('(gzip$)|(gzip, *deflate)').test(contentEncoding); - this.message.on('data', function (data) { - const chunk = (typeof data === 'string') ? Buffer.from(data, encodingCharset) : data; - chunks.push(chunk); - }).on('end', function () { - return __awaiter(this, void 0, void 0, function* () { - const buffer = Buffer.concat(chunks); - if (isGzippedEncoded) { // Process GZipped Response Body HERE - const gunzippedBody = yield util.decompressGzippedContent(buffer, encodingCharset); - resolve(gunzippedBody); - } - else { - resolve(buffer.toString(encodingCharset)); - } - }); - }).on('error', function (err) { - reject(err); - }); - })); - } - } - exports.HttpClientResponse = HttpClientResponse; - function isHttps(requestUrl) { - let parsedUrl = url.parse(requestUrl); - return parsedUrl.protocol === 'https:'; - } - exports.isHttps = isHttps; - var EnvironmentVariables; - (function (EnvironmentVariables) { - EnvironmentVariables["HTTP_PROXY"] = "HTTP_PROXY"; - EnvironmentVariables["HTTPS_PROXY"] = "HTTPS_PROXY"; - EnvironmentVariables["NO_PROXY"] = "NO_PROXY"; - })(EnvironmentVariables || (EnvironmentVariables = {})); - class HttpClient { - constructor(userAgent, handlers, requestOptions) { - this._ignoreSslError = false; - this._allowRedirects = true; - this._allowRedirectDowngrade = false; - this._maxRedirects = 50; - this._allowRetries = false; - this._maxRetries = 1; - this._keepAlive = false; - this._disposed = false; - this.userAgent = userAgent; - this.handlers = handlers || []; - let no_proxy = process.env[EnvironmentVariables.NO_PROXY]; - if (no_proxy) { - this._httpProxyBypassHosts = []; - no_proxy.split(',').forEach(bypass => { - this._httpProxyBypassHosts.push(util.buildProxyBypassRegexFromEnv(bypass)); - }); - } - this.requestOptions = requestOptions; - if (requestOptions) { - if (requestOptions.ignoreSslError != null) { - this._ignoreSslError = requestOptions.ignoreSslError; - } - this._socketTimeout = requestOptions.socketTimeout; - this._httpProxy = requestOptions.proxy; - if (requestOptions.proxy && requestOptions.proxy.proxyBypassHosts) { - this._httpProxyBypassHosts = []; - requestOptions.proxy.proxyBypassHosts.forEach(bypass => { - this._httpProxyBypassHosts.push(new RegExp(bypass, 'i')); - }); - } - this._certConfig = requestOptions.cert; - if (this._certConfig) { - // If using cert, need fs - fs = __nccwpck_require__(7147); - // cache the cert content into memory, so we don't have to read it from disk every time - if (this._certConfig.caFile && fs.existsSync(this._certConfig.caFile)) { - this._ca = fs.readFileSync(this._certConfig.caFile, 'utf8'); - } - if (this._certConfig.certFile && fs.existsSync(this._certConfig.certFile)) { - this._cert = fs.readFileSync(this._certConfig.certFile, 'utf8'); - } - if (this._certConfig.keyFile && fs.existsSync(this._certConfig.keyFile)) { - this._key = fs.readFileSync(this._certConfig.keyFile, 'utf8'); - } - } - if (requestOptions.allowRedirects != null) { - this._allowRedirects = requestOptions.allowRedirects; - } - if (requestOptions.allowRedirectDowngrade != null) { - this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; - } - if (requestOptions.maxRedirects != null) { - this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); - } - if (requestOptions.keepAlive != null) { - this._keepAlive = requestOptions.keepAlive; - } - if (requestOptions.allowRetries != null) { - this._allowRetries = requestOptions.allowRetries; - } - if (requestOptions.maxRetries != null) { - this._maxRetries = requestOptions.maxRetries; - } - } - } - options(requestUrl, additionalHeaders) { - return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); - } - get(requestUrl, additionalHeaders) { - return this.request('GET', requestUrl, null, additionalHeaders || {}); - } - del(requestUrl, additionalHeaders) { - return this.request('DELETE', requestUrl, null, additionalHeaders || {}); - } - post(requestUrl, data, additionalHeaders) { - return this.request('POST', requestUrl, data, additionalHeaders || {}); - } - patch(requestUrl, data, additionalHeaders) { - return this.request('PATCH', requestUrl, data, additionalHeaders || {}); - } - put(requestUrl, data, additionalHeaders) { - return this.request('PUT', requestUrl, data, additionalHeaders || {}); - } - head(requestUrl, additionalHeaders) { - return this.request('HEAD', requestUrl, null, additionalHeaders || {}); - } - sendStream(verb, requestUrl, stream, additionalHeaders) { - return this.request(verb, requestUrl, stream, additionalHeaders); - } - /** - * Makes a raw http request. - * All other methods such as get, post, patch, and request ultimately call this. - * Prefer get, del, post and patch - */ - request(verb, requestUrl, data, headers) { - return __awaiter(this, void 0, void 0, function* () { - if (this._disposed) { - throw new Error("Client has already been disposed."); - } - let parsedUrl = url.parse(requestUrl); - let info = this._prepareRequest(verb, parsedUrl, headers); - // Only perform retries on reads since writes may not be idempotent. - let maxTries = (this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1) ? this._maxRetries + 1 : 1; - let numTries = 0; - let response; - while (numTries < maxTries) { - try { - response = yield this.requestRaw(info, data); - } - catch (err) { - numTries++; - if (err && err.code && NetworkRetryErrors.indexOf(err.code) > -1 && numTries < maxTries) { - yield this._performExponentialBackoff(numTries); - continue; - } - throw err; - } - // Check if it's an authentication challenge - if (response && response.message && response.message.statusCode === HttpCodes.Unauthorized) { - let authenticationHandler; - for (let i = 0; i < this.handlers.length; i++) { - if (this.handlers[i].canHandleAuthentication(response)) { - authenticationHandler = this.handlers[i]; - break; - } - } - if (authenticationHandler) { - return authenticationHandler.handleAuthentication(this, info, data); - } - else { - // We have received an unauthorized response but have no handlers to handle it. - // Let the response return to the caller. - return response; - } - } - let redirectsRemaining = this._maxRedirects; - while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 - && this._allowRedirects - && redirectsRemaining > 0) { - const redirectUrl = response.message.headers["location"]; - if (!redirectUrl) { - // if there's no location to redirect to, we won't - break; - } - let parsedRedirectUrl = url.parse(redirectUrl); - if (parsedUrl.protocol == 'https:' && parsedUrl.protocol != parsedRedirectUrl.protocol && !this._allowRedirectDowngrade) { - throw new Error("Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true."); - } - // we need to finish reading the response before reassigning response - // which will leak the open socket. - yield response.readBody(); - // let's make the request with the new redirectUrl - info = this._prepareRequest(verb, parsedRedirectUrl, headers); - response = yield this.requestRaw(info, data); - redirectsRemaining--; - } - if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) { - // If not a retry code, return immediately instead of retrying - return response; - } - numTries += 1; - if (numTries < maxTries) { - yield response.readBody(); - yield this._performExponentialBackoff(numTries); - } - } - return response; - }); - } - /** - * Needs to be called if keepAlive is set to true in request options. - */ - dispose() { - if (this._agent) { - this._agent.destroy(); - } - this._disposed = true; - } - /** - * Raw request. - * @param info - * @param data - */ - requestRaw(info, data) { - return new Promise((resolve, reject) => { - let callbackForResult = function (err, res) { - if (err) { - reject(err); - } - resolve(res); - }; - this.requestRawWithCallback(info, data, callbackForResult); - }); - } - /** - * Raw request with callback. - * @param info - * @param data - * @param onResult - */ - requestRawWithCallback(info, data, onResult) { - let socket; - if (typeof (data) === 'string') { - info.options.headers["Content-Length"] = Buffer.byteLength(data, 'utf8'); - } - let callbackCalled = false; - let handleResult = (err, res) => { - if (!callbackCalled) { - callbackCalled = true; - onResult(err, res); - } - }; - let req = info.httpModule.request(info.options, (msg) => { - let res = new HttpClientResponse(msg); - handleResult(null, res); - }); - req.on('socket', (sock) => { - socket = sock; - }); - // If we ever get disconnected, we want the socket to timeout eventually - req.setTimeout(this._socketTimeout || 3 * 60000, () => { - if (socket) { - socket.destroy(); - } - handleResult(new Error('Request timeout: ' + info.options.path), null); - }); - req.on('error', function (err) { - // err has statusCode property - // res should have headers - handleResult(err, null); - }); - if (data && typeof (data) === 'string') { - req.write(data, 'utf8'); - } - if (data && typeof (data) !== 'string') { - data.on('close', function () { - req.end(); - }); - data.pipe(req); - } - else { - req.end(); - } - } - _prepareRequest(method, requestUrl, headers) { - const info = {}; - info.parsedUrl = requestUrl; - const usingSsl = info.parsedUrl.protocol === 'https:'; - info.httpModule = usingSsl ? https : http; - const defaultPort = usingSsl ? 443 : 80; - info.options = {}; - info.options.host = info.parsedUrl.hostname; - info.options.port = info.parsedUrl.port ? parseInt(info.parsedUrl.port) : defaultPort; - info.options.path = (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); - info.options.method = method; - info.options.timeout = (this.requestOptions && this.requestOptions.socketTimeout) || this._socketTimeout; - this._socketTimeout = info.options.timeout; - info.options.headers = this._mergeHeaders(headers); - if (this.userAgent != null) { - info.options.headers["user-agent"] = this.userAgent; - } - info.options.agent = this._getAgent(info.parsedUrl); - // gives handlers an opportunity to participate - if (this.handlers && !this._isPresigned(url.format(requestUrl))) { - this.handlers.forEach((handler) => { - handler.prepareRequest(info.options); - }); - } - return info; - } - _isPresigned(requestUrl) { - if (this.requestOptions && this.requestOptions.presignedUrlPatterns) { - const patterns = this.requestOptions.presignedUrlPatterns; - for (let i = 0; i < patterns.length; i++) { - if (requestUrl.match(patterns[i])) { - return true; - } - } - } - return false; - } - _mergeHeaders(headers) { - const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {}); - if (this.requestOptions && this.requestOptions.headers) { - return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers)); - } - return lowercaseKeys(headers || {}); - } - _getAgent(parsedUrl) { - let agent; - let proxy = this._getProxy(parsedUrl); - let useProxy = proxy.proxyUrl && proxy.proxyUrl.hostname && !this._isMatchInBypassProxyList(parsedUrl); - if (this._keepAlive && useProxy) { - agent = this._proxyAgent; - } - if (this._keepAlive && !useProxy) { - agent = this._agent; - } - // if agent is already assigned use that agent. - if (!!agent) { - return agent; - } - const usingSsl = parsedUrl.protocol === 'https:'; - let maxSockets = 100; - if (!!this.requestOptions) { - maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; - } - if (useProxy) { - // If using proxy, need tunnel - if (!tunnel) { - tunnel = __nccwpck_require__(4294); - } - const agentOptions = { - maxSockets: maxSockets, - keepAlive: this._keepAlive, - proxy: { - proxyAuth: proxy.proxyAuth, - host: proxy.proxyUrl.hostname, - port: proxy.proxyUrl.port - }, - }; - let tunnelAgent; - const overHttps = proxy.proxyUrl.protocol === 'https:'; - if (usingSsl) { - tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; - } - else { - tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; - } - agent = tunnelAgent(agentOptions); - this._proxyAgent = agent; - } - // if reusing agent across request and tunneling agent isn't assigned create a new agent - if (this._keepAlive && !agent) { - const options = { keepAlive: this._keepAlive, maxSockets: maxSockets }; - agent = usingSsl ? new https.Agent(options) : new http.Agent(options); - this._agent = agent; - } - // if not using private agent and tunnel agent isn't setup then use global agent - if (!agent) { - agent = usingSsl ? https.globalAgent : http.globalAgent; - } - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - agent.options = Object.assign(agent.options || {}, { rejectUnauthorized: false }); - } - if (usingSsl && this._certConfig) { - agent.options = Object.assign(agent.options || {}, { ca: this._ca, cert: this._cert, key: this._key, passphrase: this._certConfig.passphrase }); - } - return agent; - } - _getProxy(parsedUrl) { - let usingSsl = parsedUrl.protocol === 'https:'; - let proxyConfig = this._httpProxy; - // fallback to http_proxy and https_proxy env - let https_proxy = process.env[EnvironmentVariables.HTTPS_PROXY]; - let http_proxy = process.env[EnvironmentVariables.HTTP_PROXY]; - if (!proxyConfig) { - if (https_proxy && usingSsl) { - proxyConfig = { - proxyUrl: https_proxy - }; - } - else if (http_proxy) { - proxyConfig = { - proxyUrl: http_proxy - }; - } - } - let proxyUrl; - let proxyAuth; - if (proxyConfig) { - if (proxyConfig.proxyUrl.length > 0) { - proxyUrl = url.parse(proxyConfig.proxyUrl); - } - if (proxyConfig.proxyUsername || proxyConfig.proxyPassword) { - proxyAuth = proxyConfig.proxyUsername + ":" + proxyConfig.proxyPassword; - } - } - return { proxyUrl: proxyUrl, proxyAuth: proxyAuth }; - } - _isMatchInBypassProxyList(parsedUrl) { - if (!this._httpProxyBypassHosts) { - return false; - } - let bypass = false; - this._httpProxyBypassHosts.forEach(bypassHost => { - if (bypassHost.test(parsedUrl.href)) { - bypass = true; - } - }); - return bypass; - } - _performExponentialBackoff(retryNumber) { - retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); - const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); - return new Promise(resolve => setTimeout(() => resolve(), ms)); - } - } - exports.HttpClient = HttpClient; + const cookie = headers.get('cookie') + const out = {} + if (!cookie) { + return out + } - /***/ -}), + for (const piece of cookie.split(';')) { + const [name, ...value] = piece.split('=') -/***/ 9470: -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) { - - "use strict"; - - // Copyright (c) Microsoft. All rights reserved. - // Licensed under the MIT license. See LICENSE file in the project root for full license information. - var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.obtainContentCharset = exports.buildProxyBypassRegexFromEnv = exports.decompressGzippedContent = exports.getUrl = void 0; - const qs = __nccwpck_require__(2760); - const url = __nccwpck_require__(7310); - const path = __nccwpck_require__(1017); - const zlib = __nccwpck_require__(9796); - /** - * creates an url from a request url and optional base url (http://server:8080) - * @param {string} resource - a fully qualified url or relative path - * @param {string} baseUrl - an optional baseUrl (http://server:8080) - * @param {IRequestOptions} options - an optional options object, could include QueryParameters e.g. - * @return {string} - resultant url - */ - function getUrl(resource, baseUrl, queryParams) { - const pathApi = path.posix || path; - let requestUrl = ''; - if (!baseUrl) { - requestUrl = resource; - } - else if (!resource) { - requestUrl = baseUrl; - } - else { - const base = url.parse(baseUrl); - const resultantUrl = url.parse(resource); - // resource (specific per request) elements take priority - resultantUrl.protocol = resultantUrl.protocol || base.protocol; - resultantUrl.auth = resultantUrl.auth || base.auth; - resultantUrl.host = resultantUrl.host || base.host; - resultantUrl.pathname = pathApi.resolve(base.pathname, resultantUrl.pathname); - if (!resultantUrl.pathname.endsWith('/') && resource.endsWith('/')) { - resultantUrl.pathname += '/'; - } - requestUrl = url.format(resultantUrl); - } - return queryParams ? - getUrlWithParsedQueryParams(requestUrl, queryParams) : - requestUrl; - } - exports.getUrl = getUrl; - /** - * - * @param {string} requestUrl - * @param {IRequestQueryParams} queryParams - * @return {string} - Request's URL with Query Parameters appended/parsed. - */ - function getUrlWithParsedQueryParams(requestUrl, queryParams) { - const url = requestUrl.replace(/\?$/g, ''); // Clean any extra end-of-string "?" character - const parsedQueryParams = qs.stringify(queryParams.params, buildParamsStringifyOptions(queryParams)); - return `${url}${parsedQueryParams}`; - } - /** - * Build options for QueryParams Stringifying. - * - * @param {IRequestQueryParams} queryParams - * @return {object} - */ - function buildParamsStringifyOptions(queryParams) { - let options = { - addQueryPrefix: true, - delimiter: (queryParams.options || {}).separator || '&', - allowDots: (queryParams.options || {}).shouldAllowDots || false, - arrayFormat: (queryParams.options || {}).arrayFormat || 'repeat', - encodeValuesOnly: (queryParams.options || {}).shouldOnlyEncodeValues || true - }; - return options; - } - /** - * Decompress/Decode gzip encoded JSON - * Using Node.js built-in zlib module - * - * @param {Buffer} buffer - * @param {string} charset? - optional; defaults to 'utf-8' - * @return {Promise} - */ - function decompressGzippedContent(buffer, charset) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - zlib.gunzip(buffer, function (error, buffer) { - if (error) { - reject(error); - } - else { - resolve(buffer.toString(charset || 'utf-8')); - } - }); - })); - }); - } - exports.decompressGzippedContent = decompressGzippedContent; - /** - * Builds a RegExp to test urls against for deciding - * wether to bypass proxy from an entry of the - * environment variable setting NO_PROXY - * - * @param {string} bypass - * @return {RegExp} - */ - function buildProxyBypassRegexFromEnv(bypass) { - try { - // We need to keep this around for back-compat purposes - return new RegExp(bypass, 'i'); - } - catch (err) { - if (err instanceof SyntaxError && (bypass || "").startsWith("*")) { - let wildcardEscaped = bypass.replace('*', '(.*)'); - return new RegExp(wildcardEscaped, 'i'); - } - throw err; - } - } - exports.buildProxyBypassRegexFromEnv = buildProxyBypassRegexFromEnv; - /** - * Obtain Response's Content Charset. - * Through inspecting `content-type` response header. - * It Returns 'utf-8' if NO charset specified/matched. - * - * @param {IHttpClientResponse} response - * @return {string} - Content Encoding Charset; Default=utf-8 - */ - function obtainContentCharset(response) { - // Find the charset, if specified. - // Search for the `charset=CHARSET` string, not including `;,\r\n` - // Example: content-type: 'application/json;charset=utf-8' - // |__ matches would be ['charset=utf-8', 'utf-8', index: 18, input: 'application/json; charset=utf-8'] - // |_____ matches[1] would have the charset :tada: , in our example it's utf-8 - // However, if the matches Array was empty or no charset found, 'utf-8' would be returned by default. - const nodeSupportedEncodings = ['ascii', 'utf8', 'utf16le', 'ucs2', 'base64', 'binary', 'hex']; - const contentType = response.message.headers['content-type'] || ''; - const matches = contentType.match(/charset=([^;,\r\n]+)/i); - if (matches && matches[1] && nodeSupportedEncodings.indexOf(matches[1]) != -1) { - return matches[1]; - } - return 'utf-8'; - } - exports.obtainContentCharset = obtainContentCharset; + out[name.trim()] = value.join('=') + } + return out +} - /***/ -}), +/** + * @param {Headers} headers + * @param {string} name + * @param {{ path?: string, domain?: string }|undefined} attributes + * @returns {void} + */ +function deleteCookie (headers, name, attributes) { + webidl.argumentLengthCheck(arguments, 2, { header: 'deleteCookie' }) + + webidl.brandCheck(headers, Headers, { strict: false }) + + name = webidl.converters.DOMString(name) + attributes = webidl.converters.DeleteCookieAttributes(attributes) + + // Matches behavior of + // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278 + setCookie(headers, { + name, + value: '', + expires: new Date(0), + ...attributes + }) +} -/***/ 7954: -/***/ ((__unused_webpack_module, exports) => { +/** + * @param {Headers} headers + * @returns {Cookie[]} + */ +function getSetCookies (headers) { + webidl.argumentLengthCheck(arguments, 1, { header: 'getSetCookies' }) - "use strict"; - - // Copyright (c) Microsoft. All rights reserved. - // Licensed under the MIT license. See LICENSE file in the project root for full license information. - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.BasicCredentialHandler = void 0; - class BasicCredentialHandler { - constructor(username, password, allowCrossOriginAuthentication) { - this.username = username; - this.password = password; - this.allowCrossOriginAuthentication = allowCrossOriginAuthentication; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!this.origin) { - this.origin = options.host; - } - // If this is a redirection, don't set the Authorization header - if (this.origin === options.host || this.allowCrossOriginAuthentication) { - options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`; - } - options.headers['X-TFS-FedAuthRedirect'] = 'Suppress'; - } - // This handler cannot handle 401 - canHandleAuthentication(response) { - return false; - } - handleAuthentication(httpClient, requestInfo, objs) { - return null; - } - } - exports.BasicCredentialHandler = BasicCredentialHandler; + webidl.brandCheck(headers, Headers, { strict: false }) + const cookies = getHeadersList(headers).cookies - /***/ -}), + if (!cookies) { + return [] + } -/***/ 7431: -/***/ ((__unused_webpack_module, exports) => { + // In older versions of undici, cookies is a list of name:value. + return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair)) +} - "use strict"; +/** + * @param {Headers} headers + * @param {Cookie} cookie + * @returns {void} + */ +function setCookie (headers, cookie) { + webidl.argumentLengthCheck(arguments, 2, { header: 'setCookie' }) - // Copyright (c) Microsoft. All rights reserved. - // Licensed under the MIT license. See LICENSE file in the project root for full license information. - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.BearerCredentialHandler = void 0; - class BearerCredentialHandler { - constructor(token, allowCrossOriginAuthentication) { - this.token = token; - this.allowCrossOriginAuthentication = allowCrossOriginAuthentication; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!this.origin) { - this.origin = options.host; - } - // If this is a redirection, don't set the Authorization header - if (this.origin === options.host || this.allowCrossOriginAuthentication) { - options.headers['Authorization'] = `Bearer ${this.token}`; - } - options.headers['X-TFS-FedAuthRedirect'] = 'Suppress'; - } - // This handler cannot handle 401 - canHandleAuthentication(response) { - return false; - } - handleAuthentication(httpClient, requestInfo, objs) { - return null; - } - } - exports.BearerCredentialHandler = BearerCredentialHandler; + webidl.brandCheck(headers, Headers, { strict: false }) + cookie = webidl.converters.Cookie(cookie) - /***/ -}), + const str = stringify(cookie) -/***/ 4157: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + if (str) { + headers.append('Set-Cookie', stringify(cookie)) + } +} - "use strict"; - - // Copyright (c) Microsoft. All rights reserved. - // Licensed under the MIT license. See LICENSE file in the project root for full license information. - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.NtlmCredentialHandler = void 0; - const http = __nccwpck_require__(3685); - const https = __nccwpck_require__(5687); - const _ = __nccwpck_require__(5067); - const ntlm = __nccwpck_require__(2673); - class NtlmCredentialHandler { - constructor(username, password, workstation, domain) { - this._ntlmOptions = {}; - this._ntlmOptions.username = username; - this._ntlmOptions.password = password; - this._ntlmOptions.domain = domain || ''; - this._ntlmOptions.workstation = workstation || ''; - } - prepareRequest(options) { - // No headers or options need to be set. We keep the credentials on the handler itself. - // If a (proxy) agent is set, remove it as we don't support proxy for NTLM at this time - if (options.agent) { - delete options.agent; - } - } - canHandleAuthentication(response) { - if (response && response.message && response.message.statusCode === 401) { - // Ensure that we're talking NTLM here - // Once we have the www-authenticate header, split it so we can ensure we can talk NTLM - const wwwAuthenticate = response.message.headers['www-authenticate']; - return wwwAuthenticate && (wwwAuthenticate.split(', ').indexOf("NTLM") >= 0); - } - return false; - } - handleAuthentication(httpClient, requestInfo, objs) { - return new Promise((resolve, reject) => { - const callbackForResult = function (err, res) { - if (err) { - reject(err); - return; - } - // We have to readbody on the response before continuing otherwise there is a hang. - res.readBody().then(() => { - resolve(res); - }); - }; - this.handleAuthenticationPrivate(httpClient, requestInfo, objs, callbackForResult); - }); - } - handleAuthenticationPrivate(httpClient, requestInfo, objs, finalCallback) { - // Set up the headers for NTLM authentication - requestInfo.options = _.extend(requestInfo.options, { - username: this._ntlmOptions.username, - password: this._ntlmOptions.password, - domain: this._ntlmOptions.domain, - workstation: this._ntlmOptions.workstation - }); - requestInfo.options.agent = httpClient.isSsl ? - new https.Agent({ keepAlive: true }) : - new http.Agent({ keepAlive: true }); - let self = this; - // The following pattern of sending the type1 message following immediately (in a setImmediate) is - // critical for the NTLM exchange to happen. If we removed setImmediate (or call in a different manner) - // the NTLM exchange will always fail with a 401. - this.sendType1Message(httpClient, requestInfo, objs, function (err, res) { - if (err) { - return finalCallback(err, null, null); - } - /// We have to readbody on the response before continuing otherwise there is a hang. - res.readBody().then(() => { - // It is critical that we have setImmediate here due to how connection requests are queued. - // If setImmediate is removed then the NTLM handshake will not work. - // setImmediate allows us to queue a second request on the same connection. If this second - // request is not queued on the connection when the first request finishes then node closes - // the connection. NTLM requires both requests to be on the same connection so we need this. - setImmediate(function () { - self.sendType3Message(httpClient, requestInfo, objs, res, finalCallback); - }); - }); - }); - } - // The following method is an adaptation of code found at https://github.com/SamDecrock/node-http-ntlm/blob/master/httpntlm.js - sendType1Message(httpClient, requestInfo, objs, finalCallback) { - const type1HexBuffer = ntlm.encodeType1(this._ntlmOptions.workstation, this._ntlmOptions.domain); - const type1msg = `NTLM ${type1HexBuffer.toString('base64')}`; - const type1options = { - headers: { - 'Connection': 'keep-alive', - 'Authorization': type1msg - }, - timeout: requestInfo.options.timeout || 0, - agent: requestInfo.httpModule, - }; - const type1info = {}; - type1info.httpModule = requestInfo.httpModule; - type1info.parsedUrl = requestInfo.parsedUrl; - type1info.options = _.extend(type1options, _.omit(requestInfo.options, 'headers')); - return httpClient.requestRawWithCallback(type1info, objs, finalCallback); - } - // The following method is an adaptation of code found at https://github.com/SamDecrock/node-http-ntlm/blob/master/httpntlm.js - sendType3Message(httpClient, requestInfo, objs, res, callback) { - if (!res.message.headers && !res.message.headers['www-authenticate']) { - throw new Error('www-authenticate not found on response of second request'); - } - /** - * Server will respond with challenge/nonce - * assigned to response's "WWW-AUTHENTICATE" header - * and should adhere to RegExp /^NTLM\s+(.+?)(,|\s+|$)/ - */ - const serverNonceRegex = /^NTLM\s+(.+?)(,|\s+|$)/; - const serverNonce = Buffer.from((res.message.headers['www-authenticate'].match(serverNonceRegex) || [])[1], 'base64'); - let type2msg; - /** - * Wrap decoding the Server's challenge/nonce in - * try-catch block to throw more comprehensive - * Error with clear message to consumer - */ - try { - type2msg = ntlm.decodeType2(serverNonce); - } - catch (error) { - throw new Error(`Decoding Server's Challenge to Obtain Type2Message failed with error: ${error.message}`); - } - const type3msg = ntlm.encodeType3(this._ntlmOptions.username, this._ntlmOptions.workstation, this._ntlmOptions.domain, type2msg, this._ntlmOptions.password).toString('base64'); - const type3options = { - headers: { - 'Authorization': `NTLM ${type3msg}`, - 'Connection': 'Close' - }, - agent: requestInfo.httpModule, - }; - const type3info = {}; - type3info.httpModule = requestInfo.httpModule; - type3info.parsedUrl = requestInfo.parsedUrl; - type3options.headers = _.extend(type3options.headers, requestInfo.options.headers); - type3info.options = _.extend(type3options, _.omit(requestInfo.options, 'headers')); - return httpClient.requestRawWithCallback(type3info, objs, callback); - } - } - exports.NtlmCredentialHandler = NtlmCredentialHandler; +webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: 'path', + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: 'domain', + defaultValue: null + } +]) + +webidl.converters.Cookie = webidl.dictionaryConverter([ + { + converter: webidl.converters.DOMString, + key: 'name' + }, + { + converter: webidl.converters.DOMString, + key: 'value' + }, + { + converter: webidl.nullableConverter((value) => { + if (typeof value === 'number') { + return webidl.converters['unsigned long long'](value) + } + + return new Date(value) + }), + key: 'expires', + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters['long long']), + key: 'maxAge', + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: 'domain', + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: 'path', + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: 'secure', + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: 'httpOnly', + defaultValue: null + }, + { + converter: webidl.converters.USVString, + key: 'sameSite', + allowedValues: ['Strict', 'Lax', 'None'] + }, + { + converter: webidl.sequenceConverter(webidl.converters.DOMString), + key: 'unparsed', + defaultValue: [] + } +]) + +module.exports = { + getCookies, + deleteCookie, + getSetCookies, + setCookie +} - /***/ -}), +/***/ }), -/***/ 7799: -/***/ ((__unused_webpack_module, exports) => { +/***/ 4408: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +"use strict"; + + +const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(663) +const { isCTLExcludingHtab } = __nccwpck_require__(3121) +const { collectASequenceOfCodePointsFast } = __nccwpck_require__(685) +const assert = __nccwpck_require__(9491) + +/** + * @description Parses the field-value attributes of a set-cookie header string. + * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 + * @param {string} header + * @returns if the header is invalid, null will be returned + */ +function parseSetCookie (header) { + // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F + // character (CTL characters excluding HTAB): Abort these steps and + // ignore the set-cookie-string entirely. + if (isCTLExcludingHtab(header)) { + return null + } + + let nameValuePair = '' + let unparsedAttributes = '' + let name = '' + let value = '' + + // 2. If the set-cookie-string contains a %x3B (";") character: + if (header.includes(';')) { + // 1. The name-value-pair string consists of the characters up to, + // but not including, the first %x3B (";"), and the unparsed- + // attributes consist of the remainder of the set-cookie-string + // (including the %x3B (";") in question). + const position = { position: 0 } + + nameValuePair = collectASequenceOfCodePointsFast(';', header, position) + unparsedAttributes = header.slice(position.position) + } else { + // Otherwise: + + // 1. The name-value-pair string consists of all the characters + // contained in the set-cookie-string, and the unparsed- + // attributes is the empty string. + nameValuePair = header + } + + // 3. If the name-value-pair string lacks a %x3D ("=") character, then + // the name string is empty, and the value string is the value of + // name-value-pair. + if (!nameValuePair.includes('=')) { + value = nameValuePair + } else { + // Otherwise, the name string consists of the characters up to, but + // not including, the first %x3D ("=") character, and the (possibly + // empty) value string consists of the characters after the first + // %x3D ("=") character. + const position = { position: 0 } + name = collectASequenceOfCodePointsFast( + '=', + nameValuePair, + position + ) + value = nameValuePair.slice(position.position + 1) + } + + // 4. Remove any leading or trailing WSP characters from the name + // string and the value string. + name = name.trim() + value = value.trim() + + // 5. If the sum of the lengths of the name string and the value string + // is more than 4096 octets, abort these steps and ignore the set- + // cookie-string entirely. + if (name.length + value.length > maxNameValuePairSize) { + return null + } + + // 6. The cookie-name is the name string, and the cookie-value is the + // value string. + return { + name, value, ...parseUnparsedAttributes(unparsedAttributes) + } +} - // Copyright (c) Microsoft. All rights reserved. - // Licensed under the MIT license. See LICENSE file in the project root for full license information. - Object.defineProperty(exports, "__esModule", ({ value: true })); - exports.PersonalAccessTokenCredentialHandler = void 0; - class PersonalAccessTokenCredentialHandler { - constructor(token, allowCrossOriginAuthentication) { - this.token = token; - this.allowCrossOriginAuthentication = allowCrossOriginAuthentication; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!this.origin) { - this.origin = options.host; - } - // If this is a redirection, don't set the Authorization header - if (this.origin === options.host || this.allowCrossOriginAuthentication) { - options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`; - } - options.headers['X-TFS-FedAuthRedirect'] = 'Suppress'; - } - // This handler cannot handle 401 - canHandleAuthentication(response) { - return false; - } - handleAuthentication(httpClient, requestInfo, objs) { - return null; - } - } - exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; +/** + * Parses the remaining attributes of a set-cookie header + * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 + * @param {string} unparsedAttributes + * @param {[Object.]={}} cookieAttributeList + */ +function parseUnparsedAttributes (unparsedAttributes, cookieAttributeList = {}) { + // 1. If the unparsed-attributes string is empty, skip the rest of + // these steps. + if (unparsedAttributes.length === 0) { + return cookieAttributeList + } + + // 2. Discard the first character of the unparsed-attributes (which + // will be a %x3B (";") character). + assert(unparsedAttributes[0] === ';') + unparsedAttributes = unparsedAttributes.slice(1) + + let cookieAv = '' + + // 3. If the remaining unparsed-attributes contains a %x3B (";") + // character: + if (unparsedAttributes.includes(';')) { + // 1. Consume the characters of the unparsed-attributes up to, but + // not including, the first %x3B (";") character. + cookieAv = collectASequenceOfCodePointsFast( + ';', + unparsedAttributes, + { position: 0 } + ) + unparsedAttributes = unparsedAttributes.slice(cookieAv.length) + } else { + // Otherwise: + + // 1. Consume the remainder of the unparsed-attributes. + cookieAv = unparsedAttributes + unparsedAttributes = '' + } + + // Let the cookie-av string be the characters consumed in this step. + + let attributeName = '' + let attributeValue = '' + + // 4. If the cookie-av string contains a %x3D ("=") character: + if (cookieAv.includes('=')) { + // 1. The (possibly empty) attribute-name string consists of the + // characters up to, but not including, the first %x3D ("=") + // character, and the (possibly empty) attribute-value string + // consists of the characters after the first %x3D ("=") + // character. + const position = { position: 0 } + + attributeName = collectASequenceOfCodePointsFast( + '=', + cookieAv, + position + ) + attributeValue = cookieAv.slice(position.position + 1) + } else { + // Otherwise: + + // 1. The attribute-name string consists of the entire cookie-av + // string, and the attribute-value string is empty. + attributeName = cookieAv + } + + // 5. Remove any leading or trailing WSP characters from the attribute- + // name string and the attribute-value string. + attributeName = attributeName.trim() + attributeValue = attributeValue.trim() + + // 6. If the attribute-value is longer than 1024 octets, ignore the + // cookie-av string and return to Step 1 of this algorithm. + if (attributeValue.length > maxAttributeValueSize) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + } + + // 7. Process the attribute-name and attribute-value according to the + // requirements in the following subsections. (Notice that + // attributes with unrecognized attribute-names are ignored.) + const attributeNameLowercase = attributeName.toLowerCase() + + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1 + // If the attribute-name case-insensitively matches the string + // "Expires", the user agent MUST process the cookie-av as follows. + if (attributeNameLowercase === 'expires') { + // 1. Let the expiry-time be the result of parsing the attribute-value + // as cookie-date (see Section 5.1.1). + const expiryTime = new Date(attributeValue) + + // 2. If the attribute-value failed to parse as a cookie date, ignore + // the cookie-av. + + cookieAttributeList.expires = expiryTime + } else if (attributeNameLowercase === 'max-age') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2 + // If the attribute-name case-insensitively matches the string "Max- + // Age", the user agent MUST process the cookie-av as follows. + + // 1. If the first character of the attribute-value is not a DIGIT or a + // "-" character, ignore the cookie-av. + const charCode = attributeValue.charCodeAt(0) + + if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + } + + // 2. If the remainder of attribute-value contains a non-DIGIT + // character, ignore the cookie-av. + if (!/^\d+$/.test(attributeValue)) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) + } + + // 3. Let delta-seconds be the attribute-value converted to an integer. + const deltaSeconds = Number(attributeValue) + + // 4. Let cookie-age-limit be the maximum age of the cookie (which + // SHOULD be 400 days or less, see Section 4.1.2.2). + + // 5. Set delta-seconds to the smaller of its present value and cookie- + // age-limit. + // deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs) + + // 6. If delta-seconds is less than or equal to zero (0), let expiry- + // time be the earliest representable date and time. Otherwise, let + // the expiry-time be the current date and time plus delta-seconds + // seconds. + // const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds + + // 7. Append an attribute to the cookie-attribute-list with an + // attribute-name of Max-Age and an attribute-value of expiry-time. + cookieAttributeList.maxAge = deltaSeconds + } else if (attributeNameLowercase === 'domain') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3 + // If the attribute-name case-insensitively matches the string "Domain", + // the user agent MUST process the cookie-av as follows. + + // 1. Let cookie-domain be the attribute-value. + let cookieDomain = attributeValue + + // 2. If cookie-domain starts with %x2E ("."), let cookie-domain be + // cookie-domain without its leading %x2E ("."). + if (cookieDomain[0] === '.') { + cookieDomain = cookieDomain.slice(1) + } + + // 3. Convert the cookie-domain to lower case. + cookieDomain = cookieDomain.toLowerCase() + + // 4. Append an attribute to the cookie-attribute-list with an + // attribute-name of Domain and an attribute-value of cookie-domain. + cookieAttributeList.domain = cookieDomain + } else if (attributeNameLowercase === 'path') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4 + // If the attribute-name case-insensitively matches the string "Path", + // the user agent MUST process the cookie-av as follows. + + // 1. If the attribute-value is empty or if the first character of the + // attribute-value is not %x2F ("/"): + let cookiePath = '' + if (attributeValue.length === 0 || attributeValue[0] !== '/') { + // 1. Let cookie-path be the default-path. + cookiePath = '/' + } else { + // Otherwise: + + // 1. Let cookie-path be the attribute-value. + cookiePath = attributeValue + } + + // 2. Append an attribute to the cookie-attribute-list with an + // attribute-name of Path and an attribute-value of cookie-path. + cookieAttributeList.path = cookiePath + } else if (attributeNameLowercase === 'secure') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5 + // If the attribute-name case-insensitively matches the string "Secure", + // the user agent MUST append an attribute to the cookie-attribute-list + // with an attribute-name of Secure and an empty attribute-value. + + cookieAttributeList.secure = true + } else if (attributeNameLowercase === 'httponly') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6 + // If the attribute-name case-insensitively matches the string + // "HttpOnly", the user agent MUST append an attribute to the cookie- + // attribute-list with an attribute-name of HttpOnly and an empty + // attribute-value. + + cookieAttributeList.httpOnly = true + } else if (attributeNameLowercase === 'samesite') { + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7 + // If the attribute-name case-insensitively matches the string + // "SameSite", the user agent MUST process the cookie-av as follows: + + // 1. Let enforcement be "Default". + let enforcement = 'Default' + + const attributeValueLowercase = attributeValue.toLowerCase() + // 2. If cookie-av's attribute-value is a case-insensitive match for + // "None", set enforcement to "None". + if (attributeValueLowercase.includes('none')) { + enforcement = 'None' + } + + // 3. If cookie-av's attribute-value is a case-insensitive match for + // "Strict", set enforcement to "Strict". + if (attributeValueLowercase.includes('strict')) { + enforcement = 'Strict' + } + + // 4. If cookie-av's attribute-value is a case-insensitive match for + // "Lax", set enforcement to "Lax". + if (attributeValueLowercase.includes('lax')) { + enforcement = 'Lax' + } + + // 5. Append an attribute to the cookie-attribute-list with an + // attribute-name of "SameSite" and an attribute-value of + // enforcement. + cookieAttributeList.sameSite = enforcement + } else { + cookieAttributeList.unparsed ??= [] + + cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`) + } + + // 8. Return to Step 1 of this algorithm. + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) +} + +module.exports = { + parseSetCookie, + parseUnparsedAttributes +} - /***/ -}), +/***/ }), -/***/ 2352: +/***/ 3121: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - var crypto = __nccwpck_require__(6113); +"use strict"; - function zeroextend(str, len) { - while (str.length < len) - str = '0' + str; - return (str); - } - /* - * Fix (odd) parity bits in a 64-bit DES key. - */ - function oddpar(buf) { - for (var j = 0; j < buf.length; j++) { - var par = 1; - for (var i = 1; i < 8; i++) { - par = (par + ((buf[j] >> i) & 1)) % 2; - } - buf[j] |= par & 1; - } - return buf; - } +const assert = __nccwpck_require__(9491) +const { kHeadersList } = __nccwpck_require__(2785) - /* - * Expand a 56-bit key buffer to the full 64-bits for DES. - * - * Based on code sample in: - * http://www.innovation.ch/personal/ronald/ntlm.html - */ - function expandkey(key56) { - var key64 = Buffer.alloc(8); - - key64[0] = key56[0] & 0xFE; - key64[1] = ((key56[0] << 7) & 0xFF) | (key56[1] >> 1); - key64[2] = ((key56[1] << 6) & 0xFF) | (key56[2] >> 2); - key64[3] = ((key56[2] << 5) & 0xFF) | (key56[3] >> 3); - key64[4] = ((key56[3] << 4) & 0xFF) | (key56[4] >> 4); - key64[5] = ((key56[4] << 3) & 0xFF) | (key56[5] >> 5); - key64[6] = ((key56[5] << 2) & 0xFF) | (key56[6] >> 6); - key64[7] = (key56[6] << 1) & 0xFF; - - return key64; - } +function isCTLExcludingHtab (value) { + if (value.length === 0) { + return false + } - /* - * Convert a binary string to a hex string - */ - function bintohex(bin) { - var buf = (Buffer.isBuffer(buf) ? buf : Buffer.from(bin, 'binary')); - var str = buf.toString('hex').toUpperCase(); - return zeroextend(str, 32); - } + for (const char of value) { + const code = char.charCodeAt(0) + if ( + (code >= 0x00 || code <= 0x08) || + (code >= 0x0A || code <= 0x1F) || + code === 0x7F + ) { + return false + } + } +} - module.exports.zeroextend = zeroextend; - module.exports.oddpar = oddpar; - module.exports.expandkey = expandkey; - module.exports.bintohex = bintohex; +/** + CHAR = + token = 1* + separators = "(" | ")" | "<" | ">" | "@" + | "," | ";" | ":" | "\" | <"> + | "/" | "[" | "]" | "?" | "=" + | "{" | "}" | SP | HT + * @param {string} name + */ +function validateCookieName (name) { + for (const char of name) { + const code = char.charCodeAt(0) + + if ( + (code <= 0x20 || code > 0x7F) || + char === '(' || + char === ')' || + char === '>' || + char === '<' || + char === '@' || + char === ',' || + char === ';' || + char === ':' || + char === '\\' || + char === '"' || + char === '/' || + char === '[' || + char === ']' || + char === '?' || + char === '=' || + char === '{' || + char === '}' + ) { + throw new Error('Invalid cookie name') + } + } +} +/** + cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE ) + cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E + ; US-ASCII characters excluding CTLs, + ; whitespace DQUOTE, comma, semicolon, + ; and backslash + * @param {string} value + */ +function validateCookieValue (value) { + for (const char of value) { + const code = char.charCodeAt(0) + + if ( + code < 0x21 || // exclude CTLs (0-31) + code === 0x22 || + code === 0x2C || + code === 0x3B || + code === 0x5C || + code > 0x7E // non-ascii + ) { + throw new Error('Invalid header value') + } + } +} - /***/ -}), +/** + * path-value = + * @param {string} path + */ +function validateCookiePath (path) { + for (const char of path) { + const code = char.charCodeAt(0) + + if (code < 0x21 || char === ';') { + throw new Error('Invalid cookie path') + } + } +} -/***/ 2673: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +/** + * I have no idea why these values aren't allowed to be honest, + * but Deno tests these. - Khafra + * @param {string} domain + */ +function validateCookieDomain (domain) { + if ( + domain.startsWith('-') || + domain.endsWith('.') || + domain.endsWith('-') + ) { + throw new Error('Invalid cookie domain') + } +} - var log = console.log; - var crypto = __nccwpck_require__(6113); - var $ = __nccwpck_require__(2352); - var lmhashbuf = (__nccwpck_require__(8657).lmhashbuf); - var nthashbuf = (__nccwpck_require__(8657).nthashbuf); +/** + * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1 + * @param {number|Date} date + IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT + ; fixed length/zone/capitalization subset of the format + ; see Section 3.3 of [RFC5322] + + day-name = %x4D.6F.6E ; "Mon", case-sensitive + / %x54.75.65 ; "Tue", case-sensitive + / %x57.65.64 ; "Wed", case-sensitive + / %x54.68.75 ; "Thu", case-sensitive + / %x46.72.69 ; "Fri", case-sensitive + / %x53.61.74 ; "Sat", case-sensitive + / %x53.75.6E ; "Sun", case-sensitive + date1 = day SP month SP year + ; e.g., 02 Jun 1982 + + day = 2DIGIT + month = %x4A.61.6E ; "Jan", case-sensitive + / %x46.65.62 ; "Feb", case-sensitive + / %x4D.61.72 ; "Mar", case-sensitive + / %x41.70.72 ; "Apr", case-sensitive + / %x4D.61.79 ; "May", case-sensitive + / %x4A.75.6E ; "Jun", case-sensitive + / %x4A.75.6C ; "Jul", case-sensitive + / %x41.75.67 ; "Aug", case-sensitive + / %x53.65.70 ; "Sep", case-sensitive + / %x4F.63.74 ; "Oct", case-sensitive + / %x4E.6F.76 ; "Nov", case-sensitive + / %x44.65.63 ; "Dec", case-sensitive + year = 4DIGIT + + GMT = %x47.4D.54 ; "GMT", case-sensitive + + time-of-day = hour ":" minute ":" second + ; 00:00:00 - 23:59:60 (leap second) + + hour = 2DIGIT + minute = 2DIGIT + second = 2DIGIT + */ +function toIMFDate (date) { + if (typeof date === 'number') { + date = new Date(date) + } + + const days = [ + 'Sun', 'Mon', 'Tue', 'Wed', + 'Thu', 'Fri', 'Sat' + ] + + const months = [ + 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' + ] + + const dayName = days[date.getUTCDay()] + const day = date.getUTCDate().toString().padStart(2, '0') + const month = months[date.getUTCMonth()] + const year = date.getUTCFullYear() + const hour = date.getUTCHours().toString().padStart(2, '0') + const minute = date.getUTCMinutes().toString().padStart(2, '0') + const second = date.getUTCSeconds().toString().padStart(2, '0') + + return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT` +} - var desjs = __nccwpck_require__(8743); +/** + max-age-av = "Max-Age=" non-zero-digit *DIGIT + ; In practice, both expires-av and max-age-av + ; are limited to dates representable by the + ; user agent. + * @param {number} maxAge + */ +function validateCookieMaxAge (maxAge) { + if (maxAge < 0) { + throw new Error('Invalid cookie max-age') + } +} - function encodeType1(hostname, ntdomain) { - hostname = hostname.toUpperCase(); - ntdomain = ntdomain.toUpperCase(); - var hostnamelen = Buffer.byteLength(hostname, 'ascii'); - var ntdomainlen = Buffer.byteLength(ntdomain, 'ascii'); +/** + * @see https://www.rfc-editor.org/rfc/rfc6265#section-4.1.1 + * @param {import('./index').Cookie} cookie + */ +function stringify (cookie) { + if (cookie.name.length === 0) { + return null + } + + validateCookieName(cookie.name) + validateCookieValue(cookie.value) + + const out = [`${cookie.name}=${cookie.value}`] + + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.1 + // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.2 + if (cookie.name.startsWith('__Secure-')) { + cookie.secure = true + } + + if (cookie.name.startsWith('__Host-')) { + cookie.secure = true + cookie.domain = null + cookie.path = '/' + } + + if (cookie.secure) { + out.push('Secure') + } + + if (cookie.httpOnly) { + out.push('HttpOnly') + } + + if (typeof cookie.maxAge === 'number') { + validateCookieMaxAge(cookie.maxAge) + out.push(`Max-Age=${cookie.maxAge}`) + } + + if (cookie.domain) { + validateCookieDomain(cookie.domain) + out.push(`Domain=${cookie.domain}`) + } + + if (cookie.path) { + validateCookiePath(cookie.path) + out.push(`Path=${cookie.path}`) + } + + if (cookie.expires && cookie.expires.toString() !== 'Invalid Date') { + out.push(`Expires=${toIMFDate(cookie.expires)}`) + } + + if (cookie.sameSite) { + out.push(`SameSite=${cookie.sameSite}`) + } + + for (const part of cookie.unparsed) { + if (!part.includes('=')) { + throw new Error('Invalid unparsed') + } + + const [key, ...value] = part.split('=') + + out.push(`${key.trim()}=${value.join('=')}`) + } + + return out.join('; ') +} - var pos = 0; - var buf = Buffer.alloc(32 + hostnamelen + ntdomainlen); +let kHeadersListNode - buf.write('NTLMSSP', pos, 7, 'ascii'); // byte protocol[8]; - pos += 7; - buf.writeUInt8(0, pos); - pos++; +function getHeadersList (headers) { + if (headers[kHeadersList]) { + return headers[kHeadersList] + } - buf.writeUInt8(0x01, pos); // byte type; - pos++; + if (!kHeadersListNode) { + kHeadersListNode = Object.getOwnPropertySymbols(headers).find( + (symbol) => symbol.description === 'headers list' + ) - buf.fill(0x00, pos, pos + 3); // byte zero[3]; - pos += 3; + assert(kHeadersListNode, 'Headers cannot be parsed') + } - buf.writeUInt16LE(0xb203, pos); // short flags; - pos += 2; + const headersList = headers[kHeadersListNode] + assert(headersList) - buf.fill(0x00, pos, pos + 2); // byte zero[2]; - pos += 2; + return headersList +} - buf.writeUInt16LE(ntdomainlen, pos); // short dom_len; - pos += 2; - buf.writeUInt16LE(ntdomainlen, pos); // short dom_len; - pos += 2; +module.exports = { + isCTLExcludingHtab, + stringify, + getHeadersList +} - var ntdomainoff = 0x20 + hostnamelen; - buf.writeUInt16LE(ntdomainoff, pos); // short dom_off; - pos += 2; - buf.fill(0x00, pos, pos + 2); // byte zero[2]; - pos += 2; +/***/ }), - buf.writeUInt16LE(hostnamelen, pos); // short host_len; - pos += 2; - buf.writeUInt16LE(hostnamelen, pos); // short host_len; - pos += 2; +/***/ 2067: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - buf.writeUInt16LE(0x20, pos); // short host_off; - pos += 2; +"use strict"; + + +const net = __nccwpck_require__(1808) +const assert = __nccwpck_require__(9491) +const util = __nccwpck_require__(3983) +const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(8045) + +let tls // include tls conditionally since it is not always available + +// TODO: session re-use does not wait for the first +// connection to resolve the session and might therefore +// resolve the same servername multiple times even when +// re-use is enabled. + +let SessionCache +// FIXME: remove workaround when the Node bug is fixed +// https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 +if (global.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) { + SessionCache = class WeakSessionCache { + constructor (maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions + this._sessionCache = new Map() + this._sessionRegistry = new global.FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return + } + + const ref = this._sessionCache.get(key) + if (ref !== undefined && ref.deref() === undefined) { + this._sessionCache.delete(key) + } + }) + } + + get (sessionKey) { + const ref = this._sessionCache.get(sessionKey) + return ref ? ref.deref() : null + } + + set (sessionKey, session) { + if (this._maxCachedSessions === 0) { + return + } + + this._sessionCache.set(sessionKey, new WeakRef(session)) + this._sessionRegistry.register(session, sessionKey) + } + } +} else { + SessionCache = class SimpleSessionCache { + constructor (maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions + this._sessionCache = new Map() + } + + get (sessionKey) { + return this._sessionCache.get(sessionKey) + } + + set (sessionKey, session) { + if (this._maxCachedSessions === 0) { + return + } + + if (this._sessionCache.size >= this._maxCachedSessions) { + // remove the oldest session + const { value: oldestKey } = this._sessionCache.keys().next() + this._sessionCache.delete(oldestKey) + } + + this._sessionCache.set(sessionKey, session) + } + } +} - buf.fill(0x00, pos, pos + 2); // byte zero[2]; - pos += 2; +function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero') + } + + const options = { path: socketPath, ...opts } + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions) + timeout = timeout == null ? 10e3 : timeout + allowH2 = allowH2 != null ? allowH2 : false + return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket + if (protocol === 'https:') { + if (!tls) { + tls = __nccwpck_require__(4404) + } + servername = servername || options.servername || util.getServerName(host) || null + + const sessionKey = servername || hostname + const session = sessionCache.get(sessionKey) || null + + assert(sessionKey) + + socket = tls.connect({ + highWaterMark: 16384, // TLS in node can't have bigger HWM anyway... + ...options, + servername, + session, + localAddress, + // TODO(HTTP/2): Add support for h2c + ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'], + socket: httpSocket, // upgrade socket connection + port: port || 443, + host: hostname + }) + + socket + .on('session', function (session) { + // TODO (fix): Can a session become invalid once established? Don't think so? + sessionCache.set(sessionKey, session) + }) + } else { + assert(!httpSocket, 'httpSocket can only be sent on TLS update') + socket = net.connect({ + highWaterMark: 64 * 1024, // Same as nodejs fs streams. + ...options, + localAddress, + port: port || 80, + host: hostname + }) + } + + // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket + if (options.keepAlive == null || options.keepAlive) { + const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay + socket.setKeepAlive(true, keepAliveInitialDelay) + } + + const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout) + + socket + .setNoDelay(true) + .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () { + cancelTimeout() + + if (callback) { + const cb = callback + callback = null + cb(null, this) + } + }) + .on('error', function (err) { + cancelTimeout() + + if (callback) { + const cb = callback + callback = null + cb(err) + } + }) + + return socket + } +} - buf.write(hostname, 0x20, hostnamelen, 'ascii'); - buf.write(ntdomain, ntdomainoff, ntdomainlen, 'ascii'); +function setupTimeout (onConnectTimeout, timeout) { + if (!timeout) { + return () => {} + } + + let s1 = null + let s2 = null + const timeoutId = setTimeout(() => { + // setImmediate is added to make sure that we priotorise socket error events over timeouts + s1 = setImmediate(() => { + if (process.platform === 'win32') { + // Windows needs an extra setImmediate probably due to implementation differences in the socket logic + s2 = setImmediate(() => onConnectTimeout()) + } else { + onConnectTimeout() + } + }) + }, timeout) + return () => { + clearTimeout(timeoutId) + clearImmediate(s1) + clearImmediate(s2) + } +} - return buf; - } +function onConnectTimeout (socket) { + util.destroy(socket, new ConnectTimeoutError()) +} +module.exports = buildConnector - /* - * - */ - function decodeType2(buf) { - var proto = buf.toString('ascii', 0, 7); - if (buf[7] !== 0x00 || proto !== 'NTLMSSP') - throw new Error('magic was not NTLMSSP'); - var type = buf.readUInt8(8); - if (type !== 0x02) - throw new Error('message was not NTLMSSP type 0x02'); +/***/ }), - //var msg_len = buf.readUInt16LE(16); +/***/ 4462: +/***/ ((module) => { - //var flags = buf.readUInt16LE(20); +"use strict"; + + +/** @type {Record} */ +const headerNameLowerCasedRecord = {} + +// https://developer.mozilla.org/docs/Web/HTTP/Headers +const wellknownHeaderNames = [ + 'Accept', + 'Accept-Encoding', + 'Accept-Language', + 'Accept-Ranges', + 'Access-Control-Allow-Credentials', + 'Access-Control-Allow-Headers', + 'Access-Control-Allow-Methods', + 'Access-Control-Allow-Origin', + 'Access-Control-Expose-Headers', + 'Access-Control-Max-Age', + 'Access-Control-Request-Headers', + 'Access-Control-Request-Method', + 'Age', + 'Allow', + 'Alt-Svc', + 'Alt-Used', + 'Authorization', + 'Cache-Control', + 'Clear-Site-Data', + 'Connection', + 'Content-Disposition', + 'Content-Encoding', + 'Content-Language', + 'Content-Length', + 'Content-Location', + 'Content-Range', + 'Content-Security-Policy', + 'Content-Security-Policy-Report-Only', + 'Content-Type', + 'Cookie', + 'Cross-Origin-Embedder-Policy', + 'Cross-Origin-Opener-Policy', + 'Cross-Origin-Resource-Policy', + 'Date', + 'Device-Memory', + 'Downlink', + 'ECT', + 'ETag', + 'Expect', + 'Expect-CT', + 'Expires', + 'Forwarded', + 'From', + 'Host', + 'If-Match', + 'If-Modified-Since', + 'If-None-Match', + 'If-Range', + 'If-Unmodified-Since', + 'Keep-Alive', + 'Last-Modified', + 'Link', + 'Location', + 'Max-Forwards', + 'Origin', + 'Permissions-Policy', + 'Pragma', + 'Proxy-Authenticate', + 'Proxy-Authorization', + 'RTT', + 'Range', + 'Referer', + 'Referrer-Policy', + 'Refresh', + 'Retry-After', + 'Sec-WebSocket-Accept', + 'Sec-WebSocket-Extensions', + 'Sec-WebSocket-Key', + 'Sec-WebSocket-Protocol', + 'Sec-WebSocket-Version', + 'Server', + 'Server-Timing', + 'Service-Worker-Allowed', + 'Service-Worker-Navigation-Preload', + 'Set-Cookie', + 'SourceMap', + 'Strict-Transport-Security', + 'Supports-Loading-Mode', + 'TE', + 'Timing-Allow-Origin', + 'Trailer', + 'Transfer-Encoding', + 'Upgrade', + 'Upgrade-Insecure-Requests', + 'User-Agent', + 'Vary', + 'Via', + 'WWW-Authenticate', + 'X-Content-Type-Options', + 'X-DNS-Prefetch-Control', + 'X-Frame-Options', + 'X-Permitted-Cross-Domain-Policies', + 'X-Powered-By', + 'X-Requested-With', + 'X-XSS-Protection' +] + +for (let i = 0; i < wellknownHeaderNames.length; ++i) { + const key = wellknownHeaderNames[i] + const lowerCasedKey = key.toLowerCase() + headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = + lowerCasedKey +} - var nonce = buf.slice(24, 32); - return nonce; - } +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. +Object.setPrototypeOf(headerNameLowerCasedRecord, null) - function encodeType3(username, hostname, ntdomain, nonce, password) { - hostname = hostname.toUpperCase(); - ntdomain = ntdomain.toUpperCase(); - - var lmh = Buffer.alloc(21); - lmhashbuf(password).copy(lmh); - lmh.fill(0x00, 16); // null pad to 21 bytes - var nth = Buffer.alloc(21); - nthashbuf(password).copy(nth); - nth.fill(0x00, 16); // null pad to 21 bytes - - var lmr = makeResponse(lmh, nonce); - var ntr = makeResponse(nth, nonce); - - var usernamelen = Buffer.byteLength(username, 'ucs2'); - var hostnamelen = Buffer.byteLength(hostname, 'ucs2'); - var ntdomainlen = Buffer.byteLength(ntdomain, 'ucs2'); - var lmrlen = 0x18; - var ntrlen = 0x18; - - var ntdomainoff = 0x40; - var usernameoff = ntdomainoff + ntdomainlen; - var hostnameoff = usernameoff + usernamelen; - var lmroff = hostnameoff + hostnamelen; - var ntroff = lmroff + lmrlen; - - var pos = 0; - var msg_len = 64 + ntdomainlen + usernamelen + hostnamelen + lmrlen + ntrlen; - var buf = Buffer.alloc(msg_len); - - buf.write('NTLMSSP', pos, 7, 'ascii'); // byte protocol[8]; - pos += 7; - buf.writeUInt8(0, pos); - pos++; - - buf.writeUInt8(0x03, pos); // byte type; - pos++; - - buf.fill(0x00, pos, pos + 3); // byte zero[3]; - pos += 3; - - buf.writeUInt16LE(lmrlen, pos); // short lm_resp_len; - pos += 2; - buf.writeUInt16LE(lmrlen, pos); // short lm_resp_len; - pos += 2; - buf.writeUInt16LE(lmroff, pos); // short lm_resp_off; - pos += 2; - buf.fill(0x00, pos, pos + 2); // byte zero[2]; - pos += 2; - - buf.writeUInt16LE(ntrlen, pos); // short nt_resp_len; - pos += 2; - buf.writeUInt16LE(ntrlen, pos); // short nt_resp_len; - pos += 2; - buf.writeUInt16LE(ntroff, pos); // short nt_resp_off; - pos += 2; - buf.fill(0x00, pos, pos + 2); // byte zero[2]; - pos += 2; - - buf.writeUInt16LE(ntdomainlen, pos); // short dom_len; - pos += 2; - buf.writeUInt16LE(ntdomainlen, pos); // short dom_len; - pos += 2; - buf.writeUInt16LE(ntdomainoff, pos); // short dom_off; - pos += 2; - buf.fill(0x00, pos, pos + 2); // byte zero[2]; - pos += 2; - - buf.writeUInt16LE(usernamelen, pos); // short user_len; - pos += 2; - buf.writeUInt16LE(usernamelen, pos); // short user_len; - pos += 2; - buf.writeUInt16LE(usernameoff, pos); // short user_off; - pos += 2; - buf.fill(0x00, pos, pos + 2); // byte zero[2]; - pos += 2; - - buf.writeUInt16LE(hostnamelen, pos); // short host_len; - pos += 2; - buf.writeUInt16LE(hostnamelen, pos); // short host_len; - pos += 2; - buf.writeUInt16LE(hostnameoff, pos); // short host_off; - pos += 2; - buf.fill(0x00, pos, pos + 6); // byte zero[6]; - pos += 6; - - buf.writeUInt16LE(msg_len, pos); // short msg_len; - pos += 2; - buf.fill(0x00, pos, pos + 2); // byte zero[2]; - pos += 2; - - buf.writeUInt16LE(0x8201, pos); // short flags; - pos += 2; - buf.fill(0x00, pos, pos + 2); // byte zero[2]; - pos += 2; - - buf.write(ntdomain, ntdomainoff, ntdomainlen, 'ucs2'); - buf.write(username, usernameoff, usernamelen, 'ucs2'); - buf.write(hostname, hostnameoff, hostnamelen, 'ucs2'); - lmr.copy(buf, lmroff, 0, lmrlen); - ntr.copy(buf, ntroff, 0, ntrlen); - - return buf; - } +module.exports = { + wellknownHeaderNames, + headerNameLowerCasedRecord +} - function makeResponse(hash, nonce) { - var out = Buffer.alloc(24); - for (var i = 0; i < 3; i++) { - var keybuf = $.oddpar($.expandkey(hash.slice(i * 7, i * 7 + 7))); +/***/ }), - var des = desjs.DES.create({ type: 'encrypt', key: keybuf }); - var magicKey = Buffer.from(nonce.toString('binary')); - var insertBuff = Buffer.from(des.update(magicKey)); +/***/ 8045: +/***/ ((module) => { - out.fill(insertBuff, i * 8, i * 8 + 8, 'binary'); +"use strict"; - } - return out; - } - exports.encodeType1 = encodeType1; - exports.decodeType2 = decodeType2; - exports.encodeType3 = encodeType3; +class UndiciError extends Error { + constructor (message) { + super(message) + this.name = 'UndiciError' + this.code = 'UND_ERR' + } +} - // Convenience methods. +class ConnectTimeoutError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, ConnectTimeoutError) + this.name = 'ConnectTimeoutError' + this.message = message || 'Connect Timeout Error' + this.code = 'UND_ERR_CONNECT_TIMEOUT' + } +} - exports.challengeHeader = function (hostname, domain) { - return 'NTLM ' + exports.encodeType1(hostname, domain).toString('base64'); - }; +class HeadersTimeoutError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, HeadersTimeoutError) + this.name = 'HeadersTimeoutError' + this.message = message || 'Headers Timeout Error' + this.code = 'UND_ERR_HEADERS_TIMEOUT' + } +} - exports.responseHeader = function (res, url, domain, username, password) { - var serverNonce = Buffer.from((res.headers['www-authenticate'].match(/^NTLM\s+(.+?)(,|\s+|$)/) || [])[1], 'base64'); - var hostname = (__nccwpck_require__(7310).parse)(url).hostname; - return 'NTLM ' + exports.encodeType3(username, hostname, domain, exports.decodeType2(serverNonce), password).toString('base64') - }; +class HeadersOverflowError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, HeadersOverflowError) + this.name = 'HeadersOverflowError' + this.message = message || 'Headers Overflow Error' + this.code = 'UND_ERR_HEADERS_OVERFLOW' + } +} - // Import smbhash module. +class BodyTimeoutError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, BodyTimeoutError) + this.name = 'BodyTimeoutError' + this.message = message || 'Body Timeout Error' + this.code = 'UND_ERR_BODY_TIMEOUT' + } +} - exports.smbhash = __nccwpck_require__(8657); +class ResponseStatusCodeError extends UndiciError { + constructor (message, statusCode, headers, body) { + super(message) + Error.captureStackTrace(this, ResponseStatusCodeError) + this.name = 'ResponseStatusCodeError' + this.message = message || 'Response Status Code Error' + this.code = 'UND_ERR_RESPONSE_STATUS_CODE' + this.body = body + this.status = statusCode + this.statusCode = statusCode + this.headers = headers + } +} +class InvalidArgumentError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, InvalidArgumentError) + this.name = 'InvalidArgumentError' + this.message = message || 'Invalid Argument Error' + this.code = 'UND_ERR_INVALID_ARG' + } +} - /***/ -}), +class InvalidReturnValueError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, InvalidReturnValueError) + this.name = 'InvalidReturnValueError' + this.message = message || 'Invalid Return Value Error' + this.code = 'UND_ERR_INVALID_RETURN_VALUE' + } +} -/***/ 8657: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +class RequestAbortedError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, RequestAbortedError) + this.name = 'AbortError' + this.message = message || 'Request aborted' + this.code = 'UND_ERR_ABORTED' + } +} - var $ = __nccwpck_require__(2352); - - var jsmd4 = __nccwpck_require__(561); - var desjs = __nccwpck_require__(8743); - - /* - * Generate the LM Hash - */ - function lmhashbuf(inputstr) { - /* ASCII --> uppercase */ - var x = inputstr.substring(0, 14).toUpperCase(); - var xl = Buffer.byteLength(x, 'ascii'); - - /* null pad to 14 bytes */ - var y = Buffer.alloc(14); - y.write(x, 0, xl, 'ascii'); - y.fill(0, xl); - - /* insert odd parity bits in key */ - var halves = [ - $.oddpar($.expandkey(y.slice(0, 7))), - $.oddpar($.expandkey(y.slice(7, 14))) - ]; - - /* DES encrypt magic number "KGS!@#$%" to two - * 8-byte ciphertexts, (ECB, no padding) - */ - var buf = Buffer.alloc(16); - var pos = 0; - var cts = halves.forEach(function (z) { - var des = desjs.DES.create({ type: 'encrypt', key: z }); - var magicKey = Buffer.from('KGS!@#$%', 'ascii'); - var insertBuff = Buffer.from(des.update(magicKey)); - buf.fill(insertBuff, pos, pos + 8, 'binary'); - pos += 8; - }); +class InformationalError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, InformationalError) + this.name = 'InformationalError' + this.message = message || 'Request information' + this.code = 'UND_ERR_INFO' + } +} - /* concat the two ciphertexts to form 16byte value, - * the LM hash */ - return buf; - } +class RequestContentLengthMismatchError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, RequestContentLengthMismatchError) + this.name = 'RequestContentLengthMismatchError' + this.message = message || 'Request body length does not match content-length header' + this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH' + } +} - function nthashbuf(str) { - /* take MD4 hash of UCS-2 encoded password */ - var ucs2 = Buffer.from(str, 'ucs2'); - var md4 = jsmd4.create(); - md4.update(ucs2); - return Buffer.from(md4.digest('binary'), 'binary'); - } +class ResponseContentLengthMismatchError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, ResponseContentLengthMismatchError) + this.name = 'ResponseContentLengthMismatchError' + this.message = message || 'Response body length does not match content-length header' + this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH' + } +} - function lmhash(is) { - return $.bintohex(lmhashbuf(is)); - } +class ClientDestroyedError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, ClientDestroyedError) + this.name = 'ClientDestroyedError' + this.message = message || 'The client is destroyed' + this.code = 'UND_ERR_DESTROYED' + } +} - function nthash(is) { - return $.bintohex(nthashbuf(is)); - } +class ClientClosedError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, ClientClosedError) + this.name = 'ClientClosedError' + this.message = message || 'The client is closed' + this.code = 'UND_ERR_CLOSED' + } +} - module.exports.nthashbuf = nthashbuf; - module.exports.lmhashbuf = lmhashbuf; +class SocketError extends UndiciError { + constructor (message, socket) { + super(message) + Error.captureStackTrace(this, SocketError) + this.name = 'SocketError' + this.message = message || 'Socket error' + this.code = 'UND_ERR_SOCKET' + this.socket = socket + } +} - module.exports.nthash = nthash; - module.exports.lmhash = lmhash; +class NotSupportedError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, NotSupportedError) + this.name = 'NotSupportedError' + this.message = message || 'Not supported error' + this.code = 'UND_ERR_NOT_SUPPORTED' + } +} +class BalancedPoolMissingUpstreamError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, NotSupportedError) + this.name = 'MissingUpstreamError' + this.message = message || 'No upstream has been added to the BalancedPool' + this.code = 'UND_ERR_BPL_MISSING_UPSTREAM' + } +} - /***/ -}), +class HTTPParserError extends Error { + constructor (message, code, data) { + super(message) + Error.captureStackTrace(this, HTTPParserError) + this.name = 'HTTPParserError' + this.code = code ? `HPE_${code}` : undefined + this.data = data ? data.toString() : undefined + } +} -/***/ 1773: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +class ResponseExceededMaxSizeError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, ResponseExceededMaxSizeError) + this.name = 'ResponseExceededMaxSizeError' + this.message = message || 'Response content exceeded max size' + this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE' + } +} - "use strict"; - - - const Client = __nccwpck_require__(3598) - const Dispatcher = __nccwpck_require__(412) - const errors = __nccwpck_require__(8045) - const Pool = __nccwpck_require__(4634) - const BalancedPool = __nccwpck_require__(7931) - const Agent = __nccwpck_require__(7890) - const util = __nccwpck_require__(3983) - const { InvalidArgumentError } = errors - const api = __nccwpck_require__(4059) - const buildConnector = __nccwpck_require__(2067) - const MockClient = __nccwpck_require__(8687) - const MockAgent = __nccwpck_require__(6771) - const MockPool = __nccwpck_require__(6193) - const mockErrors = __nccwpck_require__(888) - const ProxyAgent = __nccwpck_require__(7858) - const RetryHandler = __nccwpck_require__(2286) - const { getGlobalDispatcher, setGlobalDispatcher } = __nccwpck_require__(1892) - const DecoratorHandler = __nccwpck_require__(6930) - const RedirectHandler = __nccwpck_require__(2860) - const createRedirectInterceptor = __nccwpck_require__(8861) - - let hasCrypto - try { - __nccwpck_require__(6113) - hasCrypto = true - } catch { - hasCrypto = false - } +class RequestRetryError extends UndiciError { + constructor (message, code, { headers, data }) { + super(message) + Error.captureStackTrace(this, RequestRetryError) + this.name = 'RequestRetryError' + this.message = message || 'Request retry error' + this.code = 'UND_ERR_REQ_RETRY' + this.statusCode = code + this.data = data + this.headers = headers + } +} - Object.assign(Dispatcher.prototype, api) +module.exports = { + HTTPParserError, + UndiciError, + HeadersTimeoutError, + HeadersOverflowError, + BodyTimeoutError, + RequestContentLengthMismatchError, + ConnectTimeoutError, + ResponseStatusCodeError, + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError, + ClientDestroyedError, + ClientClosedError, + InformationalError, + SocketError, + NotSupportedError, + ResponseContentLengthMismatchError, + BalancedPoolMissingUpstreamError, + ResponseExceededMaxSizeError, + RequestRetryError +} - module.exports.Dispatcher = Dispatcher - module.exports.Client = Client - module.exports.Pool = Pool - module.exports.BalancedPool = BalancedPool - module.exports.Agent = Agent - module.exports.ProxyAgent = ProxyAgent - module.exports.RetryHandler = RetryHandler - module.exports.DecoratorHandler = DecoratorHandler - module.exports.RedirectHandler = RedirectHandler - module.exports.createRedirectInterceptor = createRedirectInterceptor +/***/ }), - module.exports.buildConnector = buildConnector - module.exports.errors = errors +/***/ 2905: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - function makeDispatcher(fn) { - return (url, opts, handler) => { - if (typeof opts === 'function') { - handler = opts - opts = null - } +"use strict"; + + +const { + InvalidArgumentError, + NotSupportedError +} = __nccwpck_require__(8045) +const assert = __nccwpck_require__(9491) +const { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = __nccwpck_require__(2785) +const util = __nccwpck_require__(3983) + +// tokenRegExp and headerCharRegex have been lifted from +// https://github.com/nodejs/node/blob/main/lib/_http_common.js + +/** + * Verifies that the given val is a valid HTTP token + * per the rules defined in RFC 7230 + * See https://tools.ietf.org/html/rfc7230#section-3.2.6 + */ +const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/ + +/** + * Matches if val contains an invalid field-vchar + * field-value = *( field-content / obs-fold ) + * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] + * field-vchar = VCHAR / obs-text + */ +const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/ + +// Verifies that a given path is valid does not contain control chars \x00 to \x20 +const invalidPathRegex = /[^\u0021-\u00ff]/ + +const kHandler = Symbol('handler') + +const channels = {} + +let extractBody + +try { + const diagnosticsChannel = __nccwpck_require__(7643) + channels.create = diagnosticsChannel.channel('undici:request:create') + channels.bodySent = diagnosticsChannel.channel('undici:request:bodySent') + channels.headers = diagnosticsChannel.channel('undici:request:headers') + channels.trailers = diagnosticsChannel.channel('undici:request:trailers') + channels.error = diagnosticsChannel.channel('undici:request:error') +} catch { + channels.create = { hasSubscribers: false } + channels.bodySent = { hasSubscribers: false } + channels.headers = { hasSubscribers: false } + channels.trailers = { hasSubscribers: false } + channels.error = { hasSubscribers: false } +} - if (!url || (typeof url !== 'string' && typeof url !== 'object' && !(url instanceof URL))) { - throw new InvalidArgumentError('invalid url') - } +class Request { + constructor (origin, { + path, + method, + body, + headers, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + throwOnError, + expectContinue + }, handler) { + if (typeof path !== 'string') { + throw new InvalidArgumentError('path must be a string') + } else if ( + path[0] !== '/' && + !(path.startsWith('http://') || path.startsWith('https://')) && + method !== 'CONNECT' + ) { + throw new InvalidArgumentError('path must be an absolute URL or start with a slash') + } else if (invalidPathRegex.exec(path) !== null) { + throw new InvalidArgumentError('invalid request path') + } + + if (typeof method !== 'string') { + throw new InvalidArgumentError('method must be a string') + } else if (tokenRegExp.exec(method) === null) { + throw new InvalidArgumentError('invalid request method') + } + + if (upgrade && typeof upgrade !== 'string') { + throw new InvalidArgumentError('upgrade must be a string') + } + + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError('invalid headersTimeout') + } + + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError('invalid bodyTimeout') + } + + if (reset != null && typeof reset !== 'boolean') { + throw new InvalidArgumentError('invalid reset') + } + + if (expectContinue != null && typeof expectContinue !== 'boolean') { + throw new InvalidArgumentError('invalid expectContinue') + } + + this.headersTimeout = headersTimeout + + this.bodyTimeout = bodyTimeout + + this.throwOnError = throwOnError === true + + this.method = method + + this.abort = null + + if (body == null) { + this.body = null + } else if (util.isStream(body)) { + this.body = body + + const rState = this.body._readableState + if (!rState || !rState.autoDestroy) { + this.endHandler = function autoDestroy () { + util.destroy(this) + } + this.body.on('end', this.endHandler) + } + + this.errorHandler = err => { + if (this.abort) { + this.abort(err) + } else { + this.error = err + } + } + this.body.on('error', this.errorHandler) + } else if (util.isBuffer(body)) { + this.body = body.byteLength ? body : null + } else if (ArrayBuffer.isView(body)) { + this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null + } else if (body instanceof ArrayBuffer) { + this.body = body.byteLength ? Buffer.from(body) : null + } else if (typeof body === 'string') { + this.body = body.length ? Buffer.from(body) : null + } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { + this.body = body + } else { + throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable') + } + + this.completed = false + + this.aborted = false + + this.upgrade = upgrade || null + + this.path = query ? util.buildURL(path, query) : path + + this.origin = origin + + this.idempotent = idempotent == null + ? method === 'HEAD' || method === 'GET' + : idempotent + + this.blocking = blocking == null ? false : blocking + + this.reset = reset == null ? null : reset + + this.host = null + + this.contentLength = null + + this.contentType = null + + this.headers = '' + + // Only for H2 + this.expectContinue = expectContinue != null ? expectContinue : false + + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError('headers array must be even') + } + for (let i = 0; i < headers.length; i += 2) { + processHeader(this, headers[i], headers[i + 1]) + } + } else if (headers && typeof headers === 'object') { + const keys = Object.keys(headers) + for (let i = 0; i < keys.length; i++) { + const key = keys[i] + processHeader(this, key, headers[key]) + } + } else if (headers != null) { + throw new InvalidArgumentError('headers must be an object or an array') + } + + if (util.isFormDataLike(this.body)) { + if (util.nodeMajor < 16 || (util.nodeMajor === 16 && util.nodeMinor < 8)) { + throw new InvalidArgumentError('Form-Data bodies are only supported in node v16.8 and newer.') + } + + if (!extractBody) { + extractBody = (__nccwpck_require__(1472).extractBody) + } + + const [bodyStream, contentType] = extractBody(body) + if (this.contentType == null) { + this.contentType = contentType + this.headers += `content-type: ${contentType}\r\n` + } + this.body = bodyStream.stream + this.contentLength = bodyStream.length + } else if (util.isBlobLike(body) && this.contentType == null && body.type) { + this.contentType = body.type + this.headers += `content-type: ${body.type}\r\n` + } + + util.validateHandler(handler, method, upgrade) + + this.servername = util.getServerName(this.host) + + this[kHandler] = handler + + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }) + } + } + + onBodySent (chunk) { + if (this[kHandler].onBodySent) { + try { + return this[kHandler].onBodySent(chunk) + } catch (err) { + this.abort(err) + } + } + } + + onRequestSent () { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }) + } + + if (this[kHandler].onRequestSent) { + try { + return this[kHandler].onRequestSent() + } catch (err) { + this.abort(err) + } + } + } + + onConnect (abort) { + assert(!this.aborted) + assert(!this.completed) + + if (this.error) { + abort(this.error) + } else { + this.abort = abort + return this[kHandler].onConnect(abort) + } + } + + onHeaders (statusCode, headers, resume, statusText) { + assert(!this.aborted) + assert(!this.completed) + + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) + } + + try { + return this[kHandler].onHeaders(statusCode, headers, resume, statusText) + } catch (err) { + this.abort(err) + } + } + + onData (chunk) { + assert(!this.aborted) + assert(!this.completed) + + try { + return this[kHandler].onData(chunk) + } catch (err) { + this.abort(err) + return false + } + } + + onUpgrade (statusCode, headers, socket) { + assert(!this.aborted) + assert(!this.completed) + + return this[kHandler].onUpgrade(statusCode, headers, socket) + } + + onComplete (trailers) { + this.onFinally() + + assert(!this.aborted) + + this.completed = true + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }) + } + + try { + return this[kHandler].onComplete(trailers) + } catch (err) { + // TODO (fix): This might be a bad idea? + this.onError(err) + } + } + + onError (error) { + this.onFinally() + + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error }) + } + + if (this.aborted) { + return + } + this.aborted = true + + return this[kHandler].onError(error) + } + + onFinally () { + if (this.errorHandler) { + this.body.off('error', this.errorHandler) + this.errorHandler = null + } + + if (this.endHandler) { + this.body.off('end', this.endHandler) + this.endHandler = null + } + } + + // TODO: adjust to support H2 + addHeader (key, value) { + processHeader(this, key, value) + return this + } + + static [kHTTP1BuildRequest] (origin, opts, handler) { + // TODO: Migrate header parsing here, to make Requests + // HTTP agnostic + return new Request(origin, opts, handler) + } + + static [kHTTP2BuildRequest] (origin, opts, handler) { + const headers = opts.headers + opts = { ...opts, headers: null } + + const request = new Request(origin, opts, handler) + + request.headers = {} + + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError('headers array must be even') + } + for (let i = 0; i < headers.length; i += 2) { + processHeader(request, headers[i], headers[i + 1], true) + } + } else if (headers && typeof headers === 'object') { + const keys = Object.keys(headers) + for (let i = 0; i < keys.length; i++) { + const key = keys[i] + processHeader(request, key, headers[key], true) + } + } else if (headers != null) { + throw new InvalidArgumentError('headers must be an object or an array') + } + + return request + } + + static [kHTTP2CopyHeaders] (raw) { + const rawHeaders = raw.split('\r\n') + const headers = {} + + for (const header of rawHeaders) { + const [key, value] = header.split(': ') + + if (value == null || value.length === 0) continue + + if (headers[key]) headers[key] += `,${value}` + else headers[key] = value + } + + return headers + } +} - if (opts != null && typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } +function processHeaderValue (key, val, skipAppend) { + if (val && typeof val === 'object') { + throw new InvalidArgumentError(`invalid ${key} header`) + } - if (opts && opts.path != null) { - if (typeof opts.path !== 'string') { - throw new InvalidArgumentError('invalid opts.path') - } + val = val != null ? `${val}` : '' - let path = opts.path - if (!opts.path.startsWith('/')) { - path = `/${path}` - } + if (headerCharRegex.exec(val) !== null) { + throw new InvalidArgumentError(`invalid ${key} header`) + } - url = new URL(util.parseOrigin(url).origin + path) - } else { - if (!opts) { - opts = typeof url === 'object' ? url : {} - } + return skipAppend ? val : `${key}: ${val}\r\n` +} - url = util.parseURL(url) - } +function processHeader (request, key, val, skipAppend = false) { + if (val && (typeof val === 'object' && !Array.isArray(val))) { + throw new InvalidArgumentError(`invalid ${key} header`) + } else if (val === undefined) { + return + } + + if ( + request.host === null && + key.length === 4 && + key.toLowerCase() === 'host' + ) { + if (headerCharRegex.exec(val) !== null) { + throw new InvalidArgumentError(`invalid ${key} header`) + } + // Consumed by Client + request.host = val + } else if ( + request.contentLength === null && + key.length === 14 && + key.toLowerCase() === 'content-length' + ) { + request.contentLength = parseInt(val, 10) + if (!Number.isFinite(request.contentLength)) { + throw new InvalidArgumentError('invalid content-length header') + } + } else if ( + request.contentType === null && + key.length === 12 && + key.toLowerCase() === 'content-type' + ) { + request.contentType = val + if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend) + else request.headers += processHeaderValue(key, val) + } else if ( + key.length === 17 && + key.toLowerCase() === 'transfer-encoding' + ) { + throw new InvalidArgumentError('invalid transfer-encoding header') + } else if ( + key.length === 10 && + key.toLowerCase() === 'connection' + ) { + const value = typeof val === 'string' ? val.toLowerCase() : null + if (value !== 'close' && value !== 'keep-alive') { + throw new InvalidArgumentError('invalid connection header') + } else if (value === 'close') { + request.reset = true + } + } else if ( + key.length === 10 && + key.toLowerCase() === 'keep-alive' + ) { + throw new InvalidArgumentError('invalid keep-alive header') + } else if ( + key.length === 7 && + key.toLowerCase() === 'upgrade' + ) { + throw new InvalidArgumentError('invalid upgrade header') + } else if ( + key.length === 6 && + key.toLowerCase() === 'expect' + ) { + throw new NotSupportedError('expect header not supported') + } else if (tokenRegExp.exec(key) === null) { + throw new InvalidArgumentError('invalid header key') + } else { + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + if (skipAppend) { + if (request.headers[key]) request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}` + else request.headers[key] = processHeaderValue(key, val[i], skipAppend) + } else { + request.headers += processHeaderValue(key, val[i]) + } + } + } else { + if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend) + else request.headers += processHeaderValue(key, val) + } + } +} - const { agent, dispatcher = getGlobalDispatcher() } = opts +module.exports = Request - if (agent) { - throw new InvalidArgumentError('unsupported opts.agent. Did you mean opts.client?') - } - return fn.call(dispatcher, { - ...opts, - origin: url.origin, - path: url.search ? `${url.pathname}${url.search}` : url.pathname, - method: opts.method || (opts.body ? 'PUT' : 'GET') - }, handler) - } - } +/***/ }), - module.exports.setGlobalDispatcher = setGlobalDispatcher - module.exports.getGlobalDispatcher = getGlobalDispatcher +/***/ 2785: +/***/ ((module) => { - if (util.nodeMajor > 16 || (util.nodeMajor === 16 && util.nodeMinor >= 8)) { - let fetchImpl = null - module.exports.fetch = async function fetch(resource) { - if (!fetchImpl) { - fetchImpl = (__nccwpck_require__(4881).fetch) - } +module.exports = { + kClose: Symbol('close'), + kDestroy: Symbol('destroy'), + kDispatch: Symbol('dispatch'), + kUrl: Symbol('url'), + kWriting: Symbol('writing'), + kResuming: Symbol('resuming'), + kQueue: Symbol('queue'), + kConnect: Symbol('connect'), + kConnecting: Symbol('connecting'), + kHeadersList: Symbol('headers list'), + kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'), + kKeepAliveMaxTimeout: Symbol('max keep alive timeout'), + kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'), + kKeepAliveTimeoutValue: Symbol('keep alive timeout'), + kKeepAlive: Symbol('keep alive'), + kHeadersTimeout: Symbol('headers timeout'), + kBodyTimeout: Symbol('body timeout'), + kServerName: Symbol('server name'), + kLocalAddress: Symbol('local address'), + kHost: Symbol('host'), + kNoRef: Symbol('no ref'), + kBodyUsed: Symbol('used'), + kRunning: Symbol('running'), + kBlocking: Symbol('blocking'), + kPending: Symbol('pending'), + kSize: Symbol('size'), + kBusy: Symbol('busy'), + kQueued: Symbol('queued'), + kFree: Symbol('free'), + kConnected: Symbol('connected'), + kClosed: Symbol('closed'), + kNeedDrain: Symbol('need drain'), + kReset: Symbol('reset'), + kDestroyed: Symbol.for('nodejs.stream.destroyed'), + kMaxHeadersSize: Symbol('max headers size'), + kRunningIdx: Symbol('running index'), + kPendingIdx: Symbol('pending index'), + kError: Symbol('error'), + kClients: Symbol('clients'), + kClient: Symbol('client'), + kParser: Symbol('parser'), + kOnDestroyed: Symbol('destroy callbacks'), + kPipelining: Symbol('pipelining'), + kSocket: Symbol('socket'), + kHostHeader: Symbol('host header'), + kConnector: Symbol('connector'), + kStrictContentLength: Symbol('strict content length'), + kMaxRedirections: Symbol('maxRedirections'), + kMaxRequests: Symbol('maxRequestsPerClient'), + kProxy: Symbol('proxy agent options'), + kCounter: Symbol('socket request counter'), + kInterceptors: Symbol('dispatch interceptors'), + kMaxResponseSize: Symbol('max response size'), + kHTTP2Session: Symbol('http2Session'), + kHTTP2SessionState: Symbol('http2Session state'), + kHTTP2BuildRequest: Symbol('http2 build request'), + kHTTP1BuildRequest: Symbol('http1 build request'), + kHTTP2CopyHeaders: Symbol('http2 copy headers'), + kHTTPConnVersion: Symbol('http connection version'), + kRetryHandlerDefaultRetry: Symbol('retry agent default retry'), + kConstruct: Symbol('constructable') +} - try { - return await fetchImpl(...arguments) - } catch (err) { - if (typeof err === 'object') { - Error.captureStackTrace(err, this) - } - throw err - } - } - module.exports.Headers = __nccwpck_require__(554).Headers - module.exports.Response = __nccwpck_require__(7823).Response - module.exports.Request = __nccwpck_require__(8359).Request - module.exports.FormData = __nccwpck_require__(2015).FormData - module.exports.File = __nccwpck_require__(8511).File - module.exports.FileReader = __nccwpck_require__(1446).FileReader +/***/ }), - const { setGlobalOrigin, getGlobalOrigin } = __nccwpck_require__(1246) +/***/ 3983: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - module.exports.setGlobalOrigin = setGlobalOrigin - module.exports.getGlobalOrigin = getGlobalOrigin +"use strict"; - const { CacheStorage } = __nccwpck_require__(7907) - const { kConstruct } = __nccwpck_require__(9174) - // Cache & CacheStorage are tightly coupled with fetch. Even if it may run - // in an older version of Node, it doesn't have any use without fetch. - module.exports.caches = new CacheStorage(kConstruct) - } +const assert = __nccwpck_require__(9491) +const { kDestroyed, kBodyUsed } = __nccwpck_require__(2785) +const { IncomingMessage } = __nccwpck_require__(3685) +const stream = __nccwpck_require__(2781) +const net = __nccwpck_require__(1808) +const { InvalidArgumentError } = __nccwpck_require__(8045) +const { Blob } = __nccwpck_require__(4300) +const nodeUtil = __nccwpck_require__(3837) +const { stringify } = __nccwpck_require__(3477) +const { headerNameLowerCasedRecord } = __nccwpck_require__(4462) - if (util.nodeMajor >= 16) { - const { deleteCookie, getCookies, getSetCookies, setCookie } = __nccwpck_require__(1724) +const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) - module.exports.deleteCookie = deleteCookie - module.exports.getCookies = getCookies - module.exports.getSetCookies = getSetCookies - module.exports.setCookie = setCookie +function nop () {} - const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685) +function isStream (obj) { + return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function' +} - module.exports.parseMIMEType = parseMIMEType - module.exports.serializeAMimeType = serializeAMimeType - } +// based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License) +function isBlobLike (object) { + return (Blob && object instanceof Blob) || ( + object && + typeof object === 'object' && + (typeof object.stream === 'function' || + typeof object.arrayBuffer === 'function') && + /^(Blob|File)$/.test(object[Symbol.toStringTag]) + ) +} - if (util.nodeMajor >= 18 && hasCrypto) { - const { WebSocket } = __nccwpck_require__(4284) +function buildURL (url, queryParams) { + if (url.includes('?') || url.includes('#')) { + throw new Error('Query params cannot be passed when url already contains "?" or "#".') + } - module.exports.WebSocket = WebSocket - } + const stringified = stringify(queryParams) - module.exports.request = makeDispatcher(api.request) - module.exports.stream = makeDispatcher(api.stream) - module.exports.pipeline = makeDispatcher(api.pipeline) - module.exports.connect = makeDispatcher(api.connect) - module.exports.upgrade = makeDispatcher(api.upgrade) + if (stringified) { + url += '?' + stringified + } - module.exports.MockClient = MockClient - module.exports.MockPool = MockPool - module.exports.MockAgent = MockAgent - module.exports.mockErrors = mockErrors + return url +} +function parseURL (url) { + if (typeof url === 'string') { + url = new URL(url) + + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') + } + + return url + } + + if (!url || typeof url !== 'object') { + throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.') + } + + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') + } + + if (!(url instanceof URL)) { + if (url.port != null && url.port !== '' && !Number.isFinite(parseInt(url.port))) { + throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.') + } + + if (url.path != null && typeof url.path !== 'string') { + throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.') + } + + if (url.pathname != null && typeof url.pathname !== 'string') { + throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.') + } + + if (url.hostname != null && typeof url.hostname !== 'string') { + throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.') + } + + if (url.origin != null && typeof url.origin !== 'string') { + throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.') + } + + const port = url.port != null + ? url.port + : (url.protocol === 'https:' ? 443 : 80) + let origin = url.origin != null + ? url.origin + : `${url.protocol}//${url.hostname}:${port}` + let path = url.path != null + ? url.path + : `${url.pathname || ''}${url.search || ''}` + + if (origin.endsWith('/')) { + origin = origin.substring(0, origin.length - 1) + } + + if (path && !path.startsWith('/')) { + path = `/${path}` + } + // new URL(path, origin) is unsafe when `path` contains an absolute URL + // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL: + // If first parameter is a relative URL, second param is required, and will be used as the base URL. + // If first parameter is an absolute URL, a given second param will be ignored. + url = new URL(origin + path) + } + + return url +} - /***/ -}), +function parseOrigin (url) { + url = parseURL(url) -/***/ 7890: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + if (url.pathname !== '/' || url.search || url.hash) { + throw new InvalidArgumentError('invalid url') + } - "use strict"; - - - const { InvalidArgumentError } = __nccwpck_require__(8045) - const { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = __nccwpck_require__(2785) - const DispatcherBase = __nccwpck_require__(4839) - const Pool = __nccwpck_require__(4634) - const Client = __nccwpck_require__(3598) - const util = __nccwpck_require__(3983) - const createRedirectInterceptor = __nccwpck_require__(8861) - const { WeakRef, FinalizationRegistry } = __nccwpck_require__(6436)() - - const kOnConnect = Symbol('onConnect') - const kOnDisconnect = Symbol('onDisconnect') - const kOnConnectionError = Symbol('onConnectionError') - const kMaxRedirections = Symbol('maxRedirections') - const kOnDrain = Symbol('onDrain') - const kFactory = Symbol('factory') - const kFinalizer = Symbol('finalizer') - const kOptions = Symbol('options') - - function defaultFactory(origin, opts) { - return opts && opts.connections === 1 - ? new Client(origin, opts) - : new Pool(origin, opts) - } + return url +} - class Agent extends DispatcherBase { - constructor({ factory = defaultFactory, maxRedirections = 0, connect, ...options } = {}) { - super() +function getHostname (host) { + if (host[0] === '[') { + const idx = host.indexOf(']') - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') - } + assert(idx !== -1) + return host.substring(1, idx) + } - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') - } + const idx = host.indexOf(':') + if (idx === -1) return host - if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { - throw new InvalidArgumentError('maxRedirections must be a positive number') - } + return host.substring(0, idx) +} - if (connect && typeof connect !== 'function') { - connect = { ...connect } - } +// IP addresses are not valid server names per RFC6066 +// > Currently, the only server names supported are DNS hostnames +function getServerName (host) { + if (!host) { + return null + } - this[kInterceptors] = options.interceptors && options.interceptors.Agent && Array.isArray(options.interceptors.Agent) - ? options.interceptors.Agent - : [createRedirectInterceptor({ maxRedirections })] - - this[kOptions] = { ...util.deepClone(options), connect } - this[kOptions].interceptors = options.interceptors - ? { ...options.interceptors } - : undefined - this[kMaxRedirections] = maxRedirections - this[kFactory] = factory - this[kClients] = new Map() - this[kFinalizer] = new FinalizationRegistry(/* istanbul ignore next: gc is undeterministic */ key => { - const ref = this[kClients].get(key) - if (ref !== undefined && ref.deref() === undefined) { - this[kClients].delete(key) - } - }) + assert.strictEqual(typeof host, 'string') - const agent = this + const servername = getHostname(host) + if (net.isIP(servername)) { + return '' + } - this[kOnDrain] = (origin, targets) => { - agent.emit('drain', origin, [agent, ...targets]) - } + return servername +} - this[kOnConnect] = (origin, targets) => { - agent.emit('connect', origin, [agent, ...targets]) - } +function deepClone (obj) { + return JSON.parse(JSON.stringify(obj)) +} - this[kOnDisconnect] = (origin, targets, err) => { - agent.emit('disconnect', origin, [agent, ...targets], err) - } +function isAsyncIterable (obj) { + return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function') +} - this[kOnConnectionError] = (origin, targets, err) => { - agent.emit('connectionError', origin, [agent, ...targets], err) - } - } +function isIterable (obj) { + return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function')) +} - get [kRunning]() { - let ret = 0 - for (const ref of this[kClients].values()) { - const client = ref.deref() - /* istanbul ignore next: gc is undeterministic */ - if (client) { - ret += client[kRunning] - } - } - return ret - } +function bodyLength (body) { + if (body == null) { + return 0 + } else if (isStream(body)) { + const state = body._readableState + return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) + ? state.length + : null + } else if (isBlobLike(body)) { + return body.size != null ? body.size : null + } else if (isBuffer(body)) { + return body.byteLength + } + + return null +} - [kDispatch](opts, handler) { - let key - if (opts.origin && (typeof opts.origin === 'string' || opts.origin instanceof URL)) { - key = String(opts.origin) - } else { - throw new InvalidArgumentError('opts.origin must be a non-empty string or URL.') - } +function isDestroyed (stream) { + return !stream || !!(stream.destroyed || stream[kDestroyed]) +} - const ref = this[kClients].get(key) +function isReadableAborted (stream) { + const state = stream && stream._readableState + return isDestroyed(stream) && state && !state.endEmitted +} - let dispatcher = ref ? ref.deref() : null - if (!dispatcher) { - dispatcher = this[kFactory](opts.origin, this[kOptions]) - .on('drain', this[kOnDrain]) - .on('connect', this[kOnConnect]) - .on('disconnect', this[kOnDisconnect]) - .on('connectionError', this[kOnConnectionError]) +function destroy (stream, err) { + if (stream == null || !isStream(stream) || isDestroyed(stream)) { + return + } + + if (typeof stream.destroy === 'function') { + if (Object.getPrototypeOf(stream).constructor === IncomingMessage) { + // See: https://github.com/nodejs/node/pull/38505/files + stream.socket = null + } + + stream.destroy(err) + } else if (err) { + process.nextTick((stream, err) => { + stream.emit('error', err) + }, stream, err) + } + + if (stream.destroyed !== true) { + stream[kDestroyed] = true + } +} - this[kClients].set(key, new WeakRef(dispatcher)) - this[kFinalizer].register(dispatcher, key) - } +const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/ +function parseKeepAliveTimeout (val) { + const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR) + return m ? parseInt(m[1], 10) * 1000 : null +} - return dispatcher.dispatch(opts, handler) - } +/** + * Retrieves a header name and returns its lowercase value. + * @param {string | Buffer} value Header name + * @returns {string} + */ +function headerNameToString (value) { + return headerNameLowerCasedRecord[value] || value.toLowerCase() +} - async [kClose]() { - const closePromises = [] - for (const ref of this[kClients].values()) { - const client = ref.deref() - /* istanbul ignore else: gc is undeterministic */ - if (client) { - closePromises.push(client.close()) - } - } +function parseHeaders (headers, obj = {}) { + // For H2 support + if (!Array.isArray(headers)) return headers + + for (let i = 0; i < headers.length; i += 2) { + const key = headers[i].toString().toLowerCase() + let val = obj[key] + + if (!val) { + if (Array.isArray(headers[i + 1])) { + obj[key] = headers[i + 1].map(x => x.toString('utf8')) + } else { + obj[key] = headers[i + 1].toString('utf8') + } + } else { + if (!Array.isArray(val)) { + val = [val] + obj[key] = val + } + val.push(headers[i + 1].toString('utf8')) + } + } + + // See https://github.com/nodejs/node/pull/46528 + if ('content-length' in obj && 'content-disposition' in obj) { + obj['content-disposition'] = Buffer.from(obj['content-disposition']).toString('latin1') + } + + return obj +} - await Promise.all(closePromises) - } +function parseRawHeaders (headers) { + const ret = [] + let hasContentLength = false + let contentDispositionIdx = -1 + + for (let n = 0; n < headers.length; n += 2) { + const key = headers[n + 0].toString() + const val = headers[n + 1].toString('utf8') + + if (key.length === 14 && (key === 'content-length' || key.toLowerCase() === 'content-length')) { + ret.push(key, val) + hasContentLength = true + } else if (key.length === 19 && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) { + contentDispositionIdx = ret.push(key, val) - 1 + } else { + ret.push(key, val) + } + } + + // See https://github.com/nodejs/node/pull/46528 + if (hasContentLength && contentDispositionIdx !== -1) { + ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString('latin1') + } + + return ret +} - async [kDestroy](err) { - const destroyPromises = [] - for (const ref of this[kClients].values()) { - const client = ref.deref() - /* istanbul ignore else: gc is undeterministic */ - if (client) { - destroyPromises.push(client.destroy(err)) - } - } +function isBuffer (buffer) { + // See, https://github.com/mcollina/undici/pull/319 + return buffer instanceof Uint8Array || Buffer.isBuffer(buffer) +} - await Promise.all(destroyPromises) - } - } +function validateHandler (handler, method, upgrade) { + if (!handler || typeof handler !== 'object') { + throw new InvalidArgumentError('handler must be an object') + } + + if (typeof handler.onConnect !== 'function') { + throw new InvalidArgumentError('invalid onConnect method') + } + + if (typeof handler.onError !== 'function') { + throw new InvalidArgumentError('invalid onError method') + } + + if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) { + throw new InvalidArgumentError('invalid onBodySent method') + } + + if (upgrade || method === 'CONNECT') { + if (typeof handler.onUpgrade !== 'function') { + throw new InvalidArgumentError('invalid onUpgrade method') + } + } else { + if (typeof handler.onHeaders !== 'function') { + throw new InvalidArgumentError('invalid onHeaders method') + } + + if (typeof handler.onData !== 'function') { + throw new InvalidArgumentError('invalid onData method') + } + + if (typeof handler.onComplete !== 'function') { + throw new InvalidArgumentError('invalid onComplete method') + } + } +} - module.exports = Agent +// A body is disturbed if it has been read from and it cannot +// be re-used without losing state or data. +function isDisturbed (body) { + return !!(body && ( + stream.isDisturbed + ? stream.isDisturbed(body) || body[kBodyUsed] // TODO (fix): Why is body[kBodyUsed] needed? + : body[kBodyUsed] || + body.readableDidRead || + (body._readableState && body._readableState.dataEmitted) || + isReadableAborted(body) + )) +} +function isErrored (body) { + return !!(body && ( + stream.isErrored + ? stream.isErrored(body) + : /state: 'errored'/.test(nodeUtil.inspect(body) + ))) +} - /***/ -}), +function isReadable (body) { + return !!(body && ( + stream.isReadable + ? stream.isReadable(body) + : /state: 'readable'/.test(nodeUtil.inspect(body) + ))) +} -/***/ 7032: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +function getSocketInfo (socket) { + return { + localAddress: socket.localAddress, + localPort: socket.localPort, + remoteAddress: socket.remoteAddress, + remotePort: socket.remotePort, + remoteFamily: socket.remoteFamily, + timeout: socket.timeout, + bytesWritten: socket.bytesWritten, + bytesRead: socket.bytesRead + } +} - const { addAbortListener } = __nccwpck_require__(3983) - const { RequestAbortedError } = __nccwpck_require__(8045) +async function * convertIterableToBuffer (iterable) { + for await (const chunk of iterable) { + yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk) + } +} - const kListener = Symbol('kListener') - const kSignal = Symbol('kSignal') +let ReadableStream +function ReadableStreamFrom (iterable) { + if (!ReadableStream) { + ReadableStream = (__nccwpck_require__(5356).ReadableStream) + } + + if (ReadableStream.from) { + return ReadableStream.from(convertIterableToBuffer(iterable)) + } + + let iterator + return new ReadableStream( + { + async start () { + iterator = iterable[Symbol.asyncIterator]() + }, + async pull (controller) { + const { done, value } = await iterator.next() + if (done) { + queueMicrotask(() => { + controller.close() + }) + } else { + const buf = Buffer.isBuffer(value) ? value : Buffer.from(value) + controller.enqueue(new Uint8Array(buf)) + } + return controller.desiredSize > 0 + }, + async cancel (reason) { + await iterator.return() + } + }, + 0 + ) +} - function abort(self) { - if (self.abort) { - self.abort() - } else { - self.onError(new RequestAbortedError()) - } - } +// The chunk should be a FormData instance and contains +// all the required methods. +function isFormDataLike (object) { + return ( + object && + typeof object === 'object' && + typeof object.append === 'function' && + typeof object.delete === 'function' && + typeof object.get === 'function' && + typeof object.getAll === 'function' && + typeof object.has === 'function' && + typeof object.set === 'function' && + object[Symbol.toStringTag] === 'FormData' + ) +} - function addSignal(self, signal) { - self[kSignal] = null - self[kListener] = null +function throwIfAborted (signal) { + if (!signal) { return } + if (typeof signal.throwIfAborted === 'function') { + signal.throwIfAborted() + } else { + if (signal.aborted) { + // DOMException not available < v17.0.0 + const err = new Error('The operation was aborted') + err.name = 'AbortError' + throw err + } + } +} - if (!signal) { - return - } +function addAbortListener (signal, listener) { + if ('addEventListener' in signal) { + signal.addEventListener('abort', listener, { once: true }) + return () => signal.removeEventListener('abort', listener) + } + signal.addListener('abort', listener) + return () => signal.removeListener('abort', listener) +} - if (signal.aborted) { - abort(self) - return - } +const hasToWellFormed = !!String.prototype.toWellFormed - self[kSignal] = signal - self[kListener] = () => { - abort(self) - } +/** + * @param {string} val + */ +function toUSVString (val) { + if (hasToWellFormed) { + return `${val}`.toWellFormed() + } else if (nodeUtil.toUSVString) { + return nodeUtil.toUSVString(val) + } - addAbortListener(self[kSignal], self[kListener]) - } + return `${val}` +} - function removeSignal(self) { - if (!self[kSignal]) { - return - } +// Parsed accordingly to RFC 9110 +// https://www.rfc-editor.org/rfc/rfc9110#field.content-range +function parseRangeHeader (range) { + if (range == null || range === '') return { start: 0, end: null, size: null } + + const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null + return m + ? { + start: parseInt(m[1]), + end: m[2] ? parseInt(m[2]) : null, + size: m[3] ? parseInt(m[3]) : null + } + : null +} - if ('removeEventListener' in self[kSignal]) { - self[kSignal].removeEventListener('abort', self[kListener]) - } else { - self[kSignal].removeListener('abort', self[kListener]) - } +const kEnumerableProperty = Object.create(null) +kEnumerableProperty.enumerable = true + +module.exports = { + kEnumerableProperty, + nop, + isDisturbed, + isErrored, + isReadable, + toUSVString, + isReadableAborted, + isBlobLike, + parseOrigin, + parseURL, + getServerName, + isStream, + isIterable, + isAsyncIterable, + isDestroyed, + headerNameToString, + parseRawHeaders, + parseHeaders, + parseKeepAliveTimeout, + destroy, + bodyLength, + deepClone, + ReadableStreamFrom, + isBuffer, + validateHandler, + getSocketInfo, + isFormDataLike, + buildURL, + throwIfAborted, + addAbortListener, + parseRangeHeader, + nodeMajor, + nodeMinor, + nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13), + safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'] +} - self[kSignal] = null - self[kListener] = null - } - module.exports = { - addSignal, - removeSignal - } +/***/ }), +/***/ 4839: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - /***/ -}), +"use strict"; + + +const Dispatcher = __nccwpck_require__(412) +const { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError +} = __nccwpck_require__(8045) +const { kDestroy, kClose, kDispatch, kInterceptors } = __nccwpck_require__(2785) + +const kDestroyed = Symbol('destroyed') +const kClosed = Symbol('closed') +const kOnDestroyed = Symbol('onDestroyed') +const kOnClosed = Symbol('onClosed') +const kInterceptedDispatch = Symbol('Intercepted Dispatch') + +class DispatcherBase extends Dispatcher { + constructor () { + super() + + this[kDestroyed] = false + this[kOnDestroyed] = null + this[kClosed] = false + this[kOnClosed] = [] + } + + get destroyed () { + return this[kDestroyed] + } + + get closed () { + return this[kClosed] + } + + get interceptors () { + return this[kInterceptors] + } + + set interceptors (newInterceptors) { + if (newInterceptors) { + for (let i = newInterceptors.length - 1; i >= 0; i--) { + const interceptor = this[kInterceptors][i] + if (typeof interceptor !== 'function') { + throw new InvalidArgumentError('interceptor must be an function') + } + } + } + + this[kInterceptors] = newInterceptors + } + + close (callback) { + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data) + }) + }) + } + + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } + + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError(), null)) + return + } + + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback) + } else { + queueMicrotask(() => callback(null, null)) + } + return + } + + this[kClosed] = true + this[kOnClosed].push(callback) + + const onClosed = () => { + const callbacks = this[kOnClosed] + this[kOnClosed] = null + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null) + } + } + + // Should not error. + this[kClose]() + .then(() => this.destroy()) + .then(() => { + queueMicrotask(onClosed) + }) + } + + destroy (err, callback) { + if (typeof err === 'function') { + callback = err + err = null + } + + if (callback === undefined) { + return new Promise((resolve, reject) => { + this.destroy(err, (err, data) => { + return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data) + }) + }) + } + + if (typeof callback !== 'function') { + throw new InvalidArgumentError('invalid callback') + } + + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback) + } else { + queueMicrotask(() => callback(null, null)) + } + return + } + + if (!err) { + err = new ClientDestroyedError() + } + + this[kDestroyed] = true + this[kOnDestroyed] = this[kOnDestroyed] || [] + this[kOnDestroyed].push(callback) + + const onDestroyed = () => { + const callbacks = this[kOnDestroyed] + this[kOnDestroyed] = null + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null) + } + } + + // Should not error. + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed) + }) + } + + [kInterceptedDispatch] (opts, handler) { + if (!this[kInterceptors] || this[kInterceptors].length === 0) { + this[kInterceptedDispatch] = this[kDispatch] + return this[kDispatch](opts, handler) + } + + let dispatch = this[kDispatch].bind(this) + for (let i = this[kInterceptors].length - 1; i >= 0; i--) { + dispatch = this[kInterceptors][i](dispatch) + } + this[kInterceptedDispatch] = dispatch + return dispatch(opts, handler) + } + + dispatch (opts, handler) { + if (!handler || typeof handler !== 'object') { + throw new InvalidArgumentError('handler must be an object') + } + + try { + if (!opts || typeof opts !== 'object') { + throw new InvalidArgumentError('opts must be an object.') + } + + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError() + } + + if (this[kClosed]) { + throw new ClientClosedError() + } + + return this[kInterceptedDispatch](opts, handler) + } catch (err) { + if (typeof handler.onError !== 'function') { + throw new InvalidArgumentError('invalid onError method') + } + + handler.onError(err) + + return false + } + } +} -/***/ 9744: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +module.exports = DispatcherBase - "use strict"; +/***/ }), - const { AsyncResource } = __nccwpck_require__(852) - const { InvalidArgumentError, RequestAbortedError, SocketError } = __nccwpck_require__(8045) - const util = __nccwpck_require__(3983) - const { addSignal, removeSignal } = __nccwpck_require__(7032) +/***/ 412: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - class ConnectHandler extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } +"use strict"; - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } - const { signal, opaque, responseHeaders } = opts +const EventEmitter = __nccwpck_require__(2361) - if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { - throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') - } +class Dispatcher extends EventEmitter { + dispatch () { + throw new Error('not implemented') + } - super('UNDICI_CONNECT') + close () { + throw new Error('not implemented') + } - this.opaque = opaque || null - this.responseHeaders = responseHeaders || null - this.callback = callback - this.abort = null + destroy () { + throw new Error('not implemented') + } +} - addSignal(this, signal) - } +module.exports = Dispatcher - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError() - } - this.abort = abort - this.context = context - } +/***/ }), - onHeaders() { - throw new SocketError('bad connect', null) - } +/***/ 1472: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - onUpgrade(statusCode, rawHeaders, socket) { - const { callback, opaque, context } = this +"use strict"; + + +const Busboy = __nccwpck_require__(727) +const util = __nccwpck_require__(3983) +const { + ReadableStreamFrom, + isBlobLike, + isReadableStreamLike, + readableStreamClose, + createDeferredPromise, + fullyReadBody +} = __nccwpck_require__(2538) +const { FormData } = __nccwpck_require__(2015) +const { kState } = __nccwpck_require__(5861) +const { webidl } = __nccwpck_require__(1744) +const { DOMException, structuredClone } = __nccwpck_require__(1037) +const { Blob, File: NativeFile } = __nccwpck_require__(4300) +const { kBodyUsed } = __nccwpck_require__(2785) +const assert = __nccwpck_require__(9491) +const { isErrored } = __nccwpck_require__(3983) +const { isUint8Array, isArrayBuffer } = __nccwpck_require__(9830) +const { File: UndiciFile } = __nccwpck_require__(8511) +const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685) + +let ReadableStream = globalThis.ReadableStream + +/** @type {globalThis['File']} */ +const File = NativeFile ?? UndiciFile +const textEncoder = new TextEncoder() +const textDecoder = new TextDecoder() + +// https://fetch.spec.whatwg.org/#concept-bodyinit-extract +function extractBody (object, keepalive = false) { + if (!ReadableStream) { + ReadableStream = (__nccwpck_require__(5356).ReadableStream) + } + + // 1. Let stream be null. + let stream = null + + // 2. If object is a ReadableStream object, then set stream to object. + if (object instanceof ReadableStream) { + stream = object + } else if (isBlobLike(object)) { + // 3. Otherwise, if object is a Blob object, set stream to the + // result of running object’s get stream. + stream = object.stream() + } else { + // 4. Otherwise, set stream to a new ReadableStream object, and set + // up stream. + stream = new ReadableStream({ + async pull (controller) { + controller.enqueue( + typeof source === 'string' ? textEncoder.encode(source) : source + ) + queueMicrotask(() => readableStreamClose(controller)) + }, + start () {}, + type: undefined + }) + } + + // 5. Assert: stream is a ReadableStream object. + assert(isReadableStreamLike(stream)) + + // 6. Let action be null. + let action = null + + // 7. Let source be null. + let source = null + + // 8. Let length be null. + let length = null + + // 9. Let type be null. + let type = null + + // 10. Switch on object: + if (typeof object === 'string') { + // Set source to the UTF-8 encoding of object. + // Note: setting source to a Uint8Array here breaks some mocking assumptions. + source = object + + // Set type to `text/plain;charset=UTF-8`. + type = 'text/plain;charset=UTF-8' + } else if (object instanceof URLSearchParams) { + // URLSearchParams + + // spec says to run application/x-www-form-urlencoded on body.list + // this is implemented in Node.js as apart of an URLSearchParams instance toString method + // See: https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L490 + // and https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L1100 + + // Set source to the result of running the application/x-www-form-urlencoded serializer with object’s list. + source = object.toString() + + // Set type to `application/x-www-form-urlencoded;charset=UTF-8`. + type = 'application/x-www-form-urlencoded;charset=UTF-8' + } else if (isArrayBuffer(object)) { + // BufferSource/ArrayBuffer + + // Set source to a copy of the bytes held by object. + source = new Uint8Array(object.slice()) + } else if (ArrayBuffer.isView(object)) { + // BufferSource/ArrayBufferView + + // Set source to a copy of the bytes held by object. + source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)) + } else if (util.isFormDataLike(object)) { + const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, '0')}` + const prefix = `--${boundary}\r\nContent-Disposition: form-data` + + /*! formdata-polyfill. MIT License. Jimmy Wärting */ + const escape = (str) => + str.replace(/\n/g, '%0A').replace(/\r/g, '%0D').replace(/"/g, '%22') + const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, '\r\n') + + // Set action to this step: run the multipart/form-data + // encoding algorithm, with object’s entry list and UTF-8. + // - This ensures that the body is immutable and can't be changed afterwords + // - That the content-length is calculated in advance. + // - And that all parts are pre-encoded and ready to be sent. + + const blobParts = [] + const rn = new Uint8Array([13, 10]) // '\r\n' + length = 0 + let hasUnknownSizeValue = false + + for (const [name, value] of object) { + if (typeof value === 'string') { + const chunk = textEncoder.encode(prefix + + `; name="${escape(normalizeLinefeeds(name))}"` + + `\r\n\r\n${normalizeLinefeeds(value)}\r\n`) + blobParts.push(chunk) + length += chunk.byteLength + } else { + const chunk = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + + (value.name ? `; filename="${escape(value.name)}"` : '') + '\r\n' + + `Content-Type: ${ + value.type || 'application/octet-stream' + }\r\n\r\n`) + blobParts.push(chunk, value, rn) + if (typeof value.size === 'number') { + length += chunk.byteLength + value.size + rn.byteLength + } else { + hasUnknownSizeValue = true + } + } + } + + const chunk = textEncoder.encode(`--${boundary}--`) + blobParts.push(chunk) + length += chunk.byteLength + if (hasUnknownSizeValue) { + length = null + } + + // Set source to object. + source = object + + action = async function * () { + for (const part of blobParts) { + if (part.stream) { + yield * part.stream() + } else { + yield part + } + } + } + + // Set type to `multipart/form-data; boundary=`, + // followed by the multipart/form-data boundary string generated + // by the multipart/form-data encoding algorithm. + type = 'multipart/form-data; boundary=' + boundary + } else if (isBlobLike(object)) { + // Blob + + // Set source to object. + source = object + + // Set length to object’s size. + length = object.size + + // If object’s type attribute is not the empty byte sequence, set + // type to its value. + if (object.type) { + type = object.type + } + } else if (typeof object[Symbol.asyncIterator] === 'function') { + // If keepalive is true, then throw a TypeError. + if (keepalive) { + throw new TypeError('keepalive') + } + + // If object is disturbed or locked, then throw a TypeError. + if (util.isDisturbed(object) || object.locked) { + throw new TypeError( + 'Response body object should not be disturbed or locked' + ) + } + + stream = + object instanceof ReadableStream ? object : ReadableStreamFrom(object) + } + + // 11. If source is a byte sequence, then set action to a + // step that returns source and length to source’s length. + if (typeof source === 'string' || util.isBuffer(source)) { + length = Buffer.byteLength(source) + } + + // 12. If action is non-null, then run these steps in in parallel: + if (action != null) { + // Run action. + let iterator + stream = new ReadableStream({ + async start () { + iterator = action(object)[Symbol.asyncIterator]() + }, + async pull (controller) { + const { value, done } = await iterator.next() + if (done) { + // When running action is done, close stream. + queueMicrotask(() => { + controller.close() + }) + } else { + // Whenever one or more bytes are available and stream is not errored, + // enqueue a Uint8Array wrapping an ArrayBuffer containing the available + // bytes into stream. + if (!isErrored(stream)) { + controller.enqueue(new Uint8Array(value)) + } + } + return controller.desiredSize > 0 + }, + async cancel (reason) { + await iterator.return() + }, + type: undefined + }) + } + + // 13. Let body be a body whose stream is stream, source is source, + // and length is length. + const body = { stream, source, length } + + // 14. Return (body, type). + return [body, type] +} - removeSignal(this) +// https://fetch.spec.whatwg.org/#bodyinit-safely-extract +function safelyExtractBody (object, keepalive = false) { + if (!ReadableStream) { + // istanbul ignore next + ReadableStream = (__nccwpck_require__(5356).ReadableStream) + } + + // To safely extract a body and a `Content-Type` value from + // a byte sequence or BodyInit object object, run these steps: + + // 1. If object is a ReadableStream object, then: + if (object instanceof ReadableStream) { + // Assert: object is neither disturbed nor locked. + // istanbul ignore next + assert(!util.isDisturbed(object), 'The body has already been consumed.') + // istanbul ignore next + assert(!object.locked, 'The stream is locked.') + } + + // 2. Return the results of extracting object. + return extractBody(object, keepalive) +} - this.callback = null +function cloneBody (body) { + // To clone a body body, run these steps: - let headers = rawHeaders - // Indicates is an HTTP2Session - if (headers != null) { - headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) - } + // https://fetch.spec.whatwg.org/#concept-body-clone - this.runInAsyncScope(callback, null, null, { - statusCode, - headers, - socket, - opaque, - context - }) - } + // 1. Let « out1, out2 » be the result of teeing body’s stream. + const [out1, out2] = body.stream.tee() + const out2Clone = structuredClone(out2, { transfer: [out2] }) + // This, for whatever reasons, unrefs out2Clone which allows + // the process to exit by itself. + const [, finalClone] = out2Clone.tee() - onError(err) { - const { callback, opaque } = this + // 2. Set body’s stream to out1. + body.stream = out1 - removeSignal(this) + // 3. Return a body whose stream is out2 and other members are copied from body. + return { + stream: finalClone, + length: body.length, + source: body.source + } +} - if (callback) { - this.callback = null - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }) - }) - } - } - } +async function * consumeBody (body) { + if (body) { + if (isUint8Array(body)) { + yield body + } else { + const stream = body.stream - function connect(opts, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - connect.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data) - }) - }) - } + if (util.isDisturbed(stream)) { + throw new TypeError('The body has already been consumed.') + } - try { - const connectHandler = new ConnectHandler(opts, callback) - this.dispatch({ ...opts, method: 'CONNECT' }, connectHandler) - } catch (err) { - if (typeof callback !== 'function') { - throw err - } - const opaque = opts && opts.opaque - queueMicrotask(() => callback(err, { opaque })) - } - } + if (stream.locked) { + throw new TypeError('The stream is locked.') + } - module.exports = connect + // Compat. + stream[kBodyUsed] = true + yield * stream + } + } +} - /***/ -}), +function throwIfAborted (state) { + if (state.aborted) { + throw new DOMException('The operation was aborted.', 'AbortError') + } +} -/***/ 8752: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +function bodyMixinMethods (instance) { + const methods = { + blob () { + // The blob() method steps are to return the result of + // running consume body with this and the following step + // given a byte sequence bytes: return a Blob whose + // contents are bytes and whose type attribute is this’s + // MIME type. + return specConsumeBody(this, (bytes) => { + let mimeType = bodyMimeType(this) + + if (mimeType === 'failure') { + mimeType = '' + } else if (mimeType) { + mimeType = serializeAMimeType(mimeType) + } + + // Return a Blob whose contents are bytes and type attribute + // is mimeType. + return new Blob([bytes], { type: mimeType }) + }, instance) + }, + + arrayBuffer () { + // The arrayBuffer() method steps are to return the result + // of running consume body with this and the following step + // given a byte sequence bytes: return a new ArrayBuffer + // whose contents are bytes. + return specConsumeBody(this, (bytes) => { + return new Uint8Array(bytes).buffer + }, instance) + }, + + text () { + // The text() method steps are to return the result of running + // consume body with this and UTF-8 decode. + return specConsumeBody(this, utf8DecodeBytes, instance) + }, + + json () { + // The json() method steps are to return the result of running + // consume body with this and parse JSON from bytes. + return specConsumeBody(this, parseJSONFromBytes, instance) + }, + + async formData () { + webidl.brandCheck(this, instance) + + throwIfAborted(this[kState]) + + const contentType = this.headers.get('Content-Type') + + // If mimeType’s essence is "multipart/form-data", then: + if (/multipart\/form-data/.test(contentType)) { + const headers = {} + for (const [key, value] of this.headers) headers[key.toLowerCase()] = value + + const responseFormData = new FormData() + + let busboy + + try { + busboy = new Busboy({ + headers, + preservePath: true + }) + } catch (err) { + throw new DOMException(`${err}`, 'AbortError') + } + + busboy.on('field', (name, value) => { + responseFormData.append(name, value) + }) + busboy.on('file', (name, value, filename, encoding, mimeType) => { + const chunks = [] + + if (encoding === 'base64' || encoding.toLowerCase() === 'base64') { + let base64chunk = '' + + value.on('data', (chunk) => { + base64chunk += chunk.toString().replace(/[\r\n]/gm, '') + + const end = base64chunk.length - base64chunk.length % 4 + chunks.push(Buffer.from(base64chunk.slice(0, end), 'base64')) + + base64chunk = base64chunk.slice(end) + }) + value.on('end', () => { + chunks.push(Buffer.from(base64chunk, 'base64')) + responseFormData.append(name, new File(chunks, filename, { type: mimeType })) + }) + } else { + value.on('data', (chunk) => { + chunks.push(chunk) + }) + value.on('end', () => { + responseFormData.append(name, new File(chunks, filename, { type: mimeType })) + }) + } + }) + + const busboyResolve = new Promise((resolve, reject) => { + busboy.on('finish', resolve) + busboy.on('error', (err) => reject(new TypeError(err))) + }) + + if (this.body !== null) for await (const chunk of consumeBody(this[kState].body)) busboy.write(chunk) + busboy.end() + await busboyResolve + + return responseFormData + } else if (/application\/x-www-form-urlencoded/.test(contentType)) { + // Otherwise, if mimeType’s essence is "application/x-www-form-urlencoded", then: + + // 1. Let entries be the result of parsing bytes. + let entries + try { + let text = '' + // application/x-www-form-urlencoded parser will keep the BOM. + // https://url.spec.whatwg.org/#concept-urlencoded-parser + // Note that streaming decoder is stateful and cannot be reused + const streamingDecoder = new TextDecoder('utf-8', { ignoreBOM: true }) + + for await (const chunk of consumeBody(this[kState].body)) { + if (!isUint8Array(chunk)) { + throw new TypeError('Expected Uint8Array chunk') + } + text += streamingDecoder.decode(chunk, { stream: true }) + } + text += streamingDecoder.decode() + entries = new URLSearchParams(text) + } catch (err) { + // istanbul ignore next: Unclear when new URLSearchParams can fail on a string. + // 2. If entries is failure, then throw a TypeError. + throw Object.assign(new TypeError(), { cause: err }) + } + + // 3. Return a new FormData object whose entries are entries. + const formData = new FormData() + for (const [name, value] of entries) { + formData.append(name, value) + } + return formData + } else { + // Wait a tick before checking if the request has been aborted. + // Otherwise, a TypeError can be thrown when an AbortError should. + await Promise.resolve() + + throwIfAborted(this[kState]) + + // Otherwise, throw a TypeError. + throw webidl.errors.exception({ + header: `${instance.name}.formData`, + message: 'Could not parse content as FormData.' + }) + } + } + } + + return methods +} - "use strict"; +function mixinBody (prototype) { + Object.assign(prototype.prototype, bodyMixinMethods(prototype)) +} +/** + * @see https://fetch.spec.whatwg.org/#concept-body-consume-body + * @param {Response|Request} object + * @param {(value: unknown) => unknown} convertBytesToJSValue + * @param {Response|Request} instance + */ +async function specConsumeBody (object, convertBytesToJSValue, instance) { + webidl.brandCheck(object, instance) + + throwIfAborted(object[kState]) + + // 1. If object is unusable, then return a promise rejected + // with a TypeError. + if (bodyUnusable(object[kState].body)) { + throw new TypeError('Body is unusable') + } + + // 2. Let promise be a new promise. + const promise = createDeferredPromise() + + // 3. Let errorSteps given error be to reject promise with error. + const errorSteps = (error) => promise.reject(error) + + // 4. Let successSteps given a byte sequence data be to resolve + // promise with the result of running convertBytesToJSValue + // with data. If that threw an exception, then run errorSteps + // with that exception. + const successSteps = (data) => { + try { + promise.resolve(convertBytesToJSValue(data)) + } catch (e) { + errorSteps(e) + } + } + + // 5. If object’s body is null, then run successSteps with an + // empty byte sequence. + if (object[kState].body == null) { + successSteps(new Uint8Array()) + return promise.promise + } + + // 6. Otherwise, fully read object’s body given successSteps, + // errorSteps, and object’s relevant global object. + await fullyReadBody(object[kState].body, successSteps, errorSteps) + + // 7. Return promise. + return promise.promise +} - const { - Readable, - Duplex, - PassThrough - } = __nccwpck_require__(2781) - const { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError - } = __nccwpck_require__(8045) - const util = __nccwpck_require__(3983) - const { AsyncResource } = __nccwpck_require__(852) - const { addSignal, removeSignal } = __nccwpck_require__(7032) - const assert = __nccwpck_require__(9491) +// https://fetch.spec.whatwg.org/#body-unusable +function bodyUnusable (body) { + // An object including the Body interface mixin is + // said to be unusable if its body is non-null and + // its body’s stream is disturbed or locked. + return body != null && (body.stream.locked || util.isDisturbed(body.stream)) +} - const kResume = Symbol('resume') +/** + * @see https://encoding.spec.whatwg.org/#utf-8-decode + * @param {Buffer} buffer + */ +function utf8DecodeBytes (buffer) { + if (buffer.length === 0) { + return '' + } + + // 1. Let buffer be the result of peeking three bytes from + // ioQueue, converted to a byte sequence. + + // 2. If buffer is 0xEF 0xBB 0xBF, then read three + // bytes from ioQueue. (Do nothing with those bytes.) + if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) { + buffer = buffer.subarray(3) + } + + // 3. Process a queue with an instance of UTF-8’s + // decoder, ioQueue, output, and "replacement". + const output = textDecoder.decode(buffer) + + // 4. Return output. + return output +} - class PipelineRequest extends Readable { - constructor() { - super({ autoDestroy: true }) +/** + * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value + * @param {Uint8Array} bytes + */ +function parseJSONFromBytes (bytes) { + return JSON.parse(utf8DecodeBytes(bytes)) +} - this[kResume] = null - } +/** + * @see https://fetch.spec.whatwg.org/#concept-body-mime-type + * @param {import('./response').Response|import('./request').Request} object + */ +function bodyMimeType (object) { + const { headersList } = object[kState] + const contentType = headersList.get('content-type') - _read() { - const { [kResume]: resume } = this + if (contentType === null) { + return 'failure' + } - if (resume) { - this[kResume] = null - resume() - } - } + return parseMIMEType(contentType) +} - _destroy(err, callback) { - this._read() +module.exports = { + extractBody, + safelyExtractBody, + cloneBody, + mixinBody +} - callback(err) - } - } - class PipelineResponse extends Readable { - constructor(resume) { - super({ autoDestroy: true }) - this[kResume] = resume - } +/***/ }), - _read() { - this[kResume]() - } +/***/ 1037: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - _destroy(err, callback) { - if (!err && !this._readableState.endEmitted) { - err = new RequestAbortedError() - } +"use strict"; + + +const { MessageChannel, receiveMessageOnPort } = __nccwpck_require__(1267) + +const corsSafeListedMethods = ['GET', 'HEAD', 'POST'] +const corsSafeListedMethodsSet = new Set(corsSafeListedMethods) + +const nullBodyStatus = [101, 204, 205, 304] + +const redirectStatus = [301, 302, 303, 307, 308] +const redirectStatusSet = new Set(redirectStatus) + +// https://fetch.spec.whatwg.org/#block-bad-port +const badPorts = [ + '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79', + '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137', + '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532', + '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723', + '2049', '3659', '4045', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6697', + '10080' +] + +const badPortsSet = new Set(badPorts) + +// https://w3c.github.io/webappsec-referrer-policy/#referrer-policies +const referrerPolicy = [ + '', + 'no-referrer', + 'no-referrer-when-downgrade', + 'same-origin', + 'origin', + 'strict-origin', + 'origin-when-cross-origin', + 'strict-origin-when-cross-origin', + 'unsafe-url' +] +const referrerPolicySet = new Set(referrerPolicy) + +const requestRedirect = ['follow', 'manual', 'error'] + +const safeMethods = ['GET', 'HEAD', 'OPTIONS', 'TRACE'] +const safeMethodsSet = new Set(safeMethods) + +const requestMode = ['navigate', 'same-origin', 'no-cors', 'cors'] + +const requestCredentials = ['omit', 'same-origin', 'include'] + +const requestCache = [ + 'default', + 'no-store', + 'reload', + 'no-cache', + 'force-cache', + 'only-if-cached' +] + +// https://fetch.spec.whatwg.org/#request-body-header-name +const requestBodyHeader = [ + 'content-encoding', + 'content-language', + 'content-location', + 'content-type', + // See https://github.com/nodejs/undici/issues/2021 + // 'Content-Length' is a forbidden header name, which is typically + // removed in the Headers implementation. However, undici doesn't + // filter out headers, so we add it here. + 'content-length' +] + +// https://fetch.spec.whatwg.org/#enumdef-requestduplex +const requestDuplex = [ + 'half' +] + +// http://fetch.spec.whatwg.org/#forbidden-method +const forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK'] +const forbiddenMethodsSet = new Set(forbiddenMethods) + +const subresource = [ + 'audio', + 'audioworklet', + 'font', + 'image', + 'manifest', + 'paintworklet', + 'script', + 'style', + 'track', + 'video', + 'xslt', + '' +] +const subresourceSet = new Set(subresource) + +/** @type {globalThis['DOMException']} */ +const DOMException = globalThis.DOMException ?? (() => { + // DOMException was only made a global in Node v17.0.0, + // but fetch supports >= v16.8. + try { + atob('~') + } catch (err) { + return Object.getPrototypeOf(err).constructor + } +})() - callback(err) - } - } +let channel + +/** @type {globalThis['structuredClone']} */ +const structuredClone = + globalThis.structuredClone ?? + // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js + // structuredClone was added in v17.0.0, but fetch supports v16.8 + function structuredClone (value, options = undefined) { + if (arguments.length === 0) { + throw new TypeError('missing argument') + } + + if (!channel) { + channel = new MessageChannel() + } + channel.port1.unref() + channel.port2.unref() + channel.port1.postMessage(value, options?.transfer) + return receiveMessageOnPort(channel.port2).message + } + +module.exports = { + DOMException, + structuredClone, + subresource, + forbiddenMethods, + requestBodyHeader, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + redirectStatus, + corsSafeListedMethods, + nullBodyStatus, + safeMethods, + badPorts, + requestDuplex, + subresourceSet, + badPortsSet, + redirectStatusSet, + corsSafeListedMethodsSet, + safeMethodsSet, + forbiddenMethodsSet, + referrerPolicySet +} - class PipelineHandler extends AsyncResource { - constructor(opts, handler) { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } - if (typeof handler !== 'function') { - throw new InvalidArgumentError('invalid handler') - } +/***/ }), - const { signal, method, opaque, onInfo, responseHeaders } = opts +/***/ 685: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { - throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') - } +const assert = __nccwpck_require__(9491) +const { atob } = __nccwpck_require__(4300) +const { isomorphicDecode } = __nccwpck_require__(2538) + +const encoder = new TextEncoder() + +/** + * @see https://mimesniff.spec.whatwg.org/#http-token-code-point + */ +const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/ +const HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/ // eslint-disable-line +/** + * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point + */ +const HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/ // eslint-disable-line + +// https://fetch.spec.whatwg.org/#data-url-processor +/** @param {URL} dataURL */ +function dataURLProcessor (dataURL) { + // 1. Assert: dataURL’s scheme is "data". + assert(dataURL.protocol === 'data:') + + // 2. Let input be the result of running the URL + // serializer on dataURL with exclude fragment + // set to true. + let input = URLSerializer(dataURL, true) + + // 3. Remove the leading "data:" string from input. + input = input.slice(5) + + // 4. Let position point at the start of input. + const position = { position: 0 } + + // 5. Let mimeType be the result of collecting a + // sequence of code points that are not equal + // to U+002C (,), given position. + let mimeType = collectASequenceOfCodePointsFast( + ',', + input, + position + ) + + // 6. Strip leading and trailing ASCII whitespace + // from mimeType. + // Undici implementation note: we need to store the + // length because if the mimetype has spaces removed, + // the wrong amount will be sliced from the input in + // step #9 + const mimeTypeLength = mimeType.length + mimeType = removeASCIIWhitespace(mimeType, true, true) + + // 7. If position is past the end of input, then + // return failure + if (position.position >= input.length) { + return 'failure' + } + + // 8. Advance position by 1. + position.position++ + + // 9. Let encodedBody be the remainder of input. + const encodedBody = input.slice(mimeTypeLength + 1) + + // 10. Let body be the percent-decoding of encodedBody. + let body = stringPercentDecode(encodedBody) + + // 11. If mimeType ends with U+003B (;), followed by + // zero or more U+0020 SPACE, followed by an ASCII + // case-insensitive match for "base64", then: + if (/;(\u0020){0,}base64$/i.test(mimeType)) { + // 1. Let stringBody be the isomorphic decode of body. + const stringBody = isomorphicDecode(body) + + // 2. Set body to the forgiving-base64 decode of + // stringBody. + body = forgivingBase64(stringBody) + + // 3. If body is failure, then return failure. + if (body === 'failure') { + return 'failure' + } + + // 4. Remove the last 6 code points from mimeType. + mimeType = mimeType.slice(0, -6) + + // 5. Remove trailing U+0020 SPACE code points from mimeType, + // if any. + mimeType = mimeType.replace(/(\u0020)+$/, '') + + // 6. Remove the last U+003B (;) code point from mimeType. + mimeType = mimeType.slice(0, -1) + } + + // 12. If mimeType starts with U+003B (;), then prepend + // "text/plain" to mimeType. + if (mimeType.startsWith(';')) { + mimeType = 'text/plain' + mimeType + } + + // 13. Let mimeTypeRecord be the result of parsing + // mimeType. + let mimeTypeRecord = parseMIMEType(mimeType) + + // 14. If mimeTypeRecord is failure, then set + // mimeTypeRecord to text/plain;charset=US-ASCII. + if (mimeTypeRecord === 'failure') { + mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII') + } + + // 15. Return a new data: URL struct whose MIME + // type is mimeTypeRecord and body is body. + // https://fetch.spec.whatwg.org/#data-url-struct + return { mimeType: mimeTypeRecord, body } +} - if (method === 'CONNECT') { - throw new InvalidArgumentError('invalid method') - } +// https://url.spec.whatwg.org/#concept-url-serializer +/** + * @param {URL} url + * @param {boolean} excludeFragment + */ +function URLSerializer (url, excludeFragment = false) { + if (!excludeFragment) { + return url.href + } - if (onInfo && typeof onInfo !== 'function') { - throw new InvalidArgumentError('invalid onInfo callback') - } + const href = url.href + const hashLength = url.hash.length - super('UNDICI_PIPELINE') + return hashLength === 0 ? href : href.substring(0, href.length - hashLength) +} - this.opaque = opaque || null - this.responseHeaders = responseHeaders || null - this.handler = handler - this.abort = null - this.context = null - this.onInfo = onInfo || null +// https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points +/** + * @param {(char: string) => boolean} condition + * @param {string} input + * @param {{ position: number }} position + */ +function collectASequenceOfCodePoints (condition, input, position) { + // 1. Let result be the empty string. + let result = '' + + // 2. While position doesn’t point past the end of input and the + // code point at position within input meets the condition condition: + while (position.position < input.length && condition(input[position.position])) { + // 1. Append that code point to the end of result. + result += input[position.position] + + // 2. Advance position by 1. + position.position++ + } + + // 3. Return result. + return result +} - this.req = new PipelineRequest().on('error', util.nop) +/** + * A faster collectASequenceOfCodePoints that only works when comparing a single character. + * @param {string} char + * @param {string} input + * @param {{ position: number }} position + */ +function collectASequenceOfCodePointsFast (char, input, position) { + const idx = input.indexOf(char, position.position) + const start = position.position + + if (idx === -1) { + position.position = input.length + return input.slice(start) + } + + position.position = idx + return input.slice(start, position.position) +} - this.ret = new Duplex({ - readableObjectMode: opts.objectMode, - autoDestroy: true, - read: () => { - const { body } = this +// https://url.spec.whatwg.org/#string-percent-decode +/** @param {string} input */ +function stringPercentDecode (input) { + // 1. Let bytes be the UTF-8 encoding of input. + const bytes = encoder.encode(input) - if (body && body.resume) { - body.resume() - } - }, - write: (chunk, encoding, callback) => { - const { req } = this - - if (req.push(chunk, encoding) || req._readableState.destroyed) { - callback() - } else { - req[kResume] = callback - } - }, - destroy: (err, callback) => { - const { body, req, res, ret, abort } = this + // 2. Return the percent-decoding of bytes. + return percentDecode(bytes) +} - if (!err && !ret._readableState.endEmitted) { - err = new RequestAbortedError() - } +// https://url.spec.whatwg.org/#percent-decode +/** @param {Uint8Array} input */ +function percentDecode (input) { + // 1. Let output be an empty byte sequence. + /** @type {number[]} */ + const output = [] + + // 2. For each byte byte in input: + for (let i = 0; i < input.length; i++) { + const byte = input[i] + + // 1. If byte is not 0x25 (%), then append byte to output. + if (byte !== 0x25) { + output.push(byte) + + // 2. Otherwise, if byte is 0x25 (%) and the next two bytes + // after byte in input are not in the ranges + // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F), + // and 0x61 (a) to 0x66 (f), all inclusive, append byte + // to output. + } else if ( + byte === 0x25 && + !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2])) + ) { + output.push(0x25) + + // 3. Otherwise: + } else { + // 1. Let bytePoint be the two bytes after byte in input, + // decoded, and then interpreted as hexadecimal number. + const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]) + const bytePoint = Number.parseInt(nextTwoBytes, 16) + + // 2. Append a byte whose value is bytePoint to output. + output.push(bytePoint) + + // 3. Skip the next two bytes in input. + i += 2 + } + } + + // 3. Return output. + return Uint8Array.from(output) +} - if (abort && err) { - abort() - } +// https://mimesniff.spec.whatwg.org/#parse-a-mime-type +/** @param {string} input */ +function parseMIMEType (input) { + // 1. Remove any leading and trailing HTTP whitespace + // from input. + input = removeHTTPWhitespace(input, true, true) + + // 2. Let position be a position variable for input, + // initially pointing at the start of input. + const position = { position: 0 } + + // 3. Let type be the result of collecting a sequence + // of code points that are not U+002F (/) from + // input, given position. + const type = collectASequenceOfCodePointsFast( + '/', + input, + position + ) + + // 4. If type is the empty string or does not solely + // contain HTTP token code points, then return failure. + // https://mimesniff.spec.whatwg.org/#http-token-code-point + if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { + return 'failure' + } + + // 5. If position is past the end of input, then return + // failure + if (position.position > input.length) { + return 'failure' + } + + // 6. Advance position by 1. (This skips past U+002F (/).) + position.position++ + + // 7. Let subtype be the result of collecting a sequence of + // code points that are not U+003B (;) from input, given + // position. + let subtype = collectASequenceOfCodePointsFast( + ';', + input, + position + ) + + // 8. Remove any trailing HTTP whitespace from subtype. + subtype = removeHTTPWhitespace(subtype, false, true) + + // 9. If subtype is the empty string or does not solely + // contain HTTP token code points, then return failure. + if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { + return 'failure' + } + + const typeLowercase = type.toLowerCase() + const subtypeLowercase = subtype.toLowerCase() + + // 10. Let mimeType be a new MIME type record whose type + // is type, in ASCII lowercase, and subtype is subtype, + // in ASCII lowercase. + // https://mimesniff.spec.whatwg.org/#mime-type + const mimeType = { + type: typeLowercase, + subtype: subtypeLowercase, + /** @type {Map} */ + parameters: new Map(), + // https://mimesniff.spec.whatwg.org/#mime-type-essence + essence: `${typeLowercase}/${subtypeLowercase}` + } + + // 11. While position is not past the end of input: + while (position.position < input.length) { + // 1. Advance position by 1. (This skips past U+003B (;).) + position.position++ + + // 2. Collect a sequence of code points that are HTTP + // whitespace from input given position. + collectASequenceOfCodePoints( + // https://fetch.spec.whatwg.org/#http-whitespace + char => HTTP_WHITESPACE_REGEX.test(char), + input, + position + ) + + // 3. Let parameterName be the result of collecting a + // sequence of code points that are not U+003B (;) + // or U+003D (=) from input, given position. + let parameterName = collectASequenceOfCodePoints( + (char) => char !== ';' && char !== '=', + input, + position + ) + + // 4. Set parameterName to parameterName, in ASCII + // lowercase. + parameterName = parameterName.toLowerCase() + + // 5. If position is not past the end of input, then: + if (position.position < input.length) { + // 1. If the code point at position within input is + // U+003B (;), then continue. + if (input[position.position] === ';') { + continue + } + + // 2. Advance position by 1. (This skips past U+003D (=).) + position.position++ + } + + // 6. If position is past the end of input, then break. + if (position.position > input.length) { + break + } + + // 7. Let parameterValue be null. + let parameterValue = null + + // 8. If the code point at position within input is + // U+0022 ("), then: + if (input[position.position] === '"') { + // 1. Set parameterValue to the result of collecting + // an HTTP quoted string from input, given position + // and the extract-value flag. + parameterValue = collectAnHTTPQuotedString(input, position, true) + + // 2. Collect a sequence of code points that are not + // U+003B (;) from input, given position. + collectASequenceOfCodePointsFast( + ';', + input, + position + ) + + // 9. Otherwise: + } else { + // 1. Set parameterValue to the result of collecting + // a sequence of code points that are not U+003B (;) + // from input, given position. + parameterValue = collectASequenceOfCodePointsFast( + ';', + input, + position + ) + + // 2. Remove any trailing HTTP whitespace from parameterValue. + parameterValue = removeHTTPWhitespace(parameterValue, false, true) + + // 3. If parameterValue is the empty string, then continue. + if (parameterValue.length === 0) { + continue + } + } + + // 10. If all of the following are true + // - parameterName is not the empty string + // - parameterName solely contains HTTP token code points + // - parameterValue solely contains HTTP quoted-string token code points + // - mimeType’s parameters[parameterName] does not exist + // then set mimeType’s parameters[parameterName] to parameterValue. + if ( + parameterName.length !== 0 && + HTTP_TOKEN_CODEPOINTS.test(parameterName) && + (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && + !mimeType.parameters.has(parameterName) + ) { + mimeType.parameters.set(parameterName, parameterValue) + } + } + + // 12. Return mimeType. + return mimeType +} - util.destroy(body, err) - util.destroy(req, err) - util.destroy(res, err) +// https://infra.spec.whatwg.org/#forgiving-base64-decode +/** @param {string} data */ +function forgivingBase64 (data) { + // 1. Remove all ASCII whitespace from data. + data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, '') // eslint-disable-line + + // 2. If data’s code point length divides by 4 leaving + // no remainder, then: + if (data.length % 4 === 0) { + // 1. If data ends with one or two U+003D (=) code points, + // then remove them from data. + data = data.replace(/=?=$/, '') + } + + // 3. If data’s code point length divides by 4 leaving + // a remainder of 1, then return failure. + if (data.length % 4 === 1) { + return 'failure' + } + + // 4. If data contains a code point that is not one of + // U+002B (+) + // U+002F (/) + // ASCII alphanumeric + // then return failure. + if (/[^+/0-9A-Za-z]/.test(data)) { + return 'failure' + } + + const binary = atob(data) + const bytes = new Uint8Array(binary.length) + + for (let byte = 0; byte < binary.length; byte++) { + bytes[byte] = binary.charCodeAt(byte) + } + + return bytes +} - removeSignal(this) +// https://fetch.spec.whatwg.org/#collect-an-http-quoted-string +// tests: https://fetch.spec.whatwg.org/#example-http-quoted-string +/** + * @param {string} input + * @param {{ position: number }} position + * @param {boolean?} extractValue + */ +function collectAnHTTPQuotedString (input, position, extractValue) { + // 1. Let positionStart be position. + const positionStart = position.position + + // 2. Let value be the empty string. + let value = '' + + // 3. Assert: the code point at position within input + // is U+0022 ("). + assert(input[position.position] === '"') + + // 4. Advance position by 1. + position.position++ + + // 5. While true: + while (true) { + // 1. Append the result of collecting a sequence of code points + // that are not U+0022 (") or U+005C (\) from input, given + // position, to value. + value += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== '\\', + input, + position + ) + + // 2. If position is past the end of input, then break. + if (position.position >= input.length) { + break + } + + // 3. Let quoteOrBackslash be the code point at position within + // input. + const quoteOrBackslash = input[position.position] + + // 4. Advance position by 1. + position.position++ + + // 5. If quoteOrBackslash is U+005C (\), then: + if (quoteOrBackslash === '\\') { + // 1. If position is past the end of input, then append + // U+005C (\) to value and break. + if (position.position >= input.length) { + value += '\\' + break + } + + // 2. Append the code point at position within input to value. + value += input[position.position] + + // 3. Advance position by 1. + position.position++ + + // 6. Otherwise: + } else { + // 1. Assert: quoteOrBackslash is U+0022 ("). + assert(quoteOrBackslash === '"') + + // 2. Break. + break + } + } + + // 6. If the extract-value flag is set, then return value. + if (extractValue) { + return value + } + + // 7. Return the code points from positionStart to position, + // inclusive, within input. + return input.slice(positionStart, position.position) +} - callback(err) - } - }).on('prefinish', () => { - const { req } = this +/** + * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type + */ +function serializeAMimeType (mimeType) { + assert(mimeType !== 'failure') + const { parameters, essence } = mimeType - // Node < 15 does not call _final in same tick. - req.push(null) - }) + // 1. Let serialization be the concatenation of mimeType’s + // type, U+002F (/), and mimeType’s subtype. + let serialization = essence - this.res = null + // 2. For each name → value of mimeType’s parameters: + for (let [name, value] of parameters.entries()) { + // 1. Append U+003B (;) to serialization. + serialization += ';' - addSignal(this, signal) - } + // 2. Append name to serialization. + serialization += name - onConnect(abort, context) { - const { ret, res } = this + // 3. Append U+003D (=) to serialization. + serialization += '=' - assert(!res, 'pipeline cannot be retried') + // 4. If value does not solely contain HTTP token code + // points or value is the empty string, then: + if (!HTTP_TOKEN_CODEPOINTS.test(value)) { + // 1. Precede each occurence of U+0022 (") or + // U+005C (\) in value with U+005C (\). + value = value.replace(/(\\|")/g, '\\$1') - if (ret.destroyed) { - throw new RequestAbortedError() - } + // 2. Prepend U+0022 (") to value. + value = '"' + value - this.abort = abort - this.context = context - } + // 3. Append U+0022 (") to value. + value += '"' + } - onHeaders(statusCode, rawHeaders, resume) { - const { opaque, handler, context } = this + // 5. Append value to serialization. + serialization += value + } - if (statusCode < 200) { - if (this.onInfo) { - const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) - this.onInfo({ statusCode, headers }) - } - return - } + // 3. Return serialization. + return serialization +} - this.res = new PipelineResponse(resume) - - let body - try { - this.handler = null - const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) - body = this.runInAsyncScope(handler, null, { - statusCode, - headers, - opaque, - body: this.res, - context - }) - } catch (err) { - this.res.on('error', util.nop) - throw err - } +/** + * @see https://fetch.spec.whatwg.org/#http-whitespace + * @param {string} char + */ +function isHTTPWhiteSpace (char) { + return char === '\r' || char === '\n' || char === '\t' || char === ' ' +} - if (!body || typeof body.on !== 'function') { - throw new InvalidReturnValueError('expected Readable') - } +/** + * @see https://fetch.spec.whatwg.org/#http-whitespace + * @param {string} str + */ +function removeHTTPWhitespace (str, leading = true, trailing = true) { + let lead = 0 + let trail = str.length - 1 - body - .on('data', (chunk) => { - const { ret, body } = this + if (leading) { + for (; lead < str.length && isHTTPWhiteSpace(str[lead]); lead++); + } - if (!ret.push(chunk) && body.pause) { - body.pause() - } - }) - .on('error', (err) => { - const { ret } = this - - util.destroy(ret, err) - }) - .on('end', () => { - const { ret } = this - - ret.push(null) - }) - .on('close', () => { - const { ret } = this - - if (!ret._readableState.ended) { - util.destroy(ret, new RequestAbortedError()) - } - }) + if (trailing) { + for (; trail > 0 && isHTTPWhiteSpace(str[trail]); trail--); + } - this.body = body - } + return str.slice(lead, trail + 1) +} - onData(chunk) { - const { res } = this - return res.push(chunk) - } +/** + * @see https://infra.spec.whatwg.org/#ascii-whitespace + * @param {string} char + */ +function isASCIIWhitespace (char) { + return char === '\r' || char === '\n' || char === '\t' || char === '\f' || char === ' ' +} - onComplete(trailers) { - const { res } = this - res.push(null) - } +/** + * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace + */ +function removeASCIIWhitespace (str, leading = true, trailing = true) { + let lead = 0 + let trail = str.length - 1 - onError(err) { - const { ret } = this - this.handler = null - util.destroy(ret, err) - } - } + if (leading) { + for (; lead < str.length && isASCIIWhitespace(str[lead]); lead++); + } - function pipeline(opts, handler) { - try { - const pipelineHandler = new PipelineHandler(opts, handler) - this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler) - return pipelineHandler.ret - } catch (err) { - return new PassThrough().destroy(err) - } - } + if (trailing) { + for (; trail > 0 && isASCIIWhitespace(str[trail]); trail--); + } + + return str.slice(lead, trail + 1) +} - module.exports = pipeline +module.exports = { + dataURLProcessor, + URLSerializer, + collectASequenceOfCodePoints, + collectASequenceOfCodePointsFast, + stringPercentDecode, + parseMIMEType, + collectAnHTTPQuotedString, + serializeAMimeType +} - /***/ -}), +/***/ }), -/***/ 5448: +/***/ 8511: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +"use strict"; + + +const { Blob, File: NativeFile } = __nccwpck_require__(4300) +const { types } = __nccwpck_require__(3837) +const { kState } = __nccwpck_require__(5861) +const { isBlobLike } = __nccwpck_require__(2538) +const { webidl } = __nccwpck_require__(1744) +const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685) +const { kEnumerableProperty } = __nccwpck_require__(3983) +const encoder = new TextEncoder() + +class File extends Blob { + constructor (fileBits, fileName, options = {}) { + // The File constructor is invoked with two or three parameters, depending + // on whether the optional dictionary parameter is used. When the File() + // constructor is invoked, user agents must run the following steps: + webidl.argumentLengthCheck(arguments, 2, { header: 'File constructor' }) + + fileBits = webidl.converters['sequence'](fileBits) + fileName = webidl.converters.USVString(fileName) + options = webidl.converters.FilePropertyBag(options) + + // 1. Let bytes be the result of processing blob parts given fileBits and + // options. + // Note: Blob handles this for us + + // 2. Let n be the fileName argument to the constructor. + const n = fileName + + // 3. Process FilePropertyBag dictionary argument by running the following + // substeps: + + // 1. If the type member is provided and is not the empty string, let t + // be set to the type dictionary member. If t contains any characters + // outside the range U+0020 to U+007E, then set t to the empty string + // and return from these substeps. + // 2. Convert every character in t to ASCII lowercase. + let t = options.type + let d + + // eslint-disable-next-line no-labels + substep: { + if (t) { + t = parseMIMEType(t) + + if (t === 'failure') { + t = '' + // eslint-disable-next-line no-labels + break substep + } + + t = serializeAMimeType(t).toLowerCase() + } + + // 3. If the lastModified member is provided, let d be set to the + // lastModified dictionary member. If it is not provided, set d to the + // current date and time represented as the number of milliseconds since + // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]). + d = options.lastModified + } + + // 4. Return a new File object F such that: + // F refers to the bytes byte sequence. + // F.size is set to the number of total bytes in bytes. + // F.name is set to n. + // F.type is set to t. + // F.lastModified is set to d. + + super(processBlobParts(fileBits, options), { type: t }) + this[kState] = { + name: n, + lastModified: d, + type: t + } + } + + get name () { + webidl.brandCheck(this, File) + + return this[kState].name + } + + get lastModified () { + webidl.brandCheck(this, File) + + return this[kState].lastModified + } + + get type () { + webidl.brandCheck(this, File) + + return this[kState].type + } +} +class FileLike { + constructor (blobLike, fileName, options = {}) { + // TODO: argument idl type check - const Readable = __nccwpck_require__(3858) - const { - InvalidArgumentError, - RequestAbortedError - } = __nccwpck_require__(8045) - const util = __nccwpck_require__(3983) - const { getResolveErrorBodyCallback } = __nccwpck_require__(7474) - const { AsyncResource } = __nccwpck_require__(852) - const { addSignal, removeSignal } = __nccwpck_require__(7032) + // The File constructor is invoked with two or three parameters, depending + // on whether the optional dictionary parameter is used. When the File() + // constructor is invoked, user agents must run the following steps: - class RequestHandler extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } + // 1. Let bytes be the result of processing blob parts given fileBits and + // options. - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts + // 2. Let n be the fileName argument to the constructor. + const n = fileName - try { - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } + // 3. Process FilePropertyBag dictionary argument by running the following + // substeps: - if (highWaterMark && (typeof highWaterMark !== 'number' || highWaterMark < 0)) { - throw new InvalidArgumentError('invalid highWaterMark') - } + // 1. If the type member is provided and is not the empty string, let t + // be set to the type dictionary member. If t contains any characters + // outside the range U+0020 to U+007E, then set t to the empty string + // and return from these substeps. + // TODO + const t = options.type - if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { - throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') - } + // 2. Convert every character in t to ASCII lowercase. + // TODO - if (method === 'CONNECT') { - throw new InvalidArgumentError('invalid method') - } + // 3. If the lastModified member is provided, let d be set to the + // lastModified dictionary member. If it is not provided, set d to the + // current date and time represented as the number of milliseconds since + // the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]). + const d = options.lastModified ?? Date.now() - if (onInfo && typeof onInfo !== 'function') { - throw new InvalidArgumentError('invalid onInfo callback') - } + // 4. Return a new File object F such that: + // F refers to the bytes byte sequence. + // F.size is set to the number of total bytes in bytes. + // F.name is set to n. + // F.type is set to t. + // F.lastModified is set to d. - super('UNDICI_REQUEST') - } catch (err) { - if (util.isStream(body)) { - util.destroy(body.on('error', util.nop), err) - } - throw err - } + this[kState] = { + blobLike, + name: n, + type: t, + lastModified: d + } + } - this.responseHeaders = responseHeaders || null - this.opaque = opaque || null - this.callback = callback - this.res = null - this.abort = null - this.body = body - this.trailers = {} - this.context = null - this.onInfo = onInfo || null - this.throwOnError = throwOnError - this.highWaterMark = highWaterMark - - if (util.isStream(body)) { - body.on('error', (err) => { - this.onError(err) - }) - } + stream (...args) { + webidl.brandCheck(this, FileLike) - addSignal(this, signal) - } + return this[kState].blobLike.stream(...args) + } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError() - } + arrayBuffer (...args) { + webidl.brandCheck(this, FileLike) - this.abort = abort - this.context = context - } + return this[kState].blobLike.arrayBuffer(...args) + } - onHeaders(statusCode, rawHeaders, resume, statusMessage) { - const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this + slice (...args) { + webidl.brandCheck(this, FileLike) - const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) + return this[kState].blobLike.slice(...args) + } - if (statusCode < 200) { - if (this.onInfo) { - this.onInfo({ statusCode, headers }) - } - return - } + text (...args) { + webidl.brandCheck(this, FileLike) - const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers - const contentType = parsedHeaders['content-type'] - const body = new Readable({ resume, abort, contentType, highWaterMark }) - - this.callback = null - this.res = body - if (callback !== null) { - if (this.throwOnError && statusCode >= 400) { - this.runInAsyncScope(getResolveErrorBodyCallback, null, - { callback, body, contentType, statusCode, statusMessage, headers } - ) - } else { - this.runInAsyncScope(callback, null, null, { - statusCode, - headers, - trailers: this.trailers, - opaque, - body, - context - }) - } - } - } + return this[kState].blobLike.text(...args) + } - onData(chunk) { - const { res } = this - return res.push(chunk) - } + get size () { + webidl.brandCheck(this, FileLike) - onComplete(trailers) { - const { res } = this + return this[kState].blobLike.size + } - removeSignal(this) + get type () { + webidl.brandCheck(this, FileLike) - util.parseHeaders(trailers, this.trailers) + return this[kState].blobLike.type + } - res.push(null) - } + get name () { + webidl.brandCheck(this, FileLike) - onError(err) { - const { res, callback, body, opaque } = this + return this[kState].name + } - removeSignal(this) + get lastModified () { + webidl.brandCheck(this, FileLike) - if (callback) { - // TODO: Does this need queueMicrotask? - this.callback = null - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }) - }) - } + return this[kState].lastModified + } - if (res) { - this.res = null - // Ensure all queued handlers are invoked before destroying res. - queueMicrotask(() => { - util.destroy(res, err) - }) - } + get [Symbol.toStringTag] () { + return 'File' + } +} - if (body) { - this.body = null - util.destroy(body, err) - } - } - } +Object.defineProperties(File.prototype, { + [Symbol.toStringTag]: { + value: 'File', + configurable: true + }, + name: kEnumerableProperty, + lastModified: kEnumerableProperty +}) - function request(opts, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - request.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data) - }) - }) - } +webidl.converters.Blob = webidl.interfaceConverter(Blob) - try { - this.dispatch(opts, new RequestHandler(opts, callback)) - } catch (err) { - if (typeof callback !== 'function') { - throw err - } - const opaque = opts && opts.opaque - queueMicrotask(() => callback(err, { opaque })) - } - } +webidl.converters.BlobPart = function (V, opts) { + if (webidl.util.Type(V) === 'Object') { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }) + } - module.exports = request - module.exports.RequestHandler = RequestHandler + if ( + ArrayBuffer.isView(V) || + types.isAnyArrayBuffer(V) + ) { + return webidl.converters.BufferSource(V, opts) + } + } + return webidl.converters.USVString(V, opts) +} - /***/ -}), +webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.BlobPart +) + +// https://www.w3.org/TR/FileAPI/#dfn-FilePropertyBag +webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ + { + key: 'lastModified', + converter: webidl.converters['long long'], + get defaultValue () { + return Date.now() + } + }, + { + key: 'type', + converter: webidl.converters.DOMString, + defaultValue: '' + }, + { + key: 'endings', + converter: (value) => { + value = webidl.converters.DOMString(value) + value = value.toLowerCase() + + if (value !== 'native') { + value = 'transparent' + } + + return value + }, + defaultValue: 'transparent' + } +]) + +/** + * @see https://www.w3.org/TR/FileAPI/#process-blob-parts + * @param {(NodeJS.TypedArray|Blob|string)[]} parts + * @param {{ type: string, endings: string }} options + */ +function processBlobParts (parts, options) { + // 1. Let bytes be an empty sequence of bytes. + /** @type {NodeJS.TypedArray[]} */ + const bytes = [] + + // 2. For each element in parts: + for (const element of parts) { + // 1. If element is a USVString, run the following substeps: + if (typeof element === 'string') { + // 1. Let s be element. + let s = element + + // 2. If the endings member of options is "native", set s + // to the result of converting line endings to native + // of element. + if (options.endings === 'native') { + s = convertLineEndingsNative(s) + } + + // 3. Append the result of UTF-8 encoding s to bytes. + bytes.push(encoder.encode(s)) + } else if ( + types.isAnyArrayBuffer(element) || + types.isTypedArray(element) + ) { + // 2. If element is a BufferSource, get a copy of the + // bytes held by the buffer source, and append those + // bytes to bytes. + if (!element.buffer) { // ArrayBuffer + bytes.push(new Uint8Array(element)) + } else { + bytes.push( + new Uint8Array(element.buffer, element.byteOffset, element.byteLength) + ) + } + } else if (isBlobLike(element)) { + // 3. If element is a Blob, append the bytes it represents + // to bytes. + bytes.push(element) + } + } + + // 3. Return bytes. + return bytes +} -/***/ 5395: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/** + * @see https://www.w3.org/TR/FileAPI/#convert-line-endings-to-native + * @param {string} s + */ +function convertLineEndingsNative (s) { + // 1. Let native line ending be be the code point U+000A LF. + let nativeLineEnding = '\n' + + // 2. If the underlying platform’s conventions are to + // represent newlines as a carriage return and line feed + // sequence, set native line ending to the code point + // U+000D CR followed by the code point U+000A LF. + if (process.platform === 'win32') { + nativeLineEnding = '\r\n' + } + + return s.replace(/\r?\n/g, nativeLineEnding) +} - "use strict"; +// If this function is moved to ./util.js, some tools (such as +// rollup) will warn about circular dependencies. See: +// https://github.com/nodejs/undici/issues/1629 +function isFileLike (object) { + return ( + (NativeFile && object instanceof NativeFile) || + object instanceof File || ( + object && + (typeof object.stream === 'function' || + typeof object.arrayBuffer === 'function') && + object[Symbol.toStringTag] === 'File' + ) + ) +} +module.exports = { File, FileLike, isFileLike } - const { finished, PassThrough } = __nccwpck_require__(2781) - const { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError - } = __nccwpck_require__(8045) - const util = __nccwpck_require__(3983) - const { getResolveErrorBodyCallback } = __nccwpck_require__(7474) - const { AsyncResource } = __nccwpck_require__(852) - const { addSignal, removeSignal } = __nccwpck_require__(7032) - class StreamHandler extends AsyncResource { - constructor(opts, factory, callback) { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } +/***/ }), - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts +/***/ 2015: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - try { - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } +"use strict"; - if (typeof factory !== 'function') { - throw new InvalidArgumentError('invalid factory') - } - if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { - throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') - } +const { isBlobLike, toUSVString, makeIterator } = __nccwpck_require__(2538) +const { kState } = __nccwpck_require__(5861) +const { File: UndiciFile, FileLike, isFileLike } = __nccwpck_require__(8511) +const { webidl } = __nccwpck_require__(1744) +const { Blob, File: NativeFile } = __nccwpck_require__(4300) - if (method === 'CONNECT') { - throw new InvalidArgumentError('invalid method') - } +/** @type {globalThis['File']} */ +const File = NativeFile ?? UndiciFile - if (onInfo && typeof onInfo !== 'function') { - throw new InvalidArgumentError('invalid onInfo callback') - } +// https://xhr.spec.whatwg.org/#formdata +class FormData { + constructor (form) { + if (form !== undefined) { + throw webidl.errors.conversionFailed({ + prefix: 'FormData constructor', + argument: 'Argument 1', + types: ['undefined'] + }) + } - super('UNDICI_STREAM') - } catch (err) { - if (util.isStream(body)) { - util.destroy(body.on('error', util.nop), err) - } - throw err - } + this[kState] = [] + } - this.responseHeaders = responseHeaders || null - this.opaque = opaque || null - this.factory = factory - this.callback = callback - this.res = null - this.abort = null - this.context = null - this.trailers = null - this.body = body - this.onInfo = onInfo || null - this.throwOnError = throwOnError || false - - if (util.isStream(body)) { - body.on('error', (err) => { - this.onError(err) - }) - } + append (name, value, filename = undefined) { + webidl.brandCheck(this, FormData) - addSignal(this, signal) - } + webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.append' }) - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError() - } + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" + ) + } - this.abort = abort - this.context = context - } + // 1. Let value be value if given; otherwise blobValue. - onHeaders(statusCode, rawHeaders, resume, statusMessage) { - const { factory, opaque, context, callback, responseHeaders } = this + name = webidl.converters.USVString(name) + value = isBlobLike(value) + ? webidl.converters.Blob(value, { strict: false }) + : webidl.converters.USVString(value) + filename = arguments.length === 3 + ? webidl.converters.USVString(filename) + : undefined - const headers = responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) + // 2. Let entry be the result of creating an entry with + // name, value, and filename if given. + const entry = makeEntry(name, value, filename) - if (statusCode < 200) { - if (this.onInfo) { - this.onInfo({ statusCode, headers }) - } - return - } + // 3. Append entry to this’s entry list. + this[kState].push(entry) + } + + delete (name) { + webidl.brandCheck(this, FormData) - this.factory = null + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.delete' }) - let res + name = webidl.converters.USVString(name) - if (this.throwOnError && statusCode >= 400) { - const parsedHeaders = responseHeaders === 'raw' ? util.parseHeaders(rawHeaders) : headers - const contentType = parsedHeaders['content-type'] - res = new PassThrough() + // The delete(name) method steps are to remove all entries whose name + // is name from this’s entry list. + this[kState] = this[kState].filter(entry => entry.name !== name) + } + + get (name) { + webidl.brandCheck(this, FormData) - this.callback = null - this.runInAsyncScope(getResolveErrorBodyCallback, null, - { callback, body: res, contentType, statusCode, statusMessage, headers } - ) - } else { - if (factory === null) { - return - } + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.get' }) + + name = webidl.converters.USVString(name) + + // 1. If there is no entry whose name is name in this’s entry list, + // then return null. + const idx = this[kState].findIndex((entry) => entry.name === name) + if (idx === -1) { + return null + } + + // 2. Return the value of the first entry whose name is name from + // this’s entry list. + return this[kState][idx].value + } + + getAll (name) { + webidl.brandCheck(this, FormData) + + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.getAll' }) + + name = webidl.converters.USVString(name) + + // 1. If there is no entry whose name is name in this’s entry list, + // then return the empty list. + // 2. Return the values of all entries whose name is name, in order, + // from this’s entry list. + return this[kState] + .filter((entry) => entry.name === name) + .map((entry) => entry.value) + } + + has (name) { + webidl.brandCheck(this, FormData) + + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.has' }) + + name = webidl.converters.USVString(name) + + // The has(name) method steps are to return true if there is an entry + // whose name is name in this’s entry list; otherwise false. + return this[kState].findIndex((entry) => entry.name === name) !== -1 + } + + set (name, value, filename = undefined) { + webidl.brandCheck(this, FormData) + + webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.set' }) + + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" + ) + } + + // The set(name, value) and set(name, blobValue, filename) method steps + // are: + + // 1. Let value be value if given; otherwise blobValue. + + name = webidl.converters.USVString(name) + value = isBlobLike(value) + ? webidl.converters.Blob(value, { strict: false }) + : webidl.converters.USVString(value) + filename = arguments.length === 3 + ? toUSVString(filename) + : undefined + + // 2. Let entry be the result of creating an entry with name, value, and + // filename if given. + const entry = makeEntry(name, value, filename) + + // 3. If there are entries in this’s entry list whose name is name, then + // replace the first such entry with entry and remove the others. + const idx = this[kState].findIndex((entry) => entry.name === name) + if (idx !== -1) { + this[kState] = [ + ...this[kState].slice(0, idx), + entry, + ...this[kState].slice(idx + 1).filter((entry) => entry.name !== name) + ] + } else { + // 4. Otherwise, append entry to this’s entry list. + this[kState].push(entry) + } + } + + entries () { + webidl.brandCheck(this, FormData) + + return makeIterator( + () => this[kState].map(pair => [pair.name, pair.value]), + 'FormData', + 'key+value' + ) + } + + keys () { + webidl.brandCheck(this, FormData) + + return makeIterator( + () => this[kState].map(pair => [pair.name, pair.value]), + 'FormData', + 'key' + ) + } + + values () { + webidl.brandCheck(this, FormData) + + return makeIterator( + () => this[kState].map(pair => [pair.name, pair.value]), + 'FormData', + 'value' + ) + } + + /** + * @param {(value: string, key: string, self: FormData) => void} callbackFn + * @param {unknown} thisArg + */ + forEach (callbackFn, thisArg = globalThis) { + webidl.brandCheck(this, FormData) + + webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.forEach' }) + + if (typeof callbackFn !== 'function') { + throw new TypeError( + "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'." + ) + } + + for (const [key, value] of this) { + callbackFn.apply(thisArg, [value, key, this]) + } + } +} - res = this.runInAsyncScope(factory, null, { - statusCode, - headers, - opaque, - context - }) - - if ( - !res || - typeof res.write !== 'function' || - typeof res.end !== 'function' || - typeof res.on !== 'function' - ) { - throw new InvalidReturnValueError('expected Writable') - } +FormData.prototype[Symbol.iterator] = FormData.prototype.entries - // TODO: Avoid finished. It registers an unnecessary amount of listeners. - finished(res, { readable: false }, (err) => { - const { callback, res, opaque, trailers, abort } = this +Object.defineProperties(FormData.prototype, { + [Symbol.toStringTag]: { + value: 'FormData', + configurable: true + } +}) - this.res = null - if (err || !res.readable) { - util.destroy(res, err) - } +/** + * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry + * @param {string} name + * @param {string|Blob} value + * @param {?string} filename + * @returns + */ +function makeEntry (name, value, filename) { + // 1. Set name to the result of converting name into a scalar value string. + // "To convert a string into a scalar value string, replace any surrogates + // with U+FFFD." + // see: https://nodejs.org/dist/latest-v18.x/docs/api/buffer.html#buftostringencoding-start-end + name = Buffer.from(name).toString('utf8') + + // 2. If value is a string, then set value to the result of converting + // value into a scalar value string. + if (typeof value === 'string') { + value = Buffer.from(value).toString('utf8') + } else { + // 3. Otherwise: + + // 1. If value is not a File object, then set value to a new File object, + // representing the same bytes, whose name attribute value is "blob" + if (!isFileLike(value)) { + value = value instanceof Blob + ? new File([value], 'blob', { type: value.type }) + : new FileLike(value, 'blob', { type: value.type }) + } + + // 2. If filename is given, then set value to a new File object, + // representing the same bytes, whose name attribute is filename. + if (filename !== undefined) { + /** @type {FilePropertyBag} */ + const options = { + type: value.type, + lastModified: value.lastModified + } + + value = (NativeFile && value instanceof NativeFile) || value instanceof UndiciFile + ? new File([value], filename, options) + : new FileLike(value, filename, options) + } + } + + // 4. Return an entry whose name is name and whose value is value. + return { name, value } +} - this.callback = null - this.runInAsyncScope(callback, null, err || null, { opaque, trailers }) +module.exports = { FormData } - if (err) { - abort() - } - }) - } - res.on('drain', resume) +/***/ }), - this.res = res +/***/ 1246: +/***/ ((module) => { - const needDrain = res.writableNeedDrain !== undefined - ? res.writableNeedDrain - : res._writableState && res._writableState.needDrain +"use strict"; - return needDrain !== true - } - onData(chunk) { - const { res } = this +// In case of breaking changes, increase the version +// number to avoid conflicts. +const globalOrigin = Symbol.for('undici.globalOrigin.1') - return res ? res.write(chunk) : true - } +function getGlobalOrigin () { + return globalThis[globalOrigin] +} - onComplete(trailers) { - const { res } = this +function setGlobalOrigin (newOrigin) { + if (newOrigin === undefined) { + Object.defineProperty(globalThis, globalOrigin, { + value: undefined, + writable: true, + enumerable: false, + configurable: false + }) + + return + } + + const parsedURL = new URL(newOrigin) + + if (parsedURL.protocol !== 'http:' && parsedURL.protocol !== 'https:') { + throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`) + } + + Object.defineProperty(globalThis, globalOrigin, { + value: parsedURL, + writable: true, + enumerable: false, + configurable: false + }) +} - removeSignal(this) +module.exports = { + getGlobalOrigin, + setGlobalOrigin +} - if (!res) { - return - } - this.trailers = util.parseHeaders(trailers) +/***/ }), - res.end() - } +/***/ 554: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - onError(err) { - const { res, callback, opaque, body } = this +"use strict"; +// https://github.com/Ethan-Arrowood/undici-fetch - removeSignal(this) - this.factory = null - if (res) { - this.res = null - util.destroy(res, err) - } else if (callback) { - this.callback = null - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }) - }) - } +const { kHeadersList, kConstruct } = __nccwpck_require__(2785) +const { kGuard } = __nccwpck_require__(5861) +const { kEnumerableProperty } = __nccwpck_require__(3983) +const { + makeIterator, + isValidHeaderName, + isValidHeaderValue +} = __nccwpck_require__(2538) +const { webidl } = __nccwpck_require__(1744) +const assert = __nccwpck_require__(9491) - if (body) { - this.body = null - util.destroy(body, err) - } - } - } +const kHeadersMap = Symbol('headers map') +const kHeadersSortedMap = Symbol('headers map sorted') - function stream(opts, factory, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - stream.call(this, opts, factory, (err, data) => { - return err ? reject(err) : resolve(data) - }) - }) - } +/** + * @param {number} code + */ +function isHTTPWhiteSpaceCharCode (code) { + return code === 0x00a || code === 0x00d || code === 0x009 || code === 0x020 +} - try { - this.dispatch(opts, new StreamHandler(opts, factory, callback)) - } catch (err) { - if (typeof callback !== 'function') { - throw err - } - const opaque = opts && opts.opaque - queueMicrotask(() => callback(err, { opaque })) - } - } +/** + * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize + * @param {string} potentialValue + */ +function headerValueNormalize (potentialValue) { + // To normalize a byte sequence potentialValue, remove + // any leading and trailing HTTP whitespace bytes from + // potentialValue. + let i = 0; let j = potentialValue.length - module.exports = stream + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j + while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i + return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j) +} - /***/ -}), +function fill (headers, object) { + // To fill a Headers object headers with a given object object, run these steps: + + // 1. If object is a sequence, then for each header in object: + // Note: webidl conversion to array has already been done. + if (Array.isArray(object)) { + for (let i = 0; i < object.length; ++i) { + const header = object[i] + // 1. If header does not contain exactly two items, then throw a TypeError. + if (header.length !== 2) { + throw webidl.errors.exception({ + header: 'Headers constructor', + message: `expected name/value pair to be length 2, found ${header.length}.` + }) + } + + // 2. Append (header’s first item, header’s second item) to headers. + appendHeader(headers, header[0], header[1]) + } + } else if (typeof object === 'object' && object !== null) { + // Note: null should throw + + // 2. Otherwise, object is a record, then for each key → value in object, + // append (key, value) to headers + const keys = Object.keys(object) + for (let i = 0; i < keys.length; ++i) { + appendHeader(headers, keys[i], object[keys[i]]) + } + } else { + throw webidl.errors.conversionFailed({ + prefix: 'Headers constructor', + argument: 'Argument 1', + types: ['sequence>', 'record'] + }) + } +} -/***/ 6923: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/** + * @see https://fetch.spec.whatwg.org/#concept-headers-append + */ +function appendHeader (headers, name, value) { + // 1. Normalize value. + value = headerValueNormalize(value) + + // 2. If name is not a header name or value is not a + // header value, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.append', + value: name, + type: 'header name' + }) + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.append', + value, + type: 'header value' + }) + } + + // 3. If headers’s guard is "immutable", then throw a TypeError. + // 4. Otherwise, if headers’s guard is "request" and name is a + // forbidden header name, return. + // Note: undici does not implement forbidden header names + if (headers[kGuard] === 'immutable') { + throw new TypeError('immutable') + } else if (headers[kGuard] === 'request-no-cors') { + // 5. Otherwise, if headers’s guard is "request-no-cors": + // TODO + } + + // 6. Otherwise, if headers’s guard is "response" and name is a + // forbidden response-header name, return. + + // 7. Append (name, value) to headers’s header list. + return headers[kHeadersList].append(name, value) + + // 8. If headers’s guard is "request-no-cors", then remove + // privileged no-CORS request headers from headers +} - "use strict"; +class HeadersList { + /** @type {[string, string][]|null} */ + cookies = null + + constructor (init) { + if (init instanceof HeadersList) { + this[kHeadersMap] = new Map(init[kHeadersMap]) + this[kHeadersSortedMap] = init[kHeadersSortedMap] + this.cookies = init.cookies === null ? null : [...init.cookies] + } else { + this[kHeadersMap] = new Map(init) + this[kHeadersSortedMap] = null + } + } + + // https://fetch.spec.whatwg.org/#header-list-contains + contains (name) { + // A header list list contains a header name name if list + // contains a header whose name is a byte-case-insensitive + // match for name. + name = name.toLowerCase() + + return this[kHeadersMap].has(name) + } + + clear () { + this[kHeadersMap].clear() + this[kHeadersSortedMap] = null + this.cookies = null + } + + // https://fetch.spec.whatwg.org/#concept-header-list-append + append (name, value) { + this[kHeadersSortedMap] = null + + // 1. If list contains name, then set name to the first such + // header’s name. + const lowercaseName = name.toLowerCase() + const exists = this[kHeadersMap].get(lowercaseName) + + // 2. Append (name, value) to list. + if (exists) { + const delimiter = lowercaseName === 'cookie' ? '; ' : ', ' + this[kHeadersMap].set(lowercaseName, { + name: exists.name, + value: `${exists.value}${delimiter}${value}` + }) + } else { + this[kHeadersMap].set(lowercaseName, { name, value }) + } + + if (lowercaseName === 'set-cookie') { + this.cookies ??= [] + this.cookies.push(value) + } + } + + // https://fetch.spec.whatwg.org/#concept-header-list-set + set (name, value) { + this[kHeadersSortedMap] = null + const lowercaseName = name.toLowerCase() + + if (lowercaseName === 'set-cookie') { + this.cookies = [value] + } + + // 1. If list contains name, then set the value of + // the first such header to value and remove the + // others. + // 2. Otherwise, append header (name, value) to list. + this[kHeadersMap].set(lowercaseName, { name, value }) + } + + // https://fetch.spec.whatwg.org/#concept-header-list-delete + delete (name) { + this[kHeadersSortedMap] = null + + name = name.toLowerCase() + + if (name === 'set-cookie') { + this.cookies = null + } + + this[kHeadersMap].delete(name) + } + + // https://fetch.spec.whatwg.org/#concept-header-list-get + get (name) { + const value = this[kHeadersMap].get(name.toLowerCase()) + + // 1. If list does not contain name, then return null. + // 2. Return the values of all headers in list whose name + // is a byte-case-insensitive match for name, + // separated from each other by 0x2C 0x20, in order. + return value === undefined ? null : value.value + } + + * [Symbol.iterator] () { + // use the lowercased name + for (const [name, { value }] of this[kHeadersMap]) { + yield [name, value] + } + } + + get entries () { + const headers = {} + + if (this[kHeadersMap].size) { + for (const { name, value } of this[kHeadersMap].values()) { + headers[name] = value + } + } + + return headers + } +} +// https://fetch.spec.whatwg.org/#headers-class +class Headers { + constructor (init = undefined) { + if (init === kConstruct) { + return + } + this[kHeadersList] = new HeadersList() + + // The new Headers(init) constructor steps are: + + // 1. Set this’s guard to "none". + this[kGuard] = 'none' + + // 2. If init is given, then fill this with init. + if (init !== undefined) { + init = webidl.converters.HeadersInit(init) + fill(this, init) + } + } + + // https://fetch.spec.whatwg.org/#dom-headers-append + append (name, value) { + webidl.brandCheck(this, Headers) + + webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.append' }) + + name = webidl.converters.ByteString(name) + value = webidl.converters.ByteString(value) + + return appendHeader(this, name, value) + } + + // https://fetch.spec.whatwg.org/#dom-headers-delete + delete (name) { + webidl.brandCheck(this, Headers) + + webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.delete' }) + + name = webidl.converters.ByteString(name) + + // 1. If name is not a header name, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.delete', + value: name, + type: 'header name' + }) + } + + // 2. If this’s guard is "immutable", then throw a TypeError. + // 3. Otherwise, if this’s guard is "request" and name is a + // forbidden header name, return. + // 4. Otherwise, if this’s guard is "request-no-cors", name + // is not a no-CORS-safelisted request-header name, and + // name is not a privileged no-CORS request-header name, + // return. + // 5. Otherwise, if this’s guard is "response" and name is + // a forbidden response-header name, return. + // Note: undici does not implement forbidden header names + if (this[kGuard] === 'immutable') { + throw new TypeError('immutable') + } else if (this[kGuard] === 'request-no-cors') { + // TODO + } + + // 6. If this’s header list does not contain name, then + // return. + if (!this[kHeadersList].contains(name)) { + return + } + + // 7. Delete name from this’s header list. + // 8. If this’s guard is "request-no-cors", then remove + // privileged no-CORS request headers from this. + this[kHeadersList].delete(name) + } + + // https://fetch.spec.whatwg.org/#dom-headers-get + get (name) { + webidl.brandCheck(this, Headers) + + webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.get' }) + + name = webidl.converters.ByteString(name) + + // 1. If name is not a header name, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.get', + value: name, + type: 'header name' + }) + } + + // 2. Return the result of getting name from this’s header + // list. + return this[kHeadersList].get(name) + } + + // https://fetch.spec.whatwg.org/#dom-headers-has + has (name) { + webidl.brandCheck(this, Headers) + + webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.has' }) + + name = webidl.converters.ByteString(name) + + // 1. If name is not a header name, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.has', + value: name, + type: 'header name' + }) + } + + // 2. Return true if this’s header list contains name; + // otherwise false. + return this[kHeadersList].contains(name) + } + + // https://fetch.spec.whatwg.org/#dom-headers-set + set (name, value) { + webidl.brandCheck(this, Headers) + + webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.set' }) + + name = webidl.converters.ByteString(name) + value = webidl.converters.ByteString(value) + + // 1. Normalize value. + value = headerValueNormalize(value) + + // 2. If name is not a header name or value is not a + // header value, then throw a TypeError. + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.set', + value: name, + type: 'header name' + }) + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: 'Headers.set', + value, + type: 'header value' + }) + } + + // 3. If this’s guard is "immutable", then throw a TypeError. + // 4. Otherwise, if this’s guard is "request" and name is a + // forbidden header name, return. + // 5. Otherwise, if this’s guard is "request-no-cors" and + // name/value is not a no-CORS-safelisted request-header, + // return. + // 6. Otherwise, if this’s guard is "response" and name is a + // forbidden response-header name, return. + // Note: undici does not implement forbidden header names + if (this[kGuard] === 'immutable') { + throw new TypeError('immutable') + } else if (this[kGuard] === 'request-no-cors') { + // TODO + } + + // 7. Set (name, value) in this’s header list. + // 8. If this’s guard is "request-no-cors", then remove + // privileged no-CORS request headers from this + this[kHeadersList].set(name, value) + } + + // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie + getSetCookie () { + webidl.brandCheck(this, Headers) + + // 1. If this’s header list does not contain `Set-Cookie`, then return « ». + // 2. Return the values of all headers in this’s header list whose name is + // a byte-case-insensitive match for `Set-Cookie`, in order. + + const list = this[kHeadersList].cookies + + if (list) { + return [...list] + } + + return [] + } + + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + get [kHeadersSortedMap] () { + if (this[kHeadersList][kHeadersSortedMap]) { + return this[kHeadersList][kHeadersSortedMap] + } + + // 1. Let headers be an empty list of headers with the key being the name + // and value the value. + const headers = [] + + // 2. Let names be the result of convert header names to a sorted-lowercase + // set with all the names of the headers in list. + const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1) + const cookies = this[kHeadersList].cookies + + // 3. For each name of names: + for (let i = 0; i < names.length; ++i) { + const [name, value] = names[i] + // 1. If name is `set-cookie`, then: + if (name === 'set-cookie') { + // 1. Let values be a list of all values of headers in list whose name + // is a byte-case-insensitive match for name, in order. + + // 2. For each value of values: + // 1. Append (name, value) to headers. + for (let j = 0; j < cookies.length; ++j) { + headers.push([name, cookies[j]]) + } + } else { + // 2. Otherwise: + + // 1. Let value be the result of getting name from list. + + // 2. Assert: value is non-null. + assert(value !== null) + + // 3. Append (name, value) to headers. + headers.push([name, value]) + } + } + + this[kHeadersList][kHeadersSortedMap] = headers + + // 4. Return headers. + return headers + } + + keys () { + webidl.brandCheck(this, Headers) + + if (this[kGuard] === 'immutable') { + const value = this[kHeadersSortedMap] + return makeIterator(() => value, 'Headers', + 'key') + } + + return makeIterator( + () => [...this[kHeadersSortedMap].values()], + 'Headers', + 'key' + ) + } + + values () { + webidl.brandCheck(this, Headers) + + if (this[kGuard] === 'immutable') { + const value = this[kHeadersSortedMap] + return makeIterator(() => value, 'Headers', + 'value') + } + + return makeIterator( + () => [...this[kHeadersSortedMap].values()], + 'Headers', + 'value' + ) + } + + entries () { + webidl.brandCheck(this, Headers) + + if (this[kGuard] === 'immutable') { + const value = this[kHeadersSortedMap] + return makeIterator(() => value, 'Headers', + 'key+value') + } + + return makeIterator( + () => [...this[kHeadersSortedMap].values()], + 'Headers', + 'key+value' + ) + } + + /** + * @param {(value: string, key: string, self: Headers) => void} callbackFn + * @param {unknown} thisArg + */ + forEach (callbackFn, thisArg = globalThis) { + webidl.brandCheck(this, Headers) + + webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.forEach' }) + + if (typeof callbackFn !== 'function') { + throw new TypeError( + "Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'." + ) + } + + for (const [key, value] of this) { + callbackFn.apply(thisArg, [value, key, this]) + } + } + + [Symbol.for('nodejs.util.inspect.custom')] () { + webidl.brandCheck(this, Headers) + + return this[kHeadersList] + } +} - const { InvalidArgumentError, RequestAbortedError, SocketError } = __nccwpck_require__(8045) - const { AsyncResource } = __nccwpck_require__(852) - const util = __nccwpck_require__(3983) - const { addSignal, removeSignal } = __nccwpck_require__(7032) - const assert = __nccwpck_require__(9491) +Headers.prototype[Symbol.iterator] = Headers.prototype.entries + +Object.defineProperties(Headers.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, + getSetCookie: kEnumerableProperty, + keys: kEnumerableProperty, + values: kEnumerableProperty, + entries: kEnumerableProperty, + forEach: kEnumerableProperty, + [Symbol.iterator]: { enumerable: false }, + [Symbol.toStringTag]: { + value: 'Headers', + configurable: true + } +}) - class UpgradeHandler extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('invalid opts') - } +webidl.converters.HeadersInit = function (V) { + if (webidl.util.Type(V) === 'Object') { + if (V[Symbol.iterator]) { + return webidl.converters['sequence>'](V) + } - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } + return webidl.converters['record'](V) + } - const { signal, opaque, responseHeaders } = opts + throw webidl.errors.conversionFailed({ + prefix: 'Headers constructor', + argument: 'Argument 1', + types: ['sequence>', 'record'] + }) +} - if (signal && typeof signal.on !== 'function' && typeof signal.addEventListener !== 'function') { - throw new InvalidArgumentError('signal must be an EventEmitter or EventTarget') - } +module.exports = { + fill, + Headers, + HeadersList +} - super('UNDICI_UPGRADE') - this.responseHeaders = responseHeaders || null - this.opaque = opaque || null - this.callback = callback - this.abort = null - this.context = null +/***/ }), - addSignal(this, signal) - } +/***/ 4881: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError() - } +"use strict"; +// https://github.com/Ethan-Arrowood/undici-fetch + + + +const { + Response, + makeNetworkError, + makeAppropriateNetworkError, + filterResponse, + makeResponse +} = __nccwpck_require__(7823) +const { Headers } = __nccwpck_require__(554) +const { Request, makeRequest } = __nccwpck_require__(8359) +const zlib = __nccwpck_require__(9796) +const { + bytesMatch, + makePolicyContainer, + clonePolicyContainer, + requestBadPort, + TAOCheck, + appendRequestOriginHeader, + responseLocationURL, + requestCurrentURL, + setRequestReferrerPolicyOnRedirect, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + createOpaqueTimingInfo, + appendFetchMetadata, + corsCheck, + crossOriginResourcePolicyCheck, + determineRequestsReferrer, + coarsenedSharedCurrentTime, + createDeferredPromise, + isBlobLike, + sameOrigin, + isCancelled, + isAborted, + isErrorLike, + fullyReadBody, + readableStreamClose, + isomorphicEncode, + urlIsLocal, + urlIsHttpHttpsScheme, + urlHasHttpsScheme +} = __nccwpck_require__(2538) +const { kState, kHeaders, kGuard, kRealm } = __nccwpck_require__(5861) +const assert = __nccwpck_require__(9491) +const { safelyExtractBody } = __nccwpck_require__(1472) +const { + redirectStatusSet, + nullBodyStatus, + safeMethodsSet, + requestBodyHeader, + subresourceSet, + DOMException +} = __nccwpck_require__(1037) +const { kHeadersList } = __nccwpck_require__(2785) +const EE = __nccwpck_require__(2361) +const { Readable, pipeline } = __nccwpck_require__(2781) +const { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = __nccwpck_require__(3983) +const { dataURLProcessor, serializeAMimeType } = __nccwpck_require__(685) +const { TransformStream } = __nccwpck_require__(5356) +const { getGlobalDispatcher } = __nccwpck_require__(1892) +const { webidl } = __nccwpck_require__(1744) +const { STATUS_CODES } = __nccwpck_require__(3685) +const GET_OR_HEAD = ['GET', 'HEAD'] + +/** @type {import('buffer').resolveObjectURL} */ +let resolveObjectURL +let ReadableStream = globalThis.ReadableStream + +class Fetch extends EE { + constructor (dispatcher) { + super() + + this.dispatcher = dispatcher + this.connection = null + this.dump = false + this.state = 'ongoing' + // 2 terminated listeners get added per request, + // but only 1 gets removed. If there are 20 redirects, + // 21 listeners will be added. + // See https://github.com/nodejs/undici/issues/1711 + // TODO (fix): Find and fix root cause for leaked listener. + this.setMaxListeners(21) + } + + terminate (reason) { + if (this.state !== 'ongoing') { + return + } + + this.state = 'terminated' + this.connection?.destroy(reason) + this.emit('terminated', reason) + } + + // https://fetch.spec.whatwg.org/#fetch-controller-abort + abort (error) { + if (this.state !== 'ongoing') { + return + } + + // 1. Set controller’s state to "aborted". + this.state = 'aborted' + + // 2. Let fallbackError be an "AbortError" DOMException. + // 3. Set error to fallbackError if it is not given. + if (!error) { + error = new DOMException('The operation was aborted.', 'AbortError') + } + + // 4. Let serializedError be StructuredSerialize(error). + // If that threw an exception, catch it, and let + // serializedError be StructuredSerialize(fallbackError). + + // 5. Set controller’s serialized abort reason to serializedError. + this.serializedAbortReason = error + + this.connection?.destroy(error) + this.emit('terminated', error) + } +} - this.abort = abort - this.context = null - } +// https://fetch.spec.whatwg.org/#fetch-method +function fetch (input, init = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: 'globalThis.fetch' }) + + // 1. Let p be a new promise. + const p = createDeferredPromise() + + // 2. Let requestObject be the result of invoking the initial value of + // Request as constructor with input and init as arguments. If this throws + // an exception, reject p with it and return p. + let requestObject + + try { + requestObject = new Request(input, init) + } catch (e) { + p.reject(e) + return p.promise + } + + // 3. Let request be requestObject’s request. + const request = requestObject[kState] + + // 4. If requestObject’s signal’s aborted flag is set, then: + if (requestObject.signal.aborted) { + // 1. Abort the fetch() call with p, request, null, and + // requestObject’s signal’s abort reason. + abortFetch(p, request, null, requestObject.signal.reason) + + // 2. Return p. + return p.promise + } + + // 5. Let globalObject be request’s client’s global object. + const globalObject = request.client.globalObject + + // 6. If globalObject is a ServiceWorkerGlobalScope object, then set + // request’s service-workers mode to "none". + if (globalObject?.constructor?.name === 'ServiceWorkerGlobalScope') { + request.serviceWorkers = 'none' + } + + // 7. Let responseObject be null. + let responseObject = null + + // 8. Let relevantRealm be this’s relevant Realm. + const relevantRealm = null + + // 9. Let locallyAborted be false. + let locallyAborted = false + + // 10. Let controller be null. + let controller = null + + // 11. Add the following abort steps to requestObject’s signal: + addAbortListener( + requestObject.signal, + () => { + // 1. Set locallyAborted to true. + locallyAborted = true + + // 2. Assert: controller is non-null. + assert(controller != null) + + // 3. Abort controller with requestObject’s signal’s abort reason. + controller.abort(requestObject.signal.reason) + + // 4. Abort the fetch() call with p, request, responseObject, + // and requestObject’s signal’s abort reason. + abortFetch(p, request, responseObject, requestObject.signal.reason) + } + ) + + // 12. Let handleFetchDone given response response be to finalize and + // report timing with response, globalObject, and "fetch". + const handleFetchDone = (response) => + finalizeAndReportTiming(response, 'fetch') + + // 13. Set controller to the result of calling fetch given request, + // with processResponseEndOfBody set to handleFetchDone, and processResponse + // given response being these substeps: + + const processResponse = (response) => { + // 1. If locallyAborted is true, terminate these substeps. + if (locallyAborted) { + return Promise.resolve() + } + + // 2. If response’s aborted flag is set, then: + if (response.aborted) { + // 1. Let deserializedError be the result of deserialize a serialized + // abort reason given controller’s serialized abort reason and + // relevantRealm. + + // 2. Abort the fetch() call with p, request, responseObject, and + // deserializedError. + + abortFetch(p, request, responseObject, controller.serializedAbortReason) + return Promise.resolve() + } + + // 3. If response is a network error, then reject p with a TypeError + // and terminate these substeps. + if (response.type === 'error') { + p.reject( + Object.assign(new TypeError('fetch failed'), { cause: response.error }) + ) + return Promise.resolve() + } + + // 4. Set responseObject to the result of creating a Response object, + // given response, "immutable", and relevantRealm. + responseObject = new Response() + responseObject[kState] = response + responseObject[kRealm] = relevantRealm + responseObject[kHeaders][kHeadersList] = response.headersList + responseObject[kHeaders][kGuard] = 'immutable' + responseObject[kHeaders][kRealm] = relevantRealm + + // 5. Resolve p with responseObject. + p.resolve(responseObject) + } + + controller = fetching({ + request, + processResponseEndOfBody: handleFetchDone, + processResponse, + dispatcher: init.dispatcher ?? getGlobalDispatcher() // undici + }) + + // 14. Return p. + return p.promise +} - onHeaders() { - throw new SocketError('bad upgrade', null) - } +// https://fetch.spec.whatwg.org/#finalize-and-report-timing +function finalizeAndReportTiming (response, initiatorType = 'other') { + // 1. If response is an aborted network error, then return. + if (response.type === 'error' && response.aborted) { + return + } + + // 2. If response’s URL list is null or empty, then return. + if (!response.urlList?.length) { + return + } + + // 3. Let originalURL be response’s URL list[0]. + const originalURL = response.urlList[0] + + // 4. Let timingInfo be response’s timing info. + let timingInfo = response.timingInfo + + // 5. Let cacheState be response’s cache state. + let cacheState = response.cacheState + + // 6. If originalURL’s scheme is not an HTTP(S) scheme, then return. + if (!urlIsHttpHttpsScheme(originalURL)) { + return + } + + // 7. If timingInfo is null, then return. + if (timingInfo === null) { + return + } + + // 8. If response’s timing allow passed flag is not set, then: + if (!response.timingAllowPassed) { + // 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo. + timingInfo = createOpaqueTimingInfo({ + startTime: timingInfo.startTime + }) + + // 2. Set cacheState to the empty string. + cacheState = '' + } + + // 9. Set timingInfo’s end time to the coarsened shared current time + // given global’s relevant settings object’s cross-origin isolated + // capability. + // TODO: given global’s relevant settings object’s cross-origin isolated + // capability? + timingInfo.endTime = coarsenedSharedCurrentTime() + + // 10. Set response’s timing info to timingInfo. + response.timingInfo = timingInfo + + // 11. Mark resource timing for timingInfo, originalURL, initiatorType, + // global, and cacheState. + markResourceTiming( + timingInfo, + originalURL, + initiatorType, + globalThis, + cacheState + ) +} - onUpgrade(statusCode, rawHeaders, socket) { - const { callback, opaque, context } = this +// https://w3c.github.io/resource-timing/#dfn-mark-resource-timing +function markResourceTiming (timingInfo, originalURL, initiatorType, globalThis, cacheState) { + if (nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 2)) { + performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis, cacheState) + } +} - assert.strictEqual(statusCode, 101) +// https://fetch.spec.whatwg.org/#abort-fetch +function abortFetch (p, request, responseObject, error) { + // Note: AbortSignal.reason was added in node v17.2.0 + // which would give us an undefined error to reject with. + // Remove this once node v16 is no longer supported. + if (!error) { + error = new DOMException('The operation was aborted.', 'AbortError') + } + + // 1. Reject promise with error. + p.reject(error) + + // 2. If request’s body is not null and is readable, then cancel request’s + // body with error. + if (request.body != null && isReadable(request.body?.stream)) { + request.body.stream.cancel(error).catch((err) => { + if (err.code === 'ERR_INVALID_STATE') { + // Node bug? + return + } + throw err + }) + } + + // 3. If responseObject is null, then return. + if (responseObject == null) { + return + } + + // 4. Let response be responseObject’s response. + const response = responseObject[kState] + + // 5. If response’s body is not null and is readable, then error response’s + // body with error. + if (response.body != null && isReadable(response.body?.stream)) { + response.body.stream.cancel(error).catch((err) => { + if (err.code === 'ERR_INVALID_STATE') { + // Node bug? + return + } + throw err + }) + } +} - removeSignal(this) +// https://fetch.spec.whatwg.org/#fetching +function fetching ({ + request, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseEndOfBody, + processResponseConsumeBody, + useParallelQueue = false, + dispatcher // undici +}) { + // 1. Let taskDestination be null. + let taskDestination = null + + // 2. Let crossOriginIsolatedCapability be false. + let crossOriginIsolatedCapability = false + + // 3. If request’s client is non-null, then: + if (request.client != null) { + // 1. Set taskDestination to request’s client’s global object. + taskDestination = request.client.globalObject + + // 2. Set crossOriginIsolatedCapability to request’s client’s cross-origin + // isolated capability. + crossOriginIsolatedCapability = + request.client.crossOriginIsolatedCapability + } + + // 4. If useParallelQueue is true, then set taskDestination to the result of + // starting a new parallel queue. + // TODO + + // 5. Let timingInfo be a new fetch timing info whose start time and + // post-redirect start time are the coarsened shared current time given + // crossOriginIsolatedCapability. + const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability) + const timingInfo = createOpaqueTimingInfo({ + startTime: currenTime + }) + + // 6. Let fetchParams be a new fetch params whose + // request is request, + // timing info is timingInfo, + // process request body chunk length is processRequestBodyChunkLength, + // process request end-of-body is processRequestEndOfBody, + // process response is processResponse, + // process response consume body is processResponseConsumeBody, + // process response end-of-body is processResponseEndOfBody, + // task destination is taskDestination, + // and cross-origin isolated capability is crossOriginIsolatedCapability. + const fetchParams = { + controller: new Fetch(dispatcher), + request, + timingInfo, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseConsumeBody, + processResponseEndOfBody, + taskDestination, + crossOriginIsolatedCapability + } + + // 7. If request’s body is a byte sequence, then set request’s body to + // request’s body as a body. + // NOTE: Since fetching is only called from fetch, body should already be + // extracted. + assert(!request.body || request.body.stream) + + // 8. If request’s window is "client", then set request’s window to request’s + // client, if request’s client’s global object is a Window object; otherwise + // "no-window". + if (request.window === 'client') { + // TODO: What if request.client is null? + request.window = + request.client?.globalObject?.constructor?.name === 'Window' + ? request.client + : 'no-window' + } + + // 9. If request’s origin is "client", then set request’s origin to request’s + // client’s origin. + if (request.origin === 'client') { + // TODO: What if request.client is null? + request.origin = request.client?.origin + } + + // 10. If all of the following conditions are true: + // TODO + + // 11. If request’s policy container is "client", then: + if (request.policyContainer === 'client') { + // 1. If request’s client is non-null, then set request’s policy + // container to a clone of request’s client’s policy container. [HTML] + if (request.client != null) { + request.policyContainer = clonePolicyContainer( + request.client.policyContainer + ) + } else { + // 2. Otherwise, set request’s policy container to a new policy + // container. + request.policyContainer = makePolicyContainer() + } + } + + // 12. If request’s header list does not contain `Accept`, then: + if (!request.headersList.contains('accept')) { + // 1. Let value be `*/*`. + const value = '*/*' + + // 2. A user agent should set value to the first matching statement, if + // any, switching on request’s destination: + // "document" + // "frame" + // "iframe" + // `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8` + // "image" + // `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5` + // "style" + // `text/css,*/*;q=0.1` + // TODO + + // 3. Append `Accept`/value to request’s header list. + request.headersList.append('accept', value) + } + + // 13. If request’s header list does not contain `Accept-Language`, then + // user agents should append `Accept-Language`/an appropriate value to + // request’s header list. + if (!request.headersList.contains('accept-language')) { + request.headersList.append('accept-language', '*') + } + + // 14. If request’s priority is null, then use request’s initiator and + // destination appropriately in setting request’s priority to a + // user-agent-defined object. + if (request.priority === null) { + // TODO + } + + // 15. If request is a subresource request, then: + if (subresourceSet.has(request.destination)) { + // TODO + } + + // 16. Run main fetch given fetchParams. + mainFetch(fetchParams) + .catch(err => { + fetchParams.controller.terminate(err) + }) + + // 17. Return fetchParam's controller + return fetchParams.controller +} - this.callback = null - const headers = this.responseHeaders === 'raw' ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders) - this.runInAsyncScope(callback, null, null, { - headers, - socket, - opaque, - context - }) - } +// https://fetch.spec.whatwg.org/#concept-main-fetch +async function mainFetch (fetchParams, recursive = false) { + // 1. Let request be fetchParams’s request. + const request = fetchParams.request + + // 2. Let response be null. + let response = null + + // 3. If request’s local-URLs-only flag is set and request’s current URL is + // not local, then set response to a network error. + if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) { + response = makeNetworkError('local URLs only') + } + + // 4. Run report Content Security Policy violations for request. + // TODO + + // 5. Upgrade request to a potentially trustworthy URL, if appropriate. + tryUpgradeRequestToAPotentiallyTrustworthyURL(request) + + // 6. If should request be blocked due to a bad port, should fetching request + // be blocked as mixed content, or should request be blocked by Content + // Security Policy returns blocked, then set response to a network error. + if (requestBadPort(request) === 'blocked') { + response = makeNetworkError('bad port') + } + // TODO: should fetching request be blocked as mixed content? + // TODO: should request be blocked by Content Security Policy? + + // 7. If request’s referrer policy is the empty string, then set request’s + // referrer policy to request’s policy container’s referrer policy. + if (request.referrerPolicy === '') { + request.referrerPolicy = request.policyContainer.referrerPolicy + } + + // 8. If request’s referrer is not "no-referrer", then set request’s + // referrer to the result of invoking determine request’s referrer. + if (request.referrer !== 'no-referrer') { + request.referrer = determineRequestsReferrer(request) + } + + // 9. Set request’s current URL’s scheme to "https" if all of the following + // conditions are true: + // - request’s current URL’s scheme is "http" + // - request’s current URL’s host is a domain + // - Matching request’s current URL’s host per Known HSTS Host Domain Name + // Matching results in either a superdomain match with an asserted + // includeSubDomains directive or a congruent match (with or without an + // asserted includeSubDomains directive). [HSTS] + // TODO + + // 10. If recursive is false, then run the remaining steps in parallel. + // TODO + + // 11. If response is null, then set response to the result of running + // the steps corresponding to the first matching statement: + if (response === null) { + response = await (async () => { + const currentURL = requestCurrentURL(request) + + if ( + // - request’s current URL’s origin is same origin with request’s origin, + // and request’s response tainting is "basic" + (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') || + // request’s current URL’s scheme is "data" + (currentURL.protocol === 'data:') || + // - request’s mode is "navigate" or "websocket" + (request.mode === 'navigate' || request.mode === 'websocket') + ) { + // 1. Set request’s response tainting to "basic". + request.responseTainting = 'basic' + + // 2. Return the result of running scheme fetch given fetchParams. + return await schemeFetch(fetchParams) + } + + // request’s mode is "same-origin" + if (request.mode === 'same-origin') { + // 1. Return a network error. + return makeNetworkError('request mode cannot be "same-origin"') + } + + // request’s mode is "no-cors" + if (request.mode === 'no-cors') { + // 1. If request’s redirect mode is not "follow", then return a network + // error. + if (request.redirect !== 'follow') { + return makeNetworkError( + 'redirect mode cannot be "follow" for "no-cors" request' + ) + } + + // 2. Set request’s response tainting to "opaque". + request.responseTainting = 'opaque' + + // 3. Return the result of running scheme fetch given fetchParams. + return await schemeFetch(fetchParams) + } + + // request’s current URL’s scheme is not an HTTP(S) scheme + if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { + // Return a network error. + return makeNetworkError('URL scheme must be a HTTP(S) scheme') + } + + // - request’s use-CORS-preflight flag is set + // - request’s unsafe-request flag is set and either request’s method is + // not a CORS-safelisted method or CORS-unsafe request-header names with + // request’s header list is not empty + // 1. Set request’s response tainting to "cors". + // 2. Let corsWithPreflightResponse be the result of running HTTP fetch + // given fetchParams and true. + // 3. If corsWithPreflightResponse is a network error, then clear cache + // entries using request. + // 4. Return corsWithPreflightResponse. + // TODO + + // Otherwise + // 1. Set request’s response tainting to "cors". + request.responseTainting = 'cors' + + // 2. Return the result of running HTTP fetch given fetchParams. + return await httpFetch(fetchParams) + })() + } + + // 12. If recursive is true, then return response. + if (recursive) { + return response + } + + // 13. If response is not a network error and response is not a filtered + // response, then: + if (response.status !== 0 && !response.internalResponse) { + // If request’s response tainting is "cors", then: + if (request.responseTainting === 'cors') { + // 1. Let headerNames be the result of extracting header list values + // given `Access-Control-Expose-Headers` and response’s header list. + // TODO + // 2. If request’s credentials mode is not "include" and headerNames + // contains `*`, then set response’s CORS-exposed header-name list to + // all unique header names in response’s header list. + // TODO + // 3. Otherwise, if headerNames is not null or failure, then set + // response’s CORS-exposed header-name list to headerNames. + // TODO + } + + // Set response to the following filtered response with response as its + // internal response, depending on request’s response tainting: + if (request.responseTainting === 'basic') { + response = filterResponse(response, 'basic') + } else if (request.responseTainting === 'cors') { + response = filterResponse(response, 'cors') + } else if (request.responseTainting === 'opaque') { + response = filterResponse(response, 'opaque') + } else { + assert(false) + } + } + + // 14. Let internalResponse be response, if response is a network error, + // and response’s internal response otherwise. + let internalResponse = + response.status === 0 ? response : response.internalResponse + + // 15. If internalResponse’s URL list is empty, then set it to a clone of + // request’s URL list. + if (internalResponse.urlList.length === 0) { + internalResponse.urlList.push(...request.urlList) + } + + // 16. If request’s timing allow failed flag is unset, then set + // internalResponse’s timing allow passed flag. + if (!request.timingAllowFailed) { + response.timingAllowPassed = true + } + + // 17. If response is not a network error and any of the following returns + // blocked + // - should internalResponse to request be blocked as mixed content + // - should internalResponse to request be blocked by Content Security Policy + // - should internalResponse to request be blocked due to its MIME type + // - should internalResponse to request be blocked due to nosniff + // TODO + + // 18. If response’s type is "opaque", internalResponse’s status is 206, + // internalResponse’s range-requested flag is set, and request’s header + // list does not contain `Range`, then set response and internalResponse + // to a network error. + if ( + response.type === 'opaque' && + internalResponse.status === 206 && + internalResponse.rangeRequested && + !request.headers.contains('range') + ) { + response = internalResponse = makeNetworkError() + } + + // 19. If response is not a network error and either request’s method is + // `HEAD` or `CONNECT`, or internalResponse’s status is a null body status, + // set internalResponse’s body to null and disregard any enqueuing toward + // it (if any). + if ( + response.status !== 0 && + (request.method === 'HEAD' || + request.method === 'CONNECT' || + nullBodyStatus.includes(internalResponse.status)) + ) { + internalResponse.body = null + fetchParams.controller.dump = true + } + + // 20. If request’s integrity metadata is not the empty string, then: + if (request.integrity) { + // 1. Let processBodyError be this step: run fetch finale given fetchParams + // and a network error. + const processBodyError = (reason) => + fetchFinale(fetchParams, makeNetworkError(reason)) + + // 2. If request’s response tainting is "opaque", or response’s body is null, + // then run processBodyError and abort these steps. + if (request.responseTainting === 'opaque' || response.body == null) { + processBodyError(response.error) + return + } + + // 3. Let processBody given bytes be these steps: + const processBody = (bytes) => { + // 1. If bytes do not match request’s integrity metadata, + // then run processBodyError and abort these steps. [SRI] + if (!bytesMatch(bytes, request.integrity)) { + processBodyError('integrity mismatch') + return + } + + // 2. Set response’s body to bytes as a body. + response.body = safelyExtractBody(bytes)[0] + + // 3. Run fetch finale given fetchParams and response. + fetchFinale(fetchParams, response) + } + + // 4. Fully read response’s body given processBody and processBodyError. + await fullyReadBody(response.body, processBody, processBodyError) + } else { + // 21. Otherwise, run fetch finale given fetchParams and response. + fetchFinale(fetchParams, response) + } +} - onError(err) { - const { callback, opaque } = this +// https://fetch.spec.whatwg.org/#concept-scheme-fetch +// given a fetch params fetchParams +function schemeFetch (fetchParams) { + // Note: since the connection is destroyed on redirect, which sets fetchParams to a + // cancelled state, we do not want this condition to trigger *unless* there have been + // no redirects. See https://github.com/nodejs/undici/issues/1776 + // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams. + if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { + return Promise.resolve(makeAppropriateNetworkError(fetchParams)) + } + + // 2. Let request be fetchParams’s request. + const { request } = fetchParams + + const { protocol: scheme } = requestCurrentURL(request) + + // 3. Switch on request’s current URL’s scheme and run the associated steps: + switch (scheme) { + case 'about:': { + // If request’s current URL’s path is the string "blank", then return a new response + // whose status message is `OK`, header list is « (`Content-Type`, `text/html;charset=utf-8`) », + // and body is the empty byte sequence as a body. + + // Otherwise, return a network error. + return Promise.resolve(makeNetworkError('about scheme is not supported')) + } + case 'blob:': { + if (!resolveObjectURL) { + resolveObjectURL = (__nccwpck_require__(4300).resolveObjectURL) + } + + // 1. Let blobURLEntry be request’s current URL’s blob URL entry. + const blobURLEntry = requestCurrentURL(request) + + // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56 + // Buffer.resolveObjectURL does not ignore URL queries. + if (blobURLEntry.search.length !== 0) { + return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.')) + } + + const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()) + + // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s + // object is not a Blob object, then return a network error. + if (request.method !== 'GET' || !isBlobLike(blobURLEntryObject)) { + return Promise.resolve(makeNetworkError('invalid method')) + } + + // 3. Let bodyWithType be the result of safely extracting blobURLEntry’s object. + const bodyWithType = safelyExtractBody(blobURLEntryObject) + + // 4. Let body be bodyWithType’s body. + const body = bodyWithType[0] + + // 5. Let length be body’s length, serialized and isomorphic encoded. + const length = isomorphicEncode(`${body.length}`) + + // 6. Let type be bodyWithType’s type if it is non-null; otherwise the empty byte sequence. + const type = bodyWithType[1] ?? '' + + // 7. Return a new response whose status message is `OK`, header list is + // « (`Content-Length`, length), (`Content-Type`, type) », and body is body. + const response = makeResponse({ + statusText: 'OK', + headersList: [ + ['content-length', { name: 'Content-Length', value: length }], + ['content-type', { name: 'Content-Type', value: type }] + ] + }) + + response.body = body + + return Promise.resolve(response) + } + case 'data:': { + // 1. Let dataURLStruct be the result of running the + // data: URL processor on request’s current URL. + const currentURL = requestCurrentURL(request) + const dataURLStruct = dataURLProcessor(currentURL) + + // 2. If dataURLStruct is failure, then return a + // network error. + if (dataURLStruct === 'failure') { + return Promise.resolve(makeNetworkError('failed to fetch the data URL')) + } + + // 3. Let mimeType be dataURLStruct’s MIME type, serialized. + const mimeType = serializeAMimeType(dataURLStruct.mimeType) + + // 4. Return a response whose status message is `OK`, + // header list is « (`Content-Type`, mimeType) », + // and body is dataURLStruct’s body as a body. + return Promise.resolve(makeResponse({ + statusText: 'OK', + headersList: [ + ['content-type', { name: 'Content-Type', value: mimeType }] + ], + body: safelyExtractBody(dataURLStruct.body)[0] + })) + } + case 'file:': { + // For now, unfortunate as it is, file URLs are left as an exercise for the reader. + // When in doubt, return a network error. + return Promise.resolve(makeNetworkError('not implemented... yet...')) + } + case 'http:': + case 'https:': { + // Return the result of running HTTP fetch given fetchParams. + + return httpFetch(fetchParams) + .catch((err) => makeNetworkError(err)) + } + default: { + return Promise.resolve(makeNetworkError('unknown scheme')) + } + } +} - removeSignal(this) +// https://fetch.spec.whatwg.org/#finalize-response +function finalizeResponse (fetchParams, response) { + // 1. Set fetchParams’s request’s done flag. + fetchParams.request.done = true + + // 2, If fetchParams’s process response done is not null, then queue a fetch + // task to run fetchParams’s process response done given response, with + // fetchParams’s task destination. + if (fetchParams.processResponseDone != null) { + queueMicrotask(() => fetchParams.processResponseDone(response)) + } +} - if (callback) { - this.callback = null - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }) - }) - } - } - } +// https://fetch.spec.whatwg.org/#fetch-finale +function fetchFinale (fetchParams, response) { + // 1. If response is a network error, then: + if (response.type === 'error') { + // 1. Set response’s URL list to « fetchParams’s request’s URL list[0] ». + response.urlList = [fetchParams.request.urlList[0]] + + // 2. Set response’s timing info to the result of creating an opaque timing + // info for fetchParams’s timing info. + response.timingInfo = createOpaqueTimingInfo({ + startTime: fetchParams.timingInfo.startTime + }) + } + + // 2. Let processResponseEndOfBody be the following steps: + const processResponseEndOfBody = () => { + // 1. Set fetchParams’s request’s done flag. + fetchParams.request.done = true + + // If fetchParams’s process response end-of-body is not null, + // then queue a fetch task to run fetchParams’s process response + // end-of-body given response with fetchParams’s task destination. + if (fetchParams.processResponseEndOfBody != null) { + queueMicrotask(() => fetchParams.processResponseEndOfBody(response)) + } + } + + // 3. If fetchParams’s process response is non-null, then queue a fetch task + // to run fetchParams’s process response given response, with fetchParams’s + // task destination. + if (fetchParams.processResponse != null) { + queueMicrotask(() => fetchParams.processResponse(response)) + } + + // 4. If response’s body is null, then run processResponseEndOfBody. + if (response.body == null) { + processResponseEndOfBody() + } else { + // 5. Otherwise: + + // 1. Let transformStream be a new a TransformStream. + + // 2. Let identityTransformAlgorithm be an algorithm which, given chunk, + // enqueues chunk in transformStream. + const identityTransformAlgorithm = (chunk, controller) => { + controller.enqueue(chunk) + } + + // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm + // and flushAlgorithm set to processResponseEndOfBody. + const transformStream = new TransformStream({ + start () {}, + transform: identityTransformAlgorithm, + flush: processResponseEndOfBody + }, { + size () { + return 1 + } + }, { + size () { + return 1 + } + }) + + // 4. Set response’s body to the result of piping response’s body through transformStream. + response.body = { stream: response.body.stream.pipeThrough(transformStream) } + } + + // 6. If fetchParams’s process response consume body is non-null, then: + if (fetchParams.processResponseConsumeBody != null) { + // 1. Let processBody given nullOrBytes be this step: run fetchParams’s + // process response consume body given response and nullOrBytes. + const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes) + + // 2. Let processBodyError be this step: run fetchParams’s process + // response consume body given response and failure. + const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure) + + // 3. If response’s body is null, then queue a fetch task to run processBody + // given null, with fetchParams’s task destination. + if (response.body == null) { + queueMicrotask(() => processBody(null)) + } else { + // 4. Otherwise, fully read response’s body given processBody, processBodyError, + // and fetchParams’s task destination. + return fullyReadBody(response.body, processBody, processBodyError) + } + return Promise.resolve() + } +} - function upgrade(opts, callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - upgrade.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data) - }) - }) - } +// https://fetch.spec.whatwg.org/#http-fetch +async function httpFetch (fetchParams) { + // 1. Let request be fetchParams’s request. + const request = fetchParams.request + + // 2. Let response be null. + let response = null + + // 3. Let actualResponse be null. + let actualResponse = null + + // 4. Let timingInfo be fetchParams’s timing info. + const timingInfo = fetchParams.timingInfo + + // 5. If request’s service-workers mode is "all", then: + if (request.serviceWorkers === 'all') { + // TODO + } + + // 6. If response is null, then: + if (response === null) { + // 1. If makeCORSPreflight is true and one of these conditions is true: + // TODO + + // 2. If request’s redirect mode is "follow", then set request’s + // service-workers mode to "none". + if (request.redirect === 'follow') { + request.serviceWorkers = 'none' + } + + // 3. Set response and actualResponse to the result of running + // HTTP-network-or-cache fetch given fetchParams. + actualResponse = response = await httpNetworkOrCacheFetch(fetchParams) + + // 4. If request’s response tainting is "cors" and a CORS check + // for request and response returns failure, then return a network error. + if ( + request.responseTainting === 'cors' && + corsCheck(request, response) === 'failure' + ) { + return makeNetworkError('cors failure') + } + + // 5. If the TAO check for request and response returns failure, then set + // request’s timing allow failed flag. + if (TAOCheck(request, response) === 'failure') { + request.timingAllowFailed = true + } + } + + // 7. If either request’s response tainting or response’s type + // is "opaque", and the cross-origin resource policy check with + // request’s origin, request’s client, request’s destination, + // and actualResponse returns blocked, then return a network error. + if ( + (request.responseTainting === 'opaque' || response.type === 'opaque') && + crossOriginResourcePolicyCheck( + request.origin, + request.client, + request.destination, + actualResponse + ) === 'blocked' + ) { + return makeNetworkError('blocked') + } + + // 8. If actualResponse’s status is a redirect status, then: + if (redirectStatusSet.has(actualResponse.status)) { + // 1. If actualResponse’s status is not 303, request’s body is not null, + // and the connection uses HTTP/2, then user agents may, and are even + // encouraged to, transmit an RST_STREAM frame. + // See, https://github.com/whatwg/fetch/issues/1288 + if (request.redirect !== 'manual') { + fetchParams.controller.connection.destroy() + } + + // 2. Switch on request’s redirect mode: + if (request.redirect === 'error') { + // Set response to a network error. + response = makeNetworkError('unexpected redirect') + } else if (request.redirect === 'manual') { + // Set response to an opaque-redirect filtered response whose internal + // response is actualResponse. + // NOTE(spec): On the web this would return an `opaqueredirect` response, + // but that doesn't make sense server side. + // See https://github.com/nodejs/undici/issues/1193. + response = actualResponse + } else if (request.redirect === 'follow') { + // Set response to the result of running HTTP-redirect fetch given + // fetchParams and response. + response = await httpRedirectFetch(fetchParams, response) + } else { + assert(false) + } + } + + // 9. Set response’s timing info to timingInfo. + response.timingInfo = timingInfo + + // 10. Return response. + return response +} - try { - const upgradeHandler = new UpgradeHandler(opts, callback) - this.dispatch({ - ...opts, - method: opts.method || 'GET', - upgrade: opts.protocol || 'Websocket' - }, upgradeHandler) - } catch (err) { - if (typeof callback !== 'function') { - throw err - } - const opaque = opts && opts.opaque - queueMicrotask(() => callback(err, { opaque })) - } - } +// https://fetch.spec.whatwg.org/#http-redirect-fetch +function httpRedirectFetch (fetchParams, response) { + // 1. Let request be fetchParams’s request. + const request = fetchParams.request + + // 2. Let actualResponse be response, if response is not a filtered response, + // and response’s internal response otherwise. + const actualResponse = response.internalResponse + ? response.internalResponse + : response + + // 3. Let locationURL be actualResponse’s location URL given request’s current + // URL’s fragment. + let locationURL + + try { + locationURL = responseLocationURL( + actualResponse, + requestCurrentURL(request).hash + ) + + // 4. If locationURL is null, then return response. + if (locationURL == null) { + return response + } + } catch (err) { + // 5. If locationURL is failure, then return a network error. + return Promise.resolve(makeNetworkError(err)) + } + + // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network + // error. + if (!urlIsHttpHttpsScheme(locationURL)) { + return Promise.resolve(makeNetworkError('URL scheme must be a HTTP(S) scheme')) + } + + // 7. If request’s redirect count is 20, then return a network error. + if (request.redirectCount === 20) { + return Promise.resolve(makeNetworkError('redirect count exceeded')) + } + + // 8. Increase request’s redirect count by 1. + request.redirectCount += 1 + + // 9. If request’s mode is "cors", locationURL includes credentials, and + // request’s origin is not same origin with locationURL’s origin, then return + // a network error. + if ( + request.mode === 'cors' && + (locationURL.username || locationURL.password) && + !sameOrigin(request, locationURL) + ) { + return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"')) + } + + // 10. If request’s response tainting is "cors" and locationURL includes + // credentials, then return a network error. + if ( + request.responseTainting === 'cors' && + (locationURL.username || locationURL.password) + ) { + return Promise.resolve(makeNetworkError( + 'URL cannot contain credentials for request mode "cors"' + )) + } + + // 11. If actualResponse’s status is not 303, request’s body is non-null, + // and request’s body’s source is null, then return a network error. + if ( + actualResponse.status !== 303 && + request.body != null && + request.body.source == null + ) { + return Promise.resolve(makeNetworkError()) + } + + // 12. If one of the following is true + // - actualResponse’s status is 301 or 302 and request’s method is `POST` + // - actualResponse’s status is 303 and request’s method is not `GET` or `HEAD` + if ( + ([301, 302].includes(actualResponse.status) && request.method === 'POST') || + (actualResponse.status === 303 && + !GET_OR_HEAD.includes(request.method)) + ) { + // then: + // 1. Set request’s method to `GET` and request’s body to null. + request.method = 'GET' + request.body = null + + // 2. For each headerName of request-body-header name, delete headerName from + // request’s header list. + for (const headerName of requestBodyHeader) { + request.headersList.delete(headerName) + } + } + + // 13. If request’s current URL’s origin is not same origin with locationURL’s + // origin, then for each headerName of CORS non-wildcard request-header name, + // delete headerName from request’s header list. + if (!sameOrigin(requestCurrentURL(request), locationURL)) { + // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name + request.headersList.delete('authorization') + + // https://fetch.spec.whatwg.org/#authentication-entries + request.headersList.delete('proxy-authorization', true) + + // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement. + request.headersList.delete('cookie') + request.headersList.delete('host') + } + + // 14. If request’s body is non-null, then set request’s body to the first return + // value of safely extracting request’s body’s source. + if (request.body != null) { + assert(request.body.source != null) + request.body = safelyExtractBody(request.body.source)[0] + } + + // 15. Let timingInfo be fetchParams’s timing info. + const timingInfo = fetchParams.timingInfo + + // 16. Set timingInfo’s redirect end time and post-redirect start time to the + // coarsened shared current time given fetchParams’s cross-origin isolated + // capability. + timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = + coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability) + + // 17. If timingInfo’s redirect start time is 0, then set timingInfo’s + // redirect start time to timingInfo’s start time. + if (timingInfo.redirectStartTime === 0) { + timingInfo.redirectStartTime = timingInfo.startTime + } + + // 18. Append locationURL to request’s URL list. + request.urlList.push(locationURL) + + // 19. Invoke set request’s referrer policy on redirect on request and + // actualResponse. + setRequestReferrerPolicyOnRedirect(request, actualResponse) + + // 20. Return the result of running main fetch given fetchParams and true. + return mainFetch(fetchParams, true) +} - module.exports = upgrade +// https://fetch.spec.whatwg.org/#http-network-or-cache-fetch +async function httpNetworkOrCacheFetch ( + fetchParams, + isAuthenticationFetch = false, + isNewConnectionFetch = false +) { + // 1. Let request be fetchParams’s request. + const request = fetchParams.request + + // 2. Let httpFetchParams be null. + let httpFetchParams = null + + // 3. Let httpRequest be null. + let httpRequest = null + + // 4. Let response be null. + let response = null + + // 5. Let storedResponse be null. + // TODO: cache + + // 6. Let httpCache be null. + const httpCache = null + + // 7. Let the revalidatingFlag be unset. + const revalidatingFlag = false + + // 8. Run these steps, but abort when the ongoing fetch is terminated: + + // 1. If request’s window is "no-window" and request’s redirect mode is + // "error", then set httpFetchParams to fetchParams and httpRequest to + // request. + if (request.window === 'no-window' && request.redirect === 'error') { + httpFetchParams = fetchParams + httpRequest = request + } else { + // Otherwise: + + // 1. Set httpRequest to a clone of request. + httpRequest = makeRequest(request) + + // 2. Set httpFetchParams to a copy of fetchParams. + httpFetchParams = { ...fetchParams } + + // 3. Set httpFetchParams’s request to httpRequest. + httpFetchParams.request = httpRequest + } + + // 3. Let includeCredentials be true if one of + const includeCredentials = + request.credentials === 'include' || + (request.credentials === 'same-origin' && + request.responseTainting === 'basic') + + // 4. Let contentLength be httpRequest’s body’s length, if httpRequest’s + // body is non-null; otherwise null. + const contentLength = httpRequest.body ? httpRequest.body.length : null + + // 5. Let contentLengthHeaderValue be null. + let contentLengthHeaderValue = null + + // 6. If httpRequest’s body is null and httpRequest’s method is `POST` or + // `PUT`, then set contentLengthHeaderValue to `0`. + if ( + httpRequest.body == null && + ['POST', 'PUT'].includes(httpRequest.method) + ) { + contentLengthHeaderValue = '0' + } + + // 7. If contentLength is non-null, then set contentLengthHeaderValue to + // contentLength, serialized and isomorphic encoded. + if (contentLength != null) { + contentLengthHeaderValue = isomorphicEncode(`${contentLength}`) + } + + // 8. If contentLengthHeaderValue is non-null, then append + // `Content-Length`/contentLengthHeaderValue to httpRequest’s header + // list. + if (contentLengthHeaderValue != null) { + httpRequest.headersList.append('content-length', contentLengthHeaderValue) + } + + // 9. If contentLengthHeaderValue is non-null, then append (`Content-Length`, + // contentLengthHeaderValue) to httpRequest’s header list. + + // 10. If contentLength is non-null and httpRequest’s keepalive is true, + // then: + if (contentLength != null && httpRequest.keepalive) { + // NOTE: keepalive is a noop outside of browser context. + } + + // 11. If httpRequest’s referrer is a URL, then append + // `Referer`/httpRequest’s referrer, serialized and isomorphic encoded, + // to httpRequest’s header list. + if (httpRequest.referrer instanceof URL) { + httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href)) + } + + // 12. Append a request `Origin` header for httpRequest. + appendRequestOriginHeader(httpRequest) + + // 13. Append the Fetch metadata headers for httpRequest. [FETCH-METADATA] + appendFetchMetadata(httpRequest) + + // 14. If httpRequest’s header list does not contain `User-Agent`, then + // user agents should append `User-Agent`/default `User-Agent` value to + // httpRequest’s header list. + if (!httpRequest.headersList.contains('user-agent')) { + httpRequest.headersList.append('user-agent', typeof esbuildDetection === 'undefined' ? 'undici' : 'node') + } + + // 15. If httpRequest’s cache mode is "default" and httpRequest’s header + // list contains `If-Modified-Since`, `If-None-Match`, + // `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set + // httpRequest’s cache mode to "no-store". + if ( + httpRequest.cache === 'default' && + (httpRequest.headersList.contains('if-modified-since') || + httpRequest.headersList.contains('if-none-match') || + httpRequest.headersList.contains('if-unmodified-since') || + httpRequest.headersList.contains('if-match') || + httpRequest.headersList.contains('if-range')) + ) { + httpRequest.cache = 'no-store' + } + + // 16. If httpRequest’s cache mode is "no-cache", httpRequest’s prevent + // no-cache cache-control header modification flag is unset, and + // httpRequest’s header list does not contain `Cache-Control`, then append + // `Cache-Control`/`max-age=0` to httpRequest’s header list. + if ( + httpRequest.cache === 'no-cache' && + !httpRequest.preventNoCacheCacheControlHeaderModification && + !httpRequest.headersList.contains('cache-control') + ) { + httpRequest.headersList.append('cache-control', 'max-age=0') + } + + // 17. If httpRequest’s cache mode is "no-store" or "reload", then: + if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') { + // 1. If httpRequest’s header list does not contain `Pragma`, then append + // `Pragma`/`no-cache` to httpRequest’s header list. + if (!httpRequest.headersList.contains('pragma')) { + httpRequest.headersList.append('pragma', 'no-cache') + } + + // 2. If httpRequest’s header list does not contain `Cache-Control`, + // then append `Cache-Control`/`no-cache` to httpRequest’s header list. + if (!httpRequest.headersList.contains('cache-control')) { + httpRequest.headersList.append('cache-control', 'no-cache') + } + } + + // 18. If httpRequest’s header list contains `Range`, then append + // `Accept-Encoding`/`identity` to httpRequest’s header list. + if (httpRequest.headersList.contains('range')) { + httpRequest.headersList.append('accept-encoding', 'identity') + } + + // 19. Modify httpRequest’s header list per HTTP. Do not append a given + // header if httpRequest’s header list contains that header’s name. + // TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129 + if (!httpRequest.headersList.contains('accept-encoding')) { + if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { + httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate') + } else { + httpRequest.headersList.append('accept-encoding', 'gzip, deflate') + } + } + + httpRequest.headersList.delete('host') + + // 20. If includeCredentials is true, then: + if (includeCredentials) { + // 1. If the user agent is not configured to block cookies for httpRequest + // (see section 7 of [COOKIES]), then: + // TODO: credentials + // 2. If httpRequest’s header list does not contain `Authorization`, then: + // TODO: credentials + } + + // 21. If there’s a proxy-authentication entry, use it as appropriate. + // TODO: proxy-authentication + + // 22. Set httpCache to the result of determining the HTTP cache + // partition, given httpRequest. + // TODO: cache + + // 23. If httpCache is null, then set httpRequest’s cache mode to + // "no-store". + if (httpCache == null) { + httpRequest.cache = 'no-store' + } + + // 24. If httpRequest’s cache mode is neither "no-store" nor "reload", + // then: + if (httpRequest.mode !== 'no-store' && httpRequest.mode !== 'reload') { + // TODO: cache + } + + // 9. If aborted, then return the appropriate network error for fetchParams. + // TODO + + // 10. If response is null, then: + if (response == null) { + // 1. If httpRequest’s cache mode is "only-if-cached", then return a + // network error. + if (httpRequest.mode === 'only-if-cached') { + return makeNetworkError('only if cached') + } + + // 2. Let forwardResponse be the result of running HTTP-network fetch + // given httpFetchParams, includeCredentials, and isNewConnectionFetch. + const forwardResponse = await httpNetworkFetch( + httpFetchParams, + includeCredentials, + isNewConnectionFetch + ) + + // 3. If httpRequest’s method is unsafe and forwardResponse’s status is + // in the range 200 to 399, inclusive, invalidate appropriate stored + // responses in httpCache, as per the "Invalidation" chapter of HTTP + // Caching, and set storedResponse to null. [HTTP-CACHING] + if ( + !safeMethodsSet.has(httpRequest.method) && + forwardResponse.status >= 200 && + forwardResponse.status <= 399 + ) { + // TODO: cache + } + + // 4. If the revalidatingFlag is set and forwardResponse’s status is 304, + // then: + if (revalidatingFlag && forwardResponse.status === 304) { + // TODO: cache + } + + // 5. If response is null, then: + if (response == null) { + // 1. Set response to forwardResponse. + response = forwardResponse + + // 2. Store httpRequest and forwardResponse in httpCache, as per the + // "Storing Responses in Caches" chapter of HTTP Caching. [HTTP-CACHING] + // TODO: cache + } + } + + // 11. Set response’s URL list to a clone of httpRequest’s URL list. + response.urlList = [...httpRequest.urlList] + + // 12. If httpRequest’s header list contains `Range`, then set response’s + // range-requested flag. + if (httpRequest.headersList.contains('range')) { + response.rangeRequested = true + } + + // 13. Set response’s request-includes-credentials to includeCredentials. + response.requestIncludesCredentials = includeCredentials + + // 14. If response’s status is 401, httpRequest’s response tainting is not + // "cors", includeCredentials is true, and request’s window is an environment + // settings object, then: + // TODO + + // 15. If response’s status is 407, then: + if (response.status === 407) { + // 1. If request’s window is "no-window", then return a network error. + if (request.window === 'no-window') { + return makeNetworkError() + } + + // 2. ??? + + // 3. If fetchParams is canceled, then return the appropriate network error for fetchParams. + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams) + } + + // 4. Prompt the end user as appropriate in request’s window and store + // the result as a proxy-authentication entry. [HTTP-AUTH] + // TODO: Invoke some kind of callback? + + // 5. Set response to the result of running HTTP-network-or-cache fetch given + // fetchParams. + // TODO + return makeNetworkError('proxy authentication required') + } + + // 16. If all of the following are true + if ( + // response’s status is 421 + response.status === 421 && + // isNewConnectionFetch is false + !isNewConnectionFetch && + // request’s body is null, or request’s body is non-null and request’s body’s source is non-null + (request.body == null || request.body.source != null) + ) { + // then: + + // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams. + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams) + } + + // 2. Set response to the result of running HTTP-network-or-cache + // fetch given fetchParams, isAuthenticationFetch, and true. + + // TODO (spec): The spec doesn't specify this but we need to cancel + // the active response before we can start a new one. + // https://github.com/whatwg/fetch/issues/1293 + fetchParams.controller.connection.destroy() + + response = await httpNetworkOrCacheFetch( + fetchParams, + isAuthenticationFetch, + true + ) + } + + // 17. If isAuthenticationFetch is true, then create an authentication entry + if (isAuthenticationFetch) { + // TODO + } + + // 18. Return response. + return response +} +// https://fetch.spec.whatwg.org/#http-network-fetch +async function httpNetworkFetch ( + fetchParams, + includeCredentials = false, + forceNewConnection = false +) { + assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed) + + fetchParams.controller.connection = { + abort: null, + destroyed: false, + destroy (err) { + if (!this.destroyed) { + this.destroyed = true + this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError')) + } + } + } + + // 1. Let request be fetchParams’s request. + const request = fetchParams.request + + // 2. Let response be null. + let response = null + + // 3. Let timingInfo be fetchParams’s timing info. + const timingInfo = fetchParams.timingInfo + + // 4. Let httpCache be the result of determining the HTTP cache partition, + // given request. + // TODO: cache + const httpCache = null + + // 5. If httpCache is null, then set request’s cache mode to "no-store". + if (httpCache == null) { + request.cache = 'no-store' + } + + // 6. Let networkPartitionKey be the result of determining the network + // partition key given request. + // TODO + + // 7. Let newConnection be "yes" if forceNewConnection is true; otherwise + // "no". + const newConnection = forceNewConnection ? 'yes' : 'no' // eslint-disable-line no-unused-vars + + // 8. Switch on request’s mode: + if (request.mode === 'websocket') { + // Let connection be the result of obtaining a WebSocket connection, + // given request’s current URL. + // TODO + } else { + // Let connection be the result of obtaining a connection, given + // networkPartitionKey, request’s current URL’s origin, + // includeCredentials, and forceNewConnection. + // TODO + } + + // 9. Run these steps, but abort when the ongoing fetch is terminated: + + // 1. If connection is failure, then return a network error. + + // 2. Set timingInfo’s final connection timing info to the result of + // calling clamp and coarsen connection timing info with connection’s + // timing info, timingInfo’s post-redirect start time, and fetchParams’s + // cross-origin isolated capability. + + // 3. If connection is not an HTTP/2 connection, request’s body is non-null, + // and request’s body’s source is null, then append (`Transfer-Encoding`, + // `chunked`) to request’s header list. + + // 4. Set timingInfo’s final network-request start time to the coarsened + // shared current time given fetchParams’s cross-origin isolated + // capability. + + // 5. Set response to the result of making an HTTP request over connection + // using request with the following caveats: + + // - Follow the relevant requirements from HTTP. [HTTP] [HTTP-SEMANTICS] + // [HTTP-COND] [HTTP-CACHING] [HTTP-AUTH] + + // - If request’s body is non-null, and request’s body’s source is null, + // then the user agent may have a buffer of up to 64 kibibytes and store + // a part of request’s body in that buffer. If the user agent reads from + // request’s body beyond that buffer’s size and the user agent needs to + // resend request, then instead return a network error. + + // - Set timingInfo’s final network-response start time to the coarsened + // shared current time given fetchParams’s cross-origin isolated capability, + // immediately after the user agent’s HTTP parser receives the first byte + // of the response (e.g., frame header bytes for HTTP/2 or response status + // line for HTTP/1.x). + + // - Wait until all the headers are transmitted. + + // - Any responses whose status is in the range 100 to 199, inclusive, + // and is not 101, are to be ignored, except for the purposes of setting + // timingInfo’s final network-response start time above. + + // - If request’s header list contains `Transfer-Encoding`/`chunked` and + // response is transferred via HTTP/1.0 or older, then return a network + // error. + + // - If the HTTP request results in a TLS client certificate dialog, then: + + // 1. If request’s window is an environment settings object, make the + // dialog available in request’s window. + + // 2. Otherwise, return a network error. + + // To transmit request’s body body, run these steps: + let requestBody = null + // 1. If body is null and fetchParams’s process request end-of-body is + // non-null, then queue a fetch task given fetchParams’s process request + // end-of-body and fetchParams’s task destination. + if (request.body == null && fetchParams.processRequestEndOfBody) { + queueMicrotask(() => fetchParams.processRequestEndOfBody()) + } else if (request.body != null) { + // 2. Otherwise, if body is non-null: + + // 1. Let processBodyChunk given bytes be these steps: + const processBodyChunk = async function * (bytes) { + // 1. If the ongoing fetch is terminated, then abort these steps. + if (isCancelled(fetchParams)) { + return + } + + // 2. Run this step in parallel: transmit bytes. + yield bytes + + // 3. If fetchParams’s process request body is non-null, then run + // fetchParams’s process request body given bytes’s length. + fetchParams.processRequestBodyChunkLength?.(bytes.byteLength) + } + + // 2. Let processEndOfBody be these steps: + const processEndOfBody = () => { + // 1. If fetchParams is canceled, then abort these steps. + if (isCancelled(fetchParams)) { + return + } + + // 2. If fetchParams’s process request end-of-body is non-null, + // then run fetchParams’s process request end-of-body. + if (fetchParams.processRequestEndOfBody) { + fetchParams.processRequestEndOfBody() + } + } + + // 3. Let processBodyError given e be these steps: + const processBodyError = (e) => { + // 1. If fetchParams is canceled, then abort these steps. + if (isCancelled(fetchParams)) { + return + } + + // 2. If e is an "AbortError" DOMException, then abort fetchParams’s controller. + if (e.name === 'AbortError') { + fetchParams.controller.abort() + } else { + fetchParams.controller.terminate(e) + } + } + + // 4. Incrementally read request’s body given processBodyChunk, processEndOfBody, + // processBodyError, and fetchParams’s task destination. + requestBody = (async function * () { + try { + for await (const bytes of request.body.stream) { + yield * processBodyChunk(bytes) + } + processEndOfBody() + } catch (err) { + processBodyError(err) + } + })() + } + + try { + // socket is only provided for websockets + const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody }) + + if (socket) { + response = makeResponse({ status, statusText, headersList, socket }) + } else { + const iterator = body[Symbol.asyncIterator]() + fetchParams.controller.next = () => iterator.next() + + response = makeResponse({ status, statusText, headersList }) + } + } catch (err) { + // 10. If aborted, then: + if (err.name === 'AbortError') { + // 1. If connection uses HTTP/2, then transmit an RST_STREAM frame. + fetchParams.controller.connection.destroy() + + // 2. Return the appropriate network error for fetchParams. + return makeAppropriateNetworkError(fetchParams, err) + } + + return makeNetworkError(err) + } + + // 11. Let pullAlgorithm be an action that resumes the ongoing fetch + // if it is suspended. + const pullAlgorithm = () => { + fetchParams.controller.resume() + } + + // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s + // controller with reason, given reason. + const cancelAlgorithm = (reason) => { + fetchParams.controller.abort(reason) + } + + // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by + // the user agent. + // TODO + + // 14. Let sizeAlgorithm be an algorithm that accepts a chunk object + // and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent. + // TODO + + // 15. Let stream be a new ReadableStream. + // 16. Set up stream with pullAlgorithm set to pullAlgorithm, + // cancelAlgorithm set to cancelAlgorithm, highWaterMark set to + // highWaterMark, and sizeAlgorithm set to sizeAlgorithm. + if (!ReadableStream) { + ReadableStream = (__nccwpck_require__(5356).ReadableStream) + } + + const stream = new ReadableStream( + { + async start (controller) { + fetchParams.controller.controller = controller + }, + async pull (controller) { + await pullAlgorithm(controller) + }, + async cancel (reason) { + await cancelAlgorithm(reason) + } + }, + { + highWaterMark: 0, + size () { + return 1 + } + } + ) + + // 17. Run these steps, but abort when the ongoing fetch is terminated: + + // 1. Set response’s body to a new body whose stream is stream. + response.body = { stream } + + // 2. If response is not a network error and request’s cache mode is + // not "no-store", then update response in httpCache for request. + // TODO + + // 3. If includeCredentials is true and the user agent is not configured + // to block cookies for request (see section 7 of [COOKIES]), then run the + // "set-cookie-string" parsing algorithm (see section 5.2 of [COOKIES]) on + // the value of each header whose name is a byte-case-insensitive match for + // `Set-Cookie` in response’s header list, if any, and request’s current URL. + // TODO + + // 18. If aborted, then: + // TODO + + // 19. Run these steps in parallel: + + // 1. Run these steps, but abort when fetchParams is canceled: + fetchParams.controller.on('terminated', onAborted) + fetchParams.controller.resume = async () => { + // 1. While true + while (true) { + // 1-3. See onData... + + // 4. Set bytes to the result of handling content codings given + // codings and bytes. + let bytes + let isFailure + try { + const { done, value } = await fetchParams.controller.next() + + if (isAborted(fetchParams)) { + break + } + + bytes = done ? undefined : value + } catch (err) { + if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { + // zlib doesn't like empty streams. + bytes = undefined + } else { + bytes = err + + // err may be propagated from the result of calling readablestream.cancel, + // which might not be an error. https://github.com/nodejs/undici/issues/2009 + isFailure = true + } + } + + if (bytes === undefined) { + // 2. Otherwise, if the bytes transmission for response’s message + // body is done normally and stream is readable, then close + // stream, finalize response for fetchParams and response, and + // abort these in-parallel steps. + readableStreamClose(fetchParams.controller.controller) + + finalizeResponse(fetchParams, response) + + return + } + + // 5. Increase timingInfo’s decoded body size by bytes’s length. + timingInfo.decodedBodySize += bytes?.byteLength ?? 0 + + // 6. If bytes is failure, then terminate fetchParams’s controller. + if (isFailure) { + fetchParams.controller.terminate(bytes) + return + } + + // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes + // into stream. + fetchParams.controller.controller.enqueue(new Uint8Array(bytes)) + + // 8. If stream is errored, then terminate the ongoing fetch. + if (isErrored(stream)) { + fetchParams.controller.terminate() + return + } + + // 9. If stream doesn’t need more data ask the user agent to suspend + // the ongoing fetch. + if (!fetchParams.controller.controller.desiredSize) { + return + } + } + } + + // 2. If aborted, then: + function onAborted (reason) { + // 2. If fetchParams is aborted, then: + if (isAborted(fetchParams)) { + // 1. Set response’s aborted flag. + response.aborted = true + + // 2. If stream is readable, then error stream with the result of + // deserialize a serialized abort reason given fetchParams’s + // controller’s serialized abort reason and an + // implementation-defined realm. + if (isReadable(stream)) { + fetchParams.controller.controller.error( + fetchParams.controller.serializedAbortReason + ) + } + } else { + // 3. Otherwise, if stream is readable, error stream with a TypeError. + if (isReadable(stream)) { + fetchParams.controller.controller.error(new TypeError('terminated', { + cause: isErrorLike(reason) ? reason : undefined + })) + } + } + + // 4. If connection uses HTTP/2, then transmit an RST_STREAM frame. + // 5. Otherwise, the user agent should close connection unless it would be bad for performance to do so. + fetchParams.controller.connection.destroy() + } + + // 20. Return response. + return response + + async function dispatch ({ body }) { + const url = requestCurrentURL(request) + /** @type {import('../..').Agent} */ + const agent = fetchParams.controller.dispatcher + + return new Promise((resolve, reject) => agent.dispatch( + { + path: url.pathname + url.search, + origin: url.origin, + method: request.method, + body: fetchParams.controller.dispatcher.isMockActive ? request.body && (request.body.source || request.body.stream) : body, + headers: request.headersList.entries, + maxRedirections: 0, + upgrade: request.mode === 'websocket' ? 'websocket' : undefined + }, + { + body: null, + abort: null, + + onConnect (abort) { + // TODO (fix): Do we need connection here? + const { connection } = fetchParams.controller + + if (connection.destroyed) { + abort(new DOMException('The operation was aborted.', 'AbortError')) + } else { + fetchParams.controller.on('terminated', abort) + this.abort = connection.abort = abort + } + }, + + onHeaders (status, headersList, resume, statusText) { + if (status < 200) { + return + } + + let codings = [] + let location = '' + + const headers = new Headers() + + // For H2, the headers are a plain JS object + // We distinguish between them and iterate accordingly + if (Array.isArray(headersList)) { + for (let n = 0; n < headersList.length; n += 2) { + const key = headersList[n + 0].toString('latin1') + const val = headersList[n + 1].toString('latin1') + if (key.toLowerCase() === 'content-encoding') { + // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 + // "All content-coding values are case-insensitive..." + codings = val.toLowerCase().split(',').map((x) => x.trim()) + } else if (key.toLowerCase() === 'location') { + location = val + } + + headers[kHeadersList].append(key, val) + } + } else { + const keys = Object.keys(headersList) + for (const key of keys) { + const val = headersList[key] + if (key.toLowerCase() === 'content-encoding') { + // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1 + // "All content-coding values are case-insensitive..." + codings = val.toLowerCase().split(',').map((x) => x.trim()).reverse() + } else if (key.toLowerCase() === 'location') { + location = val + } + + headers[kHeadersList].append(key, val) + } + } + + this.body = new Readable({ read: resume }) + + const decoders = [] + + const willFollow = request.redirect === 'follow' && + location && + redirectStatusSet.has(status) + + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding + if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) { + for (const coding of codings) { + // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2 + if (coding === 'x-gzip' || coding === 'gzip') { + decoders.push(zlib.createGunzip({ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH + })) + } else if (coding === 'deflate') { + decoders.push(zlib.createInflate()) + } else if (coding === 'br') { + decoders.push(zlib.createBrotliDecompress()) + } else { + decoders.length = 0 + break + } + } + } + + resolve({ + status, + statusText, + headersList: headers[kHeadersList], + body: decoders.length + ? pipeline(this.body, ...decoders, () => { }) + : this.body.on('error', () => {}) + }) + + return true + }, + + onData (chunk) { + if (fetchParams.controller.dump) { + return + } + + // 1. If one or more bytes have been transmitted from response’s + // message body, then: + + // 1. Let bytes be the transmitted bytes. + const bytes = chunk + + // 2. Let codings be the result of extracting header list values + // given `Content-Encoding` and response’s header list. + // See pullAlgorithm. + + // 3. Increase timingInfo’s encoded body size by bytes’s length. + timingInfo.encodedBodySize += bytes.byteLength + + // 4. See pullAlgorithm... + + return this.body.push(bytes) + }, + + onComplete () { + if (this.abort) { + fetchParams.controller.off('terminated', this.abort) + } + + fetchParams.controller.ended = true + + this.body.push(null) + }, + + onError (error) { + if (this.abort) { + fetchParams.controller.off('terminated', this.abort) + } + + this.body?.destroy(error) + + fetchParams.controller.terminate(error) + + reject(error) + }, + + onUpgrade (status, headersList, socket) { + if (status !== 101) { + return + } + + const headers = new Headers() + + for (let n = 0; n < headersList.length; n += 2) { + const key = headersList[n + 0].toString('latin1') + const val = headersList[n + 1].toString('latin1') + + headers[kHeadersList].append(key, val) + } + + resolve({ + status, + statusText: STATUS_CODES[status], + headersList: headers[kHeadersList], + socket + }) + + return true + } + } + )) + } +} - /***/ -}), +module.exports = { + fetch, + Fetch, + fetching, + finalizeAndReportTiming +} -/***/ 4059: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +/***/ }), +/***/ 8359: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - module.exports.request = __nccwpck_require__(5448) - module.exports.stream = __nccwpck_require__(5395) - module.exports.pipeline = __nccwpck_require__(8752) - module.exports.upgrade = __nccwpck_require__(6923) - module.exports.connect = __nccwpck_require__(9744) +"use strict"; +/* globals AbortController */ + + + +const { extractBody, mixinBody, cloneBody } = __nccwpck_require__(1472) +const { Headers, fill: fillHeaders, HeadersList } = __nccwpck_require__(554) +const { FinalizationRegistry } = __nccwpck_require__(6436)() +const util = __nccwpck_require__(3983) +const { + isValidHTTPToken, + sameOrigin, + normalizeMethod, + makePolicyContainer, + normalizeMethodRecord +} = __nccwpck_require__(2538) +const { + forbiddenMethodsSet, + corsSafeListedMethodsSet, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + requestDuplex +} = __nccwpck_require__(1037) +const { kEnumerableProperty } = util +const { kHeaders, kSignal, kState, kGuard, kRealm } = __nccwpck_require__(5861) +const { webidl } = __nccwpck_require__(1744) +const { getGlobalOrigin } = __nccwpck_require__(1246) +const { URLSerializer } = __nccwpck_require__(685) +const { kHeadersList, kConstruct } = __nccwpck_require__(2785) +const assert = __nccwpck_require__(9491) +const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(2361) + +let TransformStream = globalThis.TransformStream + +const kAbortController = Symbol('abortController') + +const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { + signal.removeEventListener('abort', abort) +}) +// https://fetch.spec.whatwg.org/#request-class +class Request { + // https://fetch.spec.whatwg.org/#dom-request + constructor (input, init = {}) { + if (input === kConstruct) { + return + } + + webidl.argumentLengthCheck(arguments, 1, { header: 'Request constructor' }) + + input = webidl.converters.RequestInfo(input) + init = webidl.converters.RequestInit(init) + + // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object + this[kRealm] = { + settingsObject: { + baseUrl: getGlobalOrigin(), + get origin () { + return this.baseUrl?.origin + }, + policyContainer: makePolicyContainer() + } + } + + // 1. Let request be null. + let request = null + + // 2. Let fallbackMode be null. + let fallbackMode = null + + // 3. Let baseURL be this’s relevant settings object’s API base URL. + const baseUrl = this[kRealm].settingsObject.baseUrl + + // 4. Let signal be null. + let signal = null + + // 5. If input is a string, then: + if (typeof input === 'string') { + // 1. Let parsedURL be the result of parsing input with baseURL. + // 2. If parsedURL is failure, then throw a TypeError. + let parsedURL + try { + parsedURL = new URL(input, baseUrl) + } catch (err) { + throw new TypeError('Failed to parse URL from ' + input, { cause: err }) + } + + // 3. If parsedURL includes credentials, then throw a TypeError. + if (parsedURL.username || parsedURL.password) { + throw new TypeError( + 'Request cannot be constructed from a URL that includes credentials: ' + + input + ) + } + + // 4. Set request to a new request whose URL is parsedURL. + request = makeRequest({ urlList: [parsedURL] }) + + // 5. Set fallbackMode to "cors". + fallbackMode = 'cors' + } else { + // 6. Otherwise: + + // 7. Assert: input is a Request object. + assert(input instanceof Request) + + // 8. Set request to input’s request. + request = input[kState] + + // 9. Set signal to input’s signal. + signal = input[kSignal] + } + + // 7. Let origin be this’s relevant settings object’s origin. + const origin = this[kRealm].settingsObject.origin + + // 8. Let window be "client". + let window = 'client' + + // 9. If request’s window is an environment settings object and its origin + // is same origin with origin, then set window to request’s window. + if ( + request.window?.constructor?.name === 'EnvironmentSettingsObject' && + sameOrigin(request.window, origin) + ) { + window = request.window + } + + // 10. If init["window"] exists and is non-null, then throw a TypeError. + if (init.window != null) { + throw new TypeError(`'window' option '${window}' must be null`) + } + + // 11. If init["window"] exists, then set window to "no-window". + if ('window' in init) { + window = 'no-window' + } + + // 12. Set request to a new request with the following properties: + request = makeRequest({ + // URL request’s URL. + // undici implementation note: this is set as the first item in request's urlList in makeRequest + // method request’s method. + method: request.method, + // header list A copy of request’s header list. + // undici implementation note: headersList is cloned in makeRequest + headersList: request.headersList, + // unsafe-request flag Set. + unsafeRequest: request.unsafeRequest, + // client This’s relevant settings object. + client: this[kRealm].settingsObject, + // window window. + window, + // priority request’s priority. + priority: request.priority, + // origin request’s origin. The propagation of the origin is only significant for navigation requests + // being handled by a service worker. In this scenario a request can have an origin that is different + // from the current client. + origin: request.origin, + // referrer request’s referrer. + referrer: request.referrer, + // referrer policy request’s referrer policy. + referrerPolicy: request.referrerPolicy, + // mode request’s mode. + mode: request.mode, + // credentials mode request’s credentials mode. + credentials: request.credentials, + // cache mode request’s cache mode. + cache: request.cache, + // redirect mode request’s redirect mode. + redirect: request.redirect, + // integrity metadata request’s integrity metadata. + integrity: request.integrity, + // keepalive request’s keepalive. + keepalive: request.keepalive, + // reload-navigation flag request’s reload-navigation flag. + reloadNavigation: request.reloadNavigation, + // history-navigation flag request’s history-navigation flag. + historyNavigation: request.historyNavigation, + // URL list A clone of request’s URL list. + urlList: [...request.urlList] + }) + + const initHasKey = Object.keys(init).length !== 0 + + // 13. If init is not empty, then: + if (initHasKey) { + // 1. If request’s mode is "navigate", then set it to "same-origin". + if (request.mode === 'navigate') { + request.mode = 'same-origin' + } + + // 2. Unset request’s reload-navigation flag. + request.reloadNavigation = false + + // 3. Unset request’s history-navigation flag. + request.historyNavigation = false + + // 4. Set request’s origin to "client". + request.origin = 'client' + + // 5. Set request’s referrer to "client" + request.referrer = 'client' + + // 6. Set request’s referrer policy to the empty string. + request.referrerPolicy = '' + + // 7. Set request’s URL to request’s current URL. + request.url = request.urlList[request.urlList.length - 1] + + // 8. Set request’s URL list to « request’s URL ». + request.urlList = [request.url] + } + + // 14. If init["referrer"] exists, then: + if (init.referrer !== undefined) { + // 1. Let referrer be init["referrer"]. + const referrer = init.referrer + + // 2. If referrer is the empty string, then set request’s referrer to "no-referrer". + if (referrer === '') { + request.referrer = 'no-referrer' + } else { + // 1. Let parsedReferrer be the result of parsing referrer with + // baseURL. + // 2. If parsedReferrer is failure, then throw a TypeError. + let parsedReferrer + try { + parsedReferrer = new URL(referrer, baseUrl) + } catch (err) { + throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }) + } + + // 3. If one of the following is true + // - parsedReferrer’s scheme is "about" and path is the string "client" + // - parsedReferrer’s origin is not same origin with origin + // then set request’s referrer to "client". + if ( + (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') || + (origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl)) + ) { + request.referrer = 'client' + } else { + // 4. Otherwise, set request’s referrer to parsedReferrer. + request.referrer = parsedReferrer + } + } + } + + // 15. If init["referrerPolicy"] exists, then set request’s referrer policy + // to it. + if (init.referrerPolicy !== undefined) { + request.referrerPolicy = init.referrerPolicy + } + + // 16. Let mode be init["mode"] if it exists, and fallbackMode otherwise. + let mode + if (init.mode !== undefined) { + mode = init.mode + } else { + mode = fallbackMode + } + + // 17. If mode is "navigate", then throw a TypeError. + if (mode === 'navigate') { + throw webidl.errors.exception({ + header: 'Request constructor', + message: 'invalid request mode navigate.' + }) + } + + // 18. If mode is non-null, set request’s mode to mode. + if (mode != null) { + request.mode = mode + } + + // 19. If init["credentials"] exists, then set request’s credentials mode + // to it. + if (init.credentials !== undefined) { + request.credentials = init.credentials + } + + // 18. If init["cache"] exists, then set request’s cache mode to it. + if (init.cache !== undefined) { + request.cache = init.cache + } + + // 21. If request’s cache mode is "only-if-cached" and request’s mode is + // not "same-origin", then throw a TypeError. + if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { + throw new TypeError( + "'only-if-cached' can be set only with 'same-origin' mode" + ) + } + + // 22. If init["redirect"] exists, then set request’s redirect mode to it. + if (init.redirect !== undefined) { + request.redirect = init.redirect + } + + // 23. If init["integrity"] exists, then set request’s integrity metadata to it. + if (init.integrity != null) { + request.integrity = String(init.integrity) + } + + // 24. If init["keepalive"] exists, then set request’s keepalive to it. + if (init.keepalive !== undefined) { + request.keepalive = Boolean(init.keepalive) + } + + // 25. If init["method"] exists, then: + if (init.method !== undefined) { + // 1. Let method be init["method"]. + let method = init.method + + // 2. If method is not a method or method is a forbidden method, then + // throw a TypeError. + if (!isValidHTTPToken(method)) { + throw new TypeError(`'${method}' is not a valid HTTP method.`) + } + + if (forbiddenMethodsSet.has(method.toUpperCase())) { + throw new TypeError(`'${method}' HTTP method is unsupported.`) + } + + // 3. Normalize method. + method = normalizeMethodRecord[method] ?? normalizeMethod(method) + + // 4. Set request’s method to method. + request.method = method + } + + // 26. If init["signal"] exists, then set signal to it. + if (init.signal !== undefined) { + signal = init.signal + } + + // 27. Set this’s request to request. + this[kState] = request + + // 28. Set this’s signal to a new AbortSignal object with this’s relevant + // Realm. + // TODO: could this be simplified with AbortSignal.any + // (https://dom.spec.whatwg.org/#dom-abortsignal-any) + const ac = new AbortController() + this[kSignal] = ac.signal + this[kSignal][kRealm] = this[kRealm] + + // 29. If signal is not null, then make this’s signal follow signal. + if (signal != null) { + if ( + !signal || + typeof signal.aborted !== 'boolean' || + typeof signal.addEventListener !== 'function' + ) { + throw new TypeError( + "Failed to construct 'Request': member signal is not of type AbortSignal." + ) + } + + if (signal.aborted) { + ac.abort(signal.reason) + } else { + // Keep a strong ref to ac while request object + // is alive. This is needed to prevent AbortController + // from being prematurely garbage collected. + // See, https://github.com/nodejs/undici/issues/1926. + this[kAbortController] = ac + + const acRef = new WeakRef(ac) + const abort = function () { + const ac = acRef.deref() + if (ac !== undefined) { + ac.abort(this.reason) + } + } + + // Third-party AbortControllers may not work with these. + // See, https://github.com/nodejs/undici/pull/1910#issuecomment-1464495619. + try { + // If the max amount of listeners is equal to the default, increase it + // This is only available in node >= v19.9.0 + if (typeof getMaxListeners === 'function' && getMaxListeners(signal) === defaultMaxListeners) { + setMaxListeners(100, signal) + } else if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) { + setMaxListeners(100, signal) + } + } catch {} + + util.addAbortListener(signal, abort) + requestFinalizer.register(ac, { signal, abort }) + } + } + + // 30. Set this’s headers to a new Headers object with this’s relevant + // Realm, whose header list is request’s header list and guard is + // "request". + this[kHeaders] = new Headers(kConstruct) + this[kHeaders][kHeadersList] = request.headersList + this[kHeaders][kGuard] = 'request' + this[kHeaders][kRealm] = this[kRealm] + + // 31. If this’s request’s mode is "no-cors", then: + if (mode === 'no-cors') { + // 1. If this’s request’s method is not a CORS-safelisted method, + // then throw a TypeError. + if (!corsSafeListedMethodsSet.has(request.method)) { + throw new TypeError( + `'${request.method} is unsupported in no-cors mode.` + ) + } + + // 2. Set this’s headers’s guard to "request-no-cors". + this[kHeaders][kGuard] = 'request-no-cors' + } + + // 32. If init is not empty, then: + if (initHasKey) { + /** @type {HeadersList} */ + const headersList = this[kHeaders][kHeadersList] + // 1. Let headers be a copy of this’s headers and its associated header + // list. + // 2. If init["headers"] exists, then set headers to init["headers"]. + const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList) + + // 3. Empty this’s headers’s header list. + headersList.clear() + + // 4. If headers is a Headers object, then for each header in its header + // list, append header’s name/header’s value to this’s headers. + if (headers instanceof HeadersList) { + for (const [key, val] of headers) { + headersList.append(key, val) + } + // Note: Copy the `set-cookie` meta-data. + headersList.cookies = headers.cookies + } else { + // 5. Otherwise, fill this’s headers with headers. + fillHeaders(this[kHeaders], headers) + } + } + + // 33. Let inputBody be input’s request’s body if input is a Request + // object; otherwise null. + const inputBody = input instanceof Request ? input[kState].body : null + + // 34. If either init["body"] exists and is non-null or inputBody is + // non-null, and request’s method is `GET` or `HEAD`, then throw a + // TypeError. + if ( + (init.body != null || inputBody != null) && + (request.method === 'GET' || request.method === 'HEAD') + ) { + throw new TypeError('Request with GET/HEAD method cannot have body.') + } + + // 35. Let initBody be null. + let initBody = null + + // 36. If init["body"] exists and is non-null, then: + if (init.body != null) { + // 1. Let Content-Type be null. + // 2. Set initBody and Content-Type to the result of extracting + // init["body"], with keepalive set to request’s keepalive. + const [extractedBody, contentType] = extractBody( + init.body, + request.keepalive + ) + initBody = extractedBody + + // 3, If Content-Type is non-null and this’s headers’s header list does + // not contain `Content-Type`, then append `Content-Type`/Content-Type to + // this’s headers. + if (contentType && !this[kHeaders][kHeadersList].contains('content-type')) { + this[kHeaders].append('content-type', contentType) + } + } + + // 37. Let inputOrInitBody be initBody if it is non-null; otherwise + // inputBody. + const inputOrInitBody = initBody ?? inputBody + + // 38. If inputOrInitBody is non-null and inputOrInitBody’s source is + // null, then: + if (inputOrInitBody != null && inputOrInitBody.source == null) { + // 1. If initBody is non-null and init["duplex"] does not exist, + // then throw a TypeError. + if (initBody != null && init.duplex == null) { + throw new TypeError('RequestInit: duplex option is required when sending a body.') + } + + // 2. If this’s request’s mode is neither "same-origin" nor "cors", + // then throw a TypeError. + if (request.mode !== 'same-origin' && request.mode !== 'cors') { + throw new TypeError( + 'If request is made from ReadableStream, mode should be "same-origin" or "cors"' + ) + } + + // 3. Set this’s request’s use-CORS-preflight flag. + request.useCORSPreflightFlag = true + } + + // 39. Let finalBody be inputOrInitBody. + let finalBody = inputOrInitBody + + // 40. If initBody is null and inputBody is non-null, then: + if (initBody == null && inputBody != null) { + // 1. If input is unusable, then throw a TypeError. + if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) { + throw new TypeError( + 'Cannot construct a Request with a Request object that has already been used.' + ) + } + + // 2. Set finalBody to the result of creating a proxy for inputBody. + if (!TransformStream) { + TransformStream = (__nccwpck_require__(5356).TransformStream) + } + + // https://streams.spec.whatwg.org/#readablestream-create-a-proxy + const identityTransform = new TransformStream() + inputBody.stream.pipeThrough(identityTransform) + finalBody = { + source: inputBody.source, + length: inputBody.length, + stream: identityTransform.readable + } + } + + // 41. Set this’s request’s body to finalBody. + this[kState].body = finalBody + } + + // Returns request’s HTTP method, which is "GET" by default. + get method () { + webidl.brandCheck(this, Request) + + // The method getter steps are to return this’s request’s method. + return this[kState].method + } + + // Returns the URL of request as a string. + get url () { + webidl.brandCheck(this, Request) + + // The url getter steps are to return this’s request’s URL, serialized. + return URLSerializer(this[kState].url) + } + + // Returns a Headers object consisting of the headers associated with request. + // Note that headers added in the network layer by the user agent will not + // be accounted for in this object, e.g., the "Host" header. + get headers () { + webidl.brandCheck(this, Request) + + // The headers getter steps are to return this’s headers. + return this[kHeaders] + } + + // Returns the kind of resource requested by request, e.g., "document" + // or "script". + get destination () { + webidl.brandCheck(this, Request) + + // The destination getter are to return this’s request’s destination. + return this[kState].destination + } + + // Returns the referrer of request. Its value can be a same-origin URL if + // explicitly set in init, the empty string to indicate no referrer, and + // "about:client" when defaulting to the global’s default. This is used + // during fetching to determine the value of the `Referer` header of the + // request being made. + get referrer () { + webidl.brandCheck(this, Request) + + // 1. If this’s request’s referrer is "no-referrer", then return the + // empty string. + if (this[kState].referrer === 'no-referrer') { + return '' + } + + // 2. If this’s request’s referrer is "client", then return + // "about:client". + if (this[kState].referrer === 'client') { + return 'about:client' + } + + // Return this’s request’s referrer, serialized. + return this[kState].referrer.toString() + } + + // Returns the referrer policy associated with request. + // This is used during fetching to compute the value of the request’s + // referrer. + get referrerPolicy () { + webidl.brandCheck(this, Request) + + // The referrerPolicy getter steps are to return this’s request’s referrer policy. + return this[kState].referrerPolicy + } + + // Returns the mode associated with request, which is a string indicating + // whether the request will use CORS, or will be restricted to same-origin + // URLs. + get mode () { + webidl.brandCheck(this, Request) + + // The mode getter steps are to return this’s request’s mode. + return this[kState].mode + } + + // Returns the credentials mode associated with request, + // which is a string indicating whether credentials will be sent with the + // request always, never, or only when sent to a same-origin URL. + get credentials () { + // The credentials getter steps are to return this’s request’s credentials mode. + return this[kState].credentials + } + + // Returns the cache mode associated with request, + // which is a string indicating how the request will + // interact with the browser’s cache when fetching. + get cache () { + webidl.brandCheck(this, Request) + + // The cache getter steps are to return this’s request’s cache mode. + return this[kState].cache + } + + // Returns the redirect mode associated with request, + // which is a string indicating how redirects for the + // request will be handled during fetching. A request + // will follow redirects by default. + get redirect () { + webidl.brandCheck(this, Request) + + // The redirect getter steps are to return this’s request’s redirect mode. + return this[kState].redirect + } + + // Returns request’s subresource integrity metadata, which is a + // cryptographic hash of the resource being fetched. Its value + // consists of multiple hashes separated by whitespace. [SRI] + get integrity () { + webidl.brandCheck(this, Request) + + // The integrity getter steps are to return this’s request’s integrity + // metadata. + return this[kState].integrity + } + + // Returns a boolean indicating whether or not request can outlive the + // global in which it was created. + get keepalive () { + webidl.brandCheck(this, Request) + + // The keepalive getter steps are to return this’s request’s keepalive. + return this[kState].keepalive + } + + // Returns a boolean indicating whether or not request is for a reload + // navigation. + get isReloadNavigation () { + webidl.brandCheck(this, Request) + + // The isReloadNavigation getter steps are to return true if this’s + // request’s reload-navigation flag is set; otherwise false. + return this[kState].reloadNavigation + } + + // Returns a boolean indicating whether or not request is for a history + // navigation (a.k.a. back-foward navigation). + get isHistoryNavigation () { + webidl.brandCheck(this, Request) + + // The isHistoryNavigation getter steps are to return true if this’s request’s + // history-navigation flag is set; otherwise false. + return this[kState].historyNavigation + } + + // Returns the signal associated with request, which is an AbortSignal + // object indicating whether or not request has been aborted, and its + // abort event handler. + get signal () { + webidl.brandCheck(this, Request) + + // The signal getter steps are to return this’s signal. + return this[kSignal] + } + + get body () { + webidl.brandCheck(this, Request) + + return this[kState].body ? this[kState].body.stream : null + } + + get bodyUsed () { + webidl.brandCheck(this, Request) + + return !!this[kState].body && util.isDisturbed(this[kState].body.stream) + } + + get duplex () { + webidl.brandCheck(this, Request) + + return 'half' + } + + // Returns a clone of request. + clone () { + webidl.brandCheck(this, Request) + + // 1. If this is unusable, then throw a TypeError. + if (this.bodyUsed || this.body?.locked) { + throw new TypeError('unusable') + } + + // 2. Let clonedRequest be the result of cloning this’s request. + const clonedRequest = cloneRequest(this[kState]) + + // 3. Let clonedRequestObject be the result of creating a Request object, + // given clonedRequest, this’s headers’s guard, and this’s relevant Realm. + const clonedRequestObject = new Request(kConstruct) + clonedRequestObject[kState] = clonedRequest + clonedRequestObject[kRealm] = this[kRealm] + clonedRequestObject[kHeaders] = new Headers(kConstruct) + clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList + clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard] + clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm] + + // 4. Make clonedRequestObject’s signal follow this’s signal. + const ac = new AbortController() + if (this.signal.aborted) { + ac.abort(this.signal.reason) + } else { + util.addAbortListener( + this.signal, + () => { + ac.abort(this.signal.reason) + } + ) + } + clonedRequestObject[kSignal] = ac.signal + + // 4. Return clonedRequestObject. + return clonedRequestObject + } +} - /***/ -}), +mixinBody(Request) + +function makeRequest (init) { + // https://fetch.spec.whatwg.org/#requests + const request = { + method: 'GET', + localURLsOnly: false, + unsafeRequest: false, + body: null, + client: null, + reservedClient: null, + replacesClientId: '', + window: 'client', + keepalive: false, + serviceWorkers: 'all', + initiator: '', + destination: '', + priority: null, + origin: 'client', + policyContainer: 'client', + referrer: 'client', + referrerPolicy: '', + mode: 'no-cors', + useCORSPreflightFlag: false, + credentials: 'same-origin', + useCredentials: false, + cache: 'default', + redirect: 'follow', + integrity: '', + cryptoGraphicsNonceMetadata: '', + parserMetadata: '', + reloadNavigation: false, + historyNavigation: false, + userActivation: false, + taintedOrigin: false, + redirectCount: 0, + responseTainting: 'basic', + preventNoCacheCacheControlHeaderModification: false, + done: false, + timingAllowFailed: false, + ...init, + headersList: init.headersList + ? new HeadersList(init.headersList) + : new HeadersList() + } + request.url = request.urlList[0] + return request +} -/***/ 3858: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +// https://fetch.spec.whatwg.org/#concept-request-clone +function cloneRequest (request) { + // To clone a request request, run these steps: - "use strict"; - // Ported from https://github.com/nodejs/undici/pull/907 + // 1. Let newRequest be a copy of request, except for its body. + const newRequest = makeRequest({ ...request, body: null }) + // 2. If request’s body is non-null, set newRequest’s body to the + // result of cloning request’s body. + if (request.body != null) { + newRequest.body = cloneBody(request.body) + } + // 3. Return newRequest. + return newRequest +} - const assert = __nccwpck_require__(9491) - const { Readable } = __nccwpck_require__(2781) - const { RequestAbortedError, NotSupportedError, InvalidArgumentError } = __nccwpck_require__(8045) - const util = __nccwpck_require__(3983) - const { ReadableStreamFrom, toUSVString } = __nccwpck_require__(3983) +Object.defineProperties(Request.prototype, { + method: kEnumerableProperty, + url: kEnumerableProperty, + headers: kEnumerableProperty, + redirect: kEnumerableProperty, + clone: kEnumerableProperty, + signal: kEnumerableProperty, + duplex: kEnumerableProperty, + destination: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + isHistoryNavigation: kEnumerableProperty, + isReloadNavigation: kEnumerableProperty, + keepalive: kEnumerableProperty, + integrity: kEnumerableProperty, + cache: kEnumerableProperty, + credentials: kEnumerableProperty, + attribute: kEnumerableProperty, + referrerPolicy: kEnumerableProperty, + referrer: kEnumerableProperty, + mode: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'Request', + configurable: true + } +}) - let Blob +webidl.converters.Request = webidl.interfaceConverter( + Request +) - const kConsume = Symbol('kConsume') - const kReading = Symbol('kReading') - const kBody = Symbol('kBody') - const kAbort = Symbol('abort') - const kContentType = Symbol('kContentType') +// https://fetch.spec.whatwg.org/#requestinfo +webidl.converters.RequestInfo = function (V) { + if (typeof V === 'string') { + return webidl.converters.USVString(V) + } - const noop = () => { } + if (V instanceof Request) { + return webidl.converters.Request(V) + } - module.exports = class BodyReadable extends Readable { - constructor({ - resume, - abort, - contentType = '', - highWaterMark = 64 * 1024 // Same as nodejs fs streams. - }) { - super({ - autoDestroy: true, - read: resume, - highWaterMark - }) + return webidl.converters.USVString(V) +} - this._readableState.dataEmitted = false +webidl.converters.AbortSignal = webidl.interfaceConverter( + AbortSignal +) + +// https://fetch.spec.whatwg.org/#requestinit +webidl.converters.RequestInit = webidl.dictionaryConverter([ + { + key: 'method', + converter: webidl.converters.ByteString + }, + { + key: 'headers', + converter: webidl.converters.HeadersInit + }, + { + key: 'body', + converter: webidl.nullableConverter( + webidl.converters.BodyInit + ) + }, + { + key: 'referrer', + converter: webidl.converters.USVString + }, + { + key: 'referrerPolicy', + converter: webidl.converters.DOMString, + // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy + allowedValues: referrerPolicy + }, + { + key: 'mode', + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#concept-request-mode + allowedValues: requestMode + }, + { + key: 'credentials', + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestcredentials + allowedValues: requestCredentials + }, + { + key: 'cache', + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestcache + allowedValues: requestCache + }, + { + key: 'redirect', + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestredirect + allowedValues: requestRedirect + }, + { + key: 'integrity', + converter: webidl.converters.DOMString + }, + { + key: 'keepalive', + converter: webidl.converters.boolean + }, + { + key: 'signal', + converter: webidl.nullableConverter( + (signal) => webidl.converters.AbortSignal( + signal, + { strict: false } + ) + ) + }, + { + key: 'window', + converter: webidl.converters.any + }, + { + key: 'duplex', + converter: webidl.converters.DOMString, + allowedValues: requestDuplex + } +]) + +module.exports = { Request, makeRequest } + + +/***/ }), - this[kAbort] = abort - this[kConsume] = null - this[kBody] = null - this[kContentType] = contentType +/***/ 7823: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // Is stream being consumed through Readable API? - // This is an optimization so that we avoid checking - // for 'data' and 'readable' listeners in the hot path - // inside push(). - this[kReading] = false - } +"use strict"; + + +const { Headers, HeadersList, fill } = __nccwpck_require__(554) +const { extractBody, cloneBody, mixinBody } = __nccwpck_require__(1472) +const util = __nccwpck_require__(3983) +const { kEnumerableProperty } = util +const { + isValidReasonPhrase, + isCancelled, + isAborted, + isBlobLike, + serializeJavascriptValueToJSONString, + isErrorLike, + isomorphicEncode +} = __nccwpck_require__(2538) +const { + redirectStatusSet, + nullBodyStatus, + DOMException +} = __nccwpck_require__(1037) +const { kState, kHeaders, kGuard, kRealm } = __nccwpck_require__(5861) +const { webidl } = __nccwpck_require__(1744) +const { FormData } = __nccwpck_require__(2015) +const { getGlobalOrigin } = __nccwpck_require__(1246) +const { URLSerializer } = __nccwpck_require__(685) +const { kHeadersList, kConstruct } = __nccwpck_require__(2785) +const assert = __nccwpck_require__(9491) +const { types } = __nccwpck_require__(3837) + +const ReadableStream = globalThis.ReadableStream || (__nccwpck_require__(5356).ReadableStream) +const textEncoder = new TextEncoder('utf-8') + +// https://fetch.spec.whatwg.org/#response-class +class Response { + // Creates network error Response. + static error () { + // TODO + const relevantRealm = { settingsObject: {} } + + // The static error() method steps are to return the result of creating a + // Response object, given a new network error, "immutable", and this’s + // relevant Realm. + const responseObject = new Response() + responseObject[kState] = makeNetworkError() + responseObject[kRealm] = relevantRealm + responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList + responseObject[kHeaders][kGuard] = 'immutable' + responseObject[kHeaders][kRealm] = relevantRealm + return responseObject + } + + // https://fetch.spec.whatwg.org/#dom-response-json + static json (data, init = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: 'Response.json' }) + + if (init !== null) { + init = webidl.converters.ResponseInit(init) + } + + // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data. + const bytes = textEncoder.encode( + serializeJavascriptValueToJSONString(data) + ) + + // 2. Let body be the result of extracting bytes. + const body = extractBody(bytes) + + // 3. Let responseObject be the result of creating a Response object, given a new response, + // "response", and this’s relevant Realm. + const relevantRealm = { settingsObject: {} } + const responseObject = new Response() + responseObject[kRealm] = relevantRealm + responseObject[kHeaders][kGuard] = 'response' + responseObject[kHeaders][kRealm] = relevantRealm + + // 4. Perform initialize a response given responseObject, init, and (body, "application/json"). + initializeResponse(responseObject, init, { body: body[0], type: 'application/json' }) + + // 5. Return responseObject. + return responseObject + } + + // Creates a redirect Response that redirects to url with status status. + static redirect (url, status = 302) { + const relevantRealm = { settingsObject: {} } + + webidl.argumentLengthCheck(arguments, 1, { header: 'Response.redirect' }) + + url = webidl.converters.USVString(url) + status = webidl.converters['unsigned short'](status) + + // 1. Let parsedURL be the result of parsing url with current settings + // object’s API base URL. + // 2. If parsedURL is failure, then throw a TypeError. + // TODO: base-URL? + let parsedURL + try { + parsedURL = new URL(url, getGlobalOrigin()) + } catch (err) { + throw Object.assign(new TypeError('Failed to parse URL from ' + url), { + cause: err + }) + } + + // 3. If status is not a redirect status, then throw a RangeError. + if (!redirectStatusSet.has(status)) { + throw new RangeError('Invalid status code ' + status) + } + + // 4. Let responseObject be the result of creating a Response object, + // given a new response, "immutable", and this’s relevant Realm. + const responseObject = new Response() + responseObject[kRealm] = relevantRealm + responseObject[kHeaders][kGuard] = 'immutable' + responseObject[kHeaders][kRealm] = relevantRealm + + // 5. Set responseObject’s response’s status to status. + responseObject[kState].status = status + + // 6. Let value be parsedURL, serialized and isomorphic encoded. + const value = isomorphicEncode(URLSerializer(parsedURL)) + + // 7. Append `Location`/value to responseObject’s response’s header list. + responseObject[kState].headersList.append('location', value) + + // 8. Return responseObject. + return responseObject + } + + // https://fetch.spec.whatwg.org/#dom-response + constructor (body = null, init = {}) { + if (body !== null) { + body = webidl.converters.BodyInit(body) + } + + init = webidl.converters.ResponseInit(init) + + // TODO + this[kRealm] = { settingsObject: {} } + + // 1. Set this’s response to a new response. + this[kState] = makeResponse({}) + + // 2. Set this’s headers to a new Headers object with this’s relevant + // Realm, whose header list is this’s response’s header list and guard + // is "response". + this[kHeaders] = new Headers(kConstruct) + this[kHeaders][kGuard] = 'response' + this[kHeaders][kHeadersList] = this[kState].headersList + this[kHeaders][kRealm] = this[kRealm] + + // 3. Let bodyWithType be null. + let bodyWithType = null + + // 4. If body is non-null, then set bodyWithType to the result of extracting body. + if (body != null) { + const [extractedBody, type] = extractBody(body) + bodyWithType = { body: extractedBody, type } + } + + // 5. Perform initialize a response given this, init, and bodyWithType. + initializeResponse(this, init, bodyWithType) + } + + // Returns response’s type, e.g., "cors". + get type () { + webidl.brandCheck(this, Response) + + // The type getter steps are to return this’s response’s type. + return this[kState].type + } + + // Returns response’s URL, if it has one; otherwise the empty string. + get url () { + webidl.brandCheck(this, Response) + + const urlList = this[kState].urlList + + // The url getter steps are to return the empty string if this’s + // response’s URL is null; otherwise this’s response’s URL, + // serialized with exclude fragment set to true. + const url = urlList[urlList.length - 1] ?? null + + if (url === null) { + return '' + } + + return URLSerializer(url, true) + } + + // Returns whether response was obtained through a redirect. + get redirected () { + webidl.brandCheck(this, Response) + + // The redirected getter steps are to return true if this’s response’s URL + // list has more than one item; otherwise false. + return this[kState].urlList.length > 1 + } + + // Returns response’s status. + get status () { + webidl.brandCheck(this, Response) + + // The status getter steps are to return this’s response’s status. + return this[kState].status + } + + // Returns whether response’s status is an ok status. + get ok () { + webidl.brandCheck(this, Response) + + // The ok getter steps are to return true if this’s response’s status is an + // ok status; otherwise false. + return this[kState].status >= 200 && this[kState].status <= 299 + } + + // Returns response’s status message. + get statusText () { + webidl.brandCheck(this, Response) + + // The statusText getter steps are to return this’s response’s status + // message. + return this[kState].statusText + } + + // Returns response’s headers as Headers. + get headers () { + webidl.brandCheck(this, Response) + + // The headers getter steps are to return this’s headers. + return this[kHeaders] + } + + get body () { + webidl.brandCheck(this, Response) + + return this[kState].body ? this[kState].body.stream : null + } + + get bodyUsed () { + webidl.brandCheck(this, Response) + + return !!this[kState].body && util.isDisturbed(this[kState].body.stream) + } + + // Returns a clone of response. + clone () { + webidl.brandCheck(this, Response) + + // 1. If this is unusable, then throw a TypeError. + if (this.bodyUsed || (this.body && this.body.locked)) { + throw webidl.errors.exception({ + header: 'Response.clone', + message: 'Body has already been consumed.' + }) + } + + // 2. Let clonedResponse be the result of cloning this’s response. + const clonedResponse = cloneResponse(this[kState]) + + // 3. Return the result of creating a Response object, given + // clonedResponse, this’s headers’s guard, and this’s relevant Realm. + const clonedResponseObject = new Response() + clonedResponseObject[kState] = clonedResponse + clonedResponseObject[kRealm] = this[kRealm] + clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList + clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard] + clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm] + + return clonedResponseObject + } +} - destroy(err) { - if (this.destroyed) { - // Node < 16 - return this - } +mixinBody(Response) + +Object.defineProperties(Response.prototype, { + type: kEnumerableProperty, + url: kEnumerableProperty, + status: kEnumerableProperty, + ok: kEnumerableProperty, + redirected: kEnumerableProperty, + statusText: kEnumerableProperty, + headers: kEnumerableProperty, + clone: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'Response', + configurable: true + } +}) - if (!err && !this._readableState.endEmitted) { - err = new RequestAbortedError() - } +Object.defineProperties(Response, { + json: kEnumerableProperty, + redirect: kEnumerableProperty, + error: kEnumerableProperty +}) - if (err) { - this[kAbort]() - } +// https://fetch.spec.whatwg.org/#concept-response-clone +function cloneResponse (response) { + // To clone a response response, run these steps: + + // 1. If response is a filtered response, then return a new identical + // filtered response whose internal response is a clone of response’s + // internal response. + if (response.internalResponse) { + return filterResponse( + cloneResponse(response.internalResponse), + response.type + ) + } + + // 2. Let newResponse be a copy of response, except for its body. + const newResponse = makeResponse({ ...response, body: null }) + + // 3. If response’s body is non-null, then set newResponse’s body to the + // result of cloning response’s body. + if (response.body != null) { + newResponse.body = cloneBody(response.body) + } + + // 4. Return newResponse. + return newResponse +} - return super.destroy(err) - } +function makeResponse (init) { + return { + aborted: false, + rangeRequested: false, + timingAllowPassed: false, + requestIncludesCredentials: false, + type: 'default', + status: 200, + timingInfo: null, + cacheState: '', + statusText: '', + ...init, + headersList: init.headersList + ? new HeadersList(init.headersList) + : new HeadersList(), + urlList: init.urlList ? [...init.urlList] : [] + } +} - emit(ev, ...args) { - if (ev === 'data') { - // Node < 16.7 - this._readableState.dataEmitted = true - } else if (ev === 'error') { - // Node < 16 - this._readableState.errorEmitted = true - } - return super.emit(ev, ...args) - } +function makeNetworkError (reason) { + const isError = isErrorLike(reason) + return makeResponse({ + type: 'error', + status: 0, + error: isError + ? reason + : new Error(reason ? String(reason) : reason), + aborted: reason && reason.name === 'AbortError' + }) +} - on(ev, ...args) { - if (ev === 'data' || ev === 'readable') { - this[kReading] = true - } - return super.on(ev, ...args) - } +function makeFilteredResponse (response, state) { + state = { + internalResponse: response, + ...state + } + + return new Proxy(response, { + get (target, p) { + return p in state ? state[p] : target[p] + }, + set (target, p, value) { + assert(!(p in state)) + target[p] = value + return true + } + }) +} - addListener(ev, ...args) { - return this.on(ev, ...args) - } +// https://fetch.spec.whatwg.org/#concept-filtered-response +function filterResponse (response, type) { + // Set response to the following filtered response with response as its + // internal response, depending on request’s response tainting: + if (type === 'basic') { + // A basic filtered response is a filtered response whose type is "basic" + // and header list excludes any headers in internal response’s header list + // whose name is a forbidden response-header name. + + // Note: undici does not implement forbidden response-header names + return makeFilteredResponse(response, { + type: 'basic', + headersList: response.headersList + }) + } else if (type === 'cors') { + // A CORS filtered response is a filtered response whose type is "cors" + // and header list excludes any headers in internal response’s header + // list whose name is not a CORS-safelisted response-header name, given + // internal response’s CORS-exposed header-name list. + + // Note: undici does not implement CORS-safelisted response-header names + return makeFilteredResponse(response, { + type: 'cors', + headersList: response.headersList + }) + } else if (type === 'opaque') { + // An opaque filtered response is a filtered response whose type is + // "opaque", URL list is the empty list, status is 0, status message + // is the empty byte sequence, header list is empty, and body is null. + + return makeFilteredResponse(response, { + type: 'opaque', + urlList: Object.freeze([]), + status: 0, + statusText: '', + body: null + }) + } else if (type === 'opaqueredirect') { + // An opaque-redirect filtered response is a filtered response whose type + // is "opaqueredirect", status is 0, status message is the empty byte + // sequence, header list is empty, and body is null. + + return makeFilteredResponse(response, { + type: 'opaqueredirect', + status: 0, + statusText: '', + headersList: [], + body: null + }) + } else { + assert(false) + } +} - off(ev, ...args) { - const ret = super.off(ev, ...args) - if (ev === 'data' || ev === 'readable') { - this[kReading] = ( - this.listenerCount('data') > 0 || - this.listenerCount('readable') > 0 - ) - } - return ret - } +// https://fetch.spec.whatwg.org/#appropriate-network-error +function makeAppropriateNetworkError (fetchParams, err = null) { + // 1. Assert: fetchParams is canceled. + assert(isCancelled(fetchParams)) - removeListener(ev, ...args) { - return this.off(ev, ...args) - } + // 2. Return an aborted network error if fetchParams is aborted; + // otherwise return a network error. + return isAborted(fetchParams) + ? makeNetworkError(Object.assign(new DOMException('The operation was aborted.', 'AbortError'), { cause: err })) + : makeNetworkError(Object.assign(new DOMException('Request was cancelled.'), { cause: err })) +} - push(chunk) { - if (this[kConsume] && chunk !== null && this.readableLength === 0) { - consumePush(this[kConsume], chunk) - return this[kReading] ? super.push(chunk) : true - } - return super.push(chunk) - } +// https://whatpr.org/fetch/1392.html#initialize-a-response +function initializeResponse (response, init, body) { + // 1. If init["status"] is not in the range 200 to 599, inclusive, then + // throw a RangeError. + if (init.status !== null && (init.status < 200 || init.status > 599)) { + throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.') + } + + // 2. If init["statusText"] does not match the reason-phrase token production, + // then throw a TypeError. + if ('statusText' in init && init.statusText != null) { + // See, https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2: + // reason-phrase = *( HTAB / SP / VCHAR / obs-text ) + if (!isValidReasonPhrase(String(init.statusText))) { + throw new TypeError('Invalid statusText') + } + } + + // 3. Set response’s response’s status to init["status"]. + if ('status' in init && init.status != null) { + response[kState].status = init.status + } + + // 4. Set response’s response’s status message to init["statusText"]. + if ('statusText' in init && init.statusText != null) { + response[kState].statusText = init.statusText + } + + // 5. If init["headers"] exists, then fill response’s headers with init["headers"]. + if ('headers' in init && init.headers != null) { + fill(response[kHeaders], init.headers) + } + + // 6. If body was given, then: + if (body) { + // 1. If response's status is a null body status, then throw a TypeError. + if (nullBodyStatus.includes(response.status)) { + throw webidl.errors.exception({ + header: 'Response constructor', + message: 'Invalid response status code ' + response.status + }) + } + + // 2. Set response's body to body's body. + response[kState].body = body.body + + // 3. If body's type is non-null and response's header list does not contain + // `Content-Type`, then append (`Content-Type`, body's type) to response's header list. + if (body.type != null && !response[kState].headersList.contains('Content-Type')) { + response[kState].headersList.append('content-type', body.type) + } + } +} - // https://fetch.spec.whatwg.org/#dom-body-text - async text() { - return consume(this, 'text') - } +webidl.converters.ReadableStream = webidl.interfaceConverter( + ReadableStream +) - // https://fetch.spec.whatwg.org/#dom-body-json - async json() { - return consume(this, 'json') - } +webidl.converters.FormData = webidl.interfaceConverter( + FormData +) - // https://fetch.spec.whatwg.org/#dom-body-blob - async blob() { - return consume(this, 'blob') - } +webidl.converters.URLSearchParams = webidl.interfaceConverter( + URLSearchParams +) - // https://fetch.spec.whatwg.org/#dom-body-arraybuffer - async arrayBuffer() { - return consume(this, 'arrayBuffer') - } +// https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit +webidl.converters.XMLHttpRequestBodyInit = function (V) { + if (typeof V === 'string') { + return webidl.converters.USVString(V) + } - // https://fetch.spec.whatwg.org/#dom-body-formdata - async formData() { - // TODO: Implement. - throw new NotSupportedError() - } + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }) + } - // https://fetch.spec.whatwg.org/#dom-body-bodyused - get bodyUsed() { - return util.isDisturbed(this) - } + if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) { + return webidl.converters.BufferSource(V) + } - // https://fetch.spec.whatwg.org/#dom-body-body - get body() { - if (!this[kBody]) { - this[kBody] = ReadableStreamFrom(this) - if (this[kConsume]) { - // TODO: Is this the best way to force a lock? - this[kBody].getReader() // Ensure stream is locked. - assert(this[kBody].locked) - } - } - return this[kBody] - } + if (util.isFormDataLike(V)) { + return webidl.converters.FormData(V, { strict: false }) + } - dump(opts) { - let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144 - const signal = opts && opts.signal + if (V instanceof URLSearchParams) { + return webidl.converters.URLSearchParams(V) + } - if (signal) { - try { - if (typeof signal !== 'object' || !('aborted' in signal)) { - throw new InvalidArgumentError('signal must be an AbortSignal') - } - util.throwIfAborted(signal) - } catch (err) { - return Promise.reject(err) - } - } + return webidl.converters.DOMString(V) +} - if (this.closed) { - return Promise.resolve(null) - } +// https://fetch.spec.whatwg.org/#bodyinit +webidl.converters.BodyInit = function (V) { + if (V instanceof ReadableStream) { + return webidl.converters.ReadableStream(V) + } - return new Promise((resolve, reject) => { - const signalListenerCleanup = signal - ? util.addAbortListener(signal, () => { - this.destroy() - }) - : noop - - this - .on('close', function () { - signalListenerCleanup() - if (signal && signal.aborted) { - reject(signal.reason || Object.assign(new Error('The operation was aborted'), { name: 'AbortError' })) - } else { - resolve(null) - } - }) - .on('error', noop) - .on('data', function (chunk) { - limit -= chunk.length - if (limit <= 0) { - this.destroy() - } - }) - .resume() - }) - } - } + // Note: the spec doesn't include async iterables, + // this is an undici extension. + if (V?.[Symbol.asyncIterator]) { + return V + } - // https://streams.spec.whatwg.org/#readablestream-locked - function isLocked(self) { - // Consume is an implicit lock. - return (self[kBody] && self[kBody].locked === true) || self[kConsume] - } + return webidl.converters.XMLHttpRequestBodyInit(V) +} - // https://fetch.spec.whatwg.org/#body-unusable - function isUnusable(self) { - return util.isDisturbed(self) || isLocked(self) - } +webidl.converters.ResponseInit = webidl.dictionaryConverter([ + { + key: 'status', + converter: webidl.converters['unsigned short'], + defaultValue: 200 + }, + { + key: 'statusText', + converter: webidl.converters.ByteString, + defaultValue: '' + }, + { + key: 'headers', + converter: webidl.converters.HeadersInit + } +]) + +module.exports = { + makeNetworkError, + makeResponse, + makeAppropriateNetworkError, + filterResponse, + Response, + cloneResponse +} - async function consume(stream, type) { - if (isUnusable(stream)) { - throw new TypeError('unusable') - } - assert(!stream[kConsume]) +/***/ }), - return new Promise((resolve, reject) => { - stream[kConsume] = { - type, - stream, - resolve, - reject, - length: 0, - body: [] - } +/***/ 5861: +/***/ ((module) => { - stream - .on('error', function (err) { - consumeFinish(this[kConsume], err) - }) - .on('close', function () { - if (this[kConsume].body !== null) { - consumeFinish(this[kConsume], new RequestAbortedError()) - } - }) +"use strict"; - process.nextTick(consumeStart, stream[kConsume]) - }) - } - function consumeStart(consume) { - if (consume.body === null) { - return - } +module.exports = { + kUrl: Symbol('url'), + kHeaders: Symbol('headers'), + kSignal: Symbol('signal'), + kState: Symbol('state'), + kGuard: Symbol('guard'), + kRealm: Symbol('realm') +} - const { _readableState: state } = consume.stream - for (const chunk of state.buffer) { - consumePush(consume, chunk) - } +/***/ }), - if (state.endEmitted) { - consumeEnd(this[kConsume]) - } else { - consume.stream.on('end', function () { - consumeEnd(this[kConsume]) - }) - } +/***/ 2538: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - consume.stream.resume() +"use strict"; - while (consume.stream.read() != null) { - // Loop - } - } - function consumeEnd(consume) { - const { type, body, resolve, stream, length } = consume +const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = __nccwpck_require__(1037) +const { getGlobalOrigin } = __nccwpck_require__(1246) +const { performance } = __nccwpck_require__(4074) +const { isBlobLike, toUSVString, ReadableStreamFrom } = __nccwpck_require__(3983) +const assert = __nccwpck_require__(9491) +const { isUint8Array } = __nccwpck_require__(9830) - try { - if (type === 'text') { - resolve(toUSVString(Buffer.concat(body))) - } else if (type === 'json') { - resolve(JSON.parse(Buffer.concat(body))) - } else if (type === 'arrayBuffer') { - const dst = new Uint8Array(length) - - let pos = 0 - for (const buf of body) { - dst.set(buf, pos) - pos += buf.byteLength - } +let supportedHashes = [] - resolve(dst.buffer) - } else if (type === 'blob') { - if (!Blob) { - Blob = (__nccwpck_require__(4300).Blob) - } - resolve(new Blob(body, { type: stream[kContentType] })) - } +// https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable +/** @type {import('crypto')|undefined} */ +let crypto - consumeFinish(consume) - } catch (err) { - stream.destroy(err) - } - } +try { + crypto = __nccwpck_require__(6113) + const possibleRelevantHashes = ['sha256', 'sha384', 'sha512'] + supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash)) +/* c8 ignore next 3 */ +} catch { +} - function consumePush(consume, chunk) { - consume.length += chunk.length - consume.body.push(chunk) - } +function responseURL (response) { + // https://fetch.spec.whatwg.org/#responses + // A response has an associated URL. It is a pointer to the last URL + // in response’s URL list and null if response’s URL list is empty. + const urlList = response.urlList + const length = urlList.length + return length === 0 ? null : urlList[length - 1].toString() +} - function consumeFinish(consume, err) { - if (consume.body === null) { - return - } +// https://fetch.spec.whatwg.org/#concept-response-location-url +function responseLocationURL (response, requestFragment) { + // 1. If response’s status is not a redirect status, then return null. + if (!redirectStatusSet.has(response.status)) { + return null + } + + // 2. Let location be the result of extracting header list values given + // `Location` and response’s header list. + let location = response.headersList.get('location') + + // 3. If location is a header value, then set location to the result of + // parsing location with response’s URL. + if (location !== null && isValidHeaderValue(location)) { + location = new URL(location, responseURL(response)) + } + + // 4. If location is a URL whose fragment is null, then set location’s + // fragment to requestFragment. + if (location && !location.hash) { + location.hash = requestFragment + } + + // 5. Return location. + return location +} - if (err) { - consume.reject(err) - } else { - consume.resolve() - } +/** @returns {URL} */ +function requestCurrentURL (request) { + return request.urlList[request.urlList.length - 1] +} - consume.type = null - consume.stream = null - consume.resolve = null - consume.reject = null - consume.length = 0 - consume.body = null - } +function requestBadPort (request) { + // 1. Let url be request’s current URL. + const url = requestCurrentURL(request) + // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port, + // then return blocked. + if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) { + return 'blocked' + } - /***/ -}), + // 3. Return allowed. + return 'allowed' +} -/***/ 7474: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +function isErrorLike (object) { + return object instanceof Error || ( + object?.constructor?.name === 'Error' || + object?.constructor?.name === 'DOMException' + ) +} - const assert = __nccwpck_require__(9491) - const { - ResponseStatusCodeError - } = __nccwpck_require__(8045) - const { toUSVString } = __nccwpck_require__(3983) +// Check whether |statusText| is a ByteString and +// matches the Reason-Phrase token production. +// RFC 2616: https://tools.ietf.org/html/rfc2616 +// RFC 7230: https://tools.ietf.org/html/rfc7230 +// "reason-phrase = *( HTAB / SP / VCHAR / obs-text )" +// https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116 +function isValidReasonPhrase (statusText) { + for (let i = 0; i < statusText.length; ++i) { + const c = statusText.charCodeAt(i) + if ( + !( + ( + c === 0x09 || // HTAB + (c >= 0x20 && c <= 0x7e) || // SP / VCHAR + (c >= 0x80 && c <= 0xff) + ) // obs-text + ) + ) { + return false + } + } + return true +} - async function getResolveErrorBodyCallback({ callback, body, contentType, statusCode, statusMessage, headers }) { - assert(body) +/** + * @see https://tools.ietf.org/html/rfc7230#section-3.2.6 + * @param {number} c + */ +function isTokenCharCode (c) { + switch (c) { + case 0x22: + case 0x28: + case 0x29: + case 0x2c: + case 0x2f: + case 0x3a: + case 0x3b: + case 0x3c: + case 0x3d: + case 0x3e: + case 0x3f: + case 0x40: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x7b: + case 0x7d: + // DQUOTE and "(),/:;<=>?@[\]{}" + return false + default: + // VCHAR %x21-7E + return c >= 0x21 && c <= 0x7e + } +} - let chunks = [] - let limit = 0 +/** + * @param {string} characters + */ +function isValidHTTPToken (characters) { + if (characters.length === 0) { + return false + } + for (let i = 0; i < characters.length; ++i) { + if (!isTokenCharCode(characters.charCodeAt(i))) { + return false + } + } + return true +} - for await (const chunk of body) { - chunks.push(chunk) - limit += chunk.length - if (limit > 128 * 1024) { - chunks = null - break - } - } +/** + * @see https://fetch.spec.whatwg.org/#header-name + * @param {string} potentialValue + */ +function isValidHeaderName (potentialValue) { + return isValidHTTPToken(potentialValue) +} - if (statusCode === 204 || !contentType || !chunks) { - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers)) - return - } +/** + * @see https://fetch.spec.whatwg.org/#header-value + * @param {string} potentialValue + */ +function isValidHeaderValue (potentialValue) { + // - Has no leading or trailing HTTP tab or space bytes. + // - Contains no 0x00 (NUL) or HTTP newline bytes. + if ( + potentialValue.startsWith('\t') || + potentialValue.startsWith(' ') || + potentialValue.endsWith('\t') || + potentialValue.endsWith(' ') + ) { + return false + } + + if ( + potentialValue.includes('\0') || + potentialValue.includes('\r') || + potentialValue.includes('\n') + ) { + return false + } + + return true +} - try { - if (contentType.startsWith('application/json')) { - const payload = JSON.parse(toUSVString(Buffer.concat(chunks))) - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload)) - return - } +// https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect +function setRequestReferrerPolicyOnRedirect (request, actualResponse) { + // Given a request request and a response actualResponse, this algorithm + // updates request’s referrer policy according to the Referrer-Policy + // header (if any) in actualResponse. + + // 1. Let policy be the result of executing § 8.1 Parse a referrer policy + // from a Referrer-Policy header on actualResponse. + + // 8.1 Parse a referrer policy from a Referrer-Policy header + // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list. + const { headersList } = actualResponse + // 2. Let policy be the empty string. + // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token. + // 4. Return policy. + const policyHeader = (headersList.get('referrer-policy') ?? '').split(',') + + // Note: As the referrer-policy can contain multiple policies + // separated by comma, we need to loop through all of them + // and pick the first valid one. + // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy + let policy = '' + if (policyHeader.length > 0) { + // The right-most policy takes precedence. + // The left-most policy is the fallback. + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim() + if (referrerPolicyTokens.has(token)) { + policy = token + break + } + } + } + + // 2. If policy is not the empty string, then set request’s referrer policy to policy. + if (policy !== '') { + request.referrerPolicy = policy + } +} - if (contentType.startsWith('text/')) { - const payload = toUSVString(Buffer.concat(chunks)) - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers, payload)) - return - } - } catch (err) { - // Process in a fallback if error - } +// https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check +function crossOriginResourcePolicyCheck () { + // TODO + return 'allowed' +} - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ''}`, statusCode, headers)) - } +// https://fetch.spec.whatwg.org/#concept-cors-check +function corsCheck () { + // TODO + return 'success' +} - module.exports = { getResolveErrorBodyCallback } +// https://fetch.spec.whatwg.org/#concept-tao-check +function TAOCheck () { + // TODO + return 'success' +} +function appendFetchMetadata (httpRequest) { + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header + // TODO - /***/ -}), + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header -/***/ 7931: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + // 1. Assert: r’s url is a potentially trustworthy URL. + // TODO - "use strict"; - - - const { - BalancedPoolMissingUpstreamError, - InvalidArgumentError - } = __nccwpck_require__(8045) - const { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - } = __nccwpck_require__(3198) - const Pool = __nccwpck_require__(4634) - const { kUrl, kInterceptors } = __nccwpck_require__(2785) - const { parseOrigin } = __nccwpck_require__(3983) - const kFactory = Symbol('factory') - - const kOptions = Symbol('options') - const kGreatestCommonDivisor = Symbol('kGreatestCommonDivisor') - const kCurrentWeight = Symbol('kCurrentWeight') - const kIndex = Symbol('kIndex') - const kWeight = Symbol('kWeight') - const kMaxWeightPerServer = Symbol('kMaxWeightPerServer') - const kErrorPenalty = Symbol('kErrorPenalty') - - function getGreatestCommonDivisor(a, b) { - if (b === 0) return a - return getGreatestCommonDivisor(b, a % b) - } + // 2. Let header be a Structured Header whose value is a token. + let header = null - function defaultFactory(origin, opts) { - return new Pool(origin, opts) - } + // 3. Set header’s value to r’s mode. + header = httpRequest.mode - class BalancedPool extends PoolBase { - constructor(upstreams = [], { factory = defaultFactory, ...opts } = {}) { - super() + // 4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list. + httpRequest.headersList.set('sec-fetch-mode', header) - this[kOptions] = opts - this[kIndex] = -1 - this[kCurrentWeight] = 0 + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header + // TODO - this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100 - this[kErrorPenalty] = this[kOptions].errorPenalty || 15 + // https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header + // TODO +} - if (!Array.isArray(upstreams)) { - upstreams = [upstreams] - } +// https://fetch.spec.whatwg.org/#append-a-request-origin-header +function appendRequestOriginHeader (request) { + // 1. Let serializedOrigin be the result of byte-serializing a request origin with request. + let serializedOrigin = request.origin + + // 2. If request’s response tainting is "cors" or request’s mode is "websocket", then append (`Origin`, serializedOrigin) to request’s header list. + if (request.responseTainting === 'cors' || request.mode === 'websocket') { + if (serializedOrigin) { + request.headersList.append('origin', serializedOrigin) + } + + // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then: + } else if (request.method !== 'GET' && request.method !== 'HEAD') { + // 1. Switch on request’s referrer policy: + switch (request.referrerPolicy) { + case 'no-referrer': + // Set serializedOrigin to `null`. + serializedOrigin = null + break + case 'no-referrer-when-downgrade': + case 'strict-origin': + case 'strict-origin-when-cross-origin': + // If request’s origin is a tuple origin, its scheme is "https", and request’s current URL’s scheme is not "https", then set serializedOrigin to `null`. + if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { + serializedOrigin = null + } + break + case 'same-origin': + // If request’s origin is not same origin with request’s current URL’s origin, then set serializedOrigin to `null`. + if (!sameOrigin(request, requestCurrentURL(request))) { + serializedOrigin = null + } + break + default: + // Do nothing. + } + + if (serializedOrigin) { + // 2. Append (`Origin`, serializedOrigin) to request’s header list. + request.headersList.append('origin', serializedOrigin) + } + } +} - if (typeof factory !== 'function') { - throw new InvalidArgumentError('factory must be a function.') - } +function coarsenedSharedCurrentTime (crossOriginIsolatedCapability) { + // TODO + return performance.now() +} - this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) - ? opts.interceptors.BalancedPool - : [] - this[kFactory] = factory +// https://fetch.spec.whatwg.org/#create-an-opaque-timing-info +function createOpaqueTimingInfo (timingInfo) { + return { + startTime: timingInfo.startTime ?? 0, + redirectStartTime: 0, + redirectEndTime: 0, + postRedirectStartTime: timingInfo.startTime ?? 0, + finalServiceWorkerStartTime: 0, + finalNetworkResponseStartTime: 0, + finalNetworkRequestStartTime: 0, + endTime: 0, + encodedBodySize: 0, + decodedBodySize: 0, + finalConnectionTimingInfo: null + } +} - for (const upstream of upstreams) { - this.addUpstream(upstream) - } - this._updateBalancedPoolStats() - } +// https://html.spec.whatwg.org/multipage/origin.html#policy-container +function makePolicyContainer () { + // Note: the fetch spec doesn't make use of embedder policy or CSP list + return { + referrerPolicy: 'strict-origin-when-cross-origin' + } +} - addUpstream(upstream) { - const upstreamOrigin = parseOrigin(upstream).origin +// https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container +function clonePolicyContainer (policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + } +} - if (this[kClients].find((pool) => ( - pool[kUrl].origin === upstreamOrigin && - pool.closed !== true && - pool.destroyed !== true - ))) { - return this - } - const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])) - - this[kAddClient](pool) - pool.on('connect', () => { - pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]) - }) - - pool.on('connectionError', () => { - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]) - this._updateBalancedPoolStats() - }) - - pool.on('disconnect', (...args) => { - const err = args[2] - if (err && err.code === 'UND_ERR_SOCKET') { - // decrease the weight of the pool. - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]) - this._updateBalancedPoolStats() - } - }) +// https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer +function determineRequestsReferrer (request) { + // 1. Let policy be request's referrer policy. + const policy = request.referrerPolicy + + // Note: policy cannot (shouldn't) be null or an empty string. + assert(policy) + + // 2. Let environment be request’s client. + + let referrerSource = null + + // 3. Switch on request’s referrer: + if (request.referrer === 'client') { + // Note: node isn't a browser and doesn't implement document/iframes, + // so we bypass this step and replace it with our own. + + const globalOrigin = getGlobalOrigin() + + if (!globalOrigin || globalOrigin.origin === 'null') { + return 'no-referrer' + } + + // note: we need to clone it as it's mutated + referrerSource = new URL(globalOrigin) + } else if (request.referrer instanceof URL) { + // Let referrerSource be request’s referrer. + referrerSource = request.referrer + } + + // 4. Let request’s referrerURL be the result of stripping referrerSource for + // use as a referrer. + let referrerURL = stripURLForReferrer(referrerSource) + + // 5. Let referrerOrigin be the result of stripping referrerSource for use as + // a referrer, with the origin-only flag set to true. + const referrerOrigin = stripURLForReferrer(referrerSource, true) + + // 6. If the result of serializing referrerURL is a string whose length is + // greater than 4096, set referrerURL to referrerOrigin. + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin + } + + const areSameOrigin = sameOrigin(request, referrerURL) + const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && + !isURLPotentiallyTrustworthy(request.url) + + // 8. Execute the switch statements corresponding to the value of policy: + switch (policy) { + case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true) + case 'unsafe-url': return referrerURL + case 'same-origin': + return areSameOrigin ? referrerOrigin : 'no-referrer' + case 'origin-when-cross-origin': + return areSameOrigin ? referrerURL : referrerOrigin + case 'strict-origin-when-cross-origin': { + const currentURL = requestCurrentURL(request) + + // 1. If the origin of referrerURL and the origin of request’s current + // URL are the same, then return referrerURL. + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL + } + + // 2. If referrerURL is a potentially trustworthy URL and request’s + // current URL is not a potentially trustworthy URL, then return no + // referrer. + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return 'no-referrer' + } + + // 3. Return referrerOrigin. + return referrerOrigin + } + case 'strict-origin': // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + case 'no-referrer-when-downgrade': // eslint-disable-line + /** + * 1. If referrerURL is a potentially trustworthy URL and + * request’s current URL is not a potentially trustworthy URL, + * then return no referrer. + * 2. Return referrerOrigin + */ + + default: // eslint-disable-line + return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin + } +} - for (const client of this[kClients]) { - client[kWeight] = this[kMaxWeightPerServer] - } +/** + * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url + * @param {URL} url + * @param {boolean|undefined} originOnly + */ +function stripURLForReferrer (url, originOnly) { + // 1. Assert: url is a URL. + assert(url instanceof URL) - this._updateBalancedPoolStats() + // 2. If url’s scheme is a local scheme, then return no referrer. + if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') { + return 'no-referrer' + } - return this - } + // 3. Set url’s username to the empty string. + url.username = '' - _updateBalancedPoolStats() { - this[kGreatestCommonDivisor] = this[kClients].map(p => p[kWeight]).reduce(getGreatestCommonDivisor, 0) - } + // 4. Set url’s password to the empty string. + url.password = '' - removeUpstream(upstream) { - const upstreamOrigin = parseOrigin(upstream).origin + // 5. Set url’s fragment to null. + url.hash = '' - const pool = this[kClients].find((pool) => ( - pool[kUrl].origin === upstreamOrigin && - pool.closed !== true && - pool.destroyed !== true - )) + // 6. If the origin-only flag is true, then: + if (originOnly) { + // 1. Set url’s path to « the empty string ». + url.pathname = '' - if (pool) { - this[kRemoveClient](pool) - } + // 2. Set url’s query to null. + url.search = '' + } - return this - } + // 7. Return url. + return url +} - get upstreams() { - return this[kClients] - .filter(dispatcher => dispatcher.closed !== true && dispatcher.destroyed !== true) - .map((p) => p[kUrl].origin) - } +function isURLPotentiallyTrustworthy (url) { + if (!(url instanceof URL)) { + return false + } - [kGetDispatcher]() { - // We validate that pools is greater than 0, - // otherwise we would have to wait until an upstream - // is added, which might never happen. - if (this[kClients].length === 0) { - throw new BalancedPoolMissingUpstreamError() - } + // If child of about, return true + if (url.href === 'about:blank' || url.href === 'about:srcdoc') { + return true + } - const dispatcher = this[kClients].find(dispatcher => ( - !dispatcher[kNeedDrain] && - dispatcher.closed !== true && - dispatcher.destroyed !== true - )) + // If scheme is data, return true + if (url.protocol === 'data:') return true - if (!dispatcher) { - return - } + // If file, return true + if (url.protocol === 'file:') return true - const allClientsBusy = this[kClients].map(pool => pool[kNeedDrain]).reduce((a, b) => a && b, true) + return isOriginPotentiallyTrustworthy(url.origin) - if (allClientsBusy) { - return - } + function isOriginPotentiallyTrustworthy (origin) { + // If origin is explicitly null, return false + if (origin == null || origin === 'null') return false - let counter = 0 + const originAsURL = new URL(origin) - let maxWeightIndex = this[kClients].findIndex(pool => !pool[kNeedDrain]) + // If secure, return true + if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') { + return true + } - while (counter++ < this[kClients].length) { - this[kIndex] = (this[kIndex] + 1) % this[kClients].length - const pool = this[kClients][this[kIndex]] + // If localhost or variants, return true + if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || + (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) || + (originAsURL.hostname.endsWith('.localhost'))) { + return true + } - // find pool index with the largest weight - if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { - maxWeightIndex = this[kIndex] - } + // If any other, return false + return false + } +} - // decrease the current weight every `this[kClients].length`. - if (this[kIndex] === 0) { - // Set the current weight to the next lower weight. - this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor] +/** + * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist + * @param {Uint8Array} bytes + * @param {string} metadataList + */ +function bytesMatch (bytes, metadataList) { + // If node is not built with OpenSSL support, we cannot check + // a request's integrity, so allow it by default (the spec will + // allow requests if an invalid hash is given, as precedence). + /* istanbul ignore if: only if node is built with --without-ssl */ + if (crypto === undefined) { + return true + } + + // 1. Let parsedMetadata be the result of parsing metadataList. + const parsedMetadata = parseMetadata(metadataList) + + // 2. If parsedMetadata is no metadata, return true. + if (parsedMetadata === 'no metadata') { + return true + } + + // 3. If response is not eligible for integrity validation, return false. + // TODO + + // 4. If parsedMetadata is the empty set, return true. + if (parsedMetadata.length === 0) { + return true + } + + // 5. Let metadata be the result of getting the strongest + // metadata from parsedMetadata. + const strongest = getStrongestMetadata(parsedMetadata) + const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest) + + // 6. For each item in metadata: + for (const item of metadata) { + // 1. Let algorithm be the alg component of item. + const algorithm = item.algo + + // 2. Let expectedValue be the val component of item. + const expectedValue = item.hash + + // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e + // "be liberal with padding". This is annoying, and it's not even in the spec. + + // 3. Let actualValue be the result of applying algorithm to bytes. + let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64') + + if (actualValue[actualValue.length - 1] === '=') { + if (actualValue[actualValue.length - 2] === '=') { + actualValue = actualValue.slice(0, -2) + } else { + actualValue = actualValue.slice(0, -1) + } + } + + // 4. If actualValue is a case-sensitive match for expectedValue, + // return true. + if (compareBase64Mixed(actualValue, expectedValue)) { + return true + } + } + + // 7. Return false. + return false +} - if (this[kCurrentWeight] <= 0) { - this[kCurrentWeight] = this[kMaxWeightPerServer] - } - } - if (pool[kWeight] >= this[kCurrentWeight] && (!pool[kNeedDrain])) { - return pool - } - } +// https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options +// https://www.w3.org/TR/CSP2/#source-list-syntax +// https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1 +const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i + +/** + * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata + * @param {string} metadata + */ +function parseMetadata (metadata) { + // 1. Let result be the empty set. + /** @type {{ algo: string, hash: string }[]} */ + const result = [] + + // 2. Let empty be equal to true. + let empty = true + + // 3. For each token returned by splitting metadata on spaces: + for (const token of metadata.split(' ')) { + // 1. Set empty to false. + empty = false + + // 2. Parse token as a hash-with-options. + const parsedToken = parseHashWithOptions.exec(token) + + // 3. If token does not parse, continue to the next token. + if ( + parsedToken === null || + parsedToken.groups === undefined || + parsedToken.groups.algo === undefined + ) { + // Note: Chromium blocks the request at this point, but Firefox + // gives a warning that an invalid integrity was given. The + // correct behavior is to ignore these, and subsequently not + // check the integrity of the resource. + continue + } + + // 4. Let algorithm be the hash-algo component of token. + const algorithm = parsedToken.groups.algo.toLowerCase() + + // 5. If algorithm is a hash function recognized by the user + // agent, add the parsed token to result. + if (supportedHashes.includes(algorithm)) { + result.push(parsedToken.groups) + } + } + + // 4. Return no metadata if empty is true, otherwise return result. + if (empty === true) { + return 'no metadata' + } + + return result +} - this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight] - this[kIndex] = maxWeightIndex - return this[kClients][maxWeightIndex] - } - } +/** + * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList + */ +function getStrongestMetadata (metadataList) { + // Let algorithm be the algo component of the first item in metadataList. + // Can be sha256 + let algorithm = metadataList[0].algo + // If the algorithm is sha512, then it is the strongest + // and we can return immediately + if (algorithm[3] === '5') { + return algorithm + } + + for (let i = 1; i < metadataList.length; ++i) { + const metadata = metadataList[i] + // If the algorithm is sha512, then it is the strongest + // and we can break the loop immediately + if (metadata.algo[3] === '5') { + algorithm = 'sha512' + break + // If the algorithm is sha384, then a potential sha256 or sha384 is ignored + } else if (algorithm[3] === '3') { + continue + // algorithm is sha256, check if algorithm is sha384 and if so, set it as + // the strongest + } else if (metadata.algo[3] === '3') { + algorithm = 'sha384' + } + } + return algorithm +} - module.exports = BalancedPool +function filterMetadataListByAlgorithm (metadataList, algorithm) { + if (metadataList.length === 1) { + return metadataList + } + let pos = 0 + for (let i = 0; i < metadataList.length; ++i) { + if (metadataList[i].algo === algorithm) { + metadataList[pos++] = metadataList[i] + } + } - /***/ -}), + metadataList.length = pos -/***/ 6101: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + return metadataList +} - "use strict"; - - - const { kConstruct } = __nccwpck_require__(9174) - const { urlEquals, fieldValues: getFieldValues } = __nccwpck_require__(2396) - const { kEnumerableProperty, isDisturbed } = __nccwpck_require__(3983) - const { kHeadersList } = __nccwpck_require__(2785) - const { webidl } = __nccwpck_require__(1744) - const { Response, cloneResponse } = __nccwpck_require__(7823) - const { Request } = __nccwpck_require__(8359) - const { kState, kHeaders, kGuard, kRealm } = __nccwpck_require__(5861) - const { fetching } = __nccwpck_require__(4881) - const { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = __nccwpck_require__(2538) - const assert = __nccwpck_require__(9491) - const { getGlobalDispatcher } = __nccwpck_require__(1892) - - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-cache-batch-operation - * @typedef {Object} CacheBatchOperation - * @property {'delete' | 'put'} type - * @property {any} request - * @property {any} response - * @property {import('../../types/cache').CacheQueryOptions} options - */ - - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-request-response-list - * @typedef {[any, any][]} requestResponseList - */ - - class Cache { - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list - * @type {requestResponseList} - */ - #relevantRequestResponseList - - constructor() { - if (arguments[0] !== kConstruct) { - webidl.illegalConstructor() - } +/** + * Compares two base64 strings, allowing for base64url + * in the second string. + * +* @param {string} actualValue always base64 + * @param {string} expectedValue base64 or base64url + * @returns {boolean} + */ +function compareBase64Mixed (actualValue, expectedValue) { + if (actualValue.length !== expectedValue.length) { + return false + } + for (let i = 0; i < actualValue.length; ++i) { + if (actualValue[i] !== expectedValue[i]) { + if ( + (actualValue[i] === '+' && expectedValue[i] === '-') || + (actualValue[i] === '/' && expectedValue[i] === '_') + ) { + continue + } + return false + } + } + + return true +} - this.#relevantRequestResponseList = arguments[1] - } +// https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request +function tryUpgradeRequestToAPotentiallyTrustworthyURL (request) { + // TODO +} + +/** + * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin} + * @param {URL} A + * @param {URL} B + */ +function sameOrigin (A, B) { + // 1. If A and B are the same opaque origin, then return true. + if (A.origin === B.origin && A.origin === 'null') { + return true + } + + // 2. If A and B are both tuple origins and their schemes, + // hosts, and port are identical, then return true. + if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) { + return true + } + + // 3. Return false. + return false +} - async match(request, options = {}) { - webidl.brandCheck(this, Cache) - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.match' }) +function createDeferredPromise () { + let res + let rej + const promise = new Promise((resolve, reject) => { + res = resolve + rej = reject + }) - request = webidl.converters.RequestInfo(request) - options = webidl.converters.CacheQueryOptions(options) + return { promise, resolve: res, reject: rej } +} - const p = await this.matchAll(request, options) +function isAborted (fetchParams) { + return fetchParams.controller.state === 'aborted' +} - if (p.length === 0) { - return - } +function isCancelled (fetchParams) { + return fetchParams.controller.state === 'aborted' || + fetchParams.controller.state === 'terminated' +} - return p[0] - } +const normalizeMethodRecord = { + delete: 'DELETE', + DELETE: 'DELETE', + get: 'GET', + GET: 'GET', + head: 'HEAD', + HEAD: 'HEAD', + options: 'OPTIONS', + OPTIONS: 'OPTIONS', + post: 'POST', + POST: 'POST', + put: 'PUT', + PUT: 'PUT' +} - async matchAll(request = undefined, options = {}) { - webidl.brandCheck(this, Cache) +// Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. +Object.setPrototypeOf(normalizeMethodRecord, null) - if (request !== undefined) request = webidl.converters.RequestInfo(request) - options = webidl.converters.CacheQueryOptions(options) +/** + * @see https://fetch.spec.whatwg.org/#concept-method-normalize + * @param {string} method + */ +function normalizeMethod (method) { + return normalizeMethodRecord[method.toLowerCase()] ?? method +} - // 1. - let r = null +// https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string +function serializeJavascriptValueToJSONString (value) { + // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »). + const result = JSON.stringify(value) - // 2. - if (request !== undefined) { - if (request instanceof Request) { - // 2.1.1 - r = request[kState] + // 2. If result is undefined, then throw a TypeError. + if (result === undefined) { + throw new TypeError('Value is not JSON serializable') + } - // 2.1.2 - if (r.method !== 'GET' && !options.ignoreMethod) { - return [] - } - } else if (typeof request === 'string') { - // 2.2.1 - r = new Request(request)[kState] - } - } + // 3. Assert: result is a string. + assert(typeof result === 'string') - // 5. - // 5.1 - const responses = [] + // 4. Return result. + return result +} - // 5.2 - if (request === undefined) { - // 5.2.1 - for (const requestResponse of this.#relevantRequestResponseList) { - responses.push(requestResponse[1]) - } - } else { // 5.3 - // 5.3.1 - const requestResponses = this.#queryCache(r, options) +// https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object +const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())) + +/** + * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object + * @param {() => unknown[]} iterator + * @param {string} name name of the instance + * @param {'key'|'value'|'key+value'} kind + */ +function makeIterator (iterator, name, kind) { + const object = { + index: 0, + kind, + target: iterator + } + + const i = { + next () { + // 1. Let interface be the interface for which the iterator prototype object exists. + + // 2. Let thisValue be the this value. + + // 3. Let object be ? ToObject(thisValue). + + // 4. If object is a platform object, then perform a security + // check, passing: + + // 5. If object is not a default iterator object for interface, + // then throw a TypeError. + if (Object.getPrototypeOf(this) !== i) { + throw new TypeError( + `'next' called on an object that does not implement interface ${name} Iterator.` + ) + } + + // 6. Let index be object’s index. + // 7. Let kind be object’s kind. + // 8. Let values be object’s target's value pairs to iterate over. + const { index, kind, target } = object + const values = target() + + // 9. Let len be the length of values. + const len = values.length + + // 10. If index is greater than or equal to len, then return + // CreateIterResultObject(undefined, true). + if (index >= len) { + return { value: undefined, done: true } + } + + // 11. Let pair be the entry in values at index index. + const pair = values[index] + + // 12. Set object’s index to index + 1. + object.index = index + 1 + + // 13. Return the iterator result for pair and kind. + return iteratorResult(pair, kind) + }, + // The class string of an iterator prototype object for a given interface is the + // result of concatenating the identifier of the interface and the string " Iterator". + [Symbol.toStringTag]: `${name} Iterator` + } + + // The [[Prototype]] internal slot of an iterator prototype object must be %IteratorPrototype%. + Object.setPrototypeOf(i, esIteratorPrototype) + // esIteratorPrototype needs to be the prototype of i + // which is the prototype of an empty object. Yes, it's confusing. + return Object.setPrototypeOf({}, i) +} - // 5.3.2 - for (const requestResponse of requestResponses) { - responses.push(requestResponse[1]) - } - } +// https://webidl.spec.whatwg.org/#iterator-result +function iteratorResult (pair, kind) { + let result + + // 1. Let result be a value determined by the value of kind: + switch (kind) { + case 'key': { + // 1. Let idlKey be pair’s key. + // 2. Let key be the result of converting idlKey to an + // ECMAScript value. + // 3. result is key. + result = pair[0] + break + } + case 'value': { + // 1. Let idlValue be pair’s value. + // 2. Let value be the result of converting idlValue to + // an ECMAScript value. + // 3. result is value. + result = pair[1] + break + } + case 'key+value': { + // 1. Let idlKey be pair’s key. + // 2. Let idlValue be pair’s value. + // 3. Let key be the result of converting idlKey to an + // ECMAScript value. + // 4. Let value be the result of converting idlValue to + // an ECMAScript value. + // 5. Let array be ! ArrayCreate(2). + // 6. Call ! CreateDataProperty(array, "0", key). + // 7. Call ! CreateDataProperty(array, "1", value). + // 8. result is array. + result = pair + break + } + } + + // 2. Return CreateIterResultObject(result, false). + return { value: result, done: false } +} - // 5.4 - // We don't implement CORs so we don't need to loop over the responses, yay! +/** + * @see https://fetch.spec.whatwg.org/#body-fully-read + */ +async function fullyReadBody (body, processBody, processBodyError) { + // 1. If taskDestination is null, then set taskDestination to + // the result of starting a new parallel queue. + + // 2. Let successSteps given a byte sequence bytes be to queue a + // fetch task to run processBody given bytes, with taskDestination. + const successSteps = processBody + + // 3. Let errorSteps be to queue a fetch task to run processBodyError, + // with taskDestination. + const errorSteps = processBodyError + + // 4. Let reader be the result of getting a reader for body’s stream. + // If that threw an exception, then run errorSteps with that + // exception and return. + let reader + + try { + reader = body.stream.getReader() + } catch (e) { + errorSteps(e) + return + } + + // 5. Read all bytes from reader, given successSteps and errorSteps. + try { + const result = await readAllBytes(reader) + successSteps(result) + } catch (e) { + errorSteps(e) + } +} - // 5.5.1 - const responseList = [] +/** @type {ReadableStream} */ +let ReadableStream = globalThis.ReadableStream - // 5.5.2 - for (const response of responses) { - // 5.5.2.1 - const responseObject = new Response(response.body?.source ?? null) - const body = responseObject[kState].body - responseObject[kState] = response - responseObject[kState].body = body - responseObject[kHeaders][kHeadersList] = response.headersList - responseObject[kHeaders][kGuard] = 'immutable' +function isReadableStreamLike (stream) { + if (!ReadableStream) { + ReadableStream = (__nccwpck_require__(5356).ReadableStream) + } - responseList.push(responseObject) - } + return stream instanceof ReadableStream || ( + stream[Symbol.toStringTag] === 'ReadableStream' && + typeof stream.tee === 'function' + ) +} - // 6. - return Object.freeze(responseList) - } +const MAXIMUM_ARGUMENT_LENGTH = 65535 - async add(request) { - webidl.brandCheck(this, Cache) - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.add' }) +/** + * @see https://infra.spec.whatwg.org/#isomorphic-decode + * @param {number[]|Uint8Array} input + */ +function isomorphicDecode (input) { + // 1. To isomorphic decode a byte sequence input, return a string whose code point + // length is equal to input’s length and whose code points have the same values + // as the values of input’s bytes, in the same order. - request = webidl.converters.RequestInfo(request) + if (input.length < MAXIMUM_ARGUMENT_LENGTH) { + return String.fromCharCode(...input) + } - // 1. - const requests = [request] + return input.reduce((previous, current) => previous + String.fromCharCode(current), '') +} - // 2. - const responseArrayPromise = this.addAll(requests) +/** + * @param {ReadableStreamController} controller + */ +function readableStreamClose (controller) { + try { + controller.close() + } catch (err) { + // TODO: add comment explaining why this error occurs. + if (!err.message.includes('Controller is already closed')) { + throw err + } + } +} - // 3. - return await responseArrayPromise - } +/** + * @see https://infra.spec.whatwg.org/#isomorphic-encode + * @param {string} input + */ +function isomorphicEncode (input) { + // 1. Assert: input contains no code points greater than U+00FF. + for (let i = 0; i < input.length; i++) { + assert(input.charCodeAt(i) <= 0xFF) + } + + // 2. Return a byte sequence whose length is equal to input’s code + // point length and whose bytes have the same values as the + // values of input’s code points, in the same order + return input +} - async addAll(requests) { - webidl.brandCheck(this, Cache) - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.addAll' }) +/** + * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes + * @see https://streams.spec.whatwg.org/#read-loop + * @param {ReadableStreamDefaultReader} reader + */ +async function readAllBytes (reader) { + const bytes = [] + let byteLength = 0 + + while (true) { + const { done, value: chunk } = await reader.read() + + if (done) { + // 1. Call successSteps with bytes. + return Buffer.concat(bytes, byteLength) + } + + // 1. If chunk is not a Uint8Array object, call failureSteps + // with a TypeError and abort these steps. + if (!isUint8Array(chunk)) { + throw new TypeError('Received non-Uint8Array chunk') + } + + // 2. Append the bytes represented by chunk to bytes. + bytes.push(chunk) + byteLength += chunk.length + + // 3. Read-loop given reader, bytes, successSteps, and failureSteps. + } +} - requests = webidl.converters['sequence'](requests) +/** + * @see https://fetch.spec.whatwg.org/#is-local + * @param {URL} url + */ +function urlIsLocal (url) { + assert('protocol' in url) // ensure it's a url object - // 1. - const responsePromises = [] + const protocol = url.protocol - // 2. - const requestList = [] + return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:' +} - // 3. - for (const request of requests) { - if (typeof request === 'string') { - continue - } +/** + * @param {string|URL} url + */ +function urlHasHttpsScheme (url) { + if (typeof url === 'string') { + return url.startsWith('https:') + } - // 3.1 - const r = request[kState] + return url.protocol === 'https:' +} - // 3.2 - if (!urlIsHttpHttpsScheme(r.url) || r.method !== 'GET') { - throw webidl.errors.exception({ - header: 'Cache.addAll', - message: 'Expected http/s scheme when method is not GET.' - }) - } - } +/** + * @see https://fetch.spec.whatwg.org/#http-scheme + * @param {URL} url + */ +function urlIsHttpHttpsScheme (url) { + assert('protocol' in url) // ensure it's a url object - // 4. - /** @type {ReturnType[]} */ - const fetchControllers = [] - - // 5. - for (const request of requests) { - // 5.1 - const r = new Request(request)[kState] - - // 5.2 - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: 'Cache.addAll', - message: 'Expected http/s scheme.' - }) - } + const protocol = url.protocol - // 5.4 - r.initiator = 'fetch' - r.destination = 'subresource' - - // 5.5 - requestList.push(r) - - // 5.6 - const responsePromise = createDeferredPromise() - - // 5.7 - fetchControllers.push(fetching({ - request: r, - dispatcher: getGlobalDispatcher(), - processResponse(response) { - // 1. - if (response.type === 'error' || response.status === 206 || response.status < 200 || response.status > 299) { - responsePromise.reject(webidl.errors.exception({ - header: 'Cache.addAll', - message: 'Received an invalid status code or the request failed.' - })) - } else if (response.headersList.contains('vary')) { // 2. - // 2.1 - const fieldValues = getFieldValues(response.headersList.get('vary')) - - // 2.2 - for (const fieldValue of fieldValues) { - // 2.2.1 - if (fieldValue === '*') { - responsePromise.reject(webidl.errors.exception({ - header: 'Cache.addAll', - message: 'invalid vary field value' - })) - - for (const controller of fetchControllers) { - controller.abort() - } - - return - } - } - } - }, - processResponseEndOfBody(response) { - // 1. - if (response.aborted) { - responsePromise.reject(new DOMException('aborted', 'AbortError')) - return - } - - // 2. - responsePromise.resolve(response) - } - })) + return protocol === 'http:' || protocol === 'https:' +} - // 5.8 - responsePromises.push(responsePromise.promise) - } +/** + * Fetch supports node >= 16.8.0, but Object.hasOwn was added in v16.9.0. + */ +const hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)) + +module.exports = { + isAborted, + isCancelled, + createDeferredPromise, + ReadableStreamFrom, + toUSVString, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + coarsenedSharedCurrentTime, + determineRequestsReferrer, + makePolicyContainer, + clonePolicyContainer, + appendFetchMetadata, + appendRequestOriginHeader, + TAOCheck, + corsCheck, + crossOriginResourcePolicyCheck, + createOpaqueTimingInfo, + setRequestReferrerPolicyOnRedirect, + isValidHTTPToken, + requestBadPort, + requestCurrentURL, + responseURL, + responseLocationURL, + isBlobLike, + isURLPotentiallyTrustworthy, + isValidReasonPhrase, + sameOrigin, + normalizeMethod, + serializeJavascriptValueToJSONString, + makeIterator, + isValidHeaderName, + isValidHeaderValue, + hasOwn, + isErrorLike, + fullyReadBody, + bytesMatch, + isReadableStreamLike, + readableStreamClose, + isomorphicEncode, + isomorphicDecode, + urlIsLocal, + urlHasHttpsScheme, + urlIsHttpHttpsScheme, + readAllBytes, + normalizeMethodRecord, + parseMetadata +} - // 6. - const p = Promise.all(responsePromises) - // 7. - const responses = await p +/***/ }), - // 7.1 - const operations = [] +/***/ 1744: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 7.2 - let index = 0 +"use strict"; - // 7.3 - for (const response of responses) { - // 7.3.1 - /** @type {CacheBatchOperation} */ - const operation = { - type: 'put', // 7.3.2 - request: requestList[index], // 7.3.3 - response // 7.3.4 - } - operations.push(operation) // 7.3.5 +const { types } = __nccwpck_require__(3837) +const { hasOwn, toUSVString } = __nccwpck_require__(2538) - index++ // 7.3.6 - } +/** @type {import('../../types/webidl').Webidl} */ +const webidl = {} +webidl.converters = {} +webidl.util = {} +webidl.errors = {} - // 7.5 - const cacheJobPromise = createDeferredPromise() +webidl.errors.exception = function (message) { + return new TypeError(`${message.header}: ${message.message}`) +} - // 7.6.1 - let errorData = null +webidl.errors.conversionFailed = function (context) { + const plural = context.types.length === 1 ? '' : ' one of' + const message = + `${context.argument} could not be converted to` + + `${plural}: ${context.types.join(', ')}.` - // 7.6.2 - try { - this.#batchCacheOperations(operations) - } catch (e) { - errorData = e - } + return webidl.errors.exception({ + header: context.prefix, + message + }) +} - // 7.6.3 - queueMicrotask(() => { - // 7.6.3.1 - if (errorData === null) { - cacheJobPromise.resolve(undefined) - } else { - // 7.6.3.2 - cacheJobPromise.reject(errorData) - } - }) +webidl.errors.invalidArgument = function (context) { + return webidl.errors.exception({ + header: context.prefix, + message: `"${context.value}" is an invalid ${context.type}.` + }) +} - // 7.7 - return cacheJobPromise.promise - } +// https://webidl.spec.whatwg.org/#implements +webidl.brandCheck = function (V, I, opts = undefined) { + if (opts?.strict !== false && !(V instanceof I)) { + throw new TypeError('Illegal invocation') + } else { + return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag] + } +} - async put(request, response) { - webidl.brandCheck(this, Cache) - webidl.argumentLengthCheck(arguments, 2, { header: 'Cache.put' }) +webidl.argumentLengthCheck = function ({ length }, min, ctx) { + if (length < min) { + throw webidl.errors.exception({ + message: `${min} argument${min !== 1 ? 's' : ''} required, ` + + `but${length ? ' only' : ''} ${length} found.`, + ...ctx + }) + } +} - request = webidl.converters.RequestInfo(request) - response = webidl.converters.Response(response) +webidl.illegalConstructor = function () { + throw webidl.errors.exception({ + header: 'TypeError', + message: 'Illegal constructor' + }) +} - // 1. - let innerRequest = null +// https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values +webidl.util.Type = function (V) { + switch (typeof V) { + case 'undefined': return 'Undefined' + case 'boolean': return 'Boolean' + case 'string': return 'String' + case 'symbol': return 'Symbol' + case 'number': return 'Number' + case 'bigint': return 'BigInt' + case 'function': + case 'object': { + if (V === null) { + return 'Null' + } + + return 'Object' + } + } +} - // 2. - if (request instanceof Request) { - innerRequest = request[kState] - } else { // 3. - innerRequest = new Request(request)[kState] - } +// https://webidl.spec.whatwg.org/#abstract-opdef-converttoint +webidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) { + let upperBound + let lowerBound + + // 1. If bitLength is 64, then: + if (bitLength === 64) { + // 1. Let upperBound be 2^53 − 1. + upperBound = Math.pow(2, 53) - 1 + + // 2. If signedness is "unsigned", then let lowerBound be 0. + if (signedness === 'unsigned') { + lowerBound = 0 + } else { + // 3. Otherwise let lowerBound be −2^53 + 1. + lowerBound = Math.pow(-2, 53) + 1 + } + } else if (signedness === 'unsigned') { + // 2. Otherwise, if signedness is "unsigned", then: + + // 1. Let lowerBound be 0. + lowerBound = 0 + + // 2. Let upperBound be 2^bitLength − 1. + upperBound = Math.pow(2, bitLength) - 1 + } else { + // 3. Otherwise: + + // 1. Let lowerBound be -2^bitLength − 1. + lowerBound = Math.pow(-2, bitLength) - 1 + + // 2. Let upperBound be 2^bitLength − 1 − 1. + upperBound = Math.pow(2, bitLength - 1) - 1 + } + + // 4. Let x be ? ToNumber(V). + let x = Number(V) + + // 5. If x is −0, then set x to +0. + if (x === 0) { + x = 0 + } + + // 6. If the conversion is to an IDL type associated + // with the [EnforceRange] extended attribute, then: + if (opts.enforceRange === true) { + // 1. If x is NaN, +∞, or −∞, then throw a TypeError. + if ( + Number.isNaN(x) || + x === Number.POSITIVE_INFINITY || + x === Number.NEGATIVE_INFINITY + ) { + throw webidl.errors.exception({ + header: 'Integer conversion', + message: `Could not convert ${V} to an integer.` + }) + } + + // 2. Set x to IntegerPart(x). + x = webidl.util.IntegerPart(x) + + // 3. If x < lowerBound or x > upperBound, then + // throw a TypeError. + if (x < lowerBound || x > upperBound) { + throw webidl.errors.exception({ + header: 'Integer conversion', + message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` + }) + } + + // 4. Return x. + return x + } + + // 7. If x is not NaN and the conversion is to an IDL + // type associated with the [Clamp] extended + // attribute, then: + if (!Number.isNaN(x) && opts.clamp === true) { + // 1. Set x to min(max(x, lowerBound), upperBound). + x = Math.min(Math.max(x, lowerBound), upperBound) + + // 2. Round x to the nearest integer, choosing the + // even integer if it lies halfway between two, + // and choosing +0 rather than −0. + if (Math.floor(x) % 2 === 0) { + x = Math.floor(x) + } else { + x = Math.ceil(x) + } + + // 3. Return x. + return x + } + + // 8. If x is NaN, +0, +∞, or −∞, then return +0. + if ( + Number.isNaN(x) || + (x === 0 && Object.is(0, x)) || + x === Number.POSITIVE_INFINITY || + x === Number.NEGATIVE_INFINITY + ) { + return 0 + } + + // 9. Set x to IntegerPart(x). + x = webidl.util.IntegerPart(x) + + // 10. Set x to x modulo 2^bitLength. + x = x % Math.pow(2, bitLength) + + // 11. If signedness is "signed" and x ≥ 2^bitLength − 1, + // then return x − 2^bitLength. + if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) { + return x - Math.pow(2, bitLength) + } + + // 12. Otherwise, return x. + return x +} - // 4. - if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== 'GET') { - throw webidl.errors.exception({ - header: 'Cache.put', - message: 'Expected an http/s scheme when method is not GET' - }) - } +// https://webidl.spec.whatwg.org/#abstract-opdef-integerpart +webidl.util.IntegerPart = function (n) { + // 1. Let r be floor(abs(n)). + const r = Math.floor(Math.abs(n)) - // 5. - const innerResponse = response[kState] + // 2. If n < 0, then return -1 × r. + if (n < 0) { + return -1 * r + } - // 6. - if (innerResponse.status === 206) { - throw webidl.errors.exception({ - header: 'Cache.put', - message: 'Got 206 status' - }) - } + // 3. Otherwise, return r. + return r +} - // 7. - if (innerResponse.headersList.contains('vary')) { - // 7.1. - const fieldValues = getFieldValues(innerResponse.headersList.get('vary')) - - // 7.2. - for (const fieldValue of fieldValues) { - // 7.2.1 - if (fieldValue === '*') { - throw webidl.errors.exception({ - header: 'Cache.put', - message: 'Got * vary field value' - }) - } - } - } +// https://webidl.spec.whatwg.org/#es-sequence +webidl.sequenceConverter = function (converter) { + return (V) => { + // 1. If Type(V) is not Object, throw a TypeError. + if (webidl.util.Type(V) !== 'Object') { + throw webidl.errors.exception({ + header: 'Sequence', + message: `Value of type ${webidl.util.Type(V)} is not an Object.` + }) + } + + // 2. Let method be ? GetMethod(V, @@iterator). + /** @type {Generator} */ + const method = V?.[Symbol.iterator]?.() + const seq = [] + + // 3. If method is undefined, throw a TypeError. + if ( + method === undefined || + typeof method.next !== 'function' + ) { + throw webidl.errors.exception({ + header: 'Sequence', + message: 'Object is not an iterator.' + }) + } + + // https://webidl.spec.whatwg.org/#create-sequence-from-iterable + while (true) { + const { done, value } = method.next() + + if (done) { + break + } + + seq.push(converter(value)) + } + + return seq + } +} - // 8. - if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { - throw webidl.errors.exception({ - header: 'Cache.put', - message: 'Response body is locked or disturbed' - }) - } +// https://webidl.spec.whatwg.org/#es-to-record +webidl.recordConverter = function (keyConverter, valueConverter) { + return (O) => { + // 1. If Type(O) is not Object, throw a TypeError. + if (webidl.util.Type(O) !== 'Object') { + throw webidl.errors.exception({ + header: 'Record', + message: `Value of type ${webidl.util.Type(O)} is not an Object.` + }) + } + + // 2. Let result be a new empty instance of record. + const result = {} + + if (!types.isProxy(O)) { + // Object.keys only returns enumerable properties + const keys = Object.keys(O) + + for (const key of keys) { + // 1. Let typedKey be key converted to an IDL value of type K. + const typedKey = keyConverter(key) + + // 2. Let value be ? Get(O, key). + // 3. Let typedValue be value converted to an IDL value of type V. + const typedValue = valueConverter(O[key]) + + // 4. Set result[typedKey] to typedValue. + result[typedKey] = typedValue + } + + // 5. Return result. + return result + } + + // 3. Let keys be ? O.[[OwnPropertyKeys]](). + const keys = Reflect.ownKeys(O) + + // 4. For each key of keys. + for (const key of keys) { + // 1. Let desc be ? O.[[GetOwnProperty]](key). + const desc = Reflect.getOwnPropertyDescriptor(O, key) + + // 2. If desc is not undefined and desc.[[Enumerable]] is true: + if (desc?.enumerable) { + // 1. Let typedKey be key converted to an IDL value of type K. + const typedKey = keyConverter(key) + + // 2. Let value be ? Get(O, key). + // 3. Let typedValue be value converted to an IDL value of type V. + const typedValue = valueConverter(O[key]) + + // 4. Set result[typedKey] to typedValue. + result[typedKey] = typedValue + } + } + + // 5. Return result. + return result + } +} - // 9. - const clonedResponse = cloneResponse(innerResponse) +webidl.interfaceConverter = function (i) { + return (V, opts = {}) => { + if (opts.strict !== false && !(V instanceof i)) { + throw webidl.errors.exception({ + header: i.name, + message: `Expected ${V} to be an instance of ${i.name}.` + }) + } + + return V + } +} - // 10. - const bodyReadPromise = createDeferredPromise() +webidl.dictionaryConverter = function (converters) { + return (dictionary) => { + const type = webidl.util.Type(dictionary) + const dict = {} + + if (type === 'Null' || type === 'Undefined') { + return dict + } else if (type !== 'Object') { + throw webidl.errors.exception({ + header: 'Dictionary', + message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` + }) + } + + for (const options of converters) { + const { key, defaultValue, required, converter } = options + + if (required === true) { + if (!hasOwn(dictionary, key)) { + throw webidl.errors.exception({ + header: 'Dictionary', + message: `Missing required key "${key}".` + }) + } + } + + let value = dictionary[key] + const hasDefault = hasOwn(options, 'defaultValue') + + // Only use defaultValue if value is undefined and + // a defaultValue options was provided. + if (hasDefault && value !== null) { + value = value ?? defaultValue + } + + // A key can be optional and have no default value. + // When this happens, do not perform a conversion, + // and do not assign the key a value. + if (required || hasDefault || value !== undefined) { + value = converter(value) + + if ( + options.allowedValues && + !options.allowedValues.includes(value) + ) { + throw webidl.errors.exception({ + header: 'Dictionary', + message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.` + }) + } + + dict[key] = value + } + } + + return dict + } +} - // 11. - if (innerResponse.body != null) { - // 11.1 - const stream = innerResponse.body.stream +webidl.nullableConverter = function (converter) { + return (V) => { + if (V === null) { + return V + } - // 11.2 - const reader = stream.getReader() + return converter(V) + } +} - // 11.3 - readAllBytes(reader).then(bodyReadPromise.resolve, bodyReadPromise.reject) - } else { - bodyReadPromise.resolve(undefined) - } +// https://webidl.spec.whatwg.org/#es-DOMString +webidl.converters.DOMString = function (V, opts = {}) { + // 1. If V is null and the conversion is to an IDL type + // associated with the [LegacyNullToEmptyString] + // extended attribute, then return the DOMString value + // that represents the empty string. + if (V === null && opts.legacyNullToEmptyString) { + return '' + } + + // 2. Let x be ? ToString(V). + if (typeof V === 'symbol') { + throw new TypeError('Could not convert argument of type symbol to string.') + } + + // 3. Return the IDL DOMString value that represents the + // same sequence of code units as the one the + // ECMAScript String value x represents. + return String(V) +} - // 12. - /** @type {CacheBatchOperation[]} */ - const operations = [] +// https://webidl.spec.whatwg.org/#es-ByteString +webidl.converters.ByteString = function (V) { + // 1. Let x be ? ToString(V). + // Note: DOMString converter perform ? ToString(V) + const x = webidl.converters.DOMString(V) + + // 2. If the value of any element of x is greater than + // 255, then throw a TypeError. + for (let index = 0; index < x.length; index++) { + if (x.charCodeAt(index) > 255) { + throw new TypeError( + 'Cannot convert argument to a ByteString because the character at ' + + `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.` + ) + } + } + + // 3. Return an IDL ByteString value whose length is the + // length of x, and where the value of each element is + // the value of the corresponding element of x. + return x +} - // 13. - /** @type {CacheBatchOperation} */ - const operation = { - type: 'put', // 14. - request: innerRequest, // 15. - response: clonedResponse // 16. - } +// https://webidl.spec.whatwg.org/#es-USVString +webidl.converters.USVString = toUSVString - // 17. - operations.push(operation) +// https://webidl.spec.whatwg.org/#es-boolean +webidl.converters.boolean = function (V) { + // 1. Let x be the result of computing ToBoolean(V). + const x = Boolean(V) - // 19. - const bytes = await bodyReadPromise.promise + // 2. Return the IDL boolean value that is the one that represents + // the same truth value as the ECMAScript Boolean value x. + return x +} - if (clonedResponse.body != null) { - clonedResponse.body.source = bytes - } +// https://webidl.spec.whatwg.org/#es-any +webidl.converters.any = function (V) { + return V +} - // 19.1 - const cacheJobPromise = createDeferredPromise() +// https://webidl.spec.whatwg.org/#es-long-long +webidl.converters['long long'] = function (V) { + // 1. Let x be ? ConvertToInt(V, 64, "signed"). + const x = webidl.util.ConvertToInt(V, 64, 'signed') - // 19.2.1 - let errorData = null + // 2. Return the IDL long long value that represents + // the same numeric value as x. + return x +} - // 19.2.2 - try { - this.#batchCacheOperations(operations) - } catch (e) { - errorData = e - } +// https://webidl.spec.whatwg.org/#es-unsigned-long-long +webidl.converters['unsigned long long'] = function (V) { + // 1. Let x be ? ConvertToInt(V, 64, "unsigned"). + const x = webidl.util.ConvertToInt(V, 64, 'unsigned') - // 19.2.3 - queueMicrotask(() => { - // 19.2.3.1 - if (errorData === null) { - cacheJobPromise.resolve() - } else { // 19.2.3.2 - cacheJobPromise.reject(errorData) - } - }) + // 2. Return the IDL unsigned long long value that + // represents the same numeric value as x. + return x +} - return cacheJobPromise.promise - } +// https://webidl.spec.whatwg.org/#es-unsigned-long +webidl.converters['unsigned long'] = function (V) { + // 1. Let x be ? ConvertToInt(V, 32, "unsigned"). + const x = webidl.util.ConvertToInt(V, 32, 'unsigned') - async delete(request, options = {}) { - webidl.brandCheck(this, Cache) - webidl.argumentLengthCheck(arguments, 1, { header: 'Cache.delete' }) + // 2. Return the IDL unsigned long value that + // represents the same numeric value as x. + return x +} - request = webidl.converters.RequestInfo(request) - options = webidl.converters.CacheQueryOptions(options) +// https://webidl.spec.whatwg.org/#es-unsigned-short +webidl.converters['unsigned short'] = function (V, opts) { + // 1. Let x be ? ConvertToInt(V, 16, "unsigned"). + const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts) - /** - * @type {Request} - */ - let r = null + // 2. Return the IDL unsigned short value that represents + // the same numeric value as x. + return x +} - if (request instanceof Request) { - r = request[kState] +// https://webidl.spec.whatwg.org/#idl-ArrayBuffer +webidl.converters.ArrayBuffer = function (V, opts = {}) { + // 1. If Type(V) is not Object, or V does not have an + // [[ArrayBufferData]] internal slot, then throw a + // TypeError. + // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances + // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances + if ( + webidl.util.Type(V) !== 'Object' || + !types.isAnyArrayBuffer(V) + ) { + throw webidl.errors.conversionFailed({ + prefix: `${V}`, + argument: `${V}`, + types: ['ArrayBuffer'] + }) + } + + // 2. If the conversion is not to an IDL type associated + // with the [AllowShared] extended attribute, and + // IsSharedArrayBuffer(V) is true, then throw a + // TypeError. + if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'SharedArrayBuffer is not allowed.' + }) + } + + // 3. If the conversion is not to an IDL type associated + // with the [AllowResizable] extended attribute, and + // IsResizableArrayBuffer(V) is true, then throw a + // TypeError. + // Note: resizable ArrayBuffers are currently a proposal. + + // 4. Return the IDL ArrayBuffer value that is a + // reference to the same object as V. + return V +} - if (r.method !== 'GET' && !options.ignoreMethod) { - return false - } - } else { - assert(typeof request === 'string') +webidl.converters.TypedArray = function (V, T, opts = {}) { + // 1. Let T be the IDL type V is being converted to. + + // 2. If Type(V) is not Object, or V does not have a + // [[TypedArrayName]] internal slot with a value + // equal to T’s name, then throw a TypeError. + if ( + webidl.util.Type(V) !== 'Object' || + !types.isTypedArray(V) || + V.constructor.name !== T.name + ) { + throw webidl.errors.conversionFailed({ + prefix: `${T.name}`, + argument: `${V}`, + types: [T.name] + }) + } + + // 3. If the conversion is not to an IDL type associated + // with the [AllowShared] extended attribute, and + // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is + // true, then throw a TypeError. + if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'SharedArrayBuffer is not allowed.' + }) + } + + // 4. If the conversion is not to an IDL type associated + // with the [AllowResizable] extended attribute, and + // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is + // true, then throw a TypeError. + // Note: resizable array buffers are currently a proposal + + // 5. Return the IDL value of type T that is a reference + // to the same object as V. + return V +} - r = new Request(request)[kState] - } +webidl.converters.DataView = function (V, opts = {}) { + // 1. If Type(V) is not Object, or V does not have a + // [[DataView]] internal slot, then throw a TypeError. + if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) { + throw webidl.errors.exception({ + header: 'DataView', + message: 'Object is not a DataView.' + }) + } + + // 2. If the conversion is not to an IDL type associated + // with the [AllowShared] extended attribute, and + // IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true, + // then throw a TypeError. + if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: 'ArrayBuffer', + message: 'SharedArrayBuffer is not allowed.' + }) + } + + // 3. If the conversion is not to an IDL type associated + // with the [AllowResizable] extended attribute, and + // IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is + // true, then throw a TypeError. + // Note: resizable ArrayBuffers are currently a proposal + + // 4. Return the IDL DataView value that is a reference + // to the same object as V. + return V +} - /** @type {CacheBatchOperation[]} */ - const operations = [] +// https://webidl.spec.whatwg.org/#BufferSource +webidl.converters.BufferSource = function (V, opts = {}) { + if (types.isAnyArrayBuffer(V)) { + return webidl.converters.ArrayBuffer(V, opts) + } - /** @type {CacheBatchOperation} */ - const operation = { - type: 'delete', - request: r, - options - } + if (types.isTypedArray(V)) { + return webidl.converters.TypedArray(V, V.constructor) + } - operations.push(operation) + if (types.isDataView(V)) { + return webidl.converters.DataView(V, opts) + } - const cacheJobPromise = createDeferredPromise() + throw new TypeError(`Could not convert ${V} to a BufferSource.`) +} - let errorData = null - let requestResponses +webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.ByteString +) - try { - requestResponses = this.#batchCacheOperations(operations) - } catch (e) { - errorData = e - } +webidl.converters['sequence>'] = webidl.sequenceConverter( + webidl.converters['sequence'] +) - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(!!requestResponses?.length) - } else { - cacheJobPromise.reject(errorData) - } - }) +webidl.converters['record'] = webidl.recordConverter( + webidl.converters.ByteString, + webidl.converters.ByteString +) - return cacheJobPromise.promise - } +module.exports = { + webidl +} - /** - * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys - * @param {any} request - * @param {import('../../types/cache').CacheQueryOptions} options - * @returns {readonly Request[]} - */ - async keys(request = undefined, options = {}) { - webidl.brandCheck(this, Cache) - - if (request !== undefined) request = webidl.converters.RequestInfo(request) - options = webidl.converters.CacheQueryOptions(options) - - // 1. - let r = null - - // 2. - if (request !== undefined) { - // 2.1 - if (request instanceof Request) { - // 2.1.1 - r = request[kState] - - // 2.1.2 - if (r.method !== 'GET' && !options.ignoreMethod) { - return [] - } - } else if (typeof request === 'string') { // 2.2 - r = new Request(request)[kState] - } - } - // 4. - const promise = createDeferredPromise() +/***/ }), - // 5. - // 5.1 - const requests = [] +/***/ 4854: +/***/ ((module) => { - // 5.2 - if (request === undefined) { - // 5.2.1 - for (const requestResponse of this.#relevantRequestResponseList) { - // 5.2.1.1 - requests.push(requestResponse[0]) - } - } else { // 5.3 - // 5.3.1 - const requestResponses = this.#queryCache(r, options) - - // 5.3.2 - for (const requestResponse of requestResponses) { - // 5.3.2.1 - requests.push(requestResponse[0]) - } - } +"use strict"; + + +/** + * @see https://encoding.spec.whatwg.org/#concept-encoding-get + * @param {string|undefined} label + */ +function getEncoding (label) { + if (!label) { + return 'failure' + } + + // 1. Remove any leading and trailing ASCII whitespace from label. + // 2. If label is an ASCII case-insensitive match for any of the + // labels listed in the table below, then return the + // corresponding encoding; otherwise return failure. + switch (label.trim().toLowerCase()) { + case 'unicode-1-1-utf-8': + case 'unicode11utf8': + case 'unicode20utf8': + case 'utf-8': + case 'utf8': + case 'x-unicode20utf8': + return 'UTF-8' + case '866': + case 'cp866': + case 'csibm866': + case 'ibm866': + return 'IBM866' + case 'csisolatin2': + case 'iso-8859-2': + case 'iso-ir-101': + case 'iso8859-2': + case 'iso88592': + case 'iso_8859-2': + case 'iso_8859-2:1987': + case 'l2': + case 'latin2': + return 'ISO-8859-2' + case 'csisolatin3': + case 'iso-8859-3': + case 'iso-ir-109': + case 'iso8859-3': + case 'iso88593': + case 'iso_8859-3': + case 'iso_8859-3:1988': + case 'l3': + case 'latin3': + return 'ISO-8859-3' + case 'csisolatin4': + case 'iso-8859-4': + case 'iso-ir-110': + case 'iso8859-4': + case 'iso88594': + case 'iso_8859-4': + case 'iso_8859-4:1988': + case 'l4': + case 'latin4': + return 'ISO-8859-4' + case 'csisolatincyrillic': + case 'cyrillic': + case 'iso-8859-5': + case 'iso-ir-144': + case 'iso8859-5': + case 'iso88595': + case 'iso_8859-5': + case 'iso_8859-5:1988': + return 'ISO-8859-5' + case 'arabic': + case 'asmo-708': + case 'csiso88596e': + case 'csiso88596i': + case 'csisolatinarabic': + case 'ecma-114': + case 'iso-8859-6': + case 'iso-8859-6-e': + case 'iso-8859-6-i': + case 'iso-ir-127': + case 'iso8859-6': + case 'iso88596': + case 'iso_8859-6': + case 'iso_8859-6:1987': + return 'ISO-8859-6' + case 'csisolatingreek': + case 'ecma-118': + case 'elot_928': + case 'greek': + case 'greek8': + case 'iso-8859-7': + case 'iso-ir-126': + case 'iso8859-7': + case 'iso88597': + case 'iso_8859-7': + case 'iso_8859-7:1987': + case 'sun_eu_greek': + return 'ISO-8859-7' + case 'csiso88598e': + case 'csisolatinhebrew': + case 'hebrew': + case 'iso-8859-8': + case 'iso-8859-8-e': + case 'iso-ir-138': + case 'iso8859-8': + case 'iso88598': + case 'iso_8859-8': + case 'iso_8859-8:1988': + case 'visual': + return 'ISO-8859-8' + case 'csiso88598i': + case 'iso-8859-8-i': + case 'logical': + return 'ISO-8859-8-I' + case 'csisolatin6': + case 'iso-8859-10': + case 'iso-ir-157': + case 'iso8859-10': + case 'iso885910': + case 'l6': + case 'latin6': + return 'ISO-8859-10' + case 'iso-8859-13': + case 'iso8859-13': + case 'iso885913': + return 'ISO-8859-13' + case 'iso-8859-14': + case 'iso8859-14': + case 'iso885914': + return 'ISO-8859-14' + case 'csisolatin9': + case 'iso-8859-15': + case 'iso8859-15': + case 'iso885915': + case 'iso_8859-15': + case 'l9': + return 'ISO-8859-15' + case 'iso-8859-16': + return 'ISO-8859-16' + case 'cskoi8r': + case 'koi': + case 'koi8': + case 'koi8-r': + case 'koi8_r': + return 'KOI8-R' + case 'koi8-ru': + case 'koi8-u': + return 'KOI8-U' + case 'csmacintosh': + case 'mac': + case 'macintosh': + case 'x-mac-roman': + return 'macintosh' + case 'iso-8859-11': + case 'iso8859-11': + case 'iso885911': + case 'tis-620': + case 'windows-874': + return 'windows-874' + case 'cp1250': + case 'windows-1250': + case 'x-cp1250': + return 'windows-1250' + case 'cp1251': + case 'windows-1251': + case 'x-cp1251': + return 'windows-1251' + case 'ansi_x3.4-1968': + case 'ascii': + case 'cp1252': + case 'cp819': + case 'csisolatin1': + case 'ibm819': + case 'iso-8859-1': + case 'iso-ir-100': + case 'iso8859-1': + case 'iso88591': + case 'iso_8859-1': + case 'iso_8859-1:1987': + case 'l1': + case 'latin1': + case 'us-ascii': + case 'windows-1252': + case 'x-cp1252': + return 'windows-1252' + case 'cp1253': + case 'windows-1253': + case 'x-cp1253': + return 'windows-1253' + case 'cp1254': + case 'csisolatin5': + case 'iso-8859-9': + case 'iso-ir-148': + case 'iso8859-9': + case 'iso88599': + case 'iso_8859-9': + case 'iso_8859-9:1989': + case 'l5': + case 'latin5': + case 'windows-1254': + case 'x-cp1254': + return 'windows-1254' + case 'cp1255': + case 'windows-1255': + case 'x-cp1255': + return 'windows-1255' + case 'cp1256': + case 'windows-1256': + case 'x-cp1256': + return 'windows-1256' + case 'cp1257': + case 'windows-1257': + case 'x-cp1257': + return 'windows-1257' + case 'cp1258': + case 'windows-1258': + case 'x-cp1258': + return 'windows-1258' + case 'x-mac-cyrillic': + case 'x-mac-ukrainian': + return 'x-mac-cyrillic' + case 'chinese': + case 'csgb2312': + case 'csiso58gb231280': + case 'gb2312': + case 'gb_2312': + case 'gb_2312-80': + case 'gbk': + case 'iso-ir-58': + case 'x-gbk': + return 'GBK' + case 'gb18030': + return 'gb18030' + case 'big5': + case 'big5-hkscs': + case 'cn-big5': + case 'csbig5': + case 'x-x-big5': + return 'Big5' + case 'cseucpkdfmtjapanese': + case 'euc-jp': + case 'x-euc-jp': + return 'EUC-JP' + case 'csiso2022jp': + case 'iso-2022-jp': + return 'ISO-2022-JP' + case 'csshiftjis': + case 'ms932': + case 'ms_kanji': + case 'shift-jis': + case 'shift_jis': + case 'sjis': + case 'windows-31j': + case 'x-sjis': + return 'Shift_JIS' + case 'cseuckr': + case 'csksc56011987': + case 'euc-kr': + case 'iso-ir-149': + case 'korean': + case 'ks_c_5601-1987': + case 'ks_c_5601-1989': + case 'ksc5601': + case 'ksc_5601': + case 'windows-949': + return 'EUC-KR' + case 'csiso2022kr': + case 'hz-gb-2312': + case 'iso-2022-cn': + case 'iso-2022-cn-ext': + case 'iso-2022-kr': + case 'replacement': + return 'replacement' + case 'unicodefffe': + case 'utf-16be': + return 'UTF-16BE' + case 'csunicode': + case 'iso-10646-ucs-2': + case 'ucs-2': + case 'unicode': + case 'unicodefeff': + case 'utf-16': + case 'utf-16le': + return 'UTF-16LE' + case 'x-user-defined': + return 'x-user-defined' + default: return 'failure' + } +} - // 5.4 - queueMicrotask(() => { - // 5.4.1 - const requestList = [] - - // 5.4.2 - for (const request of requests) { - const requestObject = new Request('https://a') - requestObject[kState] = request - requestObject[kHeaders][kHeadersList] = request.headersList - requestObject[kHeaders][kGuard] = 'immutable' - requestObject[kRealm] = request.client - - // 5.4.2.1 - requestList.push(requestObject) - } +module.exports = { + getEncoding +} - // 5.4.3 - promise.resolve(Object.freeze(requestList)) - }) - return promise.promise - } +/***/ }), - /** - * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm - * @param {CacheBatchOperation[]} operations - * @returns {requestResponseList} - */ - #batchCacheOperations(operations) { - // 1. - const cache = this.#relevantRequestResponseList - - // 2. - const backupCache = [...cache] - - // 3. - const addedItems = [] - - // 4.1 - const resultList = [] - - try { - // 4.2 - for (const operation of operations) { - // 4.2.1 - if (operation.type !== 'delete' && operation.type !== 'put') { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'operation type does not match "delete" or "put"' - }) - } +/***/ 1446: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 4.2.2 - if (operation.type === 'delete' && operation.response != null) { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'delete operation should not have an associated response' - }) - } +"use strict"; + + +const { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent +} = __nccwpck_require__(7530) +const { + kState, + kError, + kResult, + kEvents, + kAborted +} = __nccwpck_require__(9054) +const { webidl } = __nccwpck_require__(1744) +const { kEnumerableProperty } = __nccwpck_require__(3983) + +class FileReader extends EventTarget { + constructor () { + super() + + this[kState] = 'empty' + this[kResult] = null + this[kError] = null + this[kEvents] = { + loadend: null, + error: null, + abort: null, + load: null, + progress: null, + loadstart: null + } + } + + /** + * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer + * @param {import('buffer').Blob} blob + */ + readAsArrayBuffer (blob) { + webidl.brandCheck(this, FileReader) + + webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsArrayBuffer' }) + + blob = webidl.converters.Blob(blob, { strict: false }) + + // The readAsArrayBuffer(blob) method, when invoked, + // must initiate a read operation for blob with ArrayBuffer. + readOperation(this, blob, 'ArrayBuffer') + } + + /** + * @see https://w3c.github.io/FileAPI/#readAsBinaryString + * @param {import('buffer').Blob} blob + */ + readAsBinaryString (blob) { + webidl.brandCheck(this, FileReader) + + webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsBinaryString' }) + + blob = webidl.converters.Blob(blob, { strict: false }) + + // The readAsBinaryString(blob) method, when invoked, + // must initiate a read operation for blob with BinaryString. + readOperation(this, blob, 'BinaryString') + } + + /** + * @see https://w3c.github.io/FileAPI/#readAsDataText + * @param {import('buffer').Blob} blob + * @param {string?} encoding + */ + readAsText (blob, encoding = undefined) { + webidl.brandCheck(this, FileReader) + + webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsText' }) + + blob = webidl.converters.Blob(blob, { strict: false }) + + if (encoding !== undefined) { + encoding = webidl.converters.DOMString(encoding) + } + + // The readAsText(blob, encoding) method, when invoked, + // must initiate a read operation for blob with Text and encoding. + readOperation(this, blob, 'Text', encoding) + } + + /** + * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL + * @param {import('buffer').Blob} blob + */ + readAsDataURL (blob) { + webidl.brandCheck(this, FileReader) + + webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsDataURL' }) + + blob = webidl.converters.Blob(blob, { strict: false }) + + // The readAsDataURL(blob) method, when invoked, must + // initiate a read operation for blob with DataURL. + readOperation(this, blob, 'DataURL') + } + + /** + * @see https://w3c.github.io/FileAPI/#dfn-abort + */ + abort () { + // 1. If this's state is "empty" or if this's state is + // "done" set this's result to null and terminate + // this algorithm. + if (this[kState] === 'empty' || this[kState] === 'done') { + this[kResult] = null + return + } + + // 2. If this's state is "loading" set this's state to + // "done" and set this's result to null. + if (this[kState] === 'loading') { + this[kState] = 'done' + this[kResult] = null + } + + // 3. If there are any tasks from this on the file reading + // task source in an affiliated task queue, then remove + // those tasks from that task queue. + this[kAborted] = true + + // 4. Terminate the algorithm for the read method being processed. + // TODO + + // 5. Fire a progress event called abort at this. + fireAProgressEvent('abort', this) + + // 6. If this's state is not "loading", fire a progress + // event called loadend at this. + if (this[kState] !== 'loading') { + fireAProgressEvent('loadend', this) + } + } + + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate + */ + get readyState () { + webidl.brandCheck(this, FileReader) + + switch (this[kState]) { + case 'empty': return this.EMPTY + case 'loading': return this.LOADING + case 'done': return this.DONE + } + } + + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-result + */ + get result () { + webidl.brandCheck(this, FileReader) + + // The result attribute’s getter, when invoked, must return + // this's result. + return this[kResult] + } + + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-error + */ + get error () { + webidl.brandCheck(this, FileReader) + + // The error attribute’s getter, when invoked, must return + // this's error. + return this[kError] + } + + get onloadend () { + webidl.brandCheck(this, FileReader) + + return this[kEvents].loadend + } + + set onloadend (fn) { + webidl.brandCheck(this, FileReader) + + if (this[kEvents].loadend) { + this.removeEventListener('loadend', this[kEvents].loadend) + } + + if (typeof fn === 'function') { + this[kEvents].loadend = fn + this.addEventListener('loadend', fn) + } else { + this[kEvents].loadend = null + } + } + + get onerror () { + webidl.brandCheck(this, FileReader) + + return this[kEvents].error + } + + set onerror (fn) { + webidl.brandCheck(this, FileReader) + + if (this[kEvents].error) { + this.removeEventListener('error', this[kEvents].error) + } + + if (typeof fn === 'function') { + this[kEvents].error = fn + this.addEventListener('error', fn) + } else { + this[kEvents].error = null + } + } + + get onloadstart () { + webidl.brandCheck(this, FileReader) + + return this[kEvents].loadstart + } + + set onloadstart (fn) { + webidl.brandCheck(this, FileReader) + + if (this[kEvents].loadstart) { + this.removeEventListener('loadstart', this[kEvents].loadstart) + } + + if (typeof fn === 'function') { + this[kEvents].loadstart = fn + this.addEventListener('loadstart', fn) + } else { + this[kEvents].loadstart = null + } + } + + get onprogress () { + webidl.brandCheck(this, FileReader) + + return this[kEvents].progress + } + + set onprogress (fn) { + webidl.brandCheck(this, FileReader) + + if (this[kEvents].progress) { + this.removeEventListener('progress', this[kEvents].progress) + } + + if (typeof fn === 'function') { + this[kEvents].progress = fn + this.addEventListener('progress', fn) + } else { + this[kEvents].progress = null + } + } + + get onload () { + webidl.brandCheck(this, FileReader) + + return this[kEvents].load + } + + set onload (fn) { + webidl.brandCheck(this, FileReader) + + if (this[kEvents].load) { + this.removeEventListener('load', this[kEvents].load) + } + + if (typeof fn === 'function') { + this[kEvents].load = fn + this.addEventListener('load', fn) + } else { + this[kEvents].load = null + } + } + + get onabort () { + webidl.brandCheck(this, FileReader) + + return this[kEvents].abort + } + + set onabort (fn) { + webidl.brandCheck(this, FileReader) + + if (this[kEvents].abort) { + this.removeEventListener('abort', this[kEvents].abort) + } + + if (typeof fn === 'function') { + this[kEvents].abort = fn + this.addEventListener('abort', fn) + } else { + this[kEvents].abort = null + } + } +} - // 4.2.3 - if (this.#queryCache(operation.request, operation.options, addedItems).length) { - throw new DOMException('???', 'InvalidStateError') - } +// https://w3c.github.io/FileAPI/#dom-filereader-empty +FileReader.EMPTY = FileReader.prototype.EMPTY = 0 +// https://w3c.github.io/FileAPI/#dom-filereader-loading +FileReader.LOADING = FileReader.prototype.LOADING = 1 +// https://w3c.github.io/FileAPI/#dom-filereader-done +FileReader.DONE = FileReader.prototype.DONE = 2 + +Object.defineProperties(FileReader.prototype, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors, + readAsArrayBuffer: kEnumerableProperty, + readAsBinaryString: kEnumerableProperty, + readAsText: kEnumerableProperty, + readAsDataURL: kEnumerableProperty, + abort: kEnumerableProperty, + readyState: kEnumerableProperty, + result: kEnumerableProperty, + error: kEnumerableProperty, + onloadstart: kEnumerableProperty, + onprogress: kEnumerableProperty, + onload: kEnumerableProperty, + onabort: kEnumerableProperty, + onerror: kEnumerableProperty, + onloadend: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'FileReader', + writable: false, + enumerable: false, + configurable: true + } +}) - // 4.2.4 - let requestResponses - - // 4.2.5 - if (operation.type === 'delete') { - // 4.2.5.1 - requestResponses = this.#queryCache(operation.request, operation.options) - - // TODO: the spec is wrong, this is needed to pass WPTs - if (requestResponses.length === 0) { - return [] - } - - // 4.2.5.2 - for (const requestResponse of requestResponses) { - const idx = cache.indexOf(requestResponse) - assert(idx !== -1) - - // 4.2.5.2.1 - cache.splice(idx, 1) - } - } else if (operation.type === 'put') { // 4.2.6 - // 4.2.6.1 - if (operation.response == null) { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'put operation should have an associated response' - }) - } - - // 4.2.6.2 - const r = operation.request - - // 4.2.6.3 - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'expected http or https scheme' - }) - } - - // 4.2.6.4 - if (r.method !== 'GET') { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'not get method' - }) - } - - // 4.2.6.5 - if (operation.options != null) { - throw webidl.errors.exception({ - header: 'Cache.#batchCacheOperations', - message: 'options must not be defined' - }) - } - - // 4.2.6.6 - requestResponses = this.#queryCache(operation.request) - - // 4.2.6.7 - for (const requestResponse of requestResponses) { - const idx = cache.indexOf(requestResponse) - assert(idx !== -1) - - // 4.2.6.7.1 - cache.splice(idx, 1) - } - - // 4.2.6.8 - cache.push([operation.request, operation.response]) - - // 4.2.6.10 - addedItems.push([operation.request, operation.response]) - } +Object.defineProperties(FileReader, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors +}) - // 4.2.7 - resultList.push([operation.request, operation.response]) - } +module.exports = { + FileReader +} - // 4.3 - return resultList - } catch (e) { // 5. - // 5.1 - this.#relevantRequestResponseList.length = 0 - // 5.2 - this.#relevantRequestResponseList = backupCache +/***/ }), - // 5.3 - throw e - } - } +/***/ 5504: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - /** - * @see https://w3c.github.io/ServiceWorker/#query-cache - * @param {any} requestQuery - * @param {import('../../types/cache').CacheQueryOptions} options - * @param {requestResponseList} targetStorage - * @returns {requestResponseList} - */ - #queryCache(requestQuery, options, targetStorage) { - /** @type {requestResponseList} */ - const resultList = [] - - const storage = targetStorage ?? this.#relevantRequestResponseList - - for (const requestResponse of storage) { - const [cachedRequest, cachedResponse] = requestResponse - if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options)) { - resultList.push(requestResponse) - } - } +"use strict"; - return resultList - } - /** - * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm - * @param {any} requestQuery - * @param {any} request - * @param {any | null} response - * @param {import('../../types/cache').CacheQueryOptions | undefined} options - * @returns {boolean} - */ - #requestMatchesCachedItem(requestQuery, request, response = null, options) { - // if (options?.ignoreMethod === false && request.method === 'GET') { - // return false - // } +const { webidl } = __nccwpck_require__(1744) - const queryURL = new URL(requestQuery.url) +const kState = Symbol('ProgressEvent state') - const cachedURL = new URL(request.url) +/** + * @see https://xhr.spec.whatwg.org/#progressevent + */ +class ProgressEvent extends Event { + constructor (type, eventInitDict = {}) { + type = webidl.converters.DOMString(type) + eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}) - if (options?.ignoreSearch) { - cachedURL.search = '' + super(type, eventInitDict) - queryURL.search = '' - } + this[kState] = { + lengthComputable: eventInitDict.lengthComputable, + loaded: eventInitDict.loaded, + total: eventInitDict.total + } + } - if (!urlEquals(queryURL, cachedURL, true)) { - return false - } + get lengthComputable () { + webidl.brandCheck(this, ProgressEvent) - if ( - response == null || - options?.ignoreVary || - !response.headersList.contains('vary') - ) { - return true - } + return this[kState].lengthComputable + } - const fieldValues = getFieldValues(response.headersList.get('vary')) + get loaded () { + webidl.brandCheck(this, ProgressEvent) - for (const fieldValue of fieldValues) { - if (fieldValue === '*') { - return false - } + return this[kState].loaded + } - const requestValue = request.headersList.get(fieldValue) - const queryValue = requestQuery.headersList.get(fieldValue) + get total () { + webidl.brandCheck(this, ProgressEvent) - // If one has the header and the other doesn't, or one has - // a different value than the other, return false - if (requestValue !== queryValue) { - return false - } - } + return this[kState].total + } +} - return true - } - } +webidl.converters.ProgressEventInit = webidl.dictionaryConverter([ + { + key: 'lengthComputable', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'loaded', + converter: webidl.converters['unsigned long long'], + defaultValue: 0 + }, + { + key: 'total', + converter: webidl.converters['unsigned long long'], + defaultValue: 0 + }, + { + key: 'bubbles', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'cancelable', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'composed', + converter: webidl.converters.boolean, + defaultValue: false + } +]) + +module.exports = { + ProgressEvent +} - Object.defineProperties(Cache.prototype, { - [Symbol.toStringTag]: { - value: 'Cache', - configurable: true - }, - match: kEnumerableProperty, - matchAll: kEnumerableProperty, - add: kEnumerableProperty, - addAll: kEnumerableProperty, - put: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty - }) - - const cacheQueryOptionConverters = [ - { - key: 'ignoreSearch', - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: 'ignoreMethod', - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: 'ignoreVary', - converter: webidl.converters.boolean, - defaultValue: false - } - ] - webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters) +/***/ }), - webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ - ...cacheQueryOptionConverters, - { - key: 'cacheName', - converter: webidl.converters.DOMString - } - ]) +/***/ 9054: +/***/ ((module) => { - webidl.converters.Response = webidl.interfaceConverter(Response) +"use strict"; - webidl.converters['sequence'] = webidl.sequenceConverter( - webidl.converters.RequestInfo - ) - module.exports = { - Cache - } +module.exports = { + kState: Symbol('FileReader state'), + kResult: Symbol('FileReader result'), + kError: Symbol('FileReader error'), + kLastProgressEventFired: Symbol('FileReader last progress event fired timestamp'), + kEvents: Symbol('FileReader events'), + kAborted: Symbol('FileReader aborted') +} - /***/ -}), +/***/ }), -/***/ 7907: +/***/ 7530: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +"use strict"; + + +const { + kState, + kError, + kResult, + kAborted, + kLastProgressEventFired +} = __nccwpck_require__(9054) +const { ProgressEvent } = __nccwpck_require__(5504) +const { getEncoding } = __nccwpck_require__(4854) +const { DOMException } = __nccwpck_require__(1037) +const { serializeAMimeType, parseMIMEType } = __nccwpck_require__(685) +const { types } = __nccwpck_require__(3837) +const { StringDecoder } = __nccwpck_require__(1576) +const { btoa } = __nccwpck_require__(4300) + +/** @type {PropertyDescriptor} */ +const staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false +} +/** + * @see https://w3c.github.io/FileAPI/#readOperation + * @param {import('./filereader').FileReader} fr + * @param {import('buffer').Blob} blob + * @param {string} type + * @param {string?} encodingName + */ +function readOperation (fr, blob, type, encodingName) { + // 1. If fr’s state is "loading", throw an InvalidStateError + // DOMException. + if (fr[kState] === 'loading') { + throw new DOMException('Invalid state', 'InvalidStateError') + } + + // 2. Set fr’s state to "loading". + fr[kState] = 'loading' + + // 3. Set fr’s result to null. + fr[kResult] = null + + // 4. Set fr’s error to null. + fr[kError] = null + + // 5. Let stream be the result of calling get stream on blob. + /** @type {import('stream/web').ReadableStream} */ + const stream = blob.stream() + + // 6. Let reader be the result of getting a reader from stream. + const reader = stream.getReader() + + // 7. Let bytes be an empty byte sequence. + /** @type {Uint8Array[]} */ + const bytes = [] + + // 8. Let chunkPromise be the result of reading a chunk from + // stream with reader. + let chunkPromise = reader.read() + + // 9. Let isFirstChunk be true. + let isFirstChunk = true + + // 10. In parallel, while true: + // Note: "In parallel" just means non-blocking + // Note 2: readOperation itself cannot be async as double + // reading the body would then reject the promise, instead + // of throwing an error. + ;(async () => { + while (!fr[kAborted]) { + // 1. Wait for chunkPromise to be fulfilled or rejected. + try { + const { done, value } = await chunkPromise + + // 2. If chunkPromise is fulfilled, and isFirstChunk is + // true, queue a task to fire a progress event called + // loadstart at fr. + if (isFirstChunk && !fr[kAborted]) { + queueMicrotask(() => { + fireAProgressEvent('loadstart', fr) + }) + } + + // 3. Set isFirstChunk to false. + isFirstChunk = false + + // 4. If chunkPromise is fulfilled with an object whose + // done property is false and whose value property is + // a Uint8Array object, run these steps: + if (!done && types.isUint8Array(value)) { + // 1. Let bs be the byte sequence represented by the + // Uint8Array object. + + // 2. Append bs to bytes. + bytes.push(value) + + // 3. If roughly 50ms have passed since these steps + // were last invoked, queue a task to fire a + // progress event called progress at fr. + if ( + ( + fr[kLastProgressEventFired] === undefined || + Date.now() - fr[kLastProgressEventFired] >= 50 + ) && + !fr[kAborted] + ) { + fr[kLastProgressEventFired] = Date.now() + queueMicrotask(() => { + fireAProgressEvent('progress', fr) + }) + } + + // 4. Set chunkPromise to the result of reading a + // chunk from stream with reader. + chunkPromise = reader.read() + } else if (done) { + // 5. Otherwise, if chunkPromise is fulfilled with an + // object whose done property is true, queue a task + // to run the following steps and abort this algorithm: + queueMicrotask(() => { + // 1. Set fr’s state to "done". + fr[kState] = 'done' + + // 2. Let result be the result of package data given + // bytes, type, blob’s type, and encodingName. + try { + const result = packageData(bytes, type, blob.type, encodingName) + + // 4. Else: + + if (fr[kAborted]) { + return + } + + // 1. Set fr’s result to result. + fr[kResult] = result + + // 2. Fire a progress event called load at the fr. + fireAProgressEvent('load', fr) + } catch (error) { + // 3. If package data threw an exception error: + + // 1. Set fr’s error to error. + fr[kError] = error + + // 2. Fire a progress event called error at fr. + fireAProgressEvent('error', fr) + } + + // 5. If fr’s state is not "loading", fire a progress + // event called loadend at the fr. + if (fr[kState] !== 'loading') { + fireAProgressEvent('loadend', fr) + } + }) + + break + } + } catch (error) { + if (fr[kAborted]) { + return + } + + // 6. Otherwise, if chunkPromise is rejected with an + // error error, queue a task to run the following + // steps and abort this algorithm: + queueMicrotask(() => { + // 1. Set fr’s state to "done". + fr[kState] = 'done' + + // 2. Set fr’s error to error. + fr[kError] = error + + // 3. Fire a progress event called error at fr. + fireAProgressEvent('error', fr) + + // 4. If fr’s state is not "loading", fire a progress + // event called loadend at fr. + if (fr[kState] !== 'loading') { + fireAProgressEvent('loadend', fr) + } + }) + + break + } + } + })() +} - const { kConstruct } = __nccwpck_require__(9174) - const { Cache } = __nccwpck_require__(6101) - const { webidl } = __nccwpck_require__(1744) - const { kEnumerableProperty } = __nccwpck_require__(3983) +/** + * @see https://w3c.github.io/FileAPI/#fire-a-progress-event + * @see https://dom.spec.whatwg.org/#concept-event-fire + * @param {string} e The name of the event + * @param {import('./filereader').FileReader} reader + */ +function fireAProgressEvent (e, reader) { + // The progress event e does not bubble. e.bubbles must be false + // The progress event e is NOT cancelable. e.cancelable must be false + const event = new ProgressEvent(e, { + bubbles: false, + cancelable: false + }) + + reader.dispatchEvent(event) +} - class CacheStorage { - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map - * @type {Map} - */ - async has(cacheName) { - webidl.brandCheck(this, CacheStorage) - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.has' }) + const sliced = bytes.slice(slice) + return new TextDecoder(encoding).decode(sliced) +} - cacheName = webidl.converters.DOMString(cacheName) +/** + * @see https://encoding.spec.whatwg.org/#bom-sniff + * @param {Uint8Array} ioQueue + */ +function BOMSniffing (ioQueue) { + // 1. Let BOM be the result of peeking 3 bytes from ioQueue, + // converted to a byte sequence. + const [a, b, c] = ioQueue + + // 2. For each of the rows in the table below, starting with + // the first one and going down, if BOM starts with the + // bytes given in the first column, then return the + // encoding given in the cell in the second column of that + // row. Otherwise, return null. + if (a === 0xEF && b === 0xBB && c === 0xBF) { + return 'UTF-8' + } else if (a === 0xFE && b === 0xFF) { + return 'UTF-16BE' + } else if (a === 0xFF && b === 0xFE) { + return 'UTF-16LE' + } + + return null +} - // 2.1.1 - // 2.2 - return this.#caches.has(cacheName) - } +/** + * @param {Uint8Array[]} sequences + */ +function combineByteSequences (sequences) { + const size = sequences.reduce((a, b) => { + return a + b.byteLength + }, 0) + + let offset = 0 + + return sequences.reduce((a, b) => { + a.set(b, offset) + offset += b.byteLength + return a + }, new Uint8Array(size)) +} - /** - * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open - * @param {string} cacheName - * @returns {Promise} - */ - async open(cacheName) { - webidl.brandCheck(this, CacheStorage) - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.open' }) +module.exports = { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent +} - cacheName = webidl.converters.DOMString(cacheName) - // 2.1 - if (this.#caches.has(cacheName)) { - // await caches.open('v1') !== await caches.open('v1') +/***/ }), - // 2.1.1 - const cache = this.#caches.get(cacheName) +/***/ 1892: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // 2.1.1.1 - return new Cache(kConstruct, cache) - } +"use strict"; - // 2.2 - const cache = [] - // 2.3 - this.#caches.set(cacheName, cache) +// We include a version number for the Dispatcher API. In case of breaking changes, +// this version number must be increased to avoid conflicts. +const globalDispatcher = Symbol.for('undici.globalDispatcher.1') +const { InvalidArgumentError } = __nccwpck_require__(8045) +const Agent = __nccwpck_require__(7890) - // 2.4 - return new Cache(kConstruct, cache) - } +if (getGlobalDispatcher() === undefined) { + setGlobalDispatcher(new Agent()) +} - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete - * @param {string} cacheName - * @returns {Promise} - */ - async delete(cacheName) { - webidl.brandCheck(this, CacheStorage) - webidl.argumentLengthCheck(arguments, 1, { header: 'CacheStorage.delete' }) +function setGlobalDispatcher (agent) { + if (!agent || typeof agent.dispatch !== 'function') { + throw new InvalidArgumentError('Argument agent must implement Agent') + } + Object.defineProperty(globalThis, globalDispatcher, { + value: agent, + writable: true, + enumerable: false, + configurable: false + }) +} - cacheName = webidl.converters.DOMString(cacheName) +function getGlobalDispatcher () { + return globalThis[globalDispatcher] +} - return this.#caches.delete(cacheName) - } +module.exports = { + setGlobalDispatcher, + getGlobalDispatcher +} - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys - * @returns {string[]} - */ - async keys() { - webidl.brandCheck(this, CacheStorage) - // 2.1 - const keys = this.#caches.keys() +/***/ }), - // 2.2 - return [...keys] - } - } +/***/ 6930: +/***/ ((module) => { - Object.defineProperties(CacheStorage.prototype, { - [Symbol.toStringTag]: { - value: 'CacheStorage', - configurable: true - }, - match: kEnumerableProperty, - has: kEnumerableProperty, - open: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty - }) - - module.exports = { - CacheStorage - } +"use strict"; - /***/ -}), +module.exports = class DecoratorHandler { + constructor (handler) { + this.handler = handler + } -/***/ 9174: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + onConnect (...args) { + return this.handler.onConnect(...args) + } - "use strict"; + onError (...args) { + return this.handler.onError(...args) + } + onUpgrade (...args) { + return this.handler.onUpgrade(...args) + } - module.exports = { - kConstruct: (__nccwpck_require__(2785).kConstruct) - } + onHeaders (...args) { + return this.handler.onHeaders(...args) + } + onData (...args) { + return this.handler.onData(...args) + } - /***/ -}), + onComplete (...args) { + return this.handler.onComplete(...args) + } -/***/ 2396: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + onBodySent (...args) { + return this.handler.onBodySent(...args) + } +} - "use strict"; +/***/ }), - const assert = __nccwpck_require__(9491) - const { URLSerializer } = __nccwpck_require__(685) - const { isValidHeaderName } = __nccwpck_require__(2538) +/***/ 2860: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - /** - * @see https://url.spec.whatwg.org/#concept-url-equals - * @param {URL} A - * @param {URL} B - * @param {boolean | undefined} excludeFragment - * @returns {boolean} - */ - function urlEquals(A, B, excludeFragment = false) { - const serializedA = URLSerializer(A, excludeFragment) +"use strict"; - const serializedB = URLSerializer(B, excludeFragment) - return serializedA === serializedB - } +const util = __nccwpck_require__(3983) +const { kBodyUsed } = __nccwpck_require__(2785) +const assert = __nccwpck_require__(9491) +const { InvalidArgumentError } = __nccwpck_require__(8045) +const EE = __nccwpck_require__(2361) - /** - * @see https://github.com/chromium/chromium/blob/694d20d134cb553d8d89e5500b9148012b1ba299/content/browser/cache_storage/cache_storage_cache.cc#L260-L262 - * @param {string} header - */ - function fieldValues(header) { - assert(header !== null) +const redirectableStatusCodes = [300, 301, 302, 303, 307, 308] - const values = [] +const kBody = Symbol('body') - for (let value of header.split(',')) { - value = value.trim() +class BodyAsyncIterable { + constructor (body) { + this[kBody] = body + this[kBodyUsed] = false + } - if (!value.length) { - continue - } else if (!isValidHeaderName(value)) { - continue - } + async * [Symbol.asyncIterator] () { + assert(!this[kBodyUsed], 'disturbed') + this[kBodyUsed] = true + yield * this[kBody] + } +} - values.push(value) - } +class RedirectHandler { + constructor (dispatch, maxRedirections, opts, handler) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError('maxRedirections must be a positive number') + } + + util.validateHandler(handler, opts.method, opts.upgrade) + + this.dispatch = dispatch + this.location = null + this.abort = null + this.opts = { ...opts, maxRedirections: 0 } // opts must be a copy + this.maxRedirections = maxRedirections + this.handler = handler + this.history = [] + + if (util.isStream(this.opts.body)) { + // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp + // so that it can be dispatched again? + // TODO (fix): Do we need 100-expect support to provide a way to do this properly? + if (util.bodyLength(this.opts.body) === 0) { + this.opts.body + .on('data', function () { + assert(false) + }) + } + + if (typeof this.opts.body.readableDidRead !== 'boolean') { + this.opts.body[kBodyUsed] = false + EE.prototype.on.call(this.opts.body, 'data', function () { + this[kBodyUsed] = true + }) + } + } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') { + // TODO (fix): We can't access ReadableStream internal state + // to determine whether or not it has been disturbed. This is just + // a workaround. + this.opts.body = new BodyAsyncIterable(this.opts.body) + } else if ( + this.opts.body && + typeof this.opts.body !== 'string' && + !ArrayBuffer.isView(this.opts.body) && + util.isIterable(this.opts.body) + ) { + // TODO: Should we allow re-using iterable if !this.opts.idempotent + // or through some other flag? + this.opts.body = new BodyAsyncIterable(this.opts.body) + } + } + + onConnect (abort) { + this.abort = abort + this.handler.onConnect(abort, { history: this.history }) + } + + onUpgrade (statusCode, headers, socket) { + this.handler.onUpgrade(statusCode, headers, socket) + } + + onError (error) { + this.handler.onError(error) + } + + onHeaders (statusCode, headers, resume, statusText) { + this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) + ? null + : parseLocation(statusCode, headers) + + if (this.opts.origin) { + this.history.push(new URL(this.opts.path, this.opts.origin)) + } + + if (!this.location) { + return this.handler.onHeaders(statusCode, headers, resume, statusText) + } + + const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))) + const path = search ? `${pathname}${search}` : pathname + + // Remove headers referring to the original URL. + // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers. + // https://tools.ietf.org/html/rfc7231#section-6.4 + this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin) + this.opts.path = path + this.opts.origin = origin + this.opts.maxRedirections = 0 + this.opts.query = null + + // https://tools.ietf.org/html/rfc7231#section-6.4.4 + // In case of HTTP 303, always replace method to be either HEAD or GET + if (statusCode === 303 && this.opts.method !== 'HEAD') { + this.opts.method = 'GET' + this.opts.body = null + } + } + + onData (chunk) { + if (this.location) { + /* + https://tools.ietf.org/html/rfc7231#section-6.4 + + TLDR: undici always ignores 3xx response bodies. + + Redirection is used to serve the requested resource from another URL, so it is assumes that + no body is generated (and thus can be ignored). Even though generating a body is not prohibited. + + For status 301, 302, 303, 307 and 308 (the latter from RFC 7238), the specs mention that the body usually + (which means it's optional and not mandated) contain just an hyperlink to the value of + the Location response header, so the body can be ignored safely. + + For status 300, which is "Multiple Choices", the spec mentions both generating a Location + response header AND a response body with the other possible location to follow. + Since the spec explicitily chooses not to specify a format for such body and leave it to + servers and browsers implementors, we ignore the body as there is no specified way to eventually parse it. + */ + } else { + return this.handler.onData(chunk) + } + } + + onComplete (trailers) { + if (this.location) { + /* + https://tools.ietf.org/html/rfc7231#section-6.4 + + TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections + and neither are useful if present. + + See comment on onData method above for more detailed informations. + */ + + this.location = null + this.abort = null + + this.dispatch(this.opts, this) + } else { + this.handler.onComplete(trailers) + } + } + + onBodySent (chunk) { + if (this.handler.onBodySent) { + this.handler.onBodySent(chunk) + } + } +} - return values - } +function parseLocation (statusCode, headers) { + if (redirectableStatusCodes.indexOf(statusCode) === -1) { + return null + } - module.exports = { - urlEquals, - fieldValues - } + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].toString().toLowerCase() === 'location') { + return headers[i + 1] + } + } +} +// https://tools.ietf.org/html/rfc7231#section-6.4.4 +function shouldRemoveHeader (header, removeContent, unknownOrigin) { + if (header.length === 4) { + return util.headerNameToString(header) === 'host' + } + if (removeContent && util.headerNameToString(header).startsWith('content-')) { + return true + } + if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) { + const name = util.headerNameToString(header) + return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization' + } + return false +} - /***/ -}), +// https://tools.ietf.org/html/rfc7231#section-6.4 +function cleanRequestHeaders (headers, removeContent, unknownOrigin) { + const ret = [] + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { + ret.push(headers[i], headers[i + 1]) + } + } + } else if (headers && typeof headers === 'object') { + for (const key of Object.keys(headers)) { + if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { + ret.push(key, headers[key]) + } + } + } else { + assert(headers == null, 'headers must be an object or an array') + } + return ret +} -/***/ 3598: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +module.exports = RedirectHandler - "use strict"; - // @ts-check - - - - /* global WebAssembly */ - - const assert = __nccwpck_require__(9491) - const net = __nccwpck_require__(1808) - const http = __nccwpck_require__(3685) - const { pipeline } = __nccwpck_require__(2781) - const util = __nccwpck_require__(3983) - const timers = __nccwpck_require__(9459) - const Request = __nccwpck_require__(2905) - const DispatcherBase = __nccwpck_require__(4839) - const { - RequestContentLengthMismatchError, - ResponseContentLengthMismatchError, - InvalidArgumentError, - RequestAbortedError, - HeadersTimeoutError, - HeadersOverflowError, - SocketError, - InformationalError, - BodyTimeoutError, - HTTPParserError, - ResponseExceededMaxSizeError, - ClientDestroyedError - } = __nccwpck_require__(8045) - const buildConnector = __nccwpck_require__(2067) - const { - kUrl, - kReset, - kServerName, - kClient, - kBusy, - kParser, - kConnect, - kBlocking, - kResuming, - kRunning, - kPending, - kSize, - kWriting, - kQueue, - kConnected, - kConnecting, - kNeedDrain, - kNoRef, - kKeepAliveDefaultTimeout, - kHostHeader, - kPendingIdx, - kRunningIdx, - kError, - kPipelining, - kSocket, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, - kStrictContentLength, - kConnector, - kMaxRedirections, - kMaxRequests, - kCounter, - kClose, - kDestroy, - kDispatch, - kInterceptors, - kLocalAddress, - kMaxResponseSize, - kHTTPConnVersion, - // HTTP2 - kHost, - kHTTP2Session, - kHTTP2SessionState, - kHTTP2BuildRequest, - kHTTP2CopyHeaders, - kHTTP1BuildRequest - } = __nccwpck_require__(2785) - - /** @type {import('http2')} */ - let http2 - try { - http2 = __nccwpck_require__(5158) - } catch { - // @ts-ignore - http2 = { constants: {} } - } - const { - constants: { - HTTP2_HEADER_AUTHORITY, - HTTP2_HEADER_METHOD, - HTTP2_HEADER_PATH, - HTTP2_HEADER_SCHEME, - HTTP2_HEADER_CONTENT_LENGTH, - HTTP2_HEADER_EXPECT, - HTTP2_HEADER_STATUS - } - } = http2 +/***/ }), - // Experimental - let h2ExperimentalWarned = false +/***/ 2286: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - const FastBuffer = Buffer[Symbol.species] +const assert = __nccwpck_require__(9491) - const kClosedResolve = Symbol('kClosedResolve') +const { kRetryHandlerDefaultRetry } = __nccwpck_require__(2785) +const { RequestRetryError } = __nccwpck_require__(8045) +const { isDisturbed, parseHeaders, parseRangeHeader } = __nccwpck_require__(3983) - const channels = {} +function calculateRetryAfterHeader (retryAfter) { + const current = Date.now() + const diff = new Date(retryAfter).getTime() - current - try { - const diagnosticsChannel = __nccwpck_require__(7643) - channels.sendHeaders = diagnosticsChannel.channel('undici:client:sendHeaders') - channels.beforeConnect = diagnosticsChannel.channel('undici:client:beforeConnect') - channels.connectError = diagnosticsChannel.channel('undici:client:connectError') - channels.connected = diagnosticsChannel.channel('undici:client:connected') - } catch { - channels.sendHeaders = { hasSubscribers: false } - channels.beforeConnect = { hasSubscribers: false } - channels.connectError = { hasSubscribers: false } - channels.connected = { hasSubscribers: false } - } + return diff +} - /** - * @type {import('../types/client').default} - */ - class Client extends DispatcherBase { - /** - * - * @param {string|URL} url - * @param {import('../types/client').Client.Options} options - */ - constructor(url, { - interceptors, - maxHeaderSize, - headersTimeout, - socketTimeout, - requestTimeout, - connectTimeout, - bodyTimeout, - idleTimeout, - keepAlive, - keepAliveTimeout, - maxKeepAliveTimeout, - keepAliveMaxTimeout, - keepAliveTimeoutThreshold, - socketPath, - pipelining, - tls, - strictContentLength, - maxCachedSessions, - maxRedirections, - connect, - maxRequestsPerClient, - localAddress, - maxResponseSize, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - // h2 - allowH2, - maxConcurrentStreams - } = {}) { - super() - - if (keepAlive !== undefined) { - throw new InvalidArgumentError('unsupported keepAlive, use pipelining=0 instead') - } +class RetryHandler { + constructor (opts, handlers) { + const { retryOptions, ...dispatchOpts } = opts + const { + // Retry scoped + retry: retryFn, + maxRetries, + maxTimeout, + minTimeout, + timeoutFactor, + // Response scoped + methods, + errorCodes, + retryAfter, + statusCodes + } = retryOptions ?? {} + + this.dispatch = handlers.dispatch + this.handler = handlers.handler + this.opts = dispatchOpts + this.abort = null + this.aborted = false + this.retryOpts = { + retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry], + retryAfter: retryAfter ?? true, + maxTimeout: maxTimeout ?? 30 * 1000, // 30s, + timeout: minTimeout ?? 500, // .5s + timeoutFactor: timeoutFactor ?? 2, + maxRetries: maxRetries ?? 5, + // What errors we should retry + methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'], + // Indicates which errors to retry + statusCodes: statusCodes ?? [500, 502, 503, 504, 429], + // List of errors to retry + errorCodes: errorCodes ?? [ + 'ECONNRESET', + 'ECONNREFUSED', + 'ENOTFOUND', + 'ENETDOWN', + 'ENETUNREACH', + 'EHOSTDOWN', + 'EHOSTUNREACH', + 'EPIPE' + ] + } + + this.retryCount = 0 + this.start = 0 + this.end = null + this.etag = null + this.resume = null + + // Handle possible onConnect duplication + this.handler.onConnect(reason => { + this.aborted = true + if (this.abort) { + this.abort(reason) + } else { + this.reason = reason + } + }) + } + + onRequestSent () { + if (this.handler.onRequestSent) { + this.handler.onRequestSent() + } + } + + onUpgrade (statusCode, headers, socket) { + if (this.handler.onUpgrade) { + this.handler.onUpgrade(statusCode, headers, socket) + } + } + + onConnect (abort) { + if (this.aborted) { + abort(this.reason) + } else { + this.abort = abort + } + } + + onBodySent (chunk) { + if (this.handler.onBodySent) return this.handler.onBodySent(chunk) + } + + static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) { + const { statusCode, code, headers } = err + const { method, retryOptions } = opts + const { + maxRetries, + timeout, + maxTimeout, + timeoutFactor, + statusCodes, + errorCodes, + methods + } = retryOptions + let { counter, currentTimeout } = state + + currentTimeout = + currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout + + // Any code that is not a Undici's originated and allowed to retry + if ( + code && + code !== 'UND_ERR_REQ_RETRY' && + code !== 'UND_ERR_SOCKET' && + !errorCodes.includes(code) + ) { + cb(err) + return + } + + // If a set of method are provided and the current method is not in the list + if (Array.isArray(methods) && !methods.includes(method)) { + cb(err) + return + } + + // If a set of status code are provided and the current status code is not in the list + if ( + statusCode != null && + Array.isArray(statusCodes) && + !statusCodes.includes(statusCode) + ) { + cb(err) + return + } + + // If we reached the max number of retries + if (counter > maxRetries) { + cb(err) + return + } + + let retryAfterHeader = headers != null && headers['retry-after'] + if (retryAfterHeader) { + retryAfterHeader = Number(retryAfterHeader) + retryAfterHeader = isNaN(retryAfterHeader) + ? calculateRetryAfterHeader(retryAfterHeader) + : retryAfterHeader * 1e3 // Retry-After is in seconds + } + + const retryTimeout = + retryAfterHeader > 0 + ? Math.min(retryAfterHeader, maxTimeout) + : Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout) + + state.currentTimeout = retryTimeout + + setTimeout(() => cb(null), retryTimeout) + } + + onHeaders (statusCode, rawHeaders, resume, statusMessage) { + const headers = parseHeaders(rawHeaders) + + this.retryCount += 1 + + if (statusCode >= 300) { + this.abort( + new RequestRetryError('Request failed', statusCode, { + headers, + count: this.retryCount + }) + ) + return false + } + + // Checkpoint for resume from where we left it + if (this.resume != null) { + this.resume = null + + if (statusCode !== 206) { + return true + } + + const contentRange = parseRangeHeader(headers['content-range']) + // If no content range + if (!contentRange) { + this.abort( + new RequestRetryError('Content-Range mismatch', statusCode, { + headers, + count: this.retryCount + }) + ) + return false + } + + // Let's start with a weak etag check + if (this.etag != null && this.etag !== headers.etag) { + this.abort( + new RequestRetryError('ETag mismatch', statusCode, { + headers, + count: this.retryCount + }) + ) + return false + } + + const { start, size, end = size } = contentRange + + assert(this.start === start, 'content-range mismatch') + assert(this.end == null || this.end === end, 'content-range mismatch') + + this.resume = resume + return true + } + + if (this.end == null) { + if (statusCode === 206) { + // First time we receive 206 + const range = parseRangeHeader(headers['content-range']) + + if (range == null) { + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } + + const { start, size, end = size } = range + + assert( + start != null && Number.isFinite(start) && this.start !== start, + 'content-range mismatch' + ) + assert(Number.isFinite(start)) + assert( + end != null && Number.isFinite(end) && this.end !== end, + 'invalid content-length' + ) + + this.start = start + this.end = end + } + + // We make our best to checkpoint the body for further range headers + if (this.end == null) { + const contentLength = headers['content-length'] + this.end = contentLength != null ? Number(contentLength) : null + } + + assert(Number.isFinite(this.start)) + assert( + this.end == null || Number.isFinite(this.end), + 'invalid content-length' + ) + + this.resume = resume + this.etag = headers.etag != null ? headers.etag : null + + return this.handler.onHeaders( + statusCode, + rawHeaders, + resume, + statusMessage + ) + } + + const err = new RequestRetryError('Request failed', statusCode, { + headers, + count: this.retryCount + }) + + this.abort(err) + + return false + } + + onData (chunk) { + this.start += chunk.length + + return this.handler.onData(chunk) + } + + onComplete (rawTrailers) { + this.retryCount = 0 + return this.handler.onComplete(rawTrailers) + } + + onError (err) { + if (this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err) + } + + this.retryOpts.retry( + err, + { + state: { counter: this.retryCount++, currentTimeout: this.retryAfter }, + opts: { retryOptions: this.retryOpts, ...this.opts } + }, + onRetry.bind(this) + ) + + function onRetry (err) { + if (err != null || this.aborted || isDisturbed(this.opts.body)) { + return this.handler.onError(err) + } + + if (this.start !== 0) { + this.opts = { + ...this.opts, + headers: { + ...this.opts.headers, + range: `bytes=${this.start}-${this.end ?? ''}` + } + } + } + + try { + this.dispatch(this.opts, this) + } catch (err) { + this.handler.onError(err) + } + } + } +} - if (socketTimeout !== undefined) { - throw new InvalidArgumentError('unsupported socketTimeout, use headersTimeout & bodyTimeout instead') - } +module.exports = RetryHandler - if (requestTimeout !== undefined) { - throw new InvalidArgumentError('unsupported requestTimeout, use headersTimeout & bodyTimeout instead') - } - if (idleTimeout !== undefined) { - throw new InvalidArgumentError('unsupported idleTimeout, use keepAliveTimeout instead') - } +/***/ }), - if (maxKeepAliveTimeout !== undefined) { - throw new InvalidArgumentError('unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead') - } +/***/ 8861: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError('invalid maxHeaderSize') - } +"use strict"; - if (socketPath != null && typeof socketPath !== 'string') { - throw new InvalidArgumentError('invalid socketPath') - } - if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { - throw new InvalidArgumentError('invalid connectTimeout') - } +const RedirectHandler = __nccwpck_require__(2860) - if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { - throw new InvalidArgumentError('invalid keepAliveTimeout') - } +function createRedirectInterceptor ({ maxRedirections: defaultMaxRedirections }) { + return (dispatch) => { + return function Intercept (opts, handler) { + const { maxRedirections = defaultMaxRedirections } = opts - if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { - throw new InvalidArgumentError('invalid keepAliveMaxTimeout') - } + if (!maxRedirections) { + return dispatch(opts, handler) + } - if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { - throw new InvalidArgumentError('invalid keepAliveTimeoutThreshold') - } + const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler) + opts = { ...opts, maxRedirections: 0 } // Stop sub dispatcher from also redirecting. + return dispatch(opts, redirectHandler) + } + } +} - if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError('headersTimeout must be a positive integer or zero') - } +module.exports = createRedirectInterceptor - if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError('bodyTimeout must be a positive integer or zero') - } - if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { - throw new InvalidArgumentError('connect must be a function or an object') - } +/***/ }), - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError('maxRedirections must be a positive number') - } +/***/ 953: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { - throw new InvalidArgumentError('maxRequestsPerClient must be a positive number') - } +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0; +const utils_1 = __nccwpck_require__(1891); +// C headers +var ERROR; +(function (ERROR) { + ERROR[ERROR["OK"] = 0] = "OK"; + ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL"; + ERROR[ERROR["STRICT"] = 2] = "STRICT"; + ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED"; + ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; + ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; + ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD"; + ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL"; + ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; + ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION"; + ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; + ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; + ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; + ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS"; + ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; + ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; + ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; + ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; + ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; + ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; + ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; + ERROR[ERROR["PAUSED"] = 21] = "PAUSED"; + ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; + ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; + ERROR[ERROR["USER"] = 24] = "USER"; +})(ERROR = exports.ERROR || (exports.ERROR = {})); +var TYPE; +(function (TYPE) { + TYPE[TYPE["BOTH"] = 0] = "BOTH"; + TYPE[TYPE["REQUEST"] = 1] = "REQUEST"; + TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE"; +})(TYPE = exports.TYPE || (exports.TYPE = {})); +var FLAGS; +(function (FLAGS) { + FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; + FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; + FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; + FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED"; + FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE"; + FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; + FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY"; + FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING"; + // 1 << 8 is unused + FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; +})(FLAGS = exports.FLAGS || (exports.FLAGS = {})); +var LENIENT_FLAGS; +(function (LENIENT_FLAGS) { + LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS"; + LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; + LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; +})(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {})); +var METHODS; +(function (METHODS) { + METHODS[METHODS["DELETE"] = 0] = "DELETE"; + METHODS[METHODS["GET"] = 1] = "GET"; + METHODS[METHODS["HEAD"] = 2] = "HEAD"; + METHODS[METHODS["POST"] = 3] = "POST"; + METHODS[METHODS["PUT"] = 4] = "PUT"; + /* pathological */ + METHODS[METHODS["CONNECT"] = 5] = "CONNECT"; + METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS"; + METHODS[METHODS["TRACE"] = 7] = "TRACE"; + /* WebDAV */ + METHODS[METHODS["COPY"] = 8] = "COPY"; + METHODS[METHODS["LOCK"] = 9] = "LOCK"; + METHODS[METHODS["MKCOL"] = 10] = "MKCOL"; + METHODS[METHODS["MOVE"] = 11] = "MOVE"; + METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND"; + METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH"; + METHODS[METHODS["SEARCH"] = 14] = "SEARCH"; + METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK"; + METHODS[METHODS["BIND"] = 16] = "BIND"; + METHODS[METHODS["REBIND"] = 17] = "REBIND"; + METHODS[METHODS["UNBIND"] = 18] = "UNBIND"; + METHODS[METHODS["ACL"] = 19] = "ACL"; + /* subversion */ + METHODS[METHODS["REPORT"] = 20] = "REPORT"; + METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY"; + METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT"; + METHODS[METHODS["MERGE"] = 23] = "MERGE"; + /* upnp */ + METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH"; + METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY"; + METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE"; + METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; + /* RFC-5789 */ + METHODS[METHODS["PATCH"] = 28] = "PATCH"; + METHODS[METHODS["PURGE"] = 29] = "PURGE"; + /* CalDAV */ + METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR"; + /* RFC-2068, section 19.6.1.2 */ + METHODS[METHODS["LINK"] = 31] = "LINK"; + METHODS[METHODS["UNLINK"] = 32] = "UNLINK"; + /* icecast */ + METHODS[METHODS["SOURCE"] = 33] = "SOURCE"; + /* RFC-7540, section 11.6 */ + METHODS[METHODS["PRI"] = 34] = "PRI"; + /* RFC-2326 RTSP */ + METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE"; + METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE"; + METHODS[METHODS["SETUP"] = 37] = "SETUP"; + METHODS[METHODS["PLAY"] = 38] = "PLAY"; + METHODS[METHODS["PAUSE"] = 39] = "PAUSE"; + METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN"; + METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER"; + METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER"; + METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT"; + METHODS[METHODS["RECORD"] = 44] = "RECORD"; + /* RAOP */ + METHODS[METHODS["FLUSH"] = 45] = "FLUSH"; +})(METHODS = exports.METHODS || (exports.METHODS = {})); +exports.METHODS_HTTP = [ + METHODS.DELETE, + METHODS.GET, + METHODS.HEAD, + METHODS.POST, + METHODS.PUT, + METHODS.CONNECT, + METHODS.OPTIONS, + METHODS.TRACE, + METHODS.COPY, + METHODS.LOCK, + METHODS.MKCOL, + METHODS.MOVE, + METHODS.PROPFIND, + METHODS.PROPPATCH, + METHODS.SEARCH, + METHODS.UNLOCK, + METHODS.BIND, + METHODS.REBIND, + METHODS.UNBIND, + METHODS.ACL, + METHODS.REPORT, + METHODS.MKACTIVITY, + METHODS.CHECKOUT, + METHODS.MERGE, + METHODS['M-SEARCH'], + METHODS.NOTIFY, + METHODS.SUBSCRIBE, + METHODS.UNSUBSCRIBE, + METHODS.PATCH, + METHODS.PURGE, + METHODS.MKCALENDAR, + METHODS.LINK, + METHODS.UNLINK, + METHODS.PRI, + // TODO(indutny): should we allow it with HTTP? + METHODS.SOURCE, +]; +exports.METHODS_ICE = [ + METHODS.SOURCE, +]; +exports.METHODS_RTSP = [ + METHODS.OPTIONS, + METHODS.DESCRIBE, + METHODS.ANNOUNCE, + METHODS.SETUP, + METHODS.PLAY, + METHODS.PAUSE, + METHODS.TEARDOWN, + METHODS.GET_PARAMETER, + METHODS.SET_PARAMETER, + METHODS.REDIRECT, + METHODS.RECORD, + METHODS.FLUSH, + // For AirPlay + METHODS.GET, + METHODS.POST, +]; +exports.METHOD_MAP = utils_1.enumToMap(METHODS); +exports.H_METHOD_MAP = {}; +Object.keys(exports.METHOD_MAP).forEach((key) => { + if (/^H/.test(key)) { + exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key]; + } +}); +var FINISH; +(function (FINISH) { + FINISH[FINISH["SAFE"] = 0] = "SAFE"; + FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; + FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE"; +})(FINISH = exports.FINISH || (exports.FINISH = {})); +exports.ALPHA = []; +for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) { + // Upper case + exports.ALPHA.push(String.fromCharCode(i)); + // Lower case + exports.ALPHA.push(String.fromCharCode(i + 0x20)); +} +exports.NUM_MAP = { + 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, + 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, +}; +exports.HEX_MAP = { + 0: 0, 1: 1, 2: 2, 3: 3, 4: 4, + 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, + A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF, + a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf, +}; +exports.NUM = [ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', +]; +exports.ALPHANUM = exports.ALPHA.concat(exports.NUM); +exports.MARK = ['-', '_', '.', '!', '~', '*', '\'', '(', ')']; +exports.USERINFO_CHARS = exports.ALPHANUM + .concat(exports.MARK) + .concat(['%', ';', ':', '&', '=', '+', '$', ',']); +// TODO(indutny): use RFC +exports.STRICT_URL_CHAR = [ + '!', '"', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + ':', ';', '<', '=', '>', + '@', '[', '\\', ']', '^', '_', + '`', + '{', '|', '}', '~', +].concat(exports.ALPHANUM); +exports.URL_CHAR = exports.STRICT_URL_CHAR + .concat(['\t', '\f']); +// All characters with 0x80 bit set to 1 +for (let i = 0x80; i <= 0xff; i++) { + exports.URL_CHAR.push(i); +} +exports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']); +/* Tokens as defined by rfc 2616. Also lowercases them. + * token = 1* + * separators = "(" | ")" | "<" | ">" | "@" + * | "," | ";" | ":" | "\" | <"> + * | "/" | "[" | "]" | "?" | "=" + * | "{" | "}" | SP | HT + */ +exports.STRICT_TOKEN = [ + '!', '#', '$', '%', '&', '\'', + '*', '+', '-', '.', + '^', '_', '`', + '|', '~', +].concat(exports.ALPHANUM); +exports.TOKEN = exports.STRICT_TOKEN.concat([' ']); +/* + * Verify that a char is a valid visible (printable) US-ASCII + * character or %x80-FF + */ +exports.HEADER_CHARS = ['\t']; +for (let i = 32; i <= 255; i++) { + if (i !== 127) { + exports.HEADER_CHARS.push(i); + } +} +// ',' = \x44 +exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44); +exports.MAJOR = exports.NUM_MAP; +exports.MINOR = exports.MAJOR; +var HEADER_STATE; +(function (HEADER_STATE) { + HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL"; + HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION"; + HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; + HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; + HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE"; + HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; + HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; + HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; + HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; +})(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {})); +exports.SPECIAL_HEADERS = { + 'connection': HEADER_STATE.CONNECTION, + 'content-length': HEADER_STATE.CONTENT_LENGTH, + 'proxy-connection': HEADER_STATE.CONNECTION, + 'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING, + 'upgrade': HEADER_STATE.UPGRADE, +}; +//# sourceMappingURL=constants.js.map - if (localAddress != null && (typeof localAddress !== 'string' || net.isIP(localAddress) === 0)) { - throw new InvalidArgumentError('localAddress must be valid string IP address') - } +/***/ }), - if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { - throw new InvalidArgumentError('maxResponseSize must be a positive number') - } +/***/ 1145: +/***/ ((module) => { - if ( - autoSelectFamilyAttemptTimeout != null && - (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1) - ) { - throw new InvalidArgumentError('autoSelectFamilyAttemptTimeout must be a positive number') - } +module.exports = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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ADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwHLAcoBuAHJAbkByAG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAQDcAQtBACEQDMYBC0EOIRAMxQELQQ0hEAzEAQtBDyEQDMMBC0EQIRAMwgELQRMhEAzBAQtBFCEQDMABC0EVIRAMvwELQRYhEAy+AQtBFyEQDL0BC0EYIRAMvAELQRkhEAy7AQtBGiEQDLoBC0EbIRAMuQELQRwhEAy4AQtBCCEQDLcBC0EdIRAMtgELQSAhEAy1AQtBHyEQDLQBC0EHIRAMswELQSEhEAyyAQtBIiEQDLEBC0EeIRAMsAELQSMhEAyvAQtBEiEQDK4BC0ERIRAMrQELQSQhEAysAQtBJSEQDKsBC0EmIRAMqgELQSchEAypAQtBwwEhEAyoAQtBKSEQDKcBC0ErIRAMpgELQSwhEAylAQtBLSEQDKQBC0EuIRAMowELQS8hEAyiAQtBxAEhEAyhAQtBMCEQDKABC0E0IRAMnwELQQwhEAyeAQtBMSEQDJ0BC0EyIRAMnAELQTMhEAybAQtBOSEQDJoBC0E1IRAMmQELQcUBIRAMmAELQQshEAyXAQtBOiEQDJYBC0E2IRAMlQELQQohEAyUAQtBNyEQDJMBC0E4IRAMkgELQTwhEAyRAQtBOyEQDJABC0E9IRAMjwELQQkhEAyOAQtBKCEQDI0BC0E+IRAMjAELQT8hEAyLAQtBwAAhEAyKAQtBwQAhEAyJAQtBwgAhEAyIAQtBwwAhEAyHAQtBxAAhEAyGAQtBxQAhEAyFAQtBxgAhEAyEAQtBKiEQDIMBC0HHACEQDIIBC0HIACEQDIEBC0HJACEQDIABC0HKACEQDH8LQcsAIRAMfgtBzQAhEAx9C0HMACEQDHwLQc4AIRAMewtBzwAhEAx6C0HQACEQDHkLQdEAIRAMeAtB0gAhEAx3C0HTACEQDHYLQdQAIRAMdQtB1gAhEAx0C0HVACEQDHMLQQYhEAxyC0HXACEQDHELQQUhEAxwC0HYACEQDG8LQQQhEAxuC0HZACEQDG0LQdoAIRAMbAtB2wAhEAxrC0HcACEQDGoLQQMhEAxpC0HdACEQDGgLQd4AIRAMZwtB3wAhEAxmC0HhACEQDGULQeAAIRAMZAtB4gAhEAxjC0HjACEQDGILQQIhEAxhC0HkACEQDGALQeUAIRAMXwtB5gAhEAxeC0HnACEQDF0LQegAIRAMXAtB6QAhEAxbC0HqACEQDFoLQesAIRAMWQtB7AAhEAxYC0HtACEQDFcLQe4AIRAMVgtB7wAhEAxVC0HwACEQDFQLQfEAIRAMUwtB8gAhEAxSC0HzACEQDFELQfQAIRAMUAtB9QAhEAxPC0H2ACEQDE4LQfcAIRAMTQtB+AAhEAxMC0H5ACEQDEsLQfoAIRAMSgtB+wAhEAxJC0H8ACEQDEgLQf0AIRAMRwtB/gAhEAxGC0H/ACEQDEULQYABIRAMRAtBgQEhEAxDC0GCASEQDEILQYMBIRAMQQtBhAEhEAxAC0GFASEQDD8LQYYBIRAMPgtBhwEhEAw9C0GIASEQDDwLQYkBIRAMOwtBigEhEAw6C0GLASEQDDkLQYwBIRAMOAtBjQEhEAw3C0GOASEQDDYLQY8BIRAMNQtBkAEhEAw0C0GRASEQDDMLQZIBIRAMMgtBkwEhEAwxC0GUASEQDDALQZUBIRAMLwtBlgEhEAwuC0GXASEQDC0LQZgBIRAMLAtBmQEhEAwrC0GaASEQDCoLQZsBIRAMKQtBnAEhEAwoC0GdASEQDCcLQZ4BIRAMJgtBnwEhEAwlC0GgASEQDCQLQaEBIRAMIwtBogEhEAwiC0GjASEQDCELQaQBIRAMIAtBpQEhEAwfC0GmASEQDB4LQacBIRAMHQtBqAEhEAwcC0GpASEQDBsLQaoBIRAMGgtBqwEhEAwZC0GsASEQDBgLQa0BIRAMFwtBrgEhEAwWC0EBIRAMFQtBrwEhEAwUC0GwASEQDBMLQbEBIRAMEgtBswEhEAwRC0GyASEQDBALQbQBIRAMDwtBtQEhEAwOC0G2ASEQDA0LQbcBIRAMDAtBuAEhEAwLC0G5ASEQDAoLQboBIRAMCQtBuwEhEAwIC0HGASEQDAcLQbwBIRAMBgtBvQEhEAwFC0G+ASEQDAQLQb8BIRAMAwtBwAEhEAwCC0HCASEQDAELQcEBIRALA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8=' - // h2 - if (allowH2 != null && typeof allowH2 !== 'boolean') { - throw new InvalidArgumentError('allowH2 must be a valid boolean value') - } - if (maxConcurrentStreams != null && (typeof maxConcurrentStreams !== 'number' || maxConcurrentStreams < 1)) { - throw new InvalidArgumentError('maxConcurrentStreams must be a possitive integer, greater than 0') - } +/***/ }), - if (typeof connect !== 'function') { - connect = buildConnector({ - ...tls, - maxCachedSessions, - allowH2, - socketPath, - timeout: connectTimeout, - ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), - ...connect - }) - } +/***/ 5627: +/***/ ((module) => { - this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) - ? interceptors.Client - : [createRedirectInterceptor({ maxRedirections })] - this[kUrl] = util.parseOrigin(url) - this[kConnector] = connect - this[kSocket] = null - this[kPipelining] = pipelining != null ? pipelining : 1 - this[kMaxHeadersSize] = maxHeaderSize || http.maxHeaderSize - this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout - this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 600e3 : keepAliveMaxTimeout - this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold - this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout] - this[kServerName] = null - this[kLocalAddress] = localAddress != null ? localAddress : null - this[kResuming] = 0 // 0, idle, 1, scheduled, 2 resuming - this[kNeedDrain] = 0 // 0, idle, 1, scheduled, 2 resuming - this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}\r\n` - this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 300e3 - this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 300e3 - this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength - this[kMaxRedirections] = maxRedirections - this[kMaxRequests] = maxRequestsPerClient - this[kClosedResolve] = null - this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1 - this[kHTTPConnVersion] = 'h1' - - // HTTP/2 - this[kHTTP2Session] = null - this[kHTTP2SessionState] = !allowH2 - ? null - : { - // streams: null, // Fixed queue of streams - For future support of `push` - openStreams: 0, // Keep track of them to decide wether or not unref the session - maxConcurrentStreams: maxConcurrentStreams != null ? maxConcurrentStreams : 100 // Max peerConcurrentStreams for a Node h2 server - } - this[kHost] = `${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ''}` - - // kQueue is built up of 3 sections separated by - // the kRunningIdx and kPendingIdx indices. - // | complete | running | pending | - // ^ kRunningIdx ^ kPendingIdx ^ kQueue.length - // kRunningIdx points to the first running element. - // kPendingIdx points to the first pending element. - // This implements a fast queue with an amortized - // time of O(1). - - this[kQueue] = [] - this[kRunningIdx] = 0 - this[kPendingIdx] = 0 - } +module.exports = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQID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YWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw==' - get pipelining() { - return this[kPipelining] - } - set pipelining(value) { - this[kPipelining] = value - resume(this, true) - } +/***/ }), - get [kPending]() { - return this[kQueue].length - this[kPendingIdx] - } +/***/ 1891: +/***/ ((__unused_webpack_module, exports) => { - get [kRunning]() { - return this[kPendingIdx] - this[kRunningIdx] - } +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.enumToMap = void 0; +function enumToMap(obj) { + const res = {}; + Object.keys(obj).forEach((key) => { + const value = obj[key]; + if (typeof value === 'number') { + res[key] = value; + } + }); + return res; +} +exports.enumToMap = enumToMap; +//# sourceMappingURL=utils.js.map - get [kSize]() { - return this[kQueue].length - this[kRunningIdx] - } +/***/ }), - get [kConnected]() { - return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed - } +/***/ 6771: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - get [kBusy]() { - const socket = this[kSocket] - return ( - (socket && (socket[kReset] || socket[kWriting] || socket[kBlocking])) || - (this[kSize] >= (this[kPipelining] || 1)) || - this[kPending] > 0 - ) - } +"use strict"; + + +const { kClients } = __nccwpck_require__(2785) +const Agent = __nccwpck_require__(7890) +const { + kAgent, + kMockAgentSet, + kMockAgentGet, + kDispatches, + kIsMockActive, + kNetConnect, + kGetNetConnect, + kOptions, + kFactory +} = __nccwpck_require__(4347) +const MockClient = __nccwpck_require__(8687) +const MockPool = __nccwpck_require__(6193) +const { matchValue, buildMockOptions } = __nccwpck_require__(9323) +const { InvalidArgumentError, UndiciError } = __nccwpck_require__(8045) +const Dispatcher = __nccwpck_require__(412) +const Pluralizer = __nccwpck_require__(8891) +const PendingInterceptorsFormatter = __nccwpck_require__(6823) + +class FakeWeakRef { + constructor (value) { + this.value = value + } + + deref () { + return this.value + } +} - /* istanbul ignore: only used for test */ - [kConnect](cb) { - connect(this) - this.once('connect', cb) - } +class MockAgent extends Dispatcher { + constructor (opts) { + super(opts) + + this[kNetConnect] = true + this[kIsMockActive] = true + + // Instantiate Agent and encapsulate + if ((opts && opts.agent && typeof opts.agent.dispatch !== 'function')) { + throw new InvalidArgumentError('Argument opts.agent must implement Agent') + } + const agent = opts && opts.agent ? opts.agent : new Agent(opts) + this[kAgent] = agent + + this[kClients] = agent[kClients] + this[kOptions] = buildMockOptions(opts) + } + + get (origin) { + let dispatcher = this[kMockAgentGet](origin) + + if (!dispatcher) { + dispatcher = this[kFactory](origin) + this[kMockAgentSet](origin, dispatcher) + } + return dispatcher + } + + dispatch (opts, handler) { + // Call MockAgent.get to perform additional setup before dispatching as normal + this.get(opts.origin) + return this[kAgent].dispatch(opts, handler) + } + + async close () { + await this[kAgent].close() + this[kClients].clear() + } + + deactivate () { + this[kIsMockActive] = false + } + + activate () { + this[kIsMockActive] = true + } + + enableNetConnect (matcher) { + if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) { + if (Array.isArray(this[kNetConnect])) { + this[kNetConnect].push(matcher) + } else { + this[kNetConnect] = [matcher] + } + } else if (typeof matcher === 'undefined') { + this[kNetConnect] = true + } else { + throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.') + } + } + + disableNetConnect () { + this[kNetConnect] = false + } + + // This is required to bypass issues caused by using global symbols - see: + // https://github.com/nodejs/undici/issues/1447 + get isMockActive () { + return this[kIsMockActive] + } + + [kMockAgentSet] (origin, dispatcher) { + this[kClients].set(origin, new FakeWeakRef(dispatcher)) + } + + [kFactory] (origin) { + const mockOptions = Object.assign({ agent: this }, this[kOptions]) + return this[kOptions] && this[kOptions].connections === 1 + ? new MockClient(origin, mockOptions) + : new MockPool(origin, mockOptions) + } + + [kMockAgentGet] (origin) { + // First check if we can immediately find it + const ref = this[kClients].get(origin) + if (ref) { + return ref.deref() + } + + // If the origin is not a string create a dummy parent pool and return to user + if (typeof origin !== 'string') { + const dispatcher = this[kFactory]('http://localhost:9999') + this[kMockAgentSet](origin, dispatcher) + return dispatcher + } + + // If we match, create a pool and assign the same dispatches + for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { + const nonExplicitDispatcher = nonExplicitRef.deref() + if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) { + const dispatcher = this[kFactory](origin) + this[kMockAgentSet](origin, dispatcher) + dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches] + return dispatcher + } + } + } + + [kGetNetConnect] () { + return this[kNetConnect] + } + + pendingInterceptors () { + const mockAgentClients = this[kClients] + + return Array.from(mockAgentClients.entries()) + .flatMap(([origin, scope]) => scope.deref()[kDispatches].map(dispatch => ({ ...dispatch, origin }))) + .filter(({ pending }) => pending) + } + + assertNoPendingInterceptors ({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) { + const pending = this.pendingInterceptors() + + if (pending.length === 0) { + return + } + + const pluralizer = new Pluralizer('interceptor', 'interceptors').pluralize(pending.length) + + throw new UndiciError(` +${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: - [kDispatch](opts, handler) { - const origin = opts.origin || this[kUrl].origin - - const request = this[kHTTPConnVersion] === 'h2' - ? Request[kHTTP2BuildRequest](origin, opts, handler) - : Request[kHTTP1BuildRequest](origin, opts, handler) - - this[kQueue].push(request) - if (this[kResuming]) { - // Do nothing. - } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { - // Wait a tick in case stream/iterator is ended in the same tick. - this[kResuming] = 1 - process.nextTick(resume, this) - } else { - resume(this, true) - } +${pendingInterceptorsFormatter.format(pending)} +`.trim()) + } +} - if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { - this[kNeedDrain] = 2 - } +module.exports = MockAgent - return this[kNeedDrain] < 2 - } - async [kClose]() { - // TODO: for H2 we need to gracefully flush the remaining enqueued - // request and close each stream. - return new Promise((resolve) => { - if (!this[kSize]) { - resolve(null) - } else { - this[kClosedResolve] = resolve - } - }) - } +/***/ }), - async [kDestroy](err) { - return new Promise((resolve) => { - const requests = this[kQueue].splice(this[kPendingIdx]) - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - errorRequest(this, request, err) - } +/***/ 8687: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - const callback = () => { - if (this[kClosedResolve]) { - // TODO (fix): Should we error here with ClientDestroyedError? - this[kClosedResolve]() - this[kClosedResolve] = null - } - resolve() - } +"use strict"; + + +const { promisify } = __nccwpck_require__(3837) +const Client = __nccwpck_require__(3598) +const { buildMockDispatch } = __nccwpck_require__(9323) +const { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected +} = __nccwpck_require__(4347) +const { MockInterceptor } = __nccwpck_require__(410) +const Symbols = __nccwpck_require__(2785) +const { InvalidArgumentError } = __nccwpck_require__(8045) + +/** + * MockClient provides an API that extends the Client to influence the mockDispatches. + */ +class MockClient extends Client { + constructor (origin, opts) { + super(origin, opts) + + if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { + throw new InvalidArgumentError('Argument opts.agent must implement Agent') + } + + this[kMockAgent] = opts.agent + this[kOrigin] = origin + this[kDispatches] = [] + this[kConnected] = 1 + this[kOriginalDispatch] = this.dispatch + this[kOriginalClose] = this.close.bind(this) + + this.dispatch = buildMockDispatch.call(this) + this.close = this[kClose] + } + + get [Symbols.kConnected] () { + return this[kConnected] + } + + /** + * Sets up the base interceptor for mocking replies from undici. + */ + intercept (opts) { + return new MockInterceptor(opts, this[kDispatches]) + } + + async [kClose] () { + await promisify(this[kOriginalClose])() + this[kConnected] = 0 + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]) + } +} - if (this[kHTTP2Session] != null) { - util.destroy(this[kHTTP2Session], err) - this[kHTTP2Session] = null - this[kHTTP2SessionState] = null - } +module.exports = MockClient - if (!this[kSocket]) { - queueMicrotask(callback) - } else { - util.destroy(this[kSocket].on('close', callback), err) - } - resume(this) - }) - } - } +/***/ }), - function onHttp2SessionError(err) { - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') +/***/ 888: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - this[kSocket][kError] = err +"use strict"; - onError(this[kClient], err) - } - function onHttp2FrameError(type, code, id) { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`) +const { UndiciError } = __nccwpck_require__(8045) - if (id === 0) { - this[kSocket][kError] = err - onError(this[kClient], err) - } - } +class MockNotMatchedError extends UndiciError { + constructor (message) { + super(message) + Error.captureStackTrace(this, MockNotMatchedError) + this.name = 'MockNotMatchedError' + this.message = message || 'The request does not match any registered mock dispatches' + this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED' + } +} - function onHttp2SessionEnd() { - util.destroy(this, new SocketError('other side closed')) - util.destroy(this[kSocket], new SocketError('other side closed')) - } +module.exports = { + MockNotMatchedError +} - function onHTTP2GoAway(code) { - const client = this[kClient] - const err = new InformationalError(`HTTP/2: "GOAWAY" frame received with code ${code}`) - client[kSocket] = null - client[kHTTP2Session] = null - if (client.destroyed) { - assert(this[kPending] === 0) +/***/ }), - // Fail entire queue. - const requests = client[kQueue].splice(client[kRunningIdx]) - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - errorRequest(this, request, err) - } - } else if (client[kRunning] > 0) { - // Fail head of pipeline. - const request = client[kQueue][client[kRunningIdx]] - client[kQueue][client[kRunningIdx]++] = null +/***/ 410: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - errorRequest(client, request, err) - } +"use strict"; + + +const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(9323) +const { + kDispatches, + kDispatchKey, + kDefaultHeaders, + kDefaultTrailers, + kContentLength, + kMockDispatch +} = __nccwpck_require__(4347) +const { InvalidArgumentError } = __nccwpck_require__(8045) +const { buildURL } = __nccwpck_require__(3983) + +/** + * Defines the scope API for an interceptor reply + */ +class MockScope { + constructor (mockDispatch) { + this[kMockDispatch] = mockDispatch + } + + /** + * Delay a reply by a set amount in ms. + */ + delay (waitInMs) { + if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) { + throw new InvalidArgumentError('waitInMs must be a valid integer > 0') + } + + this[kMockDispatch].delay = waitInMs + return this + } + + /** + * For a defined reply, never mark as consumed. + */ + persist () { + this[kMockDispatch].persist = true + return this + } + + /** + * Allow one to define a reply for a set amount of matching requests. + */ + times (repeatTimes) { + if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { + throw new InvalidArgumentError('repeatTimes must be a valid integer > 0') + } + + this[kMockDispatch].times = repeatTimes + return this + } +} - client[kPendingIdx] = client[kRunningIdx] +/** + * Defines an interceptor for a Mock + */ +class MockInterceptor { + constructor (opts, mockDispatches) { + if (typeof opts !== 'object') { + throw new InvalidArgumentError('opts must be an object') + } + if (typeof opts.path === 'undefined') { + throw new InvalidArgumentError('opts.path must be defined') + } + if (typeof opts.method === 'undefined') { + opts.method = 'GET' + } + // See https://github.com/nodejs/undici/issues/1245 + // As per RFC 3986, clients are not supposed to send URI + // fragments to servers when they retrieve a document, + if (typeof opts.path === 'string') { + if (opts.query) { + opts.path = buildURL(opts.path, opts.query) + } else { + // Matches https://github.com/nodejs/undici/blob/main/lib/fetch/index.js#L1811 + const parsedURL = new URL(opts.path, 'data://') + opts.path = parsedURL.pathname + parsedURL.search + } + } + if (typeof opts.method === 'string') { + opts.method = opts.method.toUpperCase() + } + + this[kDispatchKey] = buildKey(opts) + this[kDispatches] = mockDispatches + this[kDefaultHeaders] = {} + this[kDefaultTrailers] = {} + this[kContentLength] = false + } + + createMockScopeDispatchData (statusCode, data, responseOptions = {}) { + const responseData = getResponseData(data) + const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {} + const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers } + const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers } + + return { statusCode, data, headers, trailers } + } + + validateReplyParameters (statusCode, data, responseOptions) { + if (typeof statusCode === 'undefined') { + throw new InvalidArgumentError('statusCode must be defined') + } + if (typeof data === 'undefined') { + throw new InvalidArgumentError('data must be defined') + } + if (typeof responseOptions !== 'object') { + throw new InvalidArgumentError('responseOptions must be an object') + } + } + + /** + * Mock an undici request with a defined reply. + */ + reply (replyData) { + // Values of reply aren't available right now as they + // can only be available when the reply callback is invoked. + if (typeof replyData === 'function') { + // We'll first wrap the provided callback in another function, + // this function will properly resolve the data from the callback + // when invoked. + const wrappedDefaultsCallback = (opts) => { + // Our reply options callback contains the parameter for statusCode, data and options. + const resolvedData = replyData(opts) + + // Check if it is in the right format + if (typeof resolvedData !== 'object') { + throw new InvalidArgumentError('reply options callback must return an object') + } + + const { statusCode, data = '', responseOptions = {} } = resolvedData + this.validateReplyParameters(statusCode, data, responseOptions) + // Since the values can be obtained immediately we return them + // from this higher order function that will be resolved later. + return { + ...this.createMockScopeDispatchData(statusCode, data, responseOptions) + } + } + + // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data. + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback) + return new MockScope(newMockDispatch) + } + + // We can have either one or three parameters, if we get here, + // we should have 1-3 parameters. So we spread the arguments of + // this function to obtain the parameters, since replyData will always + // just be the statusCode. + const [statusCode, data = '', responseOptions = {}] = [...arguments] + this.validateReplyParameters(statusCode, data, responseOptions) + + // Send in-already provided data like usual + const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions) + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData) + return new MockScope(newMockDispatch) + } + + /** + * Mock an undici request with a defined error. + */ + replyWithError (error) { + if (typeof error === 'undefined') { + throw new InvalidArgumentError('error must be defined') + } + + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error }) + return new MockScope(newMockDispatch) + } + + /** + * Set default reply headers on the interceptor for subsequent replies + */ + defaultReplyHeaders (headers) { + if (typeof headers === 'undefined') { + throw new InvalidArgumentError('headers must be defined') + } + + this[kDefaultHeaders] = headers + return this + } + + /** + * Set default reply trailers on the interceptor for subsequent replies + */ + defaultReplyTrailers (trailers) { + if (typeof trailers === 'undefined') { + throw new InvalidArgumentError('trailers must be defined') + } + + this[kDefaultTrailers] = trailers + return this + } + + /** + * Set reply content length header for replies on the interceptor + */ + replyContentLength () { + this[kContentLength] = true + return this + } +} - assert(client[kRunning] === 0) +module.exports.MockInterceptor = MockInterceptor +module.exports.MockScope = MockScope - client.emit('disconnect', - client[kUrl], - [client], - err - ) - resume(client) - } +/***/ }), - const constants = __nccwpck_require__(953) - const createRedirectInterceptor = __nccwpck_require__(8861) - const EMPTY_BUF = Buffer.alloc(0) +/***/ 6193: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - async function lazyllhttp() { - const llhttpWasmData = process.env.JEST_WORKER_ID ? __nccwpck_require__(1145) : undefined +"use strict"; + + +const { promisify } = __nccwpck_require__(3837) +const Pool = __nccwpck_require__(4634) +const { buildMockDispatch } = __nccwpck_require__(9323) +const { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected +} = __nccwpck_require__(4347) +const { MockInterceptor } = __nccwpck_require__(410) +const Symbols = __nccwpck_require__(2785) +const { InvalidArgumentError } = __nccwpck_require__(8045) + +/** + * MockPool provides an API that extends the Pool to influence the mockDispatches. + */ +class MockPool extends Pool { + constructor (origin, opts) { + super(origin, opts) + + if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') { + throw new InvalidArgumentError('Argument opts.agent must implement Agent') + } + + this[kMockAgent] = opts.agent + this[kOrigin] = origin + this[kDispatches] = [] + this[kConnected] = 1 + this[kOriginalDispatch] = this.dispatch + this[kOriginalClose] = this.close.bind(this) + + this.dispatch = buildMockDispatch.call(this) + this.close = this[kClose] + } + + get [Symbols.kConnected] () { + return this[kConnected] + } + + /** + * Sets up the base interceptor for mocking replies from undici. + */ + intercept (opts) { + return new MockInterceptor(opts, this[kDispatches]) + } + + async [kClose] () { + await promisify(this[kOriginalClose])() + this[kConnected] = 0 + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]) + } +} - let mod - try { - mod = await WebAssembly.compile(Buffer.from(__nccwpck_require__(5627), 'base64')) - } catch (e) { - /* istanbul ignore next */ - - // We could check if the error was caused by the simd option not - // being enabled, but the occurring of this other error - // * https://github.com/emscripten-core/emscripten/issues/11495 - // got me to remove that check to avoid breaking Node 12. - mod = await WebAssembly.compile(Buffer.from(llhttpWasmData || __nccwpck_require__(1145), 'base64')) - } +module.exports = MockPool - return await WebAssembly.instantiate(mod, { - env: { - /* eslint-disable camelcase */ - - wasm_on_url: (p, at, len) => { - /* istanbul ignore next */ - return 0 - }, - wasm_on_status: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p) - const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_message_begin: (p) => { - assert.strictEqual(currentParser.ptr, p) - return currentParser.onMessageBegin() || 0 - }, - wasm_on_header_field: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p) - const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_header_value: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p) - const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { - assert.strictEqual(currentParser.ptr, p) - return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0 - }, - wasm_on_body: (p, at, len) => { - assert.strictEqual(currentParser.ptr, p) - const start = at - currentBufferPtr + currentBufferRef.byteOffset - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0 - }, - wasm_on_message_complete: (p) => { - assert.strictEqual(currentParser.ptr, p) - return currentParser.onMessageComplete() || 0 - } - /* eslint-enable camelcase */ - } - }) - } +/***/ }), - let llhttpInstance = null - let llhttpPromise = lazyllhttp() - llhttpPromise.catch() - - let currentParser = null - let currentBufferRef = null - let currentBufferSize = 0 - let currentBufferPtr = null - - const TIMEOUT_HEADERS = 1 - const TIMEOUT_BODY = 2 - const TIMEOUT_IDLE = 3 - - class Parser { - constructor(client, socket, { exports }) { - assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0) - - this.llhttp = exports - this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE) - this.client = client - this.socket = socket - this.timeout = null - this.timeoutValue = null - this.timeoutType = null - this.statusCode = null - this.statusText = '' - this.upgrade = false - this.headers = [] - this.headersSize = 0 - this.headersMaxSize = client[kMaxHeadersSize] - this.shouldKeepAlive = false - this.paused = false - this.resume = this.resume.bind(this) - - this.bytesRead = 0 - - this.keepAlive = '' - this.contentLength = '' - this.connection = '' - this.maxResponseSize = client[kMaxResponseSize] - } +/***/ 4347: +/***/ ((module) => { - setTimeout(value, type) { - this.timeoutType = type - if (value !== this.timeoutValue) { - timers.clearTimeout(this.timeout) - if (value) { - this.timeout = timers.setTimeout(onParserTimeout, value, this) - // istanbul ignore else: only for jest - if (this.timeout.unref) { - this.timeout.unref() - } - } else { - this.timeout = null - } - this.timeoutValue = value - } else if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh() - } - } - } +"use strict"; + + +module.exports = { + kAgent: Symbol('agent'), + kOptions: Symbol('options'), + kFactory: Symbol('factory'), + kDispatches: Symbol('dispatches'), + kDispatchKey: Symbol('dispatch key'), + kDefaultHeaders: Symbol('default headers'), + kDefaultTrailers: Symbol('default trailers'), + kContentLength: Symbol('content length'), + kMockAgent: Symbol('mock agent'), + kMockAgentSet: Symbol('mock agent set'), + kMockAgentGet: Symbol('mock agent get'), + kMockDispatch: Symbol('mock dispatch'), + kClose: Symbol('close'), + kOriginalClose: Symbol('original agent close'), + kOrigin: Symbol('origin'), + kIsMockActive: Symbol('is mock active'), + kNetConnect: Symbol('net connect'), + kGetNetConnect: Symbol('get net connect'), + kConnected: Symbol('connected') +} - resume() { - if (this.socket.destroyed || !this.paused) { - return - } - assert(this.ptr != null) - assert(currentParser == null) +/***/ }), - this.llhttp.llhttp_resume(this.ptr) +/***/ 9323: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - assert(this.timeoutType === TIMEOUT_BODY) - if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh() - } - } +"use strict"; + + +const { MockNotMatchedError } = __nccwpck_require__(888) +const { + kDispatches, + kMockAgent, + kOriginalDispatch, + kOrigin, + kGetNetConnect +} = __nccwpck_require__(4347) +const { buildURL, nop } = __nccwpck_require__(3983) +const { STATUS_CODES } = __nccwpck_require__(3685) +const { + types: { + isPromise + } +} = __nccwpck_require__(3837) + +function matchValue (match, value) { + if (typeof match === 'string') { + return match === value + } + if (match instanceof RegExp) { + return match.test(value) + } + if (typeof match === 'function') { + return match(value) === true + } + return false +} - this.paused = false - this.execute(this.socket.read() || EMPTY_BUF) // Flush parser. - this.readMore() - } +function lowerCaseEntries (headers) { + return Object.fromEntries( + Object.entries(headers).map(([headerName, headerValue]) => { + return [headerName.toLocaleLowerCase(), headerValue] + }) + ) +} - readMore() { - while (!this.paused && this.ptr) { - const chunk = this.socket.read() - if (chunk === null) { - break - } - this.execute(chunk) - } - } +/** + * @param {import('../../index').Headers|string[]|Record} headers + * @param {string} key + */ +function getHeaderByName (headers, key) { + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { + return headers[i + 1] + } + } + + return undefined + } else if (typeof headers.get === 'function') { + return headers.get(key) + } else { + return lowerCaseEntries(headers)[key.toLocaleLowerCase()] + } +} - execute(data) { - assert(this.ptr != null) - assert(currentParser == null) - assert(!this.paused) +/** @param {string[]} headers */ +function buildHeadersFromArray (headers) { // fetch HeadersList + const clone = headers.slice() + const entries = [] + for (let index = 0; index < clone.length; index += 2) { + entries.push([clone[index], clone[index + 1]]) + } + return Object.fromEntries(entries) +} - const { socket, llhttp } = this +function matchHeaders (mockDispatch, headers) { + if (typeof mockDispatch.headers === 'function') { + if (Array.isArray(headers)) { // fetch HeadersList + headers = buildHeadersFromArray(headers) + } + return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {}) + } + if (typeof mockDispatch.headers === 'undefined') { + return true + } + if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') { + return false + } + + for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) { + const headerValue = getHeaderByName(headers, matchHeaderName) + + if (!matchValue(matchHeaderValue, headerValue)) { + return false + } + } + return true +} - if (data.length > currentBufferSize) { - if (currentBufferPtr) { - llhttp.free(currentBufferPtr) - } - currentBufferSize = Math.ceil(data.length / 4096) * 4096 - currentBufferPtr = llhttp.malloc(currentBufferSize) - } +function safeUrl (path) { + if (typeof path !== 'string') { + return path + } - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data) - - // Call `execute` on the wasm parser. - // We pass the `llhttp_parser` pointer address, the pointer address of buffer view data, - // and finally the length of bytes to parse. - // The return value is an error code or `constants.ERROR.OK`. - try { - let ret - - try { - currentBufferRef = data - currentParser = this - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length) - /* eslint-disable-next-line no-useless-catch */ - } catch (err) { - /* istanbul ignore next: difficult to make a test case for */ - throw err - } finally { - currentParser = null - currentBufferRef = null - } + const pathSegments = path.split('?') - const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr - - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)) - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true - socket.unshift(data.slice(offset)) - } else if (ret !== constants.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr) - let message = '' - /* istanbul ignore else: difficult to make a test case for */ - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0) - message = - 'Response does not match the HTTP/1.1 protocol (' + - Buffer.from(llhttp.memory.buffer, ptr, len).toString() + - ')' - } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)) - } - } catch (err) { - util.destroy(socket, err) - } - } + if (pathSegments.length !== 2) { + return path + } - destroy() { - assert(this.ptr != null) - assert(currentParser == null) + const qp = new URLSearchParams(pathSegments.pop()) + qp.sort() + return [...pathSegments, qp.toString()].join('?') +} - this.llhttp.llhttp_free(this.ptr) - this.ptr = null +function matchKey (mockDispatch, { path, method, body, headers }) { + const pathMatch = matchValue(mockDispatch.path, path) + const methodMatch = matchValue(mockDispatch.method, method) + const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true + const headersMatch = matchHeaders(mockDispatch, headers) + return pathMatch && methodMatch && bodyMatch && headersMatch +} - timers.clearTimeout(this.timeout) - this.timeout = null - this.timeoutValue = null - this.timeoutType = null +function getResponseData (data) { + if (Buffer.isBuffer(data)) { + return data + } else if (typeof data === 'object') { + return JSON.stringify(data) + } else { + return data.toString() + } +} - this.paused = false - } +function getMockDispatch (mockDispatches, key) { + const basePath = key.query ? buildURL(key.path, key.query) : key.path + const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath + + // Match path + let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)) + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`) + } + + // Match method + matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)) + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`) + } + + // Match body + matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true) + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`) + } + + // Match headers + matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers)) + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers}'`) + } + + return matchedMockDispatches[0] +} - onStatus(buf) { - this.statusText = buf.toString() - } +function addMockDispatch (mockDispatches, key, data) { + const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false } + const replyData = typeof data === 'function' ? { callback: data } : { ...data } + const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } } + mockDispatches.push(newMockDispatch) + return newMockDispatch +} - onMessageBegin() { - const { socket, client } = this +function deleteMockDispatch (mockDispatches, key) { + const index = mockDispatches.findIndex(dispatch => { + if (!dispatch.consumed) { + return false + } + return matchKey(dispatch, key) + }) + if (index !== -1) { + mockDispatches.splice(index, 1) + } +} - /* istanbul ignore next: difficult to make a test case for */ - if (socket.destroyed) { - return -1 - } +function buildKey (opts) { + const { path, method, body, headers, query } = opts + return { + path, + method, + body, + headers, + query + } +} - const request = client[kQueue][client[kRunningIdx]] - if (!request) { - return -1 - } - } +function generateKeyValues (data) { + return Object.entries(data).reduce((keyValuePairs, [key, value]) => [ + ...keyValuePairs, + Buffer.from(`${key}`), + Array.isArray(value) ? value.map(x => Buffer.from(`${x}`)) : Buffer.from(`${value}`) + ], []) +} - onHeaderField(buf) { - const len = this.headers.length +/** + * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status + * @param {number} statusCode + */ +function getStatusText (statusCode) { + return STATUS_CODES[statusCode] || 'unknown' +} - if ((len & 1) === 0) { - this.headers.push(buf) - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]) - } +async function getResponse (body) { + const buffers = [] + for await (const data of body) { + buffers.push(data) + } + return Buffer.concat(buffers).toString('utf8') +} - this.trackHeader(buf.length) - } +/** + * Mock dispatch function used to simulate undici dispatches + */ +function mockDispatch (opts, handler) { + // Get mock dispatch from built key + const key = buildKey(opts) + const mockDispatch = getMockDispatch(this[kDispatches], key) + + mockDispatch.timesInvoked++ + + // Here's where we resolve a callback if a callback is present for the dispatch data. + if (mockDispatch.data.callback) { + mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) } + } + + // Parse mockDispatch data + const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch + const { timesInvoked, times } = mockDispatch + + // If it's used up and not persistent, mark as consumed + mockDispatch.consumed = !persist && timesInvoked >= times + mockDispatch.pending = timesInvoked < times + + // If specified, trigger dispatch error + if (error !== null) { + deleteMockDispatch(this[kDispatches], key) + handler.onError(error) + return true + } + + // Handle the request with a delay if necessary + if (typeof delay === 'number' && delay > 0) { + setTimeout(() => { + handleReply(this[kDispatches]) + }, delay) + } else { + handleReply(this[kDispatches]) + } + + function handleReply (mockDispatches, _data = data) { + // fetch's HeadersList is a 1D string array + const optsHeaders = Array.isArray(opts.headers) + ? buildHeadersFromArray(opts.headers) + : opts.headers + const body = typeof _data === 'function' + ? _data({ ...opts, headers: optsHeaders }) + : _data + + // util.types.isPromise is likely needed for jest. + if (isPromise(body)) { + // If handleReply is asynchronous, throwing an error + // in the callback will reject the promise, rather than + // synchronously throw the error, which breaks some tests. + // Rather, we wait for the callback to resolve if it is a + // promise, and then re-run handleReply with the new body. + body.then((newData) => handleReply(mockDispatches, newData)) + return + } + + const responseData = getResponseData(body) + const responseHeaders = generateKeyValues(headers) + const responseTrailers = generateKeyValues(trailers) + + handler.abort = nop + handler.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)) + handler.onData(Buffer.from(responseData)) + handler.onComplete(responseTrailers) + deleteMockDispatch(mockDispatches, key) + } + + function resume () {} + + return true +} - onHeaderValue(buf) { - let len = this.headers.length +function buildMockDispatch () { + const agent = this[kMockAgent] + const origin = this[kOrigin] + const originalDispatch = this[kOriginalDispatch] + + return function dispatch (opts, handler) { + if (agent.isMockActive) { + try { + mockDispatch.call(this, opts, handler) + } catch (error) { + if (error instanceof MockNotMatchedError) { + const netConnect = agent[kGetNetConnect]() + if (netConnect === false) { + throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`) + } + if (checkNetConnect(netConnect, origin)) { + originalDispatch.call(this, opts, handler) + } else { + throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`) + } + } else { + throw error + } + } + } else { + originalDispatch.call(this, opts, handler) + } + } +} - if ((len & 1) === 1) { - this.headers.push(buf) - len += 1 - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]) - } +function checkNetConnect (netConnect, origin) { + const url = new URL(origin) + if (netConnect === true) { + return true + } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { + return true + } + return false +} - const key = this.headers[len - 2] - if (key.length === 10 && key.toString().toLowerCase() === 'keep-alive') { - this.keepAlive += buf.toString() - } else if (key.length === 10 && key.toString().toLowerCase() === 'connection') { - this.connection += buf.toString() - } else if (key.length === 14 && key.toString().toLowerCase() === 'content-length') { - this.contentLength += buf.toString() - } +function buildMockOptions (opts) { + if (opts) { + const { agent, ...mockOptions } = opts + return mockOptions + } +} - this.trackHeader(buf.length) - } +module.exports = { + getResponseData, + getMockDispatch, + addMockDispatch, + deleteMockDispatch, + buildKey, + generateKeyValues, + matchValue, + getResponse, + getStatusText, + mockDispatch, + buildMockDispatch, + checkNetConnect, + buildMockOptions, + getHeaderByName +} - trackHeader(len) { - this.headersSize += len - if (this.headersSize >= this.headersMaxSize) { - util.destroy(this.socket, new HeadersOverflowError()) - } - } - onUpgrade(head) { - const { upgrade, client, socket, headers, statusCode } = this +/***/ }), - assert(upgrade) +/***/ 6823: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - const request = client[kQueue][client[kRunningIdx]] - assert(request) +"use strict"; + + +const { Transform } = __nccwpck_require__(2781) +const { Console } = __nccwpck_require__(6206) + +/** + * Gets the output of `console.table(…)` as a string. + */ +module.exports = class PendingInterceptorsFormatter { + constructor ({ disableColors } = {}) { + this.transform = new Transform({ + transform (chunk, _enc, cb) { + cb(null, chunk) + } + }) + + this.logger = new Console({ + stdout: this.transform, + inspectOptions: { + colors: !disableColors && !process.env.CI + } + }) + } + + format (pendingInterceptors) { + const withPrettyHeaders = pendingInterceptors.map( + ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ + Method: method, + Origin: origin, + Path: path, + 'Status code': statusCode, + Persistent: persist ? '✅' : '❌', + Invocations: timesInvoked, + Remaining: persist ? Infinity : times - timesInvoked + })) + + this.logger.table(withPrettyHeaders) + return this.transform.read().toString() + } +} - assert(!socket.destroyed) - assert(socket === client[kSocket]) - assert(!this.paused) - assert(request.upgrade || request.method === 'CONNECT') - this.statusCode = null - this.statusText = '' - this.shouldKeepAlive = null +/***/ }), - assert(this.headers.length % 2 === 0) - this.headers = [] - this.headersSize = 0 +/***/ 8891: +/***/ ((module) => { - socket.unshift(head) +"use strict"; - socket[kParser].destroy() - socket[kParser] = null - socket[kClient] = null - socket[kError] = null - socket - .removeListener('error', onSocketError) - .removeListener('readable', onSocketReadable) - .removeListener('end', onSocketEnd) - .removeListener('close', onSocketClose) +const singulars = { + pronoun: 'it', + is: 'is', + was: 'was', + this: 'this' +} - client[kSocket] = null - client[kQueue][client[kRunningIdx]++] = null - client.emit('disconnect', client[kUrl], [client], new InformationalError('upgrade')) +const plurals = { + pronoun: 'they', + is: 'are', + was: 'were', + this: 'these' +} - try { - request.onUpgrade(statusCode, headers, socket) - } catch (err) { - util.destroy(socket, err) - } +module.exports = class Pluralizer { + constructor (singular, plural) { + this.singular = singular + this.plural = plural + } + + pluralize (count) { + const one = count === 1 + const keys = one ? singulars : plurals + const noun = one ? this.singular : this.plural + return { ...keys, count, noun } + } +} - resume(client) - } - onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { - const { client, socket, headers, statusText } = this +/***/ }), - /* istanbul ignore next: difficult to make a test case for */ - if (socket.destroyed) { - return -1 - } +/***/ 8266: +/***/ ((module) => { - const request = client[kQueue][client[kRunningIdx]] +"use strict"; +/* eslint-disable */ + + + +// Extracted from node/lib/internal/fixed_queue.js + +// Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two. +const kSize = 2048; +const kMask = kSize - 1; + +// The FixedQueue is implemented as a singly-linked list of fixed-size +// circular buffers. It looks something like this: +// +// head tail +// | | +// v v +// +-----------+ <-----\ +-----------+ <------\ +-----------+ +// | [null] | \----- | next | \------- | next | +// +-----------+ +-----------+ +-----------+ +// | item | <-- bottom | item | <-- bottom | [empty] | +// | item | | item | | [empty] | +// | item | | item | | [empty] | +// | item | | item | | [empty] | +// | item | | item | bottom --> | item | +// | item | | item | | item | +// | ... | | ... | | ... | +// | item | | item | | item | +// | item | | item | | item | +// | [empty] | <-- top | item | | item | +// | [empty] | | item | | item | +// | [empty] | | [empty] | <-- top top --> | [empty] | +// +-----------+ +-----------+ +-----------+ +// +// Or, if there is only one circular buffer, it looks something +// like either of these: +// +// head tail head tail +// | | | | +// v v v v +// +-----------+ +-----------+ +// | [null] | | [null] | +// +-----------+ +-----------+ +// | [empty] | | item | +// | [empty] | | item | +// | item | <-- bottom top --> | [empty] | +// | item | | [empty] | +// | [empty] | <-- top bottom --> | item | +// | [empty] | | item | +// +-----------+ +-----------+ +// +// Adding a value means moving `top` forward by one, removing means +// moving `bottom` forward by one. After reaching the end, the queue +// wraps around. +// +// When `top === bottom` the current queue is empty and when +// `top + 1 === bottom` it's full. This wastes a single space of storage +// but allows much quicker checks. + +class FixedCircularBuffer { + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize); + this.next = null; + } + + isEmpty() { + return this.top === this.bottom; + } + + isFull() { + return ((this.top + 1) & kMask) === this.bottom; + } + + push(data) { + this.list[this.top] = data; + this.top = (this.top + 1) & kMask; + } + + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === undefined) + return null; + this.list[this.bottom] = undefined; + this.bottom = (this.bottom + 1) & kMask; + return nextItem; + } +} - /* istanbul ignore next: difficult to make a test case for */ - if (!request) { - return -1 - } +module.exports = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer(); + } + + isEmpty() { + return this.head.isEmpty(); + } + + push(data) { + if (this.head.isFull()) { + // Head is full: Creates a new queue, sets the old queue's `.next` to it, + // and sets it as the new main queue. + this.head = this.head.next = new FixedCircularBuffer(); + } + this.head.push(data); + } + + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + // If there is another queue, it forms the new tail. + this.tail = tail.next; + } + return next; + } +}; - assert(!this.upgrade) - assert(this.statusCode < 200) - if (statusCode === 100) { - util.destroy(socket, new SocketError('bad response', util.getSocketInfo(socket))) - return -1 - } +/***/ }), - /* this can only happen if server is misbehaving */ - if (upgrade && !request.upgrade) { - util.destroy(socket, new SocketError('bad upgrade', util.getSocketInfo(socket))) - return -1 - } +/***/ 3198: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS) - - this.statusCode = statusCode - this.shouldKeepAlive = ( - shouldKeepAlive || - // Override llhttp value which does not allow keepAlive for HEAD. - (request.method === 'HEAD' && !socket[kReset] && this.connection.toLowerCase() === 'keep-alive') - ) - - if (this.statusCode >= 200) { - const bodyTimeout = request.bodyTimeout != null - ? request.bodyTimeout - : client[kBodyTimeout] - this.setTimeout(bodyTimeout, TIMEOUT_BODY) - } else if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh() - } - } +"use strict"; + + +const DispatcherBase = __nccwpck_require__(4839) +const FixedQueue = __nccwpck_require__(8266) +const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(2785) +const PoolStats = __nccwpck_require__(9689) + +const kClients = Symbol('clients') +const kNeedDrain = Symbol('needDrain') +const kQueue = Symbol('queue') +const kClosedResolve = Symbol('closed resolve') +const kOnDrain = Symbol('onDrain') +const kOnConnect = Symbol('onConnect') +const kOnDisconnect = Symbol('onDisconnect') +const kOnConnectionError = Symbol('onConnectionError') +const kGetDispatcher = Symbol('get dispatcher') +const kAddClient = Symbol('add client') +const kRemoveClient = Symbol('remove client') +const kStats = Symbol('stats') + +class PoolBase extends DispatcherBase { + constructor () { + super() + + this[kQueue] = new FixedQueue() + this[kClients] = [] + this[kQueued] = 0 + + const pool = this + + this[kOnDrain] = function onDrain (origin, targets) { + const queue = pool[kQueue] + + let needDrain = false + + while (!needDrain) { + const item = queue.shift() + if (!item) { + break + } + pool[kQueued]-- + needDrain = !this.dispatch(item.opts, item.handler) + } + + this[kNeedDrain] = needDrain + + if (!this[kNeedDrain] && pool[kNeedDrain]) { + pool[kNeedDrain] = false + pool.emit('drain', origin, [pool, ...targets]) + } + + if (pool[kClosedResolve] && queue.isEmpty()) { + Promise + .all(pool[kClients].map(c => c.close())) + .then(pool[kClosedResolve]) + } + } + + this[kOnConnect] = (origin, targets) => { + pool.emit('connect', origin, [pool, ...targets]) + } + + this[kOnDisconnect] = (origin, targets, err) => { + pool.emit('disconnect', origin, [pool, ...targets], err) + } + + this[kOnConnectionError] = (origin, targets, err) => { + pool.emit('connectionError', origin, [pool, ...targets], err) + } + + this[kStats] = new PoolStats(this) + } + + get [kBusy] () { + return this[kNeedDrain] + } + + get [kConnected] () { + return this[kClients].filter(client => client[kConnected]).length + } + + get [kFree] () { + return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length + } + + get [kPending] () { + let ret = this[kQueued] + for (const { [kPending]: pending } of this[kClients]) { + ret += pending + } + return ret + } + + get [kRunning] () { + let ret = 0 + for (const { [kRunning]: running } of this[kClients]) { + ret += running + } + return ret + } + + get [kSize] () { + let ret = this[kQueued] + for (const { [kSize]: size } of this[kClients]) { + ret += size + } + return ret + } + + get stats () { + return this[kStats] + } + + async [kClose] () { + if (this[kQueue].isEmpty()) { + return Promise.all(this[kClients].map(c => c.close())) + } else { + return new Promise((resolve) => { + this[kClosedResolve] = resolve + }) + } + } + + async [kDestroy] (err) { + while (true) { + const item = this[kQueue].shift() + if (!item) { + break + } + item.handler.onError(err) + } + + return Promise.all(this[kClients].map(c => c.destroy(err))) + } + + [kDispatch] (opts, handler) { + const dispatcher = this[kGetDispatcher]() + + if (!dispatcher) { + this[kNeedDrain] = true + this[kQueue].push({ opts, handler }) + this[kQueued]++ + } else if (!dispatcher.dispatch(opts, handler)) { + dispatcher[kNeedDrain] = true + this[kNeedDrain] = !this[kGetDispatcher]() + } + + return !this[kNeedDrain] + } + + [kAddClient] (client) { + client + .on('drain', this[kOnDrain]) + .on('connect', this[kOnConnect]) + .on('disconnect', this[kOnDisconnect]) + .on('connectionError', this[kOnConnectionError]) + + this[kClients].push(client) + + if (this[kNeedDrain]) { + process.nextTick(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client[kUrl], [this, client]) + } + }) + } + + return this + } + + [kRemoveClient] (client) { + client.close(() => { + const idx = this[kClients].indexOf(client) + if (idx !== -1) { + this[kClients].splice(idx, 1) + } + }) + + this[kNeedDrain] = this[kClients].some(dispatcher => ( + !dispatcher[kNeedDrain] && + dispatcher.closed !== true && + dispatcher.destroyed !== true + )) + } +} - if (request.method === 'CONNECT') { - assert(client[kRunning] === 1) - this.upgrade = true - return 2 - } +module.exports = { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher +} - if (upgrade) { - assert(client[kRunning] === 1) - this.upgrade = true - return 2 - } - assert(this.headers.length % 2 === 0) - this.headers = [] - this.headersSize = 0 - - if (this.shouldKeepAlive && client[kPipelining]) { - const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null - - if (keepAliveTimeout != null) { - const timeout = Math.min( - keepAliveTimeout - client[kKeepAliveTimeoutThreshold], - client[kKeepAliveMaxTimeout] - ) - if (timeout <= 0) { - socket[kReset] = true - } else { - client[kKeepAliveTimeoutValue] = timeout - } - } else { - client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout] - } - } else { - // Stop more requests from being dispatched. - socket[kReset] = true - } +/***/ }), - const pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false +/***/ 9689: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (request.aborted) { - return -1 - } +const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(2785) +const kPool = Symbol('pool') - if (request.method === 'HEAD') { - return 1 - } +class PoolStats { + constructor (pool) { + this[kPool] = pool + } - if (statusCode < 200) { - return 1 - } + get connected () { + return this[kPool][kConnected] + } - if (socket[kBlocking]) { - socket[kBlocking] = false - resume(client) - } + get free () { + return this[kPool][kFree] + } - return pause ? constants.ERROR.PAUSED : 0 - } + get pending () { + return this[kPool][kPending] + } - onBody(buf) { - const { client, socket, statusCode, maxResponseSize } = this + get queued () { + return this[kPool][kQueued] + } - if (socket.destroyed) { - return -1 - } + get running () { + return this[kPool][kRunning] + } - const request = client[kQueue][client[kRunningIdx]] - assert(request) + get size () { + return this[kPool][kSize] + } +} - assert.strictEqual(this.timeoutType, TIMEOUT_BODY) - if (this.timeout) { - // istanbul ignore else: only for jest - if (this.timeout.refresh) { - this.timeout.refresh() - } - } +module.exports = PoolStats - assert(statusCode >= 200) - if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { - util.destroy(socket, new ResponseExceededMaxSizeError()) - return -1 - } +/***/ }), - this.bytesRead += buf.length +/***/ 4634: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (request.onData(buf) === false) { - return constants.ERROR.PAUSED - } - } +"use strict"; + + +const { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher +} = __nccwpck_require__(3198) +const Client = __nccwpck_require__(3598) +const { + InvalidArgumentError +} = __nccwpck_require__(8045) +const util = __nccwpck_require__(3983) +const { kUrl, kInterceptors } = __nccwpck_require__(2785) +const buildConnector = __nccwpck_require__(2067) + +const kOptions = Symbol('options') +const kConnections = Symbol('connections') +const kFactory = Symbol('factory') + +function defaultFactory (origin, opts) { + return new Client(origin, opts) +} - onMessageComplete() { - const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this +class Pool extends PoolBase { + constructor (origin, { + connections, + factory = defaultFactory, + connect, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + allowH2, + ...options + } = {}) { + super() + + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError('invalid connections') + } + + if (typeof factory !== 'function') { + throw new InvalidArgumentError('factory must be a function.') + } + + if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') { + throw new InvalidArgumentError('connect must be a function or an object') + } + + if (typeof connect !== 'function') { + connect = buildConnector({ + ...tls, + maxCachedSessions, + allowH2, + socketPath, + timeout: connectTimeout, + ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined), + ...connect + }) + } + + this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool) + ? options.interceptors.Pool + : [] + this[kConnections] = connections || null + this[kUrl] = util.parseOrigin(origin) + this[kOptions] = { ...util.deepClone(options), connect, allowH2 } + this[kOptions].interceptors = options.interceptors + ? { ...options.interceptors } + : undefined + this[kFactory] = factory + } + + [kGetDispatcher] () { + let dispatcher = this[kClients].find(dispatcher => !dispatcher[kNeedDrain]) + + if (dispatcher) { + return dispatcher + } + + if (!this[kConnections] || this[kClients].length < this[kConnections]) { + dispatcher = this[kFactory](this[kUrl], this[kOptions]) + this[kAddClient](dispatcher) + } + + return dispatcher + } +} - if (socket.destroyed && (!statusCode || shouldKeepAlive)) { - return -1 - } +module.exports = Pool - if (upgrade) { - return - } - const request = client[kQueue][client[kRunningIdx]] - assert(request) +/***/ }), - assert(statusCode >= 100) +/***/ 7858: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - this.statusCode = null - this.statusText = '' - this.bytesRead = 0 - this.contentLength = '' - this.keepAlive = '' - this.connection = '' +"use strict"; - assert(this.headers.length % 2 === 0) - this.headers = [] - this.headersSize = 0 - if (statusCode < 200) { - return - } +const { kProxy, kClose, kDestroy, kInterceptors } = __nccwpck_require__(2785) +const { URL } = __nccwpck_require__(7310) +const Agent = __nccwpck_require__(7890) +const Pool = __nccwpck_require__(4634) +const DispatcherBase = __nccwpck_require__(4839) +const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(8045) +const buildConnector = __nccwpck_require__(2067) - /* istanbul ignore next: should be handled by llhttp? */ - if (request.method !== 'HEAD' && contentLength && bytesRead !== parseInt(contentLength, 10)) { - util.destroy(socket, new ResponseContentLengthMismatchError()) - return -1 - } +const kAgent = Symbol('proxy agent') +const kClient = Symbol('proxy client') +const kProxyHeaders = Symbol('proxy headers') +const kRequestTls = Symbol('request tls settings') +const kProxyTls = Symbol('proxy tls settings') +const kConnectEndpoint = Symbol('connect endpoint function') - request.onComplete(headers) - - client[kQueue][client[kRunningIdx]++] = null - - if (socket[kWriting]) { - assert.strictEqual(client[kRunning], 0) - // Response completed before request. - util.destroy(socket, new InformationalError('reset')) - return constants.ERROR.PAUSED - } else if (!shouldKeepAlive) { - util.destroy(socket, new InformationalError('reset')) - return constants.ERROR.PAUSED - } else if (socket[kReset] && client[kRunning] === 0) { - // Destroy socket once all requests have completed. - // The request at the tail of the pipeline is the one - // that requested reset and no further requests should - // have been queued since then. - util.destroy(socket, new InformationalError('reset')) - return constants.ERROR.PAUSED - } else if (client[kPipelining] === 1) { - // We must wait a full event loop cycle to reuse this socket to make sure - // that non-spec compliant servers are not closing the connection even if they - // said they won't. - setImmediate(resume, client) - } else { - resume(client) - } - } - } +function defaultProtocolPort (protocol) { + return protocol === 'https:' ? 443 : 80 +} - function onParserTimeout(parser) { - const { socket, timeoutType, client } = parser +function buildProxyOptions (opts) { + if (typeof opts === 'string') { + opts = { uri: opts } + } - /* istanbul ignore else */ - if (timeoutType === TIMEOUT_HEADERS) { - if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { - assert(!parser.paused, 'cannot be paused while waiting for headers') - util.destroy(socket, new HeadersTimeoutError()) - } - } else if (timeoutType === TIMEOUT_BODY) { - if (!parser.paused) { - util.destroy(socket, new BodyTimeoutError()) - } - } else if (timeoutType === TIMEOUT_IDLE) { - assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]) - util.destroy(socket, new InformationalError('socket idle timeout')) - } - } + if (!opts || !opts.uri) { + throw new InvalidArgumentError('Proxy opts.uri is mandatory') + } - function onSocketReadable() { - const { [kParser]: parser } = this - if (parser) { - parser.readMore() - } - } + return { + uri: opts.uri, + protocol: opts.protocol || 'https' + } +} - function onSocketError(err) { - const { [kClient]: client, [kParser]: parser } = this +function defaultFactory (origin, opts) { + return new Pool(origin, opts) +} - assert(err.code !== 'ERR_TLS_CERT_ALTNAME_INVALID') +class ProxyAgent extends DispatcherBase { + constructor (opts) { + super(opts) + this[kProxy] = buildProxyOptions(opts) + this[kAgent] = new Agent(opts) + this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) + ? opts.interceptors.ProxyAgent + : [] + + if (typeof opts === 'string') { + opts = { uri: opts } + } + + if (!opts || !opts.uri) { + throw new InvalidArgumentError('Proxy opts.uri is mandatory') + } + + const { clientFactory = defaultFactory } = opts + + if (typeof clientFactory !== 'function') { + throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.') + } + + this[kRequestTls] = opts.requestTls + this[kProxyTls] = opts.proxyTls + this[kProxyHeaders] = opts.headers || {} + + const resolvedUrl = new URL(opts.uri) + const { origin, port, host, username, password } = resolvedUrl + + if (opts.auth && opts.token) { + throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token') + } else if (opts.auth) { + /* @deprecated in favour of opts.token */ + this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}` + } else if (opts.token) { + this[kProxyHeaders]['proxy-authorization'] = opts.token + } else if (username && password) { + this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}` + } + + const connect = buildConnector({ ...opts.proxyTls }) + this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }) + this[kClient] = clientFactory(resolvedUrl, { connect }) + this[kAgent] = new Agent({ + ...opts, + connect: async (opts, callback) => { + let requestedHost = opts.host + if (!opts.port) { + requestedHost += `:${defaultProtocolPort(opts.protocol)}` + } + try { + const { socket, statusCode } = await this[kClient].connect({ + origin, + port, + path: requestedHost, + signal: opts.signal, + headers: { + ...this[kProxyHeaders], + host + } + }) + if (statusCode !== 200) { + socket.on('error', () => {}).destroy() + callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`)) + } + if (opts.protocol !== 'https:') { + callback(null, socket) + return + } + let servername + if (this[kRequestTls]) { + servername = this[kRequestTls].servername + } else { + servername = opts.servername + } + this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback) + } catch (err) { + callback(err) + } + } + }) + } + + dispatch (opts, handler) { + const { host } = new URL(opts.origin) + const headers = buildHeaders(opts.headers) + throwIfProxyAuthIsSent(headers) + return this[kAgent].dispatch( + { + ...opts, + headers: { + ...headers, + host + } + }, + handler + ) + } + + async [kClose] () { + await this[kAgent].close() + await this[kClient].close() + } + + async [kDestroy] () { + await this[kAgent].destroy() + await this[kClient].destroy() + } +} - if (client[kHTTPConnVersion] !== 'h2') { - // On Mac OS, we get an ECONNRESET even if there is a full body to be forwarded - // to the user. - if (err.code === 'ECONNRESET' && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so for as a valid response. - parser.onMessageComplete() - return - } - } +/** + * @param {string[] | Record} headers + * @returns {Record} + */ +function buildHeaders (headers) { + // When using undici.fetch, the headers list is stored + // as an array. + if (Array.isArray(headers)) { + /** @type {Record} */ + const headersPair = {} + + for (let i = 0; i < headers.length; i += 2) { + headersPair[headers[i]] = headers[i + 1] + } + + return headersPair + } + + return headers +} - this[kError] = err +/** + * @param {Record} headers + * + * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers + * Nevertheless, it was changed and to avoid a security vulnerability by end users + * this check was created. + * It should be removed in the next major version for performance reasons + */ +function throwIfProxyAuthIsSent (headers) { + const existProxyAuth = headers && Object.keys(headers) + .find((key) => key.toLowerCase() === 'proxy-authorization') + if (existProxyAuth) { + throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor') + } +} - onError(this[kClient], err) - } +module.exports = ProxyAgent - function onError(client, err) { - if ( - client[kRunning] === 0 && - err.code !== 'UND_ERR_INFO' && - err.code !== 'UND_ERR_SOCKET' - ) { - // Error is not caused by running request and not a recoverable - // socket error. - - assert(client[kPendingIdx] === client[kRunningIdx]) - - const requests = client[kQueue].splice(client[kRunningIdx]) - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - errorRequest(client, request, err) - } - assert(client[kSize] === 0) - } - } - function onSocketEnd() { - const { [kParser]: parser, [kClient]: client } = this +/***/ }), - if (client[kHTTPConnVersion] !== 'h2') { - if (parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete() - return - } - } +/***/ 9459: +/***/ ((module) => { - util.destroy(this, new SocketError('other side closed', util.getSocketInfo(this))) - } +"use strict"; + + +let fastNow = Date.now() +let fastNowTimeout + +const fastTimers = [] + +function onTimeout () { + fastNow = Date.now() + + let len = fastTimers.length + let idx = 0 + while (idx < len) { + const timer = fastTimers[idx] + + if (timer.state === 0) { + timer.state = fastNow + timer.delay + } else if (timer.state > 0 && fastNow >= timer.state) { + timer.state = -1 + timer.callback(timer.opaque) + } + + if (timer.state === -1) { + timer.state = -2 + if (idx !== len - 1) { + fastTimers[idx] = fastTimers.pop() + } else { + fastTimers.pop() + } + len -= 1 + } else { + idx += 1 + } + } + + if (fastTimers.length > 0) { + refreshTimeout() + } +} - function onSocketClose() { - const { [kClient]: client, [kParser]: parser } = this +function refreshTimeout () { + if (fastNowTimeout && fastNowTimeout.refresh) { + fastNowTimeout.refresh() + } else { + clearTimeout(fastNowTimeout) + fastNowTimeout = setTimeout(onTimeout, 1e3) + if (fastNowTimeout.unref) { + fastNowTimeout.unref() + } + } +} - if (client[kHTTPConnVersion] === 'h1' && parser) { - if (!this[kError] && parser.statusCode && !parser.shouldKeepAlive) { - // We treat all incoming data so far as a valid response. - parser.onMessageComplete() - } +class Timeout { + constructor (callback, delay, opaque) { + this.callback = callback + this.delay = delay + this.opaque = opaque + + // -2 not in timer list + // -1 in timer list but inactive + // 0 in timer list waiting for time + // > 0 in timer list waiting for time to expire + this.state = -2 + + this.refresh() + } + + refresh () { + if (this.state === -2) { + fastTimers.push(this) + if (!fastNowTimeout || fastTimers.length === 1) { + refreshTimeout() + } + } + + this.state = 0 + } + + clear () { + this.state = -1 + } +} - this[kParser].destroy() - this[kParser] = null - } +module.exports = { + setTimeout (callback, delay, opaque) { + return delay < 1e3 + ? setTimeout(callback, delay, opaque) + : new Timeout(callback, delay, opaque) + }, + clearTimeout (timeout) { + if (timeout instanceof Timeout) { + timeout.clear() + } else { + clearTimeout(timeout) + } + } +} - const err = this[kError] || new SocketError('closed', util.getSocketInfo(this)) - client[kSocket] = null +/***/ }), - if (client.destroyed) { - assert(client[kPending] === 0) +/***/ 5354: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - // Fail entire queue. - const requests = client[kQueue].splice(client[kRunningIdx]) - for (let i = 0; i < requests.length; i++) { - const request = requests[i] - errorRequest(client, request, err) - } - } else if (client[kRunning] > 0 && err.code !== 'UND_ERR_INFO') { - // Fail head of pipeline. - const request = client[kQueue][client[kRunningIdx]] - client[kQueue][client[kRunningIdx]++] = null +"use strict"; + + +const diagnosticsChannel = __nccwpck_require__(7643) +const { uid, states } = __nccwpck_require__(9188) +const { + kReadyState, + kSentClose, + kByteParser, + kReceivedClose +} = __nccwpck_require__(7578) +const { fireEvent, failWebsocketConnection } = __nccwpck_require__(5515) +const { CloseEvent } = __nccwpck_require__(2611) +const { makeRequest } = __nccwpck_require__(8359) +const { fetching } = __nccwpck_require__(4881) +const { Headers } = __nccwpck_require__(554) +const { getGlobalDispatcher } = __nccwpck_require__(1892) +const { kHeadersList } = __nccwpck_require__(2785) + +const channels = {} +channels.open = diagnosticsChannel.channel('undici:websocket:open') +channels.close = diagnosticsChannel.channel('undici:websocket:close') +channels.socketError = diagnosticsChannel.channel('undici:websocket:socket_error') + +/** @type {import('crypto')} */ +let crypto +try { + crypto = __nccwpck_require__(6113) +} catch { - errorRequest(client, request, err) - } +} - client[kPendingIdx] = client[kRunningIdx] +/** + * @see https://websockets.spec.whatwg.org/#concept-websocket-establish + * @param {URL} url + * @param {string|string[]} protocols + * @param {import('./websocket').WebSocket} ws + * @param {(response: any) => void} onEstablish + * @param {Partial} options + */ +function establishWebSocketConnection (url, protocols, ws, onEstablish, options) { + // 1. Let requestURL be a copy of url, with its scheme set to "http", if url’s + // scheme is "ws", and to "https" otherwise. + const requestURL = url + + requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:' + + // 2. Let request be a new request, whose URL is requestURL, client is client, + // service-workers mode is "none", referrer is "no-referrer", mode is + // "websocket", credentials mode is "include", cache mode is "no-store" , + // and redirect mode is "error". + const request = makeRequest({ + urlList: [requestURL], + serviceWorkers: 'none', + referrer: 'no-referrer', + mode: 'websocket', + credentials: 'include', + cache: 'no-store', + redirect: 'error' + }) + + // Note: undici extension, allow setting custom headers. + if (options.headers) { + const headersList = new Headers(options.headers)[kHeadersList] + + request.headersList = headersList + } + + // 3. Append (`Upgrade`, `websocket`) to request’s header list. + // 4. Append (`Connection`, `Upgrade`) to request’s header list. + // Note: both of these are handled by undici currently. + // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397 + + // 5. Let keyValue be a nonce consisting of a randomly selected + // 16-byte value that has been forgiving-base64-encoded and + // isomorphic encoded. + const keyValue = crypto.randomBytes(16).toString('base64') + + // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s + // header list. + request.headersList.append('sec-websocket-key', keyValue) + + // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s + // header list. + request.headersList.append('sec-websocket-version', '13') + + // 8. For each protocol in protocols, combine + // (`Sec-WebSocket-Protocol`, protocol) in request’s header + // list. + for (const protocol of protocols) { + request.headersList.append('sec-websocket-protocol', protocol) + } + + // 9. Let permessageDeflate be a user-agent defined + // "permessage-deflate" extension header value. + // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673 + // TODO: enable once permessage-deflate is supported + const permessageDeflate = '' // 'permessage-deflate; 15' + + // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to + // request’s header list. + // request.headersList.append('sec-websocket-extensions', permessageDeflate) + + // 11. Fetch request with useParallelQueue set to true, and + // processResponse given response being these steps: + const controller = fetching({ + request, + useParallelQueue: true, + dispatcher: options.dispatcher ?? getGlobalDispatcher(), + processResponse (response) { + // 1. If response is a network error or its status is not 101, + // fail the WebSocket connection. + if (response.type === 'error' || response.status !== 101) { + failWebsocketConnection(ws, 'Received network error or non-101 status code.') + return + } + + // 2. If protocols is not the empty list and extracting header + // list values given `Sec-WebSocket-Protocol` and response’s + // header list results in null, failure, or the empty byte + // sequence, then fail the WebSocket connection. + if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) { + failWebsocketConnection(ws, 'Server did not respond with sent protocols.') + return + } + + // 3. Follow the requirements stated step 2 to step 6, inclusive, + // of the last set of steps in section 4.1 of The WebSocket + // Protocol to validate response. This either results in fail + // the WebSocket connection or the WebSocket connection is + // established. + + // 2. If the response lacks an |Upgrade| header field or the |Upgrade| + // header field contains a value that is not an ASCII case- + // insensitive match for the value "websocket", the client MUST + // _Fail the WebSocket Connection_. + if (response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') { + failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".') + return + } + + // 3. If the response lacks a |Connection| header field or the + // |Connection| header field doesn't contain a token that is an + // ASCII case-insensitive match for the value "Upgrade", the client + // MUST _Fail the WebSocket Connection_. + if (response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') { + failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".') + return + } + + // 4. If the response lacks a |Sec-WebSocket-Accept| header field or + // the |Sec-WebSocket-Accept| contains a value other than the + // base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket- + // Key| (as a string, not base64-decoded) with the string "258EAFA5- + // E914-47DA-95CA-C5AB0DC85B11" but ignoring any leading and + // trailing whitespace, the client MUST _Fail the WebSocket + // Connection_. + const secWSAccept = response.headersList.get('Sec-WebSocket-Accept') + const digest = crypto.createHash('sha1').update(keyValue + uid).digest('base64') + if (secWSAccept !== digest) { + failWebsocketConnection(ws, 'Incorrect hash received in Sec-WebSocket-Accept header.') + return + } + + // 5. If the response includes a |Sec-WebSocket-Extensions| header + // field and this header field indicates the use of an extension + // that was not present in the client's handshake (the server has + // indicated an extension not requested by the client), the client + // MUST _Fail the WebSocket Connection_. (The parsing of this + // header field to determine which extensions are requested is + // discussed in Section 9.1.) + const secExtension = response.headersList.get('Sec-WebSocket-Extensions') + + if (secExtension !== null && secExtension !== permessageDeflate) { + failWebsocketConnection(ws, 'Received different permessage-deflate than the one set.') + return + } + + // 6. If the response includes a |Sec-WebSocket-Protocol| header field + // and this header field indicates the use of a subprotocol that was + // not present in the client's handshake (the server has indicated a + // subprotocol not requested by the client), the client MUST _Fail + // the WebSocket Connection_. + const secProtocol = response.headersList.get('Sec-WebSocket-Protocol') + + if (secProtocol !== null && secProtocol !== request.headersList.get('Sec-WebSocket-Protocol')) { + failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.') + return + } + + response.socket.on('data', onSocketData) + response.socket.on('close', onSocketClose) + response.socket.on('error', onSocketError) + + if (channels.open.hasSubscribers) { + channels.open.publish({ + address: response.socket.address(), + protocol: secProtocol, + extensions: secExtension + }) + } + + onEstablish(response) + } + }) + + return controller +} - assert(client[kRunning] === 0) +/** + * @param {Buffer} chunk + */ +function onSocketData (chunk) { + if (!this.ws[kByteParser].write(chunk)) { + this.pause() + } +} - client.emit('disconnect', client[kUrl], [client], err) +/** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4 + */ +function onSocketClose () { + const { ws } = this + + // If the TCP connection was closed after the + // WebSocket closing handshake was completed, the WebSocket connection + // is said to have been closed _cleanly_. + const wasClean = ws[kSentClose] && ws[kReceivedClose] + + let code = 1005 + let reason = '' + + const result = ws[kByteParser].closingInfo + + if (result) { + code = result.code ?? 1005 + reason = result.reason + } else if (!ws[kSentClose]) { + // If _The WebSocket + // Connection is Closed_ and no Close control frame was received by the + // endpoint (such as could occur if the underlying transport connection + // is lost), _The WebSocket Connection Close Code_ is considered to be + // 1006. + code = 1006 + } + + // 1. Change the ready state to CLOSED (3). + ws[kReadyState] = states.CLOSED + + // 2. If the user agent was required to fail the WebSocket + // connection, or if the WebSocket connection was closed + // after being flagged as full, fire an event named error + // at the WebSocket object. + // TODO + + // 3. Fire an event named close at the WebSocket object, + // using CloseEvent, with the wasClean attribute + // initialized to true if the connection closed cleanly + // and false otherwise, the code attribute initialized to + // the WebSocket connection close code, and the reason + // attribute initialized to the result of applying UTF-8 + // decode without BOM to the WebSocket connection close + // reason. + fireEvent('close', ws, CloseEvent, { + wasClean, code, reason + }) + + if (channels.close.hasSubscribers) { + channels.close.publish({ + websocket: ws, + code, + reason + }) + } +} - resume(client) - } +function onSocketError (error) { + const { ws } = this - async function connect(client) { - assert(!client[kConnecting]) - assert(!client[kSocket]) + ws[kReadyState] = states.CLOSING - let { host, hostname, protocol, port } = client[kUrl] + if (channels.socketError.hasSubscribers) { + channels.socketError.publish(error) + } - // Resolve ipv6 - if (hostname[0] === '[') { - const idx = hostname.indexOf(']') + this.destroy() +} - assert(idx !== -1) - const ip = hostname.substring(1, idx) +module.exports = { + establishWebSocketConnection +} - assert(net.isIP(ip)) - hostname = ip - } - client[kConnecting] = true - - if (channels.beforeConnect.hasSubscribers) { - channels.beforeConnect.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector] - }) - } +/***/ }), - try { - const socket = await new Promise((resolve, reject) => { - client[kConnector]({ - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, (err, socket) => { - if (err) { - reject(err) - } else { - resolve(socket) - } - }) - }) +/***/ 9188: +/***/ ((module) => { - if (client.destroyed) { - util.destroy(socket.on('error', () => { }), new ClientDestroyedError()) - return - } +"use strict"; - client[kConnecting] = false - assert(socket) +// This is a Globally Unique Identifier unique used +// to validate that the endpoint accepts websocket +// connections. +// See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3 +const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11' - const isH2 = socket.alpnProtocol === 'h2' - if (isH2) { - if (!h2ExperimentalWarned) { - h2ExperimentalWarned = true - process.emitWarning('H2 support is experimental, expect them to change at any time.', { - code: 'UNDICI-H2' - }) - } +/** @type {PropertyDescriptor} */ +const staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false +} - const session = http2.connect(client[kUrl], { - createConnection: () => socket, - peerMaxConcurrentStreams: client[kHTTP2SessionState].maxConcurrentStreams - }) - - client[kHTTPConnVersion] = 'h2' - session[kClient] = client - session[kSocket] = socket - session.on('error', onHttp2SessionError) - session.on('frameError', onHttp2FrameError) - session.on('end', onHttp2SessionEnd) - session.on('goaway', onHTTP2GoAway) - session.on('close', onSocketClose) - session.unref() - - client[kHTTP2Session] = session - socket[kHTTP2Session] = session - } else { - if (!llhttpInstance) { - llhttpInstance = await llhttpPromise - llhttpPromise = null - } +const states = { + CONNECTING: 0, + OPEN: 1, + CLOSING: 2, + CLOSED: 3 +} - socket[kNoRef] = false - socket[kWriting] = false - socket[kReset] = false - socket[kBlocking] = false - socket[kParser] = new Parser(client, socket, llhttpInstance) - } +const opcodes = { + CONTINUATION: 0x0, + TEXT: 0x1, + BINARY: 0x2, + CLOSE: 0x8, + PING: 0x9, + PONG: 0xA +} - socket[kCounter] = 0 - socket[kMaxRequests] = client[kMaxRequests] - socket[kClient] = client - socket[kError] = null - - socket - .on('error', onSocketError) - .on('readable', onSocketReadable) - .on('end', onSocketEnd) - .on('close', onSocketClose) - - client[kSocket] = socket - - if (channels.connected.hasSubscribers) { - channels.connected.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - socket - }) - } - client.emit('connect', client[kUrl], [client]) - } catch (err) { - if (client.destroyed) { - return - } +const maxUnsigned16Bit = 2 ** 16 - 1 // 65535 - client[kConnecting] = false - - if (channels.connectError.hasSubscribers) { - channels.connectError.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - error: err - }) - } +const parserStates = { + INFO: 0, + PAYLOADLENGTH_16: 2, + PAYLOADLENGTH_64: 3, + READ_DATA: 4 +} - if (err.code === 'ERR_TLS_CERT_ALTNAME_INVALID') { - assert(client[kRunning] === 0) - while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { - const request = client[kQueue][client[kPendingIdx]++] - errorRequest(client, request, err) - } - } else { - onError(client, err) - } +const emptyBuffer = Buffer.allocUnsafe(0) - client.emit('connectionError', client[kUrl], [client], err) - } +module.exports = { + uid, + staticPropertyDescriptors, + states, + opcodes, + maxUnsigned16Bit, + parserStates, + emptyBuffer +} - resume(client) - } - function emitDrain(client) { - client[kNeedDrain] = 0 - client.emit('drain', client[kUrl], [client]) - } +/***/ }), - function resume(client, sync) { - if (client[kResuming] === 2) { - return - } +/***/ 2611: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - client[kResuming] = 2 +"use strict"; - _resume(client, sync) - client[kResuming] = 0 - if (client[kRunningIdx] > 256) { - client[kQueue].splice(0, client[kRunningIdx]) - client[kPendingIdx] -= client[kRunningIdx] - client[kRunningIdx] = 0 - } - } +const { webidl } = __nccwpck_require__(1744) +const { kEnumerableProperty } = __nccwpck_require__(3983) +const { MessagePort } = __nccwpck_require__(1267) - function _resume(client, sync) { - while (true) { - if (client.destroyed) { - assert(client[kPending] === 0) - return - } +/** + * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent + */ +class MessageEvent extends Event { + #eventInit - if (client[kClosedResolve] && !client[kSize]) { - client[kClosedResolve]() - client[kClosedResolve] = null - return - } + constructor (type, eventInitDict = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent constructor' }) - const socket = client[kSocket] + type = webidl.converters.DOMString(type) + eventInitDict = webidl.converters.MessageEventInit(eventInitDict) - if (socket && !socket.destroyed && socket.alpnProtocol !== 'h2') { - if (client[kSize] === 0) { - if (!socket[kNoRef] && socket.unref) { - socket.unref() - socket[kNoRef] = true - } - } else if (socket[kNoRef] && socket.ref) { - socket.ref() - socket[kNoRef] = false - } + super(type, eventInitDict) - if (client[kSize] === 0) { - if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { - socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE) - } - } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { - if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { - const request = client[kQueue][client[kRunningIdx]] - const headersTimeout = request.headersTimeout != null - ? request.headersTimeout - : client[kHeadersTimeout] - socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS) - } - } - } + this.#eventInit = eventInitDict + } - if (client[kBusy]) { - client[kNeedDrain] = 2 - } else if (client[kNeedDrain] === 2) { - if (sync) { - client[kNeedDrain] = 1 - process.nextTick(emitDrain, client) - } else { - emitDrain(client) - } - continue - } + get data () { + webidl.brandCheck(this, MessageEvent) - if (client[kPending] === 0) { - return - } + return this.#eventInit.data + } - if (client[kRunning] >= (client[kPipelining] || 1)) { - return - } + get origin () { + webidl.brandCheck(this, MessageEvent) - const request = client[kQueue][client[kPendingIdx]] + return this.#eventInit.origin + } - if (client[kUrl].protocol === 'https:' && client[kServerName] !== request.servername) { - if (client[kRunning] > 0) { - return - } + get lastEventId () { + webidl.brandCheck(this, MessageEvent) - client[kServerName] = request.servername + return this.#eventInit.lastEventId + } - if (socket && socket.servername !== request.servername) { - util.destroy(socket, new InformationalError('servername changed')) - return - } - } + get source () { + webidl.brandCheck(this, MessageEvent) - if (client[kConnecting]) { - return - } + return this.#eventInit.source + } - if (!socket && !client[kHTTP2Session]) { - connect(client) - return - } + get ports () { + webidl.brandCheck(this, MessageEvent) - if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { - return - } + if (!Object.isFrozen(this.#eventInit.ports)) { + Object.freeze(this.#eventInit.ports) + } - if (client[kRunning] > 0 && !request.idempotent) { - // Non-idempotent request cannot be retried. - // Ensure that no other requests are inflight and - // could cause failure. - return - } + return this.#eventInit.ports + } - if (client[kRunning] > 0 && (request.upgrade || request.method === 'CONNECT')) { - // Don't dispatch an upgrade until all preceding requests have completed. - // A misbehaving server might upgrade the connection before all pipelined - // request has completed. - return - } + initMessageEvent ( + type, + bubbles = false, + cancelable = false, + data = null, + origin = '', + lastEventId = '', + source = null, + ports = [] + ) { + webidl.brandCheck(this, MessageEvent) - if (client[kRunning] > 0 && util.bodyLength(request.body) !== 0 && - (util.isStream(request.body) || util.isAsyncIterable(request.body))) { - // Request with stream or iterator body can error while other requests - // are inflight and indirectly error those as well. - // Ensure this doesn't happen by waiting for inflight - // to complete before dispatching. - - // Request with stream or iterator body cannot be retried. - // Ensure that no other requests are inflight and - // could cause failure. - return - } + webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent.initMessageEvent' }) - if (!request.aborted && write(client, request)) { - client[kPendingIdx]++ - } else { - client[kQueue].splice(client[kPendingIdx], 1) - } - } - } + return new MessageEvent(type, { + bubbles, cancelable, data, origin, lastEventId, source, ports + }) + } +} - // https://www.rfc-editor.org/rfc/rfc7230#section-3.3.2 - function shouldSendContentLength(method) { - return method !== 'GET' && method !== 'HEAD' && method !== 'OPTIONS' && method !== 'TRACE' && method !== 'CONNECT' - } +/** + * @see https://websockets.spec.whatwg.org/#the-closeevent-interface + */ +class CloseEvent extends Event { + #eventInit - function write(client, request) { - if (client[kHTTPConnVersion] === 'h2') { - writeH2(client, client[kHTTP2Session], request) - return - } + constructor (type, eventInitDict = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: 'CloseEvent constructor' }) - const { body, method, path, host, upgrade, headers, blocking, reset } = request + type = webidl.converters.DOMString(type) + eventInitDict = webidl.converters.CloseEventInit(eventInitDict) - // https://tools.ietf.org/html/rfc7231#section-4.3.1 - // https://tools.ietf.org/html/rfc7231#section-4.3.2 - // https://tools.ietf.org/html/rfc7231#section-4.3.5 + super(type, eventInitDict) - // Sending a payload body on a request that does not - // expect it can cause undefined behavior on some - // servers and corrupt connection state. Do not - // re-use the connection for further requests. + this.#eventInit = eventInitDict + } - const expectsPayload = ( - method === 'PUT' || - method === 'POST' || - method === 'PATCH' - ) + get wasClean () { + webidl.brandCheck(this, CloseEvent) - if (body && typeof body.read === 'function') { - // Try to read EOF in order to get length. - body.read(0) - } + return this.#eventInit.wasClean + } - const bodyLength = util.bodyLength(body) + get code () { + webidl.brandCheck(this, CloseEvent) - let contentLength = bodyLength + return this.#eventInit.code + } - if (contentLength === null) { - contentLength = request.contentLength - } + get reason () { + webidl.brandCheck(this, CloseEvent) - if (contentLength === 0 && !expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD NOT send a Content-Length header field when - // the request message does not contain a payload body and the method - // semantics do not anticipate such a body. + return this.#eventInit.reason + } +} - contentLength = null - } +// https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface +class ErrorEvent extends Event { + #eventInit - // https://github.com/nodejs/undici/issues/2046 - // A user agent may send a Content-Length header with 0 value, this should be allowed. - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength !== null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()) - return false - } + constructor (type, eventInitDict) { + webidl.argumentLengthCheck(arguments, 1, { header: 'ErrorEvent constructor' }) - process.emitWarning(new RequestContentLengthMismatchError()) - } + super(type, eventInitDict) - const socket = client[kSocket] + type = webidl.converters.DOMString(type) + eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}) - try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return - } + this.#eventInit = eventInitDict + } - errorRequest(client, request, err || new RequestAbortedError()) + get message () { + webidl.brandCheck(this, ErrorEvent) - util.destroy(socket, new InformationalError('aborted')) - }) - } catch (err) { - errorRequest(client, request, err) - } + return this.#eventInit.message + } - if (request.aborted) { - return false - } + get filename () { + webidl.brandCheck(this, ErrorEvent) - if (method === 'HEAD') { - // https://github.com/mcollina/undici/issues/258 - // Close after a HEAD request to interop with misbehaving servers - // that may send a body in the response. + return this.#eventInit.filename + } - socket[kReset] = true - } + get lineno () { + webidl.brandCheck(this, ErrorEvent) - if (upgrade || method === 'CONNECT') { - // On CONNECT or upgrade, block pipeline from dispatching further - // requests on this connection. + return this.#eventInit.lineno + } - socket[kReset] = true - } + get colno () { + webidl.brandCheck(this, ErrorEvent) - if (reset != null) { - socket[kReset] = reset - } + return this.#eventInit.colno + } - if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { - socket[kReset] = true - } + get error () { + webidl.brandCheck(this, ErrorEvent) - if (blocking) { - socket[kBlocking] = true - } + return this.#eventInit.error + } +} - let header = `${method} ${path} HTTP/1.1\r\n` +Object.defineProperties(MessageEvent.prototype, { + [Symbol.toStringTag]: { + value: 'MessageEvent', + configurable: true + }, + data: kEnumerableProperty, + origin: kEnumerableProperty, + lastEventId: kEnumerableProperty, + source: kEnumerableProperty, + ports: kEnumerableProperty, + initMessageEvent: kEnumerableProperty +}) - if (typeof host === 'string') { - header += `host: ${host}\r\n` - } else { - header += client[kHostHeader] - } +Object.defineProperties(CloseEvent.prototype, { + [Symbol.toStringTag]: { + value: 'CloseEvent', + configurable: true + }, + reason: kEnumerableProperty, + code: kEnumerableProperty, + wasClean: kEnumerableProperty +}) - if (upgrade) { - header += `connection: upgrade\r\nupgrade: ${upgrade}\r\n` - } else if (client[kPipelining] && !socket[kReset]) { - header += 'connection: keep-alive\r\n' - } else { - header += 'connection: close\r\n' - } +Object.defineProperties(ErrorEvent.prototype, { + [Symbol.toStringTag]: { + value: 'ErrorEvent', + configurable: true + }, + message: kEnumerableProperty, + filename: kEnumerableProperty, + lineno: kEnumerableProperty, + colno: kEnumerableProperty, + error: kEnumerableProperty +}) - if (headers) { - header += headers - } +webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort) + +webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.MessagePort +) + +const eventInit = [ + { + key: 'bubbles', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'cancelable', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'composed', + converter: webidl.converters.boolean, + defaultValue: false + } +] + +webidl.converters.MessageEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: 'data', + converter: webidl.converters.any, + defaultValue: null + }, + { + key: 'origin', + converter: webidl.converters.USVString, + defaultValue: '' + }, + { + key: 'lastEventId', + converter: webidl.converters.DOMString, + defaultValue: '' + }, + { + key: 'source', + // Node doesn't implement WindowProxy or ServiceWorker, so the only + // valid value for source is a MessagePort. + converter: webidl.nullableConverter(webidl.converters.MessagePort), + defaultValue: null + }, + { + key: 'ports', + converter: webidl.converters['sequence'], + get defaultValue () { + return [] + } + } +]) + +webidl.converters.CloseEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: 'wasClean', + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: 'code', + converter: webidl.converters['unsigned short'], + defaultValue: 0 + }, + { + key: 'reason', + converter: webidl.converters.USVString, + defaultValue: '' + } +]) + +webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: 'message', + converter: webidl.converters.DOMString, + defaultValue: '' + }, + { + key: 'filename', + converter: webidl.converters.USVString, + defaultValue: '' + }, + { + key: 'lineno', + converter: webidl.converters['unsigned long'], + defaultValue: 0 + }, + { + key: 'colno', + converter: webidl.converters['unsigned long'], + defaultValue: 0 + }, + { + key: 'error', + converter: webidl.converters.any + } +]) + +module.exports = { + MessageEvent, + CloseEvent, + ErrorEvent +} - if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request, headers: header, socket }) - } - /* istanbul ignore else: assertion */ - if (!body || bodyLength === 0) { - if (contentLength === 0) { - socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1') - } else { - assert(contentLength === null, 'no body must not have content length') - socket.write(`${header}\r\n`, 'latin1') - } - request.onRequestSent() - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, 'buffer body must have content length') - - socket.cork() - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') - socket.write(body) - socket.uncork() - request.onBodySent(body) - request.onRequestSent() - if (!expectsPayload) { - socket[kReset] = true - } - } else if (util.isBlobLike(body)) { - if (typeof body.stream === 'function') { - writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }) - } else { - writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }) - } - } else if (util.isStream(body)) { - writeStream({ body, client, request, socket, contentLength, header, expectsPayload }) - } else if (util.isIterable(body)) { - writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }) - } else { - assert(false) - } +/***/ }), - return true - } +/***/ 5444: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - function writeH2(client, session, request) { - const { body, method, path, host, upgrade, expectContinue, signal, headers: reqHeaders } = request +"use strict"; - let headers - if (typeof reqHeaders === 'string') headers = Request[kHTTP2CopyHeaders](reqHeaders.trim()) - else headers = reqHeaders - if (upgrade) { - errorRequest(client, request, new Error('Upgrade not supported for H2')) - return false - } +const { maxUnsigned16Bit } = __nccwpck_require__(9188) - try { - // TODO(HTTP/2): Should we call onConnect immediately or on stream ready event? - request.onConnect((err) => { - if (request.aborted || request.completed) { - return - } +/** @type {import('crypto')} */ +let crypto +try { + crypto = __nccwpck_require__(6113) +} catch { - errorRequest(client, request, err || new RequestAbortedError()) - }) - } catch (err) { - errorRequest(client, request, err) - } +} - if (request.aborted) { - return false - } +class WebsocketFrameSend { + /** + * @param {Buffer|undefined} data + */ + constructor (data) { + this.frameData = data + this.maskKey = crypto.randomBytes(4) + } + + createFrame (opcode) { + const bodyLength = this.frameData?.byteLength ?? 0 + + /** @type {number} */ + let payloadLength = bodyLength // 0-125 + let offset = 6 + + if (bodyLength > maxUnsigned16Bit) { + offset += 8 // payload length is next 8 bytes + payloadLength = 127 + } else if (bodyLength > 125) { + offset += 2 // payload length is next 2 bytes + payloadLength = 126 + } + + const buffer = Buffer.allocUnsafe(bodyLength + offset) + + // Clear first 2 bytes, everything else is overwritten + buffer[0] = buffer[1] = 0 + buffer[0] |= 0x80 // FIN + buffer[0] = (buffer[0] & 0xF0) + opcode // opcode + + /*! ws. MIT License. Einar Otto Stangvik */ + buffer[offset - 4] = this.maskKey[0] + buffer[offset - 3] = this.maskKey[1] + buffer[offset - 2] = this.maskKey[2] + buffer[offset - 1] = this.maskKey[3] + + buffer[1] = payloadLength + + if (payloadLength === 126) { + buffer.writeUInt16BE(bodyLength, 2) + } else if (payloadLength === 127) { + // Clear extended payload length + buffer[2] = buffer[3] = 0 + buffer.writeUIntBE(bodyLength, 4, 6) + } + + buffer[1] |= 0x80 // MASK + + // mask body + for (let i = 0; i < bodyLength; i++) { + buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4] + } + + return buffer + } +} - /** @type {import('node:http2').ClientHttp2Stream} */ - let stream - const h2State = client[kHTTP2SessionState] - - headers[HTTP2_HEADER_AUTHORITY] = host || client[kHost] - headers[HTTP2_HEADER_METHOD] = method - - if (method === 'CONNECT') { - session.ref() - // we are already connected, streams are pending, first request - // will create a new stream. We trigger a request to create the stream and wait until - // `ready` event is triggered - // We disabled endStream to allow the user to write to the stream - stream = session.request(headers, { endStream: false, signal }) - - if (stream.id && !stream.pending) { - request.onUpgrade(null, null, stream) - ++h2State.openStreams - } else { - stream.once('ready', () => { - request.onUpgrade(null, null, stream) - ++h2State.openStreams - }) - } +module.exports = { + WebsocketFrameSend +} - stream.once('close', () => { - h2State.openStreams -= 1 - // TODO(HTTP/2): unref only if current streams count is 0 - if (h2State.openStreams === 0) session.unref() - }) - return true - } +/***/ }), - // https://tools.ietf.org/html/rfc7540#section-8.3 - // :path and :scheme headers must be omited when sending CONNECT +/***/ 1688: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - headers[HTTP2_HEADER_PATH] = path - headers[HTTP2_HEADER_SCHEME] = 'https' +"use strict"; + + +const { Writable } = __nccwpck_require__(2781) +const diagnosticsChannel = __nccwpck_require__(7643) +const { parserStates, opcodes, states, emptyBuffer } = __nccwpck_require__(9188) +const { kReadyState, kSentClose, kResponse, kReceivedClose } = __nccwpck_require__(7578) +const { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = __nccwpck_require__(5515) +const { WebsocketFrameSend } = __nccwpck_require__(5444) + +// This code was influenced by ws released under the MIT license. +// Copyright (c) 2011 Einar Otto Stangvik +// Copyright (c) 2013 Arnout Kazemier and contributors +// Copyright (c) 2016 Luigi Pinca and contributors + +const channels = {} +channels.ping = diagnosticsChannel.channel('undici:websocket:ping') +channels.pong = diagnosticsChannel.channel('undici:websocket:pong') + +class ByteParser extends Writable { + #buffers = [] + #byteOffset = 0 + + #state = parserStates.INFO + + #info = {} + #fragments = [] + + constructor (ws) { + super() + + this.ws = ws + } + + /** + * @param {Buffer} chunk + * @param {() => void} callback + */ + _write (chunk, _, callback) { + this.#buffers.push(chunk) + this.#byteOffset += chunk.length + + this.run(callback) + } + + /** + * Runs whenever a new chunk is received. + * Callback is called whenever there are no more chunks buffering, + * or not enough bytes are buffered to parse. + */ + run (callback) { + while (true) { + if (this.#state === parserStates.INFO) { + // If there aren't enough bytes to parse the payload length, etc. + if (this.#byteOffset < 2) { + return callback() + } + + const buffer = this.consume(2) + + this.#info.fin = (buffer[0] & 0x80) !== 0 + this.#info.opcode = buffer[0] & 0x0F + + // If we receive a fragmented message, we use the type of the first + // frame to parse the full message as binary/text, when it's terminated + this.#info.originalOpcode ??= this.#info.opcode + + this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION + + if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) { + // Only text and binary frames can be fragmented + failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.') + return + } + + const payloadLength = buffer[1] & 0x7F + + if (payloadLength <= 125) { + this.#info.payloadLength = payloadLength + this.#state = parserStates.READ_DATA + } else if (payloadLength === 126) { + this.#state = parserStates.PAYLOADLENGTH_16 + } else if (payloadLength === 127) { + this.#state = parserStates.PAYLOADLENGTH_64 + } + + if (this.#info.fragmented && payloadLength > 125) { + // A fragmented frame can't be fragmented itself + failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.') + return + } else if ( + (this.#info.opcode === opcodes.PING || + this.#info.opcode === opcodes.PONG || + this.#info.opcode === opcodes.CLOSE) && + payloadLength > 125 + ) { + // Control frames can have a payload length of 125 bytes MAX + failWebsocketConnection(this.ws, 'Payload length for control frame exceeded 125 bytes.') + return + } else if (this.#info.opcode === opcodes.CLOSE) { + if (payloadLength === 1) { + failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.') + return + } + + const body = this.consume(payloadLength) + + this.#info.closeInfo = this.parseCloseBody(false, body) + + if (!this.ws[kSentClose]) { + // If an endpoint receives a Close frame and did not previously send a + // Close frame, the endpoint MUST send a Close frame in response. (When + // sending a Close frame in response, the endpoint typically echos the + // status code it received.) + const body = Buffer.allocUnsafe(2) + body.writeUInt16BE(this.#info.closeInfo.code, 0) + const closeFrame = new WebsocketFrameSend(body) + + this.ws[kResponse].socket.write( + closeFrame.createFrame(opcodes.CLOSE), + (err) => { + if (!err) { + this.ws[kSentClose] = true + } + } + ) + } + + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + this.ws[kReadyState] = states.CLOSING + this.ws[kReceivedClose] = true + + this.end() + + return + } else if (this.#info.opcode === opcodes.PING) { + // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in + // response, unless it already received a Close frame. + // A Pong frame sent in response to a Ping frame must have identical + // "Application data" + + const body = this.consume(payloadLength) + + if (!this.ws[kReceivedClose]) { + const frame = new WebsocketFrameSend(body) + + this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)) + + if (channels.ping.hasSubscribers) { + channels.ping.publish({ + payload: body + }) + } + } + + this.#state = parserStates.INFO + + if (this.#byteOffset > 0) { + continue + } else { + callback() + return + } + } else if (this.#info.opcode === opcodes.PONG) { + // A Pong frame MAY be sent unsolicited. This serves as a + // unidirectional heartbeat. A response to an unsolicited Pong frame is + // not expected. + + const body = this.consume(payloadLength) + + if (channels.pong.hasSubscribers) { + channels.pong.publish({ + payload: body + }) + } + + if (this.#byteOffset > 0) { + continue + } else { + callback() + return + } + } + } else if (this.#state === parserStates.PAYLOADLENGTH_16) { + if (this.#byteOffset < 2) { + return callback() + } + + const buffer = this.consume(2) + + this.#info.payloadLength = buffer.readUInt16BE(0) + this.#state = parserStates.READ_DATA + } else if (this.#state === parserStates.PAYLOADLENGTH_64) { + if (this.#byteOffset < 8) { + return callback() + } + + const buffer = this.consume(8) + const upper = buffer.readUInt32BE(0) + + // 2^31 is the maxinimum bytes an arraybuffer can contain + // on 32-bit systems. Although, on 64-bit systems, this is + // 2^53-1 bytes. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length + // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275 + // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e + if (upper > 2 ** 31 - 1) { + failWebsocketConnection(this.ws, 'Received payload length > 2^31 bytes.') + return + } + + const lower = buffer.readUInt32BE(4) + + this.#info.payloadLength = (upper << 8) + lower + this.#state = parserStates.READ_DATA + } else if (this.#state === parserStates.READ_DATA) { + if (this.#byteOffset < this.#info.payloadLength) { + // If there is still more data in this chunk that needs to be read + return callback() + } else if (this.#byteOffset >= this.#info.payloadLength) { + // If the server sent multiple frames in a single chunk + + const body = this.consume(this.#info.payloadLength) + + this.#fragments.push(body) + + // If the frame is unfragmented, or a fragmented frame was terminated, + // a message was received + if (!this.#info.fragmented || (this.#info.fin && this.#info.opcode === opcodes.CONTINUATION)) { + const fullMessage = Buffer.concat(this.#fragments) + + websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage) + + this.#info = {} + this.#fragments.length = 0 + } + + this.#state = parserStates.INFO + } + } + + if (this.#byteOffset > 0) { + continue + } else { + callback() + break + } + } + } + + /** + * Take n bytes from the buffered Buffers + * @param {number} n + * @returns {Buffer|null} + */ + consume (n) { + if (n > this.#byteOffset) { + return null + } else if (n === 0) { + return emptyBuffer + } + + if (this.#buffers[0].length === n) { + this.#byteOffset -= this.#buffers[0].length + return this.#buffers.shift() + } + + const buffer = Buffer.allocUnsafe(n) + let offset = 0 + + while (offset !== n) { + const next = this.#buffers[0] + const { length } = next + + if (length + offset === n) { + buffer.set(this.#buffers.shift(), offset) + break + } else if (length + offset > n) { + buffer.set(next.subarray(0, n - offset), offset) + this.#buffers[0] = next.subarray(n - offset) + break + } else { + buffer.set(this.#buffers.shift(), offset) + offset += next.length + } + } + + this.#byteOffset -= n + + return buffer + } + + parseCloseBody (onlyCode, data) { + // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5 + /** @type {number|undefined} */ + let code + + if (data.length >= 2) { + // _The WebSocket Connection Close Code_ is + // defined as the status code (Section 7.4) contained in the first Close + // control frame received by the application + code = data.readUInt16BE(0) + } + + if (onlyCode) { + if (!isValidStatusCode(code)) { + return null + } + + return { code } + } + + // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6 + /** @type {Buffer} */ + let reason = data.subarray(2) + + // Remove BOM + if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) { + reason = reason.subarray(3) + } + + if (code !== undefined && !isValidStatusCode(code)) { + return null + } + + try { + // TODO: optimize this + reason = new TextDecoder('utf-8', { fatal: true }).decode(reason) + } catch { + return null + } + + return { code, reason } + } + + get closingInfo () { + return this.#info.closeInfo + } +} - // https://tools.ietf.org/html/rfc7231#section-4.3.1 - // https://tools.ietf.org/html/rfc7231#section-4.3.2 - // https://tools.ietf.org/html/rfc7231#section-4.3.5 +module.exports = { + ByteParser +} - // Sending a payload body on a request that does not - // expect it can cause undefined behavior on some - // servers and corrupt connection state. Do not - // re-use the connection for further requests. - const expectsPayload = ( - method === 'PUT' || - method === 'POST' || - method === 'PATCH' - ) +/***/ }), - if (body && typeof body.read === 'function') { - // Try to read EOF in order to get length. - body.read(0) - } +/***/ 7578: +/***/ ((module) => { - let contentLength = util.bodyLength(body) +"use strict"; - if (contentLength == null) { - contentLength = request.contentLength - } - if (contentLength === 0 || !expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD NOT send a Content-Length header field when - // the request message does not contain a payload body and the method - // semantics do not anticipate such a body. +module.exports = { + kWebSocketURL: Symbol('url'), + kReadyState: Symbol('ready state'), + kController: Symbol('controller'), + kResponse: Symbol('response'), + kBinaryType: Symbol('binary type'), + kSentClose: Symbol('sent close'), + kReceivedClose: Symbol('received close'), + kByteParser: Symbol('byte parser') +} - contentLength = null - } - // https://github.com/nodejs/undici/issues/2046 - // A user agent may send a Content-Length header with 0 value, this should be allowed. - if (shouldSendContentLength(method) && contentLength > 0 && request.contentLength != null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()) - return false - } +/***/ }), - process.emitWarning(new RequestContentLengthMismatchError()) - } +/***/ 5515: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (contentLength != null) { - assert(body, 'no body must not have content length') - headers[HTTP2_HEADER_CONTENT_LENGTH] = `${contentLength}` - } +"use strict"; - session.ref() - const shouldEndStream = method === 'GET' || method === 'HEAD' - if (expectContinue) { - headers[HTTP2_HEADER_EXPECT] = '100-continue' - stream = session.request(headers, { endStream: shouldEndStream, signal }) +const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = __nccwpck_require__(7578) +const { states, opcodes } = __nccwpck_require__(9188) +const { MessageEvent, ErrorEvent } = __nccwpck_require__(2611) - stream.once('continue', writeBodyH2) - } else { - stream = session.request(headers, { - endStream: shouldEndStream, - signal - }) - writeBodyH2() - } +/* globals Blob */ - // Increment counter as we have new several streams open - ++h2State.openStreams +/** + * @param {import('./websocket').WebSocket} ws + */ +function isEstablished (ws) { + // If the server's response is validated as provided for above, it is + // said that _The WebSocket Connection is Established_ and that the + // WebSocket Connection is in the OPEN state. + return ws[kReadyState] === states.OPEN +} - stream.once('response', headers => { - const { [HTTP2_HEADER_STATUS]: statusCode, ...realHeaders } = headers +/** + * @param {import('./websocket').WebSocket} ws + */ +function isClosing (ws) { + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + return ws[kReadyState] === states.CLOSING +} - if (request.onHeaders(Number(statusCode), realHeaders, stream.resume.bind(stream), '') === false) { - stream.pause() - } - }) +/** + * @param {import('./websocket').WebSocket} ws + */ +function isClosed (ws) { + return ws[kReadyState] === states.CLOSED +} - stream.once('end', () => { - request.onComplete([]) - }) +/** + * @see https://dom.spec.whatwg.org/#concept-event-fire + * @param {string} e + * @param {EventTarget} target + * @param {EventInit | undefined} eventInitDict + */ +function fireEvent (e, target, eventConstructor = Event, eventInitDict) { + // 1. If eventConstructor is not given, then let eventConstructor be Event. + + // 2. Let event be the result of creating an event given eventConstructor, + // in the relevant realm of target. + // 3. Initialize event’s type attribute to e. + const event = new eventConstructor(e, eventInitDict) // eslint-disable-line new-cap + + // 4. Initialize any other IDL attributes of event as described in the + // invocation of this algorithm. + + // 5. Return the result of dispatching event at target, with legacy target + // override flag set if set. + target.dispatchEvent(event) +} - stream.on('data', (chunk) => { - if (request.onData(chunk) === false) { - stream.pause() - } - }) +/** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + * @param {import('./websocket').WebSocket} ws + * @param {number} type Opcode + * @param {Buffer} data application data + */ +function websocketMessageReceived (ws, type, data) { + // 1. If ready state is not OPEN (1), then return. + if (ws[kReadyState] !== states.OPEN) { + return + } + + // 2. Let dataForEvent be determined by switching on type and binary type: + let dataForEvent + + if (type === opcodes.TEXT) { + // -> type indicates that the data is Text + // a new DOMString containing data + try { + dataForEvent = new TextDecoder('utf-8', { fatal: true }).decode(data) + } catch { + failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.') + return + } + } else if (type === opcodes.BINARY) { + if (ws[kBinaryType] === 'blob') { + // -> type indicates that the data is Binary and binary type is "blob" + // a new Blob object, created in the relevant Realm of the WebSocket + // object, that represents data as its raw data + dataForEvent = new Blob([data]) + } else { + // -> type indicates that the data is Binary and binary type is "arraybuffer" + // a new ArrayBuffer object, created in the relevant Realm of the + // WebSocket object, whose contents are data + dataForEvent = new Uint8Array(data).buffer + } + } + + // 3. Fire an event named message at the WebSocket object, using MessageEvent, + // with the origin attribute initialized to the serialization of the WebSocket + // object’s url's origin, and the data attribute initialized to dataForEvent. + fireEvent('message', ws, MessageEvent, { + origin: ws[kWebSocketURL].origin, + data: dataForEvent + }) +} - stream.once('close', () => { - h2State.openStreams -= 1 - // TODO(HTTP/2): unref only if current streams count is 0 - if (h2State.openStreams === 0) { - session.unref() - } - }) +/** + * @see https://datatracker.ietf.org/doc/html/rfc6455 + * @see https://datatracker.ietf.org/doc/html/rfc2616 + * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407 + * @param {string} protocol + */ +function isValidSubprotocol (protocol) { + // If present, this value indicates one + // or more comma-separated subprotocol the client wishes to speak, + // ordered by preference. The elements that comprise this value + // MUST be non-empty strings with characters in the range U+0021 to + // U+007E not including separator characters as defined in + // [RFC2616] and MUST all be unique strings. + if (protocol.length === 0) { + return false + } + + for (const char of protocol) { + const code = char.charCodeAt(0) + + if ( + code < 0x21 || + code > 0x7E || + char === '(' || + char === ')' || + char === '<' || + char === '>' || + char === '@' || + char === ',' || + char === ';' || + char === ':' || + char === '\\' || + char === '"' || + char === '/' || + char === '[' || + char === ']' || + char === '?' || + char === '=' || + char === '{' || + char === '}' || + code === 32 || // SP + code === 9 // HT + ) { + return false + } + } + + return true +} - stream.once('error', function (err) { - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1 - util.destroy(stream, err) - } - }) +/** + * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4 + * @param {number} code + */ +function isValidStatusCode (code) { + if (code >= 1000 && code < 1015) { + return ( + code !== 1004 && // reserved + code !== 1005 && // "MUST NOT be set as a status code" + code !== 1006 // "MUST NOT be set as a status code" + ) + } + + return code >= 3000 && code <= 4999 +} - stream.once('frameError', (type, code) => { - const err = new InformationalError(`HTTP/2: "frameError" received - type ${type}, code ${code}`) - errorRequest(client, request, err) +/** + * @param {import('./websocket').WebSocket} ws + * @param {string|undefined} reason + */ +function failWebsocketConnection (ws, reason) { + const { [kController]: controller, [kResponse]: response } = ws - if (client[kHTTP2Session] && !client[kHTTP2Session].destroyed && !this.closed && !this.destroyed) { - h2State.streams -= 1 - util.destroy(stream, err) - } - }) + controller.abort() - // stream.on('aborted', () => { - // // TODO(HTTP/2): Support aborted - // }) - - // stream.on('timeout', () => { - // // TODO(HTTP/2): Support timeout - // }) - - // stream.on('push', headers => { - // // TODO(HTTP/2): Suppor push - // }) - - // stream.on('trailers', headers => { - // // TODO(HTTP/2): Support trailers - // }) - - return true - - function writeBodyH2() { - /* istanbul ignore else: assertion */ - if (!body) { - request.onRequestSent() - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, 'buffer body must have content length') - stream.cork() - stream.write(body) - stream.uncork() - stream.end() - request.onBodySent(body) - request.onRequestSent() - } else if (util.isBlobLike(body)) { - if (typeof body.stream === 'function') { - writeIterable({ - client, - request, - contentLength, - h2stream: stream, - expectsPayload, - body: body.stream(), - socket: client[kSocket], - header: '' - }) - } else { - writeBlob({ - body, - client, - request, - contentLength, - expectsPayload, - h2stream: stream, - header: '', - socket: client[kSocket] - }) - } - } else if (util.isStream(body)) { - writeStream({ - body, - client, - request, - contentLength, - expectsPayload, - socket: client[kSocket], - h2stream: stream, - header: '' - }) - } else if (util.isIterable(body)) { - writeIterable({ - body, - client, - request, - contentLength, - expectsPayload, - header: '', - h2stream: stream, - socket: client[kSocket] - }) - } else { - assert(false) - } - } - } + if (response?.socket && !response.socket.destroyed) { + response.socket.destroy() + } - function writeStream({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, 'stream body cannot be pipelined') - - if (client[kHTTPConnVersion] === 'h2') { - // For HTTP/2, is enough to pipe the stream - const pipe = pipeline( - body, - h2stream, - (err) => { - if (err) { - util.destroy(body, err) - util.destroy(h2stream, err) - } else { - request.onRequestSent() - } - } - ) + if (reason) { + fireEvent('error', ws, ErrorEvent, { + error: new Error(reason) + }) + } +} - pipe.on('data', onPipeData) - pipe.once('end', () => { - pipe.removeListener('data', onPipeData) - util.destroy(pipe) - }) +module.exports = { + isEstablished, + isClosing, + isClosed, + fireEvent, + isValidSubprotocol, + isValidStatusCode, + failWebsocketConnection, + websocketMessageReceived +} - function onPipeData(chunk) { - request.onBodySent(chunk) - } - return - } +/***/ }), - let finished = false +/***/ 4284: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }) +"use strict"; + + +const { webidl } = __nccwpck_require__(1744) +const { DOMException } = __nccwpck_require__(1037) +const { URLSerializer } = __nccwpck_require__(685) +const { getGlobalOrigin } = __nccwpck_require__(1246) +const { staticPropertyDescriptors, states, opcodes, emptyBuffer } = __nccwpck_require__(9188) +const { + kWebSocketURL, + kReadyState, + kController, + kBinaryType, + kResponse, + kSentClose, + kByteParser +} = __nccwpck_require__(7578) +const { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = __nccwpck_require__(5515) +const { establishWebSocketConnection } = __nccwpck_require__(5354) +const { WebsocketFrameSend } = __nccwpck_require__(5444) +const { ByteParser } = __nccwpck_require__(1688) +const { kEnumerableProperty, isBlobLike } = __nccwpck_require__(3983) +const { getGlobalDispatcher } = __nccwpck_require__(1892) +const { types } = __nccwpck_require__(3837) + +let experimentalWarned = false + +// https://websockets.spec.whatwg.org/#interface-definition +class WebSocket extends EventTarget { + #events = { + open: null, + error: null, + close: null, + message: null + } + + #bufferedAmount = 0 + #protocol = '' + #extensions = '' + + /** + * @param {string} url + * @param {string|string[]} protocols + */ + constructor (url, protocols = []) { + super() + + webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket constructor' }) + + if (!experimentalWarned) { + experimentalWarned = true + process.emitWarning('WebSockets are experimental, expect them to change at any time.', { + code: 'UNDICI-WS' + }) + } + + const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols) + + url = webidl.converters.USVString(url) + protocols = options.protocols + + // 1. Let baseURL be this's relevant settings object's API base URL. + const baseURL = getGlobalOrigin() + + // 1. Let urlRecord be the result of applying the URL parser to url with baseURL. + let urlRecord + + try { + urlRecord = new URL(url, baseURL) + } catch (e) { + // 3. If urlRecord is failure, then throw a "SyntaxError" DOMException. + throw new DOMException(e, 'SyntaxError') + } + + // 4. If urlRecord’s scheme is "http", then set urlRecord’s scheme to "ws". + if (urlRecord.protocol === 'http:') { + urlRecord.protocol = 'ws:' + } else if (urlRecord.protocol === 'https:') { + // 5. Otherwise, if urlRecord’s scheme is "https", set urlRecord’s scheme to "wss". + urlRecord.protocol = 'wss:' + } + + // 6. If urlRecord’s scheme is not "ws" or "wss", then throw a "SyntaxError" DOMException. + if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') { + throw new DOMException( + `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, + 'SyntaxError' + ) + } + + // 7. If urlRecord’s fragment is non-null, then throw a "SyntaxError" + // DOMException. + if (urlRecord.hash || urlRecord.href.endsWith('#')) { + throw new DOMException('Got fragment', 'SyntaxError') + } + + // 8. If protocols is a string, set protocols to a sequence consisting + // of just that string. + if (typeof protocols === 'string') { + protocols = [protocols] + } + + // 9. If any of the values in protocols occur more than once or otherwise + // fail to match the requirements for elements that comprise the value + // of `Sec-WebSocket-Protocol` fields as defined by The WebSocket + // protocol, then throw a "SyntaxError" DOMException. + if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) { + throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError') + } + + if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) { + throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError') + } + + // 10. Set this's url to urlRecord. + this[kWebSocketURL] = new URL(urlRecord.href) + + // 11. Let client be this's relevant settings object. + + // 12. Run this step in parallel: + + // 1. Establish a WebSocket connection given urlRecord, protocols, + // and client. + this[kController] = establishWebSocketConnection( + urlRecord, + protocols, + this, + (response) => this.#onConnectionEstablished(response), + options + ) + + // Each WebSocket object has an associated ready state, which is a + // number representing the state of the connection. Initially it must + // be CONNECTING (0). + this[kReadyState] = WebSocket.CONNECTING + + // The extensions attribute must initially return the empty string. + + // The protocol attribute must initially return the empty string. + + // Each WebSocket object has an associated binary type, which is a + // BinaryType. Initially it must be "blob". + this[kBinaryType] = 'blob' + } + + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-close + * @param {number|undefined} code + * @param {string|undefined} reason + */ + close (code = undefined, reason = undefined) { + webidl.brandCheck(this, WebSocket) + + if (code !== undefined) { + code = webidl.converters['unsigned short'](code, { clamp: true }) + } + + if (reason !== undefined) { + reason = webidl.converters.USVString(reason) + } + + // 1. If code is present, but is neither an integer equal to 1000 nor an + // integer in the range 3000 to 4999, inclusive, throw an + // "InvalidAccessError" DOMException. + if (code !== undefined) { + if (code !== 1000 && (code < 3000 || code > 4999)) { + throw new DOMException('invalid code', 'InvalidAccessError') + } + } + + let reasonByteLength = 0 + + // 2. If reason is present, then run these substeps: + if (reason !== undefined) { + // 1. Let reasonBytes be the result of encoding reason. + // 2. If reasonBytes is longer than 123 bytes, then throw a + // "SyntaxError" DOMException. + reasonByteLength = Buffer.byteLength(reason) + + if (reasonByteLength > 123) { + throw new DOMException( + `Reason must be less than 123 bytes; received ${reasonByteLength}`, + 'SyntaxError' + ) + } + } + + // 3. Run the first matching steps from the following list: + if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) { + // If this's ready state is CLOSING (2) or CLOSED (3) + // Do nothing. + } else if (!isEstablished(this)) { + // If the WebSocket connection is not yet established + // Fail the WebSocket connection and set this's ready state + // to CLOSING (2). + failWebsocketConnection(this, 'Connection was closed before it was established.') + this[kReadyState] = WebSocket.CLOSING + } else if (!isClosing(this)) { + // If the WebSocket closing handshake has not yet been started + // Start the WebSocket closing handshake and set this's ready + // state to CLOSING (2). + // - If neither code nor reason is present, the WebSocket Close + // message must not have a body. + // - If code is present, then the status code to use in the + // WebSocket Close message must be the integer given by code. + // - If reason is also present, then reasonBytes must be + // provided in the Close message after the status code. + + const frame = new WebsocketFrameSend() + + // If neither code nor reason is present, the WebSocket Close + // message must not have a body. + + // If code is present, then the status code to use in the + // WebSocket Close message must be the integer given by code. + if (code !== undefined && reason === undefined) { + frame.frameData = Buffer.allocUnsafe(2) + frame.frameData.writeUInt16BE(code, 0) + } else if (code !== undefined && reason !== undefined) { + // If reason is also present, then reasonBytes must be + // provided in the Close message after the status code. + frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength) + frame.frameData.writeUInt16BE(code, 0) + // the body MAY contain UTF-8-encoded data with value /reason/ + frame.frameData.write(reason, 2, 'utf-8') + } else { + frame.frameData = emptyBuffer + } + + /** @type {import('stream').Duplex} */ + const socket = this[kResponse].socket + + socket.write(frame.createFrame(opcodes.CLOSE), (err) => { + if (!err) { + this[kSentClose] = true + } + }) + + // Upon either sending or receiving a Close control frame, it is said + // that _The WebSocket Closing Handshake is Started_ and that the + // WebSocket connection is in the CLOSING state. + this[kReadyState] = states.CLOSING + } else { + // Otherwise + // Set this's ready state to CLOSING (2). + this[kReadyState] = WebSocket.CLOSING + } + } + + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-send + * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data + */ + send (data) { + webidl.brandCheck(this, WebSocket) + + webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket.send' }) + + data = webidl.converters.WebSocketSendData(data) + + // 1. If this's ready state is CONNECTING, then throw an + // "InvalidStateError" DOMException. + if (this[kReadyState] === WebSocket.CONNECTING) { + throw new DOMException('Sent before connected.', 'InvalidStateError') + } + + // 2. Run the appropriate set of steps from the following list: + // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1 + // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2 + + if (!isEstablished(this) || isClosing(this)) { + return + } + + /** @type {import('stream').Duplex} */ + const socket = this[kResponse].socket + + // If data is a string + if (typeof data === 'string') { + // If the WebSocket connection is established and the WebSocket + // closing handshake has not yet started, then the user agent + // must send a WebSocket Message comprised of the data argument + // using a text frame opcode; if the data cannot be sent, e.g. + // because it would need to be buffered but the buffer is full, + // the user agent must flag the WebSocket as full and then close + // the WebSocket connection. Any invocation of this method with a + // string argument that does not throw an exception must increase + // the bufferedAmount attribute by the number of bytes needed to + // express the argument as UTF-8. + + const value = Buffer.from(data) + const frame = new WebsocketFrameSend(value) + const buffer = frame.createFrame(opcodes.TEXT) + + this.#bufferedAmount += value.byteLength + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength + }) + } else if (types.isArrayBuffer(data)) { + // If the WebSocket connection is established, and the WebSocket + // closing handshake has not yet started, then the user agent must + // send a WebSocket Message comprised of data using a binary frame + // opcode; if the data cannot be sent, e.g. because it would need + // to be buffered but the buffer is full, the user agent must flag + // the WebSocket as full and then close the WebSocket connection. + // The data to be sent is the data stored in the buffer described + // by the ArrayBuffer object. Any invocation of this method with an + // ArrayBuffer argument that does not throw an exception must + // increase the bufferedAmount attribute by the length of the + // ArrayBuffer in bytes. + + const value = Buffer.from(data) + const frame = new WebsocketFrameSend(value) + const buffer = frame.createFrame(opcodes.BINARY) + + this.#bufferedAmount += value.byteLength + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength + }) + } else if (ArrayBuffer.isView(data)) { + // If the WebSocket connection is established, and the WebSocket + // closing handshake has not yet started, then the user agent must + // send a WebSocket Message comprised of data using a binary frame + // opcode; if the data cannot be sent, e.g. because it would need to + // be buffered but the buffer is full, the user agent must flag the + // WebSocket as full and then close the WebSocket connection. The + // data to be sent is the data stored in the section of the buffer + // described by the ArrayBuffer object that data references. Any + // invocation of this method with this kind of argument that does + // not throw an exception must increase the bufferedAmount attribute + // by the length of data’s buffer in bytes. + + const ab = Buffer.from(data, data.byteOffset, data.byteLength) + + const frame = new WebsocketFrameSend(ab) + const buffer = frame.createFrame(opcodes.BINARY) + + this.#bufferedAmount += ab.byteLength + socket.write(buffer, () => { + this.#bufferedAmount -= ab.byteLength + }) + } else if (isBlobLike(data)) { + // If the WebSocket connection is established, and the WebSocket + // closing handshake has not yet started, then the user agent must + // send a WebSocket Message comprised of data using a binary frame + // opcode; if the data cannot be sent, e.g. because it would need to + // be buffered but the buffer is full, the user agent must flag the + // WebSocket as full and then close the WebSocket connection. The data + // to be sent is the raw data represented by the Blob object. Any + // invocation of this method with a Blob argument that does not throw + // an exception must increase the bufferedAmount attribute by the size + // of the Blob object’s raw data, in bytes. + + const frame = new WebsocketFrameSend() + + data.arrayBuffer().then((ab) => { + const value = Buffer.from(ab) + frame.frameData = value + const buffer = frame.createFrame(opcodes.BINARY) + + this.#bufferedAmount += value.byteLength + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength + }) + }) + } + } + + get readyState () { + webidl.brandCheck(this, WebSocket) + + // The readyState getter steps are to return this's ready state. + return this[kReadyState] + } + + get bufferedAmount () { + webidl.brandCheck(this, WebSocket) + + return this.#bufferedAmount + } + + get url () { + webidl.brandCheck(this, WebSocket) + + // The url getter steps are to return this's url, serialized. + return URLSerializer(this[kWebSocketURL]) + } + + get extensions () { + webidl.brandCheck(this, WebSocket) + + return this.#extensions + } + + get protocol () { + webidl.brandCheck(this, WebSocket) + + return this.#protocol + } + + get onopen () { + webidl.brandCheck(this, WebSocket) + + return this.#events.open + } + + set onopen (fn) { + webidl.brandCheck(this, WebSocket) + + if (this.#events.open) { + this.removeEventListener('open', this.#events.open) + } + + if (typeof fn === 'function') { + this.#events.open = fn + this.addEventListener('open', fn) + } else { + this.#events.open = null + } + } + + get onerror () { + webidl.brandCheck(this, WebSocket) + + return this.#events.error + } + + set onerror (fn) { + webidl.brandCheck(this, WebSocket) + + if (this.#events.error) { + this.removeEventListener('error', this.#events.error) + } + + if (typeof fn === 'function') { + this.#events.error = fn + this.addEventListener('error', fn) + } else { + this.#events.error = null + } + } + + get onclose () { + webidl.brandCheck(this, WebSocket) + + return this.#events.close + } + + set onclose (fn) { + webidl.brandCheck(this, WebSocket) + + if (this.#events.close) { + this.removeEventListener('close', this.#events.close) + } + + if (typeof fn === 'function') { + this.#events.close = fn + this.addEventListener('close', fn) + } else { + this.#events.close = null + } + } + + get onmessage () { + webidl.brandCheck(this, WebSocket) - const onData = function (chunk) { - if (finished) { - return - } + return this.#events.message + } + + set onmessage (fn) { + webidl.brandCheck(this, WebSocket) + + if (this.#events.message) { + this.removeEventListener('message', this.#events.message) + } + + if (typeof fn === 'function') { + this.#events.message = fn + this.addEventListener('message', fn) + } else { + this.#events.message = null + } + } + + get binaryType () { + webidl.brandCheck(this, WebSocket) + + return this[kBinaryType] + } + + set binaryType (type) { + webidl.brandCheck(this, WebSocket) + + if (type !== 'blob' && type !== 'arraybuffer') { + this[kBinaryType] = 'blob' + } else { + this[kBinaryType] = type + } + } + + /** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + */ + #onConnectionEstablished (response) { + // processResponse is called when the "response’s header list has been received and initialized." + // once this happens, the connection is open + this[kResponse] = response + + const parser = new ByteParser(this) + parser.on('drain', function onParserDrain () { + this.ws[kResponse].socket.resume() + }) + + response.socket.ws = this + this[kByteParser] = parser + + // 1. Change the ready state to OPEN (1). + this[kReadyState] = states.OPEN + + // 2. Change the extensions attribute’s value to the extensions in use, if + // it is not the null value. + // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1 + const extensions = response.headersList.get('sec-websocket-extensions') + + if (extensions !== null) { + this.#extensions = extensions + } + + // 3. Change the protocol attribute’s value to the subprotocol in use, if + // it is not the null value. + // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9 + const protocol = response.headersList.get('sec-websocket-protocol') + + if (protocol !== null) { + this.#protocol = protocol + } + + // 4. Fire an event named open at the WebSocket object. + fireEvent('open', this) + } +} - try { - if (!writer.write(chunk) && this.pause) { - this.pause() - } - } catch (err) { - util.destroy(this, err) - } - } - const onDrain = function () { - if (finished) { - return - } +// https://websockets.spec.whatwg.org/#dom-websocket-connecting +WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING +// https://websockets.spec.whatwg.org/#dom-websocket-open +WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN +// https://websockets.spec.whatwg.org/#dom-websocket-closing +WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING +// https://websockets.spec.whatwg.org/#dom-websocket-closed +WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED + +Object.defineProperties(WebSocket.prototype, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors, + url: kEnumerableProperty, + readyState: kEnumerableProperty, + bufferedAmount: kEnumerableProperty, + onopen: kEnumerableProperty, + onerror: kEnumerableProperty, + onclose: kEnumerableProperty, + close: kEnumerableProperty, + onmessage: kEnumerableProperty, + binaryType: kEnumerableProperty, + send: kEnumerableProperty, + extensions: kEnumerableProperty, + protocol: kEnumerableProperty, + [Symbol.toStringTag]: { + value: 'WebSocket', + writable: false, + enumerable: false, + configurable: true + } +}) - if (body.resume) { - body.resume() - } - } - const onAbort = function () { - if (finished) { - return - } - const err = new RequestAbortedError() - queueMicrotask(() => onFinished(err)) - } - const onFinished = function (err) { - if (finished) { - return - } +Object.defineProperties(WebSocket, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors +}) - finished = true +webidl.converters['sequence'] = webidl.sequenceConverter( + webidl.converters.DOMString +) - assert(socket.destroyed || (socket[kWriting] && client[kRunning] <= 1)) +webidl.converters['DOMString or sequence'] = function (V) { + if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) { + return webidl.converters['sequence'](V) + } - socket - .off('drain', onDrain) - .off('error', onFinished) + return webidl.converters.DOMString(V) +} - body - .removeListener('data', onData) - .removeListener('end', onFinished) - .removeListener('error', onFinished) - .removeListener('close', onAbort) +// This implements the propsal made in https://github.com/whatwg/websockets/issues/42 +webidl.converters.WebSocketInit = webidl.dictionaryConverter([ + { + key: 'protocols', + converter: webidl.converters['DOMString or sequence'], + get defaultValue () { + return [] + } + }, + { + key: 'dispatcher', + converter: (V) => V, + get defaultValue () { + return getGlobalDispatcher() + } + }, + { + key: 'headers', + converter: webidl.nullableConverter(webidl.converters.HeadersInit) + } +]) + +webidl.converters['DOMString or sequence or WebSocketInit'] = function (V) { + if (webidl.util.Type(V) === 'Object' && !(Symbol.iterator in V)) { + return webidl.converters.WebSocketInit(V) + } + + return { protocols: webidl.converters['DOMString or sequence'](V) } +} - if (!err) { - try { - writer.end() - } catch (er) { - err = er - } - } +webidl.converters.WebSocketSendData = function (V) { + if (webidl.util.Type(V) === 'Object') { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }) + } - writer.destroy(err) + if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { + return webidl.converters.BufferSource(V) + } + } - if (err && (err.code !== 'UND_ERR_INFO' || err.message !== 'reset')) { - util.destroy(body, err) - } else { - util.destroy(body) - } - } + return webidl.converters.USVString(V) +} - body - .on('data', onData) - .on('end', onFinished) - .on('error', onFinished) - .on('close', onAbort) +module.exports = { + WebSocket +} - if (body.resume) { - body.resume() - } - socket - .on('drain', onDrain) - .on('error', onFinished) - } +/***/ }), - async function writeBlob({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength === body.size, 'blob body must have content length') +/***/ 5840: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - const isH2 = client[kHTTPConnVersion] === 'h2' - try { - if (contentLength != null && contentLength !== body.size) { - throw new RequestContentLengthMismatchError() - } +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "v1", ({ + enumerable: true, + get: function () { + return _v.default; + } +})); +Object.defineProperty(exports, "v3", ({ + enumerable: true, + get: function () { + return _v2.default; + } +})); +Object.defineProperty(exports, "v4", ({ + enumerable: true, + get: function () { + return _v3.default; + } +})); +Object.defineProperty(exports, "v5", ({ + enumerable: true, + get: function () { + return _v4.default; + } +})); +Object.defineProperty(exports, "NIL", ({ + enumerable: true, + get: function () { + return _nil.default; + } +})); +Object.defineProperty(exports, "version", ({ + enumerable: true, + get: function () { + return _version.default; + } +})); +Object.defineProperty(exports, "validate", ({ + enumerable: true, + get: function () { + return _validate.default; + } +})); +Object.defineProperty(exports, "stringify", ({ + enumerable: true, + get: function () { + return _stringify.default; + } +})); +Object.defineProperty(exports, "parse", ({ + enumerable: true, + get: function () { + return _parse.default; + } +})); + +var _v = _interopRequireDefault(__nccwpck_require__(8628)); + +var _v2 = _interopRequireDefault(__nccwpck_require__(6409)); + +var _v3 = _interopRequireDefault(__nccwpck_require__(5122)); + +var _v4 = _interopRequireDefault(__nccwpck_require__(9120)); + +var _nil = _interopRequireDefault(__nccwpck_require__(5332)); + +var _version = _interopRequireDefault(__nccwpck_require__(1595)); + +var _validate = _interopRequireDefault(__nccwpck_require__(6900)); + +var _stringify = _interopRequireDefault(__nccwpck_require__(8950)); + +var _parse = _interopRequireDefault(__nccwpck_require__(2746)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), - const buffer = Buffer.from(await body.arrayBuffer()) - - if (isH2) { - h2stream.cork() - h2stream.write(buffer) - h2stream.uncork() - } else { - socket.cork() - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') - socket.write(buffer) - socket.uncork() - } +/***/ 4569: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - request.onBodySent(buffer) - request.onRequestSent() +"use strict"; - if (!expectsPayload) { - socket[kReset] = true - } - resume(client) - } catch (err) { - util.destroy(isH2 ? h2stream : socket, err) - } - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - async function writeIterable({ h2stream, body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, 'iterator body cannot be pipelined') +var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); - let callback = null - function onDrain() { - if (callback) { - const cb = callback - callback = null - cb() - } - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - const waitForDrain = () => new Promise((resolve, reject) => { - assert(callback === null) +function md5(bytes) { + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } - if (socket[kError]) { - reject(socket[kError]) - } else { - callback = resolve - } - }) + return _crypto.default.createHash('md5').update(bytes).digest(); +} - if (client[kHTTPConnVersion] === 'h2') { - h2stream - .on('close', onDrain) - .on('drain', onDrain) +var _default = md5; +exports["default"] = _default; - try { - // It's up to the user to somehow abort the async iterable. - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError] - } +/***/ }), - const res = h2stream.write(chunk) - request.onBodySent(chunk) - if (!res) { - await waitForDrain() - } - } - } catch (err) { - h2stream.destroy(err) - } finally { - request.onRequestSent() - h2stream.end() - h2stream - .off('close', onDrain) - .off('drain', onDrain) - } +/***/ 5332: +/***/ ((__unused_webpack_module, exports) => { - return - } +"use strict"; - socket - .on('close', onDrain) - .on('drain', onDrain) - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }) - try { - // It's up to the user to somehow abort the async iterable. - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError] - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _default = '00000000-0000-0000-0000-000000000000'; +exports["default"] = _default; - if (!writer.write(chunk)) { - await waitForDrain() - } - } +/***/ }), - writer.end() - } catch (err) { - writer.destroy(err) - } finally { - socket - .off('close', onDrain) - .off('drain', onDrain) - } - } +/***/ 2746: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - class AsyncWriter { - constructor({ socket, request, contentLength, client, expectsPayload, header }) { - this.socket = socket - this.request = request - this.contentLength = contentLength - this.client = client - this.bytesWritten = 0 - this.expectsPayload = expectsPayload - this.header = header - - socket[kWriting] = true - } +"use strict"; - write(chunk) { - const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this - if (socket[kError]) { - throw socket[kError] - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - if (socket.destroyed) { - return false - } +var _validate = _interopRequireDefault(__nccwpck_require__(6900)); - const len = Buffer.byteLength(chunk) - if (!len) { - return true - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - // We should defer writing chunks. - if (contentLength !== null && bytesWritten + len > contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError() - } +function parse(uuid) { + if (!(0, _validate.default)(uuid)) { + throw TypeError('Invalid UUID'); + } - process.emitWarning(new RequestContentLengthMismatchError()) - } + let v; + const arr = new Uint8Array(16); // Parse ########-....-....-....-............ - socket.cork() + arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; + arr[1] = v >>> 16 & 0xff; + arr[2] = v >>> 8 & 0xff; + arr[3] = v & 0xff; // Parse ........-####-....-....-............ - if (bytesWritten === 0) { - if (!expectsPayload) { - socket[kReset] = true - } + arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; + arr[5] = v & 0xff; // Parse ........-....-####-....-............ - if (contentLength === null) { - socket.write(`${header}transfer-encoding: chunked\r\n`, 'latin1') - } else { - socket.write(`${header}content-length: ${contentLength}\r\n\r\n`, 'latin1') - } - } + arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; + arr[7] = v & 0xff; // Parse ........-....-....-####-............ - if (contentLength === null) { - socket.write(`\r\n${len.toString(16)}\r\n`, 'latin1') - } + arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; + arr[9] = v & 0xff; // Parse ........-....-....-....-############ + // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) - this.bytesWritten += len + arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; + arr[11] = v / 0x100000000 & 0xff; + arr[12] = v >>> 24 & 0xff; + arr[13] = v >>> 16 & 0xff; + arr[14] = v >>> 8 & 0xff; + arr[15] = v & 0xff; + return arr; +} - const ret = socket.write(chunk) +var _default = parse; +exports["default"] = _default; - socket.uncork() +/***/ }), - request.onBodySent(chunk) +/***/ 814: +/***/ ((__unused_webpack_module, exports) => { - if (!ret) { - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - // istanbul ignore else: only for jest - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh() - } - } - } +"use strict"; - return ret - } - end() { - const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this - request.onRequestSent() +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; +exports["default"] = _default; - socket[kWriting] = false +/***/ }), - if (socket[kError]) { - throw socket[kError] - } +/***/ 807: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - if (socket.destroyed) { - return - } +"use strict"; - if (bytesWritten === 0) { - if (expectsPayload) { - // https://tools.ietf.org/html/rfc7230#section-3.3.2 - // A user agent SHOULD send a Content-Length in a request message when - // no Transfer-Encoding is sent and the request method defines a meaning - // for an enclosed payload body. - socket.write(`${header}content-length: 0\r\n\r\n`, 'latin1') - } else { - socket.write(`${header}\r\n`, 'latin1') - } - } else if (contentLength === null) { - socket.write('\r\n0\r\n\r\n', 'latin1') - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = rng; - if (contentLength !== null && bytesWritten !== contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError() - } else { - process.emitWarning(new RequestContentLengthMismatchError()) - } - } +var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - // istanbul ignore else: only for jest - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh() - } - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - resume(client) - } +const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate - destroy(err) { - const { socket, client } = this +let poolPtr = rnds8Pool.length; - socket[kWriting] = false +function rng() { + if (poolPtr > rnds8Pool.length - 16) { + _crypto.default.randomFillSync(rnds8Pool); - if (err) { - assert(client[kRunning] <= 1, 'pipeline should only contain this request') - util.destroy(socket, err) - } - } - } + poolPtr = 0; + } - function errorRequest(client, request, err) { - try { - request.onError(err) - assert(request.aborted) - } catch (err) { - client.emit('error', err) - } - } + return rnds8Pool.slice(poolPtr, poolPtr += 16); +} - module.exports = Client +/***/ }), +/***/ 5274: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - /***/ -}), +"use strict"; -/***/ 6436: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); - /* istanbul ignore file: only for Node 12 */ +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - const { kConnected, kSize } = __nccwpck_require__(2785) +function sha1(bytes) { + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } - class CompatWeakRef { - constructor(value) { - this.value = value - } + return _crypto.default.createHash('sha1').update(bytes).digest(); +} - deref() { - return this.value[kConnected] === 0 && this.value[kSize] === 0 - ? undefined - : this.value - } - } +var _default = sha1; +exports["default"] = _default; - class CompatFinalizer { - constructor(finalizer) { - this.finalizer = finalizer - } +/***/ }), - register(dispatcher, key) { - if (dispatcher.on) { - dispatcher.on('disconnect', () => { - if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { - this.finalizer(key) - } - }) - } - } - } +/***/ 8950: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - module.exports = function () { - // FIXME: remove workaround when the Node bug is fixed - // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 - if (process.env.NODE_V8_COVERAGE) { - return { - WeakRef: CompatWeakRef, - FinalizationRegistry: CompatFinalizer - } - } - return { - WeakRef: global.WeakRef || CompatWeakRef, - FinalizationRegistry: global.FinalizationRegistry || CompatFinalizer - } - } +"use strict"; - /***/ -}), +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; -/***/ 663: -/***/ ((module) => { +var _validate = _interopRequireDefault(__nccwpck_require__(6900)); - "use strict"; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ +const byteToHex = []; - // https://wicg.github.io/cookie-store/#cookie-maximum-attribute-value-size - const maxAttributeValueSize = 1024 +for (let i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).substr(1)); +} - // https://wicg.github.io/cookie-store/#cookie-maximum-name-value-pair-size - const maxNameValuePairSize = 4096 +function stringify(arr, offset = 0) { + // Note: Be careful editing this code! It's been tuned for performance + // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 + const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one + // of the following: + // - One or more input array values don't map to a hex octet (leading to + // "undefined" in the uuid) + // - Invalid input values for the RFC `version` or `variant` fields - module.exports = { - maxAttributeValueSize, - maxNameValuePairSize - } + if (!(0, _validate.default)(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + return uuid; +} - /***/ -}), +var _default = stringify; +exports["default"] = _default; -/***/ 1724: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ }), - "use strict"; - - - const { parseSetCookie } = __nccwpck_require__(4408) - const { stringify, getHeadersList } = __nccwpck_require__(3121) - const { webidl } = __nccwpck_require__(1744) - const { Headers } = __nccwpck_require__(554) - - /** - * @typedef {Object} Cookie - * @property {string} name - * @property {string} value - * @property {Date|number|undefined} expires - * @property {number|undefined} maxAge - * @property {string|undefined} domain - * @property {string|undefined} path - * @property {boolean|undefined} secure - * @property {boolean|undefined} httpOnly - * @property {'Strict'|'Lax'|'None'} sameSite - * @property {string[]} unparsed - */ - - /** - * @param {Headers} headers - * @returns {Record} - */ - function getCookies(headers) { - webidl.argumentLengthCheck(arguments, 1, { header: 'getCookies' }) - - webidl.brandCheck(headers, Headers, { strict: false }) - - const cookie = headers.get('cookie') - const out = {} - - if (!cookie) { - return out - } +/***/ 8628: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - for (const piece of cookie.split(';')) { - const [name, ...value] = piece.split('=') +"use strict"; - out[name.trim()] = value.join('=') - } - return out - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - /** - * @param {Headers} headers - * @param {string} name - * @param {{ path?: string, domain?: string }|undefined} attributes - * @returns {void} - */ - function deleteCookie(headers, name, attributes) { - webidl.argumentLengthCheck(arguments, 2, { header: 'deleteCookie' }) - - webidl.brandCheck(headers, Headers, { strict: false }) - - name = webidl.converters.DOMString(name) - attributes = webidl.converters.DeleteCookieAttributes(attributes) - - // Matches behavior of - // https://github.com/denoland/deno_std/blob/63827b16330b82489a04614027c33b7904e08be5/http/cookie.ts#L278 - setCookie(headers, { - name, - value: '', - expires: new Date(0), - ...attributes - }) - } +var _rng = _interopRequireDefault(__nccwpck_require__(807)); - /** - * @param {Headers} headers - * @returns {Cookie[]} - */ - function getSetCookies(headers) { - webidl.argumentLengthCheck(arguments, 1, { header: 'getSetCookies' }) +var _stringify = _interopRequireDefault(__nccwpck_require__(8950)); - webidl.brandCheck(headers, Headers, { strict: false }) +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - const cookies = getHeadersList(headers).cookies +// **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html +let _nodeId; - if (!cookies) { - return [] - } +let _clockseq; // Previous uuid creation time - // In older versions of undici, cookies is a list of name:value. - return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair)) - } - /** - * @param {Headers} headers - * @param {Cookie} cookie - * @returns {void} - */ - function setCookie(headers, cookie) { - webidl.argumentLengthCheck(arguments, 2, { header: 'setCookie' }) +let _lastMSecs = 0; +let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details - webidl.brandCheck(headers, Headers, { strict: false }) +function v1(options, buf, offset) { + let i = buf && offset || 0; + const b = buf || new Array(16); + options = options || {}; + let node = options.node || _nodeId; + let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not + // specified. We do this lazily to minimize issues related to insufficient + // system entropy. See #189 - cookie = webidl.converters.Cookie(cookie) + if (node == null || clockseq == null) { + const seedBytes = options.random || (options.rng || _rng.default)(); - const str = stringify(cookie) + if (node == null) { + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; + } - if (str) { - headers.append('Set-Cookie', stringify(cookie)) - } - } + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; + } + } // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. - webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: 'path', - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: 'domain', - defaultValue: null - } - ]) - - webidl.converters.Cookie = webidl.dictionaryConverter([ - { - converter: webidl.converters.DOMString, - key: 'name' - }, - { - converter: webidl.converters.DOMString, - key: 'value' - }, - { - converter: webidl.nullableConverter((value) => { - if (typeof value === 'number') { - return webidl.converters['unsigned long long'](value) - } - return new Date(value) - }), - key: 'expires', - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters['long long']), - key: 'maxAge', - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: 'domain', - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: 'path', - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: 'secure', - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: 'httpOnly', - defaultValue: null - }, - { - converter: webidl.converters.USVString, - key: 'sameSite', - allowedValues: ['Strict', 'Lax', 'None'] - }, - { - converter: webidl.sequenceConverter(webidl.converters.DOMString), - key: 'unparsed', - defaultValue: [] - } - ]) + let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock - module.exports = { - getCookies, - deleteCookie, - getSetCookies, - setCookie - } + let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) + const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression - /***/ -}), + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval -/***/ 4408: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; - - - const { maxNameValuePairSize, maxAttributeValueSize } = __nccwpck_require__(663) - const { isCTLExcludingHtab } = __nccwpck_require__(3121) - const { collectASequenceOfCodePointsFast } = __nccwpck_require__(685) - const assert = __nccwpck_require__(9491) - - /** - * @description Parses the field-value attributes of a set-cookie header string. - * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 - * @param {string} header - * @returns if the header is invalid, null will be returned - */ - function parseSetCookie(header) { - // 1. If the set-cookie-string contains a %x00-08 / %x0A-1F / %x7F - // character (CTL characters excluding HTAB): Abort these steps and - // ignore the set-cookie-string entirely. - if (isCTLExcludingHtab(header)) { - return null - } + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } // Per 4.2.1.2 Throw error if too many uuids are requested - let nameValuePair = '' - let unparsedAttributes = '' - let name = '' - let value = '' - - // 2. If the set-cookie-string contains a %x3B (";") character: - if (header.includes(';')) { - // 1. The name-value-pair string consists of the characters up to, - // but not including, the first %x3B (";"), and the unparsed- - // attributes consist of the remainder of the set-cookie-string - // (including the %x3B (";") in question). - const position = { position: 0 } - - nameValuePair = collectASequenceOfCodePointsFast(';', header, position) - unparsedAttributes = header.slice(position.position) - } else { - // Otherwise: - // 1. The name-value-pair string consists of all the characters - // contained in the set-cookie-string, and the unparsed- - // attributes is the empty string. - nameValuePair = header - } + if (nsecs >= 10000) { + throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); + } - // 3. If the name-value-pair string lacks a %x3D ("=") character, then - // the name string is empty, and the value string is the value of - // name-value-pair. - if (!nameValuePair.includes('=')) { - value = nameValuePair - } else { - // Otherwise, the name string consists of the characters up to, but - // not including, the first %x3D ("=") character, and the (possibly - // empty) value string consists of the characters after the first - // %x3D ("=") character. - const position = { position: 0 } - name = collectASequenceOfCodePointsFast( - '=', - nameValuePair, - position - ) - value = nameValuePair.slice(position.position + 1) - } + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch - // 4. Remove any leading or trailing WSP characters from the name - // string and the value string. - name = name.trim() - value = value.trim() + msecs += 12219292800000; // `time_low` - // 5. If the sum of the lengths of the name string and the value string - // is more than 4096 octets, abort these steps and ignore the set- - // cookie-string entirely. - if (name.length + value.length > maxNameValuePairSize) { - return null - } + const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; // `time_mid` - // 6. The cookie-name is the name string, and the cookie-value is the - // value string. - return { - name, value, ...parseUnparsedAttributes(unparsedAttributes) - } - } + const tmh = msecs / 0x100000000 * 10000 & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; // `time_high_and_version` - /** - * Parses the remaining attributes of a set-cookie header - * @see https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4 - * @param {string} unparsedAttributes - * @param {[Object.]={}} cookieAttributeList - */ - function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) { - // 1. If the unparsed-attributes string is empty, skip the rest of - // these steps. - if (unparsedAttributes.length === 0) { - return cookieAttributeList - } + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version - // 2. Discard the first character of the unparsed-attributes (which - // will be a %x3B (";") character). - assert(unparsedAttributes[0] === ';') - unparsedAttributes = unparsedAttributes.slice(1) - - let cookieAv = '' - - // 3. If the remaining unparsed-attributes contains a %x3B (";") - // character: - if (unparsedAttributes.includes(';')) { - // 1. Consume the characters of the unparsed-attributes up to, but - // not including, the first %x3B (";") character. - cookieAv = collectASequenceOfCodePointsFast( - ';', - unparsedAttributes, - { position: 0 } - ) - unparsedAttributes = unparsedAttributes.slice(cookieAv.length) - } else { - // Otherwise: + b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) - // 1. Consume the remainder of the unparsed-attributes. - cookieAv = unparsedAttributes - unparsedAttributes = '' - } + b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` - // Let the cookie-av string be the characters consumed in this step. - - let attributeName = '' - let attributeValue = '' - - // 4. If the cookie-av string contains a %x3D ("=") character: - if (cookieAv.includes('=')) { - // 1. The (possibly empty) attribute-name string consists of the - // characters up to, but not including, the first %x3D ("=") - // character, and the (possibly empty) attribute-value string - // consists of the characters after the first %x3D ("=") - // character. - const position = { position: 0 } - - attributeName = collectASequenceOfCodePointsFast( - '=', - cookieAv, - position - ) - attributeValue = cookieAv.slice(position.position + 1) - } else { - // Otherwise: + b[i++] = clockseq & 0xff; // `node` - // 1. The attribute-name string consists of the entire cookie-av - // string, and the attribute-value string is empty. - attributeName = cookieAv - } + for (let n = 0; n < 6; ++n) { + b[i + n] = node[n]; + } - // 5. Remove any leading or trailing WSP characters from the attribute- - // name string and the attribute-value string. - attributeName = attributeName.trim() - attributeValue = attributeValue.trim() + return buf || (0, _stringify.default)(b); +} - // 6. If the attribute-value is longer than 1024 octets, ignore the - // cookie-av string and return to Step 1 of this algorithm. - if (attributeValue.length > maxAttributeValueSize) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) - } +var _default = v1; +exports["default"] = _default; - // 7. Process the attribute-name and attribute-value according to the - // requirements in the following subsections. (Notice that - // attributes with unrecognized attribute-names are ignored.) - const attributeNameLowercase = attributeName.toLowerCase() - - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.1 - // If the attribute-name case-insensitively matches the string - // "Expires", the user agent MUST process the cookie-av as follows. - if (attributeNameLowercase === 'expires') { - // 1. Let the expiry-time be the result of parsing the attribute-value - // as cookie-date (see Section 5.1.1). - const expiryTime = new Date(attributeValue) - - // 2. If the attribute-value failed to parse as a cookie date, ignore - // the cookie-av. - - cookieAttributeList.expires = expiryTime - } else if (attributeNameLowercase === 'max-age') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.2 - // If the attribute-name case-insensitively matches the string "Max- - // Age", the user agent MUST process the cookie-av as follows. - - // 1. If the first character of the attribute-value is not a DIGIT or a - // "-" character, ignore the cookie-av. - const charCode = attributeValue.charCodeAt(0) - - if ((charCode < 48 || charCode > 57) && attributeValue[0] !== '-') { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) - } +/***/ }), - // 2. If the remainder of attribute-value contains a non-DIGIT - // character, ignore the cookie-av. - if (!/^\d+$/.test(attributeValue)) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) - } +/***/ 6409: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - // 3. Let delta-seconds be the attribute-value converted to an integer. - const deltaSeconds = Number(attributeValue) - - // 4. Let cookie-age-limit be the maximum age of the cookie (which - // SHOULD be 400 days or less, see Section 4.1.2.2). - - // 5. Set delta-seconds to the smaller of its present value and cookie- - // age-limit. - // deltaSeconds = Math.min(deltaSeconds * 1000, maxExpiresMs) - - // 6. If delta-seconds is less than or equal to zero (0), let expiry- - // time be the earliest representable date and time. Otherwise, let - // the expiry-time be the current date and time plus delta-seconds - // seconds. - // const expiryTime = deltaSeconds <= 0 ? Date.now() : Date.now() + deltaSeconds - - // 7. Append an attribute to the cookie-attribute-list with an - // attribute-name of Max-Age and an attribute-value of expiry-time. - cookieAttributeList.maxAge = deltaSeconds - } else if (attributeNameLowercase === 'domain') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.3 - // If the attribute-name case-insensitively matches the string "Domain", - // the user agent MUST process the cookie-av as follows. - - // 1. Let cookie-domain be the attribute-value. - let cookieDomain = attributeValue - - // 2. If cookie-domain starts with %x2E ("."), let cookie-domain be - // cookie-domain without its leading %x2E ("."). - if (cookieDomain[0] === '.') { - cookieDomain = cookieDomain.slice(1) - } +"use strict"; - // 3. Convert the cookie-domain to lower case. - cookieDomain = cookieDomain.toLowerCase() - - // 4. Append an attribute to the cookie-attribute-list with an - // attribute-name of Domain and an attribute-value of cookie-domain. - cookieAttributeList.domain = cookieDomain - } else if (attributeNameLowercase === 'path') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.4 - // If the attribute-name case-insensitively matches the string "Path", - // the user agent MUST process the cookie-av as follows. - - // 1. If the attribute-value is empty or if the first character of the - // attribute-value is not %x2F ("/"): - let cookiePath = '' - if (attributeValue.length === 0 || attributeValue[0] !== '/') { - // 1. Let cookie-path be the default-path. - cookiePath = '/' - } else { - // Otherwise: - - // 1. Let cookie-path be the attribute-value. - cookiePath = attributeValue - } - // 2. Append an attribute to the cookie-attribute-list with an - // attribute-name of Path and an attribute-value of cookie-path. - cookieAttributeList.path = cookiePath - } else if (attributeNameLowercase === 'secure') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.5 - // If the attribute-name case-insensitively matches the string "Secure", - // the user agent MUST append an attribute to the cookie-attribute-list - // with an attribute-name of Secure and an empty attribute-value. - - cookieAttributeList.secure = true - } else if (attributeNameLowercase === 'httponly') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.6 - // If the attribute-name case-insensitively matches the string - // "HttpOnly", the user agent MUST append an attribute to the cookie- - // attribute-list with an attribute-name of HttpOnly and an empty - // attribute-value. - - cookieAttributeList.httpOnly = true - } else if (attributeNameLowercase === 'samesite') { - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-5.4.7 - // If the attribute-name case-insensitively matches the string - // "SameSite", the user agent MUST process the cookie-av as follows: - - // 1. Let enforcement be "Default". - let enforcement = 'Default' - - const attributeValueLowercase = attributeValue.toLowerCase() - // 2. If cookie-av's attribute-value is a case-insensitive match for - // "None", set enforcement to "None". - if (attributeValueLowercase.includes('none')) { - enforcement = 'None' - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - // 3. If cookie-av's attribute-value is a case-insensitive match for - // "Strict", set enforcement to "Strict". - if (attributeValueLowercase.includes('strict')) { - enforcement = 'Strict' - } +var _v = _interopRequireDefault(__nccwpck_require__(5998)); - // 4. If cookie-av's attribute-value is a case-insensitive match for - // "Lax", set enforcement to "Lax". - if (attributeValueLowercase.includes('lax')) { - enforcement = 'Lax' - } +var _md = _interopRequireDefault(__nccwpck_require__(4569)); - // 5. Append an attribute to the cookie-attribute-list with an - // attribute-name of "SameSite" and an attribute-value of - // enforcement. - cookieAttributeList.sameSite = enforcement - } else { - cookieAttributeList.unparsed ??= [] +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`) - } +const v3 = (0, _v.default)('v3', 0x30, _md.default); +var _default = v3; +exports["default"] = _default; - // 8. Return to Step 1 of this algorithm. - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList) - } +/***/ }), - module.exports = { - parseSetCookie, - parseUnparsedAttributes - } +/***/ 5998: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { +"use strict"; - /***/ -}), -/***/ 3121: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = _default; +exports.URL = exports.DNS = void 0; - "use strict"; +var _stringify = _interopRequireDefault(__nccwpck_require__(8950)); +var _parse = _interopRequireDefault(__nccwpck_require__(2746)); - const assert = __nccwpck_require__(9491) - const { kHeadersList } = __nccwpck_require__(2785) +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - function isCTLExcludingHtab(value) { - if (value.length === 0) { - return false - } +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); // UTF8 escape - for (const char of value) { - const code = char.charCodeAt(0) + const bytes = []; - if ( - (code >= 0x00 || code <= 0x08) || - (code >= 0x0A || code <= 0x1F) || - code === 0x7F - ) { - return false - } - } - } + for (let i = 0; i < str.length; ++i) { + bytes.push(str.charCodeAt(i)); + } - /** - CHAR = - token = 1* - separators = "(" | ")" | "<" | ">" | "@" - | "," | ";" | ":" | "\" | <"> - | "/" | "[" | "]" | "?" | "=" - | "{" | "}" | SP | HT - * @param {string} name - */ - function validateCookieName(name) { - for (const char of name) { - const code = char.charCodeAt(0) - - if ( - (code <= 0x20 || code > 0x7F) || - char === '(' || - char === ')' || - char === '>' || - char === '<' || - char === '@' || - char === ',' || - char === ';' || - char === ':' || - char === '\\' || - char === '"' || - char === '/' || - char === '[' || - char === ']' || - char === '?' || - char === '=' || - char === '{' || - char === '}' - ) { - throw new Error('Invalid cookie name') - } - } - } + return bytes; +} - /** - cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE ) - cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E - ; US-ASCII characters excluding CTLs, - ; whitespace DQUOTE, comma, semicolon, - ; and backslash - * @param {string} value - */ - function validateCookieValue(value) { - for (const char of value) { - const code = char.charCodeAt(0) - - if ( - code < 0x21 || // exclude CTLs (0-31) - code === 0x22 || - code === 0x2C || - code === 0x3B || - code === 0x5C || - code > 0x7E // non-ascii - ) { - throw new Error('Invalid header value') - } - } - } +const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +exports.DNS = DNS; +const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +exports.URL = URL; - /** - * path-value = - * @param {string} path - */ - function validateCookiePath(path) { - for (const char of path) { - const code = char.charCodeAt(0) +function _default(name, version, hashfunc) { + function generateUUID(value, namespace, buf, offset) { + if (typeof value === 'string') { + value = stringToBytes(value); + } - if (code < 0x21 || char === ';') { - throw new Error('Invalid cookie path') - } - } - } + if (typeof namespace === 'string') { + namespace = (0, _parse.default)(namespace); + } - /** - * I have no idea why these values aren't allowed to be honest, - * but Deno tests these. - Khafra - * @param {string} domain - */ - function validateCookieDomain(domain) { - if ( - domain.startsWith('-') || - domain.endsWith('.') || - domain.endsWith('-') - ) { - throw new Error('Invalid cookie domain') - } - } + if (namespace.length !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + } // Compute hash of namespace and value, Per 4.3 + // Future: Use spread syntax when supported on all platforms, e.g. `bytes = + // hashfunc([...namespace, ... value])` - /** - * @see https://www.rfc-editor.org/rfc/rfc7231#section-7.1.1.1 - * @param {number|Date} date - IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT - ; fixed length/zone/capitalization subset of the format - ; see Section 3.3 of [RFC5322] - - day-name = %x4D.6F.6E ; "Mon", case-sensitive - / %x54.75.65 ; "Tue", case-sensitive - / %x57.65.64 ; "Wed", case-sensitive - / %x54.68.75 ; "Thu", case-sensitive - / %x46.72.69 ; "Fri", case-sensitive - / %x53.61.74 ; "Sat", case-sensitive - / %x53.75.6E ; "Sun", case-sensitive - date1 = day SP month SP year - ; e.g., 02 Jun 1982 - - day = 2DIGIT - month = %x4A.61.6E ; "Jan", case-sensitive - / %x46.65.62 ; "Feb", case-sensitive - / %x4D.61.72 ; "Mar", case-sensitive - / %x41.70.72 ; "Apr", case-sensitive - / %x4D.61.79 ; "May", case-sensitive - / %x4A.75.6E ; "Jun", case-sensitive - / %x4A.75.6C ; "Jul", case-sensitive - / %x41.75.67 ; "Aug", case-sensitive - / %x53.65.70 ; "Sep", case-sensitive - / %x4F.63.74 ; "Oct", case-sensitive - / %x4E.6F.76 ; "Nov", case-sensitive - / %x44.65.63 ; "Dec", case-sensitive - year = 4DIGIT - - GMT = %x47.4D.54 ; "GMT", case-sensitive - - time-of-day = hour ":" minute ":" second - ; 00:00:00 - 23:59:60 (leap second) - - hour = 2DIGIT - minute = 2DIGIT - second = 2DIGIT - */ - function toIMFDate(date) { - if (typeof date === 'number') { - date = new Date(date) - } - const days = [ - 'Sun', 'Mon', 'Tue', 'Wed', - 'Thu', 'Fri', 'Sat' - ] - - const months = [ - 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' - ] - - const dayName = days[date.getUTCDay()] - const day = date.getUTCDate().toString().padStart(2, '0') - const month = months[date.getUTCMonth()] - const year = date.getUTCFullYear() - const hour = date.getUTCHours().toString().padStart(2, '0') - const minute = date.getUTCMinutes().toString().padStart(2, '0') - const second = date.getUTCSeconds().toString().padStart(2, '0') - - return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT` - } + let bytes = new Uint8Array(16 + value.length); + bytes.set(namespace); + bytes.set(value, namespace.length); + bytes = hashfunc(bytes); + bytes[6] = bytes[6] & 0x0f | version; + bytes[8] = bytes[8] & 0x3f | 0x80; - /** - max-age-av = "Max-Age=" non-zero-digit *DIGIT - ; In practice, both expires-av and max-age-av - ; are limited to dates representable by the - ; user agent. - * @param {number} maxAge - */ - function validateCookieMaxAge(maxAge) { - if (maxAge < 0) { - throw new Error('Invalid cookie max-age') - } - } + if (buf) { + offset = offset || 0; - /** - * @see https://www.rfc-editor.org/rfc/rfc6265#section-4.1.1 - * @param {import('./index').Cookie} cookie - */ - function stringify(cookie) { - if (cookie.name.length === 0) { - return null - } + for (let i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } - validateCookieName(cookie.name) - validateCookieValue(cookie.value) + return buf; + } - const out = [`${cookie.name}=${cookie.value}`] + return (0, _stringify.default)(bytes); + } // Function#name is not settable on some platforms (#270) - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.1 - // https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-cookie-prefixes-00#section-3.2 - if (cookie.name.startsWith('__Secure-')) { - cookie.secure = true - } - if (cookie.name.startsWith('__Host-')) { - cookie.secure = true - cookie.domain = null - cookie.path = '/' - } + try { + generateUUID.name = name; // eslint-disable-next-line no-empty + } catch (err) {} // For CommonJS default export support - if (cookie.secure) { - out.push('Secure') - } - if (cookie.httpOnly) { - out.push('HttpOnly') - } + generateUUID.DNS = DNS; + generateUUID.URL = URL; + return generateUUID; +} - if (typeof cookie.maxAge === 'number') { - validateCookieMaxAge(cookie.maxAge) - out.push(`Max-Age=${cookie.maxAge}`) - } +/***/ }), - if (cookie.domain) { - validateCookieDomain(cookie.domain) - out.push(`Domain=${cookie.domain}`) - } +/***/ 5122: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - if (cookie.path) { - validateCookiePath(cookie.path) - out.push(`Path=${cookie.path}`) - } +"use strict"; - if (cookie.expires && cookie.expires.toString() !== 'Invalid Date') { - out.push(`Expires=${toIMFDate(cookie.expires)}`) - } - if (cookie.sameSite) { - out.push(`SameSite=${cookie.sameSite}`) - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - for (const part of cookie.unparsed) { - if (!part.includes('=')) { - throw new Error('Invalid unparsed') - } +var _rng = _interopRequireDefault(__nccwpck_require__(807)); - const [key, ...value] = part.split('=') +var _stringify = _interopRequireDefault(__nccwpck_require__(8950)); - out.push(`${key.trim()}=${value.join('=')}`) - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - return out.join('; ') - } +function v4(options, buf, offset) { + options = options || {}; - let kHeadersListNode + const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` - function getHeadersList(headers) { - if (headers[kHeadersList]) { - return headers[kHeadersList] - } - if (!kHeadersListNode) { - kHeadersListNode = Object.getOwnPropertySymbols(headers).find( - (symbol) => symbol.description === 'headers list' - ) + rnds[6] = rnds[6] & 0x0f | 0x40; + rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided - assert(kHeadersListNode, 'Headers cannot be parsed') - } + if (buf) { + offset = offset || 0; - const headersList = headers[kHeadersListNode] - assert(headersList) + for (let i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } - return headersList - } + return buf; + } - module.exports = { - isCTLExcludingHtab, - stringify, - getHeadersList - } + return (0, _stringify.default)(rnds); +} +var _default = v4; +exports["default"] = _default; - /***/ -}), +/***/ }), -/***/ 2067: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ 9120: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - "use strict"; +"use strict"; - const net = __nccwpck_require__(1808) - const assert = __nccwpck_require__(9491) - const util = __nccwpck_require__(3983) - const { InvalidArgumentError, ConnectTimeoutError } = __nccwpck_require__(8045) +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - let tls // include tls conditionally since it is not always available +var _v = _interopRequireDefault(__nccwpck_require__(5998)); - // TODO: session re-use does not wait for the first - // connection to resolve the session and might therefore - // resolve the same servername multiple times even when - // re-use is enabled. +var _sha = _interopRequireDefault(__nccwpck_require__(5274)); - let SessionCache - // FIXME: remove workaround when the Node bug is fixed - // https://github.com/nodejs/node/issues/49344#issuecomment-1741776308 - if (global.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) { - SessionCache = class WeakSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions - this._sessionCache = new Map() - this._sessionRegistry = new global.FinalizationRegistry((key) => { - if (this._sessionCache.size < this._maxCachedSessions) { - return - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - const ref = this._sessionCache.get(key) - if (ref !== undefined && ref.deref() === undefined) { - this._sessionCache.delete(key) - } - }) - } +const v5 = (0, _v.default)('v5', 0x50, _sha.default); +var _default = v5; +exports["default"] = _default; - get(sessionKey) { - const ref = this._sessionCache.get(sessionKey) - return ref ? ref.deref() : null - } +/***/ }), - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return - } +/***/ 6900: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - this._sessionCache.set(sessionKey, new WeakRef(session)) - this._sessionRegistry.register(session, sessionKey) - } - } - } else { - SessionCache = class SimpleSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions - this._sessionCache = new Map() - } +"use strict"; - get(sessionKey) { - return this._sessionCache.get(sessionKey) - } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - if (this._sessionCache.size >= this._maxCachedSessions) { - // remove the oldest session - const { value: oldestKey } = this._sessionCache.keys().next() - this._sessionCache.delete(oldestKey) - } +var _regex = _interopRequireDefault(__nccwpck_require__(814)); - this._sessionCache.set(sessionKey, session) - } - } - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - function buildConnector({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) { - if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { - throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero') - } +function validate(uuid) { + return typeof uuid === 'string' && _regex.default.test(uuid); +} - const options = { path: socketPath, ...opts } - const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions) - timeout = timeout == null ? 10e3 : timeout - allowH2 = allowH2 != null ? allowH2 : false - return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { - let socket - if (protocol === 'https:') { - if (!tls) { - tls = __nccwpck_require__(4404) - } - servername = servername || options.servername || util.getServerName(host) || null - - const sessionKey = servername || hostname - const session = sessionCache.get(sessionKey) || null - - assert(sessionKey) - - socket = tls.connect({ - highWaterMark: 16384, // TLS in node can't have bigger HWM anyway... - ...options, - servername, - session, - localAddress, - // TODO(HTTP/2): Add support for h2c - ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'], - socket: httpSocket, // upgrade socket connection - port: port || 443, - host: hostname - }) - - socket - .on('session', function (session) { - // TODO (fix): Can a session become invalid once established? Don't think so? - sessionCache.set(sessionKey, session) - }) - } else { - assert(!httpSocket, 'httpSocket can only be sent on TLS update') - socket = net.connect({ - highWaterMark: 64 * 1024, // Same as nodejs fs streams. - ...options, - localAddress, - port: port || 80, - host: hostname - }) - } +var _default = validate; +exports["default"] = _default; - // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket - if (options.keepAlive == null || options.keepAlive) { - const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay - socket.setKeepAlive(true, keepAliveInitialDelay) - } +/***/ }), - const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout) +/***/ 1595: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - socket - .setNoDelay(true) - .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () { - cancelTimeout() +"use strict"; - if (callback) { - const cb = callback - callback = null - cb(null, this) - } - }) - .on('error', function (err) { - cancelTimeout() - - if (callback) { - const cb = callback - callback = null - cb(err) - } - }) - return socket - } - } +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; - function setupTimeout(onConnectTimeout, timeout) { - if (!timeout) { - return () => { } - } +var _validate = _interopRequireDefault(__nccwpck_require__(6900)); - let s1 = null - let s2 = null - const timeoutId = setTimeout(() => { - // setImmediate is added to make sure that we priotorise socket error events over timeouts - s1 = setImmediate(() => { - if (process.platform === 'win32') { - // Windows needs an extra setImmediate probably due to implementation differences in the socket logic - s2 = setImmediate(() => onConnectTimeout()) - } else { - onConnectTimeout() - } - }) - }, timeout) - return () => { - clearTimeout(timeoutId) - clearImmediate(s1) - clearImmediate(s2) - } - } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - function onConnectTimeout(socket) { - util.destroy(socket, new ConnectTimeoutError()) - } +function version(uuid) { + if (!(0, _validate.default)(uuid)) { + throw TypeError('Invalid UUID'); + } - module.exports = buildConnector + return parseInt(uuid.substr(14, 1), 16); +} +var _default = version; +exports["default"] = _default; - /***/ -}), +/***/ }), -/***/ 4462: -/***/ ((module) => { +/***/ 6455: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getInputs = void 0; +const core = __importStar(__nccwpck_require__(2186)); +const path = __importStar(__nccwpck_require__(1017)); +function validateRepositoryPath(repositoryPath) { + const repoParts = repositoryPath.split('/'); + if (repoParts.length !== 2 || !repoParts[0] || !repoParts[1]) { + throw new Error(`Invalid repository '${repositoryPath}'. Expected format {owner}/{repo}.`); + } +} +function validateReleaseVersion(latestFlag, ghTag, releaseId) { + if ((latestFlag && ghTag && releaseId) || (ghTag && releaseId)) { + throw new Error(`Invalid inputs. latest=${latestFlag}, tag=${ghTag}, and releaseId=${releaseId} can't coexist`); + } +} +function getInputs() { + let githubWorkspacePath = process.env['GITHUB_WORKSPACE']; + if (!githubWorkspacePath) { + throw new Error('$GITHUB_WORKSPACE not defined'); + } + githubWorkspacePath = path.resolve(githubWorkspacePath); + const repositoryPath = core.getInput('repository'); + validateRepositoryPath(repositoryPath); + const latestFlag = core.getBooleanInput('latest'); + const preReleaseFlag = core.getBooleanInput('preRelease'); + const ghTag = core.getInput('tag'); + const releaseId = core.getInput('releaseId'); + validateReleaseVersion(latestFlag, ghTag, releaseId); + return { + sourceRepoPath: repositoryPath, + isLatest: latestFlag, + preRelease: preReleaseFlag, + tag: ghTag, + id: releaseId, + fileName: core.getInput('fileName'), + tarBall: core.getBooleanInput('tarBall'), + zipBall: core.getBooleanInput('zipBall'), + extractAssets: core.getBooleanInput('extract'), + outFilePath: path.resolve(githubWorkspacePath, core.getInput('out-file-path') || '.'), + addToPathEnvironmentVariable: core.getBooleanInput('addToPath') + }; +} +exports.getInputs = getInputs; - "use strict"; - - - /** @type {Record} */ - const headerNameLowerCasedRecord = {} - - // https://developer.mozilla.org/docs/Web/HTTP/Headers - const wellknownHeaderNames = [ - 'Accept', - 'Accept-Encoding', - 'Accept-Language', - 'Accept-Ranges', - 'Access-Control-Allow-Credentials', - 'Access-Control-Allow-Headers', - 'Access-Control-Allow-Methods', - 'Access-Control-Allow-Origin', - 'Access-Control-Expose-Headers', - 'Access-Control-Max-Age', - 'Access-Control-Request-Headers', - 'Access-Control-Request-Method', - 'Age', - 'Allow', - 'Alt-Svc', - 'Alt-Used', - 'Authorization', - 'Cache-Control', - 'Clear-Site-Data', - 'Connection', - 'Content-Disposition', - 'Content-Encoding', - 'Content-Language', - 'Content-Length', - 'Content-Location', - 'Content-Range', - 'Content-Security-Policy', - 'Content-Security-Policy-Report-Only', - 'Content-Type', - 'Cookie', - 'Cross-Origin-Embedder-Policy', - 'Cross-Origin-Opener-Policy', - 'Cross-Origin-Resource-Policy', - 'Date', - 'Device-Memory', - 'Downlink', - 'ECT', - 'ETag', - 'Expect', - 'Expect-CT', - 'Expires', - 'Forwarded', - 'From', - 'Host', - 'If-Match', - 'If-Modified-Since', - 'If-None-Match', - 'If-Range', - 'If-Unmodified-Since', - 'Keep-Alive', - 'Last-Modified', - 'Link', - 'Location', - 'Max-Forwards', - 'Origin', - 'Permissions-Policy', - 'Pragma', - 'Proxy-Authenticate', - 'Proxy-Authorization', - 'RTT', - 'Range', - 'Referer', - 'Referrer-Policy', - 'Refresh', - 'Retry-After', - 'Sec-WebSocket-Accept', - 'Sec-WebSocket-Extensions', - 'Sec-WebSocket-Key', - 'Sec-WebSocket-Protocol', - 'Sec-WebSocket-Version', - 'Server', - 'Server-Timing', - 'Service-Worker-Allowed', - 'Service-Worker-Navigation-Preload', - 'Set-Cookie', - 'SourceMap', - 'Strict-Transport-Security', - 'Supports-Loading-Mode', - 'TE', - 'Timing-Allow-Origin', - 'Trailer', - 'Transfer-Encoding', - 'Upgrade', - 'Upgrade-Insecure-Requests', - 'User-Agent', - 'Vary', - 'Via', - 'WWW-Authenticate', - 'X-Content-Type-Options', - 'X-DNS-Prefetch-Control', - 'X-Frame-Options', - 'X-Permitted-Cross-Domain-Policies', - 'X-Powered-By', - 'X-Requested-With', - 'X-XSS-Protection' - ] - - for (let i = 0; i < wellknownHeaderNames.length; ++i) { - const key = wellknownHeaderNames[i] - const lowerCasedKey = key.toLowerCase() - headerNameLowerCasedRecord[key] = headerNameLowerCasedRecord[lowerCasedKey] = - lowerCasedKey - } - // Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`. - Object.setPrototypeOf(headerNameLowerCasedRecord, null) +/***/ }), - module.exports = { - wellknownHeaderNames, - headerNameLowerCasedRecord - } +/***/ 399: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const core = __importStar(__nccwpck_require__(2186)); +const handlers = __importStar(__nccwpck_require__(4442)); +const inputHelper = __importStar(__nccwpck_require__(6455)); +const thc = __importStar(__nccwpck_require__(5538)); +const node_fs_1 = __nccwpck_require__(7561); +const node_path_1 = __nccwpck_require__(9411); +const release_downloader_1 = __nccwpck_require__(785); +const unarchive_1 = __nccwpck_require__(8512); +async function run() { + try { + const downloadSettings = inputHelper.getInputs(); + const authToken = core.getInput('token'); + const githubApiUrl = core.getInput('github-api-url'); + const credentialHandler = new handlers.BearerCredentialHandler(authToken, false); + const httpClient = new thc.HttpClient('gh-api-client', [ + credentialHandler + ]); + const downloader = new release_downloader_1.ReleaseDownloader(httpClient, githubApiUrl); + const res = await downloader.download(downloadSettings); + if (downloadSettings.extractAssets) { + for (const asset of res) { + await (0, unarchive_1.extract)(asset, downloadSettings.outFilePath); + } + } + if (downloadSettings.addToPathEnvironmentVariable) { + const out = downloadSettings.outFilePath; + // Make executables executable + for (const file of (0, node_fs_1.readdirSync)(out)) { + let full = (0, node_path_1.join)(out, file); + const toSliceTo = /-(v?)[0-9]/.exec(file); + if (toSliceTo) { + const old = full; + full = (0, node_path_1.join)(out, file.slice(0, toSliceTo.index)); + (0, node_fs_1.renameSync)(old, full); + core.debug(`Renamed ${old} to ${full}`); + } + const newMode = (0, node_fs_1.statSync)(full).mode | + node_fs_1.constants.S_IXUSR | + node_fs_1.constants.S_IXGRP | + node_fs_1.constants.S_IXOTH; + (0, node_fs_1.chmodSync)(full, newMode); + core.info(`Made ${full} executable`); + } + core.addPath(out); + core.info(`Added ${out} to PATH`); + } + core.info(`Done: ${res}`); + } + catch (error) { + if (error instanceof Error) { + core.setFailed(error.message); + } + } +} +run(); - /***/ -}), +/***/ }), -/***/ 8045: -/***/ ((module) => { +/***/ 785: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ReleaseDownloader = void 0; +const core = __importStar(__nccwpck_require__(2186)); +const fs = __importStar(__nccwpck_require__(7147)); +const io = __importStar(__nccwpck_require__(7436)); +const path = __importStar(__nccwpck_require__(1017)); +const minimatch_1 = __nccwpck_require__(4501); +class ReleaseDownloader { + httpClient; + apiRoot; + constructor(httpClient, githubApiUrl) { + this.httpClient = httpClient; + this.apiRoot = githubApiUrl; + } + async download(downloadSettings) { + let ghRelease; + if (downloadSettings.isLatest) { + ghRelease = await this.getlatestRelease(downloadSettings.sourceRepoPath, downloadSettings.preRelease); + } + else if (downloadSettings.tag !== '') { + ghRelease = await this.getReleaseByTag(downloadSettings.sourceRepoPath, downloadSettings.tag); + } + else if (downloadSettings.id !== '') { + ghRelease = await this.getReleaseById(downloadSettings.sourceRepoPath, downloadSettings.id); + } + else { + throw new Error('Config error: Please input a valid tag or release ID, or specify `latest`'); + } + const resolvedAssets = this.resolveAssets(ghRelease, downloadSettings); + const result = await this.downloadReleaseAssets(resolvedAssets, downloadSettings.outFilePath); + // Set the output variables for use by other actions + core.setOutput('tag_name', ghRelease.tag_name); + core.setOutput('release_name', ghRelease.name); + core.setOutput('downloaded_files', result); + return result; + } + /** + * Gets the latest release metadata from github api + * @param repoPath The source repository path. {owner}/{repo} + */ + async getlatestRelease(repoPath, preRelease) { + core.info(`Fetching latest release for repo ${repoPath}`); + const headers = { Accept: 'application/vnd.github.v3+json' }; + let response; + if (!preRelease) { + response = await this.httpClient.get(`${this.apiRoot}/repos/${repoPath}/releases/latest`, headers); + } + else { + response = await this.httpClient.get(`${this.apiRoot}/repos/${repoPath}/releases`, headers); + } + if (response.message.statusCode !== 200) { + const err = new Error(`[getlatestRelease] Unexpected response: ${response.message.statusCode}`); + throw err; + } + const responseBody = await response.readBody(); + let release; + if (!preRelease) { + release = JSON.parse(responseBody.toString()); + core.info(`Found latest release version: ${release.tag_name}`); + } + else { + const allReleases = JSON.parse(responseBody.toString()); + const latestPreRelease = allReleases.find(r => r.prerelease === true); + if (latestPreRelease) { + release = latestPreRelease; + core.info(`Found latest pre-release version: ${release.tag_name}`); + } + else { + throw new Error('No prereleases found!'); + } + } + return release; + } + /** + * Gets release data of the specified tag + * @param repoPath The source repository + * @param tag The github tag to fetch release from. + */ + async getReleaseByTag(repoPath, tag) { + core.info(`Fetching release ${tag} from repo ${repoPath}`); + if (tag === '') { + throw new Error('Config error: Please input a valid tag'); + } + const headers = { Accept: 'application/vnd.github.v3+json' }; + const response = await this.httpClient.get(`${this.apiRoot}/repos/${repoPath}/releases/tags/${tag}`, headers); + if (response.message.statusCode !== 200) { + const err = new Error(`[getReleaseByTag] Unexpected response: ${response.message.statusCode}`); + throw err; + } + const responseBody = await response.readBody(); + const release = JSON.parse(responseBody.toString()); + core.info(`Found release tag: ${release.tag_name}`); + return release; + } + /** + * Gets release data of the specified release ID + * @param repoPath The source repository + * @param id The github release ID to fetch. + */ + async getReleaseById(repoPath, id) { + core.info(`Fetching release id:${id} from repo ${repoPath}`); + if (id === '') { + throw new Error('Config error: Please input a valid release ID'); + } + const headers = { Accept: 'application/vnd.github.v3+json' }; + const response = await this.httpClient.get(`${this.apiRoot}/repos/${repoPath}/releases/${id}`, headers); + if (response.message.statusCode !== 200) { + const err = new Error(`[getReleaseById] Unexpected response: ${response.message.statusCode}`); + throw err; + } + const responseBody = await response.readBody(); + const release = JSON.parse(responseBody.toString()); + core.info(`Found release tag: ${release.tag_name}`); + return release; + } + resolveAssets(ghRelease, downloadSettings) { + const downloads = []; + if (downloadSettings.fileName.length > 0) { + if (ghRelease && ghRelease.assets.length > 0) { + for (const asset of ghRelease.assets) { + // download only matching file names + if (!(0, minimatch_1.minimatch)(asset.name, downloadSettings.fileName)) { + continue; + } + const dData = { + fileName: asset.name, + url: asset['url'], + isTarBallOrZipBall: false + }; + downloads.push(dData); + } + if (downloads.length === 0) { + throw new Error(`Asset with name ${downloadSettings.fileName} not found!`); + } + } + else { + throw new Error(`No assets found in release ${ghRelease.name}`); + } + } + if (downloadSettings.tarBall) { + const repoName = downloadSettings.sourceRepoPath.split('/')[1]; + downloads.push({ + fileName: `${repoName}-${ghRelease.tag_name}.tar.gz`, + url: ghRelease.tarball_url, + isTarBallOrZipBall: true + }); + } + if (downloadSettings.zipBall) { + const repoName = downloadSettings.sourceRepoPath.split('/')[1]; + downloads.push({ + fileName: `${repoName}-${ghRelease.tag_name}.zip`, + url: ghRelease.zipball_url, + isTarBallOrZipBall: true + }); + } + return downloads; + } + /** + * Downloads the specified assets from a given URL + * @param dData The download metadata + * @param out Target directory + */ + async downloadReleaseAssets(dData, out) { + const outFileDir = path.resolve(out); + if (!fs.existsSync(outFileDir)) { + io.mkdirP(outFileDir); + } + const downloads = []; + for (const asset of dData) { + downloads.push(this.downloadFile(asset, out)); + } + const result = await Promise.all(downloads); + return result; + } + async downloadFile(asset, outputPath) { + const headers = { + Accept: 'application/octet-stream' + }; + if (asset.isTarBallOrZipBall) { + headers['Accept'] = '*/*'; + } + core.info(`Downloading file: ${asset.fileName} to: ${outputPath}`); + const response = await this.httpClient.get(asset.url, headers); + if (response.message.statusCode === 200) { + return this.saveFile(outputPath, asset.fileName, response); + } + else { + const err = new Error(`Unexpected response: ${response.message.statusCode}`); + throw err; + } + } + async saveFile(outputPath, fileName, httpClientResponse) { + const outFilePath = path.resolve(outputPath, fileName); + const fileStream = fs.createWriteStream(outFilePath); + return new Promise((resolve, reject) => { + fileStream.on('error', err => reject(err)); + const outStream = httpClientResponse.message.pipe(fileStream); + outStream.on('close', () => { + resolve(outFilePath); + }); + }); + } +} +exports.ReleaseDownloader = ReleaseDownloader; - "use strict"; +/***/ }), - class UndiciError extends Error { - constructor(message) { - super(message) - this.name = 'UndiciError' - this.code = 'UND_ERR' - } - } +/***/ 8512: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.extract = void 0; +const core = __importStar(__nccwpck_require__(2186)); +const fs = __importStar(__nccwpck_require__(7147)); +const path = __importStar(__nccwpck_require__(1017)); +const tar = __importStar(__nccwpck_require__(6630)); +const StreamZip = __importStar(__nccwpck_require__(8119)); +const extract = async (filePath, destDir) => { + const isTarGz = filePath.endsWith('.tar.gz') || filePath.endsWith('.tar'); + const isZip = filePath.endsWith('.zip'); + const filename = path.basename(filePath); + if (!isTarGz && !isZip) { + core.warning(`The file ${filename} is not a supported archive. It will be skipped`); + return; + } + // Create the destination directory if it doesn't already exist + if (!fs.existsSync(destDir)) { + fs.mkdirSync(destDir, { recursive: true }); + } + // Extract the file to the destination directory + if (isTarGz) { + await tar.x({ + file: filePath, + cwd: destDir + }); + } + if (isZip) { + const zip = new StreamZip.async({ file: filePath }); + await zip.extract(null, destDir); + await zip.close(); + } + core.info(`Extracted ${filename} to ${destDir}`); +}; +exports.extract = extract; - class ConnectTimeoutError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, ConnectTimeoutError) - this.name = 'ConnectTimeoutError' - this.message = message || 'Connect Timeout Error' - this.code = 'UND_ERR_CONNECT_TIMEOUT' - } - } - class HeadersTimeoutError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, HeadersTimeoutError) - this.name = 'HeadersTimeoutError' - this.message = message || 'Headers Timeout Error' - this.code = 'UND_ERR_HEADERS_TIMEOUT' - } - } +/***/ }), - class HeadersOverflowError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, HeadersOverflowError) - this.name = 'HeadersOverflowError' - this.message = message || 'Headers Overflow Error' - this.code = 'UND_ERR_HEADERS_OVERFLOW' - } - } +/***/ 9491: +/***/ ((module) => { - class BodyTimeoutError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, BodyTimeoutError) - this.name = 'BodyTimeoutError' - this.message = message || 'Body Timeout Error' - this.code = 'UND_ERR_BODY_TIMEOUT' - } - } +"use strict"; +module.exports = require("assert"); - class ResponseStatusCodeError extends UndiciError { - constructor(message, statusCode, headers, body) { - super(message) - Error.captureStackTrace(this, ResponseStatusCodeError) - this.name = 'ResponseStatusCodeError' - this.message = message || 'Response Status Code Error' - this.code = 'UND_ERR_RESPONSE_STATUS_CODE' - this.body = body - this.status = statusCode - this.statusCode = statusCode - this.headers = headers - } - } +/***/ }), - class InvalidArgumentError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, InvalidArgumentError) - this.name = 'InvalidArgumentError' - this.message = message || 'Invalid Argument Error' - this.code = 'UND_ERR_INVALID_ARG' - } - } +/***/ 852: +/***/ ((module) => { - class InvalidReturnValueError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, InvalidReturnValueError) - this.name = 'InvalidReturnValueError' - this.message = message || 'Invalid Return Value Error' - this.code = 'UND_ERR_INVALID_RETURN_VALUE' - } - } +"use strict"; +module.exports = require("async_hooks"); - class RequestAbortedError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, RequestAbortedError) - this.name = 'AbortError' - this.message = message || 'Request aborted' - this.code = 'UND_ERR_ABORTED' - } - } +/***/ }), - class InformationalError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, InformationalError) - this.name = 'InformationalError' - this.message = message || 'Request information' - this.code = 'UND_ERR_INFO' - } - } +/***/ 4300: +/***/ ((module) => { - class RequestContentLengthMismatchError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, RequestContentLengthMismatchError) - this.name = 'RequestContentLengthMismatchError' - this.message = message || 'Request body length does not match content-length header' - this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH' - } - } +"use strict"; +module.exports = require("buffer"); - class ResponseContentLengthMismatchError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, ResponseContentLengthMismatchError) - this.name = 'ResponseContentLengthMismatchError' - this.message = message || 'Response body length does not match content-length header' - this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH' - } - } +/***/ }), - class ClientDestroyedError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, ClientDestroyedError) - this.name = 'ClientDestroyedError' - this.message = message || 'The client is destroyed' - this.code = 'UND_ERR_DESTROYED' - } - } +/***/ 6206: +/***/ ((module) => { - class ClientClosedError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, ClientClosedError) - this.name = 'ClientClosedError' - this.message = message || 'The client is closed' - this.code = 'UND_ERR_CLOSED' - } - } +"use strict"; +module.exports = require("console"); - class SocketError extends UndiciError { - constructor(message, socket) { - super(message) - Error.captureStackTrace(this, SocketError) - this.name = 'SocketError' - this.message = message || 'Socket error' - this.code = 'UND_ERR_SOCKET' - this.socket = socket - } - } +/***/ }), - class NotSupportedError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, NotSupportedError) - this.name = 'NotSupportedError' - this.message = message || 'Not supported error' - this.code = 'UND_ERR_NOT_SUPPORTED' - } - } +/***/ 6113: +/***/ ((module) => { - class BalancedPoolMissingUpstreamError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, NotSupportedError) - this.name = 'MissingUpstreamError' - this.message = message || 'No upstream has been added to the BalancedPool' - this.code = 'UND_ERR_BPL_MISSING_UPSTREAM' - } - } +"use strict"; +module.exports = require("crypto"); - class HTTPParserError extends Error { - constructor(message, code, data) { - super(message) - Error.captureStackTrace(this, HTTPParserError) - this.name = 'HTTPParserError' - this.code = code ? `HPE_${code}` : undefined - this.data = data ? data.toString() : undefined - } - } +/***/ }), - class ResponseExceededMaxSizeError extends UndiciError { - constructor(message) { - super(message) - Error.captureStackTrace(this, ResponseExceededMaxSizeError) - this.name = 'ResponseExceededMaxSizeError' - this.message = message || 'Response content exceeded max size' - this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE' - } - } +/***/ 7643: +/***/ ((module) => { - class RequestRetryError extends UndiciError { - constructor(message, code, { headers, data }) { - super(message) - Error.captureStackTrace(this, RequestRetryError) - this.name = 'RequestRetryError' - this.message = message || 'Request retry error' - this.code = 'UND_ERR_REQ_RETRY' - this.statusCode = code - this.data = data - this.headers = headers - } - } +"use strict"; +module.exports = require("diagnostics_channel"); - module.exports = { - HTTPParserError, - UndiciError, - HeadersTimeoutError, - HeadersOverflowError, - BodyTimeoutError, - RequestContentLengthMismatchError, - ConnectTimeoutError, - ResponseStatusCodeError, - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError, - ClientDestroyedError, - ClientClosedError, - InformationalError, - SocketError, - NotSupportedError, - ResponseContentLengthMismatchError, - BalancedPoolMissingUpstreamError, - ResponseExceededMaxSizeError, - RequestRetryError - } +/***/ }), +/***/ 2361: +/***/ ((module) => { - /***/ -}), +"use strict"; +module.exports = require("events"); -/***/ 2905: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ }), - "use strict"; +/***/ 7147: +/***/ ((module) => { +"use strict"; +module.exports = require("fs"); - const { - InvalidArgumentError, - NotSupportedError - } = __nccwpck_require__(8045) - const assert = __nccwpck_require__(9491) - const { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = __nccwpck_require__(2785) - const util = __nccwpck_require__(3983) +/***/ }), - // tokenRegExp and headerCharRegex have been lifted from - // https://github.com/nodejs/node/blob/main/lib/_http_common.js +/***/ 3685: +/***/ ((module) => { - /** - * Verifies that the given val is a valid HTTP token - * per the rules defined in RFC 7230 - * See https://tools.ietf.org/html/rfc7230#section-3.2.6 - */ - const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/ +"use strict"; +module.exports = require("http"); - /** - * Matches if val contains an invalid field-vchar - * field-value = *( field-content / obs-fold ) - * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] - * field-vchar = VCHAR / obs-text - */ - const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/ +/***/ }), - // Verifies that a given path is valid does not contain control chars \x00 to \x20 - const invalidPathRegex = /[^\u0021-\u00ff]/ +/***/ 5158: +/***/ ((module) => { - const kHandler = Symbol('handler') +"use strict"; +module.exports = require("http2"); - const channels = {} +/***/ }), - let extractBody +/***/ 5687: +/***/ ((module) => { - try { - const diagnosticsChannel = __nccwpck_require__(7643) - channels.create = diagnosticsChannel.channel('undici:request:create') - channels.bodySent = diagnosticsChannel.channel('undici:request:bodySent') - channels.headers = diagnosticsChannel.channel('undici:request:headers') - channels.trailers = diagnosticsChannel.channel('undici:request:trailers') - channels.error = diagnosticsChannel.channel('undici:request:error') - } catch { - channels.create = { hasSubscribers: false } - channels.bodySent = { hasSubscribers: false } - channels.headers = { hasSubscribers: false } - channels.trailers = { hasSubscribers: false } - channels.error = { hasSubscribers: false } - } +"use strict"; +module.exports = require("https"); - class Request { - constructor(origin, { - path, - method, - body, - headers, - query, - idempotent, - blocking, - upgrade, - headersTimeout, - bodyTimeout, - reset, - throwOnError, - expectContinue - }, handler) { - if (typeof path !== 'string') { - throw new InvalidArgumentError('path must be a string') - } else if ( - path[0] !== '/' && - !(path.startsWith('http://') || path.startsWith('https://')) && - method !== 'CONNECT' - ) { - throw new InvalidArgumentError('path must be an absolute URL or start with a slash') - } else if (invalidPathRegex.exec(path) !== null) { - throw new InvalidArgumentError('invalid request path') - } +/***/ }), - if (typeof method !== 'string') { - throw new InvalidArgumentError('method must be a string') - } else if (tokenRegExp.exec(method) === null) { - throw new InvalidArgumentError('invalid request method') - } +/***/ 1808: +/***/ ((module) => { - if (upgrade && typeof upgrade !== 'string') { - throw new InvalidArgumentError('upgrade must be a string') - } +"use strict"; +module.exports = require("net"); - if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError('invalid headersTimeout') - } +/***/ }), - if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError('invalid bodyTimeout') - } +/***/ 8061: +/***/ ((module) => { - if (reset != null && typeof reset !== 'boolean') { - throw new InvalidArgumentError('invalid reset') - } +"use strict"; +module.exports = require("node:assert"); - if (expectContinue != null && typeof expectContinue !== 'boolean') { - throw new InvalidArgumentError('invalid expectContinue') - } +/***/ }), - this.headersTimeout = headersTimeout +/***/ 6005: +/***/ ((module) => { - this.bodyTimeout = bodyTimeout +"use strict"; +module.exports = require("node:crypto"); - this.throwOnError = throwOnError === true +/***/ }), - this.method = method +/***/ 5673: +/***/ ((module) => { - this.abort = null +"use strict"; +module.exports = require("node:events"); - if (body == null) { - this.body = null - } else if (util.isStream(body)) { - this.body = body +/***/ }), - const rState = this.body._readableState - if (!rState || !rState.autoDestroy) { - this.endHandler = function autoDestroy() { - util.destroy(this) - } - this.body.on('end', this.endHandler) - } +/***/ 7561: +/***/ ((module) => { - this.errorHandler = err => { - if (this.abort) { - this.abort(err) - } else { - this.error = err - } - } - this.body.on('error', this.errorHandler) - } else if (util.isBuffer(body)) { - this.body = body.byteLength ? body : null - } else if (ArrayBuffer.isView(body)) { - this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null - } else if (body instanceof ArrayBuffer) { - this.body = body.byteLength ? Buffer.from(body) : null - } else if (typeof body === 'string') { - this.body = body.length ? Buffer.from(body) : null - } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { - this.body = body - } else { - throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable') - } +"use strict"; +module.exports = require("node:fs"); - this.completed = false +/***/ }), - this.aborted = false +/***/ 9411: +/***/ ((module) => { - this.upgrade = upgrade || null +"use strict"; +module.exports = require("node:path"); - this.path = query ? util.buildURL(path, query) : path +/***/ }), - this.origin = origin +/***/ 4492: +/***/ ((module) => { - this.idempotent = idempotent == null - ? method === 'HEAD' || method === 'GET' - : idempotent +"use strict"; +module.exports = require("node:stream"); - this.blocking = blocking == null ? false : blocking +/***/ }), - this.reset = reset == null ? null : reset +/***/ 7261: +/***/ ((module) => { - this.host = null +"use strict"; +module.exports = require("node:util"); - this.contentLength = null +/***/ }), - this.contentType = null +/***/ 2037: +/***/ ((module) => { - this.headers = '' +"use strict"; +module.exports = require("os"); - // Only for H2 - this.expectContinue = expectContinue != null ? expectContinue : false +/***/ }), - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError('headers array must be even') - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(this, headers[i], headers[i + 1]) - } - } else if (headers && typeof headers === 'object') { - const keys = Object.keys(headers) - for (let i = 0; i < keys.length; i++) { - const key = keys[i] - processHeader(this, key, headers[key]) - } - } else if (headers != null) { - throw new InvalidArgumentError('headers must be an object or an array') - } +/***/ 1017: +/***/ ((module) => { - if (util.isFormDataLike(this.body)) { - if (util.nodeMajor < 16 || (util.nodeMajor === 16 && util.nodeMinor < 8)) { - throw new InvalidArgumentError('Form-Data bodies are only supported in node v16.8 and newer.') - } +"use strict"; +module.exports = require("path"); - if (!extractBody) { - extractBody = (__nccwpck_require__(1472).extractBody) - } +/***/ }), - const [bodyStream, contentType] = extractBody(body) - if (this.contentType == null) { - this.contentType = contentType - this.headers += `content-type: ${contentType}\r\n` - } - this.body = bodyStream.stream - this.contentLength = bodyStream.length - } else if (util.isBlobLike(body) && this.contentType == null && body.type) { - this.contentType = body.type - this.headers += `content-type: ${body.type}\r\n` - } +/***/ 4074: +/***/ ((module) => { - util.validateHandler(handler, method, upgrade) +"use strict"; +module.exports = require("perf_hooks"); - this.servername = util.getServerName(this.host) +/***/ }), - this[kHandler] = handler +/***/ 3477: +/***/ ((module) => { - if (channels.create.hasSubscribers) { - channels.create.publish({ request: this }) - } - } +"use strict"; +module.exports = require("querystring"); - onBodySent(chunk) { - if (this[kHandler].onBodySent) { - try { - return this[kHandler].onBodySent(chunk) - } catch (err) { - this.abort(err) - } - } - } +/***/ }), - onRequestSent() { - if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this }) - } +/***/ 2781: +/***/ ((module) => { - if (this[kHandler].onRequestSent) { - try { - return this[kHandler].onRequestSent() - } catch (err) { - this.abort(err) - } - } - } +"use strict"; +module.exports = require("stream"); - onConnect(abort) { - assert(!this.aborted) - assert(!this.completed) +/***/ }), - if (this.error) { - abort(this.error) - } else { - this.abort = abort - return this[kHandler].onConnect(abort) - } - } +/***/ 5356: +/***/ ((module) => { - onHeaders(statusCode, headers, resume, statusText) { - assert(!this.aborted) - assert(!this.completed) +"use strict"; +module.exports = require("stream/web"); - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }) - } +/***/ }), - try { - return this[kHandler].onHeaders(statusCode, headers, resume, statusText) - } catch (err) { - this.abort(err) - } - } +/***/ 1576: +/***/ ((module) => { - onData(chunk) { - assert(!this.aborted) - assert(!this.completed) +"use strict"; +module.exports = require("string_decoder"); - try { - return this[kHandler].onData(chunk) - } catch (err) { - this.abort(err) - return false - } - } +/***/ }), - onUpgrade(statusCode, headers, socket) { - assert(!this.aborted) - assert(!this.completed) +/***/ 4404: +/***/ ((module) => { - return this[kHandler].onUpgrade(statusCode, headers, socket) - } +"use strict"; +module.exports = require("tls"); - onComplete(trailers) { - this.onFinally() +/***/ }), - assert(!this.aborted) +/***/ 7310: +/***/ ((module) => { - this.completed = true - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers }) - } +"use strict"; +module.exports = require("url"); - try { - return this[kHandler].onComplete(trailers) - } catch (err) { - // TODO (fix): This might be a bad idea? - this.onError(err) - } - } +/***/ }), - onError(error) { - this.onFinally() +/***/ 3837: +/***/ ((module) => { - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error }) - } +"use strict"; +module.exports = require("util"); - if (this.aborted) { - return - } - this.aborted = true +/***/ }), - return this[kHandler].onError(error) - } +/***/ 9830: +/***/ ((module) => { - onFinally() { - if (this.errorHandler) { - this.body.off('error', this.errorHandler) - this.errorHandler = null - } +"use strict"; +module.exports = require("util/types"); - if (this.endHandler) { - this.body.off('end', this.endHandler) - this.endHandler = null - } - } +/***/ }), - // TODO: adjust to support H2 - addHeader(key, value) { - processHeader(this, key, value) - return this - } +/***/ 1267: +/***/ ((module) => { - static [kHTTP1BuildRequest](origin, opts, handler) { - // TODO: Migrate header parsing here, to make Requests - // HTTP agnostic - return new Request(origin, opts, handler) - } +"use strict"; +module.exports = require("worker_threads"); - static [kHTTP2BuildRequest](origin, opts, handler) { - const headers = opts.headers - opts = { ...opts, headers: null } +/***/ }), - const request = new Request(origin, opts, handler) +/***/ 9796: +/***/ ((module) => { - request.headers = {} +"use strict"; +module.exports = require("zlib"); - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError('headers array must be even') - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(request, headers[i], headers[i + 1], true) - } - } else if (headers && typeof headers === 'object') { - const keys = Object.keys(headers) - for (let i = 0; i < keys.length; i++) { - const key = keys[i] - processHeader(request, key, headers[key], true) - } - } else if (headers != null) { - throw new InvalidArgumentError('headers must be an object or an array') - } +/***/ }), - return request - } +/***/ 2960: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - static [kHTTP2CopyHeaders](raw) { - const rawHeaders = raw.split('\r\n') - const headers = {} +"use strict"; - for (const header of rawHeaders) { - const [key, value] = header.split(': ') - if (value == null || value.length === 0) continue +const WritableStream = (__nccwpck_require__(4492).Writable) +const inherits = (__nccwpck_require__(7261).inherits) - if (headers[key]) headers[key] += `,${value}` - else headers[key] = value - } +const StreamSearch = __nccwpck_require__(1142) - return headers - } - } +const PartStream = __nccwpck_require__(1620) +const HeaderParser = __nccwpck_require__(2032) - function processHeaderValue(key, val, skipAppend) { - if (val && typeof val === 'object') { - throw new InvalidArgumentError(`invalid ${key} header`) - } +const DASH = 45 +const B_ONEDASH = Buffer.from('-') +const B_CRLF = Buffer.from('\r\n') +const EMPTY_FN = function () {} - val = val != null ? `${val}` : '' +function Dicer (cfg) { + if (!(this instanceof Dicer)) { return new Dicer(cfg) } + WritableStream.call(this, cfg) - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`) - } + if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') } - return skipAppend ? val : `${key}: ${val}\r\n` - } + if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined } - function processHeader(request, key, val, skipAppend = false) { - if (val && (typeof val === 'object' && !Array.isArray(val))) { - throw new InvalidArgumentError(`invalid ${key} header`) - } else if (val === undefined) { - return - } + this._headerFirst = cfg.headerFirst - if ( - request.host === null && - key.length === 4 && - key.toLowerCase() === 'host' - ) { - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`) - } - // Consumed by Client - request.host = val - } else if ( - request.contentLength === null && - key.length === 14 && - key.toLowerCase() === 'content-length' - ) { - request.contentLength = parseInt(val, 10) - if (!Number.isFinite(request.contentLength)) { - throw new InvalidArgumentError('invalid content-length header') - } - } else if ( - request.contentType === null && - key.length === 12 && - key.toLowerCase() === 'content-type' - ) { - request.contentType = val - if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend) - else request.headers += processHeaderValue(key, val) - } else if ( - key.length === 17 && - key.toLowerCase() === 'transfer-encoding' - ) { - throw new InvalidArgumentError('invalid transfer-encoding header') - } else if ( - key.length === 10 && - key.toLowerCase() === 'connection' - ) { - const value = typeof val === 'string' ? val.toLowerCase() : null - if (value !== 'close' && value !== 'keep-alive') { - throw new InvalidArgumentError('invalid connection header') - } else if (value === 'close') { - request.reset = true - } - } else if ( - key.length === 10 && - key.toLowerCase() === 'keep-alive' - ) { - throw new InvalidArgumentError('invalid keep-alive header') - } else if ( - key.length === 7 && - key.toLowerCase() === 'upgrade' - ) { - throw new InvalidArgumentError('invalid upgrade header') - } else if ( - key.length === 6 && - key.toLowerCase() === 'expect' - ) { - throw new NotSupportedError('expect header not supported') - } else if (tokenRegExp.exec(key) === null) { - throw new InvalidArgumentError('invalid header key') - } else { - if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - if (skipAppend) { - if (request.headers[key]) request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}` - else request.headers[key] = processHeaderValue(key, val[i], skipAppend) - } else { - request.headers += processHeaderValue(key, val[i]) - } - } - } else { - if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend) - else request.headers += processHeaderValue(key, val) - } - } - } + this._dashes = 0 + this._parts = 0 + this._finished = false + this._realFinish = false + this._isPreamble = true + this._justMatched = false + this._firstWrite = true + this._inHeader = true + this._part = undefined + this._cb = undefined + this._ignoreData = false + this._partOpts = { highWaterMark: cfg.partHwm } + this._pause = false - module.exports = Request + const self = this + this._hparser = new HeaderParser(cfg) + this._hparser.on('header', function (header) { + self._inHeader = false + self._part.emit('header', header) + }) +} +inherits(Dicer, WritableStream) + +Dicer.prototype.emit = function (ev) { + if (ev === 'finish' && !this._realFinish) { + if (!this._finished) { + const self = this + process.nextTick(function () { + self.emit('error', new Error('Unexpected end of multipart data')) + if (self._part && !self._ignoreData) { + const type = (self._isPreamble ? 'Preamble' : 'Part') + self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data')) + self._part.push(null) + process.nextTick(function () { + self._realFinish = true + self.emit('finish') + self._realFinish = false + }) + return + } + self._realFinish = true + self.emit('finish') + self._realFinish = false + }) + } + } else { WritableStream.prototype.emit.apply(this, arguments) } +} +Dicer.prototype._write = function (data, encoding, cb) { + // ignore unexpected data (e.g. extra trailer data after finished) + if (!this._hparser && !this._bparser) { return cb() } - /***/ -}), + if (this._headerFirst && this._isPreamble) { + if (!this._part) { + this._part = new PartStream(this._partOpts) + if (this.listenerCount('preamble') !== 0) { this.emit('preamble', this._part) } else { this._ignore() } + } + const r = this._hparser.push(data) + if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() } + } -/***/ 2785: -/***/ ((module) => { + // allows for "easier" testing + if (this._firstWrite) { + this._bparser.push(B_CRLF) + this._firstWrite = false + } - module.exports = { - kClose: Symbol('close'), - kDestroy: Symbol('destroy'), - kDispatch: Symbol('dispatch'), - kUrl: Symbol('url'), - kWriting: Symbol('writing'), - kResuming: Symbol('resuming'), - kQueue: Symbol('queue'), - kConnect: Symbol('connect'), - kConnecting: Symbol('connecting'), - kHeadersList: Symbol('headers list'), - kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'), - kKeepAliveMaxTimeout: Symbol('max keep alive timeout'), - kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'), - kKeepAliveTimeoutValue: Symbol('keep alive timeout'), - kKeepAlive: Symbol('keep alive'), - kHeadersTimeout: Symbol('headers timeout'), - kBodyTimeout: Symbol('body timeout'), - kServerName: Symbol('server name'), - kLocalAddress: Symbol('local address'), - kHost: Symbol('host'), - kNoRef: Symbol('no ref'), - kBodyUsed: Symbol('used'), - kRunning: Symbol('running'), - kBlocking: Symbol('blocking'), - kPending: Symbol('pending'), - kSize: Symbol('size'), - kBusy: Symbol('busy'), - kQueued: Symbol('queued'), - kFree: Symbol('free'), - kConnected: Symbol('connected'), - kClosed: Symbol('closed'), - kNeedDrain: Symbol('need drain'), - kReset: Symbol('reset'), - kDestroyed: Symbol.for('nodejs.stream.destroyed'), - kMaxHeadersSize: Symbol('max headers size'), - kRunningIdx: Symbol('running index'), - kPendingIdx: Symbol('pending index'), - kError: Symbol('error'), - kClients: Symbol('clients'), - kClient: Symbol('client'), - kParser: Symbol('parser'), - kOnDestroyed: Symbol('destroy callbacks'), - kPipelining: Symbol('pipelining'), - kSocket: Symbol('socket'), - kHostHeader: Symbol('host header'), - kConnector: Symbol('connector'), - kStrictContentLength: Symbol('strict content length'), - kMaxRedirections: Symbol('maxRedirections'), - kMaxRequests: Symbol('maxRequestsPerClient'), - kProxy: Symbol('proxy agent options'), - kCounter: Symbol('socket request counter'), - kInterceptors: Symbol('dispatch interceptors'), - kMaxResponseSize: Symbol('max response size'), - kHTTP2Session: Symbol('http2Session'), - kHTTP2SessionState: Symbol('http2Session state'), - kHTTP2BuildRequest: Symbol('http2 build request'), - kHTTP1BuildRequest: Symbol('http1 build request'), - kHTTP2CopyHeaders: Symbol('http2 copy headers'), - kHTTPConnVersion: Symbol('http connection version'), - kRetryHandlerDefaultRetry: Symbol('retry agent default retry'), - kConstruct: Symbol('constructable') - } + this._bparser.push(data) + if (this._pause) { this._cb = cb } else { cb() } +} - /***/ -}), +Dicer.prototype.reset = function () { + this._part = undefined + this._bparser = undefined + this._hparser = undefined +} -/***/ 3983: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +Dicer.prototype.setBoundary = function (boundary) { + const self = this + this._bparser = new StreamSearch('\r\n--' + boundary) + this._bparser.on('info', function (isMatch, data, start, end) { + self._oninfo(isMatch, data, start, end) + }) +} - "use strict"; +Dicer.prototype._ignore = function () { + if (this._part && !this._ignoreData) { + this._ignoreData = true + this._part.on('error', EMPTY_FN) + // we must perform some kind of read on the stream even though we are + // ignoring the data, otherwise node's Readable stream will not emit 'end' + // after pushing null to the stream + this._part.resume() + } +} +Dicer.prototype._oninfo = function (isMatch, data, start, end) { + let buf; const self = this; let i = 0; let r; let shouldWriteMore = true + + if (!this._part && this._justMatched && data) { + while (this._dashes < 2 && (start + i) < end) { + if (data[start + i] === DASH) { + ++i + ++this._dashes + } else { + if (this._dashes) { buf = B_ONEDASH } + this._dashes = 0 + break + } + } + if (this._dashes === 2) { + if ((start + i) < end && this.listenerCount('trailer') !== 0) { this.emit('trailer', data.slice(start + i, end)) } + this.reset() + this._finished = true + // no more parts will be added + if (self._parts === 0) { + self._realFinish = true + self.emit('finish') + self._realFinish = false + } + } + if (this._dashes) { return } + } + if (this._justMatched) { this._justMatched = false } + if (!this._part) { + this._part = new PartStream(this._partOpts) + this._part._read = function (n) { + self._unpause() + } + if (this._isPreamble && this.listenerCount('preamble') !== 0) { + this.emit('preamble', this._part) + } else if (this._isPreamble !== true && this.listenerCount('part') !== 0) { + this.emit('part', this._part) + } else { + this._ignore() + } + if (!this._isPreamble) { this._inHeader = true } + } + if (data && start < end && !this._ignoreData) { + if (this._isPreamble || !this._inHeader) { + if (buf) { shouldWriteMore = this._part.push(buf) } + shouldWriteMore = this._part.push(data.slice(start, end)) + if (!shouldWriteMore) { this._pause = true } + } else if (!this._isPreamble && this._inHeader) { + if (buf) { this._hparser.push(buf) } + r = this._hparser.push(data.slice(start, end)) + if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) } + } + } + if (isMatch) { + this._hparser.reset() + if (this._isPreamble) { this._isPreamble = false } else { + if (start !== end) { + ++this._parts + this._part.on('end', function () { + if (--self._parts === 0) { + if (self._finished) { + self._realFinish = true + self.emit('finish') + self._realFinish = false + } else { + self._unpause() + } + } + }) + } + } + this._part.push(null) + this._part = undefined + this._ignoreData = false + this._justMatched = true + this._dashes = 0 + } +} - const assert = __nccwpck_require__(9491) - const { kDestroyed, kBodyUsed } = __nccwpck_require__(2785) - const { IncomingMessage } = __nccwpck_require__(3685) - const stream = __nccwpck_require__(2781) - const net = __nccwpck_require__(1808) - const { InvalidArgumentError } = __nccwpck_require__(8045) - const { Blob } = __nccwpck_require__(4300) - const nodeUtil = __nccwpck_require__(3837) - const { stringify } = __nccwpck_require__(3477) - const { headerNameLowerCasedRecord } = __nccwpck_require__(4462) +Dicer.prototype._unpause = function () { + if (!this._pause) { return } - const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v)) + this._pause = false + if (this._cb) { + const cb = this._cb + this._cb = undefined + cb() + } +} - function nop() { } +module.exports = Dicer - function isStream(obj) { - return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function' - } - // based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License) - function isBlobLike(object) { - return (Blob && object instanceof Blob) || ( - object && - typeof object === 'object' && - (typeof object.stream === 'function' || - typeof object.arrayBuffer === 'function') && - /^(Blob|File)$/.test(object[Symbol.toStringTag]) - ) - } +/***/ }), - function buildURL(url, queryParams) { - if (url.includes('?') || url.includes('#')) { - throw new Error('Query params cannot be passed when url already contains "?" or "#".') - } +/***/ 2032: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - const stringified = stringify(queryParams) +"use strict"; + + +const EventEmitter = (__nccwpck_require__(5673).EventEmitter) +const inherits = (__nccwpck_require__(7261).inherits) +const getLimit = __nccwpck_require__(1467) + +const StreamSearch = __nccwpck_require__(1142) + +const B_DCRLF = Buffer.from('\r\n\r\n') +const RE_CRLF = /\r\n/g +const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/ // eslint-disable-line no-control-regex + +function HeaderParser (cfg) { + EventEmitter.call(this) + + cfg = cfg || {} + const self = this + this.nread = 0 + this.maxed = false + this.npairs = 0 + this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000) + this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024) + this.buffer = '' + this.header = {} + this.finished = false + this.ss = new StreamSearch(B_DCRLF) + this.ss.on('info', function (isMatch, data, start, end) { + if (data && !self.maxed) { + if (self.nread + end - start >= self.maxHeaderSize) { + end = self.maxHeaderSize - self.nread + start + self.nread = self.maxHeaderSize + self.maxed = true + } else { self.nread += (end - start) } + + self.buffer += data.toString('binary', start, end) + } + if (isMatch) { self._finish() } + }) +} +inherits(HeaderParser, EventEmitter) - if (stringified) { - url += '?' + stringified - } +HeaderParser.prototype.push = function (data) { + const r = this.ss.push(data) + if (this.finished) { return r } +} - return url - } +HeaderParser.prototype.reset = function () { + this.finished = false + this.buffer = '' + this.header = {} + this.ss.reset() +} - function parseURL(url) { - if (typeof url === 'string') { - url = new URL(url) +HeaderParser.prototype._finish = function () { + if (this.buffer) { this._parseHeader() } + this.ss.matches = this.ss.maxMatches + const header = this.header + this.header = {} + this.buffer = '' + this.finished = true + this.nread = this.npairs = 0 + this.maxed = false + this.emit('header', header) +} - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') - } +HeaderParser.prototype._parseHeader = function () { + if (this.npairs === this.maxHeaderPairs) { return } + + const lines = this.buffer.split(RE_CRLF) + const len = lines.length + let m, h + + for (var i = 0; i < len; ++i) { // eslint-disable-line no-var + if (lines[i].length === 0) { continue } + if (lines[i][0] === '\t' || lines[i][0] === ' ') { + // folded header content + // RFC2822 says to just remove the CRLF and not the whitespace following + // it, so we follow the RFC and include the leading whitespace ... + if (h) { + this.header[h][this.header[h].length - 1] += lines[i] + continue + } + } + + const posColon = lines[i].indexOf(':') + if ( + posColon === -1 || + posColon === 0 + ) { + return + } + m = RE_HDR.exec(lines[i]) + h = m[1].toLowerCase() + this.header[h] = this.header[h] || [] + this.header[h].push((m[2] || '')) + if (++this.npairs === this.maxHeaderPairs) { break } + } +} - return url - } +module.exports = HeaderParser - if (!url || typeof url !== 'object') { - throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.') - } - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.') - } +/***/ }), - if (!(url instanceof URL)) { - if (url.port != null && url.port !== '' && !Number.isFinite(parseInt(url.port))) { - throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.') - } +/***/ 1620: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - if (url.path != null && typeof url.path !== 'string') { - throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.') - } +"use strict"; - if (url.pathname != null && typeof url.pathname !== 'string') { - throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.') - } - if (url.hostname != null && typeof url.hostname !== 'string') { - throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.') - } +const inherits = (__nccwpck_require__(7261).inherits) +const ReadableStream = (__nccwpck_require__(4492).Readable) - if (url.origin != null && typeof url.origin !== 'string') { - throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.') - } +function PartStream (opts) { + ReadableStream.call(this, opts) +} +inherits(PartStream, ReadableStream) - const port = url.port != null - ? url.port - : (url.protocol === 'https:' ? 443 : 80) - let origin = url.origin != null - ? url.origin - : `${url.protocol}//${url.hostname}:${port}` - let path = url.path != null - ? url.path - : `${url.pathname || ''}${url.search || ''}` - - if (origin.endsWith('/')) { - origin = origin.substring(0, origin.length - 1) - } +PartStream.prototype._read = function (n) {} - if (path && !path.startsWith('/')) { - path = `/${path}` - } - // new URL(path, origin) is unsafe when `path` contains an absolute URL - // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL: - // If first parameter is a relative URL, second param is required, and will be used as the base URL. - // If first parameter is an absolute URL, a given second param will be ignored. - url = new URL(origin + path) - } +module.exports = PartStream - return url - } - function parseOrigin(url) { - url = parseURL(url) +/***/ }), - if (url.pathname !== '/' || url.search || url.hash) { - throw new InvalidArgumentError('invalid url') - } +/***/ 1142: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - return url - } +"use strict"; + + +/** + * Copyright Brian White. All rights reserved. + * + * @see https://github.com/mscdex/streamsearch + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation + * by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool + */ +const EventEmitter = (__nccwpck_require__(5673).EventEmitter) +const inherits = (__nccwpck_require__(7261).inherits) + +function SBMH (needle) { + if (typeof needle === 'string') { + needle = Buffer.from(needle) + } + + if (!Buffer.isBuffer(needle)) { + throw new TypeError('The needle has to be a String or a Buffer.') + } + + const needleLength = needle.length + + if (needleLength === 0) { + throw new Error('The needle cannot be an empty String/Buffer.') + } + + if (needleLength > 256) { + throw new Error('The needle cannot have a length bigger than 256.') + } + + this.maxMatches = Infinity + this.matches = 0 + + this._occ = new Array(256) + .fill(needleLength) // Initialize occurrence table. + this._lookbehind_size = 0 + this._needle = needle + this._bufpos = 0 + + this._lookbehind = Buffer.alloc(needleLength) + + // Populate occurrence table with analysis of the needle, + // ignoring last letter. + for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var + this._occ[needle[i]] = needleLength - 1 - i + } +} +inherits(SBMH, EventEmitter) - function getHostname(host) { - if (host[0] === '[') { - const idx = host.indexOf(']') +SBMH.prototype.reset = function () { + this._lookbehind_size = 0 + this.matches = 0 + this._bufpos = 0 +} - assert(idx !== -1) - return host.substring(1, idx) - } +SBMH.prototype.push = function (chunk, pos) { + if (!Buffer.isBuffer(chunk)) { + chunk = Buffer.from(chunk, 'binary') + } + const chlen = chunk.length + this._bufpos = pos || 0 + let r + while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) } + return r +} - const idx = host.indexOf(':') - if (idx === -1) return host +SBMH.prototype._sbmh_feed = function (data) { + const len = data.length + const needle = this._needle + const needleLength = needle.length + const lastNeedleChar = needle[needleLength - 1] + + // Positive: points to a position in `data` + // pos == 3 points to data[3] + // Negative: points to a position in the lookbehind buffer + // pos == -2 points to lookbehind[lookbehind_size - 2] + let pos = -this._lookbehind_size + let ch + + if (pos < 0) { + // Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool + // search with character lookup code that considers both the + // lookbehind buffer and the current round's haystack data. + // + // Loop until + // there is a match. + // or until + // we've moved past the position that requires the + // lookbehind buffer. In this case we switch to the + // optimized loop. + // or until + // the character to look at lies outside the haystack. + while (pos < 0 && pos <= len - needleLength) { + ch = this._sbmh_lookup_char(data, pos + needleLength - 1) + + if ( + ch === lastNeedleChar && + this._sbmh_memcmp(data, pos, needleLength - 1) + ) { + this._lookbehind_size = 0 + ++this.matches + this.emit('info', true) + + return (this._bufpos = pos + needleLength) + } + pos += this._occ[ch] + } + + // No match. + + if (pos < 0) { + // There's too few data for Boyer-Moore-Horspool to run, + // so let's use a different algorithm to skip as much as + // we can. + // Forward pos until + // the trailing part of lookbehind + data + // looks like the beginning of the needle + // or until + // pos == 0 + while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos } + } + + if (pos >= 0) { + // Discard lookbehind buffer. + this.emit('info', false, this._lookbehind, 0, this._lookbehind_size) + this._lookbehind_size = 0 + } else { + // Cut off part of the lookbehind buffer that has + // been processed and append the entire haystack + // into it. + const bytesToCutOff = this._lookbehind_size + pos + if (bytesToCutOff > 0) { + // The cut off data is guaranteed not to contain the needle. + this.emit('info', false, this._lookbehind, 0, bytesToCutOff) + } + + this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff, + this._lookbehind_size - bytesToCutOff) + this._lookbehind_size -= bytesToCutOff + + data.copy(this._lookbehind, this._lookbehind_size) + this._lookbehind_size += len + + this._bufpos = len + return len + } + } + + pos += (pos >= 0) * this._bufpos + + // Lookbehind buffer is now empty. We only need to check if the + // needle is in the haystack. + if (data.indexOf(needle, pos) !== -1) { + pos = data.indexOf(needle, pos) + ++this.matches + if (pos > 0) { this.emit('info', true, data, this._bufpos, pos) } else { this.emit('info', true) } + + return (this._bufpos = pos + needleLength) + } else { + pos = len - needleLength + } + + // There was no match. If there's trailing haystack data that we cannot + // match yet using the Boyer-Moore-Horspool algorithm (because the trailing + // data is less than the needle size) then match using a modified + // algorithm that starts matching from the beginning instead of the end. + // Whatever trailing data is left after running this algorithm is added to + // the lookbehind buffer. + while ( + pos < len && + ( + data[pos] !== needle[0] || + ( + (Buffer.compare( + data.subarray(pos, pos + len - pos), + needle.subarray(0, len - pos) + ) !== 0) + ) + ) + ) { + ++pos + } + if (pos < len) { + data.copy(this._lookbehind, 0, pos, pos + (len - pos)) + this._lookbehind_size = len - pos + } + + // Everything until pos is guaranteed not to contain needle data. + if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len) } + + this._bufpos = len + return len +} - return host.substring(0, idx) - } +SBMH.prototype._sbmh_lookup_char = function (data, pos) { + return (pos < 0) + ? this._lookbehind[this._lookbehind_size + pos] + : data[pos] +} - // IP addresses are not valid server names per RFC6066 - // > Currently, the only server names supported are DNS hostnames - function getServerName(host) { - if (!host) { - return null - } +SBMH.prototype._sbmh_memcmp = function (data, pos, len) { + for (var i = 0; i < len; ++i) { // eslint-disable-line no-var + if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false } + } + return true +} - assert.strictEqual(typeof host, 'string') +module.exports = SBMH - const servername = getHostname(host) - if (net.isIP(servername)) { - return '' - } - return servername - } +/***/ }), - function deepClone(obj) { - return JSON.parse(JSON.stringify(obj)) - } +/***/ 727: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - function isAsyncIterable(obj) { - return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function') - } +"use strict"; - function isIterable(obj) { - return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function')) - } - function bodyLength(body) { - if (body == null) { - return 0 - } else if (isStream(body)) { - const state = body._readableState - return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length) - ? state.length - : null - } else if (isBlobLike(body)) { - return body.size != null ? body.size : null - } else if (isBuffer(body)) { - return body.byteLength - } +const WritableStream = (__nccwpck_require__(4492).Writable) +const { inherits } = __nccwpck_require__(7261) +const Dicer = __nccwpck_require__(2960) - return null - } +const MultipartParser = __nccwpck_require__(2183) +const UrlencodedParser = __nccwpck_require__(8306) +const parseParams = __nccwpck_require__(1854) - function isDestroyed(stream) { - return !stream || !!(stream.destroyed || stream[kDestroyed]) - } +function Busboy (opts) { + if (!(this instanceof Busboy)) { return new Busboy(opts) } - function isReadableAborted(stream) { - const state = stream && stream._readableState - return isDestroyed(stream) && state && !state.endEmitted - } + if (typeof opts !== 'object') { + throw new TypeError('Busboy expected an options-Object.') + } + if (typeof opts.headers !== 'object') { + throw new TypeError('Busboy expected an options-Object with headers-attribute.') + } + if (typeof opts.headers['content-type'] !== 'string') { + throw new TypeError('Missing Content-Type-header.') + } - function destroy(stream, err) { - if (stream == null || !isStream(stream) || isDestroyed(stream)) { - return - } + const { + headers, + ...streamOptions + } = opts - if (typeof stream.destroy === 'function') { - if (Object.getPrototypeOf(stream).constructor === IncomingMessage) { - // See: https://github.com/nodejs/node/pull/38505/files - stream.socket = null - } + this.opts = { + autoDestroy: false, + ...streamOptions + } + WritableStream.call(this, this.opts) - stream.destroy(err) - } else if (err) { - process.nextTick((stream, err) => { - stream.emit('error', err) - }, stream, err) - } + this._done = false + this._parser = this.getParserByHeaders(headers) + this._finished = false +} +inherits(Busboy, WritableStream) + +Busboy.prototype.emit = function (ev) { + if (ev === 'finish') { + if (!this._done) { + this._parser?.end() + return + } else if (this._finished) { + return + } + this._finished = true + } + WritableStream.prototype.emit.apply(this, arguments) +} - if (stream.destroyed !== true) { - stream[kDestroyed] = true - } - } +Busboy.prototype.getParserByHeaders = function (headers) { + const parsed = parseParams(headers['content-type']) + + const cfg = { + defCharset: this.opts.defCharset, + fileHwm: this.opts.fileHwm, + headers, + highWaterMark: this.opts.highWaterMark, + isPartAFile: this.opts.isPartAFile, + limits: this.opts.limits, + parsedConType: parsed, + preservePath: this.opts.preservePath + } + + if (MultipartParser.detect.test(parsed[0])) { + return new MultipartParser(this, cfg) + } + if (UrlencodedParser.detect.test(parsed[0])) { + return new UrlencodedParser(this, cfg) + } + throw new Error('Unsupported Content-Type.') +} - const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/ - function parseKeepAliveTimeout(val) { - const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR) - return m ? parseInt(m[1], 10) * 1000 : null - } +Busboy.prototype._write = function (chunk, encoding, cb) { + this._parser.write(chunk, cb) +} - /** - * Retrieves a header name and returns its lowercase value. - * @param {string | Buffer} value Header name - * @returns {string} - */ - function headerNameToString(value) { - return headerNameLowerCasedRecord[value] || value.toLowerCase() - } +module.exports = Busboy +module.exports["default"] = Busboy +module.exports.Busboy = Busboy - function parseHeaders(headers, obj = {}) { - // For H2 support - if (!Array.isArray(headers)) return headers +module.exports.Dicer = Dicer - for (let i = 0; i < headers.length; i += 2) { - const key = headers[i].toString().toLowerCase() - let val = obj[key] - if (!val) { - if (Array.isArray(headers[i + 1])) { - obj[key] = headers[i + 1].map(x => x.toString('utf8')) - } else { - obj[key] = headers[i + 1].toString('utf8') - } - } else { - if (!Array.isArray(val)) { - val = [val] - obj[key] = val - } - val.push(headers[i + 1].toString('utf8')) - } - } +/***/ }), - // See https://github.com/nodejs/node/pull/46528 - if ('content-length' in obj && 'content-disposition' in obj) { - obj['content-disposition'] = Buffer.from(obj['content-disposition']).toString('latin1') - } +/***/ 2183: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - return obj - } +"use strict"; + + +// TODO: +// * support 1 nested multipart level +// (see second multipart example here: +// http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data) +// * support limits.fieldNameSize +// -- this will require modifications to utils.parseParams + +const { Readable } = __nccwpck_require__(4492) +const { inherits } = __nccwpck_require__(7261) + +const Dicer = __nccwpck_require__(2960) + +const parseParams = __nccwpck_require__(1854) +const decodeText = __nccwpck_require__(4619) +const basename = __nccwpck_require__(8647) +const getLimit = __nccwpck_require__(1467) + +const RE_BOUNDARY = /^boundary$/i +const RE_FIELD = /^form-data$/i +const RE_CHARSET = /^charset$/i +const RE_FILENAME = /^filename$/i +const RE_NAME = /^name$/i + +Multipart.detect = /^multipart\/form-data/i +function Multipart (boy, cfg) { + let i + let len + const self = this + let boundary + const limits = cfg.limits + const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined)) + const parsedConType = cfg.parsedConType || [] + const defCharset = cfg.defCharset || 'utf8' + const preservePath = cfg.preservePath + const fileOpts = { highWaterMark: cfg.fileHwm } + + for (i = 0, len = parsedConType.length; i < len; ++i) { + if (Array.isArray(parsedConType[i]) && + RE_BOUNDARY.test(parsedConType[i][0])) { + boundary = parsedConType[i][1] + break + } + } + + function checkFinished () { + if (nends === 0 && finished && !boy._done) { + finished = false + self.end() + } + } + + if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') } + + const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024) + const fileSizeLimit = getLimit(limits, 'fileSize', Infinity) + const filesLimit = getLimit(limits, 'files', Infinity) + const fieldsLimit = getLimit(limits, 'fields', Infinity) + const partsLimit = getLimit(limits, 'parts', Infinity) + const headerPairsLimit = getLimit(limits, 'headerPairs', 2000) + const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024) + + let nfiles = 0 + let nfields = 0 + let nends = 0 + let curFile + let curField + let finished = false + + this._needDrain = false + this._pause = false + this._cb = undefined + this._nparts = 0 + this._boy = boy + + const parserCfg = { + boundary, + maxHeaderPairs: headerPairsLimit, + maxHeaderSize: headerSizeLimit, + partHwm: fileOpts.highWaterMark, + highWaterMark: cfg.highWaterMark + } + + this.parser = new Dicer(parserCfg) + this.parser.on('drain', function () { + self._needDrain = false + if (self._cb && !self._pause) { + const cb = self._cb + self._cb = undefined + cb() + } + }).on('part', function onPart (part) { + if (++self._nparts > partsLimit) { + self.parser.removeListener('part', onPart) + self.parser.on('part', skipPart) + boy.hitPartsLimit = true + boy.emit('partsLimit') + return skipPart(part) + } + + // hack because streams2 _always_ doesn't emit 'end' until nextTick, so let + // us emit 'end' early since we know the part has ended if we are already + // seeing the next part + if (curField) { + const field = curField + field.emit('end') + field.removeAllListeners('end') + } + + part.on('header', function (header) { + let contype + let fieldname + let parsed + let charset + let encoding + let filename + let nsize = 0 + + if (header['content-type']) { + parsed = parseParams(header['content-type'][0]) + if (parsed[0]) { + contype = parsed[0].toLowerCase() + for (i = 0, len = parsed.length; i < len; ++i) { + if (RE_CHARSET.test(parsed[i][0])) { + charset = parsed[i][1].toLowerCase() + break + } + } + } + } + + if (contype === undefined) { contype = 'text/plain' } + if (charset === undefined) { charset = defCharset } + + if (header['content-disposition']) { + parsed = parseParams(header['content-disposition'][0]) + if (!RE_FIELD.test(parsed[0])) { return skipPart(part) } + for (i = 0, len = parsed.length; i < len; ++i) { + if (RE_NAME.test(parsed[i][0])) { + fieldname = parsed[i][1] + } else if (RE_FILENAME.test(parsed[i][0])) { + filename = parsed[i][1] + if (!preservePath) { filename = basename(filename) } + } + } + } else { return skipPart(part) } + + if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' } + + let onData, + onEnd + + if (isPartAFile(fieldname, contype, filename)) { + // file/binary field + if (nfiles === filesLimit) { + if (!boy.hitFilesLimit) { + boy.hitFilesLimit = true + boy.emit('filesLimit') + } + return skipPart(part) + } + + ++nfiles + + if (boy.listenerCount('file') === 0) { + self.parser._ignore() + return + } + + ++nends + const file = new FileStream(fileOpts) + curFile = file + file.on('end', function () { + --nends + self._pause = false + checkFinished() + if (self._cb && !self._needDrain) { + const cb = self._cb + self._cb = undefined + cb() + } + }) + file._read = function (n) { + if (!self._pause) { return } + self._pause = false + if (self._cb && !self._needDrain) { + const cb = self._cb + self._cb = undefined + cb() + } + } + boy.emit('file', fieldname, file, filename, encoding, contype) + + onData = function (data) { + if ((nsize += data.length) > fileSizeLimit) { + const extralen = fileSizeLimit - nsize + data.length + if (extralen > 0) { file.push(data.slice(0, extralen)) } + file.truncated = true + file.bytesRead = fileSizeLimit + part.removeAllListeners('data') + file.emit('limit') + return + } else if (!file.push(data)) { self._pause = true } + + file.bytesRead = nsize + } + + onEnd = function () { + curFile = undefined + file.push(null) + } + } else { + // non-file field + if (nfields === fieldsLimit) { + if (!boy.hitFieldsLimit) { + boy.hitFieldsLimit = true + boy.emit('fieldsLimit') + } + return skipPart(part) + } + + ++nfields + ++nends + let buffer = '' + let truncated = false + curField = part + + onData = function (data) { + if ((nsize += data.length) > fieldSizeLimit) { + const extralen = (fieldSizeLimit - (nsize - data.length)) + buffer += data.toString('binary', 0, extralen) + truncated = true + part.removeAllListeners('data') + } else { buffer += data.toString('binary') } + } + + onEnd = function () { + curField = undefined + if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) } + boy.emit('field', fieldname, buffer, false, truncated, encoding, contype) + --nends + checkFinished() + } + } + + /* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become + broken. Streams2/streams3 is a huge black box of confusion, but + somehow overriding the sync state seems to fix things again (and still + seems to work for previous node versions). + */ + part._readableState.sync = false + + part.on('data', onData) + part.on('end', onEnd) + }).on('error', function (err) { + if (curFile) { curFile.emit('error', err) } + }) + }).on('error', function (err) { + boy.emit('error', err) + }).on('finish', function () { + finished = true + checkFinished() + }) +} - function parseRawHeaders(headers) { - const ret = [] - let hasContentLength = false - let contentDispositionIdx = -1 - - for (let n = 0; n < headers.length; n += 2) { - const key = headers[n + 0].toString() - const val = headers[n + 1].toString('utf8') - - if (key.length === 14 && (key === 'content-length' || key.toLowerCase() === 'content-length')) { - ret.push(key, val) - hasContentLength = true - } else if (key.length === 19 && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) { - contentDispositionIdx = ret.push(key, val) - 1 - } else { - ret.push(key, val) - } - } +Multipart.prototype.write = function (chunk, cb) { + const r = this.parser.write(chunk) + if (r && !this._pause) { + cb() + } else { + this._needDrain = !r + this._cb = cb + } +} - // See https://github.com/nodejs/node/pull/46528 - if (hasContentLength && contentDispositionIdx !== -1) { - ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString('latin1') - } +Multipart.prototype.end = function () { + const self = this + + if (self.parser.writable) { + self.parser.end() + } else if (!self._boy._done) { + process.nextTick(function () { + self._boy._done = true + self._boy.emit('finish') + }) + } +} - return ret - } +function skipPart (part) { + part.resume() +} - function isBuffer(buffer) { - // See, https://github.com/mcollina/undici/pull/319 - return buffer instanceof Uint8Array || Buffer.isBuffer(buffer) - } +function FileStream (opts) { + Readable.call(this, opts) - function validateHandler(handler, method, upgrade) { - if (!handler || typeof handler !== 'object') { - throw new InvalidArgumentError('handler must be an object') - } + this.bytesRead = 0 - if (typeof handler.onConnect !== 'function') { - throw new InvalidArgumentError('invalid onConnect method') - } + this.truncated = false +} - if (typeof handler.onError !== 'function') { - throw new InvalidArgumentError('invalid onError method') - } +inherits(FileStream, Readable) - if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) { - throw new InvalidArgumentError('invalid onBodySent method') - } +FileStream.prototype._read = function (n) {} - if (upgrade || method === 'CONNECT') { - if (typeof handler.onUpgrade !== 'function') { - throw new InvalidArgumentError('invalid onUpgrade method') - } - } else { - if (typeof handler.onHeaders !== 'function') { - throw new InvalidArgumentError('invalid onHeaders method') - } +module.exports = Multipart - if (typeof handler.onData !== 'function') { - throw new InvalidArgumentError('invalid onData method') - } - if (typeof handler.onComplete !== 'function') { - throw new InvalidArgumentError('invalid onComplete method') - } - } - } +/***/ }), - // A body is disturbed if it has been read from and it cannot - // be re-used without losing state or data. - function isDisturbed(body) { - return !!(body && ( - stream.isDisturbed - ? stream.isDisturbed(body) || body[kBodyUsed] // TODO (fix): Why is body[kBodyUsed] needed? - : body[kBodyUsed] || - body.readableDidRead || - (body._readableState && body._readableState.dataEmitted) || - isReadableAborted(body) - )) - } +/***/ 8306: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - function isErrored(body) { - return !!(body && ( - stream.isErrored - ? stream.isErrored(body) - : /state: 'errored'/.test(nodeUtil.inspect(body) - ))) - } +"use strict"; + + +const Decoder = __nccwpck_require__(7100) +const decodeText = __nccwpck_require__(4619) +const getLimit = __nccwpck_require__(1467) + +const RE_CHARSET = /^charset$/i + +UrlEncoded.detect = /^application\/x-www-form-urlencoded/i +function UrlEncoded (boy, cfg) { + const limits = cfg.limits + const parsedConType = cfg.parsedConType + this.boy = boy + + this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024) + this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100) + this.fieldsLimit = getLimit(limits, 'fields', Infinity) + + let charset + for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var + if (Array.isArray(parsedConType[i]) && + RE_CHARSET.test(parsedConType[i][0])) { + charset = parsedConType[i][1].toLowerCase() + break + } + } + + if (charset === undefined) { charset = cfg.defCharset || 'utf8' } + + this.decoder = new Decoder() + this.charset = charset + this._fields = 0 + this._state = 'key' + this._checkingBytes = true + this._bytesKey = 0 + this._bytesVal = 0 + this._key = '' + this._val = '' + this._keyTrunc = false + this._valTrunc = false + this._hitLimit = false +} - function isReadable(body) { - return !!(body && ( - stream.isReadable - ? stream.isReadable(body) - : /state: 'readable'/.test(nodeUtil.inspect(body) - ))) - } +UrlEncoded.prototype.write = function (data, cb) { + if (this._fields === this.fieldsLimit) { + if (!this.boy.hitFieldsLimit) { + this.boy.hitFieldsLimit = true + this.boy.emit('fieldsLimit') + } + return cb() + } + + let idxeq; let idxamp; let i; let p = 0; const len = data.length + + while (p < len) { + if (this._state === 'key') { + idxeq = idxamp = undefined + for (i = p; i < len; ++i) { + if (!this._checkingBytes) { ++p } + if (data[i] === 0x3D/* = */) { + idxeq = i + break + } else if (data[i] === 0x26/* & */) { + idxamp = i + break + } + if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) { + this._hitLimit = true + break + } else if (this._checkingBytes) { ++this._bytesKey } + } + + if (idxeq !== undefined) { + // key with assignment + if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) } + this._state = 'val' + + this._hitLimit = false + this._checkingBytes = true + this._val = '' + this._bytesVal = 0 + this._valTrunc = false + this.decoder.reset() + + p = idxeq + 1 + } else if (idxamp !== undefined) { + // key with no assignment + ++this._fields + let key; const keyTrunc = this._keyTrunc + if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key } + + this._hitLimit = false + this._checkingBytes = true + this._key = '' + this._bytesKey = 0 + this._keyTrunc = false + this.decoder.reset() + + if (key.length) { + this.boy.emit('field', decodeText(key, 'binary', this.charset), + '', + keyTrunc, + false) + } + + p = idxamp + 1 + if (this._fields === this.fieldsLimit) { return cb() } + } else if (this._hitLimit) { + // we may not have hit the actual limit if there are encoded bytes... + if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) } + p = i + if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) { + // yep, we actually did hit the limit + this._checkingBytes = false + this._keyTrunc = true + } + } else { + if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) } + p = len + } + } else { + idxamp = undefined + for (i = p; i < len; ++i) { + if (!this._checkingBytes) { ++p } + if (data[i] === 0x26/* & */) { + idxamp = i + break + } + if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) { + this._hitLimit = true + break + } else if (this._checkingBytes) { ++this._bytesVal } + } + + if (idxamp !== undefined) { + ++this._fields + if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) } + this.boy.emit('field', decodeText(this._key, 'binary', this.charset), + decodeText(this._val, 'binary', this.charset), + this._keyTrunc, + this._valTrunc) + this._state = 'key' + + this._hitLimit = false + this._checkingBytes = true + this._key = '' + this._bytesKey = 0 + this._keyTrunc = false + this.decoder.reset() + + p = idxamp + 1 + if (this._fields === this.fieldsLimit) { return cb() } + } else if (this._hitLimit) { + // we may not have hit the actual limit if there are encoded bytes... + if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) } + p = i + if ((this._val === '' && this.fieldSizeLimit === 0) || + (this._bytesVal = this._val.length) === this.fieldSizeLimit) { + // yep, we actually did hit the limit + this._checkingBytes = false + this._valTrunc = true + } + } else { + if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) } + p = len + } + } + } + cb() +} - function getSocketInfo(socket) { - return { - localAddress: socket.localAddress, - localPort: socket.localPort, - remoteAddress: socket.remoteAddress, - remotePort: socket.remotePort, - remoteFamily: socket.remoteFamily, - timeout: socket.timeout, - bytesWritten: socket.bytesWritten, - bytesRead: socket.bytesRead - } - } +UrlEncoded.prototype.end = function () { + if (this.boy._done) { return } + + if (this._state === 'key' && this._key.length > 0) { + this.boy.emit('field', decodeText(this._key, 'binary', this.charset), + '', + this._keyTrunc, + false) + } else if (this._state === 'val') { + this.boy.emit('field', decodeText(this._key, 'binary', this.charset), + decodeText(this._val, 'binary', this.charset), + this._keyTrunc, + this._valTrunc) + } + this.boy._done = true + this.boy.emit('finish') +} - async function* convertIterableToBuffer(iterable) { - for await (const chunk of iterable) { - yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk) - } - } +module.exports = UrlEncoded - let ReadableStream - function ReadableStreamFrom(iterable) { - if (!ReadableStream) { - ReadableStream = (__nccwpck_require__(5356).ReadableStream) - } - if (ReadableStream.from) { - return ReadableStream.from(convertIterableToBuffer(iterable)) - } +/***/ }), - let iterator - return new ReadableStream( - { - async start() { - iterator = iterable[Symbol.asyncIterator]() - }, - async pull(controller) { - const { done, value } = await iterator.next() - if (done) { - queueMicrotask(() => { - controller.close() - }) - } else { - const buf = Buffer.isBuffer(value) ? value : Buffer.from(value) - controller.enqueue(new Uint8Array(buf)) - } - return controller.desiredSize > 0 - }, - async cancel(reason) { - await iterator.return() - } - }, - 0 - ) - } +/***/ 7100: +/***/ ((module) => { - // The chunk should be a FormData instance and contains - // all the required methods. - function isFormDataLike(object) { - return ( - object && - typeof object === 'object' && - typeof object.append === 'function' && - typeof object.delete === 'function' && - typeof object.get === 'function' && - typeof object.getAll === 'function' && - typeof object.has === 'function' && - typeof object.set === 'function' && - object[Symbol.toStringTag] === 'FormData' - ) - } +"use strict"; - function throwIfAborted(signal) { - if (!signal) { return } - if (typeof signal.throwIfAborted === 'function') { - signal.throwIfAborted() - } else { - if (signal.aborted) { - // DOMException not available < v17.0.0 - const err = new Error('The operation was aborted') - err.name = 'AbortError' - throw err - } - } - } - function addAbortListener(signal, listener) { - if ('addEventListener' in signal) { - signal.addEventListener('abort', listener, { once: true }) - return () => signal.removeEventListener('abort', listener) - } - signal.addListener('abort', listener) - return () => signal.removeListener('abort', listener) - } +const RE_PLUS = /\+/g - const hasToWellFormed = !!String.prototype.toWellFormed +const HEX = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +] - /** - * @param {string} val - */ - function toUSVString(val) { - if (hasToWellFormed) { - return `${val}`.toWellFormed() - } else if (nodeUtil.toUSVString) { - return nodeUtil.toUSVString(val) - } +function Decoder () { + this.buffer = undefined +} +Decoder.prototype.write = function (str) { + // Replace '+' with ' ' before decoding + str = str.replace(RE_PLUS, ' ') + let res = '' + let i = 0; let p = 0; const len = str.length + for (; i < len; ++i) { + if (this.buffer !== undefined) { + if (!HEX[str.charCodeAt(i)]) { + res += '%' + this.buffer + this.buffer = undefined + --i // retry character + } else { + this.buffer += str[i] + ++p + if (this.buffer.length === 2) { + res += String.fromCharCode(parseInt(this.buffer, 16)) + this.buffer = undefined + } + } + } else if (str[i] === '%') { + if (i > p) { + res += str.substring(p, i) + p = i + } + this.buffer = '' + ++p + } + } + if (p < len && this.buffer === undefined) { res += str.substring(p) } + return res +} +Decoder.prototype.reset = function () { + this.buffer = undefined +} - return `${val}` - } +module.exports = Decoder - // Parsed accordingly to RFC 9110 - // https://www.rfc-editor.org/rfc/rfc9110#field.content-range - function parseRangeHeader(range) { - if (range == null || range === '') return { start: 0, end: null, size: null } - - const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null - return m - ? { - start: parseInt(m[1]), - end: m[2] ? parseInt(m[2]) : null, - size: m[3] ? parseInt(m[3]) : null - } - : null - } - const kEnumerableProperty = Object.create(null) - kEnumerableProperty.enumerable = true - - module.exports = { - kEnumerableProperty, - nop, - isDisturbed, - isErrored, - isReadable, - toUSVString, - isReadableAborted, - isBlobLike, - parseOrigin, - parseURL, - getServerName, - isStream, - isIterable, - isAsyncIterable, - isDestroyed, - headerNameToString, - parseRawHeaders, - parseHeaders, - parseKeepAliveTimeout, - destroy, - bodyLength, - deepClone, - ReadableStreamFrom, - isBuffer, - validateHandler, - getSocketInfo, - isFormDataLike, - buildURL, - throwIfAborted, - addAbortListener, - parseRangeHeader, - nodeMajor, - nodeMinor, - nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13), - safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'] - } +/***/ }), +/***/ 8647: +/***/ ((module) => { - /***/ -}), +"use strict"; -/***/ 4839: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - "use strict"; +module.exports = function basename (path) { + if (typeof path !== 'string') { return '' } + for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var + switch (path.charCodeAt(i)) { + case 0x2F: // '/' + case 0x5C: // '\' + path = path.slice(i + 1) + return (path === '..' || path === '.' ? '' : path) + } + } + return (path === '..' || path === '.' ? '' : path) +} - const Dispatcher = __nccwpck_require__(412) - const { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError - } = __nccwpck_require__(8045) - const { kDestroy, kClose, kDispatch, kInterceptors } = __nccwpck_require__(2785) +/***/ }), - const kDestroyed = Symbol('destroyed') - const kClosed = Symbol('closed') - const kOnDestroyed = Symbol('onDestroyed') - const kOnClosed = Symbol('onClosed') - const kInterceptedDispatch = Symbol('Intercepted Dispatch') +/***/ 4619: +/***/ (function(module) { + +"use strict"; + + +// Node has always utf-8 +const utf8Decoder = new TextDecoder('utf-8') +const textDecoders = new Map([ + ['utf-8', utf8Decoder], + ['utf8', utf8Decoder] +]) + +function getDecoder (charset) { + let lc + while (true) { + switch (charset) { + case 'utf-8': + case 'utf8': + return decoders.utf8 + case 'latin1': + case 'ascii': // TODO: Make these a separate, strict decoder? + case 'us-ascii': + case 'iso-8859-1': + case 'iso8859-1': + case 'iso88591': + case 'iso_8859-1': + case 'windows-1252': + case 'iso_8859-1:1987': + case 'cp1252': + case 'x-cp1252': + return decoders.latin1 + case 'utf16le': + case 'utf-16le': + case 'ucs2': + case 'ucs-2': + return decoders.utf16le + case 'base64': + return decoders.base64 + default: + if (lc === undefined) { + lc = true + charset = charset.toLowerCase() + continue + } + return decoders.other.bind(charset) + } + } +} - class DispatcherBase extends Dispatcher { - constructor() { - super() +const decoders = { + utf8: (data, sourceEncoding) => { + if (data.length === 0) { + return '' + } + if (typeof data === 'string') { + data = Buffer.from(data, sourceEncoding) + } + return data.utf8Slice(0, data.length) + }, + + latin1: (data, sourceEncoding) => { + if (data.length === 0) { + return '' + } + if (typeof data === 'string') { + return data + } + return data.latin1Slice(0, data.length) + }, + + utf16le: (data, sourceEncoding) => { + if (data.length === 0) { + return '' + } + if (typeof data === 'string') { + data = Buffer.from(data, sourceEncoding) + } + return data.ucs2Slice(0, data.length) + }, + + base64: (data, sourceEncoding) => { + if (data.length === 0) { + return '' + } + if (typeof data === 'string') { + data = Buffer.from(data, sourceEncoding) + } + return data.base64Slice(0, data.length) + }, + + other: (data, sourceEncoding) => { + if (data.length === 0) { + return '' + } + if (typeof data === 'string') { + data = Buffer.from(data, sourceEncoding) + } + + if (textDecoders.has(this.toString())) { + try { + return textDecoders.get(this).decode(data) + } catch {} + } + return typeof data === 'string' + ? data + : data.toString() + } +} - this[kDestroyed] = false - this[kOnDestroyed] = null - this[kClosed] = false - this[kOnClosed] = [] - } +function decodeText (text, sourceEncoding, destEncoding) { + if (text) { + return getDecoder(destEncoding)(text, sourceEncoding) + } + return text +} - get destroyed() { - return this[kDestroyed] - } +module.exports = decodeText - get closed() { - return this[kClosed] - } - get interceptors() { - return this[kInterceptors] - } +/***/ }), - set interceptors(newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1; i >= 0; i--) { - const interceptor = this[kInterceptors][i] - if (typeof interceptor !== 'function') { - throw new InvalidArgumentError('interceptor must be an function') - } - } - } +/***/ 1467: +/***/ ((module) => { - this[kInterceptors] = newInterceptors - } +"use strict"; - close(callback) { - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data) - }) - }) - } - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } +module.exports = function getLimit (limits, name, defaultLimit) { + if ( + !limits || + limits[name] === undefined || + limits[name] === null + ) { return defaultLimit } - if (this[kDestroyed]) { - queueMicrotask(() => callback(new ClientDestroyedError(), null)) - return - } + if ( + typeof limits[name] !== 'number' || + isNaN(limits[name]) + ) { throw new TypeError('Limit ' + name + ' is not a valid number') } - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback) - } else { - queueMicrotask(() => callback(null, null)) - } - return - } + return limits[name] +} - this[kClosed] = true - this[kOnClosed].push(callback) - const onClosed = () => { - const callbacks = this[kOnClosed] - this[kOnClosed] = null - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null) - } - } +/***/ }), - // Should not error. - this[kClose]() - .then(() => this.destroy()) - .then(() => { - queueMicrotask(onClosed) - }) - } +/***/ 1854: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - destroy(err, callback) { - if (typeof err === 'function') { - callback = err - err = null - } +"use strict"; +/* eslint-disable object-property-newline */ + + +const decodeText = __nccwpck_require__(4619) + +const RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g + +const EncodedLookup = { + '%00': '\x00', '%01': '\x01', '%02': '\x02', '%03': '\x03', '%04': '\x04', + '%05': '\x05', '%06': '\x06', '%07': '\x07', '%08': '\x08', '%09': '\x09', + '%0a': '\x0a', '%0A': '\x0a', '%0b': '\x0b', '%0B': '\x0b', '%0c': '\x0c', + '%0C': '\x0c', '%0d': '\x0d', '%0D': '\x0d', '%0e': '\x0e', '%0E': '\x0e', + '%0f': '\x0f', '%0F': '\x0f', '%10': '\x10', '%11': '\x11', '%12': '\x12', + '%13': '\x13', '%14': '\x14', '%15': '\x15', '%16': '\x16', '%17': '\x17', + '%18': '\x18', '%19': '\x19', '%1a': '\x1a', '%1A': '\x1a', '%1b': '\x1b', + '%1B': '\x1b', '%1c': '\x1c', '%1C': '\x1c', '%1d': '\x1d', '%1D': '\x1d', + '%1e': '\x1e', '%1E': '\x1e', '%1f': '\x1f', '%1F': '\x1f', '%20': '\x20', + '%21': '\x21', '%22': '\x22', '%23': '\x23', '%24': '\x24', '%25': '\x25', + '%26': '\x26', '%27': '\x27', '%28': '\x28', '%29': '\x29', '%2a': '\x2a', + '%2A': '\x2a', '%2b': '\x2b', '%2B': '\x2b', '%2c': '\x2c', '%2C': '\x2c', + '%2d': '\x2d', '%2D': '\x2d', '%2e': '\x2e', '%2E': '\x2e', '%2f': '\x2f', + '%2F': '\x2f', '%30': '\x30', '%31': '\x31', '%32': '\x32', '%33': '\x33', + '%34': '\x34', '%35': '\x35', '%36': '\x36', '%37': '\x37', '%38': '\x38', + '%39': '\x39', '%3a': '\x3a', '%3A': '\x3a', '%3b': '\x3b', '%3B': '\x3b', + '%3c': '\x3c', '%3C': '\x3c', '%3d': '\x3d', '%3D': '\x3d', '%3e': '\x3e', + '%3E': '\x3e', '%3f': '\x3f', '%3F': '\x3f', '%40': '\x40', '%41': '\x41', + '%42': '\x42', '%43': '\x43', '%44': '\x44', '%45': '\x45', '%46': '\x46', + '%47': '\x47', '%48': '\x48', '%49': '\x49', '%4a': '\x4a', '%4A': '\x4a', + '%4b': '\x4b', '%4B': '\x4b', '%4c': '\x4c', '%4C': '\x4c', '%4d': '\x4d', + '%4D': '\x4d', '%4e': '\x4e', '%4E': '\x4e', '%4f': '\x4f', '%4F': '\x4f', + '%50': '\x50', '%51': '\x51', '%52': '\x52', '%53': '\x53', '%54': '\x54', + '%55': '\x55', '%56': '\x56', '%57': '\x57', '%58': '\x58', '%59': '\x59', + '%5a': '\x5a', '%5A': '\x5a', '%5b': '\x5b', '%5B': '\x5b', '%5c': '\x5c', + '%5C': '\x5c', '%5d': '\x5d', '%5D': '\x5d', '%5e': '\x5e', '%5E': '\x5e', + '%5f': '\x5f', '%5F': '\x5f', '%60': '\x60', '%61': '\x61', '%62': '\x62', + '%63': '\x63', '%64': '\x64', '%65': '\x65', '%66': '\x66', '%67': '\x67', + '%68': '\x68', '%69': '\x69', '%6a': '\x6a', '%6A': '\x6a', '%6b': '\x6b', + '%6B': '\x6b', '%6c': '\x6c', '%6C': '\x6c', '%6d': '\x6d', '%6D': '\x6d', + '%6e': '\x6e', '%6E': '\x6e', '%6f': '\x6f', '%6F': '\x6f', '%70': '\x70', + '%71': '\x71', '%72': '\x72', '%73': '\x73', '%74': '\x74', '%75': '\x75', + '%76': '\x76', '%77': '\x77', '%78': '\x78', '%79': '\x79', '%7a': '\x7a', + '%7A': '\x7a', '%7b': '\x7b', '%7B': '\x7b', '%7c': '\x7c', '%7C': '\x7c', + '%7d': '\x7d', '%7D': '\x7d', '%7e': '\x7e', '%7E': '\x7e', '%7f': '\x7f', + '%7F': '\x7f', '%80': '\x80', '%81': '\x81', '%82': '\x82', '%83': '\x83', + '%84': '\x84', '%85': '\x85', '%86': '\x86', '%87': '\x87', '%88': '\x88', + '%89': '\x89', '%8a': '\x8a', '%8A': '\x8a', '%8b': '\x8b', '%8B': '\x8b', + '%8c': '\x8c', '%8C': '\x8c', '%8d': '\x8d', '%8D': '\x8d', '%8e': '\x8e', + '%8E': '\x8e', '%8f': '\x8f', '%8F': '\x8f', '%90': '\x90', '%91': '\x91', + '%92': '\x92', '%93': '\x93', '%94': '\x94', '%95': '\x95', '%96': '\x96', + '%97': '\x97', '%98': '\x98', '%99': '\x99', '%9a': '\x9a', '%9A': '\x9a', + '%9b': '\x9b', '%9B': '\x9b', '%9c': '\x9c', '%9C': '\x9c', '%9d': '\x9d', + '%9D': '\x9d', '%9e': '\x9e', '%9E': '\x9e', '%9f': '\x9f', '%9F': '\x9f', + '%a0': '\xa0', '%A0': '\xa0', '%a1': '\xa1', '%A1': '\xa1', '%a2': '\xa2', + '%A2': '\xa2', '%a3': '\xa3', '%A3': '\xa3', '%a4': '\xa4', '%A4': '\xa4', + '%a5': '\xa5', '%A5': '\xa5', '%a6': '\xa6', '%A6': '\xa6', '%a7': '\xa7', + '%A7': '\xa7', '%a8': '\xa8', '%A8': '\xa8', '%a9': '\xa9', '%A9': '\xa9', + '%aa': '\xaa', '%Aa': '\xaa', '%aA': '\xaa', '%AA': '\xaa', '%ab': '\xab', + '%Ab': '\xab', '%aB': '\xab', '%AB': '\xab', '%ac': '\xac', '%Ac': '\xac', + '%aC': '\xac', '%AC': '\xac', '%ad': '\xad', '%Ad': '\xad', '%aD': '\xad', + '%AD': '\xad', '%ae': '\xae', '%Ae': '\xae', '%aE': '\xae', '%AE': '\xae', + '%af': '\xaf', '%Af': '\xaf', '%aF': '\xaf', '%AF': '\xaf', '%b0': '\xb0', + '%B0': '\xb0', '%b1': '\xb1', '%B1': '\xb1', '%b2': '\xb2', '%B2': '\xb2', + '%b3': '\xb3', '%B3': '\xb3', '%b4': '\xb4', '%B4': '\xb4', '%b5': '\xb5', + '%B5': '\xb5', '%b6': '\xb6', '%B6': '\xb6', '%b7': '\xb7', '%B7': '\xb7', + '%b8': '\xb8', '%B8': '\xb8', '%b9': '\xb9', '%B9': '\xb9', '%ba': '\xba', + '%Ba': '\xba', '%bA': '\xba', '%BA': '\xba', '%bb': '\xbb', '%Bb': '\xbb', + '%bB': '\xbb', '%BB': '\xbb', '%bc': '\xbc', '%Bc': '\xbc', '%bC': '\xbc', + '%BC': '\xbc', '%bd': '\xbd', '%Bd': '\xbd', '%bD': '\xbd', '%BD': '\xbd', + '%be': '\xbe', '%Be': '\xbe', '%bE': '\xbe', '%BE': '\xbe', '%bf': '\xbf', + '%Bf': '\xbf', '%bF': '\xbf', '%BF': '\xbf', '%c0': '\xc0', '%C0': '\xc0', + '%c1': '\xc1', '%C1': '\xc1', '%c2': '\xc2', '%C2': '\xc2', '%c3': '\xc3', + '%C3': '\xc3', '%c4': '\xc4', '%C4': '\xc4', '%c5': '\xc5', '%C5': '\xc5', + '%c6': '\xc6', '%C6': '\xc6', '%c7': '\xc7', '%C7': '\xc7', '%c8': '\xc8', + '%C8': '\xc8', '%c9': '\xc9', '%C9': '\xc9', '%ca': '\xca', '%Ca': '\xca', + '%cA': '\xca', '%CA': '\xca', '%cb': '\xcb', '%Cb': '\xcb', '%cB': '\xcb', + '%CB': '\xcb', '%cc': '\xcc', '%Cc': '\xcc', '%cC': '\xcc', '%CC': '\xcc', + '%cd': '\xcd', '%Cd': '\xcd', '%cD': '\xcd', '%CD': '\xcd', '%ce': '\xce', + '%Ce': '\xce', '%cE': '\xce', '%CE': '\xce', '%cf': '\xcf', '%Cf': '\xcf', + '%cF': '\xcf', '%CF': '\xcf', '%d0': '\xd0', '%D0': '\xd0', '%d1': '\xd1', + '%D1': '\xd1', '%d2': '\xd2', '%D2': '\xd2', '%d3': '\xd3', '%D3': '\xd3', + '%d4': '\xd4', '%D4': '\xd4', '%d5': '\xd5', '%D5': '\xd5', '%d6': '\xd6', + '%D6': '\xd6', '%d7': '\xd7', '%D7': '\xd7', '%d8': '\xd8', '%D8': '\xd8', + '%d9': '\xd9', '%D9': '\xd9', '%da': '\xda', '%Da': '\xda', '%dA': '\xda', + '%DA': '\xda', '%db': '\xdb', '%Db': '\xdb', '%dB': '\xdb', '%DB': '\xdb', + '%dc': '\xdc', '%Dc': '\xdc', '%dC': '\xdc', '%DC': '\xdc', '%dd': '\xdd', + '%Dd': '\xdd', '%dD': '\xdd', '%DD': '\xdd', '%de': '\xde', '%De': '\xde', + '%dE': '\xde', '%DE': '\xde', '%df': '\xdf', '%Df': '\xdf', '%dF': '\xdf', + '%DF': '\xdf', '%e0': '\xe0', '%E0': '\xe0', '%e1': '\xe1', '%E1': '\xe1', + '%e2': '\xe2', '%E2': '\xe2', '%e3': '\xe3', '%E3': '\xe3', '%e4': '\xe4', + '%E4': '\xe4', '%e5': '\xe5', '%E5': '\xe5', '%e6': '\xe6', '%E6': '\xe6', + '%e7': '\xe7', '%E7': '\xe7', '%e8': '\xe8', '%E8': '\xe8', '%e9': '\xe9', + '%E9': '\xe9', '%ea': '\xea', '%Ea': '\xea', '%eA': '\xea', '%EA': '\xea', + '%eb': '\xeb', '%Eb': '\xeb', '%eB': '\xeb', '%EB': '\xeb', '%ec': '\xec', + '%Ec': '\xec', '%eC': '\xec', '%EC': '\xec', '%ed': '\xed', '%Ed': '\xed', + '%eD': '\xed', '%ED': '\xed', '%ee': '\xee', '%Ee': '\xee', '%eE': '\xee', + '%EE': '\xee', '%ef': '\xef', '%Ef': '\xef', '%eF': '\xef', '%EF': '\xef', + '%f0': '\xf0', '%F0': '\xf0', '%f1': '\xf1', '%F1': '\xf1', '%f2': '\xf2', + '%F2': '\xf2', '%f3': '\xf3', '%F3': '\xf3', '%f4': '\xf4', '%F4': '\xf4', + '%f5': '\xf5', '%F5': '\xf5', '%f6': '\xf6', '%F6': '\xf6', '%f7': '\xf7', + '%F7': '\xf7', '%f8': '\xf8', '%F8': '\xf8', '%f9': '\xf9', '%F9': '\xf9', + '%fa': '\xfa', '%Fa': '\xfa', '%fA': '\xfa', '%FA': '\xfa', '%fb': '\xfb', + '%Fb': '\xfb', '%fB': '\xfb', '%FB': '\xfb', '%fc': '\xfc', '%Fc': '\xfc', + '%fC': '\xfc', '%FC': '\xfc', '%fd': '\xfd', '%Fd': '\xfd', '%fD': '\xfd', + '%FD': '\xfd', '%fe': '\xfe', '%Fe': '\xfe', '%fE': '\xfe', '%FE': '\xfe', + '%ff': '\xff', '%Ff': '\xff', '%fF': '\xff', '%FF': '\xff' +} - if (callback === undefined) { - return new Promise((resolve, reject) => { - this.destroy(err, (err, data) => { - return err ? /* istanbul ignore next: should never error */ reject(err) : resolve(data) - }) - }) - } - - if (typeof callback !== 'function') { - throw new InvalidArgumentError('invalid callback') - } - - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback) - } else { - queueMicrotask(() => callback(null, null)) - } - return - } - - if (!err) { - err = new ClientDestroyedError() - } - - this[kDestroyed] = true - this[kOnDestroyed] = this[kOnDestroyed] || [] - this[kOnDestroyed].push(callback) - - const onDestroyed = () => { - const callbacks = this[kOnDestroyed] - this[kOnDestroyed] = null - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null) - } - } - - // Should not error. - this[kDestroy](err).then(() => { - queueMicrotask(onDestroyed) - }) - } - - [kInterceptedDispatch](opts, handler) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch] - return this[kDispatch](opts, handler) - } - - let dispatch = this[kDispatch].bind(this) - for (let i = this[kInterceptors].length - 1; i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch) - } - this[kInterceptedDispatch] = dispatch - return dispatch(opts, handler) - } +function encodedReplacer (match) { + return EncodedLookup[match] +} - dispatch(opts, handler) { - if (!handler || typeof handler !== 'object') { - throw new InvalidArgumentError('handler must be an object') - } +const STATE_KEY = 0 +const STATE_VALUE = 1 +const STATE_CHARSET = 2 +const STATE_LANG = 3 + +function parseParams (str) { + const res = [] + let state = STATE_KEY + let charset = '' + let inquote = false + let escaping = false + let p = 0 + let tmp = '' + const len = str.length + + for (var i = 0; i < len; ++i) { // eslint-disable-line no-var + const char = str[i] + if (char === '\\' && inquote) { + if (escaping) { escaping = false } else { + escaping = true + continue + } + } else if (char === '"') { + if (!escaping) { + if (inquote) { + inquote = false + state = STATE_KEY + } else { inquote = true } + continue + } else { escaping = false } + } else { + if (escaping && inquote) { tmp += '\\' } + escaping = false + if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") { + if (state === STATE_CHARSET) { + state = STATE_LANG + charset = tmp.substring(1) + } else { state = STATE_VALUE } + tmp = '' + continue + } else if (state === STATE_KEY && + (char === '*' || char === '=') && + res.length) { + state = char === '*' + ? STATE_CHARSET + : STATE_VALUE + res[p] = [tmp, undefined] + tmp = '' + continue + } else if (!inquote && char === ';') { + state = STATE_KEY + if (charset) { + if (tmp.length) { + tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), + 'binary', + charset) + } + charset = '' + } else if (tmp.length) { + tmp = decodeText(tmp, 'binary', 'utf8') + } + if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp } + tmp = '' + ++p + continue + } else if (!inquote && (char === ' ' || char === '\t')) { continue } + } + tmp += char + } + if (charset && tmp.length) { + tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer), + 'binary', + charset) + } else if (tmp) { + tmp = decodeText(tmp, 'binary', 'utf8') + } + + if (res[p] === undefined) { + if (tmp) { res[p] = tmp } + } else { res[p][1] = tmp } + + return res +} - try { - if (!opts || typeof opts !== 'object') { - throw new InvalidArgumentError('opts must be an object.') - } +module.exports = parseParams - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError() - } - if (this[kClosed]) { - throw new ClientClosedError() - } +/***/ }), - return this[kInterceptedDispatch](opts, handler) - } catch (err) { - if (typeof handler.onError !== 'function') { - throw new InvalidArgumentError('invalid onError method') - } +/***/ 675: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - handler.onError(err) +"use strict"; - return false - } - } +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.WriteStreamSync = exports.WriteStream = exports.ReadStreamSync = exports.ReadStream = void 0; +const events_1 = __importDefault(__nccwpck_require__(2361)); +const fs_1 = __importDefault(__nccwpck_require__(7147)); +const minipass_1 = __nccwpck_require__(1062); +const writev = fs_1.default.writev; +const _autoClose = Symbol('_autoClose'); +const _close = Symbol('_close'); +const _ended = Symbol('_ended'); +const _fd = Symbol('_fd'); +const _finished = Symbol('_finished'); +const _flags = Symbol('_flags'); +const _flush = Symbol('_flush'); +const _handleChunk = Symbol('_handleChunk'); +const _makeBuf = Symbol('_makeBuf'); +const _mode = Symbol('_mode'); +const _needDrain = Symbol('_needDrain'); +const _onerror = Symbol('_onerror'); +const _onopen = Symbol('_onopen'); +const _onread = Symbol('_onread'); +const _onwrite = Symbol('_onwrite'); +const _open = Symbol('_open'); +const _path = Symbol('_path'); +const _pos = Symbol('_pos'); +const _queue = Symbol('_queue'); +const _read = Symbol('_read'); +const _readSize = Symbol('_readSize'); +const _reading = Symbol('_reading'); +const _remain = Symbol('_remain'); +const _size = Symbol('_size'); +const _write = Symbol('_write'); +const _writing = Symbol('_writing'); +const _defaultFlag = Symbol('_defaultFlag'); +const _errored = Symbol('_errored'); +class ReadStream extends minipass_1.Minipass { + [_errored] = false; + [_fd]; + [_path]; + [_readSize]; + [_reading] = false; + [_size]; + [_remain]; + [_autoClose]; + constructor(path, opt) { + opt = opt || {}; + super(opt); + this.readable = true; + this.writable = false; + if (typeof path !== 'string') { + throw new TypeError('path must be a string'); + } + this[_errored] = false; + this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined; + this[_path] = path; + this[_readSize] = opt.readSize || 16 * 1024 * 1024; + this[_reading] = false; + this[_size] = typeof opt.size === 'number' ? opt.size : Infinity; + this[_remain] = this[_size]; + this[_autoClose] = + typeof opt.autoClose === 'boolean' ? opt.autoClose : true; + if (typeof this[_fd] === 'number') { + this[_read](); + } + else { + this[_open](); + } + } + get fd() { + return this[_fd]; + } + get path() { + return this[_path]; + } + //@ts-ignore + write() { + throw new TypeError('this is a readable stream'); + } + //@ts-ignore + end() { + throw new TypeError('this is a readable stream'); + } + [_open]() { + fs_1.default.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd)); + } + [_onopen](er, fd) { + if (er) { + this[_onerror](er); + } + else { + this[_fd] = fd; + this.emit('open', fd); + this[_read](); + } + } + [_makeBuf]() { + return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain])); + } + [_read]() { + if (!this[_reading]) { + this[_reading] = true; + const buf = this[_makeBuf](); + /* c8 ignore start */ + if (buf.length === 0) { + return process.nextTick(() => this[_onread](null, 0, buf)); + } + /* c8 ignore stop */ + fs_1.default.read(this[_fd], buf, 0, buf.length, null, (er, br, b) => this[_onread](er, br, b)); + } + } + [_onread](er, br, buf) { + this[_reading] = false; + if (er) { + this[_onerror](er); + } + else if (this[_handleChunk](br, buf)) { + this[_read](); + } + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd]; + this[_fd] = undefined; + fs_1.default.close(fd, er => er ? this.emit('error', er) : this.emit('close')); + } + } + [_onerror](er) { + this[_reading] = true; + this[_close](); + this.emit('error', er); + } + [_handleChunk](br, buf) { + let ret = false; + // no effect if infinite + this[_remain] -= br; + if (br > 0) { + ret = super.write(br < buf.length ? buf.subarray(0, br) : buf); + } + if (br === 0 || this[_remain] <= 0) { + ret = false; + this[_close](); + super.end(); + } + return ret; + } + emit(ev, ...args) { + switch (ev) { + case 'prefinish': + case 'finish': + return false; + case 'drain': + if (typeof this[_fd] === 'number') { + this[_read](); + } + return false; + case 'error': + if (this[_errored]) { + return false; } - - module.exports = DispatcherBase - - - /***/ -}), - -/***/ 412: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - - "use strict"; - - - const EventEmitter = __nccwpck_require__(2361) - - class Dispatcher extends EventEmitter { - dispatch() { - throw new Error('not implemented') - } - - close() { - throw new Error('not implemented') - } - - destroy() { - throw new Error('not implemented') - } + this[_errored] = true; + return super.emit(ev, ...args); + default: + return super.emit(ev, ...args); + } + } +} +exports.ReadStream = ReadStream; +class ReadStreamSync extends ReadStream { + [_open]() { + let threw = true; + try { + this[_onopen](null, fs_1.default.openSync(this[_path], 'r')); + threw = false; + } + finally { + if (threw) { + this[_close](); + } + } + } + [_read]() { + let threw = true; + try { + if (!this[_reading]) { + this[_reading] = true; + do { + const buf = this[_makeBuf](); + /* c8 ignore start */ + const br = buf.length === 0 + ? 0 + : fs_1.default.readSync(this[_fd], buf, 0, buf.length, null); + /* c8 ignore stop */ + if (!this[_handleChunk](br, buf)) { + break; + } + } while (true); + this[_reading] = false; + } + threw = false; + } + finally { + if (threw) { + this[_close](); + } + } + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd]; + this[_fd] = undefined; + fs_1.default.closeSync(fd); + this.emit('close'); + } + } +} +exports.ReadStreamSync = ReadStreamSync; +class WriteStream extends events_1.default { + readable = false; + writable = true; + [_errored] = false; + [_writing] = false; + [_ended] = false; + [_queue] = []; + [_needDrain] = false; + [_path]; + [_mode]; + [_autoClose]; + [_fd]; + [_defaultFlag]; + [_flags]; + [_finished] = false; + [_pos]; + constructor(path, opt) { + opt = opt || {}; + super(opt); + this[_path] = path; + this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined; + this[_mode] = opt.mode === undefined ? 0o666 : opt.mode; + this[_pos] = typeof opt.start === 'number' ? opt.start : undefined; + this[_autoClose] = + typeof opt.autoClose === 'boolean' ? opt.autoClose : true; + // truncating makes no sense when writing into the middle + const defaultFlag = this[_pos] !== undefined ? 'r+' : 'w'; + this[_defaultFlag] = opt.flags === undefined; + this[_flags] = opt.flags === undefined ? defaultFlag : opt.flags; + if (this[_fd] === undefined) { + this[_open](); + } + } + emit(ev, ...args) { + if (ev === 'error') { + if (this[_errored]) { + return false; + } + this[_errored] = true; + } + return super.emit(ev, ...args); + } + get fd() { + return this[_fd]; + } + get path() { + return this[_path]; + } + [_onerror](er) { + this[_close](); + this[_writing] = true; + this.emit('error', er); + } + [_open]() { + fs_1.default.open(this[_path], this[_flags], this[_mode], (er, fd) => this[_onopen](er, fd)); + } + [_onopen](er, fd) { + if (this[_defaultFlag] && + this[_flags] === 'r+' && + er && + er.code === 'ENOENT') { + this[_flags] = 'w'; + this[_open](); + } + else if (er) { + this[_onerror](er); + } + else { + this[_fd] = fd; + this.emit('open', fd); + if (!this[_writing]) { + this[_flush](); + } + } + } + end(buf, enc) { + if (buf) { + //@ts-ignore + this.write(buf, enc); + } + this[_ended] = true; + // synthetic after-write logic, where drain/finish live + if (!this[_writing] && + !this[_queue].length && + typeof this[_fd] === 'number') { + this[_onwrite](null, 0); + } + return this; + } + write(buf, enc) { + if (typeof buf === 'string') { + buf = Buffer.from(buf, enc); + } + if (this[_ended]) { + this.emit('error', new Error('write() after end()')); + return false; + } + if (this[_fd] === undefined || this[_writing] || this[_queue].length) { + this[_queue].push(buf); + this[_needDrain] = true; + return false; + } + this[_writing] = true; + this[_write](buf); + return true; + } + [_write](buf) { + fs_1.default.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => this[_onwrite](er, bw)); + } + [_onwrite](er, bw) { + if (er) { + this[_onerror](er); + } + else { + if (this[_pos] !== undefined && typeof bw === 'number') { + this[_pos] += bw; + } + if (this[_queue].length) { + this[_flush](); + } + else { + this[_writing] = false; + if (this[_ended] && !this[_finished]) { + this[_finished] = true; + this[_close](); + this.emit('finish'); + } + else if (this[_needDrain]) { + this[_needDrain] = false; + this.emit('drain'); + } + } + } + } + [_flush]() { + if (this[_queue].length === 0) { + if (this[_ended]) { + this[_onwrite](null, 0); + } + } + else if (this[_queue].length === 1) { + this[_write](this[_queue].pop()); + } + else { + const iovec = this[_queue]; + this[_queue] = []; + writev(this[_fd], iovec, this[_pos], (er, bw) => this[_onwrite](er, bw)); + } + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd]; + this[_fd] = undefined; + fs_1.default.close(fd, er => er ? this.emit('error', er) : this.emit('close')); + } + } +} +exports.WriteStream = WriteStream; +class WriteStreamSync extends WriteStream { + [_open]() { + let fd; + // only wrap in a try{} block if we know we'll retry, to avoid + // the rethrow obscuring the error's source frame in most cases. + if (this[_defaultFlag] && this[_flags] === 'r+') { + try { + fd = fs_1.default.openSync(this[_path], this[_flags], this[_mode]); + } + catch (er) { + if (er?.code === 'ENOENT') { + this[_flags] = 'w'; + return this[_open](); + } + else { + throw er; + } + } + } + else { + fd = fs_1.default.openSync(this[_path], this[_flags], this[_mode]); + } + this[_onopen](null, fd); + } + [_close]() { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd]; + this[_fd] = undefined; + fs_1.default.closeSync(fd); + this.emit('close'); + } + } + [_write](buf) { + // throw the original, but try to close if it fails + let threw = true; + try { + this[_onwrite](null, fs_1.default.writeSync(this[_fd], buf, 0, buf.length, this[_pos])); + threw = false; + } + finally { + if (threw) { + try { + this[_close](); } + catch { + // ok error + } + } + } + } +} +exports.WriteStreamSync = WriteStreamSync; +//# sourceMappingURL=index.js.map - module.exports = Dispatcher - - - /***/ -}), +/***/ }), -/***/ 1472: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { +/***/ 1062: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - "use strict"; - - - const Busboy = __nccwpck_require__(727) - const util = __nccwpck_require__(3983) - const { - ReadableStreamFrom, - isBlobLike, - isReadableStreamLike, - readableStreamClose, - createDeferredPromise, - fullyReadBody - } = __nccwpck_require__(2538) - const { FormData } = __nccwpck_require__(2015) - const { kState } = __nccwpck_require__(5861) - const { webidl } = __nccwpck_require__(1744) - const { DOMException, structuredClone } = __nccwpck_require__(1037) - const { Blob, File: NativeFile } = __nccwpck_require__(4300) - const { kBodyUsed } = __nccwpck_require__(2785) - const assert = __nccwpck_require__(9491) - const { isErrored } = __nccwpck_require__(3983) - const { isUint8Array, isArrayBuffer } = __nccwpck_require__(9830) - const { File: UndiciFile } = __nccwpck_require__(8511) - const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685) - - let ReadableStream = globalThis.ReadableStream - - /** @type {globalThis['File']} */ - const File = NativeFile ?? UndiciFile - const textEncoder = new TextEncoder() - const textDecoder = new TextDecoder() - - // https://fetch.spec.whatwg.org/#concept-bodyinit-extract - function extractBody(object, keepalive = false) { - if (!ReadableStream) { - ReadableStream = (__nccwpck_require__(5356).ReadableStream) - } +"use strict"; - // 1. Let stream be null. - let stream = null +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Minipass = exports.isWritable = exports.isReadable = exports.isStream = void 0; +const proc = typeof process === 'object' && process + ? process + : { + stdout: null, + stderr: null, + }; +const events_1 = __nccwpck_require__(2361); +const stream_1 = __importDefault(__nccwpck_require__(2781)); +const string_decoder_1 = __nccwpck_require__(1576); +/** + * Return true if the argument is a Minipass stream, Node stream, or something + * else that Minipass can interact with. + */ +const isStream = (s) => !!s && + typeof s === 'object' && + (s instanceof Minipass || + s instanceof stream_1.default || + (0, exports.isReadable)(s) || + (0, exports.isWritable)(s)); +exports.isStream = isStream; +/** + * Return true if the argument is a valid {@link Minipass.Readable} + */ +const isReadable = (s) => !!s && + typeof s === 'object' && + s instanceof events_1.EventEmitter && + typeof s.pipe === 'function' && + // node core Writable streams have a pipe() method, but it throws + s.pipe !== stream_1.default.Writable.prototype.pipe; +exports.isReadable = isReadable; +/** + * Return true if the argument is a valid {@link Minipass.Writable} + */ +const isWritable = (s) => !!s && + typeof s === 'object' && + s instanceof events_1.EventEmitter && + typeof s.write === 'function' && + typeof s.end === 'function'; +exports.isWritable = isWritable; +const EOF = Symbol('EOF'); +const MAYBE_EMIT_END = Symbol('maybeEmitEnd'); +const EMITTED_END = Symbol('emittedEnd'); +const EMITTING_END = Symbol('emittingEnd'); +const EMITTED_ERROR = Symbol('emittedError'); +const CLOSED = Symbol('closed'); +const READ = Symbol('read'); +const FLUSH = Symbol('flush'); +const FLUSHCHUNK = Symbol('flushChunk'); +const ENCODING = Symbol('encoding'); +const DECODER = Symbol('decoder'); +const FLOWING = Symbol('flowing'); +const PAUSED = Symbol('paused'); +const RESUME = Symbol('resume'); +const BUFFER = Symbol('buffer'); +const PIPES = Symbol('pipes'); +const BUFFERLENGTH = Symbol('bufferLength'); +const BUFFERPUSH = Symbol('bufferPush'); +const BUFFERSHIFT = Symbol('bufferShift'); +const OBJECTMODE = Symbol('objectMode'); +// internal event when stream is destroyed +const DESTROYED = Symbol('destroyed'); +// internal event when stream has an error +const ERROR = Symbol('error'); +const EMITDATA = Symbol('emitData'); +const EMITEND = Symbol('emitEnd'); +const EMITEND2 = Symbol('emitEnd2'); +const ASYNC = Symbol('async'); +const ABORT = Symbol('abort'); +const ABORTED = Symbol('aborted'); +const SIGNAL = Symbol('signal'); +const DATALISTENERS = Symbol('dataListeners'); +const DISCARDED = Symbol('discarded'); +const defer = (fn) => Promise.resolve().then(fn); +const nodefer = (fn) => fn(); +const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish'; +const isArrayBufferLike = (b) => b instanceof ArrayBuffer || + (!!b && + typeof b === 'object' && + b.constructor && + b.constructor.name === 'ArrayBuffer' && + b.byteLength >= 0); +const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b); +/** + * Internal class representing a pipe to a destination stream. + * + * @internal + */ +class Pipe { + src; + dest; + opts; + ondrain; + constructor(src, dest, opts) { + this.src = src; + this.dest = dest; + this.opts = opts; + this.ondrain = () => src[RESUME](); + this.dest.on('drain', this.ondrain); + } + unpipe() { + this.dest.removeListener('drain', this.ondrain); + } + // only here for the prototype + /* c8 ignore start */ + proxyErrors(_er) { } + /* c8 ignore stop */ + end() { + this.unpipe(); + if (this.opts.end) + this.dest.end(); + } +} +/** + * Internal class representing a pipe to a destination stream where + * errors are proxied. + * + * @internal + */ +class PipeProxyErrors extends Pipe { + unpipe() { + this.src.removeListener('error', this.proxyErrors); + super.unpipe(); + } + constructor(src, dest, opts) { + super(src, dest, opts); + this.proxyErrors = er => dest.emit('error', er); + src.on('error', this.proxyErrors); + } +} +const isObjectModeOptions = (o) => !!o.objectMode; +const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer'; +/** + * Main export, the Minipass class + * + * `RType` is the type of data emitted, defaults to Buffer + * + * `WType` is the type of data to be written, if RType is buffer or string, + * then any {@link Minipass.ContiguousData} is allowed. + * + * `Events` is the set of event handler signatures that this object + * will emit, see {@link Minipass.Events} + */ +class Minipass extends events_1.EventEmitter { + [FLOWING] = false; + [PAUSED] = false; + [PIPES] = []; + [BUFFER] = []; + [OBJECTMODE]; + [ENCODING]; + [ASYNC]; + [DECODER]; + [EOF] = false; + [EMITTED_END] = false; + [EMITTING_END] = false; + [CLOSED] = false; + [EMITTED_ERROR] = null; + [BUFFERLENGTH] = 0; + [DESTROYED] = false; + [SIGNAL]; + [ABORTED] = false; + [DATALISTENERS] = 0; + [DISCARDED] = false; + /** + * true if the stream can be written + */ + writable = true; + /** + * true if the stream can be read + */ + readable = true; + /** + * If `RType` is Buffer, then options do not need to be provided. + * Otherwise, an options object must be provided to specify either + * {@link Minipass.SharedOptions.objectMode} or + * {@link Minipass.SharedOptions.encoding}, as appropriate. + */ + constructor(...args) { + const options = (args[0] || + {}); + super(); + if (options.objectMode && typeof options.encoding === 'string') { + throw new TypeError('Encoding and objectMode may not be used together'); + } + if (isObjectModeOptions(options)) { + this[OBJECTMODE] = true; + this[ENCODING] = null; + } + else if (isEncodingOptions(options)) { + this[ENCODING] = options.encoding; + this[OBJECTMODE] = false; + } + else { + this[OBJECTMODE] = false; + this[ENCODING] = null; + } + this[ASYNC] = !!options.async; + this[DECODER] = this[ENCODING] + ? new string_decoder_1.StringDecoder(this[ENCODING]) + : null; + //@ts-ignore - private option for debugging and testing + if (options && options.debugExposeBuffer === true) { + Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] }); + } + //@ts-ignore - private option for debugging and testing + if (options && options.debugExposePipes === true) { + Object.defineProperty(this, 'pipes', { get: () => this[PIPES] }); + } + const { signal } = options; + if (signal) { + this[SIGNAL] = signal; + if (signal.aborted) { + this[ABORT](); + } + else { + signal.addEventListener('abort', () => this[ABORT]()); + } + } + } + /** + * The amount of data stored in the buffer waiting to be read. + * + * For Buffer strings, this will be the total byte length. + * For string encoding streams, this will be the string character length, + * according to JavaScript's `string.length` logic. + * For objectMode streams, this is a count of the items waiting to be + * emitted. + */ + get bufferLength() { + return this[BUFFERLENGTH]; + } + /** + * The `BufferEncoding` currently in use, or `null` + */ + get encoding() { + return this[ENCODING]; + } + /** + * @deprecated - This is a read only property + */ + set encoding(_enc) { + throw new Error('Encoding must be set at instantiation time'); + } + /** + * @deprecated - Encoding may only be set at instantiation time + */ + setEncoding(_enc) { + throw new Error('Encoding must be set at instantiation time'); + } + /** + * True if this is an objectMode stream + */ + get objectMode() { + return this[OBJECTMODE]; + } + /** + * @deprecated - This is a read-only property + */ + set objectMode(_om) { + throw new Error('objectMode must be set at instantiation time'); + } + /** + * true if this is an async stream + */ + get ['async']() { + return this[ASYNC]; + } + /** + * Set to true to make this stream async. + * + * Once set, it cannot be unset, as this would potentially cause incorrect + * behavior. Ie, a sync stream can be made async, but an async stream + * cannot be safely made sync. + */ + set ['async'](a) { + this[ASYNC] = this[ASYNC] || !!a; + } + // drop everything and get out of the flow completely + [ABORT]() { + this[ABORTED] = true; + this.emit('abort', this[SIGNAL]?.reason); + this.destroy(this[SIGNAL]?.reason); + } + /** + * True if the stream has been aborted. + */ + get aborted() { + return this[ABORTED]; + } + /** + * No-op setter. Stream aborted status is set via the AbortSignal provided + * in the constructor options. + */ + set aborted(_) { } + write(chunk, encoding, cb) { + if (this[ABORTED]) + return false; + if (this[EOF]) + throw new Error('write after end'); + if (this[DESTROYED]) { + this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' })); + return true; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = 'utf8'; + } + if (!encoding) + encoding = 'utf8'; + const fn = this[ASYNC] ? defer : nodefer; + // convert array buffers and typed array views into buffers + // at some point in the future, we may want to do the opposite! + // leave strings and buffers as-is + // anything is only allowed if in object mode, so throw + if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) { + if (isArrayBufferView(chunk)) { + //@ts-ignore - sinful unsafe type changing + chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength); + } + else if (isArrayBufferLike(chunk)) { + //@ts-ignore - sinful unsafe type changing + chunk = Buffer.from(chunk); + } + else if (typeof chunk !== 'string') { + throw new Error('Non-contiguous data written to non-objectMode stream'); + } + } + // handle object mode up front, since it's simpler + // this yields better performance, fewer checks later. + if (this[OBJECTMODE]) { + // maybe impossible? + /* c8 ignore start */ + if (this[FLOWING] && this[BUFFERLENGTH] !== 0) + this[FLUSH](true); + /* c8 ignore stop */ + if (this[FLOWING]) + this.emit('data', chunk); + else + this[BUFFERPUSH](chunk); + if (this[BUFFERLENGTH] !== 0) + this.emit('readable'); + if (cb) + fn(cb); + return this[FLOWING]; + } + // at this point the chunk is a buffer or string + // don't buffer it up or send it to the decoder + if (!chunk.length) { + if (this[BUFFERLENGTH] !== 0) + this.emit('readable'); + if (cb) + fn(cb); + return this[FLOWING]; + } + // fast-path writing strings of same encoding to a stream with + // an empty buffer, skipping the buffer/decoder dance + if (typeof chunk === 'string' && + // unless it is a string already ready for us to use + !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) { + //@ts-ignore - sinful unsafe type change + chunk = Buffer.from(chunk, encoding); + } + if (Buffer.isBuffer(chunk) && this[ENCODING]) { + //@ts-ignore - sinful unsafe type change + chunk = this[DECODER].write(chunk); + } + // Note: flushing CAN potentially switch us into not-flowing mode + if (this[FLOWING] && this[BUFFERLENGTH] !== 0) + this[FLUSH](true); + if (this[FLOWING]) + this.emit('data', chunk); + else + this[BUFFERPUSH](chunk); + if (this[BUFFERLENGTH] !== 0) + this.emit('readable'); + if (cb) + fn(cb); + return this[FLOWING]; + } + /** + * Low-level explicit read method. + * + * In objectMode, the argument is ignored, and one item is returned if + * available. + * + * `n` is the number of bytes (or in the case of encoding streams, + * characters) to consume. If `n` is not provided, then the entire buffer + * is returned, or `null` is returned if no data is available. + * + * If `n` is greater that the amount of data in the internal buffer, + * then `null` is returned. + */ + read(n) { + if (this[DESTROYED]) + return null; + this[DISCARDED] = false; + if (this[BUFFERLENGTH] === 0 || + n === 0 || + (n && n > this[BUFFERLENGTH])) { + this[MAYBE_EMIT_END](); + return null; + } + if (this[OBJECTMODE]) + n = null; + if (this[BUFFER].length > 1 && !this[OBJECTMODE]) { + // not object mode, so if we have an encoding, then RType is string + // otherwise, must be Buffer + this[BUFFER] = [ + (this[ENCODING] + ? this[BUFFER].join('') + : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])), + ]; + } + const ret = this[READ](n || null, this[BUFFER][0]); + this[MAYBE_EMIT_END](); + return ret; + } + [READ](n, chunk) { + if (this[OBJECTMODE]) + this[BUFFERSHIFT](); + else { + const c = chunk; + if (n === c.length || n === null) + this[BUFFERSHIFT](); + else if (typeof c === 'string') { + this[BUFFER][0] = c.slice(n); + chunk = c.slice(0, n); + this[BUFFERLENGTH] -= n; + } + else { + this[BUFFER][0] = c.subarray(n); + chunk = c.subarray(0, n); + this[BUFFERLENGTH] -= n; + } + } + this.emit('data', chunk); + if (!this[BUFFER].length && !this[EOF]) + this.emit('drain'); + return chunk; + } + end(chunk, encoding, cb) { + if (typeof chunk === 'function') { + cb = chunk; + chunk = undefined; + } + if (typeof encoding === 'function') { + cb = encoding; + encoding = 'utf8'; + } + if (chunk !== undefined) + this.write(chunk, encoding); + if (cb) + this.once('end', cb); + this[EOF] = true; + this.writable = false; + // if we haven't written anything, then go ahead and emit, + // even if we're not reading. + // we'll re-emit if a new 'end' listener is added anyway. + // This makes MP more suitable to write-only use cases. + if (this[FLOWING] || !this[PAUSED]) + this[MAYBE_EMIT_END](); + return this; + } + // don't let the internal resume be overwritten + [RESUME]() { + if (this[DESTROYED]) + return; + if (!this[DATALISTENERS] && !this[PIPES].length) { + this[DISCARDED] = true; + } + this[PAUSED] = false; + this[FLOWING] = true; + this.emit('resume'); + if (this[BUFFER].length) + this[FLUSH](); + else if (this[EOF]) + this[MAYBE_EMIT_END](); + else + this.emit('drain'); + } + /** + * Resume the stream if it is currently in a paused state + * + * If called when there are no pipe destinations or `data` event listeners, + * this will place the stream in a "discarded" state, where all data will + * be thrown away. The discarded state is removed if a pipe destination or + * data handler is added, if pause() is called, or if any synchronous or + * asynchronous iteration is started. + */ + resume() { + return this[RESUME](); + } + /** + * Pause the stream + */ + pause() { + this[FLOWING] = false; + this[PAUSED] = true; + this[DISCARDED] = false; + } + /** + * true if the stream has been forcibly destroyed + */ + get destroyed() { + return this[DESTROYED]; + } + /** + * true if the stream is currently in a flowing state, meaning that + * any writes will be immediately emitted. + */ + get flowing() { + return this[FLOWING]; + } + /** + * true if the stream is currently in a paused state + */ + get paused() { + return this[PAUSED]; + } + [BUFFERPUSH](chunk) { + if (this[OBJECTMODE]) + this[BUFFERLENGTH] += 1; + else + this[BUFFERLENGTH] += chunk.length; + this[BUFFER].push(chunk); + } + [BUFFERSHIFT]() { + if (this[OBJECTMODE]) + this[BUFFERLENGTH] -= 1; + else + this[BUFFERLENGTH] -= this[BUFFER][0].length; + return this[BUFFER].shift(); + } + [FLUSH](noDrain = false) { + do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) && + this[BUFFER].length); + if (!noDrain && !this[BUFFER].length && !this[EOF]) + this.emit('drain'); + } + [FLUSHCHUNK](chunk) { + this.emit('data', chunk); + return this[FLOWING]; + } + /** + * Pipe all data emitted by this stream into the destination provided. + * + * Triggers the flow of data. + */ + pipe(dest, opts) { + if (this[DESTROYED]) + return dest; + this[DISCARDED] = false; + const ended = this[EMITTED_END]; + opts = opts || {}; + if (dest === proc.stdout || dest === proc.stderr) + opts.end = false; + else + opts.end = opts.end !== false; + opts.proxyErrors = !!opts.proxyErrors; + // piping an ended stream ends immediately + if (ended) { + if (opts.end) + dest.end(); + } + else { + // "as" here just ignores the WType, which pipes don't care about, + // since they're only consuming from us, and writing to the dest + this[PIPES].push(!opts.proxyErrors + ? new Pipe(this, dest, opts) + : new PipeProxyErrors(this, dest, opts)); + if (this[ASYNC]) + defer(() => this[RESUME]()); + else + this[RESUME](); + } + return dest; + } + /** + * Fully unhook a piped destination stream. + * + * If the destination stream was the only consumer of this stream (ie, + * there are no other piped destinations or `'data'` event listeners) + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + unpipe(dest) { + const p = this[PIPES].find(p => p.dest === dest); + if (p) { + if (this[PIPES].length === 1) { + if (this[FLOWING] && this[DATALISTENERS] === 0) { + this[FLOWING] = false; + } + this[PIPES] = []; + } + else + this[PIPES].splice(this[PIPES].indexOf(p), 1); + p.unpipe(); + } + } + /** + * Alias for {@link Minipass#on} + */ + addListener(ev, handler) { + return this.on(ev, handler); + } + /** + * Mostly identical to `EventEmitter.on`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * - Adding a 'data' event handler will trigger the flow of data + * + * - Adding a 'readable' event handler when there is data waiting to be read + * will cause 'readable' to be emitted immediately. + * + * - Adding an 'endish' event handler ('end', 'finish', etc.) which has + * already passed will cause the event to be emitted immediately and all + * handlers removed. + * + * - Adding an 'error' event handler after an error has been emitted will + * cause the event to be re-emitted immediately with the error previously + * raised. + */ + on(ev, handler) { + const ret = super.on(ev, handler); + if (ev === 'data') { + this[DISCARDED] = false; + this[DATALISTENERS]++; + if (!this[PIPES].length && !this[FLOWING]) { + this[RESUME](); + } + } + else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) { + super.emit('readable'); + } + else if (isEndish(ev) && this[EMITTED_END]) { + super.emit(ev); + this.removeAllListeners(ev); + } + else if (ev === 'error' && this[EMITTED_ERROR]) { + const h = handler; + if (this[ASYNC]) + defer(() => h.call(this, this[EMITTED_ERROR])); + else + h.call(this, this[EMITTED_ERROR]); + } + return ret; + } + /** + * Alias for {@link Minipass#off} + */ + removeListener(ev, handler) { + return this.off(ev, handler); + } + /** + * Mostly identical to `EventEmitter.off` + * + * If a 'data' event handler is removed, and it was the last consumer + * (ie, there are no pipe destinations or other 'data' event listeners), + * then the flow of data will stop until there is another consumer or + * {@link Minipass#resume} is explicitly called. + */ + off(ev, handler) { + const ret = super.off(ev, handler); + // if we previously had listeners, and now we don't, and we don't + // have any pipes, then stop the flow, unless it's been explicitly + // put in a discarded flowing state via stream.resume(). + if (ev === 'data') { + this[DATALISTENERS] = this.listeners('data').length; + if (this[DATALISTENERS] === 0 && + !this[DISCARDED] && + !this[PIPES].length) { + this[FLOWING] = false; + } + } + return ret; + } + /** + * Mostly identical to `EventEmitter.removeAllListeners` + * + * If all 'data' event handlers are removed, and they were the last consumer + * (ie, there are no pipe destinations), then the flow of data will stop + * until there is another consumer or {@link Minipass#resume} is explicitly + * called. + */ + removeAllListeners(ev) { + const ret = super.removeAllListeners(ev); + if (ev === 'data' || ev === undefined) { + this[DATALISTENERS] = 0; + if (!this[DISCARDED] && !this[PIPES].length) { + this[FLOWING] = false; + } + } + return ret; + } + /** + * true if the 'end' event has been emitted + */ + get emittedEnd() { + return this[EMITTED_END]; + } + [MAYBE_EMIT_END]() { + if (!this[EMITTING_END] && + !this[EMITTED_END] && + !this[DESTROYED] && + this[BUFFER].length === 0 && + this[EOF]) { + this[EMITTING_END] = true; + this.emit('end'); + this.emit('prefinish'); + this.emit('finish'); + if (this[CLOSED]) + this.emit('close'); + this[EMITTING_END] = false; + } + } + /** + * Mostly identical to `EventEmitter.emit`, with the following + * behavior differences to prevent data loss and unnecessary hangs: + * + * If the stream has been destroyed, and the event is something other + * than 'close' or 'error', then `false` is returned and no handlers + * are called. + * + * If the event is 'end', and has already been emitted, then the event + * is ignored. If the stream is in a paused or non-flowing state, then + * the event will be deferred until data flow resumes. If the stream is + * async, then handlers will be called on the next tick rather than + * immediately. + * + * If the event is 'close', and 'end' has not yet been emitted, then + * the event will be deferred until after 'end' is emitted. + * + * If the event is 'error', and an AbortSignal was provided for the stream, + * and there are no listeners, then the event is ignored, matching the + * behavior of node core streams in the presense of an AbortSignal. + * + * If the event is 'finish' or 'prefinish', then all listeners will be + * removed after emitting the event, to prevent double-firing. + */ + emit(ev, ...args) { + const data = args[0]; + // error and close are only events allowed after calling destroy() + if (ev !== 'error' && + ev !== 'close' && + ev !== DESTROYED && + this[DESTROYED]) { + return false; + } + else if (ev === 'data') { + return !this[OBJECTMODE] && !data + ? false + : this[ASYNC] + ? (defer(() => this[EMITDATA](data)), true) + : this[EMITDATA](data); + } + else if (ev === 'end') { + return this[EMITEND](); + } + else if (ev === 'close') { + this[CLOSED] = true; + // don't emit close before 'end' and 'finish' + if (!this[EMITTED_END] && !this[DESTROYED]) + return false; + const ret = super.emit('close'); + this.removeAllListeners('close'); + return ret; + } + else if (ev === 'error') { + this[EMITTED_ERROR] = data; + super.emit(ERROR, data); + const ret = !this[SIGNAL] || this.listeners('error').length + ? super.emit('error', data) + : false; + this[MAYBE_EMIT_END](); + return ret; + } + else if (ev === 'resume') { + const ret = super.emit('resume'); + this[MAYBE_EMIT_END](); + return ret; + } + else if (ev === 'finish' || ev === 'prefinish') { + const ret = super.emit(ev); + this.removeAllListeners(ev); + return ret; + } + // Some other unknown event + const ret = super.emit(ev, ...args); + this[MAYBE_EMIT_END](); + return ret; + } + [EMITDATA](data) { + for (const p of this[PIPES]) { + if (p.dest.write(data) === false) + this.pause(); + } + const ret = this[DISCARDED] ? false : super.emit('data', data); + this[MAYBE_EMIT_END](); + return ret; + } + [EMITEND]() { + if (this[EMITTED_END]) + return false; + this[EMITTED_END] = true; + this.readable = false; + return this[ASYNC] + ? (defer(() => this[EMITEND2]()), true) + : this[EMITEND2](); + } + [EMITEND2]() { + if (this[DECODER]) { + const data = this[DECODER].end(); + if (data) { + for (const p of this[PIPES]) { + p.dest.write(data); + } + if (!this[DISCARDED]) + super.emit('data', data); + } + } + for (const p of this[PIPES]) { + p.end(); + } + const ret = super.emit('end'); + this.removeAllListeners('end'); + return ret; + } + /** + * Return a Promise that resolves to an array of all emitted data once + * the stream ends. + */ + async collect() { + const buf = Object.assign([], { + dataLength: 0, + }); + if (!this[OBJECTMODE]) + buf.dataLength = 0; + // set the promise first, in case an error is raised + // by triggering the flow here. + const p = this.promise(); + this.on('data', c => { + buf.push(c); + if (!this[OBJECTMODE]) + buf.dataLength += c.length; + }); + await p; + return buf; + } + /** + * Return a Promise that resolves to the concatenation of all emitted data + * once the stream ends. + * + * Not allowed on objectMode streams. + */ + async concat() { + if (this[OBJECTMODE]) { + throw new Error('cannot concat in objectMode'); + } + const buf = await this.collect(); + return (this[ENCODING] + ? buf.join('') + : Buffer.concat(buf, buf.dataLength)); + } + /** + * Return a void Promise that resolves once the stream ends. + */ + async promise() { + return new Promise((resolve, reject) => { + this.on(DESTROYED, () => reject(new Error('stream destroyed'))); + this.on('error', er => reject(er)); + this.on('end', () => resolve()); + }); + } + /** + * Asynchronous `for await of` iteration. + * + * This will continue emitting all chunks until the stream terminates. + */ + [Symbol.asyncIterator]() { + // set this up front, in case the consumer doesn't call next() + // right away. + this[DISCARDED] = false; + let stopped = false; + const stop = async () => { + this.pause(); + stopped = true; + return { value: undefined, done: true }; + }; + const next = () => { + if (stopped) + return stop(); + const res = this.read(); + if (res !== null) + return Promise.resolve({ done: false, value: res }); + if (this[EOF]) + return stop(); + let resolve; + let reject; + const onerr = (er) => { + this.off('data', ondata); + this.off('end', onend); + this.off(DESTROYED, ondestroy); + stop(); + reject(er); + }; + const ondata = (value) => { + this.off('error', onerr); + this.off('end', onend); + this.off(DESTROYED, ondestroy); + this.pause(); + resolve({ value, done: !!this[EOF] }); + }; + const onend = () => { + this.off('error', onerr); + this.off('data', ondata); + this.off(DESTROYED, ondestroy); + stop(); + resolve({ done: true, value: undefined }); + }; + const ondestroy = () => onerr(new Error('stream destroyed')); + return new Promise((res, rej) => { + reject = rej; + resolve = res; + this.once(DESTROYED, ondestroy); + this.once('error', onerr); + this.once('end', onend); + this.once('data', ondata); + }); + }; + return { + next, + throw: stop, + return: stop, + [Symbol.asyncIterator]() { + return this; + }, + }; + } + /** + * Synchronous `for of` iteration. + * + * The iteration will terminate when the internal buffer runs out, even + * if the stream has not yet terminated. + */ + [Symbol.iterator]() { + // set this up front, in case the consumer doesn't call next() + // right away. + this[DISCARDED] = false; + let stopped = false; + const stop = () => { + this.pause(); + this.off(ERROR, stop); + this.off(DESTROYED, stop); + this.off('end', stop); + stopped = true; + return { done: true, value: undefined }; + }; + const next = () => { + if (stopped) + return stop(); + const value = this.read(); + return value === null ? stop() : { done: false, value }; + }; + this.once('end', stop); + this.once(ERROR, stop); + this.once(DESTROYED, stop); + return { + next, + throw: stop, + return: stop, + [Symbol.iterator]() { + return this; + }, + }; + } + /** + * Destroy a stream, preventing it from being used for any further purpose. + * + * If the stream has a `close()` method, then it will be called on + * destruction. + * + * After destruction, any attempt to write data, read data, or emit most + * events will be ignored. + * + * If an error argument is provided, then it will be emitted in an + * 'error' event. + */ + destroy(er) { + if (this[DESTROYED]) { + if (er) + this.emit('error', er); + else + this.emit(DESTROYED); + return this; + } + this[DESTROYED] = true; + this[DISCARDED] = true; + // throw away all buffered data, it's never coming out + this[BUFFER].length = 0; + this[BUFFERLENGTH] = 0; + const wc = this; + if (typeof wc.close === 'function' && !this[CLOSED]) + wc.close(); + if (er) + this.emit('error', er); + // if no error to emit, still reject pending promises + else + this.emit(DESTROYED); + return this; + } + /** + * Alias for {@link isStream} + * + * Former export location, maintained for backwards compatibility. + * + * @deprecated + */ + static get isStream() { + return exports.isStream; + } +} +exports.Minipass = Minipass; +//# sourceMappingURL=index.js.map - // 2. If object is a ReadableStream object, then set stream to object. - if (object instanceof ReadableStream) { - stream = object - } else if (isBlobLike(object)) { - // 3. Otherwise, if object is a Blob object, set stream to the - // result of running object’s get stream. - stream = object.stream() - } else { - // 4. Otherwise, set stream to a new ReadableStream object, and set - // up stream. - stream = new ReadableStream({ - async pull(controller) { - controller.enqueue( - typeof source === 'string' ? textEncoder.encode(source) : source - ) - queueMicrotask(() => readableStreamClose(controller)) - }, - start() { }, - type: undefined - }) - } +/***/ }), - // 5. Assert: stream is a ReadableStream object. - assert(isReadableStreamLike(stream)) - - // 6. Let action be null. - let action = null - - // 7. Let source be null. - let source = null - - // 8. Let length be null. - let length = null - - // 9. Let type be null. - let type = null - - // 10. Switch on object: - if (typeof object === 'string') { - // Set source to the UTF-8 encoding of object. - // Note: setting source to a Uint8Array here breaks some mocking assumptions. - source = object - - // Set type to `text/plain;charset=UTF-8`. - type = 'text/plain;charset=UTF-8' - } else if (object instanceof URLSearchParams) { - // URLSearchParams - - // spec says to run application/x-www-form-urlencoded on body.list - // this is implemented in Node.js as apart of an URLSearchParams instance toString method - // See: https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L490 - // and https://github.com/nodejs/node/blob/e46c680bf2b211bbd52cf959ca17ee98c7f657f5/lib/internal/url.js#L1100 - - // Set source to the result of running the application/x-www-form-urlencoded serializer with object’s list. - source = object.toString() - - // Set type to `application/x-www-form-urlencoded;charset=UTF-8`. - type = 'application/x-www-form-urlencoded;charset=UTF-8' - } else if (isArrayBuffer(object)) { - // BufferSource/ArrayBuffer - - // Set source to a copy of the bytes held by object. - source = new Uint8Array(object.slice()) - } else if (ArrayBuffer.isView(object)) { - // BufferSource/ArrayBufferView - - // Set source to a copy of the bytes held by object. - source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)) - } else if (util.isFormDataLike(object)) { - const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, '0')}` - const prefix = `--${boundary}\r\nContent-Disposition: form-data` - - /*! formdata-polyfill. MIT License. Jimmy Wärting */ - const escape = (str) => - str.replace(/\n/g, '%0A').replace(/\r/g, '%0D').replace(/"/g, '%22') - const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, '\r\n') - - // Set action to this step: run the multipart/form-data - // encoding algorithm, with object’s entry list and UTF-8. - // - This ensures that the body is immutable and can't be changed afterwords - // - That the content-length is calculated in advance. - // - And that all parts are pre-encoded and ready to be sent. - - const blobParts = [] - const rn = new Uint8Array([13, 10]) // '\r\n' - length = 0 - let hasUnknownSizeValue = false - - for (const [name, value] of object) { - if (typeof value === 'string') { - const chunk = textEncoder.encode(prefix + - `; name="${escape(normalizeLinefeeds(name))}"` + - `\r\n\r\n${normalizeLinefeeds(value)}\r\n`) - blobParts.push(chunk) - length += chunk.byteLength - } else { - const chunk = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + - (value.name ? `; filename="${escape(value.name)}"` : '') + '\r\n' + - `Content-Type: ${value.type || 'application/octet-stream' - }\r\n\r\n`) - blobParts.push(chunk, value, rn) - if (typeof value.size === 'number') { - length += chunk.byteLength + value.size + rn.byteLength - } else { - hasUnknownSizeValue = true - } - } - } +/***/ 235: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - const chunk = textEncoder.encode(`--${boundary}--`) - blobParts.push(chunk) - length += chunk.byteLength - if (hasUnknownSizeValue) { - length = null - } +"use strict"; - // Set source to object. - source = object +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.chownrSync = exports.chownr = void 0; +const node_fs_1 = __importDefault(__nccwpck_require__(7561)); +const node_path_1 = __importDefault(__nccwpck_require__(9411)); +const lchownSync = (path, uid, gid) => { + try { + return node_fs_1.default.lchownSync(path, uid, gid); + } + catch (er) { + if (er?.code !== 'ENOENT') + throw er; + } +}; +const chown = (cpath, uid, gid, cb) => { + node_fs_1.default.lchown(cpath, uid, gid, er => { + // Skip ENOENT error + cb(er && er?.code !== 'ENOENT' ? er : null); + }); +}; +const chownrKid = (p, child, uid, gid, cb) => { + if (child.isDirectory()) { + (0, exports.chownr)(node_path_1.default.resolve(p, child.name), uid, gid, (er) => { + if (er) + return cb(er); + const cpath = node_path_1.default.resolve(p, child.name); + chown(cpath, uid, gid, cb); + }); + } + else { + const cpath = node_path_1.default.resolve(p, child.name); + chown(cpath, uid, gid, cb); + } +}; +const chownr = (p, uid, gid, cb) => { + node_fs_1.default.readdir(p, { withFileTypes: true }, (er, children) => { + // any error other than ENOTDIR or ENOTSUP means it's not readable, + // or doesn't exist. give up. + if (er) { + if (er.code === 'ENOENT') + return cb(); + else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP') + return cb(er); + } + if (er || !children.length) + return chown(p, uid, gid, cb); + let len = children.length; + let errState = null; + const then = (er) => { + /* c8 ignore start */ + if (errState) + return; + /* c8 ignore stop */ + if (er) + return cb((errState = er)); + if (--len === 0) + return chown(p, uid, gid, cb); + }; + for (const child of children) { + chownrKid(p, child, uid, gid, then); + } + }); +}; +exports.chownr = chownr; +const chownrKidSync = (p, child, uid, gid) => { + if (child.isDirectory()) + (0, exports.chownrSync)(node_path_1.default.resolve(p, child.name), uid, gid); + lchownSync(node_path_1.default.resolve(p, child.name), uid, gid); +}; +const chownrSync = (p, uid, gid) => { + let children; + try { + children = node_fs_1.default.readdirSync(p, { withFileTypes: true }); + } + catch (er) { + const e = er; + if (e?.code === 'ENOENT') + return; + else if (e?.code === 'ENOTDIR' || e?.code === 'ENOTSUP') + return lchownSync(p, uid, gid); + else + throw e; + } + for (const child of children) { + chownrKidSync(p, child, uid, gid); + } + return lchownSync(p, uid, gid); +}; +exports.chownrSync = chownrSync; +//# sourceMappingURL=index.js.map - action = async function* () { - for (const part of blobParts) { - if (part.stream) { - yield* part.stream() - } else { - yield part - } - } - } +/***/ }), - // Set type to `multipart/form-data; boundary=`, - // followed by the multipart/form-data boundary string generated - // by the multipart/form-data encoding algorithm. - type = 'multipart/form-data; boundary=' + boundary - } else if (isBlobLike(object)) { - // Blob +/***/ 4149: +/***/ ((__unused_webpack_module, exports) => { - // Set source to object. - source = object +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.assertValidPattern = void 0; +const MAX_PATTERN_LENGTH = 1024 * 64; +const assertValidPattern = (pattern) => { + if (typeof pattern !== 'string') { + throw new TypeError('invalid pattern'); + } + if (pattern.length > MAX_PATTERN_LENGTH) { + throw new TypeError('pattern is too long'); + } +}; +exports.assertValidPattern = assertValidPattern; +//# sourceMappingURL=assert-valid-pattern.js.map - // Set length to object’s size. - length = object.size +/***/ }), - // If object’s type attribute is not the empty byte sequence, set - // type to its value. - if (object.type) { - type = object.type - } - } else if (typeof object[Symbol.asyncIterator] === 'function') { - // If keepalive is true, then throw a TypeError. - if (keepalive) { - throw new TypeError('keepalive') - } +/***/ 5136: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - // If object is disturbed or locked, then throw a TypeError. - if (util.isDisturbed(object) || object.locked) { - throw new TypeError( - 'Response body object should not be disturbed or locked' - ) +"use strict"; + +// parse a single path portion +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AST = void 0; +const brace_expressions_js_1 = __nccwpck_require__(1812); +const unescape_js_1 = __nccwpck_require__(5698); +const types = new Set(['!', '?', '+', '*', '@']); +const isExtglobType = (c) => types.has(c); +// Patterns that get prepended to bind to the start of either the +// entire string, or just a single path portion, to prevent dots +// and/or traversal patterns, when needed. +// Exts don't need the ^ or / bit, because the root binds that already. +const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))'; +const startNoDot = '(?!\\.)'; +// characters that indicate a start of pattern needs the "no dots" bit, +// because a dot *might* be matched. ( is not in the list, because in +// the case of a child extglob, it will handle the prevention itself. +const addPatternStart = new Set(['[', '.']); +// cases where traversal is A-OK, no dot prevention needed +const justDots = new Set(['..', '.']); +const reSpecials = new Set('().*{}+?[]^$\\!'); +const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); +// any single thing other than / +const qmark = '[^/]'; +// * => any number of characters +const star = qmark + '*?'; +// use + when we need to ensure that *something* matches, because the * is +// the only thing in the path portion. +const starNoEmpty = qmark + '+?'; +// remove the \ chars that we added if we end up doing a nonmagic compare +// const deslash = (s: string) => s.replace(/\\(.)/g, '$1') +class AST { + type; + #root; + #hasMagic; + #uflag = false; + #parts = []; + #parent; + #parentIndex; + #negs; + #filledNegs = false; + #options; + #toString; + // set to true if it's an extglob with no children + // (which really means one child of '') + #emptyExt = false; + constructor(type, parent, options = {}) { + this.type = type; + // extglobs are inherently magical + if (type) + this.#hasMagic = true; + this.#parent = parent; + this.#root = this.#parent ? this.#parent.#root : this; + this.#options = this.#root === this ? options : this.#root.#options; + this.#negs = this.#root === this ? [] : this.#root.#negs; + if (type === '!' && !this.#root.#filledNegs) + this.#negs.push(this); + this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0; + } + get hasMagic() { + /* c8 ignore start */ + if (this.#hasMagic !== undefined) + return this.#hasMagic; + /* c8 ignore stop */ + for (const p of this.#parts) { + if (typeof p === 'string') + continue; + if (p.type || p.hasMagic) + return (this.#hasMagic = true); + } + // note: will be undefined until we generate the regexp src and find out + return this.#hasMagic; + } + // reconstructs the pattern + toString() { + if (this.#toString !== undefined) + return this.#toString; + if (!this.type) { + return (this.#toString = this.#parts.map(p => String(p)).join('')); + } + else { + return (this.#toString = + this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')'); + } + } + #fillNegs() { + /* c8 ignore start */ + if (this !== this.#root) + throw new Error('should only call on root'); + if (this.#filledNegs) + return this; + /* c8 ignore stop */ + // call toString() once to fill this out + this.toString(); + this.#filledNegs = true; + let n; + while ((n = this.#negs.pop())) { + if (n.type !== '!') + continue; + // walk up the tree, appending everthing that comes AFTER parentIndex + let p = n; + let pp = p.#parent; + while (pp) { + for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) { + for (const part of n.#parts) { + /* c8 ignore start */ + if (typeof part === 'string') { + throw new Error('string part in extglob AST??'); } + /* c8 ignore stop */ + part.copyIn(pp.#parts[i]); + } + } + p = pp; + pp = p.#parent; + } + } + return this; + } + push(...parts) { + for (const p of parts) { + if (p === '') + continue; + /* c8 ignore start */ + if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) { + throw new Error('invalid part: ' + p); + } + /* c8 ignore stop */ + this.#parts.push(p); + } + } + toJSON() { + const ret = this.type === null + ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON())) + : [this.type, ...this.#parts.map(p => p.toJSON())]; + if (this.isStart() && !this.type) + ret.unshift([]); + if (this.isEnd() && + (this === this.#root || + (this.#root.#filledNegs && this.#parent?.type === '!'))) { + ret.push({}); + } + return ret; + } + isStart() { + if (this.#root === this) + return true; + // if (this.type) return !!this.#parent?.isStart() + if (!this.#parent?.isStart()) + return false; + if (this.#parentIndex === 0) + return true; + // if everything AHEAD of this is a negation, then it's still the "start" + const p = this.#parent; + for (let i = 0; i < this.#parentIndex; i++) { + const pp = p.#parts[i]; + if (!(pp instanceof AST && pp.type === '!')) { + return false; + } + } + return true; + } + isEnd() { + if (this.#root === this) + return true; + if (this.#parent?.type === '!') + return true; + if (!this.#parent?.isEnd()) + return false; + if (!this.type) + return this.#parent?.isEnd(); + // if not root, it'll always have a parent + /* c8 ignore start */ + const pl = this.#parent ? this.#parent.#parts.length : 0; + /* c8 ignore stop */ + return this.#parentIndex === pl - 1; + } + copyIn(part) { + if (typeof part === 'string') + this.push(part); + else + this.push(part.clone(this)); + } + clone(parent) { + const c = new AST(this.type, parent); + for (const p of this.#parts) { + c.copyIn(p); + } + return c; + } + static #parseAST(str, ast, pos, opt) { + let escaping = false; + let inBrace = false; + let braceStart = -1; + let braceNeg = false; + if (ast.type === null) { + // outside of a extglob, append until we find a start + let i = pos; + let acc = ''; + while (i < str.length) { + const c = str.charAt(i++); + // still accumulate escapes at this point, but we do ignore + // starts that are escaped + if (escaping || c === '\\') { + escaping = !escaping; + acc += c; + continue; + } + if (inBrace) { + if (i === braceStart + 1) { + if (c === '^' || c === '!') { + braceNeg = true; + } + } + else if (c === ']' && !(i === braceStart + 2 && braceNeg)) { + inBrace = false; + } + acc += c; + continue; + } + else if (c === '[') { + inBrace = true; + braceStart = i; + braceNeg = false; + acc += c; + continue; + } + if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') { + ast.push(acc); + acc = ''; + const ext = new AST(c, ast); + i = AST.#parseAST(str, ext, i, opt); + ast.push(ext); + continue; + } + acc += c; + } + ast.push(acc); + return i; + } + // some kind of extglob, pos is at the ( + // find the next | or ) + let i = pos + 1; + let part = new AST(null, ast); + const parts = []; + let acc = ''; + while (i < str.length) { + const c = str.charAt(i++); + // still accumulate escapes at this point, but we do ignore + // starts that are escaped + if (escaping || c === '\\') { + escaping = !escaping; + acc += c; + continue; + } + if (inBrace) { + if (i === braceStart + 1) { + if (c === '^' || c === '!') { + braceNeg = true; + } + } + else if (c === ']' && !(i === braceStart + 2 && braceNeg)) { + inBrace = false; + } + acc += c; + continue; + } + else if (c === '[') { + inBrace = true; + braceStart = i; + braceNeg = false; + acc += c; + continue; + } + if (isExtglobType(c) && str.charAt(i) === '(') { + part.push(acc); + acc = ''; + const ext = new AST(c, part); + part.push(ext); + i = AST.#parseAST(str, ext, i, opt); + continue; + } + if (c === '|') { + part.push(acc); + acc = ''; + parts.push(part); + part = new AST(null, ast); + continue; + } + if (c === ')') { + if (acc === '' && ast.#parts.length === 0) { + ast.#emptyExt = true; + } + part.push(acc); + acc = ''; + ast.push(...parts, part); + return i; + } + acc += c; + } + // unfinished extglob + // if we got here, it was a malformed extglob! not an extglob, but + // maybe something else in there. + ast.type = null; + ast.#hasMagic = undefined; + ast.#parts = [str.substring(pos - 1)]; + return i; + } + static fromGlob(pattern, options = {}) { + const ast = new AST(null, undefined, options); + AST.#parseAST(pattern, ast, 0, options); + return ast; + } + // returns the regular expression if there's magic, or the unescaped + // string if not. + toMMPattern() { + // should only be called on root + /* c8 ignore start */ + if (this !== this.#root) + return this.#root.toMMPattern(); + /* c8 ignore stop */ + const glob = this.toString(); + const [re, body, hasMagic, uflag] = this.toRegExpSource(); + // if we're in nocase mode, and not nocaseMagicOnly, then we do + // still need a regular expression if we have to case-insensitively + // match capital/lowercase characters. + const anyMagic = hasMagic || + this.#hasMagic || + (this.#options.nocase && + !this.#options.nocaseMagicOnly && + glob.toUpperCase() !== glob.toLowerCase()); + if (!anyMagic) { + return body; + } + const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : ''); + return Object.assign(new RegExp(`^${re}$`, flags), { + _src: re, + _glob: glob, + }); + } + get options() { + return this.#options; + } + // returns the string match, the regexp source, whether there's magic + // in the regexp (so a regular expression is required) and whether or + // not the uflag is needed for the regular expression (for posix classes) + // TODO: instead of injecting the start/end at this point, just return + // the BODY of the regexp, along with the start/end portions suitable + // for binding the start/end in either a joined full-path makeRe context + // (where we bind to (^|/), or a standalone matchPart context (where + // we bind to ^, and not /). Otherwise slashes get duped! + // + // In part-matching mode, the start is: + // - if not isStart: nothing + // - if traversal possible, but not allowed: ^(?!\.\.?$) + // - if dots allowed or not possible: ^ + // - if dots possible and not allowed: ^(?!\.) + // end is: + // - if not isEnd(): nothing + // - else: $ + // + // In full-path matching mode, we put the slash at the START of the + // pattern, so start is: + // - if first pattern: same as part-matching mode + // - if not isStart(): nothing + // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/)) + // - if dots allowed or not possible: / + // - if dots possible and not allowed: /(?!\.) + // end is: + // - if last pattern, same as part-matching mode + // - else nothing + // + // Always put the (?:$|/) on negated tails, though, because that has to be + // there to bind the end of the negated pattern portion, and it's easier to + // just stick it in now rather than try to inject it later in the middle of + // the pattern. + // + // We can just always return the same end, and leave it up to the caller + // to know whether it's going to be used joined or in parts. + // And, if the start is adjusted slightly, can do the same there: + // - if not isStart: nothing + // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$) + // - if dots allowed or not possible: (?:/|^) + // - if dots possible and not allowed: (?:/|^)(?!\.) + // + // But it's better to have a simpler binding without a conditional, for + // performance, so probably better to return both start options. + // + // Then the caller just ignores the end if it's not the first pattern, + // and the start always gets applied. + // + // But that's always going to be $ if it's the ending pattern, or nothing, + // so the caller can just attach $ at the end of the pattern when building. + // + // So the todo is: + // - better detect what kind of start is needed + // - return both flavors of starting pattern + // - attach $ at the end of the pattern when creating the actual RegExp + // + // Ah, but wait, no, that all only applies to the root when the first pattern + // is not an extglob. If the first pattern IS an extglob, then we need all + // that dot prevention biz to live in the extglob portions, because eg + // +(*|.x*) can match .xy but not .yx. + // + // So, return the two flavors if it's #root and the first child is not an + // AST, otherwise leave it to the child AST to handle it, and there, + // use the (?:^|/) style of start binding. + // + // Even simplified further: + // - Since the start for a join is eg /(?!\.) and the start for a part + // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root + // or start or whatever) and prepend ^ or / at the Regexp construction. + toRegExpSource(allowDot) { + const dot = allowDot ?? !!this.#options.dot; + if (this.#root === this) + this.#fillNegs(); + if (!this.type) { + const noEmpty = this.isStart() && this.isEnd(); + const src = this.#parts + .map(p => { + const [re, _, hasMagic, uflag] = typeof p === 'string' + ? AST.#parseGlob(p, this.#hasMagic, noEmpty) + : p.toRegExpSource(allowDot); + this.#hasMagic = this.#hasMagic || hasMagic; + this.#uflag = this.#uflag || uflag; + return re; + }) + .join(''); + let start = ''; + if (this.isStart()) { + if (typeof this.#parts[0] === 'string') { + // this is the string that will match the start of the pattern, + // so we need to protect against dots and such. + // '.' and '..' cannot match unless the pattern is that exactly, + // even if it starts with . or dot:true is set. + const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]); + if (!dotTravAllowed) { + const aps = addPatternStart; + // check if we have a possibility of matching . or .., + // and prevent that. + const needNoTrav = + // dots are allowed, and the pattern starts with [ or . + (dot && aps.has(src.charAt(0))) || + // the pattern starts with \., and then [ or . + (src.startsWith('\\.') && aps.has(src.charAt(2))) || + // the pattern starts with \.\., and then [ or . + (src.startsWith('\\.\\.') && aps.has(src.charAt(4))); + // no need to prevent dots if it can't match a dot, or if a + // sub-pattern will be preventing it anyway. + const needNoDot = !dot && !allowDot && aps.has(src.charAt(0)); + start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''; + } + } + } + // append the "end of path portion" pattern to negation tails + let end = ''; + if (this.isEnd() && + this.#root.#filledNegs && + this.#parent?.type === '!') { + end = '(?:$|\\/)'; + } + const final = start + src + end; + return [ + final, + (0, unescape_js_1.unescape)(src), + (this.#hasMagic = !!this.#hasMagic), + this.#uflag, + ]; + } + // We need to calculate the body *twice* if it's a repeat pattern + // at the start, once in nodot mode, then again in dot mode, so a + // pattern like *(?) can match 'x.y' + const repeated = this.type === '*' || this.type === '+'; + // some kind of extglob + const start = this.type === '!' ? '(?:(?!(?:' : '(?:'; + let body = this.#partsToRegExp(dot); + if (this.isStart() && this.isEnd() && !body && this.type !== '!') { + // invalid extglob, has to at least be *something* present, if it's + // the entire path portion. + const s = this.toString(); + this.#parts = [s]; + this.type = null; + this.#hasMagic = undefined; + return [s, (0, unescape_js_1.unescape)(this.toString()), false, false]; + } + // XXX abstract out this map method + let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot + ? '' + : this.#partsToRegExp(true); + if (bodyDotAllowed === body) { + bodyDotAllowed = ''; + } + if (bodyDotAllowed) { + body = `(?:${body})(?:${bodyDotAllowed})*?`; + } + // an empty !() is exactly equivalent to a starNoEmpty + let final = ''; + if (this.type === '!' && this.#emptyExt) { + final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty; + } + else { + const close = this.type === '!' + ? // !() must match something,but !(x) can match '' + '))' + + (this.isStart() && !dot && !allowDot ? startNoDot : '') + + star + + ')' + : this.type === '@' + ? ')' + : this.type === '?' + ? ')?' + : this.type === '+' && bodyDotAllowed + ? ')' + : this.type === '*' && bodyDotAllowed + ? `)?` + : `)${this.type}`; + final = start + body + close; + } + return [ + final, + (0, unescape_js_1.unescape)(body), + (this.#hasMagic = !!this.#hasMagic), + this.#uflag, + ]; + } + #partsToRegExp(dot) { + return this.#parts + .map(p => { + // extglob ASTs should only contain parent ASTs + /* c8 ignore start */ + if (typeof p === 'string') { + throw new Error('string type in extglob ast??'); + } + /* c8 ignore stop */ + // can ignore hasMagic, because extglobs are already always magic + const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot); + this.#uflag = this.#uflag || uflag; + return re; + }) + .filter(p => !(this.isStart() && this.isEnd()) || !!p) + .join('|'); + } + static #parseGlob(glob, hasMagic, noEmpty = false) { + let escaping = false; + let re = ''; + let uflag = false; + for (let i = 0; i < glob.length; i++) { + const c = glob.charAt(i); + if (escaping) { + escaping = false; + re += (reSpecials.has(c) ? '\\' : '') + c; + continue; + } + if (c === '\\') { + if (i === glob.length - 1) { + re += '\\\\'; + } + else { + escaping = true; + } + continue; + } + if (c === '[') { + const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i); + if (consumed) { + re += src; + uflag = uflag || needUflag; + i += consumed - 1; + hasMagic = hasMagic || magic; + continue; + } + } + if (c === '*') { + if (noEmpty && glob === '*') + re += starNoEmpty; + else + re += star; + hasMagic = true; + continue; + } + if (c === '?') { + re += qmark; + hasMagic = true; + continue; + } + re += regExpEscape(c); + } + return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag]; + } +} +exports.AST = AST; +//# sourceMappingURL=ast.js.map - stream = - object instanceof ReadableStream ? object : ReadableStreamFrom(object) - } - - // 11. If source is a byte sequence, then set action to a - // step that returns source and length to source’s length. - if (typeof source === 'string' || util.isBuffer(source)) { - length = Buffer.byteLength(source) - } - - // 12. If action is non-null, then run these steps in in parallel: - if (action != null) { - // Run action. - let iterator - stream = new ReadableStream({ - async start() { - iterator = action(object)[Symbol.asyncIterator]() - }, - async pull(controller) { - const { value, done } = await iterator.next() - if (done) { - // When running action is done, close stream. - queueMicrotask(() => { - controller.close() - }) - } else { - // Whenever one or more bytes are available and stream is not errored, - // enqueue a Uint8Array wrapping an ArrayBuffer containing the available - // bytes into stream. - if (!isErrored(stream)) { - controller.enqueue(new Uint8Array(value)) - } - } - return controller.desiredSize > 0 - }, - async cancel(reason) { - await iterator.return() - }, - type: undefined - }) - } - - // 13. Let body be a body whose stream is stream, source is source, - // and length is length. - const body = { stream, source, length } +/***/ }), - // 14. Return (body, type). - return [body, type] - } +/***/ 1812: +/***/ ((__unused_webpack_module, exports) => { - // https://fetch.spec.whatwg.org/#bodyinit-safely-extract - function safelyExtractBody(object, keepalive = false) { - if (!ReadableStream) { - // istanbul ignore next - ReadableStream = (__nccwpck_require__(5356).ReadableStream) +"use strict"; + +// translate the various posix character classes into unicode properties +// this works across all unicode locales +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.parseClass = void 0; +// { : [, /u flag required, negated] +const posixClasses = { + '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true], + '[:alpha:]': ['\\p{L}\\p{Nl}', true], + '[:ascii:]': ['\\x' + '00-\\x' + '7f', false], + '[:blank:]': ['\\p{Zs}\\t', true], + '[:cntrl:]': ['\\p{Cc}', true], + '[:digit:]': ['\\p{Nd}', true], + '[:graph:]': ['\\p{Z}\\p{C}', true, true], + '[:lower:]': ['\\p{Ll}', true], + '[:print:]': ['\\p{C}', true], + '[:punct:]': ['\\p{P}', true], + '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true], + '[:upper:]': ['\\p{Lu}', true], + '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true], + '[:xdigit:]': ['A-Fa-f0-9', false], +}; +// only need to escape a few things inside of brace expressions +// escapes: [ \ ] - +const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&'); +// escape all regexp magic characters +const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); +// everything has already been escaped, we just have to join +const rangesToString = (ranges) => ranges.join(''); +// takes a glob string at a posix brace expression, and returns +// an equivalent regular expression source, and boolean indicating +// whether the /u flag needs to be applied, and the number of chars +// consumed to parse the character class. +// This also removes out of order ranges, and returns ($.) if the +// entire class just no good. +const parseClass = (glob, position) => { + const pos = position; + /* c8 ignore start */ + if (glob.charAt(pos) !== '[') { + throw new Error('not in a brace expression'); + } + /* c8 ignore stop */ + const ranges = []; + const negs = []; + let i = pos + 1; + let sawStart = false; + let uflag = false; + let escaping = false; + let negate = false; + let endPos = pos; + let rangeStart = ''; + WHILE: while (i < glob.length) { + const c = glob.charAt(i); + if ((c === '!' || c === '^') && i === pos + 1) { + negate = true; + i++; + continue; + } + if (c === ']' && sawStart && !escaping) { + endPos = i + 1; + break; + } + sawStart = true; + if (c === '\\') { + if (!escaping) { + escaping = true; + i++; + continue; + } + // escaped \ char, fall through and treat like normal char + } + if (c === '[' && !escaping) { + // either a posix class, a collation equivalent, or just a [ + for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) { + if (glob.startsWith(cls, i)) { + // invalid, [a-[] is fine, but not [a-[:alpha]] + if (rangeStart) { + return ['$.', false, glob.length - pos, true]; } + i += cls.length; + if (neg) + negs.push(unip); + else + ranges.push(unip); + uflag = uflag || u; + continue WHILE; + } + } + } + // now it's just a normal character, effectively + escaping = false; + if (rangeStart) { + // throw this range away if it's not valid, but others + // can still match. + if (c > rangeStart) { + ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c)); + } + else if (c === rangeStart) { + ranges.push(braceEscape(c)); + } + rangeStart = ''; + i++; + continue; + } + // now might be the start of a range. + // can be either c-d or c-] or c] or c] at this point + if (glob.startsWith('-]', i + 1)) { + ranges.push(braceEscape(c + '-')); + i += 2; + continue; + } + if (glob.startsWith('-', i + 1)) { + rangeStart = c; + i += 2; + continue; + } + // not the start of a range, just a single character + ranges.push(braceEscape(c)); + i++; + } + if (endPos < i) { + // didn't see the end of the class, not a valid class, + // but might still be valid as a literal match. + return ['', false, 0, false]; + } + // if we got no ranges and no negates, then we have a range that + // cannot possibly match anything, and that poisons the whole glob + if (!ranges.length && !negs.length) { + return ['$.', false, glob.length - pos, true]; + } + // if we got one positive range, and it's a single character, then that's + // not actually a magic pattern, it's just that one literal character. + // we should not treat that as "magic", we should just return the literal + // character. [_] is a perfectly valid way to escape glob magic chars. + if (negs.length === 0 && + ranges.length === 1 && + /^\\?.$/.test(ranges[0]) && + !negate) { + const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]; + return [regexpEscape(r), false, endPos - pos, false]; + } + const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'; + const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'; + const comb = ranges.length && negs.length + ? '(' + sranges + '|' + snegs + ')' + : ranges.length + ? sranges + : snegs; + return [comb, uflag, endPos - pos, true]; +}; +exports.parseClass = parseClass; +//# sourceMappingURL=brace-expressions.js.map - // To safely extract a body and a `Content-Type` value from - // a byte sequence or BodyInit object object, run these steps: - - // 1. If object is a ReadableStream object, then: - if (object instanceof ReadableStream) { - // Assert: object is neither disturbed nor locked. - // istanbul ignore next - assert(!util.isDisturbed(object), 'The body has already been consumed.') - // istanbul ignore next - assert(!object.locked, 'The stream is locked.') - } +/***/ }), - // 2. Return the results of extracting object. - return extractBody(object, keepalive) - } +/***/ 2804: +/***/ ((__unused_webpack_module, exports) => { - function cloneBody(body) { - // To clone a body body, run these steps: +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.escape = void 0; +/** + * Escape all magic characters in a glob pattern. + * + * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape} + * option is used, then characters are escaped by wrapping in `[]`, because + * a magic character wrapped in a character class can only be satisfied by + * that exact character. In this mode, `\` is _not_ escaped, because it is + * not interpreted as a magic character, but instead as a path separator. + */ +const escape = (s, { windowsPathsNoEscape = false, } = {}) => { + // don't need to escape +@! because we escape the parens + // that make those magic, and escaping ! as [!] isn't valid, + // because [!]] is a valid glob class meaning not ']'. + return windowsPathsNoEscape + ? s.replace(/[?*()[\]]/g, '[$&]') + : s.replace(/[?*()[\]\\]/g, '\\$&'); +}; +exports.escape = escape; +//# sourceMappingURL=escape.js.map - // https://fetch.spec.whatwg.org/#concept-body-clone +/***/ }), - // 1. Let « out1, out2 » be the result of teeing body’s stream. - const [out1, out2] = body.stream.tee() - const out2Clone = structuredClone(out2, { transfer: [out2] }) - // This, for whatever reasons, unrefs out2Clone which allows - // the process to exit by itself. - const [, finalClone] = out2Clone.tee() +/***/ 4501: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - // 2. Set body’s stream to out1. - body.stream = out1 +"use strict"; - // 3. Return a body whose stream is out2 and other members are copied from body. - return { - stream: finalClone, - length: body.length, - source: body.source - } +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0; +const brace_expansion_1 = __importDefault(__nccwpck_require__(3717)); +const assert_valid_pattern_js_1 = __nccwpck_require__(4149); +const ast_js_1 = __nccwpck_require__(5136); +const escape_js_1 = __nccwpck_require__(2804); +const unescape_js_1 = __nccwpck_require__(5698); +const minimatch = (p, pattern, options = {}) => { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false; + } + return new Minimatch(pattern, options).match(p); +}; +exports.minimatch = minimatch; +// Optimized checking for the most common glob patterns. +const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/; +const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext); +const starDotExtTestDot = (ext) => (f) => f.endsWith(ext); +const starDotExtTestNocase = (ext) => { + ext = ext.toLowerCase(); + return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext); +}; +const starDotExtTestNocaseDot = (ext) => { + ext = ext.toLowerCase(); + return (f) => f.toLowerCase().endsWith(ext); +}; +const starDotStarRE = /^\*+\.\*+$/; +const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.'); +const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.'); +const dotStarRE = /^\.\*+$/; +const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.'); +const starRE = /^\*+$/; +const starTest = (f) => f.length !== 0 && !f.startsWith('.'); +const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..'; +const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/; +const qmarksTestNocase = ([$0, ext = '']) => { + const noext = qmarksTestNoExt([$0]); + if (!ext) + return noext; + ext = ext.toLowerCase(); + return (f) => noext(f) && f.toLowerCase().endsWith(ext); +}; +const qmarksTestNocaseDot = ([$0, ext = '']) => { + const noext = qmarksTestNoExtDot([$0]); + if (!ext) + return noext; + ext = ext.toLowerCase(); + return (f) => noext(f) && f.toLowerCase().endsWith(ext); +}; +const qmarksTestDot = ([$0, ext = '']) => { + const noext = qmarksTestNoExtDot([$0]); + return !ext ? noext : (f) => noext(f) && f.endsWith(ext); +}; +const qmarksTest = ([$0, ext = '']) => { + const noext = qmarksTestNoExt([$0]); + return !ext ? noext : (f) => noext(f) && f.endsWith(ext); +}; +const qmarksTestNoExt = ([$0]) => { + const len = $0.length; + return (f) => f.length === len && !f.startsWith('.'); +}; +const qmarksTestNoExtDot = ([$0]) => { + const len = $0.length; + return (f) => f.length === len && f !== '.' && f !== '..'; +}; +/* c8 ignore start */ +const defaultPlatform = (typeof process === 'object' && process + ? (typeof process.env === 'object' && + process.env && + process.env.__MINIMATCH_TESTING_PLATFORM__) || + process.platform + : 'posix'); +const path = { + win32: { sep: '\\' }, + posix: { sep: '/' }, +}; +/* c8 ignore stop */ +exports.sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep; +exports.minimatch.sep = exports.sep; +exports.GLOBSTAR = Symbol('globstar **'); +exports.minimatch.GLOBSTAR = exports.GLOBSTAR; +// any single thing other than / +// don't need to escape / when using new RegExp() +const qmark = '[^/]'; +// * => any number of characters +const star = qmark + '*?'; +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?'; +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?'; +const filter = (pattern, options = {}) => (p) => (0, exports.minimatch)(p, pattern, options); +exports.filter = filter; +exports.minimatch.filter = exports.filter; +const ext = (a, b = {}) => Object.assign({}, a, b); +const defaults = (def) => { + if (!def || typeof def !== 'object' || !Object.keys(def).length) { + return exports.minimatch; + } + const orig = exports.minimatch; + const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options)); + return Object.assign(m, { + Minimatch: class Minimatch extends orig.Minimatch { + constructor(pattern, options = {}) { + super(pattern, ext(def, options)); + } + static defaults(options) { + return orig.defaults(ext(def, options)).Minimatch; + } + }, + AST: class AST extends orig.AST { + /* c8 ignore start */ + constructor(type, parent, options = {}) { + super(type, parent, ext(def, options)); + } + /* c8 ignore stop */ + static fromGlob(pattern, options = {}) { + return orig.AST.fromGlob(pattern, ext(def, options)); + } + }, + unescape: (s, options = {}) => orig.unescape(s, ext(def, options)), + escape: (s, options = {}) => orig.escape(s, ext(def, options)), + filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)), + defaults: (options) => orig.defaults(ext(def, options)), + makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)), + braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)), + match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)), + sep: orig.sep, + GLOBSTAR: exports.GLOBSTAR, + }); +}; +exports.defaults = defaults; +exports.minimatch.defaults = exports.defaults; +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +const braceExpand = (pattern, options = {}) => { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + // Thanks to Yeting Li for + // improving this regexp to avoid a ReDOS vulnerability. + if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { + // shortcut. no need to expand. + return [pattern]; + } + return (0, brace_expansion_1.default)(pattern); +}; +exports.braceExpand = braceExpand; +exports.minimatch.braceExpand = exports.braceExpand; +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe(); +exports.makeRe = makeRe; +exports.minimatch.makeRe = exports.makeRe; +const match = (list, pattern, options = {}) => { + const mm = new Minimatch(pattern, options); + list = list.filter(f => mm.match(f)); + if (mm.options.nonull && !list.length) { + list.push(pattern); + } + return list; +}; +exports.match = match; +exports.minimatch.match = exports.match; +// replace stuff like \* with * +const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/; +const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); +class Minimatch { + options; + set; + pattern; + windowsPathsNoEscape; + nonegate; + negate; + comment; + empty; + preserveMultipleSlashes; + partial; + globSet; + globParts; + nocase; + isWindows; + platform; + windowsNoMagicRoot; + regexp; + constructor(pattern, options = {}) { + (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); + options = options || {}; + this.options = options; + this.pattern = pattern; + this.platform = options.platform || defaultPlatform; + this.isWindows = this.platform === 'win32'; + this.windowsPathsNoEscape = + !!options.windowsPathsNoEscape || options.allowWindowsEscape === false; + if (this.windowsPathsNoEscape) { + this.pattern = this.pattern.replace(/\\/g, '/'); + } + this.preserveMultipleSlashes = !!options.preserveMultipleSlashes; + this.regexp = null; + this.negate = false; + this.nonegate = !!options.nonegate; + this.comment = false; + this.empty = false; + this.partial = !!options.partial; + this.nocase = !!this.options.nocase; + this.windowsNoMagicRoot = + options.windowsNoMagicRoot !== undefined + ? options.windowsNoMagicRoot + : !!(this.isWindows && this.nocase); + this.globSet = []; + this.globParts = []; + this.set = []; + // make the set of regexps etc. + this.make(); + } + hasMagic() { + if (this.options.magicalBraces && this.set.length > 1) { + return true; + } + for (const pattern of this.set) { + for (const part of pattern) { + if (typeof part !== 'string') + return true; + } + } + return false; + } + debug(..._) { } + make() { + const pattern = this.pattern; + const options = this.options; + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true; + return; + } + if (!pattern) { + this.empty = true; + return; + } + // step 1: figure out negation, etc. + this.parseNegate(); + // step 2: expand braces + this.globSet = [...new Set(this.braceExpand())]; + if (options.debug) { + this.debug = (...args) => console.error(...args); + } + this.debug(this.pattern, this.globSet); + // step 3: now we have a set, so turn each one into a series of + // path-portion matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + // + // First, we preprocess to make the glob pattern sets a bit simpler + // and deduped. There are some perf-killing patterns that can cause + // problems with a glob walk, but we can simplify them down a bit. + const rawGlobParts = this.globSet.map(s => this.slashSplit(s)); + this.globParts = this.preprocess(rawGlobParts); + this.debug(this.pattern, this.globParts); + // glob --> regexps + let set = this.globParts.map((s, _, __) => { + if (this.isWindows && this.windowsNoMagicRoot) { + // check if it's a drive or unc path. + const isUNC = s[0] === '' && + s[1] === '' && + (s[2] === '?' || !globMagic.test(s[2])) && + !globMagic.test(s[3]); + const isDrive = /^[a-z]:/i.test(s[0]); + if (isUNC) { + return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]; + } + else if (isDrive) { + return [s[0], ...s.slice(1).map(ss => this.parse(ss))]; + } + } + return s.map(ss => this.parse(ss)); + }); + this.debug(this.pattern, set); + // filter out everything that didn't compile properly. + this.set = set.filter(s => s.indexOf(false) === -1); + // do not treat the ? in UNC paths as magic + if (this.isWindows) { + for (let i = 0; i < this.set.length; i++) { + const p = this.set[i]; + if (p[0] === '' && + p[1] === '' && + this.globParts[i][2] === '?' && + typeof p[3] === 'string' && + /^[a-z]:$/i.test(p[3])) { + p[2] = '?'; + } + } + } + this.debug(this.pattern, this.set); + } + // various transforms to equivalent pattern sets that are + // faster to process in a filesystem walk. The goal is to + // eliminate what we can, and push all ** patterns as far + // to the right as possible, even if it increases the number + // of patterns that we have to process. + preprocess(globParts) { + // if we're not in globstar mode, then turn all ** into * + if (this.options.noglobstar) { + for (let i = 0; i < globParts.length; i++) { + for (let j = 0; j < globParts[i].length; j++) { + if (globParts[i][j] === '**') { + globParts[i][j] = '*'; + } + } + } + } + const { optimizationLevel = 1 } = this.options; + if (optimizationLevel >= 2) { + // aggressive optimization for the purpose of fs walking + globParts = this.firstPhasePreProcess(globParts); + globParts = this.secondPhasePreProcess(globParts); + } + else if (optimizationLevel >= 1) { + // just basic optimizations to remove some .. parts + globParts = this.levelOneOptimize(globParts); + } + else { + // just collapse multiple ** portions into one + globParts = this.adjascentGlobstarOptimize(globParts); + } + return globParts; + } + // just get rid of adjascent ** portions + adjascentGlobstarOptimize(globParts) { + return globParts.map(parts => { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let i = gs; + while (parts[i + 1] === '**') { + i++; + } + if (i !== gs) { + parts.splice(gs, i - gs); + } + } + return parts; + }); + } + // get rid of adjascent ** and resolve .. portions + levelOneOptimize(globParts) { + return globParts.map(parts => { + parts = parts.reduce((set, part) => { + const prev = set[set.length - 1]; + if (part === '**' && prev === '**') { + return set; } - - async function* consumeBody(body) { - if (body) { - if (isUint8Array(body)) { - yield body - } else { - const stream = body.stream - - if (util.isDisturbed(stream)) { - throw new TypeError('The body has already been consumed.') - } - - if (stream.locked) { - throw new TypeError('The stream is locked.') - } - - // Compat. - stream[kBodyUsed] = true - - yield* stream - } + if (part === '..') { + if (prev && prev !== '..' && prev !== '.' && prev !== '**') { + set.pop(); + return set; } } - - function throwIfAborted(state) { - if (state.aborted) { - throw new DOMException('The operation was aborted.', 'AbortError') + set.push(part); + return set; + }, []); + return parts.length === 0 ? [''] : parts; + }); + } + levelTwoFileOptimize(parts) { + if (!Array.isArray(parts)) { + parts = this.slashSplit(parts); + } + let didSomething = false; + do { + didSomething = false; + //
    // -> 
    /
    +            if (!this.preserveMultipleSlashes) {
    +                for (let i = 1; i < parts.length - 1; i++) {
    +                    const p = parts[i];
    +                    // don't squeeze out UNC patterns
    +                    if (i === 1 && p === '' && parts[0] === '')
    +                        continue;
    +                    if (p === '.' || p === '') {
    +                        didSomething = true;
    +                        parts.splice(i, 1);
    +                        i--;
                         }
                     }
    -
    -                function bodyMixinMethods(instance) {
    -                    const methods = {
    -                        blob() {
    -                            // The blob() method steps are to return the result of
    -                            // running consume body with this and the following step
    -                            // given a byte sequence bytes: return a Blob whose
    -                            // contents are bytes and whose type attribute is this’s
    -                            // MIME type.
    -                            return specConsumeBody(this, (bytes) => {
    -                                let mimeType = bodyMimeType(this)
    -
    -                                if (mimeType === 'failure') {
    -                                    mimeType = ''
    -                                } else if (mimeType) {
    -                                    mimeType = serializeAMimeType(mimeType)
    -                                }
    -
    -                                // Return a Blob whose contents are bytes and type attribute
    -                                // is mimeType.
    -                                return new Blob([bytes], { type: mimeType })
    -                            }, instance)
    -                        },
    -
    -                        arrayBuffer() {
    -                            // The arrayBuffer() method steps are to return the result
    -                            // of running consume body with this and the following step
    -                            // given a byte sequence bytes: return a new ArrayBuffer
    -                            // whose contents are bytes.
    -                            return specConsumeBody(this, (bytes) => {
    -                                return new Uint8Array(bytes).buffer
    -                            }, instance)
    -                        },
    -
    -                        text() {
    -                            // The text() method steps are to return the result of running
    -                            // consume body with this and UTF-8 decode.
    -                            return specConsumeBody(this, utf8DecodeBytes, instance)
    -                        },
    -
    -                        json() {
    -                            // The json() method steps are to return the result of running
    -                            // consume body with this and parse JSON from bytes.
    -                            return specConsumeBody(this, parseJSONFromBytes, instance)
    -                        },
    -
    -                        async formData() {
    -                            webidl.brandCheck(this, instance)
    -
    -                            throwIfAborted(this[kState])
    -
    -                            const contentType = this.headers.get('Content-Type')
    -
    -                            // If mimeType’s essence is "multipart/form-data", then:
    -                            if (/multipart\/form-data/.test(contentType)) {
    -                                const headers = {}
    -                                for (const [key, value] of this.headers) headers[key.toLowerCase()] = value
    -
    -                                const responseFormData = new FormData()
    -
    -                                let busboy
    -
    -                                try {
    -                                    busboy = new Busboy({
    -                                        headers,
    -                                        preservePath: true
    -                                    })
    -                                } catch (err) {
    -                                    throw new DOMException(`${err}`, 'AbortError')
    -                                }
    -
    -                                busboy.on('field', (name, value) => {
    -                                    responseFormData.append(name, value)
    -                                })
    -                                busboy.on('file', (name, value, filename, encoding, mimeType) => {
    -                                    const chunks = []
    -
    -                                    if (encoding === 'base64' || encoding.toLowerCase() === 'base64') {
    -                                        let base64chunk = ''
    -
    -                                        value.on('data', (chunk) => {
    -                                            base64chunk += chunk.toString().replace(/[\r\n]/gm, '')
    -
    -                                            const end = base64chunk.length - base64chunk.length % 4
    -                                            chunks.push(Buffer.from(base64chunk.slice(0, end), 'base64'))
    -
    -                                            base64chunk = base64chunk.slice(end)
    -                                        })
    -                                        value.on('end', () => {
    -                                            chunks.push(Buffer.from(base64chunk, 'base64'))
    -                                            responseFormData.append(name, new File(chunks, filename, { type: mimeType }))
    -                                        })
    -                                    } else {
    -                                        value.on('data', (chunk) => {
    -                                            chunks.push(chunk)
    -                                        })
    -                                        value.on('end', () => {
    -                                            responseFormData.append(name, new File(chunks, filename, { type: mimeType }))
    -                                        })
    -                                    }
    -                                })
    -
    -                                const busboyResolve = new Promise((resolve, reject) => {
    -                                    busboy.on('finish', resolve)
    -                                    busboy.on('error', (err) => reject(new TypeError(err)))
    -                                })
    -
    -                                if (this.body !== null) for await (const chunk of consumeBody(this[kState].body)) busboy.write(chunk)
    -                                busboy.end()
    -                                await busboyResolve
    -
    -                                return responseFormData
    -                            } else if (/application\/x-www-form-urlencoded/.test(contentType)) {
    -                                // Otherwise, if mimeType’s essence is "application/x-www-form-urlencoded", then:
    -
    -                                // 1. Let entries be the result of parsing bytes.
    -                                let entries
    -                                try {
    -                                    let text = ''
    -                                    // application/x-www-form-urlencoded parser will keep the BOM.
    -                                    // https://url.spec.whatwg.org/#concept-urlencoded-parser
    -                                    // Note that streaming decoder is stateful and cannot be reused
    -                                    const streamingDecoder = new TextDecoder('utf-8', { ignoreBOM: true })
    -
    -                                    for await (const chunk of consumeBody(this[kState].body)) {
    -                                        if (!isUint8Array(chunk)) {
    -                                            throw new TypeError('Expected Uint8Array chunk')
    -                                        }
    -                                        text += streamingDecoder.decode(chunk, { stream: true })
    -                                    }
    -                                    text += streamingDecoder.decode()
    -                                    entries = new URLSearchParams(text)
    -                                } catch (err) {
    -                                    // istanbul ignore next: Unclear when new URLSearchParams can fail on a string.
    -                                    // 2. If entries is failure, then throw a TypeError.
    -                                    throw Object.assign(new TypeError(), { cause: err })
    -                                }
    -
    -                                // 3. Return a new FormData object whose entries are entries.
    -                                const formData = new FormData()
    -                                for (const [name, value] of entries) {
    -                                    formData.append(name, value)
    -                                }
    -                                return formData
    -                            } else {
    -                                // Wait a tick before checking if the request has been aborted.
    -                                // Otherwise, a TypeError can be thrown when an AbortError should.
    -                                await Promise.resolve()
    -
    -                                throwIfAborted(this[kState])
    -
    -                                // Otherwise, throw a TypeError.
    -                                throw webidl.errors.exception({
    -                                    header: `${instance.name}.formData`,
    -                                    message: 'Could not parse content as FormData.'
    -                                })
    -                            }
    -                        }
    +                if (parts[0] === '.' &&
    +                    parts.length === 2 &&
    +                    (parts[1] === '.' || parts[1] === '')) {
    +                    didSomething = true;
    +                    parts.pop();
    +                }
    +            }
    +            // 
    /

    /../ ->

    /
    +            let dd = 0;
    +            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    +                const p = parts[dd - 1];
    +                if (p && p !== '.' && p !== '..' && p !== '**') {
    +                    didSomething = true;
    +                    parts.splice(dd - 1, 2);
    +                    dd -= 2;
    +                }
    +            }
    +        } while (didSomething);
    +        return parts.length === 0 ? [''] : parts;
    +    }
    +    // First phase: single-pattern processing
    +    // 
     is 1 or more portions
    +    //  is 1 or more portions
    +    // 

    is any portion other than ., .., '', or ** + // is . or '' + // + // **/.. is *brutal* for filesystem walking performance, because + // it effectively resets the recursive walk each time it occurs, + // and ** cannot be reduced out by a .. pattern part like a regexp + // or most strings (other than .., ., and '') can be. + // + //

    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} + //

    // -> 
    /
    +    // 
    /

    /../ ->

    /
    +    // **/**/ -> **/
    +    //
    +    // **/*/ -> */**/ <== not valid because ** doesn't follow
    +    // this WOULD be allowed if ** did follow symlinks, or * didn't
    +    firstPhasePreProcess(globParts) {
    +        let didSomething = false;
    +        do {
    +            didSomething = false;
    +            // 
    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} + for (let parts of globParts) { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let gss = gs; + while (parts[gss + 1] === '**') { + //

    /**/**/ -> 
    /**/
    +                        gss++;
    +                    }
    +                    // eg, if gs is 2 and gss is 4, that means we have 3 **
    +                    // parts, and can remove 2 of them.
    +                    if (gss > gs) {
    +                        parts.splice(gs + 1, gss - gs);
    +                    }
    +                    let next = parts[gs + 1];
    +                    const p = parts[gs + 2];
    +                    const p2 = parts[gs + 3];
    +                    if (next !== '..')
    +                        continue;
    +                    if (!p ||
    +                        p === '.' ||
    +                        p === '..' ||
    +                        !p2 ||
    +                        p2 === '.' ||
    +                        p2 === '..') {
    +                        continue;
    +                    }
    +                    didSomething = true;
    +                    // edit parts in place, and push the new one
    +                    parts.splice(gs, 1);
    +                    const other = parts.slice(0);
    +                    other[gs] = '**';
    +                    globParts.push(other);
    +                    gs--;
    +                }
    +                // 
    // -> 
    /
    +                if (!this.preserveMultipleSlashes) {
    +                    for (let i = 1; i < parts.length - 1; i++) {
    +                        const p = parts[i];
    +                        // don't squeeze out UNC patterns
    +                        if (i === 1 && p === '' && parts[0] === '')
    +                            continue;
    +                        if (p === '.' || p === '') {
    +                            didSomething = true;
    +                            parts.splice(i, 1);
    +                            i--;
    +                        }
    +                    }
    +                    if (parts[0] === '.' &&
    +                        parts.length === 2 &&
    +                        (parts[1] === '.' || parts[1] === '')) {
    +                        didSomething = true;
    +                        parts.pop();
    +                    }
    +                }
    +                // 
    /

    /../ ->

    /
    +                let dd = 0;
    +                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    +                    const p = parts[dd - 1];
    +                    if (p && p !== '.' && p !== '..' && p !== '**') {
    +                        didSomething = true;
    +                        const needDot = dd === 1 && parts[dd + 1] === '**';
    +                        const splin = needDot ? ['.'] : [];
    +                        parts.splice(dd - 1, 2, ...splin);
    +                        if (parts.length === 0)
    +                            parts.push('');
    +                        dd -= 2;
    +                    }
    +                }
    +            }
    +        } while (didSomething);
    +        return globParts;
    +    }
    +    // second phase: multi-pattern dedupes
    +    // {
    /*/,
    /

    /} ->

    /*/
    +    // {
    /,
    /} -> 
    /
    +    // {
    /**/,
    /} -> 
    /**/
    +    //
    +    // {
    /**/,
    /**/

    /} ->

    /**/
    +    // ^-- not valid because ** doens't follow symlinks
    +    secondPhasePreProcess(globParts) {
    +        for (let i = 0; i < globParts.length - 1; i++) {
    +            for (let j = i + 1; j < globParts.length; j++) {
    +                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
    +                if (!matched)
    +                    continue;
    +                globParts[i] = matched;
    +                globParts[j] = [];
    +            }
    +        }
    +        return globParts.filter(gs => gs.length);
    +    }
    +    partsMatch(a, b, emptyGSMatch = false) {
    +        let ai = 0;
    +        let bi = 0;
    +        let result = [];
    +        let which = '';
    +        while (ai < a.length && bi < b.length) {
    +            if (a[ai] === b[bi]) {
    +                result.push(which === 'b' ? b[bi] : a[ai]);
    +                ai++;
    +                bi++;
    +            }
    +            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
    +                result.push(a[ai]);
    +                ai++;
    +            }
    +            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
    +                result.push(b[bi]);
    +                bi++;
    +            }
    +            else if (a[ai] === '*' &&
    +                b[bi] &&
    +                (this.options.dot || !b[bi].startsWith('.')) &&
    +                b[bi] !== '**') {
    +                if (which === 'b')
    +                    return false;
    +                which = 'a';
    +                result.push(a[ai]);
    +                ai++;
    +                bi++;
    +            }
    +            else if (b[bi] === '*' &&
    +                a[ai] &&
    +                (this.options.dot || !a[ai].startsWith('.')) &&
    +                a[ai] !== '**') {
    +                if (which === 'a')
    +                    return false;
    +                which = 'b';
    +                result.push(b[bi]);
    +                ai++;
    +                bi++;
    +            }
    +            else {
    +                return false;
    +            }
    +        }
    +        // if we fall out of the loop, it means they two are identical
    +        // as long as their lengths match
    +        return a.length === b.length && result;
    +    }
    +    parseNegate() {
    +        if (this.nonegate)
    +            return;
    +        const pattern = this.pattern;
    +        let negate = false;
    +        let negateOffset = 0;
    +        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
    +            negate = !negate;
    +            negateOffset++;
    +        }
    +        if (negateOffset)
    +            this.pattern = pattern.slice(negateOffset);
    +        this.negate = negate;
    +    }
    +    // set partial to true to test if, for example,
    +    // "/a/b" matches the start of "/*/b/*/d"
    +    // Partial means, if you run out of file before you run
    +    // out of pattern, then that's fine, as long as all
    +    // the parts match.
    +    matchOne(file, pattern, partial = false) {
    +        const options = this.options;
    +        // UNC paths like //?/X:/... can match X:/... and vice versa
    +        // Drive letters in absolute drive or unc paths are always compared
    +        // case-insensitively.
    +        if (this.isWindows) {
    +            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
    +            const fileUNC = !fileDrive &&
    +                file[0] === '' &&
    +                file[1] === '' &&
    +                file[2] === '?' &&
    +                /^[a-z]:$/i.test(file[3]);
    +            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
    +            const patternUNC = !patternDrive &&
    +                pattern[0] === '' &&
    +                pattern[1] === '' &&
    +                pattern[2] === '?' &&
    +                typeof pattern[3] === 'string' &&
    +                /^[a-z]:$/i.test(pattern[3]);
    +            const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
    +            const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
    +            if (typeof fdi === 'number' && typeof pdi === 'number') {
    +                const [fd, pd] = [file[fdi], pattern[pdi]];
    +                if (fd.toLowerCase() === pd.toLowerCase()) {
    +                    pattern[pdi] = fd;
    +                    if (pdi > fdi) {
    +                        pattern = pattern.slice(pdi);
    +                    }
    +                    else if (fdi > pdi) {
    +                        file = file.slice(fdi);
    +                    }
    +                }
    +            }
    +        }
    +        // resolve and reduce . and .. portions in the file as well.
    +        // dont' need to do the second phase, because it's only one string[]
    +        const { optimizationLevel = 1 } = this.options;
    +        if (optimizationLevel >= 2) {
    +            file = this.levelTwoFileOptimize(file);
    +        }
    +        this.debug('matchOne', this, { file, pattern });
    +        this.debug('matchOne', file.length, pattern.length);
    +        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
    +            this.debug('matchOne loop');
    +            var p = pattern[pi];
    +            var f = file[fi];
    +            this.debug(pattern, p, f);
    +            // should be impossible.
    +            // some invalid regexp stuff in the set.
    +            /* c8 ignore start */
    +            if (p === false) {
    +                return false;
    +            }
    +            /* c8 ignore stop */
    +            if (p === exports.GLOBSTAR) {
    +                this.debug('GLOBSTAR', [pattern, p, f]);
    +                // "**"
    +                // a/**/b/**/c would match the following:
    +                // a/b/x/y/z/c
    +                // a/x/y/z/b/c
    +                // a/b/x/b/x/c
    +                // a/b/c
    +                // To do this, take the rest of the pattern after
    +                // the **, and see if it would match the file remainder.
    +                // If so, return success.
    +                // If not, the ** "swallows" a segment, and try again.
    +                // This is recursively awful.
    +                //
    +                // a/**/b/**/c matching a/b/x/y/z/c
    +                // - a matches a
    +                // - doublestar
    +                //   - matchOne(b/x/y/z/c, b/**/c)
    +                //     - b matches b
    +                //     - doublestar
    +                //       - matchOne(x/y/z/c, c) -> no
    +                //       - matchOne(y/z/c, c) -> no
    +                //       - matchOne(z/c, c) -> no
    +                //       - matchOne(c, c) yes, hit
    +                var fr = fi;
    +                var pr = pi + 1;
    +                if (pr === pl) {
    +                    this.debug('** at the end');
    +                    // a ** at the end will just swallow the rest.
    +                    // We have found a match.
    +                    // however, it will not swallow /.x, unless
    +                    // options.dot is set.
    +                    // . and .. are *never* matched by **, for explosively
    +                    // exponential reasons.
    +                    for (; fi < fl; fi++) {
    +                        if (file[fi] === '.' ||
    +                            file[fi] === '..' ||
    +                            (!options.dot && file[fi].charAt(0) === '.'))
    +                            return false;
                         }
    -
    -                    return methods
    -                }
    -
    -                function mixinBody(prototype) {
    -                    Object.assign(prototype.prototype, bodyMixinMethods(prototype))
    +                    return true;
                     }
    -
    -                /**
    -                 * @see https://fetch.spec.whatwg.org/#concept-body-consume-body
    -                 * @param {Response|Request} object
    -                 * @param {(value: unknown) => unknown} convertBytesToJSValue
    -                 * @param {Response|Request} instance
    -                 */
    -                async function specConsumeBody(object, convertBytesToJSValue, instance) {
    -                    webidl.brandCheck(object, instance)
    -
    -                    throwIfAborted(object[kState])
    -
    -                    // 1. If object is unusable, then return a promise rejected
    -                    //    with a TypeError.
    -                    if (bodyUnusable(object[kState].body)) {
    -                        throw new TypeError('Body is unusable')
    +                // ok, let's see if we can swallow whatever we can.
    +                while (fr < fl) {
    +                    var swallowee = file[fr];
    +                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
    +                    // XXX remove this slice.  Just pass the start index.
    +                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
    +                        this.debug('globstar found match!', fr, fl, swallowee);
    +                        // found a match.
    +                        return true;
                         }
    -
    -                    // 2. Let promise be a new promise.
    -                    const promise = createDeferredPromise()
    -
    -                    // 3. Let errorSteps given error be to reject promise with error.
    -                    const errorSteps = (error) => promise.reject(error)
    -
    -                    // 4. Let successSteps given a byte sequence data be to resolve
    -                    //    promise with the result of running convertBytesToJSValue
    -                    //    with data. If that threw an exception, then run errorSteps
    -                    //    with that exception.
    -                    const successSteps = (data) => {
    -                        try {
    -                            promise.resolve(convertBytesToJSValue(data))
    -                        } catch (e) {
    -                            errorSteps(e)
    +                    else {
    +                        // can't swallow "." or ".." ever.
    +                        // can only swallow ".foo" when explicitly asked.
    +                        if (swallowee === '.' ||
    +                            swallowee === '..' ||
    +                            (!options.dot && swallowee.charAt(0) === '.')) {
    +                            this.debug('dot detected!', file, fr, pattern, pr);
    +                            break;
                             }
    +                        // ** swallows a segment, and continue.
    +                        this.debug('globstar swallow a segment, and continue');
    +                        fr++;
                         }
    -
    -                    // 5. If object’s body is null, then run successSteps with an
    -                    //    empty byte sequence.
    -                    if (object[kState].body == null) {
    -                        successSteps(new Uint8Array())
    -                        return promise.promise
    -                    }
    -
    -                    // 6. Otherwise, fully read object’s body given successSteps,
    -                    //    errorSteps, and object’s relevant global object.
    -                    await fullyReadBody(object[kState].body, successSteps, errorSteps)
    -
    -                    // 7. Return promise.
    -                    return promise.promise
                     }
    -
    -                // https://fetch.spec.whatwg.org/#body-unusable
    -                function bodyUnusable(body) {
    -                    // An object including the Body interface mixin is
    -                    // said to be unusable if its body is non-null and
    -                    // its body’s stream is disturbed or locked.
    -                    return body != null && (body.stream.locked || util.isDisturbed(body.stream))
    +                // no match was found.
    +                // However, in partial mode, we can't say this is necessarily over.
    +                /* c8 ignore start */
    +                if (partial) {
    +                    // ran out of file
    +                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
    +                    if (fr === fl) {
    +                        return true;
    +                    }
                     }
    -
    -                /**
    -                 * @see https://encoding.spec.whatwg.org/#utf-8-decode
    -                 * @param {Buffer} buffer
    -                 */
    -                function utf8DecodeBytes(buffer) {
    -                    if (buffer.length === 0) {
    -                        return ''
    +                /* c8 ignore stop */
    +                return false;
    +            }
    +            // something other than **
    +            // non-magic patterns just have to match exactly
    +            // patterns with magic have been turned into regexps.
    +            let hit;
    +            if (typeof p === 'string') {
    +                hit = f === p;
    +                this.debug('string match', p, f, hit);
    +            }
    +            else {
    +                hit = p.test(f);
    +                this.debug('pattern match', p, f, hit);
    +            }
    +            if (!hit)
    +                return false;
    +        }
    +        // Note: ending in / means that we'll get a final ""
    +        // at the end of the pattern.  This can only match a
    +        // corresponding "" at the end of the file.
    +        // If the file ends in /, then it can only match a
    +        // a pattern that ends in /, unless the pattern just
    +        // doesn't have any more for it. But, a/b/ should *not*
    +        // match "a/b/*", even though "" matches against the
    +        // [^/]*? pattern, except in partial mode, where it might
    +        // simply not be reached yet.
    +        // However, a/b/ should still satisfy a/*
    +        // now either we fell off the end of the pattern, or we're done.
    +        if (fi === fl && pi === pl) {
    +            // ran out of pattern and filename at the same time.
    +            // an exact hit!
    +            return true;
    +        }
    +        else if (fi === fl) {
    +            // ran out of file, but still had pattern left.
    +            // this is ok if we're doing the match as part of
    +            // a glob fs traversal.
    +            return partial;
    +        }
    +        else if (pi === pl) {
    +            // ran out of pattern, still have file left.
    +            // this is only acceptable if we're on the very last
    +            // empty segment of a file with a trailing slash.
    +            // a/* should match a/b/
    +            return fi === fl - 1 && file[fi] === '';
    +            /* c8 ignore start */
    +        }
    +        else {
    +            // should be unreachable.
    +            throw new Error('wtf?');
    +        }
    +        /* c8 ignore stop */
    +    }
    +    braceExpand() {
    +        return (0, exports.braceExpand)(this.pattern, this.options);
    +    }
    +    parse(pattern) {
    +        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
    +        const options = this.options;
    +        // shortcuts
    +        if (pattern === '**')
    +            return exports.GLOBSTAR;
    +        if (pattern === '')
    +            return '';
    +        // far and away, the most common glob pattern parts are
    +        // *, *.*, and *.  Add a fast check method for those.
    +        let m;
    +        let fastTest = null;
    +        if ((m = pattern.match(starRE))) {
    +            fastTest = options.dot ? starTestDot : starTest;
    +        }
    +        else if ((m = pattern.match(starDotExtRE))) {
    +            fastTest = (options.nocase
    +                ? options.dot
    +                    ? starDotExtTestNocaseDot
    +                    : starDotExtTestNocase
    +                : options.dot
    +                    ? starDotExtTestDot
    +                    : starDotExtTest)(m[1]);
    +        }
    +        else if ((m = pattern.match(qmarksRE))) {
    +            fastTest = (options.nocase
    +                ? options.dot
    +                    ? qmarksTestNocaseDot
    +                    : qmarksTestNocase
    +                : options.dot
    +                    ? qmarksTestDot
    +                    : qmarksTest)(m);
    +        }
    +        else if ((m = pattern.match(starDotStarRE))) {
    +            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
    +        }
    +        else if ((m = pattern.match(dotStarRE))) {
    +            fastTest = dotStarTest;
    +        }
    +        const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
    +        if (fastTest && typeof re === 'object') {
    +            // Avoids overriding in frozen environments
    +            Reflect.defineProperty(re, 'test', { value: fastTest });
    +        }
    +        return re;
    +    }
    +    makeRe() {
    +        if (this.regexp || this.regexp === false)
    +            return this.regexp;
    +        // at this point, this.set is a 2d array of partial
    +        // pattern strings, or "**".
    +        //
    +        // It's better to use .match().  This function shouldn't
    +        // be used, really, but it's pretty convenient sometimes,
    +        // when you just want to work with a regex.
    +        const set = this.set;
    +        if (!set.length) {
    +            this.regexp = false;
    +            return this.regexp;
    +        }
    +        const options = this.options;
    +        const twoStar = options.noglobstar
    +            ? star
    +            : options.dot
    +                ? twoStarDot
    +                : twoStarNoDot;
    +        const flags = new Set(options.nocase ? ['i'] : []);
    +        // regexpify non-globstar patterns
    +        // if ** is only item, then we just do one twoStar
    +        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
    +        // if ** is last, append (\/twoStar|) to previous
    +        // if ** is in the middle, append (\/|\/twoStar\/) to previous
    +        // then filter out GLOBSTAR symbols
    +        let re = set
    +            .map(pattern => {
    +            const pp = pattern.map(p => {
    +                if (p instanceof RegExp) {
    +                    for (const f of p.flags.split(''))
    +                        flags.add(f);
    +                }
    +                return typeof p === 'string'
    +                    ? regExpEscape(p)
    +                    : p === exports.GLOBSTAR
    +                        ? exports.GLOBSTAR
    +                        : p._src;
    +            });
    +            pp.forEach((p, i) => {
    +                const next = pp[i + 1];
    +                const prev = pp[i - 1];
    +                if (p !== exports.GLOBSTAR || prev === exports.GLOBSTAR) {
    +                    return;
    +                }
    +                if (prev === undefined) {
    +                    if (next !== undefined && next !== exports.GLOBSTAR) {
    +                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
                         }
    +                    else {
    +                        pp[i] = twoStar;
    +                    }
    +                }
    +                else if (next === undefined) {
    +                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
    +                }
    +                else if (next !== exports.GLOBSTAR) {
    +                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
    +                    pp[i + 1] = exports.GLOBSTAR;
    +                }
    +            });
    +            return pp.filter(p => p !== exports.GLOBSTAR).join('/');
    +        })
    +            .join('|');
    +        // need to wrap in parens if we had more than one thing with |,
    +        // otherwise only the first will be anchored to ^ and the last to $
    +        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
    +        // must match entire pattern
    +        // ending in a * or ** will make it less strict.
    +        re = '^' + open + re + close + '$';
    +        // can match anything, as long as it's not this.
    +        if (this.negate)
    +            re = '^(?!' + re + ').+$';
    +        try {
    +            this.regexp = new RegExp(re, [...flags].join(''));
    +            /* c8 ignore start */
    +        }
    +        catch (ex) {
    +            // should be impossible
    +            this.regexp = false;
    +        }
    +        /* c8 ignore stop */
    +        return this.regexp;
    +    }
    +    slashSplit(p) {
    +        // if p starts with // on windows, we preserve that
    +        // so that UNC paths aren't broken.  Otherwise, any number of
    +        // / characters are coalesced into one, unless
    +        // preserveMultipleSlashes is set to true.
    +        if (this.preserveMultipleSlashes) {
    +            return p.split('/');
    +        }
    +        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
    +            // add an extra '' for the one we lose
    +            return ['', ...p.split(/\/+/)];
    +        }
    +        else {
    +            return p.split(/\/+/);
    +        }
    +    }
    +    match(f, partial = this.partial) {
    +        this.debug('match', f, this.pattern);
    +        // short-circuit in the case of busted things.
    +        // comments, etc.
    +        if (this.comment) {
    +            return false;
    +        }
    +        if (this.empty) {
    +            return f === '';
    +        }
    +        if (f === '/' && partial) {
    +            return true;
    +        }
    +        const options = this.options;
    +        // windows: need to use /, not \
    +        if (this.isWindows) {
    +            f = f.split('\\').join('/');
    +        }
    +        // treat the test path as a set of pathparts.
    +        const ff = this.slashSplit(f);
    +        this.debug(this.pattern, 'split', ff);
    +        // just ONE of the pattern sets in this.set needs to match
    +        // in order for it to be valid.  If negating, then just one
    +        // match means that we have failed.
    +        // Either way, return on the first hit.
    +        const set = this.set;
    +        this.debug(this.pattern, 'set', set);
    +        // Find the basename of the path by looking for the last non-empty segment
    +        let filename = ff[ff.length - 1];
    +        if (!filename) {
    +            for (let i = ff.length - 2; !filename && i >= 0; i--) {
    +                filename = ff[i];
    +            }
    +        }
    +        for (let i = 0; i < set.length; i++) {
    +            const pattern = set[i];
    +            let file = ff;
    +            if (options.matchBase && pattern.length === 1) {
    +                file = [filename];
    +            }
    +            const hit = this.matchOne(file, pattern, partial);
    +            if (hit) {
    +                if (options.flipNegate) {
    +                    return true;
    +                }
    +                return !this.negate;
    +            }
    +        }
    +        // didn't get any hits.  this is success if it's a negative
    +        // pattern, failure otherwise.
    +        if (options.flipNegate) {
    +            return false;
    +        }
    +        return this.negate;
    +    }
    +    static defaults(def) {
    +        return exports.minimatch.defaults(def).Minimatch;
    +    }
    +}
    +exports.Minimatch = Minimatch;
    +/* c8 ignore start */
    +var ast_js_2 = __nccwpck_require__(5136);
    +Object.defineProperty(exports, "AST", ({ enumerable: true, get: function () { return ast_js_2.AST; } }));
    +var escape_js_2 = __nccwpck_require__(2804);
    +Object.defineProperty(exports, "escape", ({ enumerable: true, get: function () { return escape_js_2.escape; } }));
    +var unescape_js_2 = __nccwpck_require__(5698);
    +Object.defineProperty(exports, "unescape", ({ enumerable: true, get: function () { return unescape_js_2.unescape; } }));
    +/* c8 ignore stop */
    +exports.minimatch.AST = ast_js_1.AST;
    +exports.minimatch.Minimatch = Minimatch;
    +exports.minimatch.escape = escape_js_1.escape;
    +exports.minimatch.unescape = unescape_js_1.unescape;
    +//# sourceMappingURL=index.js.map
    +
    +/***/ }),
     
    -                    // 1. Let buffer be the result of peeking three bytes from
    -                    //    ioQueue, converted to a byte sequence.
    +/***/ 5698:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                    // 2. If buffer is 0xEF 0xBB 0xBF, then read three
    -                    //    bytes from ioQueue. (Do nothing with those bytes.)
    -                    if (buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {
    -                        buffer = buffer.subarray(3)
    -                    }
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.unescape = void 0;
    +/**
    + * Un-escape a string that has been escaped with {@link escape}.
    + *
    + * If the {@link windowsPathsNoEscape} option is used, then square-brace
    + * escapes are removed, but not backslash escapes.  For example, it will turn
    + * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
    + * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
    + *
    + * When `windowsPathsNoEscape` is not set, then both brace escapes and
    + * backslash escapes are removed.
    + *
    + * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
    + * or unescaped.
    + */
    +const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
    +    return windowsPathsNoEscape
    +        ? s.replace(/\[([^\/\\])\]/g, '$1')
    +        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
    +};
    +exports.unescape = unescape;
    +//# sourceMappingURL=unescape.js.map
     
    -                    // 3. Process a queue with an instance of UTF-8’s
    -                    //    decoder, ioQueue, output, and "replacement".
    -                    const output = textDecoder.decode(buffer)
    +/***/ }),
     
    -                    // 4. Return output.
    -                    return output
    -                }
    +/***/ 499:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
     
    -                /**
    -                 * @see https://infra.spec.whatwg.org/#parse-json-bytes-to-a-javascript-value
    -                 * @param {Uint8Array} bytes
    -                 */
    -                function parseJSONFromBytes(bytes) {
    -                    return JSON.parse(utf8DecodeBytes(bytes))
    -                }
    +"use strict";
     
    -                /**
    -                 * @see https://fetch.spec.whatwg.org/#concept-body-mime-type
    -                 * @param {import('./response').Response|import('./request').Request} object
    -                 */
    -                function bodyMimeType(object) {
    -                    const { headersList } = object[kState]
    -                    const contentType = headersList.get('content-type')
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.constants = void 0;
    +// Update with any zlib constants that are added or changed in the future.
    +// Node v6 didn't export this, so we just hard code the version and rely
    +// on all the other hard-coded values from zlib v4736.  When node v6
    +// support drops, we can just export the realZlibConstants object.
    +const zlib_1 = __importDefault(__nccwpck_require__(9796));
    +/* c8 ignore start */
    +const realZlibConstants = zlib_1.default.constants || { ZLIB_VERNUM: 4736 };
    +/* c8 ignore stop */
    +exports.constants = Object.freeze(Object.assign(Object.create(null), {
    +    Z_NO_FLUSH: 0,
    +    Z_PARTIAL_FLUSH: 1,
    +    Z_SYNC_FLUSH: 2,
    +    Z_FULL_FLUSH: 3,
    +    Z_FINISH: 4,
    +    Z_BLOCK: 5,
    +    Z_OK: 0,
    +    Z_STREAM_END: 1,
    +    Z_NEED_DICT: 2,
    +    Z_ERRNO: -1,
    +    Z_STREAM_ERROR: -2,
    +    Z_DATA_ERROR: -3,
    +    Z_MEM_ERROR: -4,
    +    Z_BUF_ERROR: -5,
    +    Z_VERSION_ERROR: -6,
    +    Z_NO_COMPRESSION: 0,
    +    Z_BEST_SPEED: 1,
    +    Z_BEST_COMPRESSION: 9,
    +    Z_DEFAULT_COMPRESSION: -1,
    +    Z_FILTERED: 1,
    +    Z_HUFFMAN_ONLY: 2,
    +    Z_RLE: 3,
    +    Z_FIXED: 4,
    +    Z_DEFAULT_STRATEGY: 0,
    +    DEFLATE: 1,
    +    INFLATE: 2,
    +    GZIP: 3,
    +    GUNZIP: 4,
    +    DEFLATERAW: 5,
    +    INFLATERAW: 6,
    +    UNZIP: 7,
    +    BROTLI_DECODE: 8,
    +    BROTLI_ENCODE: 9,
    +    Z_MIN_WINDOWBITS: 8,
    +    Z_MAX_WINDOWBITS: 15,
    +    Z_DEFAULT_WINDOWBITS: 15,
    +    Z_MIN_CHUNK: 64,
    +    Z_MAX_CHUNK: Infinity,
    +    Z_DEFAULT_CHUNK: 16384,
    +    Z_MIN_MEMLEVEL: 1,
    +    Z_MAX_MEMLEVEL: 9,
    +    Z_DEFAULT_MEMLEVEL: 8,
    +    Z_MIN_LEVEL: -1,
    +    Z_MAX_LEVEL: 9,
    +    Z_DEFAULT_LEVEL: -1,
    +    BROTLI_OPERATION_PROCESS: 0,
    +    BROTLI_OPERATION_FLUSH: 1,
    +    BROTLI_OPERATION_FINISH: 2,
    +    BROTLI_OPERATION_EMIT_METADATA: 3,
    +    BROTLI_MODE_GENERIC: 0,
    +    BROTLI_MODE_TEXT: 1,
    +    BROTLI_MODE_FONT: 2,
    +    BROTLI_DEFAULT_MODE: 0,
    +    BROTLI_MIN_QUALITY: 0,
    +    BROTLI_MAX_QUALITY: 11,
    +    BROTLI_DEFAULT_QUALITY: 11,
    +    BROTLI_MIN_WINDOW_BITS: 10,
    +    BROTLI_MAX_WINDOW_BITS: 24,
    +    BROTLI_LARGE_MAX_WINDOW_BITS: 30,
    +    BROTLI_DEFAULT_WINDOW: 22,
    +    BROTLI_MIN_INPUT_BLOCK_BITS: 16,
    +    BROTLI_MAX_INPUT_BLOCK_BITS: 24,
    +    BROTLI_PARAM_MODE: 0,
    +    BROTLI_PARAM_QUALITY: 1,
    +    BROTLI_PARAM_LGWIN: 2,
    +    BROTLI_PARAM_LGBLOCK: 3,
    +    BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: 4,
    +    BROTLI_PARAM_SIZE_HINT: 5,
    +    BROTLI_PARAM_LARGE_WINDOW: 6,
    +    BROTLI_PARAM_NPOSTFIX: 7,
    +    BROTLI_PARAM_NDIRECT: 8,
    +    BROTLI_DECODER_RESULT_ERROR: 0,
    +    BROTLI_DECODER_RESULT_SUCCESS: 1,
    +    BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: 2,
    +    BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: 3,
    +    BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: 0,
    +    BROTLI_DECODER_PARAM_LARGE_WINDOW: 1,
    +    BROTLI_DECODER_NO_ERROR: 0,
    +    BROTLI_DECODER_SUCCESS: 1,
    +    BROTLI_DECODER_NEEDS_MORE_INPUT: 2,
    +    BROTLI_DECODER_NEEDS_MORE_OUTPUT: 3,
    +    BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: -1,
    +    BROTLI_DECODER_ERROR_FORMAT_RESERVED: -2,
    +    BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: -3,
    +    BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: -4,
    +    BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: -5,
    +    BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: -6,
    +    BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: -7,
    +    BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: -8,
    +    BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: -9,
    +    BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: -10,
    +    BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: -11,
    +    BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: -12,
    +    BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: -13,
    +    BROTLI_DECODER_ERROR_FORMAT_PADDING_1: -14,
    +    BROTLI_DECODER_ERROR_FORMAT_PADDING_2: -15,
    +    BROTLI_DECODER_ERROR_FORMAT_DISTANCE: -16,
    +    BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: -19,
    +    BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: -20,
    +    BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: -21,
    +    BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: -22,
    +    BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: -25,
    +    BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: -26,
    +    BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: -27,
    +    BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: -30,
    +    BROTLI_DECODER_ERROR_UNREACHABLE: -31,
    +}, realZlibConstants));
    +//# sourceMappingURL=constants.js.map
    +
    +/***/ }),
     
    -                    if (contentType === null) {
    -                        return 'failure'
    -                    }
    +/***/ 6139:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
     
    -                    return parseMIMEType(contentType)
    -                }
    +"use strict";
     
    -                module.exports = {
    -                    extractBody,
    -                    safelyExtractBody,
    -                    cloneBody,
    -                    mixinBody
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.BrotliDecompress = exports.BrotliCompress = exports.Brotli = exports.Unzip = exports.InflateRaw = exports.DeflateRaw = exports.Gunzip = exports.Gzip = exports.Inflate = exports.Deflate = exports.Zlib = exports.ZlibError = exports.constants = void 0;
    +const assert_1 = __importDefault(__nccwpck_require__(9491));
    +const buffer_1 = __nccwpck_require__(4300);
    +const minipass_1 = __nccwpck_require__(4824);
    +const zlib_1 = __importDefault(__nccwpck_require__(9796));
    +const constants_js_1 = __nccwpck_require__(499);
    +var constants_js_2 = __nccwpck_require__(499);
    +Object.defineProperty(exports, "constants", ({ enumerable: true, get: function () { return constants_js_2.constants; } }));
    +const OriginalBufferConcat = buffer_1.Buffer.concat;
    +const _superWrite = Symbol('_superWrite');
    +class ZlibError extends Error {
    +    code;
    +    errno;
    +    constructor(err) {
    +        super('zlib: ' + err.message);
    +        this.code = err.code;
    +        this.errno = err.errno;
    +        /* c8 ignore next */
    +        if (!this.code)
    +            this.code = 'ZLIB_ERROR';
    +        this.message = 'zlib: ' + err.message;
    +        Error.captureStackTrace(this, this.constructor);
    +    }
    +    get name() {
    +        return 'ZlibError';
    +    }
    +}
    +exports.ZlibError = ZlibError;
    +// the Zlib class they all inherit from
    +// This thing manages the queue of requests, and returns
    +// true or false if there is anything in the queue when
    +// you call the .write() method.
    +const _flushFlag = Symbol('flushFlag');
    +class ZlibBase extends minipass_1.Minipass {
    +    #sawError = false;
    +    #ended = false;
    +    #flushFlag;
    +    #finishFlushFlag;
    +    #fullFlushFlag;
    +    #handle;
    +    #onError;
    +    get sawError() {
    +        return this.#sawError;
    +    }
    +    get handle() {
    +        return this.#handle;
    +    }
    +    /* c8 ignore start */
    +    get flushFlag() {
    +        return this.#flushFlag;
    +    }
    +    /* c8 ignore stop */
    +    constructor(opts, mode) {
    +        if (!opts || typeof opts !== 'object')
    +            throw new TypeError('invalid options for ZlibBase constructor');
    +        //@ts-ignore
    +        super(opts);
    +        /* c8 ignore start */
    +        this.#flushFlag = opts.flush ?? 0;
    +        this.#finishFlushFlag = opts.finishFlush ?? 0;
    +        this.#fullFlushFlag = opts.fullFlushFlag ?? 0;
    +        /* c8 ignore stop */
    +        // this will throw if any options are invalid for the class selected
    +        try {
    +            // @types/node doesn't know that it exports the classes, but they're there
    +            //@ts-ignore
    +            this.#handle = new zlib_1.default[mode](opts);
    +        }
    +        catch (er) {
    +            // make sure that all errors get decorated properly
    +            throw new ZlibError(er);
    +        }
    +        this.#onError = err => {
    +            // no sense raising multiple errors, since we abort on the first one.
    +            if (this.#sawError)
    +                return;
    +            this.#sawError = true;
    +            // there is no way to cleanly recover.
    +            // continuing only obscures problems.
    +            this.close();
    +            this.emit('error', err);
    +        };
    +        this.#handle?.on('error', er => this.#onError(new ZlibError(er)));
    +        this.once('end', () => this.close);
    +    }
    +    close() {
    +        if (this.#handle) {
    +            this.#handle.close();
    +            this.#handle = undefined;
    +            this.emit('close');
    +        }
    +    }
    +    reset() {
    +        if (!this.#sawError) {
    +            (0, assert_1.default)(this.#handle, 'zlib binding closed');
    +            //@ts-ignore
    +            return this.#handle.reset?.();
    +        }
    +    }
    +    flush(flushFlag) {
    +        if (this.ended)
    +            return;
    +        if (typeof flushFlag !== 'number')
    +            flushFlag = this.#fullFlushFlag;
    +        this.write(Object.assign(buffer_1.Buffer.alloc(0), { [_flushFlag]: flushFlag }));
    +    }
    +    end(chunk, encoding, cb) {
    +        /* c8 ignore start */
    +        if (typeof chunk === 'function') {
    +            cb = chunk;
    +            encoding = undefined;
    +            chunk = undefined;
    +        }
    +        if (typeof encoding === 'function') {
    +            cb = encoding;
    +            encoding = undefined;
    +        }
    +        /* c8 ignore stop */
    +        if (chunk) {
    +            if (encoding)
    +                this.write(chunk, encoding);
    +            else
    +                this.write(chunk);
    +        }
    +        this.flush(this.#finishFlushFlag);
    +        this.#ended = true;
    +        return super.end(cb);
    +    }
    +    get ended() {
    +        return this.#ended;
    +    }
    +    // overridden in the gzip classes to do portable writes
    +    [_superWrite](data) {
    +        return super.write(data);
    +    }
    +    write(chunk, encoding, cb) {
    +        // process the chunk using the sync process
    +        // then super.write() all the outputted chunks
    +        if (typeof encoding === 'function')
    +            (cb = encoding), (encoding = 'utf8');
    +        if (typeof chunk === 'string')
    +            chunk = buffer_1.Buffer.from(chunk, encoding);
    +        if (this.#sawError)
    +            return;
    +        (0, assert_1.default)(this.#handle, 'zlib binding closed');
    +        // _processChunk tries to .close() the native handle after it's done, so we
    +        // intercept that by temporarily making it a no-op.
    +        // diving into the node:zlib internals a bit here
    +        const nativeHandle = this.#handle
    +            ._handle;
    +        const originalNativeClose = nativeHandle.close;
    +        nativeHandle.close = () => { };
    +        const originalClose = this.#handle.close;
    +        this.#handle.close = () => { };
    +        // It also calls `Buffer.concat()` at the end, which may be convenient
    +        // for some, but which we are not interested in as it slows us down.
    +        buffer_1.Buffer.concat = args => args;
    +        let result = undefined;
    +        try {
    +            const flushFlag = typeof chunk[_flushFlag] === 'number'
    +                ? chunk[_flushFlag]
    +                : this.#flushFlag;
    +            result = this.#handle._processChunk(chunk, flushFlag);
    +            // if we don't throw, reset it back how it was
    +            buffer_1.Buffer.concat = OriginalBufferConcat;
    +        }
    +        catch (err) {
    +            // or if we do, put Buffer.concat() back before we emit error
    +            // Error events call into user code, which may call Buffer.concat()
    +            buffer_1.Buffer.concat = OriginalBufferConcat;
    +            this.#onError(new ZlibError(err));
    +        }
    +        finally {
    +            if (this.#handle) {
    +                // Core zlib resets `_handle` to null after attempting to close the
    +                // native handle. Our no-op handler prevented actual closure, but we
    +                // need to restore the `._handle` property.
    +                ;
    +                this.#handle._handle =
    +                    nativeHandle;
    +                nativeHandle.close = originalNativeClose;
    +                this.#handle.close = originalClose;
    +                // `_processChunk()` adds an 'error' listener. If we don't remove it
    +                // after each call, these handlers start piling up.
    +                this.#handle.removeAllListeners('error');
    +                // make sure OUR error listener is still attached tho
    +            }
    +        }
    +        if (this.#handle)
    +            this.#handle.on('error', er => this.#onError(new ZlibError(er)));
    +        let writeReturn;
    +        if (result) {
    +            if (Array.isArray(result) && result.length > 0) {
    +                const r = result[0];
    +                // The first buffer is always `handle._outBuffer`, which would be
    +                // re-used for later invocations; so, we always have to copy that one.
    +                writeReturn = this[_superWrite](buffer_1.Buffer.from(r));
    +                for (let i = 1; i < result.length; i++) {
    +                    writeReturn = this[_superWrite](result[i]);
    +                }
    +            }
    +            else {
    +                // either a single Buffer or an empty array
    +                writeReturn = this[_superWrite](buffer_1.Buffer.from(result));
    +            }
    +        }
    +        if (cb)
    +            cb();
    +        return writeReturn;
    +    }
    +}
    +class Zlib extends ZlibBase {
    +    #level;
    +    #strategy;
    +    constructor(opts, mode) {
    +        opts = opts || {};
    +        opts.flush = opts.flush || constants_js_1.constants.Z_NO_FLUSH;
    +        opts.finishFlush = opts.finishFlush || constants_js_1.constants.Z_FINISH;
    +        opts.fullFlushFlag = constants_js_1.constants.Z_FULL_FLUSH;
    +        super(opts, mode);
    +        this.#level = opts.level;
    +        this.#strategy = opts.strategy;
    +    }
    +    params(level, strategy) {
    +        if (this.sawError)
    +            return;
    +        if (!this.handle)
    +            throw new Error('cannot switch params when binding is closed');
    +        // no way to test this without also not supporting params at all
    +        /* c8 ignore start */
    +        if (!this.handle.params)
    +            throw new Error('not supported in this implementation');
    +        /* c8 ignore stop */
    +        if (this.#level !== level || this.#strategy !== strategy) {
    +            this.flush(constants_js_1.constants.Z_SYNC_FLUSH);
    +            (0, assert_1.default)(this.handle, 'zlib binding closed');
    +            // .params() calls .flush(), but the latter is always async in the
    +            // core zlib. We override .flush() temporarily to intercept that and
    +            // flush synchronously.
    +            const origFlush = this.handle.flush;
    +            this.handle.flush = (flushFlag, cb) => {
    +                /* c8 ignore start */
    +                if (typeof flushFlag === 'function') {
    +                    cb = flushFlag;
    +                    flushFlag = this.flushFlag;
                     }
    +                /* c8 ignore stop */
    +                this.flush(flushFlag);
    +                cb?.();
    +            };
    +            try {
    +                ;
    +                this.handle.params(level, strategy);
    +            }
    +            finally {
    +                this.handle.flush = origFlush;
    +            }
    +            /* c8 ignore start */
    +            if (this.handle) {
    +                this.#level = level;
    +                this.#strategy = strategy;
    +            }
    +            /* c8 ignore stop */
    +        }
    +    }
    +}
    +exports.Zlib = Zlib;
    +// minimal 2-byte header
    +class Deflate extends Zlib {
    +    constructor(opts) {
    +        super(opts, 'Deflate');
    +    }
    +}
    +exports.Deflate = Deflate;
    +class Inflate extends Zlib {
    +    constructor(opts) {
    +        super(opts, 'Inflate');
    +    }
    +}
    +exports.Inflate = Inflate;
    +class Gzip extends Zlib {
    +    #portable;
    +    constructor(opts) {
    +        super(opts, 'Gzip');
    +        this.#portable = opts && !!opts.portable;
    +    }
    +    [_superWrite](data) {
    +        if (!this.#portable)
    +            return super[_superWrite](data);
    +        // we'll always get the header emitted in one first chunk
    +        // overwrite the OS indicator byte with 0xFF
    +        this.#portable = false;
    +        data[9] = 255;
    +        return super[_superWrite](data);
    +    }
    +}
    +exports.Gzip = Gzip;
    +class Gunzip extends Zlib {
    +    constructor(opts) {
    +        super(opts, 'Gunzip');
    +    }
    +}
    +exports.Gunzip = Gunzip;
    +// raw - no header
    +class DeflateRaw extends Zlib {
    +    constructor(opts) {
    +        super(opts, 'DeflateRaw');
    +    }
    +}
    +exports.DeflateRaw = DeflateRaw;
    +class InflateRaw extends Zlib {
    +    constructor(opts) {
    +        super(opts, 'InflateRaw');
    +    }
    +}
    +exports.InflateRaw = InflateRaw;
    +// auto-detect header.
    +class Unzip extends Zlib {
    +    constructor(opts) {
    +        super(opts, 'Unzip');
    +    }
    +}
    +exports.Unzip = Unzip;
    +class Brotli extends ZlibBase {
    +    constructor(opts, mode) {
    +        opts = opts || {};
    +        opts.flush = opts.flush || constants_js_1.constants.BROTLI_OPERATION_PROCESS;
    +        opts.finishFlush =
    +            opts.finishFlush || constants_js_1.constants.BROTLI_OPERATION_FINISH;
    +        opts.fullFlushFlag = constants_js_1.constants.BROTLI_OPERATION_FLUSH;
    +        super(opts, mode);
    +    }
    +}
    +exports.Brotli = Brotli;
    +class BrotliCompress extends Brotli {
    +    constructor(opts) {
    +        super(opts, 'BrotliCompress');
    +    }
    +}
    +exports.BrotliCompress = BrotliCompress;
    +class BrotliDecompress extends Brotli {
    +    constructor(opts) {
    +        super(opts, 'BrotliDecompress');
    +    }
    +}
    +exports.BrotliDecompress = BrotliDecompress;
    +//# sourceMappingURL=index.js.map
     
    +/***/ }),
     
    -                /***/
    -}),
    +/***/ 4824:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
     
    -/***/ 1037:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    +"use strict";
     
    -                "use strict";
    -
    -
    -                const { MessageChannel, receiveMessageOnPort } = __nccwpck_require__(1267)
    -
    -                const corsSafeListedMethods = ['GET', 'HEAD', 'POST']
    -                const corsSafeListedMethodsSet = new Set(corsSafeListedMethods)
    -
    -                const nullBodyStatus = [101, 204, 205, 304]
    -
    -                const redirectStatus = [301, 302, 303, 307, 308]
    -                const redirectStatusSet = new Set(redirectStatus)
    -
    -                // https://fetch.spec.whatwg.org/#block-bad-port
    -                const badPorts = [
    -                    '1', '7', '9', '11', '13', '15', '17', '19', '20', '21', '22', '23', '25', '37', '42', '43', '53', '69', '77', '79',
    -                    '87', '95', '101', '102', '103', '104', '109', '110', '111', '113', '115', '117', '119', '123', '135', '137',
    -                    '139', '143', '161', '179', '389', '427', '465', '512', '513', '514', '515', '526', '530', '531', '532',
    -                    '540', '548', '554', '556', '563', '587', '601', '636', '989', '990', '993', '995', '1719', '1720', '1723',
    -                    '2049', '3659', '4045', '5060', '5061', '6000', '6566', '6665', '6666', '6667', '6668', '6669', '6697',
    -                    '10080'
    -                ]
    -
    -                const badPortsSet = new Set(badPorts)
    -
    -                // https://w3c.github.io/webappsec-referrer-policy/#referrer-policies
    -                const referrerPolicy = [
    -                    '',
    -                    'no-referrer',
    -                    'no-referrer-when-downgrade',
    -                    'same-origin',
    -                    'origin',
    -                    'strict-origin',
    -                    'origin-when-cross-origin',
    -                    'strict-origin-when-cross-origin',
    -                    'unsafe-url'
    -                ]
    -                const referrerPolicySet = new Set(referrerPolicy)
    -
    -                const requestRedirect = ['follow', 'manual', 'error']
    -
    -                const safeMethods = ['GET', 'HEAD', 'OPTIONS', 'TRACE']
    -                const safeMethodsSet = new Set(safeMethods)
    -
    -                const requestMode = ['navigate', 'same-origin', 'no-cors', 'cors']
    -
    -                const requestCredentials = ['omit', 'same-origin', 'include']
    -
    -                const requestCache = [
    -                    'default',
    -                    'no-store',
    -                    'reload',
    -                    'no-cache',
    -                    'force-cache',
    -                    'only-if-cached'
    -                ]
    -
    -                // https://fetch.spec.whatwg.org/#request-body-header-name
    -                const requestBodyHeader = [
    -                    'content-encoding',
    -                    'content-language',
    -                    'content-location',
    -                    'content-type',
    -                    // See https://github.com/nodejs/undici/issues/2021
    -                    // 'Content-Length' is a forbidden header name, which is typically
    -                    // removed in the Headers implementation. However, undici doesn't
    -                    // filter out headers, so we add it here.
    -                    'content-length'
    -                ]
    -
    -                // https://fetch.spec.whatwg.org/#enumdef-requestduplex
    -                const requestDuplex = [
    -                    'half'
    -                ]
    -
    -                // http://fetch.spec.whatwg.org/#forbidden-method
    -                const forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK']
    -                const forbiddenMethodsSet = new Set(forbiddenMethods)
    -
    -                const subresource = [
    -                    'audio',
    -                    'audioworklet',
    -                    'font',
    -                    'image',
    -                    'manifest',
    -                    'paintworklet',
    -                    'script',
    -                    'style',
    -                    'track',
    -                    'video',
    -                    'xslt',
    -                    ''
    -                ]
    -                const subresourceSet = new Set(subresource)
    -
    -                /** @type {globalThis['DOMException']} */
    -                const DOMException = globalThis.DOMException ?? (() => {
    -                    // DOMException was only made a global in Node v17.0.0,
    -                    // but fetch supports >= v16.8.
    -                    try {
    -                        atob('~')
    -                    } catch (err) {
    -                        return Object.getPrototypeOf(err).constructor
    -                    }
    -                })()
    -
    -                let channel
    -
    -                /** @type {globalThis['structuredClone']} */
    -                const structuredClone =
    -                    globalThis.structuredClone ??
    -                    // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js
    -                    // structuredClone was added in v17.0.0, but fetch supports v16.8
    -                    function structuredClone(value, options = undefined) {
    -                        if (arguments.length === 0) {
    -                            throw new TypeError('missing argument')
    -                        }
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.Minipass = exports.isWritable = exports.isReadable = exports.isStream = void 0;
    +const proc = typeof process === 'object' && process
    +    ? process
    +    : {
    +        stdout: null,
    +        stderr: null,
    +    };
    +const events_1 = __nccwpck_require__(2361);
    +const stream_1 = __importDefault(__nccwpck_require__(2781));
    +const string_decoder_1 = __nccwpck_require__(1576);
    +/**
    + * Return true if the argument is a Minipass stream, Node stream, or something
    + * else that Minipass can interact with.
    + */
    +const isStream = (s) => !!s &&
    +    typeof s === 'object' &&
    +    (s instanceof Minipass ||
    +        s instanceof stream_1.default ||
    +        (0, exports.isReadable)(s) ||
    +        (0, exports.isWritable)(s));
    +exports.isStream = isStream;
    +/**
    + * Return true if the argument is a valid {@link Minipass.Readable}
    + */
    +const isReadable = (s) => !!s &&
    +    typeof s === 'object' &&
    +    s instanceof events_1.EventEmitter &&
    +    typeof s.pipe === 'function' &&
    +    // node core Writable streams have a pipe() method, but it throws
    +    s.pipe !== stream_1.default.Writable.prototype.pipe;
    +exports.isReadable = isReadable;
    +/**
    + * Return true if the argument is a valid {@link Minipass.Writable}
    + */
    +const isWritable = (s) => !!s &&
    +    typeof s === 'object' &&
    +    s instanceof events_1.EventEmitter &&
    +    typeof s.write === 'function' &&
    +    typeof s.end === 'function';
    +exports.isWritable = isWritable;
    +const EOF = Symbol('EOF');
    +const MAYBE_EMIT_END = Symbol('maybeEmitEnd');
    +const EMITTED_END = Symbol('emittedEnd');
    +const EMITTING_END = Symbol('emittingEnd');
    +const EMITTED_ERROR = Symbol('emittedError');
    +const CLOSED = Symbol('closed');
    +const READ = Symbol('read');
    +const FLUSH = Symbol('flush');
    +const FLUSHCHUNK = Symbol('flushChunk');
    +const ENCODING = Symbol('encoding');
    +const DECODER = Symbol('decoder');
    +const FLOWING = Symbol('flowing');
    +const PAUSED = Symbol('paused');
    +const RESUME = Symbol('resume');
    +const BUFFER = Symbol('buffer');
    +const PIPES = Symbol('pipes');
    +const BUFFERLENGTH = Symbol('bufferLength');
    +const BUFFERPUSH = Symbol('bufferPush');
    +const BUFFERSHIFT = Symbol('bufferShift');
    +const OBJECTMODE = Symbol('objectMode');
    +// internal event when stream is destroyed
    +const DESTROYED = Symbol('destroyed');
    +// internal event when stream has an error
    +const ERROR = Symbol('error');
    +const EMITDATA = Symbol('emitData');
    +const EMITEND = Symbol('emitEnd');
    +const EMITEND2 = Symbol('emitEnd2');
    +const ASYNC = Symbol('async');
    +const ABORT = Symbol('abort');
    +const ABORTED = Symbol('aborted');
    +const SIGNAL = Symbol('signal');
    +const DATALISTENERS = Symbol('dataListeners');
    +const DISCARDED = Symbol('discarded');
    +const defer = (fn) => Promise.resolve().then(fn);
    +const nodefer = (fn) => fn();
    +const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish';
    +const isArrayBufferLike = (b) => b instanceof ArrayBuffer ||
    +    (!!b &&
    +        typeof b === 'object' &&
    +        b.constructor &&
    +        b.constructor.name === 'ArrayBuffer' &&
    +        b.byteLength >= 0);
    +const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b);
    +/**
    + * Internal class representing a pipe to a destination stream.
    + *
    + * @internal
    + */
    +class Pipe {
    +    src;
    +    dest;
    +    opts;
    +    ondrain;
    +    constructor(src, dest, opts) {
    +        this.src = src;
    +        this.dest = dest;
    +        this.opts = opts;
    +        this.ondrain = () => src[RESUME]();
    +        this.dest.on('drain', this.ondrain);
    +    }
    +    unpipe() {
    +        this.dest.removeListener('drain', this.ondrain);
    +    }
    +    // only here for the prototype
    +    /* c8 ignore start */
    +    proxyErrors(_er) { }
    +    /* c8 ignore stop */
    +    end() {
    +        this.unpipe();
    +        if (this.opts.end)
    +            this.dest.end();
    +    }
    +}
    +/**
    + * Internal class representing a pipe to a destination stream where
    + * errors are proxied.
    + *
    + * @internal
    + */
    +class PipeProxyErrors extends Pipe {
    +    unpipe() {
    +        this.src.removeListener('error', this.proxyErrors);
    +        super.unpipe();
    +    }
    +    constructor(src, dest, opts) {
    +        super(src, dest, opts);
    +        this.proxyErrors = er => dest.emit('error', er);
    +        src.on('error', this.proxyErrors);
    +    }
    +}
    +const isObjectModeOptions = (o) => !!o.objectMode;
    +const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer';
    +/**
    + * Main export, the Minipass class
    + *
    + * `RType` is the type of data emitted, defaults to Buffer
    + *
    + * `WType` is the type of data to be written, if RType is buffer or string,
    + * then any {@link Minipass.ContiguousData} is allowed.
    + *
    + * `Events` is the set of event handler signatures that this object
    + * will emit, see {@link Minipass.Events}
    + */
    +class Minipass extends events_1.EventEmitter {
    +    [FLOWING] = false;
    +    [PAUSED] = false;
    +    [PIPES] = [];
    +    [BUFFER] = [];
    +    [OBJECTMODE];
    +    [ENCODING];
    +    [ASYNC];
    +    [DECODER];
    +    [EOF] = false;
    +    [EMITTED_END] = false;
    +    [EMITTING_END] = false;
    +    [CLOSED] = false;
    +    [EMITTED_ERROR] = null;
    +    [BUFFERLENGTH] = 0;
    +    [DESTROYED] = false;
    +    [SIGNAL];
    +    [ABORTED] = false;
    +    [DATALISTENERS] = 0;
    +    [DISCARDED] = false;
    +    /**
    +     * true if the stream can be written
    +     */
    +    writable = true;
    +    /**
    +     * true if the stream can be read
    +     */
    +    readable = true;
    +    /**
    +     * If `RType` is Buffer, then options do not need to be provided.
    +     * Otherwise, an options object must be provided to specify either
    +     * {@link Minipass.SharedOptions.objectMode} or
    +     * {@link Minipass.SharedOptions.encoding}, as appropriate.
    +     */
    +    constructor(...args) {
    +        const options = (args[0] ||
    +            {});
    +        super();
    +        if (options.objectMode && typeof options.encoding === 'string') {
    +            throw new TypeError('Encoding and objectMode may not be used together');
    +        }
    +        if (isObjectModeOptions(options)) {
    +            this[OBJECTMODE] = true;
    +            this[ENCODING] = null;
    +        }
    +        else if (isEncodingOptions(options)) {
    +            this[ENCODING] = options.encoding;
    +            this[OBJECTMODE] = false;
    +        }
    +        else {
    +            this[OBJECTMODE] = false;
    +            this[ENCODING] = null;
    +        }
    +        this[ASYNC] = !!options.async;
    +        this[DECODER] = this[ENCODING]
    +            ? new string_decoder_1.StringDecoder(this[ENCODING])
    +            : null;
    +        //@ts-ignore - private option for debugging and testing
    +        if (options && options.debugExposeBuffer === true) {
    +            Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] });
    +        }
    +        //@ts-ignore - private option for debugging and testing
    +        if (options && options.debugExposePipes === true) {
    +            Object.defineProperty(this, 'pipes', { get: () => this[PIPES] });
    +        }
    +        const { signal } = options;
    +        if (signal) {
    +            this[SIGNAL] = signal;
    +            if (signal.aborted) {
    +                this[ABORT]();
    +            }
    +            else {
    +                signal.addEventListener('abort', () => this[ABORT]());
    +            }
    +        }
    +    }
    +    /**
    +     * The amount of data stored in the buffer waiting to be read.
    +     *
    +     * For Buffer strings, this will be the total byte length.
    +     * For string encoding streams, this will be the string character length,
    +     * according to JavaScript's `string.length` logic.
    +     * For objectMode streams, this is a count of the items waiting to be
    +     * emitted.
    +     */
    +    get bufferLength() {
    +        return this[BUFFERLENGTH];
    +    }
    +    /**
    +     * The `BufferEncoding` currently in use, or `null`
    +     */
    +    get encoding() {
    +        return this[ENCODING];
    +    }
    +    /**
    +     * @deprecated - This is a read only property
    +     */
    +    set encoding(_enc) {
    +        throw new Error('Encoding must be set at instantiation time');
    +    }
    +    /**
    +     * @deprecated - Encoding may only be set at instantiation time
    +     */
    +    setEncoding(_enc) {
    +        throw new Error('Encoding must be set at instantiation time');
    +    }
    +    /**
    +     * True if this is an objectMode stream
    +     */
    +    get objectMode() {
    +        return this[OBJECTMODE];
    +    }
    +    /**
    +     * @deprecated - This is a read-only property
    +     */
    +    set objectMode(_om) {
    +        throw new Error('objectMode must be set at instantiation time');
    +    }
    +    /**
    +     * true if this is an async stream
    +     */
    +    get ['async']() {
    +        return this[ASYNC];
    +    }
    +    /**
    +     * Set to true to make this stream async.
    +     *
    +     * Once set, it cannot be unset, as this would potentially cause incorrect
    +     * behavior.  Ie, a sync stream can be made async, but an async stream
    +     * cannot be safely made sync.
    +     */
    +    set ['async'](a) {
    +        this[ASYNC] = this[ASYNC] || !!a;
    +    }
    +    // drop everything and get out of the flow completely
    +    [ABORT]() {
    +        this[ABORTED] = true;
    +        this.emit('abort', this[SIGNAL]?.reason);
    +        this.destroy(this[SIGNAL]?.reason);
    +    }
    +    /**
    +     * True if the stream has been aborted.
    +     */
    +    get aborted() {
    +        return this[ABORTED];
    +    }
    +    /**
    +     * No-op setter. Stream aborted status is set via the AbortSignal provided
    +     * in the constructor options.
    +     */
    +    set aborted(_) { }
    +    write(chunk, encoding, cb) {
    +        if (this[ABORTED])
    +            return false;
    +        if (this[EOF])
    +            throw new Error('write after end');
    +        if (this[DESTROYED]) {
    +            this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' }));
    +            return true;
    +        }
    +        if (typeof encoding === 'function') {
    +            cb = encoding;
    +            encoding = 'utf8';
    +        }
    +        if (!encoding)
    +            encoding = 'utf8';
    +        const fn = this[ASYNC] ? defer : nodefer;
    +        // convert array buffers and typed array views into buffers
    +        // at some point in the future, we may want to do the opposite!
    +        // leave strings and buffers as-is
    +        // anything is only allowed if in object mode, so throw
    +        if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
    +            if (isArrayBufferView(chunk)) {
    +                //@ts-ignore - sinful unsafe type changing
    +                chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
    +            }
    +            else if (isArrayBufferLike(chunk)) {
    +                //@ts-ignore - sinful unsafe type changing
    +                chunk = Buffer.from(chunk);
    +            }
    +            else if (typeof chunk !== 'string') {
    +                throw new Error('Non-contiguous data written to non-objectMode stream');
    +            }
    +        }
    +        // handle object mode up front, since it's simpler
    +        // this yields better performance, fewer checks later.
    +        if (this[OBJECTMODE]) {
    +            // maybe impossible?
    +            /* c8 ignore start */
    +            if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    +                this[FLUSH](true);
    +            /* c8 ignore stop */
    +            if (this[FLOWING])
    +                this.emit('data', chunk);
    +            else
    +                this[BUFFERPUSH](chunk);
    +            if (this[BUFFERLENGTH] !== 0)
    +                this.emit('readable');
    +            if (cb)
    +                fn(cb);
    +            return this[FLOWING];
    +        }
    +        // at this point the chunk is a buffer or string
    +        // don't buffer it up or send it to the decoder
    +        if (!chunk.length) {
    +            if (this[BUFFERLENGTH] !== 0)
    +                this.emit('readable');
    +            if (cb)
    +                fn(cb);
    +            return this[FLOWING];
    +        }
    +        // fast-path writing strings of same encoding to a stream with
    +        // an empty buffer, skipping the buffer/decoder dance
    +        if (typeof chunk === 'string' &&
    +            // unless it is a string already ready for us to use
    +            !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) {
    +            //@ts-ignore - sinful unsafe type change
    +            chunk = Buffer.from(chunk, encoding);
    +        }
    +        if (Buffer.isBuffer(chunk) && this[ENCODING]) {
    +            //@ts-ignore - sinful unsafe type change
    +            chunk = this[DECODER].write(chunk);
    +        }
    +        // Note: flushing CAN potentially switch us into not-flowing mode
    +        if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    +            this[FLUSH](true);
    +        if (this[FLOWING])
    +            this.emit('data', chunk);
    +        else
    +            this[BUFFERPUSH](chunk);
    +        if (this[BUFFERLENGTH] !== 0)
    +            this.emit('readable');
    +        if (cb)
    +            fn(cb);
    +        return this[FLOWING];
    +    }
    +    /**
    +     * Low-level explicit read method.
    +     *
    +     * In objectMode, the argument is ignored, and one item is returned if
    +     * available.
    +     *
    +     * `n` is the number of bytes (or in the case of encoding streams,
    +     * characters) to consume. If `n` is not provided, then the entire buffer
    +     * is returned, or `null` is returned if no data is available.
    +     *
    +     * If `n` is greater that the amount of data in the internal buffer,
    +     * then `null` is returned.
    +     */
    +    read(n) {
    +        if (this[DESTROYED])
    +            return null;
    +        this[DISCARDED] = false;
    +        if (this[BUFFERLENGTH] === 0 ||
    +            n === 0 ||
    +            (n && n > this[BUFFERLENGTH])) {
    +            this[MAYBE_EMIT_END]();
    +            return null;
    +        }
    +        if (this[OBJECTMODE])
    +            n = null;
    +        if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
    +            // not object mode, so if we have an encoding, then RType is string
    +            // otherwise, must be Buffer
    +            this[BUFFER] = [
    +                (this[ENCODING]
    +                    ? this[BUFFER].join('')
    +                    : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])),
    +            ];
    +        }
    +        const ret = this[READ](n || null, this[BUFFER][0]);
    +        this[MAYBE_EMIT_END]();
    +        return ret;
    +    }
    +    [READ](n, chunk) {
    +        if (this[OBJECTMODE])
    +            this[BUFFERSHIFT]();
    +        else {
    +            const c = chunk;
    +            if (n === c.length || n === null)
    +                this[BUFFERSHIFT]();
    +            else if (typeof c === 'string') {
    +                this[BUFFER][0] = c.slice(n);
    +                chunk = c.slice(0, n);
    +                this[BUFFERLENGTH] -= n;
    +            }
    +            else {
    +                this[BUFFER][0] = c.subarray(n);
    +                chunk = c.subarray(0, n);
    +                this[BUFFERLENGTH] -= n;
    +            }
    +        }
    +        this.emit('data', chunk);
    +        if (!this[BUFFER].length && !this[EOF])
    +            this.emit('drain');
    +        return chunk;
    +    }
    +    end(chunk, encoding, cb) {
    +        if (typeof chunk === 'function') {
    +            cb = chunk;
    +            chunk = undefined;
    +        }
    +        if (typeof encoding === 'function') {
    +            cb = encoding;
    +            encoding = 'utf8';
    +        }
    +        if (chunk !== undefined)
    +            this.write(chunk, encoding);
    +        if (cb)
    +            this.once('end', cb);
    +        this[EOF] = true;
    +        this.writable = false;
    +        // if we haven't written anything, then go ahead and emit,
    +        // even if we're not reading.
    +        // we'll re-emit if a new 'end' listener is added anyway.
    +        // This makes MP more suitable to write-only use cases.
    +        if (this[FLOWING] || !this[PAUSED])
    +            this[MAYBE_EMIT_END]();
    +        return this;
    +    }
    +    // don't let the internal resume be overwritten
    +    [RESUME]() {
    +        if (this[DESTROYED])
    +            return;
    +        if (!this[DATALISTENERS] && !this[PIPES].length) {
    +            this[DISCARDED] = true;
    +        }
    +        this[PAUSED] = false;
    +        this[FLOWING] = true;
    +        this.emit('resume');
    +        if (this[BUFFER].length)
    +            this[FLUSH]();
    +        else if (this[EOF])
    +            this[MAYBE_EMIT_END]();
    +        else
    +            this.emit('drain');
    +    }
    +    /**
    +     * Resume the stream if it is currently in a paused state
    +     *
    +     * If called when there are no pipe destinations or `data` event listeners,
    +     * this will place the stream in a "discarded" state, where all data will
    +     * be thrown away. The discarded state is removed if a pipe destination or
    +     * data handler is added, if pause() is called, or if any synchronous or
    +     * asynchronous iteration is started.
    +     */
    +    resume() {
    +        return this[RESUME]();
    +    }
    +    /**
    +     * Pause the stream
    +     */
    +    pause() {
    +        this[FLOWING] = false;
    +        this[PAUSED] = true;
    +        this[DISCARDED] = false;
    +    }
    +    /**
    +     * true if the stream has been forcibly destroyed
    +     */
    +    get destroyed() {
    +        return this[DESTROYED];
    +    }
    +    /**
    +     * true if the stream is currently in a flowing state, meaning that
    +     * any writes will be immediately emitted.
    +     */
    +    get flowing() {
    +        return this[FLOWING];
    +    }
    +    /**
    +     * true if the stream is currently in a paused state
    +     */
    +    get paused() {
    +        return this[PAUSED];
    +    }
    +    [BUFFERPUSH](chunk) {
    +        if (this[OBJECTMODE])
    +            this[BUFFERLENGTH] += 1;
    +        else
    +            this[BUFFERLENGTH] += chunk.length;
    +        this[BUFFER].push(chunk);
    +    }
    +    [BUFFERSHIFT]() {
    +        if (this[OBJECTMODE])
    +            this[BUFFERLENGTH] -= 1;
    +        else
    +            this[BUFFERLENGTH] -= this[BUFFER][0].length;
    +        return this[BUFFER].shift();
    +    }
    +    [FLUSH](noDrain = false) {
    +        do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&
    +            this[BUFFER].length);
    +        if (!noDrain && !this[BUFFER].length && !this[EOF])
    +            this.emit('drain');
    +    }
    +    [FLUSHCHUNK](chunk) {
    +        this.emit('data', chunk);
    +        return this[FLOWING];
    +    }
    +    /**
    +     * Pipe all data emitted by this stream into the destination provided.
    +     *
    +     * Triggers the flow of data.
    +     */
    +    pipe(dest, opts) {
    +        if (this[DESTROYED])
    +            return dest;
    +        this[DISCARDED] = false;
    +        const ended = this[EMITTED_END];
    +        opts = opts || {};
    +        if (dest === proc.stdout || dest === proc.stderr)
    +            opts.end = false;
    +        else
    +            opts.end = opts.end !== false;
    +        opts.proxyErrors = !!opts.proxyErrors;
    +        // piping an ended stream ends immediately
    +        if (ended) {
    +            if (opts.end)
    +                dest.end();
    +        }
    +        else {
    +            // "as" here just ignores the WType, which pipes don't care about,
    +            // since they're only consuming from us, and writing to the dest
    +            this[PIPES].push(!opts.proxyErrors
    +                ? new Pipe(this, dest, opts)
    +                : new PipeProxyErrors(this, dest, opts));
    +            if (this[ASYNC])
    +                defer(() => this[RESUME]());
    +            else
    +                this[RESUME]();
    +        }
    +        return dest;
    +    }
    +    /**
    +     * Fully unhook a piped destination stream.
    +     *
    +     * If the destination stream was the only consumer of this stream (ie,
    +     * there are no other piped destinations or `'data'` event listeners)
    +     * then the flow of data will stop until there is another consumer or
    +     * {@link Minipass#resume} is explicitly called.
    +     */
    +    unpipe(dest) {
    +        const p = this[PIPES].find(p => p.dest === dest);
    +        if (p) {
    +            if (this[PIPES].length === 1) {
    +                if (this[FLOWING] && this[DATALISTENERS] === 0) {
    +                    this[FLOWING] = false;
    +                }
    +                this[PIPES] = [];
    +            }
    +            else
    +                this[PIPES].splice(this[PIPES].indexOf(p), 1);
    +            p.unpipe();
    +        }
    +    }
    +    /**
    +     * Alias for {@link Minipass#on}
    +     */
    +    addListener(ev, handler) {
    +        return this.on(ev, handler);
    +    }
    +    /**
    +     * Mostly identical to `EventEmitter.on`, with the following
    +     * behavior differences to prevent data loss and unnecessary hangs:
    +     *
    +     * - Adding a 'data' event handler will trigger the flow of data
    +     *
    +     * - Adding a 'readable' event handler when there is data waiting to be read
    +     *   will cause 'readable' to be emitted immediately.
    +     *
    +     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
    +     *   already passed will cause the event to be emitted immediately and all
    +     *   handlers removed.
    +     *
    +     * - Adding an 'error' event handler after an error has been emitted will
    +     *   cause the event to be re-emitted immediately with the error previously
    +     *   raised.
    +     */
    +    on(ev, handler) {
    +        const ret = super.on(ev, handler);
    +        if (ev === 'data') {
    +            this[DISCARDED] = false;
    +            this[DATALISTENERS]++;
    +            if (!this[PIPES].length && !this[FLOWING]) {
    +                this[RESUME]();
    +            }
    +        }
    +        else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {
    +            super.emit('readable');
    +        }
    +        else if (isEndish(ev) && this[EMITTED_END]) {
    +            super.emit(ev);
    +            this.removeAllListeners(ev);
    +        }
    +        else if (ev === 'error' && this[EMITTED_ERROR]) {
    +            const h = handler;
    +            if (this[ASYNC])
    +                defer(() => h.call(this, this[EMITTED_ERROR]));
    +            else
    +                h.call(this, this[EMITTED_ERROR]);
    +        }
    +        return ret;
    +    }
    +    /**
    +     * Alias for {@link Minipass#off}
    +     */
    +    removeListener(ev, handler) {
    +        return this.off(ev, handler);
    +    }
    +    /**
    +     * Mostly identical to `EventEmitter.off`
    +     *
    +     * If a 'data' event handler is removed, and it was the last consumer
    +     * (ie, there are no pipe destinations or other 'data' event listeners),
    +     * then the flow of data will stop until there is another consumer or
    +     * {@link Minipass#resume} is explicitly called.
    +     */
    +    off(ev, handler) {
    +        const ret = super.off(ev, handler);
    +        // if we previously had listeners, and now we don't, and we don't
    +        // have any pipes, then stop the flow, unless it's been explicitly
    +        // put in a discarded flowing state via stream.resume().
    +        if (ev === 'data') {
    +            this[DATALISTENERS] = this.listeners('data').length;
    +            if (this[DATALISTENERS] === 0 &&
    +                !this[DISCARDED] &&
    +                !this[PIPES].length) {
    +                this[FLOWING] = false;
    +            }
    +        }
    +        return ret;
    +    }
    +    /**
    +     * Mostly identical to `EventEmitter.removeAllListeners`
    +     *
    +     * If all 'data' event handlers are removed, and they were the last consumer
    +     * (ie, there are no pipe destinations), then the flow of data will stop
    +     * until there is another consumer or {@link Minipass#resume} is explicitly
    +     * called.
    +     */
    +    removeAllListeners(ev) {
    +        const ret = super.removeAllListeners(ev);
    +        if (ev === 'data' || ev === undefined) {
    +            this[DATALISTENERS] = 0;
    +            if (!this[DISCARDED] && !this[PIPES].length) {
    +                this[FLOWING] = false;
    +            }
    +        }
    +        return ret;
    +    }
    +    /**
    +     * true if the 'end' event has been emitted
    +     */
    +    get emittedEnd() {
    +        return this[EMITTED_END];
    +    }
    +    [MAYBE_EMIT_END]() {
    +        if (!this[EMITTING_END] &&
    +            !this[EMITTED_END] &&
    +            !this[DESTROYED] &&
    +            this[BUFFER].length === 0 &&
    +            this[EOF]) {
    +            this[EMITTING_END] = true;
    +            this.emit('end');
    +            this.emit('prefinish');
    +            this.emit('finish');
    +            if (this[CLOSED])
    +                this.emit('close');
    +            this[EMITTING_END] = false;
    +        }
    +    }
    +    /**
    +     * Mostly identical to `EventEmitter.emit`, with the following
    +     * behavior differences to prevent data loss and unnecessary hangs:
    +     *
    +     * If the stream has been destroyed, and the event is something other
    +     * than 'close' or 'error', then `false` is returned and no handlers
    +     * are called.
    +     *
    +     * If the event is 'end', and has already been emitted, then the event
    +     * is ignored. If the stream is in a paused or non-flowing state, then
    +     * the event will be deferred until data flow resumes. If the stream is
    +     * async, then handlers will be called on the next tick rather than
    +     * immediately.
    +     *
    +     * If the event is 'close', and 'end' has not yet been emitted, then
    +     * the event will be deferred until after 'end' is emitted.
    +     *
    +     * If the event is 'error', and an AbortSignal was provided for the stream,
    +     * and there are no listeners, then the event is ignored, matching the
    +     * behavior of node core streams in the presense of an AbortSignal.
    +     *
    +     * If the event is 'finish' or 'prefinish', then all listeners will be
    +     * removed after emitting the event, to prevent double-firing.
    +     */
    +    emit(ev, ...args) {
    +        const data = args[0];
    +        // error and close are only events allowed after calling destroy()
    +        if (ev !== 'error' &&
    +            ev !== 'close' &&
    +            ev !== DESTROYED &&
    +            this[DESTROYED]) {
    +            return false;
    +        }
    +        else if (ev === 'data') {
    +            return !this[OBJECTMODE] && !data
    +                ? false
    +                : this[ASYNC]
    +                    ? (defer(() => this[EMITDATA](data)), true)
    +                    : this[EMITDATA](data);
    +        }
    +        else if (ev === 'end') {
    +            return this[EMITEND]();
    +        }
    +        else if (ev === 'close') {
    +            this[CLOSED] = true;
    +            // don't emit close before 'end' and 'finish'
    +            if (!this[EMITTED_END] && !this[DESTROYED])
    +                return false;
    +            const ret = super.emit('close');
    +            this.removeAllListeners('close');
    +            return ret;
    +        }
    +        else if (ev === 'error') {
    +            this[EMITTED_ERROR] = data;
    +            super.emit(ERROR, data);
    +            const ret = !this[SIGNAL] || this.listeners('error').length
    +                ? super.emit('error', data)
    +                : false;
    +            this[MAYBE_EMIT_END]();
    +            return ret;
    +        }
    +        else if (ev === 'resume') {
    +            const ret = super.emit('resume');
    +            this[MAYBE_EMIT_END]();
    +            return ret;
    +        }
    +        else if (ev === 'finish' || ev === 'prefinish') {
    +            const ret = super.emit(ev);
    +            this.removeAllListeners(ev);
    +            return ret;
    +        }
    +        // Some other unknown event
    +        const ret = super.emit(ev, ...args);
    +        this[MAYBE_EMIT_END]();
    +        return ret;
    +    }
    +    [EMITDATA](data) {
    +        for (const p of this[PIPES]) {
    +            if (p.dest.write(data) === false)
    +                this.pause();
    +        }
    +        const ret = this[DISCARDED] ? false : super.emit('data', data);
    +        this[MAYBE_EMIT_END]();
    +        return ret;
    +    }
    +    [EMITEND]() {
    +        if (this[EMITTED_END])
    +            return false;
    +        this[EMITTED_END] = true;
    +        this.readable = false;
    +        return this[ASYNC]
    +            ? (defer(() => this[EMITEND2]()), true)
    +            : this[EMITEND2]();
    +    }
    +    [EMITEND2]() {
    +        if (this[DECODER]) {
    +            const data = this[DECODER].end();
    +            if (data) {
    +                for (const p of this[PIPES]) {
    +                    p.dest.write(data);
    +                }
    +                if (!this[DISCARDED])
    +                    super.emit('data', data);
    +            }
    +        }
    +        for (const p of this[PIPES]) {
    +            p.end();
    +        }
    +        const ret = super.emit('end');
    +        this.removeAllListeners('end');
    +        return ret;
    +    }
    +    /**
    +     * Return a Promise that resolves to an array of all emitted data once
    +     * the stream ends.
    +     */
    +    async collect() {
    +        const buf = Object.assign([], {
    +            dataLength: 0,
    +        });
    +        if (!this[OBJECTMODE])
    +            buf.dataLength = 0;
    +        // set the promise first, in case an error is raised
    +        // by triggering the flow here.
    +        const p = this.promise();
    +        this.on('data', c => {
    +            buf.push(c);
    +            if (!this[OBJECTMODE])
    +                buf.dataLength += c.length;
    +        });
    +        await p;
    +        return buf;
    +    }
    +    /**
    +     * Return a Promise that resolves to the concatenation of all emitted data
    +     * once the stream ends.
    +     *
    +     * Not allowed on objectMode streams.
    +     */
    +    async concat() {
    +        if (this[OBJECTMODE]) {
    +            throw new Error('cannot concat in objectMode');
    +        }
    +        const buf = await this.collect();
    +        return (this[ENCODING]
    +            ? buf.join('')
    +            : Buffer.concat(buf, buf.dataLength));
    +    }
    +    /**
    +     * Return a void Promise that resolves once the stream ends.
    +     */
    +    async promise() {
    +        return new Promise((resolve, reject) => {
    +            this.on(DESTROYED, () => reject(new Error('stream destroyed')));
    +            this.on('error', er => reject(er));
    +            this.on('end', () => resolve());
    +        });
    +    }
    +    /**
    +     * Asynchronous `for await of` iteration.
    +     *
    +     * This will continue emitting all chunks until the stream terminates.
    +     */
    +    [Symbol.asyncIterator]() {
    +        // set this up front, in case the consumer doesn't call next()
    +        // right away.
    +        this[DISCARDED] = false;
    +        let stopped = false;
    +        const stop = async () => {
    +            this.pause();
    +            stopped = true;
    +            return { value: undefined, done: true };
    +        };
    +        const next = () => {
    +            if (stopped)
    +                return stop();
    +            const res = this.read();
    +            if (res !== null)
    +                return Promise.resolve({ done: false, value: res });
    +            if (this[EOF])
    +                return stop();
    +            let resolve;
    +            let reject;
    +            const onerr = (er) => {
    +                this.off('data', ondata);
    +                this.off('end', onend);
    +                this.off(DESTROYED, ondestroy);
    +                stop();
    +                reject(er);
    +            };
    +            const ondata = (value) => {
    +                this.off('error', onerr);
    +                this.off('end', onend);
    +                this.off(DESTROYED, ondestroy);
    +                this.pause();
    +                resolve({ value, done: !!this[EOF] });
    +            };
    +            const onend = () => {
    +                this.off('error', onerr);
    +                this.off('data', ondata);
    +                this.off(DESTROYED, ondestroy);
    +                stop();
    +                resolve({ done: true, value: undefined });
    +            };
    +            const ondestroy = () => onerr(new Error('stream destroyed'));
    +            return new Promise((res, rej) => {
    +                reject = rej;
    +                resolve = res;
    +                this.once(DESTROYED, ondestroy);
    +                this.once('error', onerr);
    +                this.once('end', onend);
    +                this.once('data', ondata);
    +            });
    +        };
    +        return {
    +            next,
    +            throw: stop,
    +            return: stop,
    +            [Symbol.asyncIterator]() {
    +                return this;
    +            },
    +        };
    +    }
    +    /**
    +     * Synchronous `for of` iteration.
    +     *
    +     * The iteration will terminate when the internal buffer runs out, even
    +     * if the stream has not yet terminated.
    +     */
    +    [Symbol.iterator]() {
    +        // set this up front, in case the consumer doesn't call next()
    +        // right away.
    +        this[DISCARDED] = false;
    +        let stopped = false;
    +        const stop = () => {
    +            this.pause();
    +            this.off(ERROR, stop);
    +            this.off(DESTROYED, stop);
    +            this.off('end', stop);
    +            stopped = true;
    +            return { done: true, value: undefined };
    +        };
    +        const next = () => {
    +            if (stopped)
    +                return stop();
    +            const value = this.read();
    +            return value === null ? stop() : { done: false, value };
    +        };
    +        this.once('end', stop);
    +        this.once(ERROR, stop);
    +        this.once(DESTROYED, stop);
    +        return {
    +            next,
    +            throw: stop,
    +            return: stop,
    +            [Symbol.iterator]() {
    +                return this;
    +            },
    +        };
    +    }
    +    /**
    +     * Destroy a stream, preventing it from being used for any further purpose.
    +     *
    +     * If the stream has a `close()` method, then it will be called on
    +     * destruction.
    +     *
    +     * After destruction, any attempt to write data, read data, or emit most
    +     * events will be ignored.
    +     *
    +     * If an error argument is provided, then it will be emitted in an
    +     * 'error' event.
    +     */
    +    destroy(er) {
    +        if (this[DESTROYED]) {
    +            if (er)
    +                this.emit('error', er);
    +            else
    +                this.emit(DESTROYED);
    +            return this;
    +        }
    +        this[DESTROYED] = true;
    +        this[DISCARDED] = true;
    +        // throw away all buffered data, it's never coming out
    +        this[BUFFER].length = 0;
    +        this[BUFFERLENGTH] = 0;
    +        const wc = this;
    +        if (typeof wc.close === 'function' && !this[CLOSED])
    +            wc.close();
    +        if (er)
    +            this.emit('error', er);
    +        // if no error to emit, still reject pending promises
    +        else
    +            this.emit(DESTROYED);
    +        return this;
    +    }
    +    /**
    +     * Alias for {@link isStream}
    +     *
    +     * Former export location, maintained for backwards compatibility.
    +     *
    +     * @deprecated
    +     */
    +    static get isStream() {
    +        return exports.isStream;
    +    }
    +}
    +exports.Minipass = Minipass;
    +//# sourceMappingURL=index.js.map
     
    -                        if (!channel) {
    -                            channel = new MessageChannel()
    -                        }
    -                        channel.port1.unref()
    -                        channel.port2.unref()
    -                        channel.port1.postMessage(value, options?.transfer)
    -                        return receiveMessageOnPort(channel.port2).message
    -                    }
    +/***/ }),
     
    -                module.exports = {
    -                    DOMException,
    -                    structuredClone,
    -                    subresource,
    -                    forbiddenMethods,
    -                    requestBodyHeader,
    -                    referrerPolicy,
    -                    requestRedirect,
    -                    requestMode,
    -                    requestCredentials,
    -                    requestCache,
    -                    redirectStatus,
    -                    corsSafeListedMethods,
    -                    nullBodyStatus,
    -                    safeMethods,
    -                    badPorts,
    -                    requestDuplex,
    -                    subresourceSet,
    -                    badPortsSet,
    -                    redirectStatusSet,
    -                    corsSafeListedMethodsSet,
    -                    safeMethodsSet,
    -                    forbiddenMethodsSet,
    -                    referrerPolicySet
    -                }
    +/***/ 7329:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
     
    +"use strict";
     
    -                /***/
    -}),
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.create = void 0;
    +const options_js_1 = __nccwpck_require__(9060);
    +const fs_minipass_1 = __nccwpck_require__(675);
    +const node_path_1 = __importDefault(__nccwpck_require__(9411));
    +const list_js_1 = __nccwpck_require__(4306);
    +const pack_js_1 = __nccwpck_require__(7788);
    +function create(opt_, files, cb) {
    +    if (typeof files === 'function') {
    +        cb = files;
    +    }
    +    if (Array.isArray(opt_)) {
    +        ;
    +        (files = opt_), (opt_ = {});
    +    }
    +    if (!files || !Array.isArray(files) || !files.length) {
    +        throw new TypeError('no files or directories specified');
    +    }
    +    files = Array.from(files);
    +    const opt = (0, options_js_1.dealias)(opt_);
    +    if (opt.sync && typeof cb === 'function') {
    +        throw new TypeError('callback not supported for sync tar functions');
    +    }
    +    if (!opt.file && typeof cb === 'function') {
    +        throw new TypeError('callback only supported with file option');
    +    }
    +    return ((0, options_js_1.isSyncFile)(opt) ? createFileSync(opt, files)
    +        : (0, options_js_1.isFile)(opt) ? createFile(opt, files, cb)
    +            : (0, options_js_1.isSync)(opt) ? createSync(opt, files)
    +                : create_(opt, files));
    +}
    +exports.create = create;
    +const createFileSync = (opt, files) => {
    +    const p = new pack_js_1.PackSync(opt);
    +    const stream = new fs_minipass_1.WriteStreamSync(opt.file, {
    +        mode: opt.mode || 0o666,
    +    });
    +    p.pipe(stream);
    +    addFilesSync(p, files);
    +};
    +const createFile = (opt, files, cb) => {
    +    const p = new pack_js_1.Pack(opt);
    +    const stream = new fs_minipass_1.WriteStream(opt.file, {
    +        mode: opt.mode || 0o666,
    +    });
    +    p.pipe(stream);
    +    const promise = new Promise((res, rej) => {
    +        stream.on('error', rej);
    +        stream.on('close', res);
    +        p.on('error', rej);
    +    });
    +    addFilesAsync(p, files);
    +    return cb ? promise.then(cb, cb) : promise;
    +};
    +const addFilesSync = (p, files) => {
    +    files.forEach(file => {
    +        if (file.charAt(0) === '@') {
    +            (0, list_js_1.list)({
    +                file: node_path_1.default.resolve(p.cwd, file.slice(1)),
    +                sync: true,
    +                noResume: true,
    +                onentry: entry => p.add(entry),
    +            });
    +        }
    +        else {
    +            p.add(file);
    +        }
    +    });
    +    p.end();
    +};
    +const addFilesAsync = async (p, files) => {
    +    for (let i = 0; i < files.length; i++) {
    +        const file = String(files[i]);
    +        if (file.charAt(0) === '@') {
    +            await (0, list_js_1.list)({
    +                file: node_path_1.default.resolve(String(p.cwd), file.slice(1)),
    +                noResume: true,
    +                onentry: entry => {
    +                    p.add(entry);
    +                },
    +            });
    +        }
    +        else {
    +            p.add(file);
    +        }
    +    }
    +    p.end();
    +};
    +const createSync = (opt, files) => {
    +    const p = new pack_js_1.PackSync(opt);
    +    addFilesSync(p, files);
    +    return p;
    +};
    +const create_ = (opt, files) => {
    +    const p = new pack_js_1.Pack(opt);
    +    addFilesAsync(p, files);
    +    return p;
    +};
    +//# sourceMappingURL=create.js.map
     
    -/***/ 685:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    +/***/ }),
     
    -                const assert = __nccwpck_require__(9491)
    -                const { atob } = __nccwpck_require__(4300)
    -                const { isomorphicDecode } = __nccwpck_require__(2538)
    -
    -                const encoder = new TextEncoder()
    -
    -                /**
    -                 * @see https://mimesniff.spec.whatwg.org/#http-token-code-point
    -                 */
    -                const HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/
    -                const HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/ // eslint-disable-line
    -                /**
    -                 * @see https://mimesniff.spec.whatwg.org/#http-quoted-string-token-code-point
    -                 */
    -                const HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/ // eslint-disable-line
    -
    -                // https://fetch.spec.whatwg.org/#data-url-processor
    -                /** @param {URL} dataURL */
    -                function dataURLProcessor(dataURL) {
    -                    // 1. Assert: dataURL’s scheme is "data".
    -                    assert(dataURL.protocol === 'data:')
    -
    -                    // 2. Let input be the result of running the URL
    -                    // serializer on dataURL with exclude fragment
    -                    // set to true.
    -                    let input = URLSerializer(dataURL, true)
    -
    -                    // 3. Remove the leading "data:" string from input.
    -                    input = input.slice(5)
    -
    -                    // 4. Let position point at the start of input.
    -                    const position = { position: 0 }
    -
    -                    // 5. Let mimeType be the result of collecting a
    -                    // sequence of code points that are not equal
    -                    // to U+002C (,), given position.
    -                    let mimeType = collectASequenceOfCodePointsFast(
    -                        ',',
    -                        input,
    -                        position
    -                    )
    +/***/ 6861:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                    // 6. Strip leading and trailing ASCII whitespace
    -                    // from mimeType.
    -                    // Undici implementation note: we need to store the
    -                    // length because if the mimetype has spaces removed,
    -                    // the wrong amount will be sliced from the input in
    -                    // step #9
    -                    const mimeTypeLength = mimeType.length
    -                    mimeType = removeASCIIWhitespace(mimeType, true, true)
    -
    -                    // 7. If position is past the end of input, then
    -                    // return failure
    -                    if (position.position >= input.length) {
    -                        return 'failure'
    -                    }
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.CwdError = void 0;
    +class CwdError extends Error {
    +    path;
    +    code;
    +    syscall = 'chdir';
    +    constructor(path, code) {
    +        super(`${code}: Cannot cd into '${path}'`);
    +        this.path = path;
    +        this.code = code;
    +    }
    +    get name() {
    +        return 'CwdError';
    +    }
    +}
    +exports.CwdError = CwdError;
    +//# sourceMappingURL=cwd-error.js.map
     
    -                    // 8. Advance position by 1.
    -                    position.position++
    +/***/ }),
     
    -                    // 9. Let encodedBody be the remainder of input.
    -                    const encodedBody = input.slice(mimeTypeLength + 1)
    +/***/ 2476:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
    +
    +"use strict";
    +
    +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    var desc = Object.getOwnPropertyDescriptor(m, k);
    +    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    +      desc = { enumerable: true, get: function() { return m[k]; } };
    +    }
    +    Object.defineProperty(o, k2, desc);
    +}) : (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    o[k2] = m[k];
    +}));
    +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    +    Object.defineProperty(o, "default", { enumerable: true, value: v });
    +}) : function(o, v) {
    +    o["default"] = v;
    +});
    +var __importStar = (this && this.__importStar) || function (mod) {
    +    if (mod && mod.__esModule) return mod;
    +    var result = {};
    +    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    +    __setModuleDefault(result, mod);
    +    return result;
    +};
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.extract = void 0;
    +// tar -x
    +const fsm = __importStar(__nccwpck_require__(675));
    +const node_fs_1 = __importDefault(__nccwpck_require__(7561));
    +const node_path_1 = __nccwpck_require__(9411);
    +const options_js_1 = __nccwpck_require__(9060);
    +const strip_trailing_slashes_js_1 = __nccwpck_require__(6018);
    +const unpack_js_1 = __nccwpck_require__(6973);
    +function extract(opt_, files, cb) {
    +    if (typeof opt_ === 'function') {
    +        ;
    +        (cb = opt_), (files = undefined), (opt_ = {});
    +    }
    +    else if (Array.isArray(opt_)) {
    +        ;
    +        (files = opt_), (opt_ = {});
    +    }
    +    if (typeof files === 'function') {
    +        ;
    +        (cb = files), (files = undefined);
    +    }
    +    if (!files) {
    +        files = [];
    +    }
    +    else {
    +        files = Array.from(files);
    +    }
    +    const opt = (0, options_js_1.dealias)(opt_);
    +    if (opt.sync && typeof cb === 'function') {
    +        throw new TypeError('callback not supported for sync tar functions');
    +    }
    +    if (!opt.file && typeof cb === 'function') {
    +        throw new TypeError('callback only supported with file option');
    +    }
    +    if (files.length) {
    +        filesFilter(opt, files);
    +    }
    +    return ((0, options_js_1.isSyncFile)(opt) ? extractFileSync(opt)
    +        : (0, options_js_1.isFile)(opt) ? extractFile(opt, cb)
    +            : (0, options_js_1.isSync)(opt) ? extractSync(opt)
    +                : extract_(opt));
    +}
    +exports.extract = extract;
    +// construct a filter that limits the file entries listed
    +// include child entries if a dir is included
    +const filesFilter = (opt, files) => {
    +    const map = new Map(files.map(f => [(0, strip_trailing_slashes_js_1.stripTrailingSlashes)(f), true]));
    +    const filter = opt.filter;
    +    const mapHas = (file, r = '') => {
    +        const root = r || (0, node_path_1.parse)(file).root || '.';
    +        let ret;
    +        if (file === root)
    +            ret = false;
    +        else {
    +            const m = map.get(file);
    +            if (m !== undefined) {
    +                ret = m;
    +            }
    +            else {
    +                ret = mapHas((0, node_path_1.dirname)(file), root);
    +            }
    +        }
    +        map.set(file, ret);
    +        return ret;
    +    };
    +    opt.filter =
    +        filter ?
    +            (file, entry) => filter(file, entry) && mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file))
    +            : file => mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file));
    +};
    +const extractFileSync = (opt) => {
    +    const u = new unpack_js_1.UnpackSync(opt);
    +    const file = opt.file;
    +    const stat = node_fs_1.default.statSync(file);
    +    // This trades a zero-byte read() syscall for a stat
    +    // However, it will usually result in less memory allocation
    +    const readSize = opt.maxReadSize || 16 * 1024 * 1024;
    +    const stream = new fsm.ReadStreamSync(file, {
    +        readSize: readSize,
    +        size: stat.size,
    +    });
    +    stream.pipe(u);
    +};
    +const extractFile = (opt, cb) => {
    +    const u = new unpack_js_1.Unpack(opt);
    +    const readSize = opt.maxReadSize || 16 * 1024 * 1024;
    +    const file = opt.file;
    +    const p = new Promise((resolve, reject) => {
    +        u.on('error', reject);
    +        u.on('close', resolve);
    +        // This trades a zero-byte read() syscall for a stat
    +        // However, it will usually result in less memory allocation
    +        node_fs_1.default.stat(file, (er, stat) => {
    +            if (er) {
    +                reject(er);
    +            }
    +            else {
    +                const stream = new fsm.ReadStream(file, {
    +                    readSize: readSize,
    +                    size: stat.size,
    +                });
    +                stream.on('error', reject);
    +                stream.pipe(u);
    +            }
    +        });
    +    });
    +    return cb ? p.then(cb, cb) : p;
    +};
    +const extractSync = (opt) => new unpack_js_1.UnpackSync(opt);
    +const extract_ = (opt) => new unpack_js_1.Unpack(opt);
    +//# sourceMappingURL=extract.js.map
     
    -                    // 10. Let body be the percent-decoding of encodedBody.
    -                    let body = stringPercentDecode(encodedBody)
    +/***/ }),
     
    -                    // 11. If mimeType ends with U+003B (;), followed by
    -                    // zero or more U+0020 SPACE, followed by an ASCII
    -                    // case-insensitive match for "base64", then:
    -                    if (/;(\u0020){0,}base64$/i.test(mimeType)) {
    -                        // 1. Let stringBody be the isomorphic decode of body.
    -                        const stringBody = isomorphicDecode(body)
    +/***/ 1663:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
    +
    +"use strict";
    +
    +// Get the appropriate flag to use for creating files
    +// We use fmap on Windows platforms for files less than
    +// 512kb.  This is a fairly low limit, but avoids making
    +// things slower in some cases.  Since most of what this
    +// library is used for is extracting tarballs of many
    +// relatively small files in npm packages and the like,
    +// it can be a big boost on Windows platforms.
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.getWriteFlag = void 0;
    +const fs_1 = __importDefault(__nccwpck_require__(7147));
    +const platform = process.env.__FAKE_PLATFORM__ || process.platform;
    +const isWindows = platform === 'win32';
    +/* c8 ignore start */
    +const { O_CREAT, O_TRUNC, O_WRONLY } = fs_1.default.constants;
    +const UV_FS_O_FILEMAP = Number(process.env.__FAKE_FS_O_FILENAME__) ||
    +    fs_1.default.constants.UV_FS_O_FILEMAP ||
    +    0;
    +/* c8 ignore stop */
    +const fMapEnabled = isWindows && !!UV_FS_O_FILEMAP;
    +const fMapLimit = 512 * 1024;
    +const fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY;
    +exports.getWriteFlag = !fMapEnabled ?
    +    () => 'w'
    +    : (size) => (size < fMapLimit ? fMapFlag : 'w');
    +//# sourceMappingURL=get-write-flag.js.map
    +
    +/***/ }),
     
    -                        // 2. Set body to the forgiving-base64 decode of
    -                        // stringBody.
    -                        body = forgivingBase64(stringBody)
    +/***/ 2374:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
    +
    +"use strict";
    +
    +// parse a 512-byte header block to a data object, or vice-versa
    +// encode returns `true` if a pax extended header is needed, because
    +// the data could not be faithfully encoded in a simple header.
    +// (Also, check header.needPax to see if it needs a pax header.)
    +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    var desc = Object.getOwnPropertyDescriptor(m, k);
    +    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    +      desc = { enumerable: true, get: function() { return m[k]; } };
    +    }
    +    Object.defineProperty(o, k2, desc);
    +}) : (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    o[k2] = m[k];
    +}));
    +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    +    Object.defineProperty(o, "default", { enumerable: true, value: v });
    +}) : function(o, v) {
    +    o["default"] = v;
    +});
    +var __importStar = (this && this.__importStar) || function (mod) {
    +    if (mod && mod.__esModule) return mod;
    +    var result = {};
    +    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    +    __setModuleDefault(result, mod);
    +    return result;
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.Header = void 0;
    +const node_path_1 = __nccwpck_require__(9411);
    +const large = __importStar(__nccwpck_require__(8520));
    +const types = __importStar(__nccwpck_require__(7390));
    +class Header {
    +    cksumValid = false;
    +    needPax = false;
    +    nullBlock = false;
    +    block;
    +    path;
    +    mode;
    +    uid;
    +    gid;
    +    size;
    +    cksum;
    +    #type = 'Unsupported';
    +    linkpath;
    +    uname;
    +    gname;
    +    devmaj = 0;
    +    devmin = 0;
    +    atime;
    +    ctime;
    +    mtime;
    +    charset;
    +    comment;
    +    constructor(data, off = 0, ex, gex) {
    +        if (Buffer.isBuffer(data)) {
    +            this.decode(data, off || 0, ex, gex);
    +        }
    +        else if (data) {
    +            this.#slurp(data);
    +        }
    +    }
    +    decode(buf, off, ex, gex) {
    +        if (!off) {
    +            off = 0;
    +        }
    +        if (!buf || !(buf.length >= off + 512)) {
    +            throw new Error('need 512 bytes for header');
    +        }
    +        this.path = decString(buf, off, 100);
    +        this.mode = decNumber(buf, off + 100, 8);
    +        this.uid = decNumber(buf, off + 108, 8);
    +        this.gid = decNumber(buf, off + 116, 8);
    +        this.size = decNumber(buf, off + 124, 12);
    +        this.mtime = decDate(buf, off + 136, 12);
    +        this.cksum = decNumber(buf, off + 148, 12);
    +        // if we have extended or global extended headers, apply them now
    +        // See https://github.com/npm/node-tar/pull/187
    +        // Apply global before local, so it overrides
    +        if (gex)
    +            this.#slurp(gex, true);
    +        if (ex)
    +            this.#slurp(ex);
    +        // old tar versions marked dirs as a file with a trailing /
    +        const t = decString(buf, off + 156, 1);
    +        if (types.isCode(t)) {
    +            this.#type = t || '0';
    +        }
    +        if (this.#type === '0' && this.path.slice(-1) === '/') {
    +            this.#type = '5';
    +        }
    +        // tar implementations sometimes incorrectly put the stat(dir).size
    +        // as the size in the tarball, even though Directory entries are
    +        // not able to have any body at all.  In the very rare chance that
    +        // it actually DOES have a body, we weren't going to do anything with
    +        // it anyway, and it'll just be a warning about an invalid header.
    +        if (this.#type === '5') {
    +            this.size = 0;
    +        }
    +        this.linkpath = decString(buf, off + 157, 100);
    +        if (buf.subarray(off + 257, off + 265).toString() ===
    +            'ustar\u000000') {
    +            this.uname = decString(buf, off + 265, 32);
    +            this.gname = decString(buf, off + 297, 32);
    +            /* c8 ignore start */
    +            this.devmaj = decNumber(buf, off + 329, 8) ?? 0;
    +            this.devmin = decNumber(buf, off + 337, 8) ?? 0;
    +            /* c8 ignore stop */
    +            if (buf[off + 475] !== 0) {
    +                // definitely a prefix, definitely >130 chars.
    +                const prefix = decString(buf, off + 345, 155);
    +                this.path = prefix + '/' + this.path;
    +            }
    +            else {
    +                const prefix = decString(buf, off + 345, 130);
    +                if (prefix) {
    +                    this.path = prefix + '/' + this.path;
    +                }
    +                this.atime = decDate(buf, off + 476, 12);
    +                this.ctime = decDate(buf, off + 488, 12);
    +            }
    +        }
    +        let sum = 8 * 0x20;
    +        for (let i = off; i < off + 148; i++) {
    +            sum += buf[i];
    +        }
    +        for (let i = off + 156; i < off + 512; i++) {
    +            sum += buf[i];
    +        }
    +        this.cksumValid = sum === this.cksum;
    +        if (this.cksum === undefined && sum === 8 * 0x20) {
    +            this.nullBlock = true;
    +        }
    +    }
    +    #slurp(ex, gex = false) {
    +        Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => {
    +            // we slurp in everything except for the path attribute in
    +            // a global extended header, because that's weird. Also, any
    +            // null/undefined values are ignored.
    +            return !(v === null ||
    +                v === undefined ||
    +                (k === 'path' && gex) ||
    +                (k === 'linkpath' && gex) ||
    +                k === 'global');
    +        })));
    +    }
    +    encode(buf, off = 0) {
    +        if (!buf) {
    +            buf = this.block = Buffer.alloc(512);
    +        }
    +        if (this.#type === 'Unsupported') {
    +            this.#type = '0';
    +        }
    +        if (!(buf.length >= off + 512)) {
    +            throw new Error('need 512 bytes for header');
    +        }
    +        const prefixSize = this.ctime || this.atime ? 130 : 155;
    +        const split = splitPrefix(this.path || '', prefixSize);
    +        const path = split[0];
    +        const prefix = split[1];
    +        this.needPax = !!split[2];
    +        this.needPax = encString(buf, off, 100, path) || this.needPax;
    +        this.needPax =
    +            encNumber(buf, off + 100, 8, this.mode) || this.needPax;
    +        this.needPax =
    +            encNumber(buf, off + 108, 8, this.uid) || this.needPax;
    +        this.needPax =
    +            encNumber(buf, off + 116, 8, this.gid) || this.needPax;
    +        this.needPax =
    +            encNumber(buf, off + 124, 12, this.size) || this.needPax;
    +        this.needPax =
    +            encDate(buf, off + 136, 12, this.mtime) || this.needPax;
    +        buf[off + 156] = this.#type.charCodeAt(0);
    +        this.needPax =
    +            encString(buf, off + 157, 100, this.linkpath) || this.needPax;
    +        buf.write('ustar\u000000', off + 257, 8);
    +        this.needPax =
    +            encString(buf, off + 265, 32, this.uname) || this.needPax;
    +        this.needPax =
    +            encString(buf, off + 297, 32, this.gname) || this.needPax;
    +        this.needPax =
    +            encNumber(buf, off + 329, 8, this.devmaj) || this.needPax;
    +        this.needPax =
    +            encNumber(buf, off + 337, 8, this.devmin) || this.needPax;
    +        this.needPax =
    +            encString(buf, off + 345, prefixSize, prefix) || this.needPax;
    +        if (buf[off + 475] !== 0) {
    +            this.needPax =
    +                encString(buf, off + 345, 155, prefix) || this.needPax;
    +        }
    +        else {
    +            this.needPax =
    +                encString(buf, off + 345, 130, prefix) || this.needPax;
    +            this.needPax =
    +                encDate(buf, off + 476, 12, this.atime) || this.needPax;
    +            this.needPax =
    +                encDate(buf, off + 488, 12, this.ctime) || this.needPax;
    +        }
    +        let sum = 8 * 0x20;
    +        for (let i = off; i < off + 148; i++) {
    +            sum += buf[i];
    +        }
    +        for (let i = off + 156; i < off + 512; i++) {
    +            sum += buf[i];
    +        }
    +        this.cksum = sum;
    +        encNumber(buf, off + 148, 8, this.cksum);
    +        this.cksumValid = true;
    +        return this.needPax;
    +    }
    +    get type() {
    +        return (this.#type === 'Unsupported' ?
    +            this.#type
    +            : types.name.get(this.#type));
    +    }
    +    get typeKey() {
    +        return this.#type;
    +    }
    +    set type(type) {
    +        const c = String(types.code.get(type));
    +        if (types.isCode(c) || c === 'Unsupported') {
    +            this.#type = c;
    +        }
    +        else if (types.isCode(type)) {
    +            this.#type = type;
    +        }
    +        else {
    +            throw new TypeError('invalid entry type: ' + type);
    +        }
    +    }
    +}
    +exports.Header = Header;
    +const splitPrefix = (p, prefixSize) => {
    +    const pathSize = 100;
    +    let pp = p;
    +    let prefix = '';
    +    let ret = undefined;
    +    const root = node_path_1.posix.parse(p).root || '.';
    +    if (Buffer.byteLength(pp) < pathSize) {
    +        ret = [pp, prefix, false];
    +    }
    +    else {
    +        // first set prefix to the dir, and path to the base
    +        prefix = node_path_1.posix.dirname(pp);
    +        pp = node_path_1.posix.basename(pp);
    +        do {
    +            if (Buffer.byteLength(pp) <= pathSize &&
    +                Buffer.byteLength(prefix) <= prefixSize) {
    +                // both fit!
    +                ret = [pp, prefix, false];
    +            }
    +            else if (Buffer.byteLength(pp) > pathSize &&
    +                Buffer.byteLength(prefix) <= prefixSize) {
    +                // prefix fits in prefix, but path doesn't fit in path
    +                ret = [pp.slice(0, pathSize - 1), prefix, true];
    +            }
    +            else {
    +                // make path take a bit from prefix
    +                pp = node_path_1.posix.join(node_path_1.posix.basename(prefix), pp);
    +                prefix = node_path_1.posix.dirname(prefix);
    +            }
    +        } while (prefix !== root && ret === undefined);
    +        // at this point, found no resolution, just truncate
    +        if (!ret) {
    +            ret = [p.slice(0, pathSize - 1), '', true];
    +        }
    +    }
    +    return ret;
    +};
    +const decString = (buf, off, size) => buf
    +    .subarray(off, off + size)
    +    .toString('utf8')
    +    .replace(/\0.*/, '');
    +const decDate = (buf, off, size) => numToDate(decNumber(buf, off, size));
    +const numToDate = (num) => num === undefined ? undefined : new Date(num * 1000);
    +const decNumber = (buf, off, size) => Number(buf[off]) & 0x80 ?
    +    large.parse(buf.subarray(off, off + size))
    +    : decSmallNumber(buf, off, size);
    +const nanUndef = (value) => (isNaN(value) ? undefined : value);
    +const decSmallNumber = (buf, off, size) => nanUndef(parseInt(buf
    +    .subarray(off, off + size)
    +    .toString('utf8')
    +    .replace(/\0.*$/, '')
    +    .trim(), 8));
    +// the maximum encodable as a null-terminated octal, by field size
    +const MAXNUM = {
    +    12: 0o77777777777,
    +    8: 0o7777777,
    +};
    +const encNumber = (buf, off, size, num) => num === undefined ? false
    +    : num > MAXNUM[size] || num < 0 ?
    +        (large.encode(num, buf.subarray(off, off + size)), true)
    +        : (encSmallNumber(buf, off, size, num), false);
    +const encSmallNumber = (buf, off, size, num) => buf.write(octalString(num, size), off, size, 'ascii');
    +const octalString = (num, size) => padOctal(Math.floor(num).toString(8), size);
    +const padOctal = (str, size) => (str.length === size - 1 ?
    +    str
    +    : new Array(size - str.length - 1).join('0') + str + ' ') + '\0';
    +const encDate = (buf, off, size, date) => date === undefined ? false : (encNumber(buf, off, size, date.getTime() / 1000));
    +// enough to fill the longest string we've got
    +const NULLS = new Array(156).join('\0');
    +// pad with nulls, return true if it's longer or non-ascii
    +const encString = (buf, off, size, str) => str === undefined ? false : ((buf.write(str + NULLS, off, size, 'utf8'),
    +    str.length !== Buffer.byteLength(str) || str.length > size));
    +//# sourceMappingURL=header.js.map
    +
    +/***/ }),
     
    -                        // 3. If body is failure, then return failure.
    -                        if (body === 'failure') {
    -                            return 'failure'
    -                        }
    +/***/ 6630:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
    +
    +"use strict";
    +
    +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    var desc = Object.getOwnPropertyDescriptor(m, k);
    +    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    +      desc = { enumerable: true, get: function() { return m[k]; } };
    +    }
    +    Object.defineProperty(o, k2, desc);
    +}) : (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    o[k2] = m[k];
    +}));
    +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    +    Object.defineProperty(o, "default", { enumerable: true, value: v });
    +}) : function(o, v) {
    +    o["default"] = v;
    +});
    +var __exportStar = (this && this.__exportStar) || function(m, exports) {
    +    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
    +};
    +var __importStar = (this && this.__importStar) || function (mod) {
    +    if (mod && mod.__esModule) return mod;
    +    var result = {};
    +    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    +    __setModuleDefault(result, mod);
    +    return result;
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.types = exports.x = exports.u = exports.t = exports.r = exports.c = void 0;
    +__exportStar(__nccwpck_require__(7329), exports);
    +__exportStar(__nccwpck_require__(5478), exports);
    +__exportStar(__nccwpck_require__(4306), exports);
    +__exportStar(__nccwpck_require__(8780), exports);
    +__exportStar(__nccwpck_require__(2476), exports);
    +var create_js_1 = __nccwpck_require__(7329);
    +Object.defineProperty(exports, "c", ({ enumerable: true, get: function () { return create_js_1.create; } }));
    +var replace_js_1 = __nccwpck_require__(5478);
    +Object.defineProperty(exports, "r", ({ enumerable: true, get: function () { return replace_js_1.replace; } }));
    +var list_js_1 = __nccwpck_require__(4306);
    +Object.defineProperty(exports, "t", ({ enumerable: true, get: function () { return list_js_1.list; } }));
    +var update_js_1 = __nccwpck_require__(8780);
    +Object.defineProperty(exports, "u", ({ enumerable: true, get: function () { return update_js_1.update; } }));
    +var extract_js_1 = __nccwpck_require__(2476);
    +Object.defineProperty(exports, "x", ({ enumerable: true, get: function () { return extract_js_1.extract; } }));
    +// classes
    +__exportStar(__nccwpck_require__(7788), exports);
    +__exportStar(__nccwpck_require__(6973), exports);
    +__exportStar(__nccwpck_require__(2522), exports);
    +__exportStar(__nccwpck_require__(7369), exports);
    +__exportStar(__nccwpck_require__(4028), exports);
    +__exportStar(__nccwpck_require__(2374), exports);
    +__exportStar(__nccwpck_require__(8567), exports);
    +exports.types = __importStar(__nccwpck_require__(7390));
    +//# sourceMappingURL=index.js.map
    +
    +/***/ }),
     
    -                        // 4. Remove the last 6 code points from mimeType.
    -                        mimeType = mimeType.slice(0, -6)
    -
    -                        // 5. Remove trailing U+0020 SPACE code points from mimeType,
    -                        // if any.
    -                        mimeType = mimeType.replace(/(\u0020)+$/, '')
    -
    -                        // 6. Remove the last U+003B (;) code point from mimeType.
    -                        mimeType = mimeType.slice(0, -1)
    -                    }
    -
    -                    // 12. If mimeType starts with U+003B (;), then prepend
    -                    // "text/plain" to mimeType.
    -                    if (mimeType.startsWith(';')) {
    -                        mimeType = 'text/plain' + mimeType
    -                    }
    -
    -                    // 13. Let mimeTypeRecord be the result of parsing
    -                    // mimeType.
    -                    let mimeTypeRecord = parseMIMEType(mimeType)
    -
    -                    // 14. If mimeTypeRecord is failure, then set
    -                    // mimeTypeRecord to text/plain;charset=US-ASCII.
    -                    if (mimeTypeRecord === 'failure') {
    -                        mimeTypeRecord = parseMIMEType('text/plain;charset=US-ASCII')
    -                    }
    +/***/ 8520:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                    // 15. Return a new data: URL struct whose MIME
    -                    // type is mimeTypeRecord and body is body.
    -                    // https://fetch.spec.whatwg.org/#data-url-struct
    -                    return { mimeType: mimeTypeRecord, body }
    -                }
    +"use strict";
    +
    +// Tar can encode large and negative numbers using a leading byte of
    +// 0xff for negative, and 0x80 for positive.
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.parse = exports.encode = void 0;
    +const encode = (num, buf) => {
    +    if (!Number.isSafeInteger(num)) {
    +        // The number is so large that javascript cannot represent it with integer
    +        // precision.
    +        throw Error('cannot encode number outside of javascript safe integer range');
    +    }
    +    else if (num < 0) {
    +        encodeNegative(num, buf);
    +    }
    +    else {
    +        encodePositive(num, buf);
    +    }
    +    return buf;
    +};
    +exports.encode = encode;
    +const encodePositive = (num, buf) => {
    +    buf[0] = 0x80;
    +    for (var i = buf.length; i > 1; i--) {
    +        buf[i - 1] = num & 0xff;
    +        num = Math.floor(num / 0x100);
    +    }
    +};
    +const encodeNegative = (num, buf) => {
    +    buf[0] = 0xff;
    +    var flipped = false;
    +    num = num * -1;
    +    for (var i = buf.length; i > 1; i--) {
    +        var byte = num & 0xff;
    +        num = Math.floor(num / 0x100);
    +        if (flipped) {
    +            buf[i - 1] = onesComp(byte);
    +        }
    +        else if (byte === 0) {
    +            buf[i - 1] = 0;
    +        }
    +        else {
    +            flipped = true;
    +            buf[i - 1] = twosComp(byte);
    +        }
    +    }
    +};
    +const parse = (buf) => {
    +    const pre = buf[0];
    +    const value = pre === 0x80 ? pos(buf.subarray(1, buf.length))
    +        : pre === 0xff ? twos(buf)
    +            : null;
    +    if (value === null) {
    +        throw Error('invalid base256 encoding');
    +    }
    +    if (!Number.isSafeInteger(value)) {
    +        // The number is so large that javascript cannot represent it with integer
    +        // precision.
    +        throw Error('parsed number outside of javascript safe integer range');
    +    }
    +    return value;
    +};
    +exports.parse = parse;
    +const twos = (buf) => {
    +    var len = buf.length;
    +    var sum = 0;
    +    var flipped = false;
    +    for (var i = len - 1; i > -1; i--) {
    +        var byte = Number(buf[i]);
    +        var f;
    +        if (flipped) {
    +            f = onesComp(byte);
    +        }
    +        else if (byte === 0) {
    +            f = byte;
    +        }
    +        else {
    +            flipped = true;
    +            f = twosComp(byte);
    +        }
    +        if (f !== 0) {
    +            sum -= f * Math.pow(256, len - i - 1);
    +        }
    +    }
    +    return sum;
    +};
    +const pos = (buf) => {
    +    var len = buf.length;
    +    var sum = 0;
    +    for (var i = len - 1; i > -1; i--) {
    +        var byte = Number(buf[i]);
    +        if (byte !== 0) {
    +            sum += byte * Math.pow(256, len - i - 1);
    +        }
    +    }
    +    return sum;
    +};
    +const onesComp = (byte) => (0xff ^ byte) & 0xff;
    +const twosComp = (byte) => ((0xff ^ byte) + 1) & 0xff;
    +//# sourceMappingURL=large-numbers.js.map
     
    -                // https://url.spec.whatwg.org/#concept-url-serializer
    -                /**
    -                 * @param {URL} url
    -                 * @param {boolean} excludeFragment
    -                 */
    -                function URLSerializer(url, excludeFragment = false) {
    -                    if (!excludeFragment) {
    -                        return url.href
    -                    }
    +/***/ }),
     
    -                    const href = url.href
    -                    const hashLength = url.hash.length
    +/***/ 4306:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
    +
    +"use strict";
    +
    +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    var desc = Object.getOwnPropertyDescriptor(m, k);
    +    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    +      desc = { enumerable: true, get: function() { return m[k]; } };
    +    }
    +    Object.defineProperty(o, k2, desc);
    +}) : (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    o[k2] = m[k];
    +}));
    +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    +    Object.defineProperty(o, "default", { enumerable: true, value: v });
    +}) : function(o, v) {
    +    o["default"] = v;
    +});
    +var __importStar = (this && this.__importStar) || function (mod) {
    +    if (mod && mod.__esModule) return mod;
    +    var result = {};
    +    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    +    __setModuleDefault(result, mod);
    +    return result;
    +};
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.list = void 0;
    +// tar -t
    +const fsm = __importStar(__nccwpck_require__(675));
    +const node_fs_1 = __importDefault(__nccwpck_require__(7561));
    +const path_1 = __nccwpck_require__(1017);
    +const options_js_1 = __nccwpck_require__(9060);
    +const parse_js_1 = __nccwpck_require__(2522);
    +const strip_trailing_slashes_js_1 = __nccwpck_require__(6018);
    +function list(opt_, files, cb) {
    +    if (typeof opt_ === 'function') {
    +        ;
    +        (cb = opt_), (files = undefined), (opt_ = {});
    +    }
    +    else if (Array.isArray(opt_)) {
    +        ;
    +        (files = opt_), (opt_ = {});
    +    }
    +    if (typeof files === 'function') {
    +        ;
    +        (cb = files), (files = undefined);
    +    }
    +    if (!files) {
    +        files = [];
    +    }
    +    else {
    +        files = Array.from(files);
    +    }
    +    const opt = (0, options_js_1.dealias)(opt_);
    +    if (opt.sync && typeof cb === 'function') {
    +        throw new TypeError('callback not supported for sync tar functions');
    +    }
    +    if (!opt.file && typeof cb === 'function') {
    +        throw new TypeError('callback only supported with file option');
    +    }
    +    if (files.length) {
    +        filesFilter(opt, files);
    +    }
    +    if (!opt.noResume) {
    +        onentryFunction(opt);
    +    }
    +    return ((0, options_js_1.isSyncFile)(opt) ? listFileSync(opt)
    +        : (0, options_js_1.isFile)(opt) ? listFile(opt, cb)
    +            : list_(opt));
    +}
    +exports.list = list;
    +const onentryFunction = (opt) => {
    +    const onentry = opt.onentry;
    +    opt.onentry =
    +        onentry ?
    +            e => {
    +                onentry(e);
    +                e.resume();
    +            }
    +            : e => e.resume();
    +};
    +// construct a filter that limits the file entries listed
    +// include child entries if a dir is included
    +const filesFilter = (opt, files) => {
    +    const map = new Map(files.map(f => [(0, strip_trailing_slashes_js_1.stripTrailingSlashes)(f), true]));
    +    const filter = opt.filter;
    +    const mapHas = (file, r = '') => {
    +        const root = r || (0, path_1.parse)(file).root || '.';
    +        let ret;
    +        if (file === root)
    +            ret = false;
    +        else {
    +            const m = map.get(file);
    +            if (m !== undefined) {
    +                ret = m;
    +            }
    +            else {
    +                ret = mapHas((0, path_1.dirname)(file), root);
    +            }
    +        }
    +        map.set(file, ret);
    +        return ret;
    +    };
    +    opt.filter =
    +        filter ?
    +            (file, entry) => filter(file, entry) && mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file))
    +            : file => mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file));
    +};
    +const listFileSync = (opt) => {
    +    const p = list_(opt);
    +    const file = opt.file;
    +    let fd;
    +    try {
    +        const stat = node_fs_1.default.statSync(file);
    +        const readSize = opt.maxReadSize || 16 * 1024 * 1024;
    +        if (stat.size < readSize) {
    +            p.end(node_fs_1.default.readFileSync(file));
    +        }
    +        else {
    +            let pos = 0;
    +            const buf = Buffer.allocUnsafe(readSize);
    +            fd = node_fs_1.default.openSync(file, 'r');
    +            while (pos < stat.size) {
    +                const bytesRead = node_fs_1.default.readSync(fd, buf, 0, readSize, pos);
    +                pos += bytesRead;
    +                p.write(buf.subarray(0, bytesRead));
    +            }
    +            p.end();
    +        }
    +    }
    +    finally {
    +        if (typeof fd === 'number') {
    +            try {
    +                node_fs_1.default.closeSync(fd);
    +                /* c8 ignore next */
    +            }
    +            catch (er) { }
    +        }
    +    }
    +};
    +const listFile = (opt, cb) => {
    +    const parse = new parse_js_1.Parser(opt);
    +    const readSize = opt.maxReadSize || 16 * 1024 * 1024;
    +    const file = opt.file;
    +    const p = new Promise((resolve, reject) => {
    +        parse.on('error', reject);
    +        parse.on('end', resolve);
    +        node_fs_1.default.stat(file, (er, stat) => {
    +            if (er) {
    +                reject(er);
    +            }
    +            else {
    +                const stream = new fsm.ReadStream(file, {
    +                    readSize: readSize,
    +                    size: stat.size,
    +                });
    +                stream.on('error', reject);
    +                stream.pipe(parse);
    +            }
    +        });
    +    });
    +    return cb ? p.then(cb, cb) : p;
    +};
    +const list_ = (opt) => new parse_js_1.Parser(opt);
    +//# sourceMappingURL=list.js.map
     
    -                    return hashLength === 0 ? href : href.substring(0, href.length - hashLength)
    -                }
    +/***/ }),
     
    -                // https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points
    -                /**
    -                 * @param {(char: string) => boolean} condition
    -                 * @param {string} input
    -                 * @param {{ position: number }} position
    -                 */
    -                function collectASequenceOfCodePoints(condition, input, position) {
    -                    // 1. Let result be the empty string.
    -                    let result = ''
    -
    -                    // 2. While position doesn’t point past the end of input and the
    -                    // code point at position within input meets the condition condition:
    -                    while (position.position < input.length && condition(input[position.position])) {
    -                        // 1. Append that code point to the end of result.
    -                        result += input[position.position]
    -
    -                        // 2. Advance position by 1.
    -                        position.position++
    -                    }
    +/***/ 8704:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
     
    -                    // 3. Return result.
    -                    return result
    -                }
    +"use strict";
     
    -                /**
    -                 * A faster collectASequenceOfCodePoints that only works when comparing a single character.
    -                 * @param {string} char
    -                 * @param {string} input
    -                 * @param {{ position: number }} position
    -                 */
    -                function collectASequenceOfCodePointsFast(char, input, position) {
    -                    const idx = input.indexOf(char, position.position)
    -                    const start = position.position
    -
    -                    if (idx === -1) {
    -                        position.position = input.length
    -                        return input.slice(start)
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.mkdirSync = exports.mkdir = void 0;
    +const chownr_1 = __nccwpck_require__(235);
    +const fs_1 = __importDefault(__nccwpck_require__(7147));
    +const mkdirp_1 = __nccwpck_require__(7280);
    +const node_path_1 = __importDefault(__nccwpck_require__(9411));
    +const cwd_error_js_1 = __nccwpck_require__(6861);
    +const normalize_windows_path_js_1 = __nccwpck_require__(762);
    +const symlink_error_js_1 = __nccwpck_require__(3012);
    +const cGet = (cache, key) => cache.get((0, normalize_windows_path_js_1.normalizeWindowsPath)(key));
    +const cSet = (cache, key, val) => cache.set((0, normalize_windows_path_js_1.normalizeWindowsPath)(key), val);
    +const checkCwd = (dir, cb) => {
    +    fs_1.default.stat(dir, (er, st) => {
    +        if (er || !st.isDirectory()) {
    +            er = new cwd_error_js_1.CwdError(dir, er?.code || 'ENOTDIR');
    +        }
    +        cb(er);
    +    });
    +};
    +/**
    + * Wrapper around mkdirp for tar's needs.
    + *
    + * The main purpose is to avoid creating directories if we know that
    + * they already exist (and track which ones exist for this purpose),
    + * and prevent entries from being extracted into symlinked folders,
    + * if `preservePaths` is not set.
    + */
    +const mkdir = (dir, opt, cb) => {
    +    dir = (0, normalize_windows_path_js_1.normalizeWindowsPath)(dir);
    +    // if there's any overlap between mask and mode,
    +    // then we'll need an explicit chmod
    +    /* c8 ignore next */
    +    const umask = opt.umask ?? 0o22;
    +    const mode = opt.mode | 0o0700;
    +    const needChmod = (mode & umask) !== 0;
    +    const uid = opt.uid;
    +    const gid = opt.gid;
    +    const doChown = typeof uid === 'number' &&
    +        typeof gid === 'number' &&
    +        (uid !== opt.processUid || gid !== opt.processGid);
    +    const preserve = opt.preserve;
    +    const unlink = opt.unlink;
    +    const cache = opt.cache;
    +    const cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.cwd);
    +    const done = (er, created) => {
    +        if (er) {
    +            cb(er);
    +        }
    +        else {
    +            cSet(cache, dir, true);
    +            if (created && doChown) {
    +                (0, chownr_1.chownr)(created, uid, gid, er => done(er));
    +            }
    +            else if (needChmod) {
    +                fs_1.default.chmod(dir, mode, cb);
    +            }
    +            else {
    +                cb();
    +            }
    +        }
    +    };
    +    if (cache && cGet(cache, dir) === true) {
    +        return done();
    +    }
    +    if (dir === cwd) {
    +        return checkCwd(dir, done);
    +    }
    +    if (preserve) {
    +        return (0, mkdirp_1.mkdirp)(dir, { mode }).then(made => done(null, made ?? undefined), // oh, ts
    +        done);
    +    }
    +    const sub = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.relative(cwd, dir));
    +    const parts = sub.split('/');
    +    mkdir_(cwd, parts, mode, cache, unlink, cwd, undefined, done);
    +};
    +exports.mkdir = mkdir;
    +const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => {
    +    if (!parts.length) {
    +        return cb(null, created);
    +    }
    +    const p = parts.shift();
    +    const part = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(base + '/' + p));
    +    if (cGet(cache, part)) {
    +        return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb);
    +    }
    +    fs_1.default.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb));
    +};
    +const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => (er) => {
    +    if (er) {
    +        fs_1.default.lstat(part, (statEr, st) => {
    +            if (statEr) {
    +                statEr.path =
    +                    statEr.path && (0, normalize_windows_path_js_1.normalizeWindowsPath)(statEr.path);
    +                cb(statEr);
    +            }
    +            else if (st.isDirectory()) {
    +                mkdir_(part, parts, mode, cache, unlink, cwd, created, cb);
    +            }
    +            else if (unlink) {
    +                fs_1.default.unlink(part, er => {
    +                    if (er) {
    +                        return cb(er);
                         }
    +                    fs_1.default.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb));
    +                });
    +            }
    +            else if (st.isSymbolicLink()) {
    +                return cb(new symlink_error_js_1.SymlinkError(part, part + '/' + parts.join('/')));
    +            }
    +            else {
    +                cb(er);
    +            }
    +        });
    +    }
    +    else {
    +        created = created || part;
    +        mkdir_(part, parts, mode, cache, unlink, cwd, created, cb);
    +    }
    +};
    +const checkCwdSync = (dir) => {
    +    let ok = false;
    +    let code = undefined;
    +    try {
    +        ok = fs_1.default.statSync(dir).isDirectory();
    +    }
    +    catch (er) {
    +        code = er?.code;
    +    }
    +    finally {
    +        if (!ok) {
    +            throw new cwd_error_js_1.CwdError(dir, code ?? 'ENOTDIR');
    +        }
    +    }
    +};
    +const mkdirSync = (dir, opt) => {
    +    dir = (0, normalize_windows_path_js_1.normalizeWindowsPath)(dir);
    +    // if there's any overlap between mask and mode,
    +    // then we'll need an explicit chmod
    +    /* c8 ignore next */
    +    const umask = opt.umask ?? 0o22;
    +    const mode = opt.mode | 0o700;
    +    const needChmod = (mode & umask) !== 0;
    +    const uid = opt.uid;
    +    const gid = opt.gid;
    +    const doChown = typeof uid === 'number' &&
    +        typeof gid === 'number' &&
    +        (uid !== opt.processUid || gid !== opt.processGid);
    +    const preserve = opt.preserve;
    +    const unlink = opt.unlink;
    +    const cache = opt.cache;
    +    const cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.cwd);
    +    const done = (created) => {
    +        cSet(cache, dir, true);
    +        if (created && doChown) {
    +            (0, chownr_1.chownrSync)(created, uid, gid);
    +        }
    +        if (needChmod) {
    +            fs_1.default.chmodSync(dir, mode);
    +        }
    +    };
    +    if (cache && cGet(cache, dir) === true) {
    +        return done();
    +    }
    +    if (dir === cwd) {
    +        checkCwdSync(cwd);
    +        return done();
    +    }
    +    if (preserve) {
    +        return done((0, mkdirp_1.mkdirpSync)(dir, mode) ?? undefined);
    +    }
    +    const sub = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.relative(cwd, dir));
    +    const parts = sub.split('/');
    +    let created = undefined;
    +    for (let p = parts.shift(), part = cwd; p && (part += '/' + p); p = parts.shift()) {
    +        part = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(part));
    +        if (cGet(cache, part)) {
    +            continue;
    +        }
    +        try {
    +            fs_1.default.mkdirSync(part, mode);
    +            created = created || part;
    +            cSet(cache, part, true);
    +        }
    +        catch (er) {
    +            const st = fs_1.default.lstatSync(part);
    +            if (st.isDirectory()) {
    +                cSet(cache, part, true);
    +                continue;
    +            }
    +            else if (unlink) {
    +                fs_1.default.unlinkSync(part);
    +                fs_1.default.mkdirSync(part, mode);
    +                created = created || part;
    +                cSet(cache, part, true);
    +                continue;
    +            }
    +            else if (st.isSymbolicLink()) {
    +                return new symlink_error_js_1.SymlinkError(part, part + '/' + parts.join('/'));
    +            }
    +        }
    +    }
    +    return done(created);
    +};
    +exports.mkdirSync = mkdirSync;
    +//# sourceMappingURL=mkdir.js.map
     
    -                    position.position = idx
    -                    return input.slice(start, position.position)
    -                }
    -
    -                // https://url.spec.whatwg.org/#string-percent-decode
    -                /** @param {string} input */
    -                function stringPercentDecode(input) {
    -                    // 1. Let bytes be the UTF-8 encoding of input.
    -                    const bytes = encoder.encode(input)
    +/***/ }),
     
    -                    // 2. Return the percent-decoding of bytes.
    -                    return percentDecode(bytes)
    -                }
    +/***/ 1810:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                // https://url.spec.whatwg.org/#percent-decode
    -                /** @param {Uint8Array} input */
    -                function percentDecode(input) {
    -                    // 1. Let output be an empty byte sequence.
    -                    /** @type {number[]} */
    -                    const output = []
    -
    -                    // 2. For each byte byte in input:
    -                    for (let i = 0; i < input.length; i++) {
    -                        const byte = input[i]
    -
    -                        // 1. If byte is not 0x25 (%), then append byte to output.
    -                        if (byte !== 0x25) {
    -                            output.push(byte)
    -
    -                            // 2. Otherwise, if byte is 0x25 (%) and the next two bytes
    -                            // after byte in input are not in the ranges
    -                            // 0x30 (0) to 0x39 (9), 0x41 (A) to 0x46 (F),
    -                            // and 0x61 (a) to 0x66 (f), all inclusive, append byte
    -                            // to output.
    -                        } else if (
    -                            byte === 0x25 &&
    -                            !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2]))
    -                        ) {
    -                            output.push(0x25)
    -
    -                            // 3. Otherwise:
    -                        } else {
    -                            // 1. Let bytePoint be the two bytes after byte in input,
    -                            // decoded, and then interpreted as hexadecimal number.
    -                            const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2])
    -                            const bytePoint = Number.parseInt(nextTwoBytes, 16)
    -
    -                            // 2. Append a byte whose value is bytePoint to output.
    -                            output.push(bytePoint)
    -
    -                            // 3. Skip the next two bytes in input.
    -                            i += 2
    -                        }
    -                    }
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.modeFix = void 0;
    +const modeFix = (mode, isDir, portable) => {
    +    mode &= 0o7777;
    +    // in portable mode, use the minimum reasonable umask
    +    // if this system creates files with 0o664 by default
    +    // (as some linux distros do), then we'll write the
    +    // archive with 0o644 instead.  Also, don't ever create
    +    // a file that is not readable/writable by the owner.
    +    if (portable) {
    +        mode = (mode | 0o600) & ~0o22;
    +    }
    +    // if dirs are readable, then they should be listable
    +    if (isDir) {
    +        if (mode & 0o400) {
    +            mode |= 0o100;
    +        }
    +        if (mode & 0o40) {
    +            mode |= 0o10;
    +        }
    +        if (mode & 0o4) {
    +            mode |= 0o1;
    +        }
    +    }
    +    return mode;
    +};
    +exports.modeFix = modeFix;
    +//# sourceMappingURL=mode-fix.js.map
     
    -                    // 3. Return output.
    -                    return Uint8Array.from(output)
    -                }
    +/***/ }),
     
    -                // https://mimesniff.spec.whatwg.org/#parse-a-mime-type
    -                /** @param {string} input */
    -                function parseMIMEType(input) {
    -                    // 1. Remove any leading and trailing HTTP whitespace
    -                    // from input.
    -                    input = removeHTTPWhitespace(input, true, true)
    -
    -                    // 2. Let position be a position variable for input,
    -                    // initially pointing at the start of input.
    -                    const position = { position: 0 }
    -
    -                    // 3. Let type be the result of collecting a sequence
    -                    // of code points that are not U+002F (/) from
    -                    // input, given position.
    -                    const type = collectASequenceOfCodePointsFast(
    -                        '/',
    -                        input,
    -                        position
    -                    )
    +/***/ 9862:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                    // 4. If type is the empty string or does not solely
    -                    // contain HTTP token code points, then return failure.
    -                    // https://mimesniff.spec.whatwg.org/#http-token-code-point
    -                    if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) {
    -                        return 'failure'
    -                    }
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.normalizeUnicode = void 0;
    +// warning: extremely hot code path.
    +// This has been meticulously optimized for use
    +// within npm install on large package trees.
    +// Do not edit without careful benchmarking.
    +const normalizeCache = Object.create(null);
    +const { hasOwnProperty } = Object.prototype;
    +const normalizeUnicode = (s) => {
    +    if (!hasOwnProperty.call(normalizeCache, s)) {
    +        normalizeCache[s] = s.normalize('NFD');
    +    }
    +    return normalizeCache[s];
    +};
    +exports.normalizeUnicode = normalizeUnicode;
    +//# sourceMappingURL=normalize-unicode.js.map
     
    -                    // 5. If position is past the end of input, then return
    -                    // failure
    -                    if (position.position > input.length) {
    -                        return 'failure'
    -                    }
    +/***/ }),
     
    -                    // 6. Advance position by 1. (This skips past U+002F (/).)
    -                    position.position++
    +/***/ 762:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                    // 7. Let subtype be the result of collecting a sequence of
    -                    // code points that are not U+003B (;) from input, given
    -                    // position.
    -                    let subtype = collectASequenceOfCodePointsFast(
    -                        ';',
    -                        input,
    -                        position
    -                    )
    +"use strict";
     
    -                    // 8. Remove any trailing HTTP whitespace from subtype.
    -                    subtype = removeHTTPWhitespace(subtype, false, true)
    +// on windows, either \ or / are valid directory separators.
    +// on unix, \ is a valid character in filenames.
    +// so, on windows, and only on windows, we replace all \ chars with /,
    +// so that we can use / as our one and only directory separator char.
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.normalizeWindowsPath = void 0;
    +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform;
    +exports.normalizeWindowsPath = platform !== 'win32' ?
    +    (p) => p
    +    : (p) => p && p.replace(/\\/g, '/');
    +//# sourceMappingURL=normalize-windows-path.js.map
     
    -                    // 9. If subtype is the empty string or does not solely
    -                    // contain HTTP token code points, then return failure.
    -                    if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) {
    -                        return 'failure'
    -                    }
    +/***/ }),
     
    -                    const typeLowercase = type.toLowerCase()
    -                    const subtypeLowercase = subtype.toLowerCase()
    -
    -                    // 10. Let mimeType be a new MIME type record whose type
    -                    // is type, in ASCII lowercase, and subtype is subtype,
    -                    // in ASCII lowercase.
    -                    // https://mimesniff.spec.whatwg.org/#mime-type
    -                    const mimeType = {
    -                        type: typeLowercase,
    -                        subtype: subtypeLowercase,
    -                        /** @type {Map} */
    -                        parameters: new Map(),
    -                        // https://mimesniff.spec.whatwg.org/#mime-type-essence
    -                        essence: `${typeLowercase}/${subtypeLowercase}`
    -                    }
    +/***/ 9060:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                    // 11. While position is not past the end of input:
    -                    while (position.position < input.length) {
    -                        // 1. Advance position by 1. (This skips past U+003B (;).)
    -                        position.position++
    -
    -                        // 2. Collect a sequence of code points that are HTTP
    -                        // whitespace from input given position.
    -                        collectASequenceOfCodePoints(
    -                            // https://fetch.spec.whatwg.org/#http-whitespace
    -                            char => HTTP_WHITESPACE_REGEX.test(char),
    -                            input,
    -                            position
    -                        )
    -
    -                        // 3. Let parameterName be the result of collecting a
    -                        // sequence of code points that are not U+003B (;)
    -                        // or U+003D (=) from input, given position.
    -                        let parameterName = collectASequenceOfCodePoints(
    -                            (char) => char !== ';' && char !== '=',
    -                            input,
    -                            position
    -                        )
    -
    -                        // 4. Set parameterName to parameterName, in ASCII
    -                        // lowercase.
    -                        parameterName = parameterName.toLowerCase()
    -
    -                        // 5. If position is not past the end of input, then:
    -                        if (position.position < input.length) {
    -                            // 1. If the code point at position within input is
    -                            // U+003B (;), then continue.
    -                            if (input[position.position] === ';') {
    -                                continue
    -                            }
    +"use strict";
    +
    +// turn tar(1) style args like `C` into the more verbose things like `cwd`
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.dealias = exports.isFile = exports.isSync = exports.isSyncFile = void 0;
    +const argmap = new Map([
    +    ['C', 'cwd'],
    +    ['f', 'file'],
    +    ['z', 'gzip'],
    +    ['P', 'preservePaths'],
    +    ['U', 'unlink'],
    +    ['strip-components', 'strip'],
    +    ['stripComponents', 'strip'],
    +    ['keep-newer', 'newer'],
    +    ['keepNewer', 'newer'],
    +    ['keep-newer-files', 'newer'],
    +    ['keepNewerFiles', 'newer'],
    +    ['k', 'keep'],
    +    ['keep-existing', 'keep'],
    +    ['keepExisting', 'keep'],
    +    ['m', 'noMtime'],
    +    ['no-mtime', 'noMtime'],
    +    ['p', 'preserveOwner'],
    +    ['L', 'follow'],
    +    ['h', 'follow'],
    +]);
    +const isSyncFile = (o) => !!o.sync && !!o.file;
    +exports.isSyncFile = isSyncFile;
    +const isSync = (o) => !!o.sync;
    +exports.isSync = isSync;
    +const isFile = (o) => !!o.file;
    +exports.isFile = isFile;
    +const dealiasKey = (k) => {
    +    const d = argmap.get(k);
    +    if (d)
    +        return d;
    +    return k;
    +};
    +const dealias = (opt = {}) => {
    +    if (!opt)
    +        return {};
    +    const result = {};
    +    for (const [key, v] of Object.entries(opt)) {
    +        // TS doesn't know that aliases are going to always be the same type
    +        const k = dealiasKey(key);
    +        result[k] = v;
    +    }
    +    // affordance for deprecated noChmod -> chmod
    +    if (result.chmod === undefined && result.noChmod === false) {
    +        result.chmod = true;
    +    }
    +    delete result.noChmod;
    +    return result;
    +};
    +exports.dealias = dealias;
    +//# sourceMappingURL=options.js.map
     
    -                            // 2. Advance position by 1. (This skips past U+003D (=).)
    -                            position.position++
    -                        }
    +/***/ }),
     
    -                        // 6. If position is past the end of input, then break.
    -                        if (position.position > input.length) {
    -                            break
    -                        }
    +/***/ 7788:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
    +
    +"use strict";
    +
    +// A readable tar stream creator
    +// Technically, this is a transform stream that you write paths into,
    +// and tar format comes out of.
    +// The `add()` method is like `write()` but returns this,
    +// and end() return `this` as well, so you can
    +// do `new Pack(opt).add('files').add('dir').end().pipe(output)
    +// You could also do something like:
    +// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar'))
    +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    var desc = Object.getOwnPropertyDescriptor(m, k);
    +    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    +      desc = { enumerable: true, get: function() { return m[k]; } };
    +    }
    +    Object.defineProperty(o, k2, desc);
    +}) : (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    o[k2] = m[k];
    +}));
    +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    +    Object.defineProperty(o, "default", { enumerable: true, value: v });
    +}) : function(o, v) {
    +    o["default"] = v;
    +});
    +var __importStar = (this && this.__importStar) || function (mod) {
    +    if (mod && mod.__esModule) return mod;
    +    var result = {};
    +    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    +    __setModuleDefault(result, mod);
    +    return result;
    +};
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.PackSync = exports.Pack = exports.PackJob = void 0;
    +const fs_1 = __importDefault(__nccwpck_require__(7147));
    +const write_entry_js_1 = __nccwpck_require__(4028);
    +class PackJob {
    +    path;
    +    absolute;
    +    entry;
    +    stat;
    +    readdir;
    +    pending = false;
    +    ignore = false;
    +    piped = false;
    +    constructor(path, absolute) {
    +        this.path = path || './';
    +        this.absolute = absolute;
    +    }
    +}
    +exports.PackJob = PackJob;
    +const minipass_1 = __nccwpck_require__(4721);
    +const zlib = __importStar(__nccwpck_require__(6139));
    +//@ts-ignore
    +const yallist_1 = __nccwpck_require__(3796);
    +const read_entry_js_1 = __nccwpck_require__(7369);
    +const warn_method_js_1 = __nccwpck_require__(449);
    +const EOF = Buffer.alloc(1024);
    +const ONSTAT = Symbol('onStat');
    +const ENDED = Symbol('ended');
    +const QUEUE = Symbol('queue');
    +const CURRENT = Symbol('current');
    +const PROCESS = Symbol('process');
    +const PROCESSING = Symbol('processing');
    +const PROCESSJOB = Symbol('processJob');
    +const JOBS = Symbol('jobs');
    +const JOBDONE = Symbol('jobDone');
    +const ADDFSENTRY = Symbol('addFSEntry');
    +const ADDTARENTRY = Symbol('addTarEntry');
    +const STAT = Symbol('stat');
    +const READDIR = Symbol('readdir');
    +const ONREADDIR = Symbol('onreaddir');
    +const PIPE = Symbol('pipe');
    +const ENTRY = Symbol('entry');
    +const ENTRYOPT = Symbol('entryOpt');
    +const WRITEENTRYCLASS = Symbol('writeEntryClass');
    +const WRITE = Symbol('write');
    +const ONDRAIN = Symbol('ondrain');
    +const path_1 = __importDefault(__nccwpck_require__(1017));
    +const normalize_windows_path_js_1 = __nccwpck_require__(762);
    +class Pack extends minipass_1.Minipass {
    +    opt;
    +    cwd;
    +    maxReadSize;
    +    preservePaths;
    +    strict;
    +    noPax;
    +    prefix;
    +    linkCache;
    +    statCache;
    +    file;
    +    portable;
    +    zip;
    +    readdirCache;
    +    noDirRecurse;
    +    follow;
    +    noMtime;
    +    mtime;
    +    filter;
    +    jobs;
    +    [WRITEENTRYCLASS];
    +    [QUEUE];
    +    [JOBS] = 0;
    +    [PROCESSING] = false;
    +    [ENDED] = false;
    +    constructor(opt = {}) {
    +        super();
    +        this.opt = opt;
    +        this.file = opt.file || '';
    +        this.cwd = opt.cwd || process.cwd();
    +        this.maxReadSize = opt.maxReadSize;
    +        this.preservePaths = !!opt.preservePaths;
    +        this.strict = !!opt.strict;
    +        this.noPax = !!opt.noPax;
    +        this.prefix = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.prefix || '');
    +        this.linkCache = opt.linkCache || new Map();
    +        this.statCache = opt.statCache || new Map();
    +        this.readdirCache = opt.readdirCache || new Map();
    +        this[WRITEENTRYCLASS] = write_entry_js_1.WriteEntry;
    +        if (typeof opt.onwarn === 'function') {
    +            this.on('warn', opt.onwarn);
    +        }
    +        this.portable = !!opt.portable;
    +        if (opt.gzip || opt.brotli) {
    +            if (opt.gzip && opt.brotli) {
    +                throw new TypeError('gzip and brotli are mutually exclusive');
    +            }
    +            if (opt.gzip) {
    +                if (typeof opt.gzip !== 'object') {
    +                    opt.gzip = {};
    +                }
    +                if (this.portable) {
    +                    opt.gzip.portable = true;
    +                }
    +                this.zip = new zlib.Gzip(opt.gzip);
    +            }
    +            if (opt.brotli) {
    +                if (typeof opt.brotli !== 'object') {
    +                    opt.brotli = {};
    +                }
    +                this.zip = new zlib.BrotliCompress(opt.brotli);
    +            }
    +            /* c8 ignore next */
    +            if (!this.zip)
    +                throw new Error('impossible');
    +            const zip = this.zip;
    +            zip.on('data', chunk => super.write(chunk));
    +            zip.on('end', () => super.end());
    +            zip.on('drain', () => this[ONDRAIN]());
    +            this.on('resume', () => zip.resume());
    +        }
    +        else {
    +            this.on('drain', this[ONDRAIN]);
    +        }
    +        this.noDirRecurse = !!opt.noDirRecurse;
    +        this.follow = !!opt.follow;
    +        this.noMtime = !!opt.noMtime;
    +        if (opt.mtime)
    +            this.mtime = opt.mtime;
    +        this.filter =
    +            typeof opt.filter === 'function' ? opt.filter : _ => true;
    +        this[QUEUE] = new yallist_1.Yallist();
    +        this[JOBS] = 0;
    +        this.jobs = Number(opt.jobs) || 4;
    +        this[PROCESSING] = false;
    +        this[ENDED] = false;
    +    }
    +    [WRITE](chunk) {
    +        return super.write(chunk);
    +    }
    +    add(path) {
    +        this.write(path);
    +        return this;
    +    }
    +    //@ts-ignore
    +    end(path) {
    +        if (path) {
    +            this.add(path);
    +        }
    +        this[ENDED] = true;
    +        this[PROCESS]();
    +        return this;
    +    }
    +    //@ts-ignore
    +    write(path) {
    +        if (this[ENDED]) {
    +            throw new Error('write after end');
    +        }
    +        if (path instanceof read_entry_js_1.ReadEntry) {
    +            this[ADDTARENTRY](path);
    +        }
    +        else {
    +            this[ADDFSENTRY](path);
    +        }
    +        return this.flowing;
    +    }
    +    [ADDTARENTRY](p) {
    +        const absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path_1.default.resolve(this.cwd, p.path));
    +        // in this case, we don't have to wait for the stat
    +        if (!this.filter(p.path, p)) {
    +            p.resume();
    +        }
    +        else {
    +            const job = new PackJob(p.path, absolute);
    +            job.entry = new write_entry_js_1.WriteEntryTar(p, this[ENTRYOPT](job));
    +            job.entry.on('end', () => this[JOBDONE](job));
    +            this[JOBS] += 1;
    +            this[QUEUE].push(job);
    +        }
    +        this[PROCESS]();
    +    }
    +    [ADDFSENTRY](p) {
    +        const absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path_1.default.resolve(this.cwd, p));
    +        this[QUEUE].push(new PackJob(p, absolute));
    +        this[PROCESS]();
    +    }
    +    [STAT](job) {
    +        job.pending = true;
    +        this[JOBS] += 1;
    +        const stat = this.follow ? 'stat' : 'lstat';
    +        fs_1.default[stat](job.absolute, (er, stat) => {
    +            job.pending = false;
    +            this[JOBS] -= 1;
    +            if (er) {
    +                this.emit('error', er);
    +            }
    +            else {
    +                this[ONSTAT](job, stat);
    +            }
    +        });
    +    }
    +    [ONSTAT](job, stat) {
    +        this.statCache.set(job.absolute, stat);
    +        job.stat = stat;
    +        // now we have the stat, we can filter it.
    +        if (!this.filter(job.path, stat)) {
    +            job.ignore = true;
    +        }
    +        this[PROCESS]();
    +    }
    +    [READDIR](job) {
    +        job.pending = true;
    +        this[JOBS] += 1;
    +        fs_1.default.readdir(job.absolute, (er, entries) => {
    +            job.pending = false;
    +            this[JOBS] -= 1;
    +            if (er) {
    +                return this.emit('error', er);
    +            }
    +            this[ONREADDIR](job, entries);
    +        });
    +    }
    +    [ONREADDIR](job, entries) {
    +        this.readdirCache.set(job.absolute, entries);
    +        job.readdir = entries;
    +        this[PROCESS]();
    +    }
    +    [PROCESS]() {
    +        if (this[PROCESSING]) {
    +            return;
    +        }
    +        this[PROCESSING] = true;
    +        for (let w = this[QUEUE].head; !!w && this[JOBS] < this.jobs; w = w.next) {
    +            this[PROCESSJOB](w.value);
    +            if (w.value.ignore) {
    +                const p = w.next;
    +                this[QUEUE].removeNode(w);
    +                w.next = p;
    +            }
    +        }
    +        this[PROCESSING] = false;
    +        if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) {
    +            if (this.zip) {
    +                this.zip.end(EOF);
    +            }
    +            else {
    +                super.write(EOF);
    +                super.end();
    +            }
    +        }
    +    }
    +    get [CURRENT]() {
    +        return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value;
    +    }
    +    [JOBDONE](_job) {
    +        this[QUEUE].shift();
    +        this[JOBS] -= 1;
    +        this[PROCESS]();
    +    }
    +    [PROCESSJOB](job) {
    +        if (job.pending) {
    +            return;
    +        }
    +        if (job.entry) {
    +            if (job === this[CURRENT] && !job.piped) {
    +                this[PIPE](job);
    +            }
    +            return;
    +        }
    +        if (!job.stat) {
    +            const sc = this.statCache.get(job.absolute);
    +            if (sc) {
    +                this[ONSTAT](job, sc);
    +            }
    +            else {
    +                this[STAT](job);
    +            }
    +        }
    +        if (!job.stat) {
    +            return;
    +        }
    +        // filtered out!
    +        if (job.ignore) {
    +            return;
    +        }
    +        if (!this.noDirRecurse &&
    +            job.stat.isDirectory() &&
    +            !job.readdir) {
    +            const rc = this.readdirCache.get(job.absolute);
    +            if (rc) {
    +                this[ONREADDIR](job, rc);
    +            }
    +            else {
    +                this[READDIR](job);
    +            }
    +            if (!job.readdir) {
    +                return;
    +            }
    +        }
    +        // we know it doesn't have an entry, because that got checked above
    +        job.entry = this[ENTRY](job);
    +        if (!job.entry) {
    +            job.ignore = true;
    +            return;
    +        }
    +        if (job === this[CURRENT] && !job.piped) {
    +            this[PIPE](job);
    +        }
    +    }
    +    [ENTRYOPT](job) {
    +        return {
    +            onwarn: (code, msg, data) => this.warn(code, msg, data),
    +            noPax: this.noPax,
    +            cwd: this.cwd,
    +            absolute: job.absolute,
    +            preservePaths: this.preservePaths,
    +            maxReadSize: this.maxReadSize,
    +            strict: this.strict,
    +            portable: this.portable,
    +            linkCache: this.linkCache,
    +            statCache: this.statCache,
    +            noMtime: this.noMtime,
    +            mtime: this.mtime,
    +            prefix: this.prefix,
    +        };
    +    }
    +    [ENTRY](job) {
    +        this[JOBS] += 1;
    +        try {
    +            return new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job))
    +                .on('end', () => this[JOBDONE](job))
    +                .on('error', er => this.emit('error', er));
    +        }
    +        catch (er) {
    +            this.emit('error', er);
    +        }
    +    }
    +    [ONDRAIN]() {
    +        if (this[CURRENT] && this[CURRENT].entry) {
    +            this[CURRENT].entry.resume();
    +        }
    +    }
    +    // like .pipe() but using super, because our write() is special
    +    [PIPE](job) {
    +        job.piped = true;
    +        if (job.readdir) {
    +            job.readdir.forEach(entry => {
    +                const p = job.path;
    +                const base = p === './' ? '' : p.replace(/\/*$/, '/');
    +                this[ADDFSENTRY](base + entry);
    +            });
    +        }
    +        const source = job.entry;
    +        const zip = this.zip;
    +        /* c8 ignore start */
    +        if (!source)
    +            throw new Error('cannot pipe without source');
    +        /* c8 ignore stop */
    +        if (zip) {
    +            source.on('data', chunk => {
    +                if (!zip.write(chunk)) {
    +                    source.pause();
    +                }
    +            });
    +        }
    +        else {
    +            source.on('data', chunk => {
    +                if (!super.write(chunk)) {
    +                    source.pause();
    +                }
    +            });
    +        }
    +    }
    +    pause() {
    +        if (this.zip) {
    +            this.zip.pause();
    +        }
    +        return super.pause();
    +    }
    +    warn(code, message, data = {}) {
    +        (0, warn_method_js_1.warnMethod)(this, code, message, data);
    +    }
    +}
    +exports.Pack = Pack;
    +class PackSync extends Pack {
    +    constructor(opt) {
    +        super(opt);
    +        this[WRITEENTRYCLASS] = write_entry_js_1.WriteEntrySync;
    +    }
    +    // pause/resume are no-ops in sync streams.
    +    pause() { }
    +    resume() { }
    +    [STAT](job) {
    +        const stat = this.follow ? 'statSync' : 'lstatSync';
    +        this[ONSTAT](job, fs_1.default[stat](job.absolute));
    +    }
    +    [READDIR](job) {
    +        this[ONREADDIR](job, fs_1.default.readdirSync(job.absolute));
    +    }
    +    // gotta get it all in this tick
    +    [PIPE](job) {
    +        const source = job.entry;
    +        const zip = this.zip;
    +        if (job.readdir) {
    +            job.readdir.forEach(entry => {
    +                const p = job.path;
    +                const base = p === './' ? '' : p.replace(/\/*$/, '/');
    +                this[ADDFSENTRY](base + entry);
    +            });
    +        }
    +        /* c8 ignore start */
    +        if (!source)
    +            throw new Error('Cannot pipe without source');
    +        /* c8 ignore stop */
    +        if (zip) {
    +            source.on('data', chunk => {
    +                zip.write(chunk);
    +            });
    +        }
    +        else {
    +            source.on('data', chunk => {
    +                super[WRITE](chunk);
    +            });
    +        }
    +    }
    +}
    +exports.PackSync = PackSync;
    +//# sourceMappingURL=pack.js.map
     
    -                        // 7. Let parameterValue be null.
    -                        let parameterValue = null
    -
    -                        // 8. If the code point at position within input is
    -                        // U+0022 ("), then:
    -                        if (input[position.position] === '"') {
    -                            // 1. Set parameterValue to the result of collecting
    -                            // an HTTP quoted string from input, given position
    -                            // and the extract-value flag.
    -                            parameterValue = collectAnHTTPQuotedString(input, position, true)
    -
    -                            // 2. Collect a sequence of code points that are not
    -                            // U+003B (;) from input, given position.
    -                            collectASequenceOfCodePointsFast(
    -                                ';',
    -                                input,
    -                                position
    -                            )
    -
    -                            // 9. Otherwise:
    -                        } else {
    -                            // 1. Set parameterValue to the result of collecting
    -                            // a sequence of code points that are not U+003B (;)
    -                            // from input, given position.
    -                            parameterValue = collectASequenceOfCodePointsFast(
    -                                ';',
    -                                input,
    -                                position
    -                            )
    -
    -                            // 2. Remove any trailing HTTP whitespace from parameterValue.
    -                            parameterValue = removeHTTPWhitespace(parameterValue, false, true)
    -
    -                            // 3. If parameterValue is the empty string, then continue.
    -                            if (parameterValue.length === 0) {
    -                                continue
    -                            }
    -                        }
    +/***/ }),
     
    -                        // 10. If all of the following are true
    -                        // - parameterName is not the empty string
    -                        // - parameterName solely contains HTTP token code points
    -                        // - parameterValue solely contains HTTP quoted-string token code points
    -                        // - mimeType’s parameters[parameterName] does not exist
    -                        // then set mimeType’s parameters[parameterName] to parameterValue.
    -                        if (
    -                            parameterName.length !== 0 &&
    -                            HTTP_TOKEN_CODEPOINTS.test(parameterName) &&
    -                            (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) &&
    -                            !mimeType.parameters.has(parameterName)
    -                        ) {
    -                            mimeType.parameters.set(parameterName, parameterValue)
    -                        }
    -                    }
    +/***/ 2522:
    +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
     
    -                    // 12. Return mimeType.
    -                    return mimeType
    +"use strict";
    +
    +// this[BUFFER] is the remainder of a chunk if we're waiting for
    +// the full 512 bytes of a header to come in.  We will Buffer.concat()
    +// it to the next write(), which is a mem copy, but a small one.
    +//
    +// this[QUEUE] is a Yallist of entries that haven't been emitted
    +// yet this can only get filled up if the user keeps write()ing after
    +// a write() returns false, or does a write() with more than one entry
    +//
    +// We don't buffer chunks, we always parse them and either create an
    +// entry, or push it into the active entry.  The ReadEntry class knows
    +// to throw data away if .ignore=true
    +//
    +// Shift entry off the buffer when it emits 'end', and emit 'entry' for
    +// the next one in the list.
    +//
    +// At any time, we're pushing body chunks into the entry at WRITEENTRY,
    +// and waiting for 'end' on the entry at READENTRY
    +//
    +// ignored entries get .resume() called on them straight away
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.Parser = void 0;
    +const events_1 = __nccwpck_require__(2361);
    +const minizlib_1 = __nccwpck_require__(6139);
    +const yallist_1 = __nccwpck_require__(3796);
    +const header_js_1 = __nccwpck_require__(2374);
    +const pax_js_1 = __nccwpck_require__(8567);
    +const read_entry_js_1 = __nccwpck_require__(7369);
    +const warn_method_js_1 = __nccwpck_require__(449);
    +const maxMetaEntrySize = 1024 * 1024;
    +const gzipHeader = Buffer.from([0x1f, 0x8b]);
    +const STATE = Symbol('state');
    +const WRITEENTRY = Symbol('writeEntry');
    +const READENTRY = Symbol('readEntry');
    +const NEXTENTRY = Symbol('nextEntry');
    +const PROCESSENTRY = Symbol('processEntry');
    +const EX = Symbol('extendedHeader');
    +const GEX = Symbol('globalExtendedHeader');
    +const META = Symbol('meta');
    +const EMITMETA = Symbol('emitMeta');
    +const BUFFER = Symbol('buffer');
    +const QUEUE = Symbol('queue');
    +const ENDED = Symbol('ended');
    +const EMITTEDEND = Symbol('emittedEnd');
    +const EMIT = Symbol('emit');
    +const UNZIP = Symbol('unzip');
    +const CONSUMECHUNK = Symbol('consumeChunk');
    +const CONSUMECHUNKSUB = Symbol('consumeChunkSub');
    +const CONSUMEBODY = Symbol('consumeBody');
    +const CONSUMEMETA = Symbol('consumeMeta');
    +const CONSUMEHEADER = Symbol('consumeHeader');
    +const CONSUMING = Symbol('consuming');
    +const BUFFERCONCAT = Symbol('bufferConcat');
    +const MAYBEEND = Symbol('maybeEnd');
    +const WRITING = Symbol('writing');
    +const ABORTED = Symbol('aborted');
    +const DONE = Symbol('onDone');
    +const SAW_VALID_ENTRY = Symbol('sawValidEntry');
    +const SAW_NULL_BLOCK = Symbol('sawNullBlock');
    +const SAW_EOF = Symbol('sawEOF');
    +const CLOSESTREAM = Symbol('closeStream');
    +const noop = () => true;
    +class Parser extends events_1.EventEmitter {
    +    file;
    +    strict;
    +    maxMetaEntrySize;
    +    filter;
    +    brotli;
    +    writable = true;
    +    readable = false;
    +    [QUEUE] = new yallist_1.Yallist();
    +    [BUFFER];
    +    [READENTRY];
    +    [WRITEENTRY];
    +    [STATE] = 'begin';
    +    [META] = '';
    +    [EX];
    +    [GEX];
    +    [ENDED] = false;
    +    [UNZIP];
    +    [ABORTED] = false;
    +    [SAW_VALID_ENTRY];
    +    [SAW_NULL_BLOCK] = false;
    +    [SAW_EOF] = false;
    +    [WRITING] = false;
    +    [CONSUMING] = false;
    +    [EMITTEDEND] = false;
    +    constructor(opt = {}) {
    +        super();
    +        this.file = opt.file || '';
    +        // these BADARCHIVE errors can't be detected early. listen on DONE.
    +        this.on(DONE, () => {
    +            if (this[STATE] === 'begin' ||
    +                this[SAW_VALID_ENTRY] === false) {
    +                // either less than 1 block of data, or all entries were invalid.
    +                // Either way, probably not even a tarball.
    +                this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format');
    +            }
    +        });
    +        if (opt.ondone) {
    +            this.on(DONE, opt.ondone);
    +        }
    +        else {
    +            this.on(DONE, () => {
    +                this.emit('prefinish');
    +                this.emit('finish');
    +                this.emit('end');
    +            });
    +        }
    +        this.strict = !!opt.strict;
    +        this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize;
    +        this.filter = typeof opt.filter === 'function' ? opt.filter : noop;
    +        // Unlike gzip, brotli doesn't have any magic bytes to identify it
    +        // Users need to explicitly tell us they're extracting a brotli file
    +        // Or we infer from the file extension
    +        const isTBR = opt.file &&
    +            (opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr'));
    +        // if it's a tbr file it MIGHT be brotli, but we don't know until
    +        // we look at it and verify it's not a valid tar file.
    +        this.brotli =
    +            !opt.gzip && opt.brotli !== undefined ? opt.brotli
    +                : isTBR ? undefined
    +                    : false;
    +        // have to set this so that streams are ok piping into it
    +        this.on('end', () => this[CLOSESTREAM]());
    +        if (typeof opt.onwarn === 'function') {
    +            this.on('warn', opt.onwarn);
    +        }
    +        if (typeof opt.onentry === 'function') {
    +            this.on('entry', opt.onentry);
    +        }
    +    }
    +    warn(code, message, data = {}) {
    +        (0, warn_method_js_1.warnMethod)(this, code, message, data);
    +    }
    +    [CONSUMEHEADER](chunk, position) {
    +        if (this[SAW_VALID_ENTRY] === undefined) {
    +            this[SAW_VALID_ENTRY] = false;
    +        }
    +        let header;
    +        try {
    +            header = new header_js_1.Header(chunk, position, this[EX], this[GEX]);
    +        }
    +        catch (er) {
    +            return this.warn('TAR_ENTRY_INVALID', er);
    +        }
    +        if (header.nullBlock) {
    +            if (this[SAW_NULL_BLOCK]) {
    +                this[SAW_EOF] = true;
    +                // ending an archive with no entries.  pointless, but legal.
    +                if (this[STATE] === 'begin') {
    +                    this[STATE] = 'header';
    +                }
    +                this[EMIT]('eof');
    +            }
    +            else {
    +                this[SAW_NULL_BLOCK] = true;
    +                this[EMIT]('nullBlock');
    +            }
    +        }
    +        else {
    +            this[SAW_NULL_BLOCK] = false;
    +            if (!header.cksumValid) {
    +                this.warn('TAR_ENTRY_INVALID', 'checksum failure', { header });
    +            }
    +            else if (!header.path) {
    +                this.warn('TAR_ENTRY_INVALID', 'path is required', { header });
    +            }
    +            else {
    +                const type = header.type;
    +                if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) {
    +                    this.warn('TAR_ENTRY_INVALID', 'linkpath required', {
    +                        header,
    +                    });
                     }
    -
    -                // https://infra.spec.whatwg.org/#forgiving-base64-decode
    -                /** @param {string} data */
    -                function forgivingBase64(data) {
    -                    // 1. Remove all ASCII whitespace from data.
    -                    data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, '')  // eslint-disable-line
    -
    -                    // 2. If data’s code point length divides by 4 leaving
    -                    // no remainder, then:
    -                    if (data.length % 4 === 0) {
    -                        // 1. If data ends with one or two U+003D (=) code points,
    -                        // then remove them from data.
    -                        data = data.replace(/=?=$/, '')
    -                    }
    -
    -                    // 3. If data’s code point length divides by 4 leaving
    -                    // a remainder of 1, then return failure.
    -                    if (data.length % 4 === 1) {
    -                        return 'failure'
    -                    }
    -
    -                    // 4. If data contains a code point that is not one of
    -                    //  U+002B (+)
    -                    //  U+002F (/)
    -                    //  ASCII alphanumeric
    -                    // then return failure.
    -                    if (/[^+/0-9A-Za-z]/.test(data)) {
    -                        return 'failure'
    -                    }
    -
    -                    const binary = atob(data)
    -                    const bytes = new Uint8Array(binary.length)
    -
    -                    for (let byte = 0; byte < binary.length; byte++) {
    -                        bytes[byte] = binary.charCodeAt(byte)
    -                    }
    -
    -                    return bytes
    +                else if (!/^(Symbolic)?Link$/.test(type) &&
    +                    !/^(Global)?ExtendedHeader$/.test(type) &&
    +                    header.linkpath) {
    +                    this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', {
    +                        header,
    +                    });
                     }
    -
    -                // https://fetch.spec.whatwg.org/#collect-an-http-quoted-string
    -                // tests: https://fetch.spec.whatwg.org/#example-http-quoted-string
    -                /**
    -                 * @param {string} input
    -                 * @param {{ position: number }} position
    -                 * @param {boolean?} extractValue
    -                 */
    -                function collectAnHTTPQuotedString(input, position, extractValue) {
    -                    // 1. Let positionStart be position.
    -                    const positionStart = position.position
    -
    -                    // 2. Let value be the empty string.
    -                    let value = ''
    -
    -                    // 3. Assert: the code point at position within input
    -                    // is U+0022 (").
    -                    assert(input[position.position] === '"')
    -
    -                    // 4. Advance position by 1.
    -                    position.position++
    -
    -                    // 5. While true:
    -                    while (true) {
    -                        // 1. Append the result of collecting a sequence of code points
    -                        // that are not U+0022 (") or U+005C (\) from input, given
    -                        // position, to value.
    -                        value += collectASequenceOfCodePoints(
    -                            (char) => char !== '"' && char !== '\\',
    -                            input,
    -                            position
    -                        )
    -
    -                        // 2. If position is past the end of input, then break.
    -                        if (position.position >= input.length) {
    -                            break
    -                        }
    -
    -                        // 3. Let quoteOrBackslash be the code point at position within
    -                        // input.
    -                        const quoteOrBackslash = input[position.position]
    -
    -                        // 4. Advance position by 1.
    -                        position.position++
    -
    -                        // 5. If quoteOrBackslash is U+005C (\), then:
    -                        if (quoteOrBackslash === '\\') {
    -                            // 1. If position is past the end of input, then append
    -                            // U+005C (\) to value and break.
    -                            if (position.position >= input.length) {
    -                                value += '\\'
    -                                break
    -                            }
    -
    -                            // 2. Append the code point at position within input to value.
    -                            value += input[position.position]
    -
    -                            // 3. Advance position by 1.
    -                            position.position++
    -
    -                            // 6. Otherwise:
    -                        } else {
    -                            // 1. Assert: quoteOrBackslash is U+0022 (").
    -                            assert(quoteOrBackslash === '"')
    -
    -                            // 2. Break.
    -                            break
    +                else {
    +                    const entry = (this[WRITEENTRY] = new read_entry_js_1.ReadEntry(header, this[EX], this[GEX]));
    +                    // we do this for meta & ignored entries as well, because they
    +                    // are still valid tar, or else we wouldn't know to ignore them
    +                    if (!this[SAW_VALID_ENTRY]) {
    +                        if (entry.remain) {
    +                            // this might be the one!
    +                            const onend = () => {
    +                                if (!entry.invalid) {
    +                                    this[SAW_VALID_ENTRY] = true;
    +                                }
    +                            };
    +                            entry.on('end', onend);
                             }
    -                    }
    -
    -                    // 6. If the extract-value flag is set, then return value.
    -                    if (extractValue) {
    -                        return value
    -                    }
    -
    -                    // 7. Return the code points from positionStart to position,
    -                    // inclusive, within input.
    -                    return input.slice(positionStart, position.position)
    -                }
    -
    -                /**
    -                 * @see https://mimesniff.spec.whatwg.org/#serialize-a-mime-type
    -                 */
    -                function serializeAMimeType(mimeType) {
    -                    assert(mimeType !== 'failure')
    -                    const { parameters, essence } = mimeType
    -
    -                    // 1. Let serialization be the concatenation of mimeType’s
    -                    //    type, U+002F (/), and mimeType’s subtype.
    -                    let serialization = essence
    -
    -                    // 2. For each name → value of mimeType’s parameters:
    -                    for (let [name, value] of parameters.entries()) {
    -                        // 1. Append U+003B (;) to serialization.
    -                        serialization += ';'
    -
    -                        // 2. Append name to serialization.
    -                        serialization += name
    -
    -                        // 3. Append U+003D (=) to serialization.
    -                        serialization += '='
    -
    -                        // 4. If value does not solely contain HTTP token code
    -                        //    points or value is the empty string, then:
    -                        if (!HTTP_TOKEN_CODEPOINTS.test(value)) {
    -                            // 1. Precede each occurence of U+0022 (") or
    -                            //    U+005C (\) in value with U+005C (\).
    -                            value = value.replace(/(\\|")/g, '\\$1')
    -
    -                            // 2. Prepend U+0022 (") to value.
    -                            value = '"' + value
    -
    -                            // 3. Append U+0022 (") to value.
    -                            value += '"'
    +                        else {
    +                            this[SAW_VALID_ENTRY] = true;
                             }
    -
    -                        // 5. Append value to serialization.
    -                        serialization += value
    -                    }
    -
    -                    // 3. Return serialization.
    -                    return serialization
    -                }
    -
    -                /**
    -                 * @see https://fetch.spec.whatwg.org/#http-whitespace
    -                 * @param {string} char
    -                 */
    -                function isHTTPWhiteSpace(char) {
    -                    return char === '\r' || char === '\n' || char === '\t' || char === ' '
    -                }
    -
    -                /**
    -                 * @see https://fetch.spec.whatwg.org/#http-whitespace
    -                 * @param {string} str
    -                 */
    -                function removeHTTPWhitespace(str, leading = true, trailing = true) {
    -                    let lead = 0
    -                    let trail = str.length - 1
    -
    -                    if (leading) {
    -                        for (; lead < str.length && isHTTPWhiteSpace(str[lead]); lead++);
    -                    }
    -
    -                    if (trailing) {
    -                        for (; trail > 0 && isHTTPWhiteSpace(str[trail]); trail--);
    -                    }
    -
    -                    return str.slice(lead, trail + 1)
    -                }
    -
    -                /**
    -                 * @see https://infra.spec.whatwg.org/#ascii-whitespace
    -                 * @param {string} char
    -                 */
    -                function isASCIIWhitespace(char) {
    -                    return char === '\r' || char === '\n' || char === '\t' || char === '\f' || char === ' '
    -                }
    -
    -                /**
    -                 * @see https://infra.spec.whatwg.org/#strip-leading-and-trailing-ascii-whitespace
    -                 */
    -                function removeASCIIWhitespace(str, leading = true, trailing = true) {
    -                    let lead = 0
    -                    let trail = str.length - 1
    -
    -                    if (leading) {
    -                        for (; lead < str.length && isASCIIWhitespace(str[lead]); lead++);
    -                    }
    -
    -                    if (trailing) {
    -                        for (; trail > 0 && isASCIIWhitespace(str[trail]); trail--);
                         }
    -
    -                    return str.slice(lead, trail + 1)
    -                }
    -
    -                module.exports = {
    -                    dataURLProcessor,
    -                    URLSerializer,
    -                    collectASequenceOfCodePoints,
    -                    collectASequenceOfCodePointsFast,
    -                    stringPercentDecode,
    -                    parseMIMEType,
    -                    collectAnHTTPQuotedString,
    -                    serializeAMimeType
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 8511:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { Blob, File: NativeFile } = __nccwpck_require__(4300)
    -                const { types } = __nccwpck_require__(3837)
    -                const { kState } = __nccwpck_require__(5861)
    -                const { isBlobLike } = __nccwpck_require__(2538)
    -                const { webidl } = __nccwpck_require__(1744)
    -                const { parseMIMEType, serializeAMimeType } = __nccwpck_require__(685)
    -                const { kEnumerableProperty } = __nccwpck_require__(3983)
    -                const encoder = new TextEncoder()
    -
    -                class File extends Blob {
    -                    constructor(fileBits, fileName, options = {}) {
    -                        // The File constructor is invoked with two or three parameters, depending
    -                        // on whether the optional dictionary parameter is used. When the File()
    -                        // constructor is invoked, user agents must run the following steps:
    -                        webidl.argumentLengthCheck(arguments, 2, { header: 'File constructor' })
    -
    -                        fileBits = webidl.converters['sequence'](fileBits)
    -                        fileName = webidl.converters.USVString(fileName)
    -                        options = webidl.converters.FilePropertyBag(options)
    -
    -                        // 1. Let bytes be the result of processing blob parts given fileBits and
    -                        // options.
    -                        // Note: Blob handles this for us
    -
    -                        // 2. Let n be the fileName argument to the constructor.
    -                        const n = fileName
    -
    -                        // 3. Process FilePropertyBag dictionary argument by running the following
    -                        // substeps:
    -
    -                        //    1. If the type member is provided and is not the empty string, let t
    -                        //    be set to the type dictionary member. If t contains any characters
    -                        //    outside the range U+0020 to U+007E, then set t to the empty string
    -                        //    and return from these substeps.
    -                        //    2. Convert every character in t to ASCII lowercase.
    -                        let t = options.type
    -                        let d
    -
    -                        // eslint-disable-next-line no-labels
    -                        substep: {
    -                            if (t) {
    -                                t = parseMIMEType(t)
    -
    -                                if (t === 'failure') {
    -                                    t = ''
    -                                    // eslint-disable-next-line no-labels
    -                                    break substep
    -                                }
    -
    -                                t = serializeAMimeType(t).toLowerCase()
    -                            }
    -
    -                            //    3. If the lastModified member is provided, let d be set to the
    -                            //    lastModified dictionary member. If it is not provided, set d to the
    -                            //    current date and time represented as the number of milliseconds since
    -                            //    the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]).
    -                            d = options.lastModified
    +                    if (entry.meta) {
    +                        if (entry.size > this.maxMetaEntrySize) {
    +                            entry.ignore = true;
    +                            this[EMIT]('ignoredEntry', entry);
    +                            this[STATE] = 'ignore';
    +                            entry.resume();
                             }
    -
    -                        // 4. Return a new File object F such that:
    -                        // F refers to the bytes byte sequence.
    -                        // F.size is set to the number of total bytes in bytes.
    -                        // F.name is set to n.
    -                        // F.type is set to t.
    -                        // F.lastModified is set to d.
    -
    -                        super(processBlobParts(fileBits, options), { type: t })
    -                        this[kState] = {
    -                            name: n,
    -                            lastModified: d,
    -                            type: t
    +                        else if (entry.size > 0) {
    +                            this[META] = '';
    +                            entry.on('data', c => (this[META] += c));
    +                            this[STATE] = 'meta';
                             }
                         }
    -
    -                    get name() {
    -                        webidl.brandCheck(this, File)
    -
    -                        return this[kState].name
    -                    }
    -
    -                    get lastModified() {
    -                        webidl.brandCheck(this, File)
    -
    -                        return this[kState].lastModified
    -                    }
    -
    -                    get type() {
    -                        webidl.brandCheck(this, File)
    -
    -                        return this[kState].type
    -                    }
    -                }
    -
    -                class FileLike {
    -                    constructor(blobLike, fileName, options = {}) {
    -                        // TODO: argument idl type check
    -
    -                        // The File constructor is invoked with two or three parameters, depending
    -                        // on whether the optional dictionary parameter is used. When the File()
    -                        // constructor is invoked, user agents must run the following steps:
    -
    -                        // 1. Let bytes be the result of processing blob parts given fileBits and
    -                        // options.
    -
    -                        // 2. Let n be the fileName argument to the constructor.
    -                        const n = fileName
    -
    -                        // 3. Process FilePropertyBag dictionary argument by running the following
    -                        // substeps:
    -
    -                        //    1. If the type member is provided and is not the empty string, let t
    -                        //    be set to the type dictionary member. If t contains any characters
    -                        //    outside the range U+0020 to U+007E, then set t to the empty string
    -                        //    and return from these substeps.
    -                        //    TODO
    -                        const t = options.type
    -
    -                        //    2. Convert every character in t to ASCII lowercase.
    -                        //    TODO
    -
    -                        //    3. If the lastModified member is provided, let d be set to the
    -                        //    lastModified dictionary member. If it is not provided, set d to the
    -                        //    current date and time represented as the number of milliseconds since
    -                        //    the Unix Epoch (which is the equivalent of Date.now() [ECMA-262]).
    -                        const d = options.lastModified ?? Date.now()
    -
    -                        // 4. Return a new File object F such that:
    -                        // F refers to the bytes byte sequence.
    -                        // F.size is set to the number of total bytes in bytes.
    -                        // F.name is set to n.
    -                        // F.type is set to t.
    -                        // F.lastModified is set to d.
    -
    -                        this[kState] = {
    -                            blobLike,
    -                            name: n,
    -                            type: t,
    -                            lastModified: d
    +                    else {
    +                        this[EX] = undefined;
    +                        entry.ignore =
    +                            entry.ignore || !this.filter(entry.path, entry);
    +                        if (entry.ignore) {
    +                            // probably valid, just not something we care about
    +                            this[EMIT]('ignoredEntry', entry);
    +                            this[STATE] = entry.remain ? 'ignore' : 'header';
    +                            entry.resume();
                             }
    +                        else {
    +                            if (entry.remain) {
    +                                this[STATE] = 'body';
    +                            }
    +                            else {
    +                                this[STATE] = 'header';
    +                                entry.end();
    +                            }
    +                            if (!this[READENTRY]) {
    +                                this[QUEUE].push(entry);
    +                                this[NEXTENTRY]();
    +                            }
    +                            else {
    +                                this[QUEUE].push(entry);
    +                            }
    +                        }
    +                    }
    +                }
    +            }
    +        }
    +    }
    +    [CLOSESTREAM]() {
    +        queueMicrotask(() => this.emit('close'));
    +    }
    +    [PROCESSENTRY](entry) {
    +        let go = true;
    +        if (!entry) {
    +            this[READENTRY] = undefined;
    +            go = false;
    +        }
    +        else if (Array.isArray(entry)) {
    +            const [ev, ...args] = entry;
    +            this.emit(ev, ...args);
    +        }
    +        else {
    +            this[READENTRY] = entry;
    +            this.emit('entry', entry);
    +            if (!entry.emittedEnd) {
    +                entry.on('end', () => this[NEXTENTRY]());
    +                go = false;
    +            }
    +        }
    +        return go;
    +    }
    +    [NEXTENTRY]() {
    +        do { } while (this[PROCESSENTRY](this[QUEUE].shift()));
    +        if (!this[QUEUE].length) {
    +            // At this point, there's nothing in the queue, but we may have an
    +            // entry which is being consumed (readEntry).
    +            // If we don't, then we definitely can handle more data.
    +            // If we do, and either it's flowing, or it has never had any data
    +            // written to it, then it needs more.
    +            // The only other possibility is that it has returned false from a
    +            // write() call, so we wait for the next drain to continue.
    +            const re = this[READENTRY];
    +            const drainNow = !re || re.flowing || re.size === re.remain;
    +            if (drainNow) {
    +                if (!this[WRITING]) {
    +                    this.emit('drain');
    +                }
    +            }
    +            else {
    +                re.once('drain', () => this.emit('drain'));
    +            }
    +        }
    +    }
    +    [CONSUMEBODY](chunk, position) {
    +        // write up to but no  more than writeEntry.blockRemain
    +        const entry = this[WRITEENTRY];
    +        /* c8 ignore start */
    +        if (!entry) {
    +            throw new Error('attempt to consume body without entry??');
    +        }
    +        const br = entry.blockRemain ?? 0;
    +        /* c8 ignore stop */
    +        const c = br >= chunk.length && position === 0 ?
    +            chunk
    +            : chunk.subarray(position, position + br);
    +        entry.write(c);
    +        if (!entry.blockRemain) {
    +            this[STATE] = 'header';
    +            this[WRITEENTRY] = undefined;
    +            entry.end();
    +        }
    +        return c.length;
    +    }
    +    [CONSUMEMETA](chunk, position) {
    +        const entry = this[WRITEENTRY];
    +        const ret = this[CONSUMEBODY](chunk, position);
    +        // if we finished, then the entry is reset
    +        if (!this[WRITEENTRY] && entry) {
    +            this[EMITMETA](entry);
    +        }
    +        return ret;
    +    }
    +    [EMIT](ev, data, extra) {
    +        if (!this[QUEUE].length && !this[READENTRY]) {
    +            this.emit(ev, data, extra);
    +        }
    +        else {
    +            this[QUEUE].push([ev, data, extra]);
    +        }
    +    }
    +    [EMITMETA](entry) {
    +        this[EMIT]('meta', this[META]);
    +        switch (entry.type) {
    +            case 'ExtendedHeader':
    +            case 'OldExtendedHeader':
    +                this[EX] = pax_js_1.Pax.parse(this[META], this[EX], false);
    +                break;
    +            case 'GlobalExtendedHeader':
    +                this[GEX] = pax_js_1.Pax.parse(this[META], this[GEX], true);
    +                break;
    +            case 'NextFileHasLongPath':
    +            case 'OldGnuLongPath': {
    +                const ex = this[EX] ?? Object.create(null);
    +                this[EX] = ex;
    +                ex.path = this[META].replace(/\0.*/, '');
    +                break;
    +            }
    +            case 'NextFileHasLongLinkpath': {
    +                const ex = this[EX] || Object.create(null);
    +                this[EX] = ex;
    +                ex.linkpath = this[META].replace(/\0.*/, '');
    +                break;
    +            }
    +            /* c8 ignore start */
    +            default:
    +                throw new Error('unknown meta: ' + entry.type);
    +            /* c8 ignore stop */
    +        }
    +    }
    +    abort(error) {
    +        this[ABORTED] = true;
    +        this.emit('abort', error);
    +        // always throws, even in non-strict mode
    +        this.warn('TAR_ABORT', error, { recoverable: false });
    +    }
    +    write(chunk, encoding, cb) {
    +        if (typeof encoding === 'function') {
    +            cb = encoding;
    +            encoding = undefined;
    +        }
    +        if (typeof chunk === 'string') {
    +            chunk = Buffer.from(chunk, 
    +            /* c8 ignore next */
    +            typeof encoding === 'string' ? encoding : 'utf8');
    +        }
    +        if (this[ABORTED]) {
    +            /* c8 ignore next */
    +            cb?.();
    +            return false;
    +        }
    +        // first write, might be gzipped
    +        const needSniff = this[UNZIP] === undefined ||
    +            (this.brotli === undefined && this[UNZIP] === false);
    +        if (needSniff && chunk) {
    +            if (this[BUFFER]) {
    +                chunk = Buffer.concat([this[BUFFER], chunk]);
    +                this[BUFFER] = undefined;
    +            }
    +            if (chunk.length < gzipHeader.length) {
    +                this[BUFFER] = chunk;
    +                /* c8 ignore next */
    +                cb?.();
    +                return true;
    +            }
    +            // look for gzip header
    +            for (let i = 0; this[UNZIP] === undefined && i < gzipHeader.length; i++) {
    +                if (chunk[i] !== gzipHeader[i]) {
    +                    this[UNZIP] = false;
    +                }
    +            }
    +            const maybeBrotli = this.brotli === undefined;
    +            if (this[UNZIP] === false && maybeBrotli) {
    +                // read the first header to see if it's a valid tar file. If so,
    +                // we can safely assume that it's not actually brotli, despite the
    +                // .tbr or .tar.br file extension.
    +                // if we ended before getting a full chunk, yes, def brotli
    +                if (chunk.length < 512) {
    +                    if (this[ENDED]) {
    +                        this.brotli = true;
                         }
    -
    -                    stream(...args) {
    -                        webidl.brandCheck(this, FileLike)
    -
    -                        return this[kState].blobLike.stream(...args)
    -                    }
    -
    -                    arrayBuffer(...args) {
    -                        webidl.brandCheck(this, FileLike)
    -
    -                        return this[kState].blobLike.arrayBuffer(...args)
    +                    else {
    +                        this[BUFFER] = chunk;
    +                        /* c8 ignore next */
    +                        cb?.();
    +                        return true;
                         }
    +                }
    +                else {
    +                    // if it's tar, it's pretty reliably not brotli, chances of
    +                    // that happening are astronomical.
    +                    try {
    +                        new header_js_1.Header(chunk.subarray(0, 512));
    +                        this.brotli = false;
    +                    }
    +                    catch (_) {
    +                        this.brotli = true;
    +                    }
    +                }
    +            }
    +            if (this[UNZIP] === undefined ||
    +                (this[UNZIP] === false && this.brotli)) {
    +                const ended = this[ENDED];
    +                this[ENDED] = false;
    +                this[UNZIP] =
    +                    this[UNZIP] === undefined ?
    +                        new minizlib_1.Unzip({})
    +                        : new minizlib_1.BrotliDecompress({});
    +                this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk));
    +                this[UNZIP].on('error', er => this.abort(er));
    +                this[UNZIP].on('end', () => {
    +                    this[ENDED] = true;
    +                    this[CONSUMECHUNK]();
    +                });
    +                this[WRITING] = true;
    +                const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk);
    +                this[WRITING] = false;
    +                cb?.();
    +                return ret;
    +            }
    +        }
    +        this[WRITING] = true;
    +        if (this[UNZIP]) {
    +            this[UNZIP].write(chunk);
    +        }
    +        else {
    +            this[CONSUMECHUNK](chunk);
    +        }
    +        this[WRITING] = false;
    +        // return false if there's a queue, or if the current entry isn't flowing
    +        const ret = this[QUEUE].length ? false
    +            : this[READENTRY] ? this[READENTRY].flowing
    +                : true;
    +        // if we have no queue, then that means a clogged READENTRY
    +        if (!ret && !this[QUEUE].length) {
    +            this[READENTRY]?.once('drain', () => this.emit('drain'));
    +        }
    +        /* c8 ignore next */
    +        cb?.();
    +        return ret;
    +    }
    +    [BUFFERCONCAT](c) {
    +        if (c && !this[ABORTED]) {
    +            this[BUFFER] =
    +                this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c;
    +        }
    +    }
    +    [MAYBEEND]() {
    +        if (this[ENDED] &&
    +            !this[EMITTEDEND] &&
    +            !this[ABORTED] &&
    +            !this[CONSUMING]) {
    +            this[EMITTEDEND] = true;
    +            const entry = this[WRITEENTRY];
    +            if (entry && entry.blockRemain) {
    +                // truncated, likely a damaged file
    +                const have = this[BUFFER] ? this[BUFFER].length : 0;
    +                this.warn('TAR_BAD_ARCHIVE', `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`, { entry });
    +                if (this[BUFFER]) {
    +                    entry.write(this[BUFFER]);
    +                }
    +                entry.end();
    +            }
    +            this[EMIT](DONE);
    +        }
    +    }
    +    [CONSUMECHUNK](chunk) {
    +        if (this[CONSUMING] && chunk) {
    +            this[BUFFERCONCAT](chunk);
    +        }
    +        else if (!chunk && !this[BUFFER]) {
    +            this[MAYBEEND]();
    +        }
    +        else if (chunk) {
    +            this[CONSUMING] = true;
    +            if (this[BUFFER]) {
    +                this[BUFFERCONCAT](chunk);
    +                const c = this[BUFFER];
    +                this[BUFFER] = undefined;
    +                this[CONSUMECHUNKSUB](c);
    +            }
    +            else {
    +                this[CONSUMECHUNKSUB](chunk);
    +            }
    +            while (this[BUFFER] &&
    +                this[BUFFER]?.length >= 512 &&
    +                !this[ABORTED] &&
    +                !this[SAW_EOF]) {
    +                const c = this[BUFFER];
    +                this[BUFFER] = undefined;
    +                this[CONSUMECHUNKSUB](c);
    +            }
    +            this[CONSUMING] = false;
    +        }
    +        if (!this[BUFFER] || this[ENDED]) {
    +            this[MAYBEEND]();
    +        }
    +    }
    +    [CONSUMECHUNKSUB](chunk) {
    +        // we know that we are in CONSUMING mode, so anything written goes into
    +        // the buffer.  Advance the position and put any remainder in the buffer.
    +        let position = 0;
    +        const length = chunk.length;
    +        while (position + 512 <= length &&
    +            !this[ABORTED] &&
    +            !this[SAW_EOF]) {
    +            switch (this[STATE]) {
    +                case 'begin':
    +                case 'header':
    +                    this[CONSUMEHEADER](chunk, position);
    +                    position += 512;
    +                    break;
    +                case 'ignore':
    +                case 'body':
    +                    position += this[CONSUMEBODY](chunk, position);
    +                    break;
    +                case 'meta':
    +                    position += this[CONSUMEMETA](chunk, position);
    +                    break;
    +                /* c8 ignore start */
    +                default:
    +                    throw new Error('invalid state: ' + this[STATE]);
    +                /* c8 ignore stop */
    +            }
    +        }
    +        if (position < length) {
    +            if (this[BUFFER]) {
    +                this[BUFFER] = Buffer.concat([
    +                    chunk.subarray(position),
    +                    this[BUFFER],
    +                ]);
    +            }
    +            else {
    +                this[BUFFER] = chunk.subarray(position);
    +            }
    +        }
    +    }
    +    end(chunk, encoding, cb) {
    +        if (typeof chunk === 'function') {
    +            cb = chunk;
    +            encoding = undefined;
    +            chunk = undefined;
    +        }
    +        if (typeof encoding === 'function') {
    +            cb = encoding;
    +            encoding = undefined;
    +        }
    +        if (typeof chunk === 'string') {
    +            chunk = Buffer.from(chunk, encoding);
    +        }
    +        if (cb)
    +            this.once('finish', cb);
    +        if (!this[ABORTED]) {
    +            if (this[UNZIP]) {
    +                /* c8 ignore start */
    +                if (chunk)
    +                    this[UNZIP].write(chunk);
    +                /* c8 ignore stop */
    +                this[UNZIP].end();
    +            }
    +            else {
    +                this[ENDED] = true;
    +                if (this.brotli === undefined)
    +                    chunk = chunk || Buffer.alloc(0);
    +                if (chunk)
    +                    this.write(chunk);
    +                this[MAYBEEND]();
    +            }
    +        }
    +        return this;
    +    }
    +}
    +exports.Parser = Parser;
    +//# sourceMappingURL=parse.js.map
     
    -                    slice(...args) {
    -                        webidl.brandCheck(this, FileLike)
    +/***/ }),
     
    -                        return this[kState].blobLike.slice(...args)
    -                    }
    +/***/ 3588:
    +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
     
    -                    text(...args) {
    -                        webidl.brandCheck(this, FileLike)
    +"use strict";
    +
    +// A path exclusive reservation system
    +// reserve([list, of, paths], fn)
    +// When the fn is first in line for all its paths, it
    +// is called with a cb that clears the reservation.
    +//
    +// Used by async unpack to avoid clobbering paths in use,
    +// while still allowing maximal safe parallelization.
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.PathReservations = void 0;
    +const node_path_1 = __nccwpck_require__(9411);
    +const normalize_unicode_js_1 = __nccwpck_require__(9862);
    +const strip_trailing_slashes_js_1 = __nccwpck_require__(6018);
    +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform;
    +const isWindows = platform === 'win32';
    +// return a set of parent dirs for a given path
    +// '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d']
    +const getDirs = (path) => {
    +    const dirs = path
    +        .split('/')
    +        .slice(0, -1)
    +        .reduce((set, path) => {
    +        const s = set[set.length - 1];
    +        if (s !== undefined) {
    +            path = (0, node_path_1.join)(s, path);
    +        }
    +        set.push(path || '/');
    +        return set;
    +    }, []);
    +    return dirs;
    +};
    +class PathReservations {
    +    // path => [function or Set]
    +    // A Set object means a directory reservation
    +    // A fn is a direct reservation on that path
    +    #queues = new Map();
    +    // fn => {paths:[path,...], dirs:[path, ...]}
    +    #reservations = new Map();
    +    // functions currently running
    +    #running = new Set();
    +    reserve(paths, fn) {
    +        paths =
    +            isWindows ?
    +                ['win32 parallelization disabled']
    +                : paths.map(p => {
    +                    // don't need normPath, because we skip this entirely for windows
    +                    return (0, strip_trailing_slashes_js_1.stripTrailingSlashes)((0, node_path_1.join)((0, normalize_unicode_js_1.normalizeUnicode)(p))).toLowerCase();
    +                });
    +        const dirs = new Set(paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b)));
    +        this.#reservations.set(fn, { dirs, paths });
    +        for (const p of paths) {
    +            const q = this.#queues.get(p);
    +            if (!q) {
    +                this.#queues.set(p, [fn]);
    +            }
    +            else {
    +                q.push(fn);
    +            }
    +        }
    +        for (const dir of dirs) {
    +            const q = this.#queues.get(dir);
    +            if (!q) {
    +                this.#queues.set(dir, [new Set([fn])]);
    +            }
    +            else {
    +                const l = q[q.length - 1];
    +                if (l instanceof Set) {
    +                    l.add(fn);
    +                }
    +                else {
    +                    q.push(new Set([fn]));
    +                }
    +            }
    +        }
    +        return this.#run(fn);
    +    }
    +    // return the queues for each path the function cares about
    +    // fn => {paths, dirs}
    +    #getQueues(fn) {
    +        const res = this.#reservations.get(fn);
    +        /* c8 ignore start */
    +        if (!res) {
    +            throw new Error('function does not have any path reservations');
    +        }
    +        /* c8 ignore stop */
    +        return {
    +            paths: res.paths.map((path) => this.#queues.get(path)),
    +            dirs: [...res.dirs].map(path => this.#queues.get(path)),
    +        };
    +    }
    +    // check if fn is first in line for all its paths, and is
    +    // included in the first set for all its dir queues
    +    check(fn) {
    +        const { paths, dirs } = this.#getQueues(fn);
    +        return (paths.every(q => q && q[0] === fn) &&
    +            dirs.every(q => q && q[0] instanceof Set && q[0].has(fn)));
    +    }
    +    // run the function if it's first in line and not already running
    +    #run(fn) {
    +        if (this.#running.has(fn) || !this.check(fn)) {
    +            return false;
    +        }
    +        this.#running.add(fn);
    +        fn(() => this.#clear(fn));
    +        return true;
    +    }
    +    #clear(fn) {
    +        if (!this.#running.has(fn)) {
    +            return false;
    +        }
    +        const res = this.#reservations.get(fn);
    +        /* c8 ignore start */
    +        if (!res) {
    +            throw new Error('invalid reservation');
    +        }
    +        /* c8 ignore stop */
    +        const { paths, dirs } = res;
    +        const next = new Set();
    +        for (const path of paths) {
    +            const q = this.#queues.get(path);
    +            /* c8 ignore start */
    +            if (!q || q?.[0] !== fn) {
    +                continue;
    +            }
    +            /* c8 ignore stop */
    +            const q0 = q[1];
    +            if (!q0) {
    +                this.#queues.delete(path);
    +                continue;
    +            }
    +            q.shift();
    +            if (typeof q0 === 'function') {
    +                next.add(q0);
    +            }
    +            else {
    +                for (const f of q0) {
    +                    next.add(f);
    +                }
    +            }
    +        }
    +        for (const dir of dirs) {
    +            const q = this.#queues.get(dir);
    +            const q0 = q?.[0];
    +            /* c8 ignore next - type safety only */
    +            if (!q || !(q0 instanceof Set))
    +                continue;
    +            if (q0.size === 1 && q.length === 1) {
    +                this.#queues.delete(dir);
    +                continue;
    +            }
    +            else if (q0.size === 1) {
    +                q.shift();
    +                // next one must be a function,
    +                // or else the Set would've been reused
    +                const n = q[0];
    +                if (typeof n === 'function') {
    +                    next.add(n);
    +                }
    +            }
    +            else {
    +                q0.delete(fn);
    +            }
    +        }
    +        this.#running.delete(fn);
    +        next.forEach(fn => this.#run(fn));
    +        return true;
    +    }
    +}
    +exports.PathReservations = PathReservations;
    +//# sourceMappingURL=path-reservations.js.map
     
    -                        return this[kState].blobLike.text(...args)
    -                    }
    +/***/ }),
     
    -                    get size() {
    -                        webidl.brandCheck(this, FileLike)
    +/***/ 8567:
    +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
     
    -                        return this[kState].blobLike.size
    -                    }
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.Pax = void 0;
    +const node_path_1 = __nccwpck_require__(9411);
    +const header_js_1 = __nccwpck_require__(2374);
    +class Pax {
    +    atime;
    +    mtime;
    +    ctime;
    +    charset;
    +    comment;
    +    gid;
    +    uid;
    +    gname;
    +    uname;
    +    linkpath;
    +    dev;
    +    ino;
    +    nlink;
    +    path;
    +    size;
    +    mode;
    +    global;
    +    constructor(obj, global = false) {
    +        this.atime = obj.atime;
    +        this.charset = obj.charset;
    +        this.comment = obj.comment;
    +        this.ctime = obj.ctime;
    +        this.dev = obj.dev;
    +        this.gid = obj.gid;
    +        this.global = global;
    +        this.gname = obj.gname;
    +        this.ino = obj.ino;
    +        this.linkpath = obj.linkpath;
    +        this.mtime = obj.mtime;
    +        this.nlink = obj.nlink;
    +        this.path = obj.path;
    +        this.size = obj.size;
    +        this.uid = obj.uid;
    +        this.uname = obj.uname;
    +    }
    +    encode() {
    +        const body = this.encodeBody();
    +        if (body === '') {
    +            return Buffer.allocUnsafe(0);
    +        }
    +        const bodyLen = Buffer.byteLength(body);
    +        // round up to 512 bytes
    +        // add 512 for header
    +        const bufLen = 512 * Math.ceil(1 + bodyLen / 512);
    +        const buf = Buffer.allocUnsafe(bufLen);
    +        // 0-fill the header section, it might not hit every field
    +        for (let i = 0; i < 512; i++) {
    +            buf[i] = 0;
    +        }
    +        new header_js_1.Header({
    +            // XXX split the path
    +            // then the path should be PaxHeader + basename, but less than 99,
    +            // prepend with the dirname
    +            /* c8 ignore start */
    +            path: ('PaxHeader/' + (0, node_path_1.basename)(this.path ?? '')).slice(0, 99),
    +            /* c8 ignore stop */
    +            mode: this.mode || 0o644,
    +            uid: this.uid,
    +            gid: this.gid,
    +            size: bodyLen,
    +            mtime: this.mtime,
    +            type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader',
    +            linkpath: '',
    +            uname: this.uname || '',
    +            gname: this.gname || '',
    +            devmaj: 0,
    +            devmin: 0,
    +            atime: this.atime,
    +            ctime: this.ctime,
    +        }).encode(buf);
    +        buf.write(body, 512, bodyLen, 'utf8');
    +        // null pad after the body
    +        for (let i = bodyLen + 512; i < buf.length; i++) {
    +            buf[i] = 0;
    +        }
    +        return buf;
    +    }
    +    encodeBody() {
    +        return (this.encodeField('path') +
    +            this.encodeField('ctime') +
    +            this.encodeField('atime') +
    +            this.encodeField('dev') +
    +            this.encodeField('ino') +
    +            this.encodeField('nlink') +
    +            this.encodeField('charset') +
    +            this.encodeField('comment') +
    +            this.encodeField('gid') +
    +            this.encodeField('gname') +
    +            this.encodeField('linkpath') +
    +            this.encodeField('mtime') +
    +            this.encodeField('size') +
    +            this.encodeField('uid') +
    +            this.encodeField('uname'));
    +    }
    +    encodeField(field) {
    +        if (this[field] === undefined) {
    +            return '';
    +        }
    +        const r = this[field];
    +        const v = r instanceof Date ? r.getTime() / 1000 : r;
    +        const s = ' ' +
    +            (field === 'dev' || field === 'ino' || field === 'nlink' ?
    +                'SCHILY.'
    +                : '') +
    +            field +
    +            '=' +
    +            v +
    +            '\n';
    +        const byteLen = Buffer.byteLength(s);
    +        // the digits includes the length of the digits in ascii base-10
    +        // so if it's 9 characters, then adding 1 for the 9 makes it 10
    +        // which makes it 11 chars.
    +        let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1;
    +        if (byteLen + digits >= Math.pow(10, digits)) {
    +            digits += 1;
    +        }
    +        const len = digits + byteLen;
    +        return len + s;
    +    }
    +    static parse(str, ex, g = false) {
    +        return new Pax(merge(parseKV(str), ex), g);
    +    }
    +}
    +exports.Pax = Pax;
    +const merge = (a, b) => b ? Object.assign({}, b, a) : a;
    +const parseKV = (str) => str
    +    .replace(/\n$/, '')
    +    .split('\n')
    +    .reduce(parseKVLine, Object.create(null));
    +const parseKVLine = (set, line) => {
    +    const n = parseInt(line, 10);
    +    // XXX Values with \n in them will fail this.
    +    // Refactor to not be a naive line-by-line parse.
    +    if (n !== Buffer.byteLength(line) + 1) {
    +        return set;
    +    }
    +    line = line.slice((n + ' ').length);
    +    const kv = line.split('=');
    +    const r = kv.shift();
    +    if (!r) {
    +        return set;
    +    }
    +    const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, '$1');
    +    const v = kv.join('=');
    +    set[k] =
    +        /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ?
    +            new Date(Number(v) * 1000)
    +            : /^[0-9]+$/.test(v) ? +v
    +                : v;
    +    return set;
    +};
    +//# sourceMappingURL=pax.js.map
     
    -                    get type() {
    -                        webidl.brandCheck(this, FileLike)
    +/***/ }),
     
    -                        return this[kState].blobLike.type
    -                    }
    +/***/ 7369:
    +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
     
    -                    get name() {
    -                        webidl.brandCheck(this, FileLike)
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.ReadEntry = void 0;
    +const minipass_1 = __nccwpck_require__(4721);
    +const normalize_windows_path_js_1 = __nccwpck_require__(762);
    +class ReadEntry extends minipass_1.Minipass {
    +    extended;
    +    globalExtended;
    +    header;
    +    startBlockSize;
    +    blockRemain;
    +    remain;
    +    type;
    +    meta = false;
    +    ignore = false;
    +    path;
    +    mode;
    +    uid;
    +    gid;
    +    uname;
    +    gname;
    +    size = 0;
    +    mtime;
    +    atime;
    +    ctime;
    +    linkpath;
    +    dev;
    +    ino;
    +    nlink;
    +    invalid = false;
    +    absolute;
    +    unsupported = false;
    +    constructor(header, ex, gex) {
    +        super({});
    +        // read entries always start life paused.  this is to avoid the
    +        // situation where Minipass's auto-ending empty streams results
    +        // in an entry ending before we're ready for it.
    +        this.pause();
    +        this.extended = ex;
    +        this.globalExtended = gex;
    +        this.header = header;
    +        /* c8 ignore start */
    +        this.remain = header.size ?? 0;
    +        /* c8 ignore stop */
    +        this.startBlockSize = 512 * Math.ceil(this.remain / 512);
    +        this.blockRemain = this.startBlockSize;
    +        this.type = header.type;
    +        switch (this.type) {
    +            case 'File':
    +            case 'OldFile':
    +            case 'Link':
    +            case 'SymbolicLink':
    +            case 'CharacterDevice':
    +            case 'BlockDevice':
    +            case 'Directory':
    +            case 'FIFO':
    +            case 'ContiguousFile':
    +            case 'GNUDumpDir':
    +                break;
    +            case 'NextFileHasLongLinkpath':
    +            case 'NextFileHasLongPath':
    +            case 'OldGnuLongPath':
    +            case 'GlobalExtendedHeader':
    +            case 'ExtendedHeader':
    +            case 'OldExtendedHeader':
    +                this.meta = true;
    +                break;
    +            // NOTE: gnutar and bsdtar treat unrecognized types as 'File'
    +            // it may be worth doing the same, but with a warning.
    +            default:
    +                this.ignore = true;
    +        }
    +        /* c8 ignore start */
    +        if (!header.path) {
    +            throw new Error('no path provided for tar.ReadEntry');
    +        }
    +        /* c8 ignore stop */
    +        this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(header.path);
    +        this.mode = header.mode;
    +        if (this.mode) {
    +            this.mode = this.mode & 0o7777;
    +        }
    +        this.uid = header.uid;
    +        this.gid = header.gid;
    +        this.uname = header.uname;
    +        this.gname = header.gname;
    +        this.size = this.remain;
    +        this.mtime = header.mtime;
    +        this.atime = header.atime;
    +        this.ctime = header.ctime;
    +        /* c8 ignore start */
    +        this.linkpath =
    +            header.linkpath ?
    +                (0, normalize_windows_path_js_1.normalizeWindowsPath)(header.linkpath)
    +                : undefined;
    +        /* c8 ignore stop */
    +        this.uname = header.uname;
    +        this.gname = header.gname;
    +        if (ex) {
    +            this.#slurp(ex);
    +        }
    +        if (gex) {
    +            this.#slurp(gex, true);
    +        }
    +    }
    +    write(data) {
    +        const writeLen = data.length;
    +        if (writeLen > this.blockRemain) {
    +            throw new Error('writing more to entry than is appropriate');
    +        }
    +        const r = this.remain;
    +        const br = this.blockRemain;
    +        this.remain = Math.max(0, r - writeLen);
    +        this.blockRemain = Math.max(0, br - writeLen);
    +        if (this.ignore) {
    +            return true;
    +        }
    +        if (r >= writeLen) {
    +            return super.write(data);
    +        }
    +        // r < writeLen
    +        return super.write(data.subarray(0, r));
    +    }
    +    #slurp(ex, gex = false) {
    +        if (ex.path)
    +            ex.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(ex.path);
    +        if (ex.linkpath)
    +            ex.linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(ex.linkpath);
    +        Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => {
    +            // we slurp in everything except for the path attribute in
    +            // a global extended header, because that's weird. Also, any
    +            // null/undefined values are ignored.
    +            return !(v === null ||
    +                v === undefined ||
    +                (k === 'path' && gex));
    +        })));
    +    }
    +}
    +exports.ReadEntry = ReadEntry;
    +//# sourceMappingURL=read-entry.js.map
     
    -                        return this[kState].name
    -                    }
    +/***/ }),
     
    -                    get lastModified() {
    -                        webidl.brandCheck(this, FileLike)
    +/***/ 5478:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
     
    -                        return this[kState].lastModified
    -                    }
    +"use strict";
     
    -                    get [Symbol.toStringTag]() {
    -                        return 'File'
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.replace = void 0;
    +// tar -r
    +const fs_minipass_1 = __nccwpck_require__(675);
    +const node_fs_1 = __importDefault(__nccwpck_require__(7561));
    +const node_path_1 = __importDefault(__nccwpck_require__(9411));
    +const header_js_1 = __nccwpck_require__(2374);
    +const list_js_1 = __nccwpck_require__(4306);
    +const options_js_1 = __nccwpck_require__(9060);
    +const pack_js_1 = __nccwpck_require__(7788);
    +function replace(opt_, files, cb) {
    +    const opt = (0, options_js_1.dealias)(opt_);
    +    if (!(0, options_js_1.isFile)(opt)) {
    +        throw new TypeError('file is required');
    +    }
    +    if (opt.gzip ||
    +        opt.brotli ||
    +        opt.file.endsWith('.br') ||
    +        opt.file.endsWith('.tbr')) {
    +        throw new TypeError('cannot append to compressed archives');
    +    }
    +    if (!files || !Array.isArray(files) || !files.length) {
    +        throw new TypeError('no files or directories specified');
    +    }
    +    files = Array.from(files);
    +    return (0, options_js_1.isSyncFile)(opt) ?
    +        replaceSync(opt, files)
    +        : replace_(opt, files, cb);
    +}
    +exports.replace = replace;
    +const replaceSync = (opt, files) => {
    +    const p = new pack_js_1.PackSync(opt);
    +    let threw = true;
    +    let fd;
    +    let position;
    +    try {
    +        try {
    +            fd = node_fs_1.default.openSync(opt.file, 'r+');
    +        }
    +        catch (er) {
    +            if (er?.code === 'ENOENT') {
    +                fd = node_fs_1.default.openSync(opt.file, 'w+');
    +            }
    +            else {
    +                throw er;
    +            }
    +        }
    +        const st = node_fs_1.default.fstatSync(fd);
    +        const headBuf = Buffer.alloc(512);
    +        POSITION: for (position = 0; position < st.size; position += 512) {
    +            for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) {
    +                bytes = node_fs_1.default.readSync(fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos);
    +                if (position === 0 &&
    +                    headBuf[0] === 0x1f &&
    +                    headBuf[1] === 0x8b) {
    +                    throw new Error('cannot append to compressed archives');
    +                }
    +                if (!bytes) {
    +                    break POSITION;
    +                }
    +            }
    +            const h = new header_js_1.Header(headBuf);
    +            if (!h.cksumValid) {
    +                break;
    +            }
    +            const entryBlockSize = 512 * Math.ceil((h.size || 0) / 512);
    +            if (position + entryBlockSize + 512 > st.size) {
    +                break;
    +            }
    +            // the 512 for the header we just parsed will be added as well
    +            // also jump ahead all the blocks for the body
    +            position += entryBlockSize;
    +            if (opt.mtimeCache && h.mtime) {
    +                opt.mtimeCache.set(String(h.path), h.mtime);
    +            }
    +        }
    +        threw = false;
    +        streamSync(opt, p, position, fd, files);
    +    }
    +    finally {
    +        if (threw) {
    +            try {
    +                node_fs_1.default.closeSync(fd);
    +            }
    +            catch (er) { }
    +        }
    +    }
    +};
    +const streamSync = (opt, p, position, fd, files) => {
    +    const stream = new fs_minipass_1.WriteStreamSync(opt.file, {
    +        fd: fd,
    +        start: position,
    +    });
    +    p.pipe(stream);
    +    addFilesSync(p, files);
    +};
    +const replace_ = (opt, files, cb) => {
    +    files = Array.from(files);
    +    const p = new pack_js_1.Pack(opt);
    +    const getPos = (fd, size, cb_) => {
    +        const cb = (er, pos) => {
    +            if (er) {
    +                node_fs_1.default.close(fd, _ => cb_(er));
    +            }
    +            else {
    +                cb_(null, pos);
    +            }
    +        };
    +        let position = 0;
    +        if (size === 0) {
    +            return cb(null, 0);
    +        }
    +        let bufPos = 0;
    +        const headBuf = Buffer.alloc(512);
    +        const onread = (er, bytes) => {
    +            if (er || typeof bytes === 'undefined') {
    +                return cb(er);
    +            }
    +            bufPos += bytes;
    +            if (bufPos < 512 && bytes) {
    +                return node_fs_1.default.read(fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos, onread);
    +            }
    +            if (position === 0 &&
    +                headBuf[0] === 0x1f &&
    +                headBuf[1] === 0x8b) {
    +                return cb(new Error('cannot append to compressed archives'));
    +            }
    +            // truncated header
    +            if (bufPos < 512) {
    +                return cb(null, position);
    +            }
    +            const h = new header_js_1.Header(headBuf);
    +            if (!h.cksumValid) {
    +                return cb(null, position);
    +            }
    +            /* c8 ignore next */
    +            const entryBlockSize = 512 * Math.ceil((h.size ?? 0) / 512);
    +            if (position + entryBlockSize + 512 > size) {
    +                return cb(null, position);
    +            }
    +            position += entryBlockSize + 512;
    +            if (position >= size) {
    +                return cb(null, position);
    +            }
    +            if (opt.mtimeCache && h.mtime) {
    +                opt.mtimeCache.set(String(h.path), h.mtime);
    +            }
    +            bufPos = 0;
    +            node_fs_1.default.read(fd, headBuf, 0, 512, position, onread);
    +        };
    +        node_fs_1.default.read(fd, headBuf, 0, 512, position, onread);
    +    };
    +    const promise = new Promise((resolve, reject) => {
    +        p.on('error', reject);
    +        let flag = 'r+';
    +        const onopen = (er, fd) => {
    +            if (er && er.code === 'ENOENT' && flag === 'r+') {
    +                flag = 'w+';
    +                return node_fs_1.default.open(opt.file, flag, onopen);
    +            }
    +            if (er || !fd) {
    +                return reject(er);
    +            }
    +            node_fs_1.default.fstat(fd, (er, st) => {
    +                if (er) {
    +                    return node_fs_1.default.close(fd, () => reject(er));
    +                }
    +                getPos(fd, st.size, (er, position) => {
    +                    if (er) {
    +                        return reject(er);
                         }
    -                }
    -
    -                Object.defineProperties(File.prototype, {
    -                    [Symbol.toStringTag]: {
    -                        value: 'File',
    -                        configurable: true
    -                    },
    -                    name: kEnumerableProperty,
    -                    lastModified: kEnumerableProperty
    -                })
    -
    -                webidl.converters.Blob = webidl.interfaceConverter(Blob)
    -
    -                webidl.converters.BlobPart = function (V, opts) {
    -                    if (webidl.util.Type(V) === 'Object') {
    -                        if (isBlobLike(V)) {
    -                            return webidl.converters.Blob(V, { strict: false })
    -                        }
    +                    const stream = new fs_minipass_1.WriteStream(opt.file, {
    +                        fd: fd,
    +                        start: position,
    +                    });
    +                    p.pipe(stream);
    +                    stream.on('error', reject);
    +                    stream.on('close', resolve);
    +                    addFilesAsync(p, files);
    +                });
    +            });
    +        };
    +        node_fs_1.default.open(opt.file, flag, onopen);
    +    });
    +    return cb ? promise.then(cb, cb) : promise;
    +};
    +const addFilesSync = (p, files) => {
    +    files.forEach(file => {
    +        if (file.charAt(0) === '@') {
    +            (0, list_js_1.list)({
    +                file: node_path_1.default.resolve(p.cwd, file.slice(1)),
    +                sync: true,
    +                noResume: true,
    +                onentry: entry => p.add(entry),
    +            });
    +        }
    +        else {
    +            p.add(file);
    +        }
    +    });
    +    p.end();
    +};
    +const addFilesAsync = async (p, files) => {
    +    for (let i = 0; i < files.length; i++) {
    +        const file = String(files[i]);
    +        if (file.charAt(0) === '@') {
    +            await (0, list_js_1.list)({
    +                file: node_path_1.default.resolve(String(p.cwd), file.slice(1)),
    +                noResume: true,
    +                onentry: entry => p.add(entry),
    +            });
    +        }
    +        else {
    +            p.add(file);
    +        }
    +    }
    +    p.end();
    +};
    +//# sourceMappingURL=replace.js.map
     
    -                        if (
    -                            ArrayBuffer.isView(V) ||
    -                            types.isAnyArrayBuffer(V)
    -                        ) {
    -                            return webidl.converters.BufferSource(V, opts)
    -                        }
    -                    }
    +/***/ }),
     
    -                    return webidl.converters.USVString(V, opts)
    -                }
    +/***/ 1126:
    +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
     
    -                webidl.converters['sequence'] = webidl.sequenceConverter(
    -                    webidl.converters.BlobPart
    -                )
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.stripAbsolutePath = void 0;
    +// unix absolute paths are also absolute on win32, so we use this for both
    +const node_path_1 = __nccwpck_require__(9411);
    +const { isAbsolute, parse } = node_path_1.win32;
    +// returns [root, stripped]
    +// Note that windows will think that //x/y/z/a has a "root" of //x/y, and in
    +// those cases, we want to sanitize it to x/y/z/a, not z/a, so we strip /
    +// explicitly if it's the first character.
    +// drive-specific relative paths on Windows get their root stripped off even
    +// though they are not absolute, so `c:../foo` becomes ['c:', '../foo']
    +const stripAbsolutePath = (path) => {
    +    let r = '';
    +    let parsed = parse(path);
    +    while (isAbsolute(path) || parsed.root) {
    +        // windows will think that //x/y/z has a "root" of //x/y/
    +        // but strip the //?/C:/ off of //?/C:/path
    +        const root = path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' ?
    +            '/'
    +            : parsed.root;
    +        path = path.slice(root.length);
    +        r += root;
    +        parsed = parse(path);
    +    }
    +    return [r, path];
    +};
    +exports.stripAbsolutePath = stripAbsolutePath;
    +//# sourceMappingURL=strip-absolute-path.js.map
     
    -                // https://www.w3.org/TR/FileAPI/#dfn-FilePropertyBag
    -                webidl.converters.FilePropertyBag = webidl.dictionaryConverter([
    -                    {
    -                        key: 'lastModified',
    -                        converter: webidl.converters['long long'],
    -                        get defaultValue() {
    -                            return Date.now()
    -                        }
    -                    },
    -                    {
    -                        key: 'type',
    -                        converter: webidl.converters.DOMString,
    -                        defaultValue: ''
    -                    },
    -                    {
    -                        key: 'endings',
    -                        converter: (value) => {
    -                            value = webidl.converters.DOMString(value)
    -                            value = value.toLowerCase()
    -
    -                            if (value !== 'native') {
    -                                value = 'transparent'
    -                            }
    +/***/ }),
     
    -                            return value
    -                        },
    -                        defaultValue: 'transparent'
    -                    }
    -                ])
    -
    -                /**
    -                 * @see https://www.w3.org/TR/FileAPI/#process-blob-parts
    -                 * @param {(NodeJS.TypedArray|Blob|string)[]} parts
    -                 * @param {{ type: string, endings: string }} options
    -                 */
    -                function processBlobParts(parts, options) {
    -                    // 1. Let bytes be an empty sequence of bytes.
    -                    /** @type {NodeJS.TypedArray[]} */
    -                    const bytes = []
    -
    -                    // 2. For each element in parts:
    -                    for (const element of parts) {
    -                        // 1. If element is a USVString, run the following substeps:
    -                        if (typeof element === 'string') {
    -                            // 1. Let s be element.
    -                            let s = element
    -
    -                            // 2. If the endings member of options is "native", set s
    -                            //    to the result of converting line endings to native
    -                            //    of element.
    -                            if (options.endings === 'native') {
    -                                s = convertLineEndingsNative(s)
    -                            }
    +/***/ 6018:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                            // 3. Append the result of UTF-8 encoding s to bytes.
    -                            bytes.push(encoder.encode(s))
    -                        } else if (
    -                            types.isAnyArrayBuffer(element) ||
    -                            types.isTypedArray(element)
    -                        ) {
    -                            // 2. If element is a BufferSource, get a copy of the
    -                            //    bytes held by the buffer source, and append those
    -                            //    bytes to bytes.
    -                            if (!element.buffer) { // ArrayBuffer
    -                                bytes.push(new Uint8Array(element))
    -                            } else {
    -                                bytes.push(
    -                                    new Uint8Array(element.buffer, element.byteOffset, element.byteLength)
    -                                )
    -                            }
    -                        } else if (isBlobLike(element)) {
    -                            // 3. If element is a Blob, append the bytes it represents
    -                            //    to bytes.
    -                            bytes.push(element)
    -                        }
    -                    }
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.stripTrailingSlashes = void 0;
    +// warning: extremely hot code path.
    +// This has been meticulously optimized for use
    +// within npm install on large package trees.
    +// Do not edit without careful benchmarking.
    +const stripTrailingSlashes = (str) => {
    +    let i = str.length - 1;
    +    let slashesStart = -1;
    +    while (i > -1 && str.charAt(i) === '/') {
    +        slashesStart = i;
    +        i--;
    +    }
    +    return slashesStart === -1 ? str : str.slice(0, slashesStart);
    +};
    +exports.stripTrailingSlashes = stripTrailingSlashes;
    +//# sourceMappingURL=strip-trailing-slashes.js.map
     
    -                    // 3. Return bytes.
    -                    return bytes
    -                }
    +/***/ }),
     
    -                /**
    -                 * @see https://www.w3.org/TR/FileAPI/#convert-line-endings-to-native
    -                 * @param {string} s
    -                 */
    -                function convertLineEndingsNative(s) {
    -                    // 1. Let native line ending be be the code point U+000A LF.
    -                    let nativeLineEnding = '\n'
    -
    -                    // 2. If the underlying platform’s conventions are to
    -                    //    represent newlines as a carriage return and line feed
    -                    //    sequence, set native line ending to the code point
    -                    //    U+000D CR followed by the code point U+000A LF.
    -                    if (process.platform === 'win32') {
    -                        nativeLineEnding = '\r\n'
    -                    }
    +/***/ 3012:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                    return s.replace(/\r?\n/g, nativeLineEnding)
    -                }
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.SymlinkError = void 0;
    +class SymlinkError extends Error {
    +    path;
    +    symlink;
    +    syscall = 'symlink';
    +    code = 'TAR_SYMLINK_ERROR';
    +    constructor(symlink, path) {
    +        super('TAR_SYMLINK_ERROR: Cannot extract through symbolic link');
    +        this.symlink = symlink;
    +        this.path = path;
    +    }
    +    get name() {
    +        return 'SymlinkError';
    +    }
    +}
    +exports.SymlinkError = SymlinkError;
    +//# sourceMappingURL=symlink-error.js.map
     
    -                // If this function is moved to ./util.js, some tools (such as
    -                // rollup) will warn about circular dependencies. See:
    -                // https://github.com/nodejs/undici/issues/1629
    -                function isFileLike(object) {
    -                    return (
    -                        (NativeFile && object instanceof NativeFile) ||
    -                        object instanceof File || (
    -                            object &&
    -                            (typeof object.stream === 'function' ||
    -                                typeof object.arrayBuffer === 'function') &&
    -                            object[Symbol.toStringTag] === 'File'
    -                        )
    -                    )
    -                }
    -
    -                module.exports = { File, FileLike, isFileLike }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 2015:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { isBlobLike, toUSVString, makeIterator } = __nccwpck_require__(2538)
    -                const { kState } = __nccwpck_require__(5861)
    -                const { File: UndiciFile, FileLike, isFileLike } = __nccwpck_require__(8511)
    -                const { webidl } = __nccwpck_require__(1744)
    -                const { Blob, File: NativeFile } = __nccwpck_require__(4300)
    -
    -                /** @type {globalThis['File']} */
    -                const File = NativeFile ?? UndiciFile
    -
    -                // https://xhr.spec.whatwg.org/#formdata
    -                class FormData {
    -                    constructor(form) {
    -                        if (form !== undefined) {
    -                            throw webidl.errors.conversionFailed({
    -                                prefix: 'FormData constructor',
    -                                argument: 'Argument 1',
    -                                types: ['undefined']
    -                            })
    -                        }
    -
    -                        this[kState] = []
    -                    }
    -
    -                    append(name, value, filename = undefined) {
    -                        webidl.brandCheck(this, FormData)
    -
    -                        webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.append' })
    -
    -                        if (arguments.length === 3 && !isBlobLike(value)) {
    -                            throw new TypeError(
    -                                "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'"
    -                            )
    -                        }
    -
    -                        // 1. Let value be value if given; otherwise blobValue.
    -
    -                        name = webidl.converters.USVString(name)
    -                        value = isBlobLike(value)
    -                            ? webidl.converters.Blob(value, { strict: false })
    -                            : webidl.converters.USVString(value)
    -                        filename = arguments.length === 3
    -                            ? webidl.converters.USVString(filename)
    -                            : undefined
    -
    -                        // 2. Let entry be the result of creating an entry with
    -                        // name, value, and filename if given.
    -                        const entry = makeEntry(name, value, filename)
    -
    -                        // 3. Append entry to this’s entry list.
    -                        this[kState].push(entry)
    -                    }
    -
    -                    delete(name) {
    -                        webidl.brandCheck(this, FormData)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.delete' })
    -
    -                        name = webidl.converters.USVString(name)
    -
    -                        // The delete(name) method steps are to remove all entries whose name
    -                        // is name from this’s entry list.
    -                        this[kState] = this[kState].filter(entry => entry.name !== name)
    -                    }
    -
    -                    get(name) {
    -                        webidl.brandCheck(this, FormData)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.get' })
    -
    -                        name = webidl.converters.USVString(name)
    -
    -                        // 1. If there is no entry whose name is name in this’s entry list,
    -                        // then return null.
    -                        const idx = this[kState].findIndex((entry) => entry.name === name)
    -                        if (idx === -1) {
    -                            return null
    -                        }
    -
    -                        // 2. Return the value of the first entry whose name is name from
    -                        // this’s entry list.
    -                        return this[kState][idx].value
    -                    }
    -
    -                    getAll(name) {
    -                        webidl.brandCheck(this, FormData)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.getAll' })
    -
    -                        name = webidl.converters.USVString(name)
    -
    -                        // 1. If there is no entry whose name is name in this’s entry list,
    -                        // then return the empty list.
    -                        // 2. Return the values of all entries whose name is name, in order,
    -                        // from this’s entry list.
    -                        return this[kState]
    -                            .filter((entry) => entry.name === name)
    -                            .map((entry) => entry.value)
    -                    }
    -
    -                    has(name) {
    -                        webidl.brandCheck(this, FormData)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.has' })
    -
    -                        name = webidl.converters.USVString(name)
    -
    -                        // The has(name) method steps are to return true if there is an entry
    -                        // whose name is name in this’s entry list; otherwise false.
    -                        return this[kState].findIndex((entry) => entry.name === name) !== -1
    -                    }
    -
    -                    set(name, value, filename = undefined) {
    -                        webidl.brandCheck(this, FormData)
    -
    -                        webidl.argumentLengthCheck(arguments, 2, { header: 'FormData.set' })
    -
    -                        if (arguments.length === 3 && !isBlobLike(value)) {
    -                            throw new TypeError(
    -                                "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'"
    -                            )
    -                        }
    -
    -                        // The set(name, value) and set(name, blobValue, filename) method steps
    -                        // are:
    -
    -                        // 1. Let value be value if given; otherwise blobValue.
    -
    -                        name = webidl.converters.USVString(name)
    -                        value = isBlobLike(value)
    -                            ? webidl.converters.Blob(value, { strict: false })
    -                            : webidl.converters.USVString(value)
    -                        filename = arguments.length === 3
    -                            ? toUSVString(filename)
    -                            : undefined
    -
    -                        // 2. Let entry be the result of creating an entry with name, value, and
    -                        // filename if given.
    -                        const entry = makeEntry(name, value, filename)
    -
    -                        // 3. If there are entries in this’s entry list whose name is name, then
    -                        // replace the first such entry with entry and remove the others.
    -                        const idx = this[kState].findIndex((entry) => entry.name === name)
    -                        if (idx !== -1) {
    -                            this[kState] = [
    -                                ...this[kState].slice(0, idx),
    -                                entry,
    -                                ...this[kState].slice(idx + 1).filter((entry) => entry.name !== name)
    -                            ]
    -                        } else {
    -                            // 4. Otherwise, append entry to this’s entry list.
    -                            this[kState].push(entry)
    -                        }
    -                    }
    -
    -                    entries() {
    -                        webidl.brandCheck(this, FormData)
    -
    -                        return makeIterator(
    -                            () => this[kState].map(pair => [pair.name, pair.value]),
    -                            'FormData',
    -                            'key+value'
    -                        )
    -                    }
    -
    -                    keys() {
    -                        webidl.brandCheck(this, FormData)
    -
    -                        return makeIterator(
    -                            () => this[kState].map(pair => [pair.name, pair.value]),
    -                            'FormData',
    -                            'key'
    -                        )
    -                    }
    -
    -                    values() {
    -                        webidl.brandCheck(this, FormData)
    -
    -                        return makeIterator(
    -                            () => this[kState].map(pair => [pair.name, pair.value]),
    -                            'FormData',
    -                            'value'
    -                        )
    -                    }
    -
    -                    /**
    -                     * @param {(value: string, key: string, self: FormData) => void} callbackFn
    -                     * @param {unknown} thisArg
    -                     */
    -                    forEach(callbackFn, thisArg = globalThis) {
    -                        webidl.brandCheck(this, FormData)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'FormData.forEach' })
    -
    -                        if (typeof callbackFn !== 'function') {
    -                            throw new TypeError(
    -                                "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'."
    -                            )
    -                        }
    -
    -                        for (const [key, value] of this) {
    -                            callbackFn.apply(thisArg, [value, key, this])
    -                        }
    -                    }
    -                }
    -
    -                FormData.prototype[Symbol.iterator] = FormData.prototype.entries
    -
    -                Object.defineProperties(FormData.prototype, {
    -                    [Symbol.toStringTag]: {
    -                        value: 'FormData',
    -                        configurable: true
    -                    }
    -                })
    -
    -                /**
    -                 * @see https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#create-an-entry
    -                 * @param {string} name
    -                 * @param {string|Blob} value
    -                 * @param {?string} filename
    -                 * @returns
    -                 */
    -                function makeEntry(name, value, filename) {
    -                    // 1. Set name to the result of converting name into a scalar value string.
    -                    // "To convert a string into a scalar value string, replace any surrogates
    -                    //  with U+FFFD."
    -                    // see: https://nodejs.org/dist/latest-v18.x/docs/api/buffer.html#buftostringencoding-start-end
    -                    name = Buffer.from(name).toString('utf8')
    -
    -                    // 2. If value is a string, then set value to the result of converting
    -                    //    value into a scalar value string.
    -                    if (typeof value === 'string') {
    -                        value = Buffer.from(value).toString('utf8')
    -                    } else {
    -                        // 3. Otherwise:
    -
    -                        // 1. If value is not a File object, then set value to a new File object,
    -                        //    representing the same bytes, whose name attribute value is "blob"
    -                        if (!isFileLike(value)) {
    -                            value = value instanceof Blob
    -                                ? new File([value], 'blob', { type: value.type })
    -                                : new FileLike(value, 'blob', { type: value.type })
    -                        }
    -
    -                        // 2. If filename is given, then set value to a new File object,
    -                        //    representing the same bytes, whose name attribute is filename.
    -                        if (filename !== undefined) {
    -                            /** @type {FilePropertyBag} */
    -                            const options = {
    -                                type: value.type,
    -                                lastModified: value.lastModified
    -                            }
    -
    -                            value = (NativeFile && value instanceof NativeFile) || value instanceof UndiciFile
    -                                ? new File([value], filename, options)
    -                                : new FileLike(value, filename, options)
    -                        }
    -                    }
    -
    -                    // 4. Return an entry whose name is name and whose value is value.
    -                    return { name, value }
    -                }
    -
    -                module.exports = { FormData }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 1246:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                // In case of breaking changes, increase the version
    -                // number to avoid conflicts.
    -                const globalOrigin = Symbol.for('undici.globalOrigin.1')
    -
    -                function getGlobalOrigin() {
    -                    return globalThis[globalOrigin]
    -                }
    -
    -                function setGlobalOrigin(newOrigin) {
    -                    if (newOrigin === undefined) {
    -                        Object.defineProperty(globalThis, globalOrigin, {
    -                            value: undefined,
    -                            writable: true,
    -                            enumerable: false,
    -                            configurable: false
    -                        })
    -
    -                        return
    -                    }
    -
    -                    const parsedURL = new URL(newOrigin)
    -
    -                    if (parsedURL.protocol !== 'http:' && parsedURL.protocol !== 'https:') {
    -                        throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`)
    -                    }
    -
    -                    Object.defineProperty(globalThis, globalOrigin, {
    -                        value: parsedURL,
    -                        writable: true,
    -                        enumerable: false,
    -                        configurable: false
    -                    })
    -                }
    -
    -                module.exports = {
    -                    getGlobalOrigin,
    -                    setGlobalOrigin
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 554:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -                // https://github.com/Ethan-Arrowood/undici-fetch
    -
    -
    -
    -                const { kHeadersList, kConstruct } = __nccwpck_require__(2785)
    -                const { kGuard } = __nccwpck_require__(5861)
    -                const { kEnumerableProperty } = __nccwpck_require__(3983)
    -                const {
    -                    makeIterator,
    -                    isValidHeaderName,
    -                    isValidHeaderValue
    -                } = __nccwpck_require__(2538)
    -                const { webidl } = __nccwpck_require__(1744)
    -                const assert = __nccwpck_require__(9491)
    -
    -                const kHeadersMap = Symbol('headers map')
    -                const kHeadersSortedMap = Symbol('headers map sorted')
    -
    -                /**
    -                 * @param {number} code
    -                 */
    -                function isHTTPWhiteSpaceCharCode(code) {
    -                    return code === 0x00a || code === 0x00d || code === 0x009 || code === 0x020
    -                }
    -
    -                /**
    -                 * @see https://fetch.spec.whatwg.org/#concept-header-value-normalize
    -                 * @param {string} potentialValue
    -                 */
    -                function headerValueNormalize(potentialValue) {
    -                    //  To normalize a byte sequence potentialValue, remove
    -                    //  any leading and trailing HTTP whitespace bytes from
    -                    //  potentialValue.
    -                    let i = 0; let j = potentialValue.length
    -
    -                    while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(j - 1))) --j
    -                    while (j > i && isHTTPWhiteSpaceCharCode(potentialValue.charCodeAt(i))) ++i
    -
    -                    return i === 0 && j === potentialValue.length ? potentialValue : potentialValue.substring(i, j)
    -                }
    -
    -                function fill(headers, object) {
    -                    // To fill a Headers object headers with a given object object, run these steps:
    -
    -                    // 1. If object is a sequence, then for each header in object:
    -                    // Note: webidl conversion to array has already been done.
    -                    if (Array.isArray(object)) {
    -                        for (let i = 0; i < object.length; ++i) {
    -                            const header = object[i]
    -                            // 1. If header does not contain exactly two items, then throw a TypeError.
    -                            if (header.length !== 2) {
    -                                throw webidl.errors.exception({
    -                                    header: 'Headers constructor',
    -                                    message: `expected name/value pair to be length 2, found ${header.length}.`
    -                                })
    -                            }
    -
    -                            // 2. Append (header’s first item, header’s second item) to headers.
    -                            appendHeader(headers, header[0], header[1])
    -                        }
    -                    } else if (typeof object === 'object' && object !== null) {
    -                        // Note: null should throw
    -
    -                        // 2. Otherwise, object is a record, then for each key → value in object,
    -                        //    append (key, value) to headers
    -                        const keys = Object.keys(object)
    -                        for (let i = 0; i < keys.length; ++i) {
    -                            appendHeader(headers, keys[i], object[keys[i]])
    -                        }
    -                    } else {
    -                        throw webidl.errors.conversionFailed({
    -                            prefix: 'Headers constructor',
    -                            argument: 'Argument 1',
    -                            types: ['sequence>', 'record']
    -                        })
    -                    }
    -                }
    -
    -                /**
    -                 * @see https://fetch.spec.whatwg.org/#concept-headers-append
    -                 */
    -                function appendHeader(headers, name, value) {
    -                    // 1. Normalize value.
    -                    value = headerValueNormalize(value)
    -
    -                    // 2. If name is not a header name or value is not a
    -                    //    header value, then throw a TypeError.
    -                    if (!isValidHeaderName(name)) {
    -                        throw webidl.errors.invalidArgument({
    -                            prefix: 'Headers.append',
    -                            value: name,
    -                            type: 'header name'
    -                        })
    -                    } else if (!isValidHeaderValue(value)) {
    -                        throw webidl.errors.invalidArgument({
    -                            prefix: 'Headers.append',
    -                            value,
    -                            type: 'header value'
    -                        })
    -                    }
    -
    -                    // 3. If headers’s guard is "immutable", then throw a TypeError.
    -                    // 4. Otherwise, if headers’s guard is "request" and name is a
    -                    //    forbidden header name, return.
    -                    // Note: undici does not implement forbidden header names
    -                    if (headers[kGuard] === 'immutable') {
    -                        throw new TypeError('immutable')
    -                    } else if (headers[kGuard] === 'request-no-cors') {
    -                        // 5. Otherwise, if headers’s guard is "request-no-cors":
    -                        // TODO
    -                    }
    -
    -                    // 6. Otherwise, if headers’s guard is "response" and name is a
    -                    //    forbidden response-header name, return.
    -
    -                    // 7. Append (name, value) to headers’s header list.
    -                    return headers[kHeadersList].append(name, value)
    -
    -                    // 8. If headers’s guard is "request-no-cors", then remove
    -                    //    privileged no-CORS request headers from headers
    -                }
    -
    -                class HeadersList {
    -                    /** @type {[string, string][]|null} */
    -                    cookies = null
    -
    -                    constructor(init) {
    -                        if (init instanceof HeadersList) {
    -                            this[kHeadersMap] = new Map(init[kHeadersMap])
    -                            this[kHeadersSortedMap] = init[kHeadersSortedMap]
    -                            this.cookies = init.cookies === null ? null : [...init.cookies]
    -                        } else {
    -                            this[kHeadersMap] = new Map(init)
    -                            this[kHeadersSortedMap] = null
    -                        }
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#header-list-contains
    -                    contains(name) {
    -                        // A header list list contains a header name name if list
    -                        // contains a header whose name is a byte-case-insensitive
    -                        // match for name.
    -                        name = name.toLowerCase()
    -
    -                        return this[kHeadersMap].has(name)
    -                    }
    -
    -                    clear() {
    -                        this[kHeadersMap].clear()
    -                        this[kHeadersSortedMap] = null
    -                        this.cookies = null
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#concept-header-list-append
    -                    append(name, value) {
    -                        this[kHeadersSortedMap] = null
    -
    -                        // 1. If list contains name, then set name to the first such
    -                        //    header’s name.
    -                        const lowercaseName = name.toLowerCase()
    -                        const exists = this[kHeadersMap].get(lowercaseName)
    -
    -                        // 2. Append (name, value) to list.
    -                        if (exists) {
    -                            const delimiter = lowercaseName === 'cookie' ? '; ' : ', '
    -                            this[kHeadersMap].set(lowercaseName, {
    -                                name: exists.name,
    -                                value: `${exists.value}${delimiter}${value}`
    -                            })
    -                        } else {
    -                            this[kHeadersMap].set(lowercaseName, { name, value })
    -                        }
    -
    -                        if (lowercaseName === 'set-cookie') {
    -                            this.cookies ??= []
    -                            this.cookies.push(value)
    -                        }
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#concept-header-list-set
    -                    set(name, value) {
    -                        this[kHeadersSortedMap] = null
    -                        const lowercaseName = name.toLowerCase()
    -
    -                        if (lowercaseName === 'set-cookie') {
    -                            this.cookies = [value]
    -                        }
    -
    -                        // 1. If list contains name, then set the value of
    -                        //    the first such header to value and remove the
    -                        //    others.
    -                        // 2. Otherwise, append header (name, value) to list.
    -                        this[kHeadersMap].set(lowercaseName, { name, value })
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#concept-header-list-delete
    -                    delete(name) {
    -                        this[kHeadersSortedMap] = null
    -
    -                        name = name.toLowerCase()
    -
    -                        if (name === 'set-cookie') {
    -                            this.cookies = null
    -                        }
    -
    -                        this[kHeadersMap].delete(name)
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#concept-header-list-get
    -                    get(name) {
    -                        const value = this[kHeadersMap].get(name.toLowerCase())
    -
    -                        // 1. If list does not contain name, then return null.
    -                        // 2. Return the values of all headers in list whose name
    -                        //    is a byte-case-insensitive match for name,
    -                        //    separated from each other by 0x2C 0x20, in order.
    -                        return value === undefined ? null : value.value
    -                    }
    -
    -                    *[Symbol.iterator]() {
    -                        // use the lowercased name
    -                        for (const [name, { value }] of this[kHeadersMap]) {
    -                            yield [name, value]
    -                        }
    -                    }
    -
    -                    get entries() {
    -                        const headers = {}
    -
    -                        if (this[kHeadersMap].size) {
    -                            for (const { name, value } of this[kHeadersMap].values()) {
    -                                headers[name] = value
    -                            }
    -                        }
    -
    -                        return headers
    -                    }
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#headers-class
    -                class Headers {
    -                    constructor(init = undefined) {
    -                        if (init === kConstruct) {
    -                            return
    -                        }
    -                        this[kHeadersList] = new HeadersList()
    -
    -                        // The new Headers(init) constructor steps are:
    -
    -                        // 1. Set this’s guard to "none".
    -                        this[kGuard] = 'none'
    -
    -                        // 2. If init is given, then fill this with init.
    -                        if (init !== undefined) {
    -                            init = webidl.converters.HeadersInit(init)
    -                            fill(this, init)
    -                        }
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#dom-headers-append
    -                    append(name, value) {
    -                        webidl.brandCheck(this, Headers)
    -
    -                        webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.append' })
    -
    -                        name = webidl.converters.ByteString(name)
    -                        value = webidl.converters.ByteString(value)
    -
    -                        return appendHeader(this, name, value)
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#dom-headers-delete
    -                    delete(name) {
    -                        webidl.brandCheck(this, Headers)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.delete' })
    -
    -                        name = webidl.converters.ByteString(name)
    -
    -                        // 1. If name is not a header name, then throw a TypeError.
    -                        if (!isValidHeaderName(name)) {
    -                            throw webidl.errors.invalidArgument({
    -                                prefix: 'Headers.delete',
    -                                value: name,
    -                                type: 'header name'
    -                            })
    -                        }
    -
    -                        // 2. If this’s guard is "immutable", then throw a TypeError.
    -                        // 3. Otherwise, if this’s guard is "request" and name is a
    -                        //    forbidden header name, return.
    -                        // 4. Otherwise, if this’s guard is "request-no-cors", name
    -                        //    is not a no-CORS-safelisted request-header name, and
    -                        //    name is not a privileged no-CORS request-header name,
    -                        //    return.
    -                        // 5. Otherwise, if this’s guard is "response" and name is
    -                        //    a forbidden response-header name, return.
    -                        // Note: undici does not implement forbidden header names
    -                        if (this[kGuard] === 'immutable') {
    -                            throw new TypeError('immutable')
    -                        } else if (this[kGuard] === 'request-no-cors') {
    -                            // TODO
    -                        }
    -
    -                        // 6. If this’s header list does not contain name, then
    -                        //    return.
    -                        if (!this[kHeadersList].contains(name)) {
    -                            return
    -                        }
    -
    -                        // 7. Delete name from this’s header list.
    -                        // 8. If this’s guard is "request-no-cors", then remove
    -                        //    privileged no-CORS request headers from this.
    -                        this[kHeadersList].delete(name)
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#dom-headers-get
    -                    get(name) {
    -                        webidl.brandCheck(this, Headers)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.get' })
    -
    -                        name = webidl.converters.ByteString(name)
    -
    -                        // 1. If name is not a header name, then throw a TypeError.
    -                        if (!isValidHeaderName(name)) {
    -                            throw webidl.errors.invalidArgument({
    -                                prefix: 'Headers.get',
    -                                value: name,
    -                                type: 'header name'
    -                            })
    -                        }
    -
    -                        // 2. Return the result of getting name from this’s header
    -                        //    list.
    -                        return this[kHeadersList].get(name)
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#dom-headers-has
    -                    has(name) {
    -                        webidl.brandCheck(this, Headers)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.has' })
    -
    -                        name = webidl.converters.ByteString(name)
    -
    -                        // 1. If name is not a header name, then throw a TypeError.
    -                        if (!isValidHeaderName(name)) {
    -                            throw webidl.errors.invalidArgument({
    -                                prefix: 'Headers.has',
    -                                value: name,
    -                                type: 'header name'
    -                            })
    -                        }
    -
    -                        // 2. Return true if this’s header list contains name;
    -                        //    otherwise false.
    -                        return this[kHeadersList].contains(name)
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#dom-headers-set
    -                    set(name, value) {
    -                        webidl.brandCheck(this, Headers)
    -
    -                        webidl.argumentLengthCheck(arguments, 2, { header: 'Headers.set' })
    -
    -                        name = webidl.converters.ByteString(name)
    -                        value = webidl.converters.ByteString(value)
    -
    -                        // 1. Normalize value.
    -                        value = headerValueNormalize(value)
    -
    -                        // 2. If name is not a header name or value is not a
    -                        //    header value, then throw a TypeError.
    -                        if (!isValidHeaderName(name)) {
    -                            throw webidl.errors.invalidArgument({
    -                                prefix: 'Headers.set',
    -                                value: name,
    -                                type: 'header name'
    -                            })
    -                        } else if (!isValidHeaderValue(value)) {
    -                            throw webidl.errors.invalidArgument({
    -                                prefix: 'Headers.set',
    -                                value,
    -                                type: 'header value'
    -                            })
    -                        }
    -
    -                        // 3. If this’s guard is "immutable", then throw a TypeError.
    -                        // 4. Otherwise, if this’s guard is "request" and name is a
    -                        //    forbidden header name, return.
    -                        // 5. Otherwise, if this’s guard is "request-no-cors" and
    -                        //    name/value is not a no-CORS-safelisted request-header,
    -                        //    return.
    -                        // 6. Otherwise, if this’s guard is "response" and name is a
    -                        //    forbidden response-header name, return.
    -                        // Note: undici does not implement forbidden header names
    -                        if (this[kGuard] === 'immutable') {
    -                            throw new TypeError('immutable')
    -                        } else if (this[kGuard] === 'request-no-cors') {
    -                            // TODO
    -                        }
    -
    -                        // 7. Set (name, value) in this’s header list.
    -                        // 8. If this’s guard is "request-no-cors", then remove
    -                        //    privileged no-CORS request headers from this
    -                        this[kHeadersList].set(name, value)
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie
    -                    getSetCookie() {
    -                        webidl.brandCheck(this, Headers)
    -
    -                        // 1. If this’s header list does not contain `Set-Cookie`, then return « ».
    -                        // 2. Return the values of all headers in this’s header list whose name is
    -                        //    a byte-case-insensitive match for `Set-Cookie`, in order.
    -
    -                        const list = this[kHeadersList].cookies
    -
    -                        if (list) {
    -                            return [...list]
    -                        }
    -
    -                        return []
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine
    -                    get [kHeadersSortedMap]() {
    -                        if (this[kHeadersList][kHeadersSortedMap]) {
    -                            return this[kHeadersList][kHeadersSortedMap]
    -                        }
    -
    -                        // 1. Let headers be an empty list of headers with the key being the name
    -                        //    and value the value.
    -                        const headers = []
    -
    -                        // 2. Let names be the result of convert header names to a sorted-lowercase
    -                        //    set with all the names of the headers in list.
    -                        const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1)
    -                        const cookies = this[kHeadersList].cookies
    -
    -                        // 3. For each name of names:
    -                        for (let i = 0; i < names.length; ++i) {
    -                            const [name, value] = names[i]
    -                            // 1. If name is `set-cookie`, then:
    -                            if (name === 'set-cookie') {
    -                                // 1. Let values be a list of all values of headers in list whose name
    -                                //    is a byte-case-insensitive match for name, in order.
    -
    -                                // 2. For each value of values:
    -                                // 1. Append (name, value) to headers.
    -                                for (let j = 0; j < cookies.length; ++j) {
    -                                    headers.push([name, cookies[j]])
    -                                }
    -                            } else {
    -                                // 2. Otherwise:
    -
    -                                // 1. Let value be the result of getting name from list.
    -
    -                                // 2. Assert: value is non-null.
    -                                assert(value !== null)
    -
    -                                // 3. Append (name, value) to headers.
    -                                headers.push([name, value])
    -                            }
    -                        }
    -
    -                        this[kHeadersList][kHeadersSortedMap] = headers
    -
    -                        // 4. Return headers.
    -                        return headers
    -                    }
    -
    -                    keys() {
    -                        webidl.brandCheck(this, Headers)
    -
    -                        if (this[kGuard] === 'immutable') {
    -                            const value = this[kHeadersSortedMap]
    -                            return makeIterator(() => value, 'Headers',
    -                                'key')
    -                        }
    -
    -                        return makeIterator(
    -                            () => [...this[kHeadersSortedMap].values()],
    -                            'Headers',
    -                            'key'
    -                        )
    -                    }
    -
    -                    values() {
    -                        webidl.brandCheck(this, Headers)
    -
    -                        if (this[kGuard] === 'immutable') {
    -                            const value = this[kHeadersSortedMap]
    -                            return makeIterator(() => value, 'Headers',
    -                                'value')
    -                        }
    -
    -                        return makeIterator(
    -                            () => [...this[kHeadersSortedMap].values()],
    -                            'Headers',
    -                            'value'
    -                        )
    -                    }
    -
    -                    entries() {
    -                        webidl.brandCheck(this, Headers)
    -
    -                        if (this[kGuard] === 'immutable') {
    -                            const value = this[kHeadersSortedMap]
    -                            return makeIterator(() => value, 'Headers',
    -                                'key+value')
    -                        }
    -
    -                        return makeIterator(
    -                            () => [...this[kHeadersSortedMap].values()],
    -                            'Headers',
    -                            'key+value'
    -                        )
    -                    }
    -
    -                    /**
    -                     * @param {(value: string, key: string, self: Headers) => void} callbackFn
    -                     * @param {unknown} thisArg
    -                     */
    -                    forEach(callbackFn, thisArg = globalThis) {
    -                        webidl.brandCheck(this, Headers)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'Headers.forEach' })
    -
    -                        if (typeof callbackFn !== 'function') {
    -                            throw new TypeError(
    -                                "Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'."
    -                            )
    -                        }
    -
    -                        for (const [key, value] of this) {
    -                            callbackFn.apply(thisArg, [value, key, this])
    -                        }
    -                    }
    -
    -                    [Symbol.for('nodejs.util.inspect.custom')]() {
    -                        webidl.brandCheck(this, Headers)
    -
    -                        return this[kHeadersList]
    -                    }
    -                }
    -
    -                Headers.prototype[Symbol.iterator] = Headers.prototype.entries
    -
    -                Object.defineProperties(Headers.prototype, {
    -                    append: kEnumerableProperty,
    -                    delete: kEnumerableProperty,
    -                    get: kEnumerableProperty,
    -                    has: kEnumerableProperty,
    -                    set: kEnumerableProperty,
    -                    getSetCookie: kEnumerableProperty,
    -                    keys: kEnumerableProperty,
    -                    values: kEnumerableProperty,
    -                    entries: kEnumerableProperty,
    -                    forEach: kEnumerableProperty,
    -                    [Symbol.iterator]: { enumerable: false },
    -                    [Symbol.toStringTag]: {
    -                        value: 'Headers',
    -                        configurable: true
    -                    }
    -                })
    -
    -                webidl.converters.HeadersInit = function (V) {
    -                    if (webidl.util.Type(V) === 'Object') {
    -                        if (V[Symbol.iterator]) {
    -                            return webidl.converters['sequence>'](V)
    -                        }
    -
    -                        return webidl.converters['record'](V)
    -                    }
    -
    -                    throw webidl.errors.conversionFailed({
    -                        prefix: 'Headers constructor',
    -                        argument: 'Argument 1',
    -                        types: ['sequence>', 'record']
    -                    })
    -                }
    -
    -                module.exports = {
    -                    fill,
    -                    Headers,
    -                    HeadersList
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 4881:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -                // https://github.com/Ethan-Arrowood/undici-fetch
    -
    -
    -
    -                const {
    -                    Response,
    -                    makeNetworkError,
    -                    makeAppropriateNetworkError,
    -                    filterResponse,
    -                    makeResponse
    -                } = __nccwpck_require__(7823)
    -                const { Headers } = __nccwpck_require__(554)
    -                const { Request, makeRequest } = __nccwpck_require__(8359)
    -                const zlib = __nccwpck_require__(9796)
    -                const {
    -                    bytesMatch,
    -                    makePolicyContainer,
    -                    clonePolicyContainer,
    -                    requestBadPort,
    -                    TAOCheck,
    -                    appendRequestOriginHeader,
    -                    responseLocationURL,
    -                    requestCurrentURL,
    -                    setRequestReferrerPolicyOnRedirect,
    -                    tryUpgradeRequestToAPotentiallyTrustworthyURL,
    -                    createOpaqueTimingInfo,
    -                    appendFetchMetadata,
    -                    corsCheck,
    -                    crossOriginResourcePolicyCheck,
    -                    determineRequestsReferrer,
    -                    coarsenedSharedCurrentTime,
    -                    createDeferredPromise,
    -                    isBlobLike,
    -                    sameOrigin,
    -                    isCancelled,
    -                    isAborted,
    -                    isErrorLike,
    -                    fullyReadBody,
    -                    readableStreamClose,
    -                    isomorphicEncode,
    -                    urlIsLocal,
    -                    urlIsHttpHttpsScheme,
    -                    urlHasHttpsScheme
    -                } = __nccwpck_require__(2538)
    -                const { kState, kHeaders, kGuard, kRealm } = __nccwpck_require__(5861)
    -                const assert = __nccwpck_require__(9491)
    -                const { safelyExtractBody } = __nccwpck_require__(1472)
    -                const {
    -                    redirectStatusSet,
    -                    nullBodyStatus,
    -                    safeMethodsSet,
    -                    requestBodyHeader,
    -                    subresourceSet,
    -                    DOMException
    -                } = __nccwpck_require__(1037)
    -                const { kHeadersList } = __nccwpck_require__(2785)
    -                const EE = __nccwpck_require__(2361)
    -                const { Readable, pipeline } = __nccwpck_require__(2781)
    -                const { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = __nccwpck_require__(3983)
    -                const { dataURLProcessor, serializeAMimeType } = __nccwpck_require__(685)
    -                const { TransformStream } = __nccwpck_require__(5356)
    -                const { getGlobalDispatcher } = __nccwpck_require__(1892)
    -                const { webidl } = __nccwpck_require__(1744)
    -                const { STATUS_CODES } = __nccwpck_require__(3685)
    -                const GET_OR_HEAD = ['GET', 'HEAD']
    -
    -                /** @type {import('buffer').resolveObjectURL} */
    -                let resolveObjectURL
    -                let ReadableStream = globalThis.ReadableStream
    -
    -                class Fetch extends EE {
    -                    constructor(dispatcher) {
    -                        super()
    -
    -                        this.dispatcher = dispatcher
    -                        this.connection = null
    -                        this.dump = false
    -                        this.state = 'ongoing'
    -                        // 2 terminated listeners get added per request,
    -                        // but only 1 gets removed. If there are 20 redirects,
    -                        // 21 listeners will be added.
    -                        // See https://github.com/nodejs/undici/issues/1711
    -                        // TODO (fix): Find and fix root cause for leaked listener.
    -                        this.setMaxListeners(21)
    -                    }
    -
    -                    terminate(reason) {
    -                        if (this.state !== 'ongoing') {
    -                            return
    -                        }
    -
    -                        this.state = 'terminated'
    -                        this.connection?.destroy(reason)
    -                        this.emit('terminated', reason)
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#fetch-controller-abort
    -                    abort(error) {
    -                        if (this.state !== 'ongoing') {
    -                            return
    -                        }
    -
    -                        // 1. Set controller’s state to "aborted".
    -                        this.state = 'aborted'
    -
    -                        // 2. Let fallbackError be an "AbortError" DOMException.
    -                        // 3. Set error to fallbackError if it is not given.
    -                        if (!error) {
    -                            error = new DOMException('The operation was aborted.', 'AbortError')
    -                        }
    -
    -                        // 4. Let serializedError be StructuredSerialize(error).
    -                        //    If that threw an exception, catch it, and let
    -                        //    serializedError be StructuredSerialize(fallbackError).
    -
    -                        // 5. Set controller’s serialized abort reason to serializedError.
    -                        this.serializedAbortReason = error
    -
    -                        this.connection?.destroy(error)
    -                        this.emit('terminated', error)
    -                    }
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#fetch-method
    -                function fetch(input, init = {}) {
    -                    webidl.argumentLengthCheck(arguments, 1, { header: 'globalThis.fetch' })
    -
    -                    // 1. Let p be a new promise.
    -                    const p = createDeferredPromise()
    -
    -                    // 2. Let requestObject be the result of invoking the initial value of
    -                    // Request as constructor with input and init as arguments. If this throws
    -                    // an exception, reject p with it and return p.
    -                    let requestObject
    -
    -                    try {
    -                        requestObject = new Request(input, init)
    -                    } catch (e) {
    -                        p.reject(e)
    -                        return p.promise
    -                    }
    -
    -                    // 3. Let request be requestObject’s request.
    -                    const request = requestObject[kState]
    -
    -                    // 4. If requestObject’s signal’s aborted flag is set, then:
    -                    if (requestObject.signal.aborted) {
    -                        // 1. Abort the fetch() call with p, request, null, and
    -                        //    requestObject’s signal’s abort reason.
    -                        abortFetch(p, request, null, requestObject.signal.reason)
    -
    -                        // 2. Return p.
    -                        return p.promise
    -                    }
    -
    -                    // 5. Let globalObject be request’s client’s global object.
    -                    const globalObject = request.client.globalObject
    -
    -                    // 6. If globalObject is a ServiceWorkerGlobalScope object, then set
    -                    // request’s service-workers mode to "none".
    -                    if (globalObject?.constructor?.name === 'ServiceWorkerGlobalScope') {
    -                        request.serviceWorkers = 'none'
    -                    }
    -
    -                    // 7. Let responseObject be null.
    -                    let responseObject = null
    -
    -                    // 8. Let relevantRealm be this’s relevant Realm.
    -                    const relevantRealm = null
    -
    -                    // 9. Let locallyAborted be false.
    -                    let locallyAborted = false
    -
    -                    // 10. Let controller be null.
    -                    let controller = null
    -
    -                    // 11. Add the following abort steps to requestObject’s signal:
    -                    addAbortListener(
    -                        requestObject.signal,
    -                        () => {
    -                            // 1. Set locallyAborted to true.
    -                            locallyAborted = true
    -
    -                            // 2. Assert: controller is non-null.
    -                            assert(controller != null)
    -
    -                            // 3. Abort controller with requestObject’s signal’s abort reason.
    -                            controller.abort(requestObject.signal.reason)
    -
    -                            // 4. Abort the fetch() call with p, request, responseObject,
    -                            //    and requestObject’s signal’s abort reason.
    -                            abortFetch(p, request, responseObject, requestObject.signal.reason)
    -                        }
    -                    )
    -
    -                    // 12. Let handleFetchDone given response response be to finalize and
    -                    // report timing with response, globalObject, and "fetch".
    -                    const handleFetchDone = (response) =>
    -                        finalizeAndReportTiming(response, 'fetch')
    -
    -                    // 13. Set controller to the result of calling fetch given request,
    -                    // with processResponseEndOfBody set to handleFetchDone, and processResponse
    -                    // given response being these substeps:
    -
    -                    const processResponse = (response) => {
    -                        // 1. If locallyAborted is true, terminate these substeps.
    -                        if (locallyAborted) {
    -                            return Promise.resolve()
    -                        }
    -
    -                        // 2. If response’s aborted flag is set, then:
    -                        if (response.aborted) {
    -                            // 1. Let deserializedError be the result of deserialize a serialized
    -                            //    abort reason given controller’s serialized abort reason and
    -                            //    relevantRealm.
    -
    -                            // 2. Abort the fetch() call with p, request, responseObject, and
    -                            //    deserializedError.
    -
    -                            abortFetch(p, request, responseObject, controller.serializedAbortReason)
    -                            return Promise.resolve()
    -                        }
    -
    -                        // 3. If response is a network error, then reject p with a TypeError
    -                        // and terminate these substeps.
    -                        if (response.type === 'error') {
    -                            p.reject(
    -                                Object.assign(new TypeError('fetch failed'), { cause: response.error })
    -                            )
    -                            return Promise.resolve()
    -                        }
    -
    -                        // 4. Set responseObject to the result of creating a Response object,
    -                        // given response, "immutable", and relevantRealm.
    -                        responseObject = new Response()
    -                        responseObject[kState] = response
    -                        responseObject[kRealm] = relevantRealm
    -                        responseObject[kHeaders][kHeadersList] = response.headersList
    -                        responseObject[kHeaders][kGuard] = 'immutable'
    -                        responseObject[kHeaders][kRealm] = relevantRealm
    -
    -                        // 5. Resolve p with responseObject.
    -                        p.resolve(responseObject)
    -                    }
    -
    -                    controller = fetching({
    -                        request,
    -                        processResponseEndOfBody: handleFetchDone,
    -                        processResponse,
    -                        dispatcher: init.dispatcher ?? getGlobalDispatcher() // undici
    -                    })
    -
    -                    // 14. Return p.
    -                    return p.promise
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#finalize-and-report-timing
    -                function finalizeAndReportTiming(response, initiatorType = 'other') {
    -                    // 1. If response is an aborted network error, then return.
    -                    if (response.type === 'error' && response.aborted) {
    -                        return
    -                    }
    -
    -                    // 2. If response’s URL list is null or empty, then return.
    -                    if (!response.urlList?.length) {
    -                        return
    -                    }
    -
    -                    // 3. Let originalURL be response’s URL list[0].
    -                    const originalURL = response.urlList[0]
    -
    -                    // 4. Let timingInfo be response’s timing info.
    -                    let timingInfo = response.timingInfo
    -
    -                    // 5. Let cacheState be response’s cache state.
    -                    let cacheState = response.cacheState
    -
    -                    // 6. If originalURL’s scheme is not an HTTP(S) scheme, then return.
    -                    if (!urlIsHttpHttpsScheme(originalURL)) {
    -                        return
    -                    }
    -
    -                    // 7. If timingInfo is null, then return.
    -                    if (timingInfo === null) {
    -                        return
    -                    }
    -
    -                    // 8. If response’s timing allow passed flag is not set, then:
    -                    if (!response.timingAllowPassed) {
    -                        //  1. Set timingInfo to a the result of creating an opaque timing info for timingInfo.
    -                        timingInfo = createOpaqueTimingInfo({
    -                            startTime: timingInfo.startTime
    -                        })
    -
    -                        //  2. Set cacheState to the empty string.
    -                        cacheState = ''
    -                    }
    -
    -                    // 9. Set timingInfo’s end time to the coarsened shared current time
    -                    // given global’s relevant settings object’s cross-origin isolated
    -                    // capability.
    -                    // TODO: given global’s relevant settings object’s cross-origin isolated
    -                    // capability?
    -                    timingInfo.endTime = coarsenedSharedCurrentTime()
    -
    -                    // 10. Set response’s timing info to timingInfo.
    -                    response.timingInfo = timingInfo
    -
    -                    // 11. Mark resource timing for timingInfo, originalURL, initiatorType,
    -                    // global, and cacheState.
    -                    markResourceTiming(
    -                        timingInfo,
    -                        originalURL,
    -                        initiatorType,
    -                        globalThis,
    -                        cacheState
    -                    )
    -                }
    -
    -                // https://w3c.github.io/resource-timing/#dfn-mark-resource-timing
    -                function markResourceTiming(timingInfo, originalURL, initiatorType, globalThis, cacheState) {
    -                    if (nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 2)) {
    -                        performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis, cacheState)
    -                    }
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#abort-fetch
    -                function abortFetch(p, request, responseObject, error) {
    -                    // Note: AbortSignal.reason was added in node v17.2.0
    -                    // which would give us an undefined error to reject with.
    -                    // Remove this once node v16 is no longer supported.
    -                    if (!error) {
    -                        error = new DOMException('The operation was aborted.', 'AbortError')
    -                    }
    -
    -                    // 1. Reject promise with error.
    -                    p.reject(error)
    -
    -                    // 2. If request’s body is not null and is readable, then cancel request’s
    -                    // body with error.
    -                    if (request.body != null && isReadable(request.body?.stream)) {
    -                        request.body.stream.cancel(error).catch((err) => {
    -                            if (err.code === 'ERR_INVALID_STATE') {
    -                                // Node bug?
    -                                return
    -                            }
    -                            throw err
    -                        })
    -                    }
    -
    -                    // 3. If responseObject is null, then return.
    -                    if (responseObject == null) {
    -                        return
    -                    }
    -
    -                    // 4. Let response be responseObject’s response.
    -                    const response = responseObject[kState]
    -
    -                    // 5. If response’s body is not null and is readable, then error response’s
    -                    // body with error.
    -                    if (response.body != null && isReadable(response.body?.stream)) {
    -                        response.body.stream.cancel(error).catch((err) => {
    -                            if (err.code === 'ERR_INVALID_STATE') {
    -                                // Node bug?
    -                                return
    -                            }
    -                            throw err
    -                        })
    -                    }
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#fetching
    -                function fetching({
    -                    request,
    -                    processRequestBodyChunkLength,
    -                    processRequestEndOfBody,
    -                    processResponse,
    -                    processResponseEndOfBody,
    -                    processResponseConsumeBody,
    -                    useParallelQueue = false,
    -                    dispatcher // undici
    -                }) {
    -                    // 1. Let taskDestination be null.
    -                    let taskDestination = null
    -
    -                    // 2. Let crossOriginIsolatedCapability be false.
    -                    let crossOriginIsolatedCapability = false
    -
    -                    // 3. If request’s client is non-null, then:
    -                    if (request.client != null) {
    -                        // 1. Set taskDestination to request’s client’s global object.
    -                        taskDestination = request.client.globalObject
    -
    -                        // 2. Set crossOriginIsolatedCapability to request’s client’s cross-origin
    -                        // isolated capability.
    -                        crossOriginIsolatedCapability =
    -                            request.client.crossOriginIsolatedCapability
    -                    }
    -
    -                    // 4. If useParallelQueue is true, then set taskDestination to the result of
    -                    // starting a new parallel queue.
    -                    // TODO
    -
    -                    // 5. Let timingInfo be a new fetch timing info whose start time and
    -                    // post-redirect start time are the coarsened shared current time given
    -                    // crossOriginIsolatedCapability.
    -                    const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability)
    -                    const timingInfo = createOpaqueTimingInfo({
    -                        startTime: currenTime
    -                    })
    -
    -                    // 6. Let fetchParams be a new fetch params whose
    -                    // request is request,
    -                    // timing info is timingInfo,
    -                    // process request body chunk length is processRequestBodyChunkLength,
    -                    // process request end-of-body is processRequestEndOfBody,
    -                    // process response is processResponse,
    -                    // process response consume body is processResponseConsumeBody,
    -                    // process response end-of-body is processResponseEndOfBody,
    -                    // task destination is taskDestination,
    -                    // and cross-origin isolated capability is crossOriginIsolatedCapability.
    -                    const fetchParams = {
    -                        controller: new Fetch(dispatcher),
    -                        request,
    -                        timingInfo,
    -                        processRequestBodyChunkLength,
    -                        processRequestEndOfBody,
    -                        processResponse,
    -                        processResponseConsumeBody,
    -                        processResponseEndOfBody,
    -                        taskDestination,
    -                        crossOriginIsolatedCapability
    -                    }
    -
    -                    // 7. If request’s body is a byte sequence, then set request’s body to
    -                    //    request’s body as a body.
    -                    // NOTE: Since fetching is only called from fetch, body should already be
    -                    // extracted.
    -                    assert(!request.body || request.body.stream)
    -
    -                    // 8. If request’s window is "client", then set request’s window to request’s
    -                    // client, if request’s client’s global object is a Window object; otherwise
    -                    // "no-window".
    -                    if (request.window === 'client') {
    -                        // TODO: What if request.client is null?
    -                        request.window =
    -                            request.client?.globalObject?.constructor?.name === 'Window'
    -                                ? request.client
    -                                : 'no-window'
    -                    }
    -
    -                    // 9. If request’s origin is "client", then set request’s origin to request’s
    -                    // client’s origin.
    -                    if (request.origin === 'client') {
    -                        // TODO: What if request.client is null?
    -                        request.origin = request.client?.origin
    -                    }
    -
    -                    // 10. If all of the following conditions are true:
    -                    // TODO
    -
    -                    // 11. If request’s policy container is "client", then:
    -                    if (request.policyContainer === 'client') {
    -                        // 1. If request’s client is non-null, then set request’s policy
    -                        // container to a clone of request’s client’s policy container. [HTML]
    -                        if (request.client != null) {
    -                            request.policyContainer = clonePolicyContainer(
    -                                request.client.policyContainer
    -                            )
    -                        } else {
    -                            // 2. Otherwise, set request’s policy container to a new policy
    -                            // container.
    -                            request.policyContainer = makePolicyContainer()
    -                        }
    -                    }
    -
    -                    // 12. If request’s header list does not contain `Accept`, then:
    -                    if (!request.headersList.contains('accept')) {
    -                        // 1. Let value be `*/*`.
    -                        const value = '*/*'
    -
    -                        // 2. A user agent should set value to the first matching statement, if
    -                        // any, switching on request’s destination:
    -                        // "document"
    -                        // "frame"
    -                        // "iframe"
    -                        // `text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8`
    -                        // "image"
    -                        // `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5`
    -                        // "style"
    -                        // `text/css,*/*;q=0.1`
    -                        // TODO
    -
    -                        // 3. Append `Accept`/value to request’s header list.
    -                        request.headersList.append('accept', value)
    -                    }
    -
    -                    // 13. If request’s header list does not contain `Accept-Language`, then
    -                    // user agents should append `Accept-Language`/an appropriate value to
    -                    // request’s header list.
    -                    if (!request.headersList.contains('accept-language')) {
    -                        request.headersList.append('accept-language', '*')
    -                    }
    -
    -                    // 14. If request’s priority is null, then use request’s initiator and
    -                    // destination appropriately in setting request’s priority to a
    -                    // user-agent-defined object.
    -                    if (request.priority === null) {
    -                        // TODO
    -                    }
    -
    -                    // 15. If request is a subresource request, then:
    -                    if (subresourceSet.has(request.destination)) {
    -                        // TODO
    -                    }
    -
    -                    // 16. Run main fetch given fetchParams.
    -                    mainFetch(fetchParams)
    -                        .catch(err => {
    -                            fetchParams.controller.terminate(err)
    -                        })
    -
    -                    // 17. Return fetchParam's controller
    -                    return fetchParams.controller
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#concept-main-fetch
    -                async function mainFetch(fetchParams, recursive = false) {
    -                    // 1. Let request be fetchParams’s request.
    -                    const request = fetchParams.request
    -
    -                    // 2. Let response be null.
    -                    let response = null
    -
    -                    // 3. If request’s local-URLs-only flag is set and request’s current URL is
    -                    // not local, then set response to a network error.
    -                    if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) {
    -                        response = makeNetworkError('local URLs only')
    -                    }
    -
    -                    // 4. Run report Content Security Policy violations for request.
    -                    // TODO
    -
    -                    // 5. Upgrade request to a potentially trustworthy URL, if appropriate.
    -                    tryUpgradeRequestToAPotentiallyTrustworthyURL(request)
    -
    -                    // 6. If should request be blocked due to a bad port, should fetching request
    -                    // be blocked as mixed content, or should request be blocked by Content
    -                    // Security Policy returns blocked, then set response to a network error.
    -                    if (requestBadPort(request) === 'blocked') {
    -                        response = makeNetworkError('bad port')
    -                    }
    -                    // TODO: should fetching request be blocked as mixed content?
    -                    // TODO: should request be blocked by Content Security Policy?
    -
    -                    // 7. If request’s referrer policy is the empty string, then set request’s
    -                    // referrer policy to request’s policy container’s referrer policy.
    -                    if (request.referrerPolicy === '') {
    -                        request.referrerPolicy = request.policyContainer.referrerPolicy
    -                    }
    -
    -                    // 8. If request’s referrer is not "no-referrer", then set request’s
    -                    // referrer to the result of invoking determine request’s referrer.
    -                    if (request.referrer !== 'no-referrer') {
    -                        request.referrer = determineRequestsReferrer(request)
    -                    }
    -
    -                    // 9. Set request’s current URL’s scheme to "https" if all of the following
    -                    // conditions are true:
    -                    // - request’s current URL’s scheme is "http"
    -                    // - request’s current URL’s host is a domain
    -                    // - Matching request’s current URL’s host per Known HSTS Host Domain Name
    -                    //   Matching results in either a superdomain match with an asserted
    -                    //   includeSubDomains directive or a congruent match (with or without an
    -                    //   asserted includeSubDomains directive). [HSTS]
    -                    // TODO
    -
    -                    // 10. If recursive is false, then run the remaining steps in parallel.
    -                    // TODO
    -
    -                    // 11. If response is null, then set response to the result of running
    -                    // the steps corresponding to the first matching statement:
    -                    if (response === null) {
    -                        response = await (async () => {
    -                            const currentURL = requestCurrentURL(request)
    -
    -                            if (
    -                                // - request’s current URL’s origin is same origin with request’s origin,
    -                                //   and request’s response tainting is "basic"
    -                                (sameOrigin(currentURL, request.url) && request.responseTainting === 'basic') ||
    -                                // request’s current URL’s scheme is "data"
    -                                (currentURL.protocol === 'data:') ||
    -                                // - request’s mode is "navigate" or "websocket"
    -                                (request.mode === 'navigate' || request.mode === 'websocket')
    -                            ) {
    -                                // 1. Set request’s response tainting to "basic".
    -                                request.responseTainting = 'basic'
    -
    -                                // 2. Return the result of running scheme fetch given fetchParams.
    -                                return await schemeFetch(fetchParams)
    -                            }
    -
    -                            // request’s mode is "same-origin"
    -                            if (request.mode === 'same-origin') {
    -                                // 1. Return a network error.
    -                                return makeNetworkError('request mode cannot be "same-origin"')
    -                            }
    -
    -                            // request’s mode is "no-cors"
    -                            if (request.mode === 'no-cors') {
    -                                // 1. If request’s redirect mode is not "follow", then return a network
    -                                // error.
    -                                if (request.redirect !== 'follow') {
    -                                    return makeNetworkError(
    -                                        'redirect mode cannot be "follow" for "no-cors" request'
    -                                    )
    -                                }
    -
    -                                // 2. Set request’s response tainting to "opaque".
    -                                request.responseTainting = 'opaque'
    -
    -                                // 3. Return the result of running scheme fetch given fetchParams.
    -                                return await schemeFetch(fetchParams)
    -                            }
    -
    -                            // request’s current URL’s scheme is not an HTTP(S) scheme
    -                            if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) {
    -                                // Return a network error.
    -                                return makeNetworkError('URL scheme must be a HTTP(S) scheme')
    -                            }
    -
    -                            // - request’s use-CORS-preflight flag is set
    -                            // - request’s unsafe-request flag is set and either request’s method is
    -                            //   not a CORS-safelisted method or CORS-unsafe request-header names with
    -                            //   request’s header list is not empty
    -                            //    1. Set request’s response tainting to "cors".
    -                            //    2. Let corsWithPreflightResponse be the result of running HTTP fetch
    -                            //    given fetchParams and true.
    -                            //    3. If corsWithPreflightResponse is a network error, then clear cache
    -                            //    entries using request.
    -                            //    4. Return corsWithPreflightResponse.
    -                            // TODO
    -
    -                            // Otherwise
    -                            //    1. Set request’s response tainting to "cors".
    -                            request.responseTainting = 'cors'
    -
    -                            //    2. Return the result of running HTTP fetch given fetchParams.
    -                            return await httpFetch(fetchParams)
    -                        })()
    -                    }
    -
    -                    // 12. If recursive is true, then return response.
    -                    if (recursive) {
    -                        return response
    -                    }
    -
    -                    // 13. If response is not a network error and response is not a filtered
    -                    // response, then:
    -                    if (response.status !== 0 && !response.internalResponse) {
    -                        // If request’s response tainting is "cors", then:
    -                        if (request.responseTainting === 'cors') {
    -                            // 1. Let headerNames be the result of extracting header list values
    -                            // given `Access-Control-Expose-Headers` and response’s header list.
    -                            // TODO
    -                            // 2. If request’s credentials mode is not "include" and headerNames
    -                            // contains `*`, then set response’s CORS-exposed header-name list to
    -                            // all unique header names in response’s header list.
    -                            // TODO
    -                            // 3. Otherwise, if headerNames is not null or failure, then set
    -                            // response’s CORS-exposed header-name list to headerNames.
    -                            // TODO
    -                        }
    -
    -                        // Set response to the following filtered response with response as its
    -                        // internal response, depending on request’s response tainting:
    -                        if (request.responseTainting === 'basic') {
    -                            response = filterResponse(response, 'basic')
    -                        } else if (request.responseTainting === 'cors') {
    -                            response = filterResponse(response, 'cors')
    -                        } else if (request.responseTainting === 'opaque') {
    -                            response = filterResponse(response, 'opaque')
    -                        } else {
    -                            assert(false)
    -                        }
    -                    }
    -
    -                    // 14. Let internalResponse be response, if response is a network error,
    -                    // and response’s internal response otherwise.
    -                    let internalResponse =
    -                        response.status === 0 ? response : response.internalResponse
    -
    -                    // 15. If internalResponse’s URL list is empty, then set it to a clone of
    -                    // request’s URL list.
    -                    if (internalResponse.urlList.length === 0) {
    -                        internalResponse.urlList.push(...request.urlList)
    -                    }
    -
    -                    // 16. If request’s timing allow failed flag is unset, then set
    -                    // internalResponse’s timing allow passed flag.
    -                    if (!request.timingAllowFailed) {
    -                        response.timingAllowPassed = true
    -                    }
    -
    -                    // 17. If response is not a network error and any of the following returns
    -                    // blocked
    -                    // - should internalResponse to request be blocked as mixed content
    -                    // - should internalResponse to request be blocked by Content Security Policy
    -                    // - should internalResponse to request be blocked due to its MIME type
    -                    // - should internalResponse to request be blocked due to nosniff
    -                    // TODO
    -
    -                    // 18. If response’s type is "opaque", internalResponse’s status is 206,
    -                    // internalResponse’s range-requested flag is set, and request’s header
    -                    // list does not contain `Range`, then set response and internalResponse
    -                    // to a network error.
    -                    if (
    -                        response.type === 'opaque' &&
    -                        internalResponse.status === 206 &&
    -                        internalResponse.rangeRequested &&
    -                        !request.headers.contains('range')
    -                    ) {
    -                        response = internalResponse = makeNetworkError()
    -                    }
    -
    -                    // 19. If response is not a network error and either request’s method is
    -                    // `HEAD` or `CONNECT`, or internalResponse’s status is a null body status,
    -                    // set internalResponse’s body to null and disregard any enqueuing toward
    -                    // it (if any).
    -                    if (
    -                        response.status !== 0 &&
    -                        (request.method === 'HEAD' ||
    -                            request.method === 'CONNECT' ||
    -                            nullBodyStatus.includes(internalResponse.status))
    -                    ) {
    -                        internalResponse.body = null
    -                        fetchParams.controller.dump = true
    -                    }
    -
    -                    // 20. If request’s integrity metadata is not the empty string, then:
    -                    if (request.integrity) {
    -                        // 1. Let processBodyError be this step: run fetch finale given fetchParams
    -                        // and a network error.
    -                        const processBodyError = (reason) =>
    -                            fetchFinale(fetchParams, makeNetworkError(reason))
    -
    -                        // 2. If request’s response tainting is "opaque", or response’s body is null,
    -                        // then run processBodyError and abort these steps.
    -                        if (request.responseTainting === 'opaque' || response.body == null) {
    -                            processBodyError(response.error)
    -                            return
    -                        }
    -
    -                        // 3. Let processBody given bytes be these steps:
    -                        const processBody = (bytes) => {
    -                            // 1. If bytes do not match request’s integrity metadata,
    -                            // then run processBodyError and abort these steps. [SRI]
    -                            if (!bytesMatch(bytes, request.integrity)) {
    -                                processBodyError('integrity mismatch')
    -                                return
    -                            }
    -
    -                            // 2. Set response’s body to bytes as a body.
    -                            response.body = safelyExtractBody(bytes)[0]
    -
    -                            // 3. Run fetch finale given fetchParams and response.
    -                            fetchFinale(fetchParams, response)
    -                        }
    -
    -                        // 4. Fully read response’s body given processBody and processBodyError.
    -                        await fullyReadBody(response.body, processBody, processBodyError)
    -                    } else {
    -                        // 21. Otherwise, run fetch finale given fetchParams and response.
    -                        fetchFinale(fetchParams, response)
    -                    }
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#concept-scheme-fetch
    -                // given a fetch params fetchParams
    -                function schemeFetch(fetchParams) {
    -                    // Note: since the connection is destroyed on redirect, which sets fetchParams to a
    -                    // cancelled state, we do not want this condition to trigger *unless* there have been
    -                    // no redirects. See https://github.com/nodejs/undici/issues/1776
    -                    // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.
    -                    if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) {
    -                        return Promise.resolve(makeAppropriateNetworkError(fetchParams))
    -                    }
    -
    -                    // 2. Let request be fetchParams’s request.
    -                    const { request } = fetchParams
    -
    -                    const { protocol: scheme } = requestCurrentURL(request)
    -
    -                    // 3. Switch on request’s current URL’s scheme and run the associated steps:
    -                    switch (scheme) {
    -                        case 'about:': {
    -                            // If request’s current URL’s path is the string "blank", then return a new response
    -                            // whose status message is `OK`, header list is « (`Content-Type`, `text/html;charset=utf-8`) »,
    -                            // and body is the empty byte sequence as a body.
    -
    -                            // Otherwise, return a network error.
    -                            return Promise.resolve(makeNetworkError('about scheme is not supported'))
    -                        }
    -                        case 'blob:': {
    -                            if (!resolveObjectURL) {
    -                                resolveObjectURL = (__nccwpck_require__(4300).resolveObjectURL)
    -                            }
    -
    -                            // 1. Let blobURLEntry be request’s current URL’s blob URL entry.
    -                            const blobURLEntry = requestCurrentURL(request)
    -
    -                            // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56
    -                            // Buffer.resolveObjectURL does not ignore URL queries.
    -                            if (blobURLEntry.search.length !== 0) {
    -                                return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.'))
    -                            }
    -
    -                            const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString())
    -
    -                            // 2. If request’s method is not `GET`, blobURLEntry is null, or blobURLEntry’s
    -                            //    object is not a Blob object, then return a network error.
    -                            if (request.method !== 'GET' || !isBlobLike(blobURLEntryObject)) {
    -                                return Promise.resolve(makeNetworkError('invalid method'))
    -                            }
    -
    -                            // 3. Let bodyWithType be the result of safely extracting blobURLEntry’s object.
    -                            const bodyWithType = safelyExtractBody(blobURLEntryObject)
    -
    -                            // 4. Let body be bodyWithType’s body.
    -                            const body = bodyWithType[0]
    -
    -                            // 5. Let length be body’s length, serialized and isomorphic encoded.
    -                            const length = isomorphicEncode(`${body.length}`)
    -
    -                            // 6. Let type be bodyWithType’s type if it is non-null; otherwise the empty byte sequence.
    -                            const type = bodyWithType[1] ?? ''
    -
    -                            // 7. Return a new response whose status message is `OK`, header list is
    -                            //    « (`Content-Length`, length), (`Content-Type`, type) », and body is body.
    -                            const response = makeResponse({
    -                                statusText: 'OK',
    -                                headersList: [
    -                                    ['content-length', { name: 'Content-Length', value: length }],
    -                                    ['content-type', { name: 'Content-Type', value: type }]
    -                                ]
    -                            })
    -
    -                            response.body = body
    -
    -                            return Promise.resolve(response)
    -                        }
    -                        case 'data:': {
    -                            // 1. Let dataURLStruct be the result of running the
    -                            //    data: URL processor on request’s current URL.
    -                            const currentURL = requestCurrentURL(request)
    -                            const dataURLStruct = dataURLProcessor(currentURL)
    -
    -                            // 2. If dataURLStruct is failure, then return a
    -                            //    network error.
    -                            if (dataURLStruct === 'failure') {
    -                                return Promise.resolve(makeNetworkError('failed to fetch the data URL'))
    -                            }
    -
    -                            // 3. Let mimeType be dataURLStruct’s MIME type, serialized.
    -                            const mimeType = serializeAMimeType(dataURLStruct.mimeType)
    -
    -                            // 4. Return a response whose status message is `OK`,
    -                            //    header list is « (`Content-Type`, mimeType) »,
    -                            //    and body is dataURLStruct’s body as a body.
    -                            return Promise.resolve(makeResponse({
    -                                statusText: 'OK',
    -                                headersList: [
    -                                    ['content-type', { name: 'Content-Type', value: mimeType }]
    -                                ],
    -                                body: safelyExtractBody(dataURLStruct.body)[0]
    -                            }))
    -                        }
    -                        case 'file:': {
    -                            // For now, unfortunate as it is, file URLs are left as an exercise for the reader.
    -                            // When in doubt, return a network error.
    -                            return Promise.resolve(makeNetworkError('not implemented... yet...'))
    -                        }
    -                        case 'http:':
    -                        case 'https:': {
    -                            // Return the result of running HTTP fetch given fetchParams.
    -
    -                            return httpFetch(fetchParams)
    -                                .catch((err) => makeNetworkError(err))
    -                        }
    -                        default: {
    -                            return Promise.resolve(makeNetworkError('unknown scheme'))
    -                        }
    -                    }
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#finalize-response
    -                function finalizeResponse(fetchParams, response) {
    -                    // 1. Set fetchParams’s request’s done flag.
    -                    fetchParams.request.done = true
    -
    -                    // 2, If fetchParams’s process response done is not null, then queue a fetch
    -                    // task to run fetchParams’s process response done given response, with
    -                    // fetchParams’s task destination.
    -                    if (fetchParams.processResponseDone != null) {
    -                        queueMicrotask(() => fetchParams.processResponseDone(response))
    -                    }
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#fetch-finale
    -                function fetchFinale(fetchParams, response) {
    -                    // 1. If response is a network error, then:
    -                    if (response.type === 'error') {
    -                        // 1. Set response’s URL list to « fetchParams’s request’s URL list[0] ».
    -                        response.urlList = [fetchParams.request.urlList[0]]
    -
    -                        // 2. Set response’s timing info to the result of creating an opaque timing
    -                        // info for fetchParams’s timing info.
    -                        response.timingInfo = createOpaqueTimingInfo({
    -                            startTime: fetchParams.timingInfo.startTime
    -                        })
    -                    }
    -
    -                    // 2. Let processResponseEndOfBody be the following steps:
    -                    const processResponseEndOfBody = () => {
    -                        // 1. Set fetchParams’s request’s done flag.
    -                        fetchParams.request.done = true
    -
    -                        // If fetchParams’s process response end-of-body is not null,
    -                        // then queue a fetch task to run fetchParams’s process response
    -                        // end-of-body given response with fetchParams’s task destination.
    -                        if (fetchParams.processResponseEndOfBody != null) {
    -                            queueMicrotask(() => fetchParams.processResponseEndOfBody(response))
    -                        }
    -                    }
    -
    -                    // 3. If fetchParams’s process response is non-null, then queue a fetch task
    -                    // to run fetchParams’s process response given response, with fetchParams’s
    -                    // task destination.
    -                    if (fetchParams.processResponse != null) {
    -                        queueMicrotask(() => fetchParams.processResponse(response))
    -                    }
    -
    -                    // 4. If response’s body is null, then run processResponseEndOfBody.
    -                    if (response.body == null) {
    -                        processResponseEndOfBody()
    -                    } else {
    -                        // 5. Otherwise:
    -
    -                        // 1. Let transformStream be a new a TransformStream.
    -
    -                        // 2. Let identityTransformAlgorithm be an algorithm which, given chunk,
    -                        // enqueues chunk in transformStream.
    -                        const identityTransformAlgorithm = (chunk, controller) => {
    -                            controller.enqueue(chunk)
    -                        }
    -
    -                        // 3. Set up transformStream with transformAlgorithm set to identityTransformAlgorithm
    -                        // and flushAlgorithm set to processResponseEndOfBody.
    -                        const transformStream = new TransformStream({
    -                            start() { },
    -                            transform: identityTransformAlgorithm,
    -                            flush: processResponseEndOfBody
    -                        }, {
    -                            size() {
    -                                return 1
    -                            }
    -                        }, {
    -                            size() {
    -                                return 1
    -                            }
    -                        })
    -
    -                        // 4. Set response’s body to the result of piping response’s body through transformStream.
    -                        response.body = { stream: response.body.stream.pipeThrough(transformStream) }
    -                    }
    -
    -                    // 6. If fetchParams’s process response consume body is non-null, then:
    -                    if (fetchParams.processResponseConsumeBody != null) {
    -                        // 1. Let processBody given nullOrBytes be this step: run fetchParams’s
    -                        // process response consume body given response and nullOrBytes.
    -                        const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes)
    -
    -                        // 2. Let processBodyError be this step: run fetchParams’s process
    -                        // response consume body given response and failure.
    -                        const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure)
    -
    -                        // 3. If response’s body is null, then queue a fetch task to run processBody
    -                        // given null, with fetchParams’s task destination.
    -                        if (response.body == null) {
    -                            queueMicrotask(() => processBody(null))
    -                        } else {
    -                            // 4. Otherwise, fully read response’s body given processBody, processBodyError,
    -                            // and fetchParams’s task destination.
    -                            return fullyReadBody(response.body, processBody, processBodyError)
    -                        }
    -                        return Promise.resolve()
    -                    }
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#http-fetch
    -                async function httpFetch(fetchParams) {
    -                    // 1. Let request be fetchParams’s request.
    -                    const request = fetchParams.request
    -
    -                    // 2. Let response be null.
    -                    let response = null
    -
    -                    // 3. Let actualResponse be null.
    -                    let actualResponse = null
    -
    -                    // 4. Let timingInfo be fetchParams’s timing info.
    -                    const timingInfo = fetchParams.timingInfo
    -
    -                    // 5. If request’s service-workers mode is "all", then:
    -                    if (request.serviceWorkers === 'all') {
    -                        // TODO
    -                    }
    -
    -                    // 6. If response is null, then:
    -                    if (response === null) {
    -                        // 1. If makeCORSPreflight is true and one of these conditions is true:
    -                        // TODO
    -
    -                        // 2. If request’s redirect mode is "follow", then set request’s
    -                        // service-workers mode to "none".
    -                        if (request.redirect === 'follow') {
    -                            request.serviceWorkers = 'none'
    -                        }
    -
    -                        // 3. Set response and actualResponse to the result of running
    -                        // HTTP-network-or-cache fetch given fetchParams.
    -                        actualResponse = response = await httpNetworkOrCacheFetch(fetchParams)
    -
    -                        // 4. If request’s response tainting is "cors" and a CORS check
    -                        // for request and response returns failure, then return a network error.
    -                        if (
    -                            request.responseTainting === 'cors' &&
    -                            corsCheck(request, response) === 'failure'
    -                        ) {
    -                            return makeNetworkError('cors failure')
    -                        }
    -
    -                        // 5. If the TAO check for request and response returns failure, then set
    -                        // request’s timing allow failed flag.
    -                        if (TAOCheck(request, response) === 'failure') {
    -                            request.timingAllowFailed = true
    -                        }
    -                    }
    -
    -                    // 7. If either request’s response tainting or response’s type
    -                    // is "opaque", and the cross-origin resource policy check with
    -                    // request’s origin, request’s client, request’s destination,
    -                    // and actualResponse returns blocked, then return a network error.
    -                    if (
    -                        (request.responseTainting === 'opaque' || response.type === 'opaque') &&
    -                        crossOriginResourcePolicyCheck(
    -                            request.origin,
    -                            request.client,
    -                            request.destination,
    -                            actualResponse
    -                        ) === 'blocked'
    -                    ) {
    -                        return makeNetworkError('blocked')
    -                    }
    -
    -                    // 8. If actualResponse’s status is a redirect status, then:
    -                    if (redirectStatusSet.has(actualResponse.status)) {
    -                        // 1. If actualResponse’s status is not 303, request’s body is not null,
    -                        // and the connection uses HTTP/2, then user agents may, and are even
    -                        // encouraged to, transmit an RST_STREAM frame.
    -                        // See, https://github.com/whatwg/fetch/issues/1288
    -                        if (request.redirect !== 'manual') {
    -                            fetchParams.controller.connection.destroy()
    -                        }
    -
    -                        // 2. Switch on request’s redirect mode:
    -                        if (request.redirect === 'error') {
    -                            // Set response to a network error.
    -                            response = makeNetworkError('unexpected redirect')
    -                        } else if (request.redirect === 'manual') {
    -                            // Set response to an opaque-redirect filtered response whose internal
    -                            // response is actualResponse.
    -                            // NOTE(spec): On the web this would return an `opaqueredirect` response,
    -                            // but that doesn't make sense server side.
    -                            // See https://github.com/nodejs/undici/issues/1193.
    -                            response = actualResponse
    -                        } else if (request.redirect === 'follow') {
    -                            // Set response to the result of running HTTP-redirect fetch given
    -                            // fetchParams and response.
    -                            response = await httpRedirectFetch(fetchParams, response)
    -                        } else {
    -                            assert(false)
    -                        }
    -                    }
    -
    -                    // 9. Set response’s timing info to timingInfo.
    -                    response.timingInfo = timingInfo
    -
    -                    // 10. Return response.
    -                    return response
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#http-redirect-fetch
    -                function httpRedirectFetch(fetchParams, response) {
    -                    // 1. Let request be fetchParams’s request.
    -                    const request = fetchParams.request
    -
    -                    // 2. Let actualResponse be response, if response is not a filtered response,
    -                    // and response’s internal response otherwise.
    -                    const actualResponse = response.internalResponse
    -                        ? response.internalResponse
    -                        : response
    -
    -                    // 3. Let locationURL be actualResponse’s location URL given request’s current
    -                    // URL’s fragment.
    -                    let locationURL
    -
    -                    try {
    -                        locationURL = responseLocationURL(
    -                            actualResponse,
    -                            requestCurrentURL(request).hash
    -                        )
    -
    -                        // 4. If locationURL is null, then return response.
    -                        if (locationURL == null) {
    -                            return response
    -                        }
    -                    } catch (err) {
    -                        // 5. If locationURL is failure, then return a network error.
    -                        return Promise.resolve(makeNetworkError(err))
    -                    }
    -
    -                    // 6. If locationURL’s scheme is not an HTTP(S) scheme, then return a network
    -                    // error.
    -                    if (!urlIsHttpHttpsScheme(locationURL)) {
    -                        return Promise.resolve(makeNetworkError('URL scheme must be a HTTP(S) scheme'))
    -                    }
    -
    -                    // 7. If request’s redirect count is 20, then return a network error.
    -                    if (request.redirectCount === 20) {
    -                        return Promise.resolve(makeNetworkError('redirect count exceeded'))
    -                    }
    -
    -                    // 8. Increase request’s redirect count by 1.
    -                    request.redirectCount += 1
    -
    -                    // 9. If request’s mode is "cors", locationURL includes credentials, and
    -                    // request’s origin is not same origin with locationURL’s origin, then return
    -                    //  a network error.
    -                    if (
    -                        request.mode === 'cors' &&
    -                        (locationURL.username || locationURL.password) &&
    -                        !sameOrigin(request, locationURL)
    -                    ) {
    -                        return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"'))
    -                    }
    -
    -                    // 10. If request’s response tainting is "cors" and locationURL includes
    -                    // credentials, then return a network error.
    -                    if (
    -                        request.responseTainting === 'cors' &&
    -                        (locationURL.username || locationURL.password)
    -                    ) {
    -                        return Promise.resolve(makeNetworkError(
    -                            'URL cannot contain credentials for request mode "cors"'
    -                        ))
    -                    }
    -
    -                    // 11. If actualResponse’s status is not 303, request’s body is non-null,
    -                    // and request’s body’s source is null, then return a network error.
    -                    if (
    -                        actualResponse.status !== 303 &&
    -                        request.body != null &&
    -                        request.body.source == null
    -                    ) {
    -                        return Promise.resolve(makeNetworkError())
    -                    }
    -
    -                    // 12. If one of the following is true
    -                    // - actualResponse’s status is 301 or 302 and request’s method is `POST`
    -                    // - actualResponse’s status is 303 and request’s method is not `GET` or `HEAD`
    -                    if (
    -                        ([301, 302].includes(actualResponse.status) && request.method === 'POST') ||
    -                        (actualResponse.status === 303 &&
    -                            !GET_OR_HEAD.includes(request.method))
    -                    ) {
    -                        // then:
    -                        // 1. Set request’s method to `GET` and request’s body to null.
    -                        request.method = 'GET'
    -                        request.body = null
    -
    -                        // 2. For each headerName of request-body-header name, delete headerName from
    -                        // request’s header list.
    -                        for (const headerName of requestBodyHeader) {
    -                            request.headersList.delete(headerName)
    -                        }
    -                    }
    -
    -                    // 13. If request’s current URL’s origin is not same origin with locationURL’s
    -                    //     origin, then for each headerName of CORS non-wildcard request-header name,
    -                    //     delete headerName from request’s header list.
    -                    if (!sameOrigin(requestCurrentURL(request), locationURL)) {
    -                        // https://fetch.spec.whatwg.org/#cors-non-wildcard-request-header-name
    -                        request.headersList.delete('authorization')
    -
    -                        // https://fetch.spec.whatwg.org/#authentication-entries
    -                        request.headersList.delete('proxy-authorization', true)
    -
    -                        // "Cookie" and "Host" are forbidden request-headers, which undici doesn't implement.
    -                        request.headersList.delete('cookie')
    -                        request.headersList.delete('host')
    -                    }
    -
    -                    // 14. If request’s body is non-null, then set request’s body to the first return
    -                    // value of safely extracting request’s body’s source.
    -                    if (request.body != null) {
    -                        assert(request.body.source != null)
    -                        request.body = safelyExtractBody(request.body.source)[0]
    -                    }
    -
    -                    // 15. Let timingInfo be fetchParams’s timing info.
    -                    const timingInfo = fetchParams.timingInfo
    -
    -                    // 16. Set timingInfo’s redirect end time and post-redirect start time to the
    -                    // coarsened shared current time given fetchParams’s cross-origin isolated
    -                    // capability.
    -                    timingInfo.redirectEndTime = timingInfo.postRedirectStartTime =
    -                        coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability)
    -
    -                    // 17. If timingInfo’s redirect start time is 0, then set timingInfo’s
    -                    //  redirect start time to timingInfo’s start time.
    -                    if (timingInfo.redirectStartTime === 0) {
    -                        timingInfo.redirectStartTime = timingInfo.startTime
    -                    }
    -
    -                    // 18. Append locationURL to request’s URL list.
    -                    request.urlList.push(locationURL)
    -
    -                    // 19. Invoke set request’s referrer policy on redirect on request and
    -                    // actualResponse.
    -                    setRequestReferrerPolicyOnRedirect(request, actualResponse)
    -
    -                    // 20. Return the result of running main fetch given fetchParams and true.
    -                    return mainFetch(fetchParams, true)
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#http-network-or-cache-fetch
    -                async function httpNetworkOrCacheFetch(
    -                    fetchParams,
    -                    isAuthenticationFetch = false,
    -                    isNewConnectionFetch = false
    -                ) {
    -                    // 1. Let request be fetchParams’s request.
    -                    const request = fetchParams.request
    -
    -                    // 2. Let httpFetchParams be null.
    -                    let httpFetchParams = null
    -
    -                    // 3. Let httpRequest be null.
    -                    let httpRequest = null
    -
    -                    // 4. Let response be null.
    -                    let response = null
    -
    -                    // 5. Let storedResponse be null.
    -                    // TODO: cache
    -
    -                    // 6. Let httpCache be null.
    -                    const httpCache = null
    -
    -                    // 7. Let the revalidatingFlag be unset.
    -                    const revalidatingFlag = false
    -
    -                    // 8. Run these steps, but abort when the ongoing fetch is terminated:
    -
    -                    //    1. If request’s window is "no-window" and request’s redirect mode is
    -                    //    "error", then set httpFetchParams to fetchParams and httpRequest to
    -                    //    request.
    -                    if (request.window === 'no-window' && request.redirect === 'error') {
    -                        httpFetchParams = fetchParams
    -                        httpRequest = request
    -                    } else {
    -                        // Otherwise:
    -
    -                        // 1. Set httpRequest to a clone of request.
    -                        httpRequest = makeRequest(request)
    -
    -                        // 2. Set httpFetchParams to a copy of fetchParams.
    -                        httpFetchParams = { ...fetchParams }
    -
    -                        // 3. Set httpFetchParams’s request to httpRequest.
    -                        httpFetchParams.request = httpRequest
    -                    }
    -
    -                    //    3. Let includeCredentials be true if one of
    -                    const includeCredentials =
    -                        request.credentials === 'include' ||
    -                        (request.credentials === 'same-origin' &&
    -                            request.responseTainting === 'basic')
    -
    -                    //    4. Let contentLength be httpRequest’s body’s length, if httpRequest’s
    -                    //    body is non-null; otherwise null.
    -                    const contentLength = httpRequest.body ? httpRequest.body.length : null
    -
    -                    //    5. Let contentLengthHeaderValue be null.
    -                    let contentLengthHeaderValue = null
    -
    -                    //    6. If httpRequest’s body is null and httpRequest’s method is `POST` or
    -                    //    `PUT`, then set contentLengthHeaderValue to `0`.
    -                    if (
    -                        httpRequest.body == null &&
    -                        ['POST', 'PUT'].includes(httpRequest.method)
    -                    ) {
    -                        contentLengthHeaderValue = '0'
    -                    }
    -
    -                    //    7. If contentLength is non-null, then set contentLengthHeaderValue to
    -                    //    contentLength, serialized and isomorphic encoded.
    -                    if (contentLength != null) {
    -                        contentLengthHeaderValue = isomorphicEncode(`${contentLength}`)
    -                    }
    -
    -                    //    8. If contentLengthHeaderValue is non-null, then append
    -                    //    `Content-Length`/contentLengthHeaderValue to httpRequest’s header
    -                    //    list.
    -                    if (contentLengthHeaderValue != null) {
    -                        httpRequest.headersList.append('content-length', contentLengthHeaderValue)
    -                    }
    -
    -                    //    9. If contentLengthHeaderValue is non-null, then append (`Content-Length`,
    -                    //    contentLengthHeaderValue) to httpRequest’s header list.
    -
    -                    //    10. If contentLength is non-null and httpRequest’s keepalive is true,
    -                    //    then:
    -                    if (contentLength != null && httpRequest.keepalive) {
    -                        // NOTE: keepalive is a noop outside of browser context.
    -                    }
    -
    -                    //    11. If httpRequest’s referrer is a URL, then append
    -                    //    `Referer`/httpRequest’s referrer, serialized and isomorphic encoded,
    -                    //     to httpRequest’s header list.
    -                    if (httpRequest.referrer instanceof URL) {
    -                        httpRequest.headersList.append('referer', isomorphicEncode(httpRequest.referrer.href))
    -                    }
    -
    -                    //    12. Append a request `Origin` header for httpRequest.
    -                    appendRequestOriginHeader(httpRequest)
    -
    -                    //    13. Append the Fetch metadata headers for httpRequest. [FETCH-METADATA]
    -                    appendFetchMetadata(httpRequest)
    -
    -                    //    14. If httpRequest’s header list does not contain `User-Agent`, then
    -                    //    user agents should append `User-Agent`/default `User-Agent` value to
    -                    //    httpRequest’s header list.
    -                    if (!httpRequest.headersList.contains('user-agent')) {
    -                        httpRequest.headersList.append('user-agent', typeof esbuildDetection === 'undefined' ? 'undici' : 'node')
    -                    }
    -
    -                    //    15. If httpRequest’s cache mode is "default" and httpRequest’s header
    -                    //    list contains `If-Modified-Since`, `If-None-Match`,
    -                    //    `If-Unmodified-Since`, `If-Match`, or `If-Range`, then set
    -                    //    httpRequest’s cache mode to "no-store".
    -                    if (
    -                        httpRequest.cache === 'default' &&
    -                        (httpRequest.headersList.contains('if-modified-since') ||
    -                            httpRequest.headersList.contains('if-none-match') ||
    -                            httpRequest.headersList.contains('if-unmodified-since') ||
    -                            httpRequest.headersList.contains('if-match') ||
    -                            httpRequest.headersList.contains('if-range'))
    -                    ) {
    -                        httpRequest.cache = 'no-store'
    -                    }
    -
    -                    //    16. If httpRequest’s cache mode is "no-cache", httpRequest’s prevent
    -                    //    no-cache cache-control header modification flag is unset, and
    -                    //    httpRequest’s header list does not contain `Cache-Control`, then append
    -                    //    `Cache-Control`/`max-age=0` to httpRequest’s header list.
    -                    if (
    -                        httpRequest.cache === 'no-cache' &&
    -                        !httpRequest.preventNoCacheCacheControlHeaderModification &&
    -                        !httpRequest.headersList.contains('cache-control')
    -                    ) {
    -                        httpRequest.headersList.append('cache-control', 'max-age=0')
    -                    }
    -
    -                    //    17. If httpRequest’s cache mode is "no-store" or "reload", then:
    -                    if (httpRequest.cache === 'no-store' || httpRequest.cache === 'reload') {
    -                        // 1. If httpRequest’s header list does not contain `Pragma`, then append
    -                        // `Pragma`/`no-cache` to httpRequest’s header list.
    -                        if (!httpRequest.headersList.contains('pragma')) {
    -                            httpRequest.headersList.append('pragma', 'no-cache')
    -                        }
    -
    -                        // 2. If httpRequest’s header list does not contain `Cache-Control`,
    -                        // then append `Cache-Control`/`no-cache` to httpRequest’s header list.
    -                        if (!httpRequest.headersList.contains('cache-control')) {
    -                            httpRequest.headersList.append('cache-control', 'no-cache')
    -                        }
    -                    }
    -
    -                    //    18. If httpRequest’s header list contains `Range`, then append
    -                    //    `Accept-Encoding`/`identity` to httpRequest’s header list.
    -                    if (httpRequest.headersList.contains('range')) {
    -                        httpRequest.headersList.append('accept-encoding', 'identity')
    -                    }
    -
    -                    //    19. Modify httpRequest’s header list per HTTP. Do not append a given
    -                    //    header if httpRequest’s header list contains that header’s name.
    -                    //    TODO: https://github.com/whatwg/fetch/issues/1285#issuecomment-896560129
    -                    if (!httpRequest.headersList.contains('accept-encoding')) {
    -                        if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) {
    -                            httpRequest.headersList.append('accept-encoding', 'br, gzip, deflate')
    -                        } else {
    -                            httpRequest.headersList.append('accept-encoding', 'gzip, deflate')
    -                        }
    -                    }
    -
    -                    httpRequest.headersList.delete('host')
    -
    -                    //    20. If includeCredentials is true, then:
    -                    if (includeCredentials) {
    -                        // 1. If the user agent is not configured to block cookies for httpRequest
    -                        // (see section 7 of [COOKIES]), then:
    -                        // TODO: credentials
    -                        // 2. If httpRequest’s header list does not contain `Authorization`, then:
    -                        // TODO: credentials
    -                    }
    -
    -                    //    21. If there’s a proxy-authentication entry, use it as appropriate.
    -                    //    TODO: proxy-authentication
    -
    -                    //    22. Set httpCache to the result of determining the HTTP cache
    -                    //    partition, given httpRequest.
    -                    //    TODO: cache
    -
    -                    //    23. If httpCache is null, then set httpRequest’s cache mode to
    -                    //    "no-store".
    -                    if (httpCache == null) {
    -                        httpRequest.cache = 'no-store'
    -                    }
    -
    -                    //    24. If httpRequest’s cache mode is neither "no-store" nor "reload",
    -                    //    then:
    -                    if (httpRequest.mode !== 'no-store' && httpRequest.mode !== 'reload') {
    -                        // TODO: cache
    -                    }
    -
    -                    // 9. If aborted, then return the appropriate network error for fetchParams.
    -                    // TODO
    -
    -                    // 10. If response is null, then:
    -                    if (response == null) {
    -                        // 1. If httpRequest’s cache mode is "only-if-cached", then return a
    -                        // network error.
    -                        if (httpRequest.mode === 'only-if-cached') {
    -                            return makeNetworkError('only if cached')
    -                        }
    -
    -                        // 2. Let forwardResponse be the result of running HTTP-network fetch
    -                        // given httpFetchParams, includeCredentials, and isNewConnectionFetch.
    -                        const forwardResponse = await httpNetworkFetch(
    -                            httpFetchParams,
    -                            includeCredentials,
    -                            isNewConnectionFetch
    -                        )
    -
    -                        // 3. If httpRequest’s method is unsafe and forwardResponse’s status is
    -                        // in the range 200 to 399, inclusive, invalidate appropriate stored
    -                        // responses in httpCache, as per the "Invalidation" chapter of HTTP
    -                        // Caching, and set storedResponse to null. [HTTP-CACHING]
    -                        if (
    -                            !safeMethodsSet.has(httpRequest.method) &&
    -                            forwardResponse.status >= 200 &&
    -                            forwardResponse.status <= 399
    -                        ) {
    -                            // TODO: cache
    -                        }
    -
    -                        // 4. If the revalidatingFlag is set and forwardResponse’s status is 304,
    -                        // then:
    -                        if (revalidatingFlag && forwardResponse.status === 304) {
    -                            // TODO: cache
    -                        }
    -
    -                        // 5. If response is null, then:
    -                        if (response == null) {
    -                            // 1. Set response to forwardResponse.
    -                            response = forwardResponse
    -
    -                            // 2. Store httpRequest and forwardResponse in httpCache, as per the
    -                            // "Storing Responses in Caches" chapter of HTTP Caching. [HTTP-CACHING]
    -                            // TODO: cache
    -                        }
    -                    }
    -
    -                    // 11. Set response’s URL list to a clone of httpRequest’s URL list.
    -                    response.urlList = [...httpRequest.urlList]
    -
    -                    // 12. If httpRequest’s header list contains `Range`, then set response’s
    -                    // range-requested flag.
    -                    if (httpRequest.headersList.contains('range')) {
    -                        response.rangeRequested = true
    -                    }
    -
    -                    // 13. Set response’s request-includes-credentials to includeCredentials.
    -                    response.requestIncludesCredentials = includeCredentials
    -
    -                    // 14. If response’s status is 401, httpRequest’s response tainting is not
    -                    // "cors", includeCredentials is true, and request’s window is an environment
    -                    // settings object, then:
    -                    // TODO
    -
    -                    // 15. If response’s status is 407, then:
    -                    if (response.status === 407) {
    -                        // 1. If request’s window is "no-window", then return a network error.
    -                        if (request.window === 'no-window') {
    -                            return makeNetworkError()
    -                        }
    -
    -                        // 2. ???
    -
    -                        // 3. If fetchParams is canceled, then return the appropriate network error for fetchParams.
    -                        if (isCancelled(fetchParams)) {
    -                            return makeAppropriateNetworkError(fetchParams)
    -                        }
    -
    -                        // 4. Prompt the end user as appropriate in request’s window and store
    -                        // the result as a proxy-authentication entry. [HTTP-AUTH]
    -                        // TODO: Invoke some kind of callback?
    -
    -                        // 5. Set response to the result of running HTTP-network-or-cache fetch given
    -                        // fetchParams.
    -                        // TODO
    -                        return makeNetworkError('proxy authentication required')
    -                    }
    -
    -                    // 16. If all of the following are true
    -                    if (
    -                        // response’s status is 421
    -                        response.status === 421 &&
    -                        // isNewConnectionFetch is false
    -                        !isNewConnectionFetch &&
    -                        // request’s body is null, or request’s body is non-null and request’s body’s source is non-null
    -                        (request.body == null || request.body.source != null)
    -                    ) {
    -                        // then:
    -
    -                        // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.
    -                        if (isCancelled(fetchParams)) {
    -                            return makeAppropriateNetworkError(fetchParams)
    -                        }
    -
    -                        // 2. Set response to the result of running HTTP-network-or-cache
    -                        // fetch given fetchParams, isAuthenticationFetch, and true.
    -
    -                        // TODO (spec): The spec doesn't specify this but we need to cancel
    -                        // the active response before we can start a new one.
    -                        // https://github.com/whatwg/fetch/issues/1293
    -                        fetchParams.controller.connection.destroy()
    -
    -                        response = await httpNetworkOrCacheFetch(
    -                            fetchParams,
    -                            isAuthenticationFetch,
    -                            true
    -                        )
    -                    }
    -
    -                    // 17. If isAuthenticationFetch is true, then create an authentication entry
    -                    if (isAuthenticationFetch) {
    -                        // TODO
    -                    }
    -
    -                    // 18. Return response.
    -                    return response
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#http-network-fetch
    -                async function httpNetworkFetch(
    -                    fetchParams,
    -                    includeCredentials = false,
    -                    forceNewConnection = false
    -                ) {
    -                    assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed)
    -
    -                    fetchParams.controller.connection = {
    -                        abort: null,
    -                        destroyed: false,
    -                        destroy(err) {
    -                            if (!this.destroyed) {
    -                                this.destroyed = true
    -                                this.abort?.(err ?? new DOMException('The operation was aborted.', 'AbortError'))
    -                            }
    -                        }
    -                    }
    -
    -                    // 1. Let request be fetchParams’s request.
    -                    const request = fetchParams.request
    -
    -                    // 2. Let response be null.
    -                    let response = null
    -
    -                    // 3. Let timingInfo be fetchParams’s timing info.
    -                    const timingInfo = fetchParams.timingInfo
    -
    -                    // 4. Let httpCache be the result of determining the HTTP cache partition,
    -                    // given request.
    -                    // TODO: cache
    -                    const httpCache = null
    -
    -                    // 5. If httpCache is null, then set request’s cache mode to "no-store".
    -                    if (httpCache == null) {
    -                        request.cache = 'no-store'
    -                    }
    -
    -                    // 6. Let networkPartitionKey be the result of determining the network
    -                    // partition key given request.
    -                    // TODO
    -
    -                    // 7. Let newConnection be "yes" if forceNewConnection is true; otherwise
    -                    // "no".
    -                    const newConnection = forceNewConnection ? 'yes' : 'no' // eslint-disable-line no-unused-vars
    -
    -                    // 8. Switch on request’s mode:
    -                    if (request.mode === 'websocket') {
    -                        // Let connection be the result of obtaining a WebSocket connection,
    -                        // given request’s current URL.
    -                        // TODO
    -                    } else {
    -                        // Let connection be the result of obtaining a connection, given
    -                        // networkPartitionKey, request’s current URL’s origin,
    -                        // includeCredentials, and forceNewConnection.
    -                        // TODO
    -                    }
    -
    -                    // 9. Run these steps, but abort when the ongoing fetch is terminated:
    -
    -                    //    1. If connection is failure, then return a network error.
    -
    -                    //    2. Set timingInfo’s final connection timing info to the result of
    -                    //    calling clamp and coarsen connection timing info with connection’s
    -                    //    timing info, timingInfo’s post-redirect start time, and fetchParams’s
    -                    //    cross-origin isolated capability.
    -
    -                    //    3. If connection is not an HTTP/2 connection, request’s body is non-null,
    -                    //    and request’s body’s source is null, then append (`Transfer-Encoding`,
    -                    //    `chunked`) to request’s header list.
    -
    -                    //    4. Set timingInfo’s final network-request start time to the coarsened
    -                    //    shared current time given fetchParams’s cross-origin isolated
    -                    //    capability.
    -
    -                    //    5. Set response to the result of making an HTTP request over connection
    -                    //    using request with the following caveats:
    -
    -                    //        - Follow the relevant requirements from HTTP. [HTTP] [HTTP-SEMANTICS]
    -                    //        [HTTP-COND] [HTTP-CACHING] [HTTP-AUTH]
    -
    -                    //        - If request’s body is non-null, and request’s body’s source is null,
    -                    //        then the user agent may have a buffer of up to 64 kibibytes and store
    -                    //        a part of request’s body in that buffer. If the user agent reads from
    -                    //        request’s body beyond that buffer’s size and the user agent needs to
    -                    //        resend request, then instead return a network error.
    -
    -                    //        - Set timingInfo’s final network-response start time to the coarsened
    -                    //        shared current time given fetchParams’s cross-origin isolated capability,
    -                    //        immediately after the user agent’s HTTP parser receives the first byte
    -                    //        of the response (e.g., frame header bytes for HTTP/2 or response status
    -                    //        line for HTTP/1.x).
    -
    -                    //        - Wait until all the headers are transmitted.
    -
    -                    //        - Any responses whose status is in the range 100 to 199, inclusive,
    -                    //        and is not 101, are to be ignored, except for the purposes of setting
    -                    //        timingInfo’s final network-response start time above.
    -
    -                    //    - If request’s header list contains `Transfer-Encoding`/`chunked` and
    -                    //    response is transferred via HTTP/1.0 or older, then return a network
    -                    //    error.
    -
    -                    //    - If the HTTP request results in a TLS client certificate dialog, then:
    -
    -                    //        1. If request’s window is an environment settings object, make the
    -                    //        dialog available in request’s window.
    -
    -                    //        2. Otherwise, return a network error.
    -
    -                    // To transmit request’s body body, run these steps:
    -                    let requestBody = null
    -                    // 1. If body is null and fetchParams’s process request end-of-body is
    -                    // non-null, then queue a fetch task given fetchParams’s process request
    -                    // end-of-body and fetchParams’s task destination.
    -                    if (request.body == null && fetchParams.processRequestEndOfBody) {
    -                        queueMicrotask(() => fetchParams.processRequestEndOfBody())
    -                    } else if (request.body != null) {
    -                        // 2. Otherwise, if body is non-null:
    -
    -                        //    1. Let processBodyChunk given bytes be these steps:
    -                        const processBodyChunk = async function* (bytes) {
    -                            // 1. If the ongoing fetch is terminated, then abort these steps.
    -                            if (isCancelled(fetchParams)) {
    -                                return
    -                            }
    -
    -                            // 2. Run this step in parallel: transmit bytes.
    -                            yield bytes
    -
    -                            // 3. If fetchParams’s process request body is non-null, then run
    -                            // fetchParams’s process request body given bytes’s length.
    -                            fetchParams.processRequestBodyChunkLength?.(bytes.byteLength)
    -                        }
    -
    -                        // 2. Let processEndOfBody be these steps:
    -                        const processEndOfBody = () => {
    -                            // 1. If fetchParams is canceled, then abort these steps.
    -                            if (isCancelled(fetchParams)) {
    -                                return
    -                            }
    -
    -                            // 2. If fetchParams’s process request end-of-body is non-null,
    -                            // then run fetchParams’s process request end-of-body.
    -                            if (fetchParams.processRequestEndOfBody) {
    -                                fetchParams.processRequestEndOfBody()
    -                            }
    -                        }
    -
    -                        // 3. Let processBodyError given e be these steps:
    -                        const processBodyError = (e) => {
    -                            // 1. If fetchParams is canceled, then abort these steps.
    -                            if (isCancelled(fetchParams)) {
    -                                return
    -                            }
    -
    -                            // 2. If e is an "AbortError" DOMException, then abort fetchParams’s controller.
    -                            if (e.name === 'AbortError') {
    -                                fetchParams.controller.abort()
    -                            } else {
    -                                fetchParams.controller.terminate(e)
    -                            }
    -                        }
    -
    -                        // 4. Incrementally read request’s body given processBodyChunk, processEndOfBody,
    -                        // processBodyError, and fetchParams’s task destination.
    -                        requestBody = (async function* () {
    -                            try {
    -                                for await (const bytes of request.body.stream) {
    -                                    yield* processBodyChunk(bytes)
    -                                }
    -                                processEndOfBody()
    -                            } catch (err) {
    -                                processBodyError(err)
    -                            }
    -                        })()
    -                    }
    -
    -                    try {
    -                        // socket is only provided for websockets
    -                        const { body, status, statusText, headersList, socket } = await dispatch({ body: requestBody })
    -
    -                        if (socket) {
    -                            response = makeResponse({ status, statusText, headersList, socket })
    -                        } else {
    -                            const iterator = body[Symbol.asyncIterator]()
    -                            fetchParams.controller.next = () => iterator.next()
    -
    -                            response = makeResponse({ status, statusText, headersList })
    -                        }
    -                    } catch (err) {
    -                        // 10. If aborted, then:
    -                        if (err.name === 'AbortError') {
    -                            // 1. If connection uses HTTP/2, then transmit an RST_STREAM frame.
    -                            fetchParams.controller.connection.destroy()
    -
    -                            // 2. Return the appropriate network error for fetchParams.
    -                            return makeAppropriateNetworkError(fetchParams, err)
    -                        }
    -
    -                        return makeNetworkError(err)
    -                    }
    -
    -                    // 11. Let pullAlgorithm be an action that resumes the ongoing fetch
    -                    // if it is suspended.
    -                    const pullAlgorithm = () => {
    -                        fetchParams.controller.resume()
    -                    }
    -
    -                    // 12. Let cancelAlgorithm be an algorithm that aborts fetchParams’s
    -                    // controller with reason, given reason.
    -                    const cancelAlgorithm = (reason) => {
    -                        fetchParams.controller.abort(reason)
    -                    }
    -
    -                    // 13. Let highWaterMark be a non-negative, non-NaN number, chosen by
    -                    // the user agent.
    -                    // TODO
    -
    -                    // 14. Let sizeAlgorithm be an algorithm that accepts a chunk object
    -                    // and returns a non-negative, non-NaN, non-infinite number, chosen by the user agent.
    -                    // TODO
    -
    -                    // 15. Let stream be a new ReadableStream.
    -                    // 16. Set up stream with pullAlgorithm set to pullAlgorithm,
    -                    // cancelAlgorithm set to cancelAlgorithm, highWaterMark set to
    -                    // highWaterMark, and sizeAlgorithm set to sizeAlgorithm.
    -                    if (!ReadableStream) {
    -                        ReadableStream = (__nccwpck_require__(5356).ReadableStream)
    -                    }
    -
    -                    const stream = new ReadableStream(
    -                        {
    -                            async start(controller) {
    -                                fetchParams.controller.controller = controller
    -                            },
    -                            async pull(controller) {
    -                                await pullAlgorithm(controller)
    -                            },
    -                            async cancel(reason) {
    -                                await cancelAlgorithm(reason)
    -                            }
    -                        },
    -                        {
    -                            highWaterMark: 0,
    -                            size() {
    -                                return 1
    -                            }
    -                        }
    -                    )
    -
    -                    // 17. Run these steps, but abort when the ongoing fetch is terminated:
    -
    -                    //    1. Set response’s body to a new body whose stream is stream.
    -                    response.body = { stream }
    -
    -                    //    2. If response is not a network error and request’s cache mode is
    -                    //    not "no-store", then update response in httpCache for request.
    -                    //    TODO
    -
    -                    //    3. If includeCredentials is true and the user agent is not configured
    -                    //    to block cookies for request (see section 7 of [COOKIES]), then run the
    -                    //    "set-cookie-string" parsing algorithm (see section 5.2 of [COOKIES]) on
    -                    //    the value of each header whose name is a byte-case-insensitive match for
    -                    //    `Set-Cookie` in response’s header list, if any, and request’s current URL.
    -                    //    TODO
    -
    -                    // 18. If aborted, then:
    -                    // TODO
    -
    -                    // 19. Run these steps in parallel:
    -
    -                    //    1. Run these steps, but abort when fetchParams is canceled:
    -                    fetchParams.controller.on('terminated', onAborted)
    -                    fetchParams.controller.resume = async () => {
    -                        // 1. While true
    -                        while (true) {
    -                            // 1-3. See onData...
    -
    -                            // 4. Set bytes to the result of handling content codings given
    -                            // codings and bytes.
    -                            let bytes
    -                            let isFailure
    -                            try {
    -                                const { done, value } = await fetchParams.controller.next()
    -
    -                                if (isAborted(fetchParams)) {
    -                                    break
    -                                }
    -
    -                                bytes = done ? undefined : value
    -                            } catch (err) {
    -                                if (fetchParams.controller.ended && !timingInfo.encodedBodySize) {
    -                                    // zlib doesn't like empty streams.
    -                                    bytes = undefined
    -                                } else {
    -                                    bytes = err
    -
    -                                    // err may be propagated from the result of calling readablestream.cancel,
    -                                    // which might not be an error. https://github.com/nodejs/undici/issues/2009
    -                                    isFailure = true
    -                                }
    -                            }
    -
    -                            if (bytes === undefined) {
    -                                // 2. Otherwise, if the bytes transmission for response’s message
    -                                // body is done normally and stream is readable, then close
    -                                // stream, finalize response for fetchParams and response, and
    -                                // abort these in-parallel steps.
    -                                readableStreamClose(fetchParams.controller.controller)
    -
    -                                finalizeResponse(fetchParams, response)
    -
    -                                return
    -                            }
    -
    -                            // 5. Increase timingInfo’s decoded body size by bytes’s length.
    -                            timingInfo.decodedBodySize += bytes?.byteLength ?? 0
    -
    -                            // 6. If bytes is failure, then terminate fetchParams’s controller.
    -                            if (isFailure) {
    -                                fetchParams.controller.terminate(bytes)
    -                                return
    -                            }
    -
    -                            // 7. Enqueue a Uint8Array wrapping an ArrayBuffer containing bytes
    -                            // into stream.
    -                            fetchParams.controller.controller.enqueue(new Uint8Array(bytes))
    -
    -                            // 8. If stream is errored, then terminate the ongoing fetch.
    -                            if (isErrored(stream)) {
    -                                fetchParams.controller.terminate()
    -                                return
    -                            }
    -
    -                            // 9. If stream doesn’t need more data ask the user agent to suspend
    -                            // the ongoing fetch.
    -                            if (!fetchParams.controller.controller.desiredSize) {
    -                                return
    -                            }
    -                        }
    -                    }
    -
    -                    //    2. If aborted, then:
    -                    function onAborted(reason) {
    -                        // 2. If fetchParams is aborted, then:
    -                        if (isAborted(fetchParams)) {
    -                            // 1. Set response’s aborted flag.
    -                            response.aborted = true
    -
    -                            // 2. If stream is readable, then error stream with the result of
    -                            //    deserialize a serialized abort reason given fetchParams’s
    -                            //    controller’s serialized abort reason and an
    -                            //    implementation-defined realm.
    -                            if (isReadable(stream)) {
    -                                fetchParams.controller.controller.error(
    -                                    fetchParams.controller.serializedAbortReason
    -                                )
    -                            }
    -                        } else {
    -                            // 3. Otherwise, if stream is readable, error stream with a TypeError.
    -                            if (isReadable(stream)) {
    -                                fetchParams.controller.controller.error(new TypeError('terminated', {
    -                                    cause: isErrorLike(reason) ? reason : undefined
    -                                }))
    -                            }
    -                        }
    -
    -                        // 4. If connection uses HTTP/2, then transmit an RST_STREAM frame.
    -                        // 5. Otherwise, the user agent should close connection unless it would be bad for performance to do so.
    -                        fetchParams.controller.connection.destroy()
    -                    }
    -
    -                    // 20. Return response.
    -                    return response
    -
    -                    async function dispatch({ body }) {
    -                        const url = requestCurrentURL(request)
    -                        /** @type {import('../..').Agent} */
    -                        const agent = fetchParams.controller.dispatcher
    -
    -                        return new Promise((resolve, reject) => agent.dispatch(
    -                            {
    -                                path: url.pathname + url.search,
    -                                origin: url.origin,
    -                                method: request.method,
    -                                body: fetchParams.controller.dispatcher.isMockActive ? request.body && (request.body.source || request.body.stream) : body,
    -                                headers: request.headersList.entries,
    -                                maxRedirections: 0,
    -                                upgrade: request.mode === 'websocket' ? 'websocket' : undefined
    -                            },
    -                            {
    -                                body: null,
    -                                abort: null,
    -
    -                                onConnect(abort) {
    -                                    // TODO (fix): Do we need connection here?
    -                                    const { connection } = fetchParams.controller
    -
    -                                    if (connection.destroyed) {
    -                                        abort(new DOMException('The operation was aborted.', 'AbortError'))
    -                                    } else {
    -                                        fetchParams.controller.on('terminated', abort)
    -                                        this.abort = connection.abort = abort
    -                                    }
    -                                },
    -
    -                                onHeaders(status, headersList, resume, statusText) {
    -                                    if (status < 200) {
    -                                        return
    -                                    }
    -
    -                                    let codings = []
    -                                    let location = ''
    -
    -                                    const headers = new Headers()
    -
    -                                    // For H2, the headers are a plain JS object
    -                                    // We distinguish between them and iterate accordingly
    -                                    if (Array.isArray(headersList)) {
    -                                        for (let n = 0; n < headersList.length; n += 2) {
    -                                            const key = headersList[n + 0].toString('latin1')
    -                                            const val = headersList[n + 1].toString('latin1')
    -                                            if (key.toLowerCase() === 'content-encoding') {
    -                                                // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
    -                                                // "All content-coding values are case-insensitive..."
    -                                                codings = val.toLowerCase().split(',').map((x) => x.trim())
    -                                            } else if (key.toLowerCase() === 'location') {
    -                                                location = val
    -                                            }
    -
    -                                            headers[kHeadersList].append(key, val)
    -                                        }
    -                                    } else {
    -                                        const keys = Object.keys(headersList)
    -                                        for (const key of keys) {
    -                                            const val = headersList[key]
    -                                            if (key.toLowerCase() === 'content-encoding') {
    -                                                // https://www.rfc-editor.org/rfc/rfc7231#section-3.1.2.1
    -                                                // "All content-coding values are case-insensitive..."
    -                                                codings = val.toLowerCase().split(',').map((x) => x.trim()).reverse()
    -                                            } else if (key.toLowerCase() === 'location') {
    -                                                location = val
    -                                            }
    -
    -                                            headers[kHeadersList].append(key, val)
    -                                        }
    -                                    }
    -
    -                                    this.body = new Readable({ read: resume })
    -
    -                                    const decoders = []
    -
    -                                    const willFollow = request.redirect === 'follow' &&
    -                                        location &&
    -                                        redirectStatusSet.has(status)
    -
    -                                    // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
    -                                    if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {
    -                                        for (const coding of codings) {
    -                                            // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.2
    -                                            if (coding === 'x-gzip' || coding === 'gzip') {
    -                                                decoders.push(zlib.createGunzip({
    -                                                    // Be less strict when decoding compressed responses, since sometimes
    -                                                    // servers send slightly invalid responses that are still accepted
    -                                                    // by common browsers.
    -                                                    // Always using Z_SYNC_FLUSH is what cURL does.
    -                                                    flush: zlib.constants.Z_SYNC_FLUSH,
    -                                                    finishFlush: zlib.constants.Z_SYNC_FLUSH
    -                                                }))
    -                                            } else if (coding === 'deflate') {
    -                                                decoders.push(zlib.createInflate())
    -                                            } else if (coding === 'br') {
    -                                                decoders.push(zlib.createBrotliDecompress())
    -                                            } else {
    -                                                decoders.length = 0
    -                                                break
    -                                            }
    -                                        }
    -                                    }
    -
    -                                    resolve({
    -                                        status,
    -                                        statusText,
    -                                        headersList: headers[kHeadersList],
    -                                        body: decoders.length
    -                                            ? pipeline(this.body, ...decoders, () => { })
    -                                            : this.body.on('error', () => { })
    -                                    })
    -
    -                                    return true
    -                                },
    -
    -                                onData(chunk) {
    -                                    if (fetchParams.controller.dump) {
    -                                        return
    -                                    }
    -
    -                                    // 1. If one or more bytes have been transmitted from response’s
    -                                    // message body, then:
    -
    -                                    //  1. Let bytes be the transmitted bytes.
    -                                    const bytes = chunk
    -
    -                                    //  2. Let codings be the result of extracting header list values
    -                                    //  given `Content-Encoding` and response’s header list.
    -                                    //  See pullAlgorithm.
    -
    -                                    //  3. Increase timingInfo’s encoded body size by bytes’s length.
    -                                    timingInfo.encodedBodySize += bytes.byteLength
    -
    -                                    //  4. See pullAlgorithm...
    -
    -                                    return this.body.push(bytes)
    -                                },
    -
    -                                onComplete() {
    -                                    if (this.abort) {
    -                                        fetchParams.controller.off('terminated', this.abort)
    -                                    }
    -
    -                                    fetchParams.controller.ended = true
    -
    -                                    this.body.push(null)
    -                                },
    -
    -                                onError(error) {
    -                                    if (this.abort) {
    -                                        fetchParams.controller.off('terminated', this.abort)
    -                                    }
    -
    -                                    this.body?.destroy(error)
    -
    -                                    fetchParams.controller.terminate(error)
    -
    -                                    reject(error)
    -                                },
    -
    -                                onUpgrade(status, headersList, socket) {
    -                                    if (status !== 101) {
    -                                        return
    -                                    }
    -
    -                                    const headers = new Headers()
    -
    -                                    for (let n = 0; n < headersList.length; n += 2) {
    -                                        const key = headersList[n + 0].toString('latin1')
    -                                        const val = headersList[n + 1].toString('latin1')
    -
    -                                        headers[kHeadersList].append(key, val)
    -                                    }
    -
    -                                    resolve({
    -                                        status,
    -                                        statusText: STATUS_CODES[status],
    -                                        headersList: headers[kHeadersList],
    -                                        socket
    -                                    })
    -
    -                                    return true
    -                                }
    -                            }
    -                        ))
    -                    }
    -                }
    -
    -                module.exports = {
    -                    fetch,
    -                    Fetch,
    -                    fetching,
    -                    finalizeAndReportTiming
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 8359:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -                /* globals AbortController */
    -
    -
    -
    -                const { extractBody, mixinBody, cloneBody } = __nccwpck_require__(1472)
    -                const { Headers, fill: fillHeaders, HeadersList } = __nccwpck_require__(554)
    -                const { FinalizationRegistry } = __nccwpck_require__(6436)()
    -                const util = __nccwpck_require__(3983)
    -                const {
    -                    isValidHTTPToken,
    -                    sameOrigin,
    -                    normalizeMethod,
    -                    makePolicyContainer,
    -                    normalizeMethodRecord
    -                } = __nccwpck_require__(2538)
    -                const {
    -                    forbiddenMethodsSet,
    -                    corsSafeListedMethodsSet,
    -                    referrerPolicy,
    -                    requestRedirect,
    -                    requestMode,
    -                    requestCredentials,
    -                    requestCache,
    -                    requestDuplex
    -                } = __nccwpck_require__(1037)
    -                const { kEnumerableProperty } = util
    -                const { kHeaders, kSignal, kState, kGuard, kRealm } = __nccwpck_require__(5861)
    -                const { webidl } = __nccwpck_require__(1744)
    -                const { getGlobalOrigin } = __nccwpck_require__(1246)
    -                const { URLSerializer } = __nccwpck_require__(685)
    -                const { kHeadersList, kConstruct } = __nccwpck_require__(2785)
    -                const assert = __nccwpck_require__(9491)
    -                const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = __nccwpck_require__(2361)
    -
    -                let TransformStream = globalThis.TransformStream
    -
    -                const kAbortController = Symbol('abortController')
    -
    -                const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {
    -                    signal.removeEventListener('abort', abort)
    -                })
    -
    -                // https://fetch.spec.whatwg.org/#request-class
    -                class Request {
    -                    // https://fetch.spec.whatwg.org/#dom-request
    -                    constructor(input, init = {}) {
    -                        if (input === kConstruct) {
    -                            return
    -                        }
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'Request constructor' })
    -
    -                        input = webidl.converters.RequestInfo(input)
    -                        init = webidl.converters.RequestInit(init)
    -
    -                        // https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object
    -                        this[kRealm] = {
    -                            settingsObject: {
    -                                baseUrl: getGlobalOrigin(),
    -                                get origin() {
    -                                    return this.baseUrl?.origin
    -                                },
    -                                policyContainer: makePolicyContainer()
    -                            }
    -                        }
    -
    -                        // 1. Let request be null.
    -                        let request = null
    -
    -                        // 2. Let fallbackMode be null.
    -                        let fallbackMode = null
    -
    -                        // 3. Let baseURL be this’s relevant settings object’s API base URL.
    -                        const baseUrl = this[kRealm].settingsObject.baseUrl
    -
    -                        // 4. Let signal be null.
    -                        let signal = null
    -
    -                        // 5. If input is a string, then:
    -                        if (typeof input === 'string') {
    -                            // 1. Let parsedURL be the result of parsing input with baseURL.
    -                            // 2. If parsedURL is failure, then throw a TypeError.
    -                            let parsedURL
    -                            try {
    -                                parsedURL = new URL(input, baseUrl)
    -                            } catch (err) {
    -                                throw new TypeError('Failed to parse URL from ' + input, { cause: err })
    -                            }
    -
    -                            // 3. If parsedURL includes credentials, then throw a TypeError.
    -                            if (parsedURL.username || parsedURL.password) {
    -                                throw new TypeError(
    -                                    'Request cannot be constructed from a URL that includes credentials: ' +
    -                                    input
    -                                )
    -                            }
    -
    -                            // 4. Set request to a new request whose URL is parsedURL.
    -                            request = makeRequest({ urlList: [parsedURL] })
    -
    -                            // 5. Set fallbackMode to "cors".
    -                            fallbackMode = 'cors'
    -                        } else {
    -                            // 6. Otherwise:
    -
    -                            // 7. Assert: input is a Request object.
    -                            assert(input instanceof Request)
    -
    -                            // 8. Set request to input’s request.
    -                            request = input[kState]
    -
    -                            // 9. Set signal to input’s signal.
    -                            signal = input[kSignal]
    -                        }
    -
    -                        // 7. Let origin be this’s relevant settings object’s origin.
    -                        const origin = this[kRealm].settingsObject.origin
    -
    -                        // 8. Let window be "client".
    -                        let window = 'client'
    -
    -                        // 9. If request’s window is an environment settings object and its origin
    -                        // is same origin with origin, then set window to request’s window.
    -                        if (
    -                            request.window?.constructor?.name === 'EnvironmentSettingsObject' &&
    -                            sameOrigin(request.window, origin)
    -                        ) {
    -                            window = request.window
    -                        }
    -
    -                        // 10. If init["window"] exists and is non-null, then throw a TypeError.
    -                        if (init.window != null) {
    -                            throw new TypeError(`'window' option '${window}' must be null`)
    -                        }
    -
    -                        // 11. If init["window"] exists, then set window to "no-window".
    -                        if ('window' in init) {
    -                            window = 'no-window'
    -                        }
    -
    -                        // 12. Set request to a new request with the following properties:
    -                        request = makeRequest({
    -                            // URL request’s URL.
    -                            // undici implementation note: this is set as the first item in request's urlList in makeRequest
    -                            // method request’s method.
    -                            method: request.method,
    -                            // header list A copy of request’s header list.
    -                            // undici implementation note: headersList is cloned in makeRequest
    -                            headersList: request.headersList,
    -                            // unsafe-request flag Set.
    -                            unsafeRequest: request.unsafeRequest,
    -                            // client This’s relevant settings object.
    -                            client: this[kRealm].settingsObject,
    -                            // window window.
    -                            window,
    -                            // priority request’s priority.
    -                            priority: request.priority,
    -                            // origin request’s origin. The propagation of the origin is only significant for navigation requests
    -                            // being handled by a service worker. In this scenario a request can have an origin that is different
    -                            // from the current client.
    -                            origin: request.origin,
    -                            // referrer request’s referrer.
    -                            referrer: request.referrer,
    -                            // referrer policy request’s referrer policy.
    -                            referrerPolicy: request.referrerPolicy,
    -                            // mode request’s mode.
    -                            mode: request.mode,
    -                            // credentials mode request’s credentials mode.
    -                            credentials: request.credentials,
    -                            // cache mode request’s cache mode.
    -                            cache: request.cache,
    -                            // redirect mode request’s redirect mode.
    -                            redirect: request.redirect,
    -                            // integrity metadata request’s integrity metadata.
    -                            integrity: request.integrity,
    -                            // keepalive request’s keepalive.
    -                            keepalive: request.keepalive,
    -                            // reload-navigation flag request’s reload-navigation flag.
    -                            reloadNavigation: request.reloadNavigation,
    -                            // history-navigation flag request’s history-navigation flag.
    -                            historyNavigation: request.historyNavigation,
    -                            // URL list A clone of request’s URL list.
    -                            urlList: [...request.urlList]
    -                        })
    -
    -                        const initHasKey = Object.keys(init).length !== 0
    -
    -                        // 13. If init is not empty, then:
    -                        if (initHasKey) {
    -                            // 1. If request’s mode is "navigate", then set it to "same-origin".
    -                            if (request.mode === 'navigate') {
    -                                request.mode = 'same-origin'
    -                            }
    -
    -                            // 2. Unset request’s reload-navigation flag.
    -                            request.reloadNavigation = false
    -
    -                            // 3. Unset request’s history-navigation flag.
    -                            request.historyNavigation = false
    -
    -                            // 4. Set request’s origin to "client".
    -                            request.origin = 'client'
    -
    -                            // 5. Set request’s referrer to "client"
    -                            request.referrer = 'client'
    -
    -                            // 6. Set request’s referrer policy to the empty string.
    -                            request.referrerPolicy = ''
    -
    -                            // 7. Set request’s URL to request’s current URL.
    -                            request.url = request.urlList[request.urlList.length - 1]
    -
    -                            // 8. Set request’s URL list to « request’s URL ».
    -                            request.urlList = [request.url]
    -                        }
    -
    -                        // 14. If init["referrer"] exists, then:
    -                        if (init.referrer !== undefined) {
    -                            // 1. Let referrer be init["referrer"].
    -                            const referrer = init.referrer
    -
    -                            // 2. If referrer is the empty string, then set request’s referrer to "no-referrer".
    -                            if (referrer === '') {
    -                                request.referrer = 'no-referrer'
    -                            } else {
    -                                // 1. Let parsedReferrer be the result of parsing referrer with
    -                                // baseURL.
    -                                // 2. If parsedReferrer is failure, then throw a TypeError.
    -                                let parsedReferrer
    -                                try {
    -                                    parsedReferrer = new URL(referrer, baseUrl)
    -                                } catch (err) {
    -                                    throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err })
    -                                }
    -
    -                                // 3. If one of the following is true
    -                                // - parsedReferrer’s scheme is "about" and path is the string "client"
    -                                // - parsedReferrer’s origin is not same origin with origin
    -                                // then set request’s referrer to "client".
    -                                if (
    -                                    (parsedReferrer.protocol === 'about:' && parsedReferrer.hostname === 'client') ||
    -                                    (origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl))
    -                                ) {
    -                                    request.referrer = 'client'
    -                                } else {
    -                                    // 4. Otherwise, set request’s referrer to parsedReferrer.
    -                                    request.referrer = parsedReferrer
    -                                }
    -                            }
    -                        }
    -
    -                        // 15. If init["referrerPolicy"] exists, then set request’s referrer policy
    -                        // to it.
    -                        if (init.referrerPolicy !== undefined) {
    -                            request.referrerPolicy = init.referrerPolicy
    -                        }
    -
    -                        // 16. Let mode be init["mode"] if it exists, and fallbackMode otherwise.
    -                        let mode
    -                        if (init.mode !== undefined) {
    -                            mode = init.mode
    -                        } else {
    -                            mode = fallbackMode
    -                        }
    -
    -                        // 17. If mode is "navigate", then throw a TypeError.
    -                        if (mode === 'navigate') {
    -                            throw webidl.errors.exception({
    -                                header: 'Request constructor',
    -                                message: 'invalid request mode navigate.'
    -                            })
    -                        }
    -
    -                        // 18. If mode is non-null, set request’s mode to mode.
    -                        if (mode != null) {
    -                            request.mode = mode
    -                        }
    -
    -                        // 19. If init["credentials"] exists, then set request’s credentials mode
    -                        // to it.
    -                        if (init.credentials !== undefined) {
    -                            request.credentials = init.credentials
    -                        }
    -
    -                        // 18. If init["cache"] exists, then set request’s cache mode to it.
    -                        if (init.cache !== undefined) {
    -                            request.cache = init.cache
    -                        }
    -
    -                        // 21. If request’s cache mode is "only-if-cached" and request’s mode is
    -                        // not "same-origin", then throw a TypeError.
    -                        if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') {
    -                            throw new TypeError(
    -                                "'only-if-cached' can be set only with 'same-origin' mode"
    -                            )
    -                        }
    -
    -                        // 22. If init["redirect"] exists, then set request’s redirect mode to it.
    -                        if (init.redirect !== undefined) {
    -                            request.redirect = init.redirect
    -                        }
    -
    -                        // 23. If init["integrity"] exists, then set request’s integrity metadata to it.
    -                        if (init.integrity != null) {
    -                            request.integrity = String(init.integrity)
    -                        }
    -
    -                        // 24. If init["keepalive"] exists, then set request’s keepalive to it.
    -                        if (init.keepalive !== undefined) {
    -                            request.keepalive = Boolean(init.keepalive)
    -                        }
    -
    -                        // 25. If init["method"] exists, then:
    -                        if (init.method !== undefined) {
    -                            // 1. Let method be init["method"].
    -                            let method = init.method
    -
    -                            // 2. If method is not a method or method is a forbidden method, then
    -                            // throw a TypeError.
    -                            if (!isValidHTTPToken(method)) {
    -                                throw new TypeError(`'${method}' is not a valid HTTP method.`)
    -                            }
    -
    -                            if (forbiddenMethodsSet.has(method.toUpperCase())) {
    -                                throw new TypeError(`'${method}' HTTP method is unsupported.`)
    -                            }
    -
    -                            // 3. Normalize method.
    -                            method = normalizeMethodRecord[method] ?? normalizeMethod(method)
    -
    -                            // 4. Set request’s method to method.
    -                            request.method = method
    -                        }
    -
    -                        // 26. If init["signal"] exists, then set signal to it.
    -                        if (init.signal !== undefined) {
    -                            signal = init.signal
    -                        }
    -
    -                        // 27. Set this’s request to request.
    -                        this[kState] = request
    -
    -                        // 28. Set this’s signal to a new AbortSignal object with this’s relevant
    -                        // Realm.
    -                        // TODO: could this be simplified with AbortSignal.any
    -                        // (https://dom.spec.whatwg.org/#dom-abortsignal-any)
    -                        const ac = new AbortController()
    -                        this[kSignal] = ac.signal
    -                        this[kSignal][kRealm] = this[kRealm]
    -
    -                        // 29. If signal is not null, then make this’s signal follow signal.
    -                        if (signal != null) {
    -                            if (
    -                                !signal ||
    -                                typeof signal.aborted !== 'boolean' ||
    -                                typeof signal.addEventListener !== 'function'
    -                            ) {
    -                                throw new TypeError(
    -                                    "Failed to construct 'Request': member signal is not of type AbortSignal."
    -                                )
    -                            }
    -
    -                            if (signal.aborted) {
    -                                ac.abort(signal.reason)
    -                            } else {
    -                                // Keep a strong ref to ac while request object
    -                                // is alive. This is needed to prevent AbortController
    -                                // from being prematurely garbage collected.
    -                                // See, https://github.com/nodejs/undici/issues/1926.
    -                                this[kAbortController] = ac
    -
    -                                const acRef = new WeakRef(ac)
    -                                const abort = function () {
    -                                    const ac = acRef.deref()
    -                                    if (ac !== undefined) {
    -                                        ac.abort(this.reason)
    -                                    }
    -                                }
    -
    -                                // Third-party AbortControllers may not work with these.
    -                                // See, https://github.com/nodejs/undici/pull/1910#issuecomment-1464495619.
    -                                try {
    -                                    // If the max amount of listeners is equal to the default, increase it
    -                                    // This is only available in node >= v19.9.0
    -                                    if (typeof getMaxListeners === 'function' && getMaxListeners(signal) === defaultMaxListeners) {
    -                                        setMaxListeners(100, signal)
    -                                    } else if (getEventListeners(signal, 'abort').length >= defaultMaxListeners) {
    -                                        setMaxListeners(100, signal)
    -                                    }
    -                                } catch { }
    -
    -                                util.addAbortListener(signal, abort)
    -                                requestFinalizer.register(ac, { signal, abort })
    -                            }
    -                        }
    -
    -                        // 30. Set this’s headers to a new Headers object with this’s relevant
    -                        // Realm, whose header list is request’s header list and guard is
    -                        // "request".
    -                        this[kHeaders] = new Headers(kConstruct)
    -                        this[kHeaders][kHeadersList] = request.headersList
    -                        this[kHeaders][kGuard] = 'request'
    -                        this[kHeaders][kRealm] = this[kRealm]
    -
    -                        // 31. If this’s request’s mode is "no-cors", then:
    -                        if (mode === 'no-cors') {
    -                            // 1. If this’s request’s method is not a CORS-safelisted method,
    -                            // then throw a TypeError.
    -                            if (!corsSafeListedMethodsSet.has(request.method)) {
    -                                throw new TypeError(
    -                                    `'${request.method} is unsupported in no-cors mode.`
    -                                )
    -                            }
    -
    -                            // 2. Set this’s headers’s guard to "request-no-cors".
    -                            this[kHeaders][kGuard] = 'request-no-cors'
    -                        }
    -
    -                        // 32. If init is not empty, then:
    -                        if (initHasKey) {
    -                            /** @type {HeadersList} */
    -                            const headersList = this[kHeaders][kHeadersList]
    -                            // 1. Let headers be a copy of this’s headers and its associated header
    -                            // list.
    -                            // 2. If init["headers"] exists, then set headers to init["headers"].
    -                            const headers = init.headers !== undefined ? init.headers : new HeadersList(headersList)
    -
    -                            // 3. Empty this’s headers’s header list.
    -                            headersList.clear()
    -
    -                            // 4. If headers is a Headers object, then for each header in its header
    -                            // list, append header’s name/header’s value to this’s headers.
    -                            if (headers instanceof HeadersList) {
    -                                for (const [key, val] of headers) {
    -                                    headersList.append(key, val)
    -                                }
    -                                // Note: Copy the `set-cookie` meta-data.
    -                                headersList.cookies = headers.cookies
    -                            } else {
    -                                // 5. Otherwise, fill this’s headers with headers.
    -                                fillHeaders(this[kHeaders], headers)
    -                            }
    -                        }
    -
    -                        // 33. Let inputBody be input’s request’s body if input is a Request
    -                        // object; otherwise null.
    -                        const inputBody = input instanceof Request ? input[kState].body : null
    -
    -                        // 34. If either init["body"] exists and is non-null or inputBody is
    -                        // non-null, and request’s method is `GET` or `HEAD`, then throw a
    -                        // TypeError.
    -                        if (
    -                            (init.body != null || inputBody != null) &&
    -                            (request.method === 'GET' || request.method === 'HEAD')
    -                        ) {
    -                            throw new TypeError('Request with GET/HEAD method cannot have body.')
    -                        }
    -
    -                        // 35. Let initBody be null.
    -                        let initBody = null
    -
    -                        // 36. If init["body"] exists and is non-null, then:
    -                        if (init.body != null) {
    -                            // 1. Let Content-Type be null.
    -                            // 2. Set initBody and Content-Type to the result of extracting
    -                            // init["body"], with keepalive set to request’s keepalive.
    -                            const [extractedBody, contentType] = extractBody(
    -                                init.body,
    -                                request.keepalive
    -                            )
    -                            initBody = extractedBody
    -
    -                            // 3, If Content-Type is non-null and this’s headers’s header list does
    -                            // not contain `Content-Type`, then append `Content-Type`/Content-Type to
    -                            // this’s headers.
    -                            if (contentType && !this[kHeaders][kHeadersList].contains('content-type')) {
    -                                this[kHeaders].append('content-type', contentType)
    -                            }
    -                        }
    -
    -                        // 37. Let inputOrInitBody be initBody if it is non-null; otherwise
    -                        // inputBody.
    -                        const inputOrInitBody = initBody ?? inputBody
    -
    -                        // 38. If inputOrInitBody is non-null and inputOrInitBody’s source is
    -                        // null, then:
    -                        if (inputOrInitBody != null && inputOrInitBody.source == null) {
    -                            // 1. If initBody is non-null and init["duplex"] does not exist,
    -                            //    then throw a TypeError.
    -                            if (initBody != null && init.duplex == null) {
    -                                throw new TypeError('RequestInit: duplex option is required when sending a body.')
    -                            }
    -
    -                            // 2. If this’s request’s mode is neither "same-origin" nor "cors",
    -                            // then throw a TypeError.
    -                            if (request.mode !== 'same-origin' && request.mode !== 'cors') {
    -                                throw new TypeError(
    -                                    'If request is made from ReadableStream, mode should be "same-origin" or "cors"'
    -                                )
    -                            }
    -
    -                            // 3. Set this’s request’s use-CORS-preflight flag.
    -                            request.useCORSPreflightFlag = true
    -                        }
    -
    -                        // 39. Let finalBody be inputOrInitBody.
    -                        let finalBody = inputOrInitBody
    -
    -                        // 40. If initBody is null and inputBody is non-null, then:
    -                        if (initBody == null && inputBody != null) {
    -                            // 1. If input is unusable, then throw a TypeError.
    -                            if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) {
    -                                throw new TypeError(
    -                                    'Cannot construct a Request with a Request object that has already been used.'
    -                                )
    -                            }
    -
    -                            // 2. Set finalBody to the result of creating a proxy for inputBody.
    -                            if (!TransformStream) {
    -                                TransformStream = (__nccwpck_require__(5356).TransformStream)
    -                            }
    -
    -                            // https://streams.spec.whatwg.org/#readablestream-create-a-proxy
    -                            const identityTransform = new TransformStream()
    -                            inputBody.stream.pipeThrough(identityTransform)
    -                            finalBody = {
    -                                source: inputBody.source,
    -                                length: inputBody.length,
    -                                stream: identityTransform.readable
    -                            }
    -                        }
    -
    -                        // 41. Set this’s request’s body to finalBody.
    -                        this[kState].body = finalBody
    -                    }
    -
    -                    // Returns request’s HTTP method, which is "GET" by default.
    -                    get method() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The method getter steps are to return this’s request’s method.
    -                        return this[kState].method
    -                    }
    -
    -                    // Returns the URL of request as a string.
    -                    get url() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The url getter steps are to return this’s request’s URL, serialized.
    -                        return URLSerializer(this[kState].url)
    -                    }
    -
    -                    // Returns a Headers object consisting of the headers associated with request.
    -                    // Note that headers added in the network layer by the user agent will not
    -                    // be accounted for in this object, e.g., the "Host" header.
    -                    get headers() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The headers getter steps are to return this’s headers.
    -                        return this[kHeaders]
    -                    }
    -
    -                    // Returns the kind of resource requested by request, e.g., "document"
    -                    // or "script".
    -                    get destination() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The destination getter are to return this’s request’s destination.
    -                        return this[kState].destination
    -                    }
    -
    -                    // Returns the referrer of request. Its value can be a same-origin URL if
    -                    // explicitly set in init, the empty string to indicate no referrer, and
    -                    // "about:client" when defaulting to the global’s default. This is used
    -                    // during fetching to determine the value of the `Referer` header of the
    -                    // request being made.
    -                    get referrer() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // 1. If this’s request’s referrer is "no-referrer", then return the
    -                        // empty string.
    -                        if (this[kState].referrer === 'no-referrer') {
    -                            return ''
    -                        }
    -
    -                        // 2. If this’s request’s referrer is "client", then return
    -                        // "about:client".
    -                        if (this[kState].referrer === 'client') {
    -                            return 'about:client'
    -                        }
    -
    -                        // Return this’s request’s referrer, serialized.
    -                        return this[kState].referrer.toString()
    -                    }
    -
    -                    // Returns the referrer policy associated with request.
    -                    // This is used during fetching to compute the value of the request’s
    -                    // referrer.
    -                    get referrerPolicy() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The referrerPolicy getter steps are to return this’s request’s referrer policy.
    -                        return this[kState].referrerPolicy
    -                    }
    -
    -                    // Returns the mode associated with request, which is a string indicating
    -                    // whether the request will use CORS, or will be restricted to same-origin
    -                    // URLs.
    -                    get mode() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The mode getter steps are to return this’s request’s mode.
    -                        return this[kState].mode
    -                    }
    -
    -                    // Returns the credentials mode associated with request,
    -                    // which is a string indicating whether credentials will be sent with the
    -                    // request always, never, or only when sent to a same-origin URL.
    -                    get credentials() {
    -                        // The credentials getter steps are to return this’s request’s credentials mode.
    -                        return this[kState].credentials
    -                    }
    -
    -                    // Returns the cache mode associated with request,
    -                    // which is a string indicating how the request will
    -                    // interact with the browser’s cache when fetching.
    -                    get cache() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The cache getter steps are to return this’s request’s cache mode.
    -                        return this[kState].cache
    -                    }
    -
    -                    // Returns the redirect mode associated with request,
    -                    // which is a string indicating how redirects for the
    -                    // request will be handled during fetching. A request
    -                    // will follow redirects by default.
    -                    get redirect() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The redirect getter steps are to return this’s request’s redirect mode.
    -                        return this[kState].redirect
    -                    }
    -
    -                    // Returns request’s subresource integrity metadata, which is a
    -                    // cryptographic hash of the resource being fetched. Its value
    -                    // consists of multiple hashes separated by whitespace. [SRI]
    -                    get integrity() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The integrity getter steps are to return this’s request’s integrity
    -                        // metadata.
    -                        return this[kState].integrity
    -                    }
    -
    -                    // Returns a boolean indicating whether or not request can outlive the
    -                    // global in which it was created.
    -                    get keepalive() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The keepalive getter steps are to return this’s request’s keepalive.
    -                        return this[kState].keepalive
    -                    }
    -
    -                    // Returns a boolean indicating whether or not request is for a reload
    -                    // navigation.
    -                    get isReloadNavigation() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The isReloadNavigation getter steps are to return true if this’s
    -                        // request’s reload-navigation flag is set; otherwise false.
    -                        return this[kState].reloadNavigation
    -                    }
    -
    -                    // Returns a boolean indicating whether or not request is for a history
    -                    // navigation (a.k.a. back-foward navigation).
    -                    get isHistoryNavigation() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The isHistoryNavigation getter steps are to return true if this’s request’s
    -                        // history-navigation flag is set; otherwise false.
    -                        return this[kState].historyNavigation
    -                    }
    -
    -                    // Returns the signal associated with request, which is an AbortSignal
    -                    // object indicating whether or not request has been aborted, and its
    -                    // abort event handler.
    -                    get signal() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // The signal getter steps are to return this’s signal.
    -                        return this[kSignal]
    -                    }
    -
    -                    get body() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        return this[kState].body ? this[kState].body.stream : null
    -                    }
    -
    -                    get bodyUsed() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        return !!this[kState].body && util.isDisturbed(this[kState].body.stream)
    -                    }
    -
    -                    get duplex() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        return 'half'
    -                    }
    -
    -                    // Returns a clone of request.
    -                    clone() {
    -                        webidl.brandCheck(this, Request)
    -
    -                        // 1. If this is unusable, then throw a TypeError.
    -                        if (this.bodyUsed || this.body?.locked) {
    -                            throw new TypeError('unusable')
    -                        }
    -
    -                        // 2. Let clonedRequest be the result of cloning this’s request.
    -                        const clonedRequest = cloneRequest(this[kState])
    -
    -                        // 3. Let clonedRequestObject be the result of creating a Request object,
    -                        // given clonedRequest, this’s headers’s guard, and this’s relevant Realm.
    -                        const clonedRequestObject = new Request(kConstruct)
    -                        clonedRequestObject[kState] = clonedRequest
    -                        clonedRequestObject[kRealm] = this[kRealm]
    -                        clonedRequestObject[kHeaders] = new Headers(kConstruct)
    -                        clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList
    -                        clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]
    -                        clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]
    -
    -                        // 4. Make clonedRequestObject’s signal follow this’s signal.
    -                        const ac = new AbortController()
    -                        if (this.signal.aborted) {
    -                            ac.abort(this.signal.reason)
    -                        } else {
    -                            util.addAbortListener(
    -                                this.signal,
    -                                () => {
    -                                    ac.abort(this.signal.reason)
    -                                }
    -                            )
    -                        }
    -                        clonedRequestObject[kSignal] = ac.signal
    -
    -                        // 4. Return clonedRequestObject.
    -                        return clonedRequestObject
    -                    }
    -                }
    -
    -                mixinBody(Request)
    -
    -                function makeRequest(init) {
    -                    // https://fetch.spec.whatwg.org/#requests
    -                    const request = {
    -                        method: 'GET',
    -                        localURLsOnly: false,
    -                        unsafeRequest: false,
    -                        body: null,
    -                        client: null,
    -                        reservedClient: null,
    -                        replacesClientId: '',
    -                        window: 'client',
    -                        keepalive: false,
    -                        serviceWorkers: 'all',
    -                        initiator: '',
    -                        destination: '',
    -                        priority: null,
    -                        origin: 'client',
    -                        policyContainer: 'client',
    -                        referrer: 'client',
    -                        referrerPolicy: '',
    -                        mode: 'no-cors',
    -                        useCORSPreflightFlag: false,
    -                        credentials: 'same-origin',
    -                        useCredentials: false,
    -                        cache: 'default',
    -                        redirect: 'follow',
    -                        integrity: '',
    -                        cryptoGraphicsNonceMetadata: '',
    -                        parserMetadata: '',
    -                        reloadNavigation: false,
    -                        historyNavigation: false,
    -                        userActivation: false,
    -                        taintedOrigin: false,
    -                        redirectCount: 0,
    -                        responseTainting: 'basic',
    -                        preventNoCacheCacheControlHeaderModification: false,
    -                        done: false,
    -                        timingAllowFailed: false,
    -                        ...init,
    -                        headersList: init.headersList
    -                            ? new HeadersList(init.headersList)
    -                            : new HeadersList()
    -                    }
    -                    request.url = request.urlList[0]
    -                    return request
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#concept-request-clone
    -                function cloneRequest(request) {
    -                    // To clone a request request, run these steps:
    -
    -                    // 1. Let newRequest be a copy of request, except for its body.
    -                    const newRequest = makeRequest({ ...request, body: null })
    -
    -                    // 2. If request’s body is non-null, set newRequest’s body to the
    -                    // result of cloning request’s body.
    -                    if (request.body != null) {
    -                        newRequest.body = cloneBody(request.body)
    -                    }
    -
    -                    // 3. Return newRequest.
    -                    return newRequest
    -                }
    -
    -                Object.defineProperties(Request.prototype, {
    -                    method: kEnumerableProperty,
    -                    url: kEnumerableProperty,
    -                    headers: kEnumerableProperty,
    -                    redirect: kEnumerableProperty,
    -                    clone: kEnumerableProperty,
    -                    signal: kEnumerableProperty,
    -                    duplex: kEnumerableProperty,
    -                    destination: kEnumerableProperty,
    -                    body: kEnumerableProperty,
    -                    bodyUsed: kEnumerableProperty,
    -                    isHistoryNavigation: kEnumerableProperty,
    -                    isReloadNavigation: kEnumerableProperty,
    -                    keepalive: kEnumerableProperty,
    -                    integrity: kEnumerableProperty,
    -                    cache: kEnumerableProperty,
    -                    credentials: kEnumerableProperty,
    -                    attribute: kEnumerableProperty,
    -                    referrerPolicy: kEnumerableProperty,
    -                    referrer: kEnumerableProperty,
    -                    mode: kEnumerableProperty,
    -                    [Symbol.toStringTag]: {
    -                        value: 'Request',
    -                        configurable: true
    -                    }
    -                })
    -
    -                webidl.converters.Request = webidl.interfaceConverter(
    -                    Request
    -                )
    -
    -                // https://fetch.spec.whatwg.org/#requestinfo
    -                webidl.converters.RequestInfo = function (V) {
    -                    if (typeof V === 'string') {
    -                        return webidl.converters.USVString(V)
    -                    }
    -
    -                    if (V instanceof Request) {
    -                        return webidl.converters.Request(V)
    -                    }
    -
    -                    return webidl.converters.USVString(V)
    -                }
    -
    -                webidl.converters.AbortSignal = webidl.interfaceConverter(
    -                    AbortSignal
    -                )
    -
    -                // https://fetch.spec.whatwg.org/#requestinit
    -                webidl.converters.RequestInit = webidl.dictionaryConverter([
    -                    {
    -                        key: 'method',
    -                        converter: webidl.converters.ByteString
    -                    },
    -                    {
    -                        key: 'headers',
    -                        converter: webidl.converters.HeadersInit
    -                    },
    -                    {
    -                        key: 'body',
    -                        converter: webidl.nullableConverter(
    -                            webidl.converters.BodyInit
    -                        )
    -                    },
    -                    {
    -                        key: 'referrer',
    -                        converter: webidl.converters.USVString
    -                    },
    -                    {
    -                        key: 'referrerPolicy',
    -                        converter: webidl.converters.DOMString,
    -                        // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy
    -                        allowedValues: referrerPolicy
    -                    },
    -                    {
    -                        key: 'mode',
    -                        converter: webidl.converters.DOMString,
    -                        // https://fetch.spec.whatwg.org/#concept-request-mode
    -                        allowedValues: requestMode
    -                    },
    -                    {
    -                        key: 'credentials',
    -                        converter: webidl.converters.DOMString,
    -                        // https://fetch.spec.whatwg.org/#requestcredentials
    -                        allowedValues: requestCredentials
    -                    },
    -                    {
    -                        key: 'cache',
    -                        converter: webidl.converters.DOMString,
    -                        // https://fetch.spec.whatwg.org/#requestcache
    -                        allowedValues: requestCache
    -                    },
    -                    {
    -                        key: 'redirect',
    -                        converter: webidl.converters.DOMString,
    -                        // https://fetch.spec.whatwg.org/#requestredirect
    -                        allowedValues: requestRedirect
    -                    },
    -                    {
    -                        key: 'integrity',
    -                        converter: webidl.converters.DOMString
    -                    },
    -                    {
    -                        key: 'keepalive',
    -                        converter: webidl.converters.boolean
    -                    },
    -                    {
    -                        key: 'signal',
    -                        converter: webidl.nullableConverter(
    -                            (signal) => webidl.converters.AbortSignal(
    -                                signal,
    -                                { strict: false }
    -                            )
    -                        )
    -                    },
    -                    {
    -                        key: 'window',
    -                        converter: webidl.converters.any
    -                    },
    -                    {
    -                        key: 'duplex',
    -                        converter: webidl.converters.DOMString,
    -                        allowedValues: requestDuplex
    -                    }
    -                ])
    -
    -                module.exports = { Request, makeRequest }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 7823:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { Headers, HeadersList, fill } = __nccwpck_require__(554)
    -                const { extractBody, cloneBody, mixinBody } = __nccwpck_require__(1472)
    -                const util = __nccwpck_require__(3983)
    -                const { kEnumerableProperty } = util
    -                const {
    -                    isValidReasonPhrase,
    -                    isCancelled,
    -                    isAborted,
    -                    isBlobLike,
    -                    serializeJavascriptValueToJSONString,
    -                    isErrorLike,
    -                    isomorphicEncode
    -                } = __nccwpck_require__(2538)
    -                const {
    -                    redirectStatusSet,
    -                    nullBodyStatus,
    -                    DOMException
    -                } = __nccwpck_require__(1037)
    -                const { kState, kHeaders, kGuard, kRealm } = __nccwpck_require__(5861)
    -                const { webidl } = __nccwpck_require__(1744)
    -                const { FormData } = __nccwpck_require__(2015)
    -                const { getGlobalOrigin } = __nccwpck_require__(1246)
    -                const { URLSerializer } = __nccwpck_require__(685)
    -                const { kHeadersList, kConstruct } = __nccwpck_require__(2785)
    -                const assert = __nccwpck_require__(9491)
    -                const { types } = __nccwpck_require__(3837)
    -
    -                const ReadableStream = globalThis.ReadableStream || (__nccwpck_require__(5356).ReadableStream)
    -                const textEncoder = new TextEncoder('utf-8')
    -
    -                // https://fetch.spec.whatwg.org/#response-class
    -                class Response {
    -                    // Creates network error Response.
    -                    static error() {
    -                        // TODO
    -                        const relevantRealm = { settingsObject: {} }
    -
    -                        // The static error() method steps are to return the result of creating a
    -                        // Response object, given a new network error, "immutable", and this’s
    -                        // relevant Realm.
    -                        const responseObject = new Response()
    -                        responseObject[kState] = makeNetworkError()
    -                        responseObject[kRealm] = relevantRealm
    -                        responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList
    -                        responseObject[kHeaders][kGuard] = 'immutable'
    -                        responseObject[kHeaders][kRealm] = relevantRealm
    -                        return responseObject
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#dom-response-json
    -                    static json(data, init = {}) {
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'Response.json' })
    -
    -                        if (init !== null) {
    -                            init = webidl.converters.ResponseInit(init)
    -                        }
    -
    -                        // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data.
    -                        const bytes = textEncoder.encode(
    -                            serializeJavascriptValueToJSONString(data)
    -                        )
    -
    -                        // 2. Let body be the result of extracting bytes.
    -                        const body = extractBody(bytes)
    -
    -                        // 3. Let responseObject be the result of creating a Response object, given a new response,
    -                        //    "response", and this’s relevant Realm.
    -                        const relevantRealm = { settingsObject: {} }
    -                        const responseObject = new Response()
    -                        responseObject[kRealm] = relevantRealm
    -                        responseObject[kHeaders][kGuard] = 'response'
    -                        responseObject[kHeaders][kRealm] = relevantRealm
    -
    -                        // 4. Perform initialize a response given responseObject, init, and (body, "application/json").
    -                        initializeResponse(responseObject, init, { body: body[0], type: 'application/json' })
    -
    -                        // 5. Return responseObject.
    -                        return responseObject
    -                    }
    -
    -                    // Creates a redirect Response that redirects to url with status status.
    -                    static redirect(url, status = 302) {
    -                        const relevantRealm = { settingsObject: {} }
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'Response.redirect' })
    -
    -                        url = webidl.converters.USVString(url)
    -                        status = webidl.converters['unsigned short'](status)
    -
    -                        // 1. Let parsedURL be the result of parsing url with current settings
    -                        // object’s API base URL.
    -                        // 2. If parsedURL is failure, then throw a TypeError.
    -                        // TODO: base-URL?
    -                        let parsedURL
    -                        try {
    -                            parsedURL = new URL(url, getGlobalOrigin())
    -                        } catch (err) {
    -                            throw Object.assign(new TypeError('Failed to parse URL from ' + url), {
    -                                cause: err
    -                            })
    -                        }
    -
    -                        // 3. If status is not a redirect status, then throw a RangeError.
    -                        if (!redirectStatusSet.has(status)) {
    -                            throw new RangeError('Invalid status code ' + status)
    -                        }
    -
    -                        // 4. Let responseObject be the result of creating a Response object,
    -                        // given a new response, "immutable", and this’s relevant Realm.
    -                        const responseObject = new Response()
    -                        responseObject[kRealm] = relevantRealm
    -                        responseObject[kHeaders][kGuard] = 'immutable'
    -                        responseObject[kHeaders][kRealm] = relevantRealm
    -
    -                        // 5. Set responseObject’s response’s status to status.
    -                        responseObject[kState].status = status
    -
    -                        // 6. Let value be parsedURL, serialized and isomorphic encoded.
    -                        const value = isomorphicEncode(URLSerializer(parsedURL))
    -
    -                        // 7. Append `Location`/value to responseObject’s response’s header list.
    -                        responseObject[kState].headersList.append('location', value)
    -
    -                        // 8. Return responseObject.
    -                        return responseObject
    -                    }
    -
    -                    // https://fetch.spec.whatwg.org/#dom-response
    -                    constructor(body = null, init = {}) {
    -                        if (body !== null) {
    -                            body = webidl.converters.BodyInit(body)
    -                        }
    -
    -                        init = webidl.converters.ResponseInit(init)
    -
    -                        // TODO
    -                        this[kRealm] = { settingsObject: {} }
    -
    -                        // 1. Set this’s response to a new response.
    -                        this[kState] = makeResponse({})
    -
    -                        // 2. Set this’s headers to a new Headers object with this’s relevant
    -                        // Realm, whose header list is this’s response’s header list and guard
    -                        // is "response".
    -                        this[kHeaders] = new Headers(kConstruct)
    -                        this[kHeaders][kGuard] = 'response'
    -                        this[kHeaders][kHeadersList] = this[kState].headersList
    -                        this[kHeaders][kRealm] = this[kRealm]
    -
    -                        // 3. Let bodyWithType be null.
    -                        let bodyWithType = null
    -
    -                        // 4. If body is non-null, then set bodyWithType to the result of extracting body.
    -                        if (body != null) {
    -                            const [extractedBody, type] = extractBody(body)
    -                            bodyWithType = { body: extractedBody, type }
    -                        }
    -
    -                        // 5. Perform initialize a response given this, init, and bodyWithType.
    -                        initializeResponse(this, init, bodyWithType)
    -                    }
    -
    -                    // Returns response’s type, e.g., "cors".
    -                    get type() {
    -                        webidl.brandCheck(this, Response)
    -
    -                        // The type getter steps are to return this’s response’s type.
    -                        return this[kState].type
    -                    }
    -
    -                    // Returns response’s URL, if it has one; otherwise the empty string.
    -                    get url() {
    -                        webidl.brandCheck(this, Response)
    -
    -                        const urlList = this[kState].urlList
    -
    -                        // The url getter steps are to return the empty string if this’s
    -                        // response’s URL is null; otherwise this’s response’s URL,
    -                        // serialized with exclude fragment set to true.
    -                        const url = urlList[urlList.length - 1] ?? null
    -
    -                        if (url === null) {
    -                            return ''
    -                        }
    -
    -                        return URLSerializer(url, true)
    -                    }
    -
    -                    // Returns whether response was obtained through a redirect.
    -                    get redirected() {
    -                        webidl.brandCheck(this, Response)
    -
    -                        // The redirected getter steps are to return true if this’s response’s URL
    -                        // list has more than one item; otherwise false.
    -                        return this[kState].urlList.length > 1
    -                    }
    -
    -                    // Returns response’s status.
    -                    get status() {
    -                        webidl.brandCheck(this, Response)
    -
    -                        // The status getter steps are to return this’s response’s status.
    -                        return this[kState].status
    -                    }
    -
    -                    // Returns whether response’s status is an ok status.
    -                    get ok() {
    -                        webidl.brandCheck(this, Response)
    -
    -                        // The ok getter steps are to return true if this’s response’s status is an
    -                        // ok status; otherwise false.
    -                        return this[kState].status >= 200 && this[kState].status <= 299
    -                    }
    -
    -                    // Returns response’s status message.
    -                    get statusText() {
    -                        webidl.brandCheck(this, Response)
    -
    -                        // The statusText getter steps are to return this’s response’s status
    -                        // message.
    -                        return this[kState].statusText
    -                    }
    -
    -                    // Returns response’s headers as Headers.
    -                    get headers() {
    -                        webidl.brandCheck(this, Response)
    -
    -                        // The headers getter steps are to return this’s headers.
    -                        return this[kHeaders]
    -                    }
    -
    -                    get body() {
    -                        webidl.brandCheck(this, Response)
    -
    -                        return this[kState].body ? this[kState].body.stream : null
    -                    }
    -
    -                    get bodyUsed() {
    -                        webidl.brandCheck(this, Response)
    -
    -                        return !!this[kState].body && util.isDisturbed(this[kState].body.stream)
    -                    }
    -
    -                    // Returns a clone of response.
    -                    clone() {
    -                        webidl.brandCheck(this, Response)
    -
    -                        // 1. If this is unusable, then throw a TypeError.
    -                        if (this.bodyUsed || (this.body && this.body.locked)) {
    -                            throw webidl.errors.exception({
    -                                header: 'Response.clone',
    -                                message: 'Body has already been consumed.'
    -                            })
    -                        }
    -
    -                        // 2. Let clonedResponse be the result of cloning this’s response.
    -                        const clonedResponse = cloneResponse(this[kState])
    -
    -                        // 3. Return the result of creating a Response object, given
    -                        // clonedResponse, this’s headers’s guard, and this’s relevant Realm.
    -                        const clonedResponseObject = new Response()
    -                        clonedResponseObject[kState] = clonedResponse
    -                        clonedResponseObject[kRealm] = this[kRealm]
    -                        clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList
    -                        clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]
    -                        clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]
    -
    -                        return clonedResponseObject
    -                    }
    -                }
    -
    -                mixinBody(Response)
    -
    -                Object.defineProperties(Response.prototype, {
    -                    type: kEnumerableProperty,
    -                    url: kEnumerableProperty,
    -                    status: kEnumerableProperty,
    -                    ok: kEnumerableProperty,
    -                    redirected: kEnumerableProperty,
    -                    statusText: kEnumerableProperty,
    -                    headers: kEnumerableProperty,
    -                    clone: kEnumerableProperty,
    -                    body: kEnumerableProperty,
    -                    bodyUsed: kEnumerableProperty,
    -                    [Symbol.toStringTag]: {
    -                        value: 'Response',
    -                        configurable: true
    -                    }
    -                })
    -
    -                Object.defineProperties(Response, {
    -                    json: kEnumerableProperty,
    -                    redirect: kEnumerableProperty,
    -                    error: kEnumerableProperty
    -                })
    -
    -                // https://fetch.spec.whatwg.org/#concept-response-clone
    -                function cloneResponse(response) {
    -                    // To clone a response response, run these steps:
    -
    -                    // 1. If response is a filtered response, then return a new identical
    -                    // filtered response whose internal response is a clone of response’s
    -                    // internal response.
    -                    if (response.internalResponse) {
    -                        return filterResponse(
    -                            cloneResponse(response.internalResponse),
    -                            response.type
    -                        )
    -                    }
    -
    -                    // 2. Let newResponse be a copy of response, except for its body.
    -                    const newResponse = makeResponse({ ...response, body: null })
    -
    -                    // 3. If response’s body is non-null, then set newResponse’s body to the
    -                    // result of cloning response’s body.
    -                    if (response.body != null) {
    -                        newResponse.body = cloneBody(response.body)
    -                    }
    -
    -                    // 4. Return newResponse.
    -                    return newResponse
    -                }
    -
    -                function makeResponse(init) {
    -                    return {
    -                        aborted: false,
    -                        rangeRequested: false,
    -                        timingAllowPassed: false,
    -                        requestIncludesCredentials: false,
    -                        type: 'default',
    -                        status: 200,
    -                        timingInfo: null,
    -                        cacheState: '',
    -                        statusText: '',
    -                        ...init,
    -                        headersList: init.headersList
    -                            ? new HeadersList(init.headersList)
    -                            : new HeadersList(),
    -                        urlList: init.urlList ? [...init.urlList] : []
    -                    }
    -                }
    -
    -                function makeNetworkError(reason) {
    -                    const isError = isErrorLike(reason)
    -                    return makeResponse({
    -                        type: 'error',
    -                        status: 0,
    -                        error: isError
    -                            ? reason
    -                            : new Error(reason ? String(reason) : reason),
    -                        aborted: reason && reason.name === 'AbortError'
    -                    })
    -                }
    -
    -                function makeFilteredResponse(response, state) {
    -                    state = {
    -                        internalResponse: response,
    -                        ...state
    -                    }
    -
    -                    return new Proxy(response, {
    -                        get(target, p) {
    -                            return p in state ? state[p] : target[p]
    -                        },
    -                        set(target, p, value) {
    -                            assert(!(p in state))
    -                            target[p] = value
    -                            return true
    -                        }
    -                    })
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#concept-filtered-response
    -                function filterResponse(response, type) {
    -                    // Set response to the following filtered response with response as its
    -                    // internal response, depending on request’s response tainting:
    -                    if (type === 'basic') {
    -                        // A basic filtered response is a filtered response whose type is "basic"
    -                        // and header list excludes any headers in internal response’s header list
    -                        // whose name is a forbidden response-header name.
    -
    -                        // Note: undici does not implement forbidden response-header names
    -                        return makeFilteredResponse(response, {
    -                            type: 'basic',
    -                            headersList: response.headersList
    -                        })
    -                    } else if (type === 'cors') {
    -                        // A CORS filtered response is a filtered response whose type is "cors"
    -                        // and header list excludes any headers in internal response’s header
    -                        // list whose name is not a CORS-safelisted response-header name, given
    -                        // internal response’s CORS-exposed header-name list.
    -
    -                        // Note: undici does not implement CORS-safelisted response-header names
    -                        return makeFilteredResponse(response, {
    -                            type: 'cors',
    -                            headersList: response.headersList
    -                        })
    -                    } else if (type === 'opaque') {
    -                        // An opaque filtered response is a filtered response whose type is
    -                        // "opaque", URL list is the empty list, status is 0, status message
    -                        // is the empty byte sequence, header list is empty, and body is null.
    -
    -                        return makeFilteredResponse(response, {
    -                            type: 'opaque',
    -                            urlList: Object.freeze([]),
    -                            status: 0,
    -                            statusText: '',
    -                            body: null
    -                        })
    -                    } else if (type === 'opaqueredirect') {
    -                        // An opaque-redirect filtered response is a filtered response whose type
    -                        // is "opaqueredirect", status is 0, status message is the empty byte
    -                        // sequence, header list is empty, and body is null.
    -
    -                        return makeFilteredResponse(response, {
    -                            type: 'opaqueredirect',
    -                            status: 0,
    -                            statusText: '',
    -                            headersList: [],
    -                            body: null
    -                        })
    -                    } else {
    -                        assert(false)
    -                    }
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#appropriate-network-error
    -                function makeAppropriateNetworkError(fetchParams, err = null) {
    -                    // 1. Assert: fetchParams is canceled.
    -                    assert(isCancelled(fetchParams))
    -
    -                    // 2. Return an aborted network error if fetchParams is aborted;
    -                    // otherwise return a network error.
    -                    return isAborted(fetchParams)
    -                        ? makeNetworkError(Object.assign(new DOMException('The operation was aborted.', 'AbortError'), { cause: err }))
    -                        : makeNetworkError(Object.assign(new DOMException('Request was cancelled.'), { cause: err }))
    -                }
    -
    -                // https://whatpr.org/fetch/1392.html#initialize-a-response
    -                function initializeResponse(response, init, body) {
    -                    // 1. If init["status"] is not in the range 200 to 599, inclusive, then
    -                    //    throw a RangeError.
    -                    if (init.status !== null && (init.status < 200 || init.status > 599)) {
    -                        throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.')
    -                    }
    -
    -                    // 2. If init["statusText"] does not match the reason-phrase token production,
    -                    //    then throw a TypeError.
    -                    if ('statusText' in init && init.statusText != null) {
    -                        // See, https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.2:
    -                        //   reason-phrase  = *( HTAB / SP / VCHAR / obs-text )
    -                        if (!isValidReasonPhrase(String(init.statusText))) {
    -                            throw new TypeError('Invalid statusText')
    -                        }
    -                    }
    -
    -                    // 3. Set response’s response’s status to init["status"].
    -                    if ('status' in init && init.status != null) {
    -                        response[kState].status = init.status
    -                    }
    -
    -                    // 4. Set response’s response’s status message to init["statusText"].
    -                    if ('statusText' in init && init.statusText != null) {
    -                        response[kState].statusText = init.statusText
    -                    }
    -
    -                    // 5. If init["headers"] exists, then fill response’s headers with init["headers"].
    -                    if ('headers' in init && init.headers != null) {
    -                        fill(response[kHeaders], init.headers)
    -                    }
    -
    -                    // 6. If body was given, then:
    -                    if (body) {
    -                        // 1. If response's status is a null body status, then throw a TypeError.
    -                        if (nullBodyStatus.includes(response.status)) {
    -                            throw webidl.errors.exception({
    -                                header: 'Response constructor',
    -                                message: 'Invalid response status code ' + response.status
    -                            })
    -                        }
    -
    -                        // 2. Set response's body to body's body.
    -                        response[kState].body = body.body
    -
    -                        // 3. If body's type is non-null and response's header list does not contain
    -                        //    `Content-Type`, then append (`Content-Type`, body's type) to response's header list.
    -                        if (body.type != null && !response[kState].headersList.contains('Content-Type')) {
    -                            response[kState].headersList.append('content-type', body.type)
    -                        }
    -                    }
    -                }
    -
    -                webidl.converters.ReadableStream = webidl.interfaceConverter(
    -                    ReadableStream
    -                )
    -
    -                webidl.converters.FormData = webidl.interfaceConverter(
    -                    FormData
    -                )
    -
    -                webidl.converters.URLSearchParams = webidl.interfaceConverter(
    -                    URLSearchParams
    -                )
    -
    -                // https://fetch.spec.whatwg.org/#typedefdef-xmlhttprequestbodyinit
    -                webidl.converters.XMLHttpRequestBodyInit = function (V) {
    -                    if (typeof V === 'string') {
    -                        return webidl.converters.USVString(V)
    -                    }
    -
    -                    if (isBlobLike(V)) {
    -                        return webidl.converters.Blob(V, { strict: false })
    -                    }
    -
    -                    if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) {
    -                        return webidl.converters.BufferSource(V)
    -                    }
    -
    -                    if (util.isFormDataLike(V)) {
    -                        return webidl.converters.FormData(V, { strict: false })
    -                    }
    -
    -                    if (V instanceof URLSearchParams) {
    -                        return webidl.converters.URLSearchParams(V)
    -                    }
    -
    -                    return webidl.converters.DOMString(V)
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#bodyinit
    -                webidl.converters.BodyInit = function (V) {
    -                    if (V instanceof ReadableStream) {
    -                        return webidl.converters.ReadableStream(V)
    -                    }
    -
    -                    // Note: the spec doesn't include async iterables,
    -                    // this is an undici extension.
    -                    if (V?.[Symbol.asyncIterator]) {
    -                        return V
    -                    }
    -
    -                    return webidl.converters.XMLHttpRequestBodyInit(V)
    -                }
    -
    -                webidl.converters.ResponseInit = webidl.dictionaryConverter([
    -                    {
    -                        key: 'status',
    -                        converter: webidl.converters['unsigned short'],
    -                        defaultValue: 200
    -                    },
    -                    {
    -                        key: 'statusText',
    -                        converter: webidl.converters.ByteString,
    -                        defaultValue: ''
    -                    },
    -                    {
    -                        key: 'headers',
    -                        converter: webidl.converters.HeadersInit
    -                    }
    -                ])
    -
    -                module.exports = {
    -                    makeNetworkError,
    -                    makeResponse,
    -                    makeAppropriateNetworkError,
    -                    filterResponse,
    -                    Response,
    -                    cloneResponse
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 5861:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                module.exports = {
    -                    kUrl: Symbol('url'),
    -                    kHeaders: Symbol('headers'),
    -                    kSignal: Symbol('signal'),
    -                    kState: Symbol('state'),
    -                    kGuard: Symbol('guard'),
    -                    kRealm: Symbol('realm')
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 2538:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = __nccwpck_require__(1037)
    -                const { getGlobalOrigin } = __nccwpck_require__(1246)
    -                const { performance } = __nccwpck_require__(4074)
    -                const { isBlobLike, toUSVString, ReadableStreamFrom } = __nccwpck_require__(3983)
    -                const assert = __nccwpck_require__(9491)
    -                const { isUint8Array } = __nccwpck_require__(9830)
    -
    -                let supportedHashes = []
    -
    -                // https://nodejs.org/api/crypto.html#determining-if-crypto-support-is-unavailable
    -                /** @type {import('crypto')|undefined} */
    -                let crypto
    -
    -                try {
    -                    crypto = __nccwpck_require__(6113)
    -                    const possibleRelevantHashes = ['sha256', 'sha384', 'sha512']
    -                    supportedHashes = crypto.getHashes().filter((hash) => possibleRelevantHashes.includes(hash))
    -                    /* c8 ignore next 3 */
    -                } catch {
    -                }
    -
    -                function responseURL(response) {
    -                    // https://fetch.spec.whatwg.org/#responses
    -                    // A response has an associated URL. It is a pointer to the last URL
    -                    // in response’s URL list and null if response’s URL list is empty.
    -                    const urlList = response.urlList
    -                    const length = urlList.length
    -                    return length === 0 ? null : urlList[length - 1].toString()
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#concept-response-location-url
    -                function responseLocationURL(response, requestFragment) {
    -                    // 1. If response’s status is not a redirect status, then return null.
    -                    if (!redirectStatusSet.has(response.status)) {
    -                        return null
    -                    }
    -
    -                    // 2. Let location be the result of extracting header list values given
    -                    // `Location` and response’s header list.
    -                    let location = response.headersList.get('location')
    -
    -                    // 3. If location is a header value, then set location to the result of
    -                    //    parsing location with response’s URL.
    -                    if (location !== null && isValidHeaderValue(location)) {
    -                        location = new URL(location, responseURL(response))
    -                    }
    -
    -                    // 4. If location is a URL whose fragment is null, then set location’s
    -                    // fragment to requestFragment.
    -                    if (location && !location.hash) {
    -                        location.hash = requestFragment
    -                    }
    -
    -                    // 5. Return location.
    -                    return location
    -                }
    -
    -                /** @returns {URL} */
    -                function requestCurrentURL(request) {
    -                    return request.urlList[request.urlList.length - 1]
    -                }
    -
    -                function requestBadPort(request) {
    -                    // 1. Let url be request’s current URL.
    -                    const url = requestCurrentURL(request)
    -
    -                    // 2. If url’s scheme is an HTTP(S) scheme and url’s port is a bad port,
    -                    // then return blocked.
    -                    if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {
    -                        return 'blocked'
    -                    }
    -
    -                    // 3. Return allowed.
    -                    return 'allowed'
    -                }
    -
    -                function isErrorLike(object) {
    -                    return object instanceof Error || (
    -                        object?.constructor?.name === 'Error' ||
    -                        object?.constructor?.name === 'DOMException'
    -                    )
    -                }
    -
    -                // Check whether |statusText| is a ByteString and
    -                // matches the Reason-Phrase token production.
    -                // RFC 2616: https://tools.ietf.org/html/rfc2616
    -                // RFC 7230: https://tools.ietf.org/html/rfc7230
    -                // "reason-phrase = *( HTAB / SP / VCHAR / obs-text )"
    -                // https://github.com/chromium/chromium/blob/94.0.4604.1/third_party/blink/renderer/core/fetch/response.cc#L116
    -                function isValidReasonPhrase(statusText) {
    -                    for (let i = 0; i < statusText.length; ++i) {
    -                        const c = statusText.charCodeAt(i)
    -                        if (
    -                            !(
    -                                (
    -                                    c === 0x09 || // HTAB
    -                                    (c >= 0x20 && c <= 0x7e) || // SP / VCHAR
    -                                    (c >= 0x80 && c <= 0xff)
    -                                ) // obs-text
    -                            )
    -                        ) {
    -                            return false
    -                        }
    -                    }
    -                    return true
    -                }
    -
    -                /**
    -                 * @see https://tools.ietf.org/html/rfc7230#section-3.2.6
    -                 * @param {number} c
    -                 */
    -                function isTokenCharCode(c) {
    -                    switch (c) {
    -                        case 0x22:
    -                        case 0x28:
    -                        case 0x29:
    -                        case 0x2c:
    -                        case 0x2f:
    -                        case 0x3a:
    -                        case 0x3b:
    -                        case 0x3c:
    -                        case 0x3d:
    -                        case 0x3e:
    -                        case 0x3f:
    -                        case 0x40:
    -                        case 0x5b:
    -                        case 0x5c:
    -                        case 0x5d:
    -                        case 0x7b:
    -                        case 0x7d:
    -                            // DQUOTE and "(),/:;<=>?@[\]{}"
    -                            return false
    -                        default:
    -                            // VCHAR %x21-7E
    -                            return c >= 0x21 && c <= 0x7e
    -                    }
    -                }
    -
    -                /**
    -                 * @param {string} characters
    -                 */
    -                function isValidHTTPToken(characters) {
    -                    if (characters.length === 0) {
    -                        return false
    -                    }
    -                    for (let i = 0; i < characters.length; ++i) {
    -                        if (!isTokenCharCode(characters.charCodeAt(i))) {
    -                            return false
    -                        }
    -                    }
    -                    return true
    -                }
    -
    -                /**
    -                 * @see https://fetch.spec.whatwg.org/#header-name
    -                 * @param {string} potentialValue
    -                 */
    -                function isValidHeaderName(potentialValue) {
    -                    return isValidHTTPToken(potentialValue)
    -                }
    -
    -                /**
    -                 * @see https://fetch.spec.whatwg.org/#header-value
    -                 * @param {string} potentialValue
    -                 */
    -                function isValidHeaderValue(potentialValue) {
    -                    // - Has no leading or trailing HTTP tab or space bytes.
    -                    // - Contains no 0x00 (NUL) or HTTP newline bytes.
    -                    if (
    -                        potentialValue.startsWith('\t') ||
    -                        potentialValue.startsWith(' ') ||
    -                        potentialValue.endsWith('\t') ||
    -                        potentialValue.endsWith(' ')
    -                    ) {
    -                        return false
    -                    }
    -
    -                    if (
    -                        potentialValue.includes('\0') ||
    -                        potentialValue.includes('\r') ||
    -                        potentialValue.includes('\n')
    -                    ) {
    -                        return false
    -                    }
    -
    -                    return true
    -                }
    -
    -                // https://w3c.github.io/webappsec-referrer-policy/#set-requests-referrer-policy-on-redirect
    -                function setRequestReferrerPolicyOnRedirect(request, actualResponse) {
    -                    //  Given a request request and a response actualResponse, this algorithm
    -                    //  updates request’s referrer policy according to the Referrer-Policy
    -                    //  header (if any) in actualResponse.
    -
    -                    // 1. Let policy be the result of executing § 8.1 Parse a referrer policy
    -                    // from a Referrer-Policy header on actualResponse.
    -
    -                    // 8.1 Parse a referrer policy from a Referrer-Policy header
    -                    // 1. Let policy-tokens be the result of extracting header list values given `Referrer-Policy` and response’s header list.
    -                    const { headersList } = actualResponse
    -                    // 2. Let policy be the empty string.
    -                    // 3. For each token in policy-tokens, if token is a referrer policy and token is not the empty string, then set policy to token.
    -                    // 4. Return policy.
    -                    const policyHeader = (headersList.get('referrer-policy') ?? '').split(',')
    -
    -                    // Note: As the referrer-policy can contain multiple policies
    -                    // separated by comma, we need to loop through all of them
    -                    // and pick the first valid one.
    -                    // Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy
    -                    let policy = ''
    -                    if (policyHeader.length > 0) {
    -                        // The right-most policy takes precedence.
    -                        // The left-most policy is the fallback.
    -                        for (let i = policyHeader.length; i !== 0; i--) {
    -                            const token = policyHeader[i - 1].trim()
    -                            if (referrerPolicyTokens.has(token)) {
    -                                policy = token
    -                                break
    -                            }
    -                        }
    -                    }
    -
    -                    // 2. If policy is not the empty string, then set request’s referrer policy to policy.
    -                    if (policy !== '') {
    -                        request.referrerPolicy = policy
    -                    }
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#cross-origin-resource-policy-check
    -                function crossOriginResourcePolicyCheck() {
    -                    // TODO
    -                    return 'allowed'
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#concept-cors-check
    -                function corsCheck() {
    -                    // TODO
    -                    return 'success'
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#concept-tao-check
    -                function TAOCheck() {
    -                    // TODO
    -                    return 'success'
    -                }
    -
    -                function appendFetchMetadata(httpRequest) {
    -                    //  https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-dest-header
    -                    //  TODO
    -
    -                    //  https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-mode-header
    -
    -                    //  1. Assert: r’s url is a potentially trustworthy URL.
    -                    //  TODO
    -
    -                    //  2. Let header be a Structured Header whose value is a token.
    -                    let header = null
    -
    -                    //  3. Set header’s value to r’s mode.
    -                    header = httpRequest.mode
    -
    -                    //  4. Set a structured field value `Sec-Fetch-Mode`/header in r’s header list.
    -                    httpRequest.headersList.set('sec-fetch-mode', header)
    -
    -                    //  https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-site-header
    -                    //  TODO
    -
    -                    //  https://w3c.github.io/webappsec-fetch-metadata/#sec-fetch-user-header
    -                    //  TODO
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#append-a-request-origin-header
    -                function appendRequestOriginHeader(request) {
    -                    // 1. Let serializedOrigin be the result of byte-serializing a request origin with request.
    -                    let serializedOrigin = request.origin
    -
    -                    // 2. If request’s response tainting is "cors" or request’s mode is "websocket", then append (`Origin`, serializedOrigin) to request’s header list.
    -                    if (request.responseTainting === 'cors' || request.mode === 'websocket') {
    -                        if (serializedOrigin) {
    -                            request.headersList.append('origin', serializedOrigin)
    -                        }
    -
    -                        // 3. Otherwise, if request’s method is neither `GET` nor `HEAD`, then:
    -                    } else if (request.method !== 'GET' && request.method !== 'HEAD') {
    -                        // 1. Switch on request’s referrer policy:
    -                        switch (request.referrerPolicy) {
    -                            case 'no-referrer':
    -                                // Set serializedOrigin to `null`.
    -                                serializedOrigin = null
    -                                break
    -                            case 'no-referrer-when-downgrade':
    -                            case 'strict-origin':
    -                            case 'strict-origin-when-cross-origin':
    -                                // If request’s origin is a tuple origin, its scheme is "https", and request’s current URL’s scheme is not "https", then set serializedOrigin to `null`.
    -                                if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) {
    -                                    serializedOrigin = null
    -                                }
    -                                break
    -                            case 'same-origin':
    -                                // If request’s origin is not same origin with request’s current URL’s origin, then set serializedOrigin to `null`.
    -                                if (!sameOrigin(request, requestCurrentURL(request))) {
    -                                    serializedOrigin = null
    -                                }
    -                                break
    -                            default:
    -                            // Do nothing.
    -                        }
    -
    -                        if (serializedOrigin) {
    -                            // 2. Append (`Origin`, serializedOrigin) to request’s header list.
    -                            request.headersList.append('origin', serializedOrigin)
    -                        }
    -                    }
    -                }
    -
    -                function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) {
    -                    // TODO
    -                    return performance.now()
    -                }
    -
    -                // https://fetch.spec.whatwg.org/#create-an-opaque-timing-info
    -                function createOpaqueTimingInfo(timingInfo) {
    -                    return {
    -                        startTime: timingInfo.startTime ?? 0,
    -                        redirectStartTime: 0,
    -                        redirectEndTime: 0,
    -                        postRedirectStartTime: timingInfo.startTime ?? 0,
    -                        finalServiceWorkerStartTime: 0,
    -                        finalNetworkResponseStartTime: 0,
    -                        finalNetworkRequestStartTime: 0,
    -                        endTime: 0,
    -                        encodedBodySize: 0,
    -                        decodedBodySize: 0,
    -                        finalConnectionTimingInfo: null
    -                    }
    -                }
    -
    -                // https://html.spec.whatwg.org/multipage/origin.html#policy-container
    -                function makePolicyContainer() {
    -                    // Note: the fetch spec doesn't make use of embedder policy or CSP list
    -                    return {
    -                        referrerPolicy: 'strict-origin-when-cross-origin'
    -                    }
    -                }
    -
    -                // https://html.spec.whatwg.org/multipage/origin.html#clone-a-policy-container
    -                function clonePolicyContainer(policyContainer) {
    -                    return {
    -                        referrerPolicy: policyContainer.referrerPolicy
    -                    }
    -                }
    -
    -                // https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer
    -                function determineRequestsReferrer(request) {
    -                    // 1. Let policy be request's referrer policy.
    -                    const policy = request.referrerPolicy
    -
    -                    // Note: policy cannot (shouldn't) be null or an empty string.
    -                    assert(policy)
    -
    -                    // 2. Let environment be request’s client.
    -
    -                    let referrerSource = null
    -
    -                    // 3. Switch on request’s referrer:
    -                    if (request.referrer === 'client') {
    -                        // Note: node isn't a browser and doesn't implement document/iframes,
    -                        // so we bypass this step and replace it with our own.
    -
    -                        const globalOrigin = getGlobalOrigin()
    -
    -                        if (!globalOrigin || globalOrigin.origin === 'null') {
    -                            return 'no-referrer'
    -                        }
    -
    -                        // note: we need to clone it as it's mutated
    -                        referrerSource = new URL(globalOrigin)
    -                    } else if (request.referrer instanceof URL) {
    -                        // Let referrerSource be request’s referrer.
    -                        referrerSource = request.referrer
    -                    }
    -
    -                    // 4. Let request’s referrerURL be the result of stripping referrerSource for
    -                    //    use as a referrer.
    -                    let referrerURL = stripURLForReferrer(referrerSource)
    -
    -                    // 5. Let referrerOrigin be the result of stripping referrerSource for use as
    -                    //    a referrer, with the origin-only flag set to true.
    -                    const referrerOrigin = stripURLForReferrer(referrerSource, true)
    -
    -                    // 6. If the result of serializing referrerURL is a string whose length is
    -                    //    greater than 4096, set referrerURL to referrerOrigin.
    -                    if (referrerURL.toString().length > 4096) {
    -                        referrerURL = referrerOrigin
    -                    }
    -
    -                    const areSameOrigin = sameOrigin(request, referrerURL)
    -                    const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) &&
    -                        !isURLPotentiallyTrustworthy(request.url)
    -
    -                    // 8. Execute the switch statements corresponding to the value of policy:
    -                    switch (policy) {
    -                        case 'origin': return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true)
    -                        case 'unsafe-url': return referrerURL
    -                        case 'same-origin':
    -                            return areSameOrigin ? referrerOrigin : 'no-referrer'
    -                        case 'origin-when-cross-origin':
    -                            return areSameOrigin ? referrerURL : referrerOrigin
    -                        case 'strict-origin-when-cross-origin': {
    -                            const currentURL = requestCurrentURL(request)
    -
    -                            // 1. If the origin of referrerURL and the origin of request’s current
    -                            //    URL are the same, then return referrerURL.
    -                            if (sameOrigin(referrerURL, currentURL)) {
    -                                return referrerURL
    -                            }
    -
    -                            // 2. If referrerURL is a potentially trustworthy URL and request’s
    -                            //    current URL is not a potentially trustworthy URL, then return no
    -                            //    referrer.
    -                            if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) {
    -                                return 'no-referrer'
    -                            }
    -
    -                            // 3. Return referrerOrigin.
    -                            return referrerOrigin
    -                        }
    -                        case 'strict-origin': // eslint-disable-line
    -                        /**
    -                           * 1. If referrerURL is a potentially trustworthy URL and
    -                           * request’s current URL is not a potentially trustworthy URL,
    -                           * then return no referrer.
    -                           * 2. Return referrerOrigin
    -                          */
    -                        case 'no-referrer-when-downgrade': // eslint-disable-line
    -                        /**
    -                         * 1. If referrerURL is a potentially trustworthy URL and
    -                         * request’s current URL is not a potentially trustworthy URL,
    -                         * then return no referrer.
    -                         * 2. Return referrerOrigin
    -                        */
    -
    -                        default: // eslint-disable-line
    -                            return isNonPotentiallyTrustWorthy ? 'no-referrer' : referrerOrigin
    -                    }
    -                }
    -
    -                /**
    -                 * @see https://w3c.github.io/webappsec-referrer-policy/#strip-url
    -                 * @param {URL} url
    -                 * @param {boolean|undefined} originOnly
    -                 */
    -                function stripURLForReferrer(url, originOnly) {
    -                    // 1. Assert: url is a URL.
    -                    assert(url instanceof URL)
    -
    -                    // 2. If url’s scheme is a local scheme, then return no referrer.
    -                    if (url.protocol === 'file:' || url.protocol === 'about:' || url.protocol === 'blank:') {
    -                        return 'no-referrer'
    -                    }
    -
    -                    // 3. Set url’s username to the empty string.
    -                    url.username = ''
    -
    -                    // 4. Set url’s password to the empty string.
    -                    url.password = ''
    -
    -                    // 5. Set url’s fragment to null.
    -                    url.hash = ''
    -
    -                    // 6. If the origin-only flag is true, then:
    -                    if (originOnly) {
    -                        // 1. Set url’s path to « the empty string ».
    -                        url.pathname = ''
    -
    -                        // 2. Set url’s query to null.
    -                        url.search = ''
    -                    }
    -
    -                    // 7. Return url.
    -                    return url
    -                }
    -
    -                function isURLPotentiallyTrustworthy(url) {
    -                    if (!(url instanceof URL)) {
    -                        return false
    -                    }
    -
    -                    // If child of about, return true
    -                    if (url.href === 'about:blank' || url.href === 'about:srcdoc') {
    -                        return true
    -                    }
    -
    -                    // If scheme is data, return true
    -                    if (url.protocol === 'data:') return true
    -
    -                    // If file, return true
    -                    if (url.protocol === 'file:') return true
    -
    -                    return isOriginPotentiallyTrustworthy(url.origin)
    -
    -                    function isOriginPotentiallyTrustworthy(origin) {
    -                        // If origin is explicitly null, return false
    -                        if (origin == null || origin === 'null') return false
    -
    -                        const originAsURL = new URL(origin)
    -
    -                        // If secure, return true
    -                        if (originAsURL.protocol === 'https:' || originAsURL.protocol === 'wss:') {
    -                            return true
    -                        }
    -
    -                        // If localhost or variants, return true
    -                        if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) ||
    -                            (originAsURL.hostname === 'localhost' || originAsURL.hostname.includes('localhost.')) ||
    -                            (originAsURL.hostname.endsWith('.localhost'))) {
    -                            return true
    -                        }
    -
    -                        // If any other, return false
    -                        return false
    -                    }
    -                }
    -
    -                /**
    -                 * @see https://w3c.github.io/webappsec-subresource-integrity/#does-response-match-metadatalist
    -                 * @param {Uint8Array} bytes
    -                 * @param {string} metadataList
    -                 */
    -                function bytesMatch(bytes, metadataList) {
    -                    // If node is not built with OpenSSL support, we cannot check
    -                    // a request's integrity, so allow it by default (the spec will
    -                    // allow requests if an invalid hash is given, as precedence).
    -                    /* istanbul ignore if: only if node is built with --without-ssl */
    -                    if (crypto === undefined) {
    -                        return true
    -                    }
    -
    -                    // 1. Let parsedMetadata be the result of parsing metadataList.
    -                    const parsedMetadata = parseMetadata(metadataList)
    -
    -                    // 2. If parsedMetadata is no metadata, return true.
    -                    if (parsedMetadata === 'no metadata') {
    -                        return true
    -                    }
    -
    -                    // 3. If response is not eligible for integrity validation, return false.
    -                    // TODO
    -
    -                    // 4. If parsedMetadata is the empty set, return true.
    -                    if (parsedMetadata.length === 0) {
    -                        return true
    -                    }
    -
    -                    // 5. Let metadata be the result of getting the strongest
    -                    //    metadata from parsedMetadata.
    -                    const strongest = getStrongestMetadata(parsedMetadata)
    -                    const metadata = filterMetadataListByAlgorithm(parsedMetadata, strongest)
    -
    -                    // 6. For each item in metadata:
    -                    for (const item of metadata) {
    -                        // 1. Let algorithm be the alg component of item.
    -                        const algorithm = item.algo
    -
    -                        // 2. Let expectedValue be the val component of item.
    -                        const expectedValue = item.hash
    -
    -                        // See https://github.com/web-platform-tests/wpt/commit/e4c5cc7a5e48093220528dfdd1c4012dc3837a0e
    -                        // "be liberal with padding". This is annoying, and it's not even in the spec.
    -
    -                        // 3. Let actualValue be the result of applying algorithm to bytes.
    -                        let actualValue = crypto.createHash(algorithm).update(bytes).digest('base64')
    -
    -                        if (actualValue[actualValue.length - 1] === '=') {
    -                            if (actualValue[actualValue.length - 2] === '=') {
    -                                actualValue = actualValue.slice(0, -2)
    -                            } else {
    -                                actualValue = actualValue.slice(0, -1)
    -                            }
    -                        }
    -
    -                        // 4. If actualValue is a case-sensitive match for expectedValue,
    -                        //    return true.
    -                        if (compareBase64Mixed(actualValue, expectedValue)) {
    -                            return true
    -                        }
    -                    }
    -
    -                    // 7. Return false.
    -                    return false
    -                }
    -
    -                // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-hash-with-options
    -                // https://www.w3.org/TR/CSP2/#source-list-syntax
    -                // https://www.rfc-editor.org/rfc/rfc5234#appendix-B.1
    -                const parseHashWithOptions = /(?sha256|sha384|sha512)-((?[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i
    -
    -                /**
    -                 * @see https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata
    -                 * @param {string} metadata
    -                 */
    -                function parseMetadata(metadata) {
    -                    // 1. Let result be the empty set.
    -                    /** @type {{ algo: string, hash: string }[]} */
    -                    const result = []
    -
    -                    // 2. Let empty be equal to true.
    -                    let empty = true
    -
    -                    // 3. For each token returned by splitting metadata on spaces:
    -                    for (const token of metadata.split(' ')) {
    -                        // 1. Set empty to false.
    -                        empty = false
    -
    -                        // 2. Parse token as a hash-with-options.
    -                        const parsedToken = parseHashWithOptions.exec(token)
    -
    -                        // 3. If token does not parse, continue to the next token.
    -                        if (
    -                            parsedToken === null ||
    -                            parsedToken.groups === undefined ||
    -                            parsedToken.groups.algo === undefined
    -                        ) {
    -                            // Note: Chromium blocks the request at this point, but Firefox
    -                            // gives a warning that an invalid integrity was given. The
    -                            // correct behavior is to ignore these, and subsequently not
    -                            // check the integrity of the resource.
    -                            continue
    -                        }
    -
    -                        // 4. Let algorithm be the hash-algo component of token.
    -                        const algorithm = parsedToken.groups.algo.toLowerCase()
    -
    -                        // 5. If algorithm is a hash function recognized by the user
    -                        //    agent, add the parsed token to result.
    -                        if (supportedHashes.includes(algorithm)) {
    -                            result.push(parsedToken.groups)
    -                        }
    -                    }
    -
    -                    // 4. Return no metadata if empty is true, otherwise return result.
    -                    if (empty === true) {
    -                        return 'no metadata'
    -                    }
    -
    -                    return result
    -                }
    -
    -                /**
    -                 * @param {{ algo: 'sha256' | 'sha384' | 'sha512' }[]} metadataList
    -                 */
    -                function getStrongestMetadata(metadataList) {
    -                    // Let algorithm be the algo component of the first item in metadataList.
    -                    // Can be sha256
    -                    let algorithm = metadataList[0].algo
    -                    // If the algorithm is sha512, then it is the strongest
    -                    // and we can return immediately
    -                    if (algorithm[3] === '5') {
    -                        return algorithm
    -                    }
    -
    -                    for (let i = 1; i < metadataList.length; ++i) {
    -                        const metadata = metadataList[i]
    -                        // If the algorithm is sha512, then it is the strongest
    -                        // and we can break the loop immediately
    -                        if (metadata.algo[3] === '5') {
    -                            algorithm = 'sha512'
    -                            break
    -                            // If the algorithm is sha384, then a potential sha256 or sha384 is ignored
    -                        } else if (algorithm[3] === '3') {
    -                            continue
    -                            // algorithm is sha256, check if algorithm is sha384 and if so, set it as
    -                            // the strongest
    -                        } else if (metadata.algo[3] === '3') {
    -                            algorithm = 'sha384'
    -                        }
    -                    }
    -                    return algorithm
    -                }
    -
    -                function filterMetadataListByAlgorithm(metadataList, algorithm) {
    -                    if (metadataList.length === 1) {
    -                        return metadataList
    -                    }
    -
    -                    let pos = 0
    -                    for (let i = 0; i < metadataList.length; ++i) {
    -                        if (metadataList[i].algo === algorithm) {
    -                            metadataList[pos++] = metadataList[i]
    -                        }
    -                    }
    -
    -                    metadataList.length = pos
    -
    -                    return metadataList
    -                }
    -
    -                /**
    -                 * Compares two base64 strings, allowing for base64url
    -                 * in the second string.
    -                 *
    -                * @param {string} actualValue always base64
    -                 * @param {string} expectedValue base64 or base64url
    -                 * @returns {boolean}
    -                 */
    -                function compareBase64Mixed(actualValue, expectedValue) {
    -                    if (actualValue.length !== expectedValue.length) {
    -                        return false
    -                    }
    -                    for (let i = 0; i < actualValue.length; ++i) {
    -                        if (actualValue[i] !== expectedValue[i]) {
    -                            if (
    -                                (actualValue[i] === '+' && expectedValue[i] === '-') ||
    -                                (actualValue[i] === '/' && expectedValue[i] === '_')
    -                            ) {
    -                                continue
    -                            }
    -                            return false
    -                        }
    -                    }
    -
    -                    return true
    -                }
    -
    -                // https://w3c.github.io/webappsec-upgrade-insecure-requests/#upgrade-request
    -                function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) {
    -                    // TODO
    -                }
    -
    -                /**
    -                 * @link {https://html.spec.whatwg.org/multipage/origin.html#same-origin}
    -                 * @param {URL} A
    -                 * @param {URL} B
    -                 */
    -                function sameOrigin(A, B) {
    -                    // 1. If A and B are the same opaque origin, then return true.
    -                    if (A.origin === B.origin && A.origin === 'null') {
    -                        return true
    -                    }
    -
    -                    // 2. If A and B are both tuple origins and their schemes,
    -                    //    hosts, and port are identical, then return true.
    -                    if (A.protocol === B.protocol && A.hostname === B.hostname && A.port === B.port) {
    -                        return true
    -                    }
    -
    -                    // 3. Return false.
    -                    return false
    -                }
    -
    -                function createDeferredPromise() {
    -                    let res
    -                    let rej
    -                    const promise = new Promise((resolve, reject) => {
    -                        res = resolve
    -                        rej = reject
    -                    })
    -
    -                    return { promise, resolve: res, reject: rej }
    -                }
    -
    -                function isAborted(fetchParams) {
    -                    return fetchParams.controller.state === 'aborted'
    -                }
    -
    -                function isCancelled(fetchParams) {
    -                    return fetchParams.controller.state === 'aborted' ||
    -                        fetchParams.controller.state === 'terminated'
    -                }
    -
    -                const normalizeMethodRecord = {
    -                    delete: 'DELETE',
    -                    DELETE: 'DELETE',
    -                    get: 'GET',
    -                    GET: 'GET',
    -                    head: 'HEAD',
    -                    HEAD: 'HEAD',
    -                    options: 'OPTIONS',
    -                    OPTIONS: 'OPTIONS',
    -                    post: 'POST',
    -                    POST: 'POST',
    -                    put: 'PUT',
    -                    PUT: 'PUT'
    -                }
    -
    -                // Note: object prototypes should not be able to be referenced. e.g. `Object#hasOwnProperty`.
    -                Object.setPrototypeOf(normalizeMethodRecord, null)
    -
    -                /**
    -                 * @see https://fetch.spec.whatwg.org/#concept-method-normalize
    -                 * @param {string} method
    -                 */
    -                function normalizeMethod(method) {
    -                    return normalizeMethodRecord[method.toLowerCase()] ?? method
    -                }
    -
    -                // https://infra.spec.whatwg.org/#serialize-a-javascript-value-to-a-json-string
    -                function serializeJavascriptValueToJSONString(value) {
    -                    // 1. Let result be ? Call(%JSON.stringify%, undefined, « value »).
    -                    const result = JSON.stringify(value)
    -
    -                    // 2. If result is undefined, then throw a TypeError.
    -                    if (result === undefined) {
    -                        throw new TypeError('Value is not JSON serializable')
    -                    }
    -
    -                    // 3. Assert: result is a string.
    -                    assert(typeof result === 'string')
    -
    -                    // 4. Return result.
    -                    return result
    -                }
    -
    -                // https://tc39.es/ecma262/#sec-%25iteratorprototype%25-object
    -                const esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))
    -
    -                /**
    -                 * @see https://webidl.spec.whatwg.org/#dfn-iterator-prototype-object
    -                 * @param {() => unknown[]} iterator
    -                 * @param {string} name name of the instance
    -                 * @param {'key'|'value'|'key+value'} kind
    -                 */
    -                function makeIterator(iterator, name, kind) {
    -                    const object = {
    -                        index: 0,
    -                        kind,
    -                        target: iterator
    -                    }
    -
    -                    const i = {
    -                        next() {
    -                            // 1. Let interface be the interface for which the iterator prototype object exists.
    -
    -                            // 2. Let thisValue be the this value.
    -
    -                            // 3. Let object be ? ToObject(thisValue).
    -
    -                            // 4. If object is a platform object, then perform a security
    -                            //    check, passing:
    -
    -                            // 5. If object is not a default iterator object for interface,
    -                            //    then throw a TypeError.
    -                            if (Object.getPrototypeOf(this) !== i) {
    -                                throw new TypeError(
    -                                    `'next' called on an object that does not implement interface ${name} Iterator.`
    -                                )
    -                            }
    -
    -                            // 6. Let index be object’s index.
    -                            // 7. Let kind be object’s kind.
    -                            // 8. Let values be object’s target's value pairs to iterate over.
    -                            const { index, kind, target } = object
    -                            const values = target()
    -
    -                            // 9. Let len be the length of values.
    -                            const len = values.length
    -
    -                            // 10. If index is greater than or equal to len, then return
    -                            //     CreateIterResultObject(undefined, true).
    -                            if (index >= len) {
    -                                return { value: undefined, done: true }
    -                            }
    -
    -                            // 11. Let pair be the entry in values at index index.
    -                            const pair = values[index]
    -
    -                            // 12. Set object’s index to index + 1.
    -                            object.index = index + 1
    -
    -                            // 13. Return the iterator result for pair and kind.
    -                            return iteratorResult(pair, kind)
    -                        },
    -                        // The class string of an iterator prototype object for a given interface is the
    -                        // result of concatenating the identifier of the interface and the string " Iterator".
    -                        [Symbol.toStringTag]: `${name} Iterator`
    -                    }
    -
    -                    // The [[Prototype]] internal slot of an iterator prototype object must be %IteratorPrototype%.
    -                    Object.setPrototypeOf(i, esIteratorPrototype)
    -                    // esIteratorPrototype needs to be the prototype of i
    -                    // which is the prototype of an empty object. Yes, it's confusing.
    -                    return Object.setPrototypeOf({}, i)
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#iterator-result
    -                function iteratorResult(pair, kind) {
    -                    let result
    -
    -                    // 1. Let result be a value determined by the value of kind:
    -                    switch (kind) {
    -                        case 'key': {
    -                            // 1. Let idlKey be pair’s key.
    -                            // 2. Let key be the result of converting idlKey to an
    -                            //    ECMAScript value.
    -                            // 3. result is key.
    -                            result = pair[0]
    -                            break
    -                        }
    -                        case 'value': {
    -                            // 1. Let idlValue be pair’s value.
    -                            // 2. Let value be the result of converting idlValue to
    -                            //    an ECMAScript value.
    -                            // 3. result is value.
    -                            result = pair[1]
    -                            break
    -                        }
    -                        case 'key+value': {
    -                            // 1. Let idlKey be pair’s key.
    -                            // 2. Let idlValue be pair’s value.
    -                            // 3. Let key be the result of converting idlKey to an
    -                            //    ECMAScript value.
    -                            // 4. Let value be the result of converting idlValue to
    -                            //    an ECMAScript value.
    -                            // 5. Let array be ! ArrayCreate(2).
    -                            // 6. Call ! CreateDataProperty(array, "0", key).
    -                            // 7. Call ! CreateDataProperty(array, "1", value).
    -                            // 8. result is array.
    -                            result = pair
    -                            break
    -                        }
    -                    }
    -
    -                    // 2. Return CreateIterResultObject(result, false).
    -                    return { value: result, done: false }
    -                }
    -
    -                /**
    -                 * @see https://fetch.spec.whatwg.org/#body-fully-read
    -                 */
    -                async function fullyReadBody(body, processBody, processBodyError) {
    -                    // 1. If taskDestination is null, then set taskDestination to
    -                    //    the result of starting a new parallel queue.
    -
    -                    // 2. Let successSteps given a byte sequence bytes be to queue a
    -                    //    fetch task to run processBody given bytes, with taskDestination.
    -                    const successSteps = processBody
    -
    -                    // 3. Let errorSteps be to queue a fetch task to run processBodyError,
    -                    //    with taskDestination.
    -                    const errorSteps = processBodyError
    -
    -                    // 4. Let reader be the result of getting a reader for body’s stream.
    -                    //    If that threw an exception, then run errorSteps with that
    -                    //    exception and return.
    -                    let reader
    -
    -                    try {
    -                        reader = body.stream.getReader()
    -                    } catch (e) {
    -                        errorSteps(e)
    -                        return
    -                    }
    -
    -                    // 5. Read all bytes from reader, given successSteps and errorSteps.
    -                    try {
    -                        const result = await readAllBytes(reader)
    -                        successSteps(result)
    -                    } catch (e) {
    -                        errorSteps(e)
    -                    }
    -                }
    -
    -                /** @type {ReadableStream} */
    -                let ReadableStream = globalThis.ReadableStream
    -
    -                function isReadableStreamLike(stream) {
    -                    if (!ReadableStream) {
    -                        ReadableStream = (__nccwpck_require__(5356).ReadableStream)
    -                    }
    -
    -                    return stream instanceof ReadableStream || (
    -                        stream[Symbol.toStringTag] === 'ReadableStream' &&
    -                        typeof stream.tee === 'function'
    -                    )
    -                }
    -
    -                const MAXIMUM_ARGUMENT_LENGTH = 65535
    -
    -                /**
    -                 * @see https://infra.spec.whatwg.org/#isomorphic-decode
    -                 * @param {number[]|Uint8Array} input
    -                 */
    -                function isomorphicDecode(input) {
    -                    // 1. To isomorphic decode a byte sequence input, return a string whose code point
    -                    //    length is equal to input’s length and whose code points have the same values
    -                    //    as the values of input’s bytes, in the same order.
    -
    -                    if (input.length < MAXIMUM_ARGUMENT_LENGTH) {
    -                        return String.fromCharCode(...input)
    -                    }
    -
    -                    return input.reduce((previous, current) => previous + String.fromCharCode(current), '')
    -                }
    -
    -                /**
    -                 * @param {ReadableStreamController} controller
    -                 */
    -                function readableStreamClose(controller) {
    -                    try {
    -                        controller.close()
    -                    } catch (err) {
    -                        // TODO: add comment explaining why this error occurs.
    -                        if (!err.message.includes('Controller is already closed')) {
    -                            throw err
    -                        }
    -                    }
    -                }
    -
    -                /**
    -                 * @see https://infra.spec.whatwg.org/#isomorphic-encode
    -                 * @param {string} input
    -                 */
    -                function isomorphicEncode(input) {
    -                    // 1. Assert: input contains no code points greater than U+00FF.
    -                    for (let i = 0; i < input.length; i++) {
    -                        assert(input.charCodeAt(i) <= 0xFF)
    -                    }
    -
    -                    // 2. Return a byte sequence whose length is equal to input’s code
    -                    //    point length and whose bytes have the same values as the
    -                    //    values of input’s code points, in the same order
    -                    return input
    -                }
    -
    -                /**
    -                 * @see https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes
    -                 * @see https://streams.spec.whatwg.org/#read-loop
    -                 * @param {ReadableStreamDefaultReader} reader
    -                 */
    -                async function readAllBytes(reader) {
    -                    const bytes = []
    -                    let byteLength = 0
    -
    -                    while (true) {
    -                        const { done, value: chunk } = await reader.read()
    -
    -                        if (done) {
    -                            // 1. Call successSteps with bytes.
    -                            return Buffer.concat(bytes, byteLength)
    -                        }
    -
    -                        // 1. If chunk is not a Uint8Array object, call failureSteps
    -                        //    with a TypeError and abort these steps.
    -                        if (!isUint8Array(chunk)) {
    -                            throw new TypeError('Received non-Uint8Array chunk')
    -                        }
    -
    -                        // 2. Append the bytes represented by chunk to bytes.
    -                        bytes.push(chunk)
    -                        byteLength += chunk.length
    -
    -                        // 3. Read-loop given reader, bytes, successSteps, and failureSteps.
    -                    }
    -                }
    -
    -                /**
    -                 * @see https://fetch.spec.whatwg.org/#is-local
    -                 * @param {URL} url
    -                 */
    -                function urlIsLocal(url) {
    -                    assert('protocol' in url) // ensure it's a url object
    -
    -                    const protocol = url.protocol
    -
    -                    return protocol === 'about:' || protocol === 'blob:' || protocol === 'data:'
    -                }
    -
    -                /**
    -                 * @param {string|URL} url
    -                 */
    -                function urlHasHttpsScheme(url) {
    -                    if (typeof url === 'string') {
    -                        return url.startsWith('https:')
    -                    }
    -
    -                    return url.protocol === 'https:'
    -                }
    -
    -                /**
    -                 * @see https://fetch.spec.whatwg.org/#http-scheme
    -                 * @param {URL} url
    -                 */
    -                function urlIsHttpHttpsScheme(url) {
    -                    assert('protocol' in url) // ensure it's a url object
    -
    -                    const protocol = url.protocol
    -
    -                    return protocol === 'http:' || protocol === 'https:'
    -                }
    -
    -                /**
    -                 * Fetch supports node >= 16.8.0, but Object.hasOwn was added in v16.9.0.
    -                 */
    -                const hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key))
    -
    -                module.exports = {
    -                    isAborted,
    -                    isCancelled,
    -                    createDeferredPromise,
    -                    ReadableStreamFrom,
    -                    toUSVString,
    -                    tryUpgradeRequestToAPotentiallyTrustworthyURL,
    -                    coarsenedSharedCurrentTime,
    -                    determineRequestsReferrer,
    -                    makePolicyContainer,
    -                    clonePolicyContainer,
    -                    appendFetchMetadata,
    -                    appendRequestOriginHeader,
    -                    TAOCheck,
    -                    corsCheck,
    -                    crossOriginResourcePolicyCheck,
    -                    createOpaqueTimingInfo,
    -                    setRequestReferrerPolicyOnRedirect,
    -                    isValidHTTPToken,
    -                    requestBadPort,
    -                    requestCurrentURL,
    -                    responseURL,
    -                    responseLocationURL,
    -                    isBlobLike,
    -                    isURLPotentiallyTrustworthy,
    -                    isValidReasonPhrase,
    -                    sameOrigin,
    -                    normalizeMethod,
    -                    serializeJavascriptValueToJSONString,
    -                    makeIterator,
    -                    isValidHeaderName,
    -                    isValidHeaderValue,
    -                    hasOwn,
    -                    isErrorLike,
    -                    fullyReadBody,
    -                    bytesMatch,
    -                    isReadableStreamLike,
    -                    readableStreamClose,
    -                    isomorphicEncode,
    -                    isomorphicDecode,
    -                    urlIsLocal,
    -                    urlHasHttpsScheme,
    -                    urlIsHttpHttpsScheme,
    -                    readAllBytes,
    -                    normalizeMethodRecord,
    -                    parseMetadata
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 1744:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { types } = __nccwpck_require__(3837)
    -                const { hasOwn, toUSVString } = __nccwpck_require__(2538)
    -
    -                /** @type {import('../../types/webidl').Webidl} */
    -                const webidl = {}
    -                webidl.converters = {}
    -                webidl.util = {}
    -                webidl.errors = {}
    -
    -                webidl.errors.exception = function (message) {
    -                    return new TypeError(`${message.header}: ${message.message}`)
    -                }
    -
    -                webidl.errors.conversionFailed = function (context) {
    -                    const plural = context.types.length === 1 ? '' : ' one of'
    -                    const message =
    -                        `${context.argument} could not be converted to` +
    -                        `${plural}: ${context.types.join(', ')}.`
    -
    -                    return webidl.errors.exception({
    -                        header: context.prefix,
    -                        message
    -                    })
    -                }
    -
    -                webidl.errors.invalidArgument = function (context) {
    -                    return webidl.errors.exception({
    -                        header: context.prefix,
    -                        message: `"${context.value}" is an invalid ${context.type}.`
    -                    })
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#implements
    -                webidl.brandCheck = function (V, I, opts = undefined) {
    -                    if (opts?.strict !== false && !(V instanceof I)) {
    -                        throw new TypeError('Illegal invocation')
    -                    } else {
    -                        return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag]
    -                    }
    -                }
    -
    -                webidl.argumentLengthCheck = function ({ length }, min, ctx) {
    -                    if (length < min) {
    -                        throw webidl.errors.exception({
    -                            message: `${min} argument${min !== 1 ? 's' : ''} required, ` +
    -                                `but${length ? ' only' : ''} ${length} found.`,
    -                            ...ctx
    -                        })
    -                    }
    -                }
    -
    -                webidl.illegalConstructor = function () {
    -                    throw webidl.errors.exception({
    -                        header: 'TypeError',
    -                        message: 'Illegal constructor'
    -                    })
    -                }
    -
    -                // https://tc39.es/ecma262/#sec-ecmascript-data-types-and-values
    -                webidl.util.Type = function (V) {
    -                    switch (typeof V) {
    -                        case 'undefined': return 'Undefined'
    -                        case 'boolean': return 'Boolean'
    -                        case 'string': return 'String'
    -                        case 'symbol': return 'Symbol'
    -                        case 'number': return 'Number'
    -                        case 'bigint': return 'BigInt'
    -                        case 'function':
    -                        case 'object': {
    -                            if (V === null) {
    -                                return 'Null'
    -                            }
    -
    -                            return 'Object'
    -                        }
    -                    }
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#abstract-opdef-converttoint
    -                webidl.util.ConvertToInt = function (V, bitLength, signedness, opts = {}) {
    -                    let upperBound
    -                    let lowerBound
    -
    -                    // 1. If bitLength is 64, then:
    -                    if (bitLength === 64) {
    -                        // 1. Let upperBound be 2^53 − 1.
    -                        upperBound = Math.pow(2, 53) - 1
    -
    -                        // 2. If signedness is "unsigned", then let lowerBound be 0.
    -                        if (signedness === 'unsigned') {
    -                            lowerBound = 0
    -                        } else {
    -                            // 3. Otherwise let lowerBound be −2^53 + 1.
    -                            lowerBound = Math.pow(-2, 53) + 1
    -                        }
    -                    } else if (signedness === 'unsigned') {
    -                        // 2. Otherwise, if signedness is "unsigned", then:
    -
    -                        // 1. Let lowerBound be 0.
    -                        lowerBound = 0
    -
    -                        // 2. Let upperBound be 2^bitLength − 1.
    -                        upperBound = Math.pow(2, bitLength) - 1
    -                    } else {
    -                        // 3. Otherwise:
    -
    -                        // 1. Let lowerBound be -2^bitLength − 1.
    -                        lowerBound = Math.pow(-2, bitLength) - 1
    -
    -                        // 2. Let upperBound be 2^bitLength − 1 − 1.
    -                        upperBound = Math.pow(2, bitLength - 1) - 1
    -                    }
    -
    -                    // 4. Let x be ? ToNumber(V).
    -                    let x = Number(V)
    -
    -                    // 5. If x is −0, then set x to +0.
    -                    if (x === 0) {
    -                        x = 0
    -                    }
    -
    -                    // 6. If the conversion is to an IDL type associated
    -                    //    with the [EnforceRange] extended attribute, then:
    -                    if (opts.enforceRange === true) {
    -                        // 1. If x is NaN, +∞, or −∞, then throw a TypeError.
    -                        if (
    -                            Number.isNaN(x) ||
    -                            x === Number.POSITIVE_INFINITY ||
    -                            x === Number.NEGATIVE_INFINITY
    -                        ) {
    -                            throw webidl.errors.exception({
    -                                header: 'Integer conversion',
    -                                message: `Could not convert ${V} to an integer.`
    -                            })
    -                        }
    -
    -                        // 2. Set x to IntegerPart(x).
    -                        x = webidl.util.IntegerPart(x)
    -
    -                        // 3. If x < lowerBound or x > upperBound, then
    -                        //    throw a TypeError.
    -                        if (x < lowerBound || x > upperBound) {
    -                            throw webidl.errors.exception({
    -                                header: 'Integer conversion',
    -                                message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.`
    -                            })
    -                        }
    -
    -                        // 4. Return x.
    -                        return x
    -                    }
    -
    -                    // 7. If x is not NaN and the conversion is to an IDL
    -                    //    type associated with the [Clamp] extended
    -                    //    attribute, then:
    -                    if (!Number.isNaN(x) && opts.clamp === true) {
    -                        // 1. Set x to min(max(x, lowerBound), upperBound).
    -                        x = Math.min(Math.max(x, lowerBound), upperBound)
    -
    -                        // 2. Round x to the nearest integer, choosing the
    -                        //    even integer if it lies halfway between two,
    -                        //    and choosing +0 rather than −0.
    -                        if (Math.floor(x) % 2 === 0) {
    -                            x = Math.floor(x)
    -                        } else {
    -                            x = Math.ceil(x)
    -                        }
    -
    -                        // 3. Return x.
    -                        return x
    -                    }
    -
    -                    // 8. If x is NaN, +0, +∞, or −∞, then return +0.
    -                    if (
    -                        Number.isNaN(x) ||
    -                        (x === 0 && Object.is(0, x)) ||
    -                        x === Number.POSITIVE_INFINITY ||
    -                        x === Number.NEGATIVE_INFINITY
    -                    ) {
    -                        return 0
    -                    }
    -
    -                    // 9. Set x to IntegerPart(x).
    -                    x = webidl.util.IntegerPart(x)
    -
    -                    // 10. Set x to x modulo 2^bitLength.
    -                    x = x % Math.pow(2, bitLength)
    -
    -                    // 11. If signedness is "signed" and x ≥ 2^bitLength − 1,
    -                    //    then return x − 2^bitLength.
    -                    if (signedness === 'signed' && x >= Math.pow(2, bitLength) - 1) {
    -                        return x - Math.pow(2, bitLength)
    -                    }
    -
    -                    // 12. Otherwise, return x.
    -                    return x
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#abstract-opdef-integerpart
    -                webidl.util.IntegerPart = function (n) {
    -                    // 1. Let r be floor(abs(n)).
    -                    const r = Math.floor(Math.abs(n))
    -
    -                    // 2. If n < 0, then return -1 × r.
    -                    if (n < 0) {
    -                        return -1 * r
    -                    }
    -
    -                    // 3. Otherwise, return r.
    -                    return r
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#es-sequence
    -                webidl.sequenceConverter = function (converter) {
    -                    return (V) => {
    -                        // 1. If Type(V) is not Object, throw a TypeError.
    -                        if (webidl.util.Type(V) !== 'Object') {
    -                            throw webidl.errors.exception({
    -                                header: 'Sequence',
    -                                message: `Value of type ${webidl.util.Type(V)} is not an Object.`
    -                            })
    -                        }
    -
    -                        // 2. Let method be ? GetMethod(V, @@iterator).
    -                        /** @type {Generator} */
    -                        const method = V?.[Symbol.iterator]?.()
    -                        const seq = []
    -
    -                        // 3. If method is undefined, throw a TypeError.
    -                        if (
    -                            method === undefined ||
    -                            typeof method.next !== 'function'
    -                        ) {
    -                            throw webidl.errors.exception({
    -                                header: 'Sequence',
    -                                message: 'Object is not an iterator.'
    -                            })
    -                        }
    -
    -                        // https://webidl.spec.whatwg.org/#create-sequence-from-iterable
    -                        while (true) {
    -                            const { done, value } = method.next()
    -
    -                            if (done) {
    -                                break
    -                            }
    -
    -                            seq.push(converter(value))
    -                        }
    -
    -                        return seq
    -                    }
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#es-to-record
    -                webidl.recordConverter = function (keyConverter, valueConverter) {
    -                    return (O) => {
    -                        // 1. If Type(O) is not Object, throw a TypeError.
    -                        if (webidl.util.Type(O) !== 'Object') {
    -                            throw webidl.errors.exception({
    -                                header: 'Record',
    -                                message: `Value of type ${webidl.util.Type(O)} is not an Object.`
    -                            })
    -                        }
    -
    -                        // 2. Let result be a new empty instance of record.
    -                        const result = {}
    -
    -                        if (!types.isProxy(O)) {
    -                            // Object.keys only returns enumerable properties
    -                            const keys = Object.keys(O)
    -
    -                            for (const key of keys) {
    -                                // 1. Let typedKey be key converted to an IDL value of type K.
    -                                const typedKey = keyConverter(key)
    -
    -                                // 2. Let value be ? Get(O, key).
    -                                // 3. Let typedValue be value converted to an IDL value of type V.
    -                                const typedValue = valueConverter(O[key])
    -
    -                                // 4. Set result[typedKey] to typedValue.
    -                                result[typedKey] = typedValue
    -                            }
    -
    -                            // 5. Return result.
    -                            return result
    -                        }
    -
    -                        // 3. Let keys be ? O.[[OwnPropertyKeys]]().
    -                        const keys = Reflect.ownKeys(O)
    -
    -                        // 4. For each key of keys.
    -                        for (const key of keys) {
    -                            // 1. Let desc be ? O.[[GetOwnProperty]](key).
    -                            const desc = Reflect.getOwnPropertyDescriptor(O, key)
    -
    -                            // 2. If desc is not undefined and desc.[[Enumerable]] is true:
    -                            if (desc?.enumerable) {
    -                                // 1. Let typedKey be key converted to an IDL value of type K.
    -                                const typedKey = keyConverter(key)
    -
    -                                // 2. Let value be ? Get(O, key).
    -                                // 3. Let typedValue be value converted to an IDL value of type V.
    -                                const typedValue = valueConverter(O[key])
    -
    -                                // 4. Set result[typedKey] to typedValue.
    -                                result[typedKey] = typedValue
    -                            }
    -                        }
    -
    -                        // 5. Return result.
    -                        return result
    -                    }
    -                }
    -
    -                webidl.interfaceConverter = function (i) {
    -                    return (V, opts = {}) => {
    -                        if (opts.strict !== false && !(V instanceof i)) {
    -                            throw webidl.errors.exception({
    -                                header: i.name,
    -                                message: `Expected ${V} to be an instance of ${i.name}.`
    -                            })
    -                        }
    -
    -                        return V
    -                    }
    -                }
    -
    -                webidl.dictionaryConverter = function (converters) {
    -                    return (dictionary) => {
    -                        const type = webidl.util.Type(dictionary)
    -                        const dict = {}
    -
    -                        if (type === 'Null' || type === 'Undefined') {
    -                            return dict
    -                        } else if (type !== 'Object') {
    -                            throw webidl.errors.exception({
    -                                header: 'Dictionary',
    -                                message: `Expected ${dictionary} to be one of: Null, Undefined, Object.`
    -                            })
    -                        }
    -
    -                        for (const options of converters) {
    -                            const { key, defaultValue, required, converter } = options
    -
    -                            if (required === true) {
    -                                if (!hasOwn(dictionary, key)) {
    -                                    throw webidl.errors.exception({
    -                                        header: 'Dictionary',
    -                                        message: `Missing required key "${key}".`
    -                                    })
    -                                }
    -                            }
    -
    -                            let value = dictionary[key]
    -                            const hasDefault = hasOwn(options, 'defaultValue')
    -
    -                            // Only use defaultValue if value is undefined and
    -                            // a defaultValue options was provided.
    -                            if (hasDefault && value !== null) {
    -                                value = value ?? defaultValue
    -                            }
    -
    -                            // A key can be optional and have no default value.
    -                            // When this happens, do not perform a conversion,
    -                            // and do not assign the key a value.
    -                            if (required || hasDefault || value !== undefined) {
    -                                value = converter(value)
    -
    -                                if (
    -                                    options.allowedValues &&
    -                                    !options.allowedValues.includes(value)
    -                                ) {
    -                                    throw webidl.errors.exception({
    -                                        header: 'Dictionary',
    -                                        message: `${value} is not an accepted type. Expected one of ${options.allowedValues.join(', ')}.`
    -                                    })
    -                                }
    -
    -                                dict[key] = value
    -                            }
    -                        }
    -
    -                        return dict
    -                    }
    -                }
    -
    -                webidl.nullableConverter = function (converter) {
    -                    return (V) => {
    -                        if (V === null) {
    -                            return V
    -                        }
    -
    -                        return converter(V)
    -                    }
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#es-DOMString
    -                webidl.converters.DOMString = function (V, opts = {}) {
    -                    // 1. If V is null and the conversion is to an IDL type
    -                    //    associated with the [LegacyNullToEmptyString]
    -                    //    extended attribute, then return the DOMString value
    -                    //    that represents the empty string.
    -                    if (V === null && opts.legacyNullToEmptyString) {
    -                        return ''
    -                    }
    -
    -                    // 2. Let x be ? ToString(V).
    -                    if (typeof V === 'symbol') {
    -                        throw new TypeError('Could not convert argument of type symbol to string.')
    -                    }
    -
    -                    // 3. Return the IDL DOMString value that represents the
    -                    //    same sequence of code units as the one the
    -                    //    ECMAScript String value x represents.
    -                    return String(V)
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#es-ByteString
    -                webidl.converters.ByteString = function (V) {
    -                    // 1. Let x be ? ToString(V).
    -                    // Note: DOMString converter perform ? ToString(V)
    -                    const x = webidl.converters.DOMString(V)
    -
    -                    // 2. If the value of any element of x is greater than
    -                    //    255, then throw a TypeError.
    -                    for (let index = 0; index < x.length; index++) {
    -                        if (x.charCodeAt(index) > 255) {
    -                            throw new TypeError(
    -                                'Cannot convert argument to a ByteString because the character at ' +
    -                                `index ${index} has a value of ${x.charCodeAt(index)} which is greater than 255.`
    -                            )
    -                        }
    -                    }
    -
    -                    // 3. Return an IDL ByteString value whose length is the
    -                    //    length of x, and where the value of each element is
    -                    //    the value of the corresponding element of x.
    -                    return x
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#es-USVString
    -                webidl.converters.USVString = toUSVString
    -
    -                // https://webidl.spec.whatwg.org/#es-boolean
    -                webidl.converters.boolean = function (V) {
    -                    // 1. Let x be the result of computing ToBoolean(V).
    -                    const x = Boolean(V)
    -
    -                    // 2. Return the IDL boolean value that is the one that represents
    -                    //    the same truth value as the ECMAScript Boolean value x.
    -                    return x
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#es-any
    -                webidl.converters.any = function (V) {
    -                    return V
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#es-long-long
    -                webidl.converters['long long'] = function (V) {
    -                    // 1. Let x be ? ConvertToInt(V, 64, "signed").
    -                    const x = webidl.util.ConvertToInt(V, 64, 'signed')
    -
    -                    // 2. Return the IDL long long value that represents
    -                    //    the same numeric value as x.
    -                    return x
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#es-unsigned-long-long
    -                webidl.converters['unsigned long long'] = function (V) {
    -                    // 1. Let x be ? ConvertToInt(V, 64, "unsigned").
    -                    const x = webidl.util.ConvertToInt(V, 64, 'unsigned')
    -
    -                    // 2. Return the IDL unsigned long long value that
    -                    //    represents the same numeric value as x.
    -                    return x
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#es-unsigned-long
    -                webidl.converters['unsigned long'] = function (V) {
    -                    // 1. Let x be ? ConvertToInt(V, 32, "unsigned").
    -                    const x = webidl.util.ConvertToInt(V, 32, 'unsigned')
    -
    -                    // 2. Return the IDL unsigned long value that
    -                    //    represents the same numeric value as x.
    -                    return x
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#es-unsigned-short
    -                webidl.converters['unsigned short'] = function (V, opts) {
    -                    // 1. Let x be ? ConvertToInt(V, 16, "unsigned").
    -                    const x = webidl.util.ConvertToInt(V, 16, 'unsigned', opts)
    -
    -                    // 2. Return the IDL unsigned short value that represents
    -                    //    the same numeric value as x.
    -                    return x
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#idl-ArrayBuffer
    -                webidl.converters.ArrayBuffer = function (V, opts = {}) {
    -                    // 1. If Type(V) is not Object, or V does not have an
    -                    //    [[ArrayBufferData]] internal slot, then throw a
    -                    //    TypeError.
    -                    // see: https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-instances
    -                    // see: https://tc39.es/ecma262/#sec-properties-of-the-sharedarraybuffer-instances
    -                    if (
    -                        webidl.util.Type(V) !== 'Object' ||
    -                        !types.isAnyArrayBuffer(V)
    -                    ) {
    -                        throw webidl.errors.conversionFailed({
    -                            prefix: `${V}`,
    -                            argument: `${V}`,
    -                            types: ['ArrayBuffer']
    -                        })
    -                    }
    -
    -                    // 2. If the conversion is not to an IDL type associated
    -                    //    with the [AllowShared] extended attribute, and
    -                    //    IsSharedArrayBuffer(V) is true, then throw a
    -                    //    TypeError.
    -                    if (opts.allowShared === false && types.isSharedArrayBuffer(V)) {
    -                        throw webidl.errors.exception({
    -                            header: 'ArrayBuffer',
    -                            message: 'SharedArrayBuffer is not allowed.'
    -                        })
    -                    }
    -
    -                    // 3. If the conversion is not to an IDL type associated
    -                    //    with the [AllowResizable] extended attribute, and
    -                    //    IsResizableArrayBuffer(V) is true, then throw a
    -                    //    TypeError.
    -                    // Note: resizable ArrayBuffers are currently a proposal.
    -
    -                    // 4. Return the IDL ArrayBuffer value that is a
    -                    //    reference to the same object as V.
    -                    return V
    -                }
    -
    -                webidl.converters.TypedArray = function (V, T, opts = {}) {
    -                    // 1. Let T be the IDL type V is being converted to.
    -
    -                    // 2. If Type(V) is not Object, or V does not have a
    -                    //    [[TypedArrayName]] internal slot with a value
    -                    //    equal to T’s name, then throw a TypeError.
    -                    if (
    -                        webidl.util.Type(V) !== 'Object' ||
    -                        !types.isTypedArray(V) ||
    -                        V.constructor.name !== T.name
    -                    ) {
    -                        throw webidl.errors.conversionFailed({
    -                            prefix: `${T.name}`,
    -                            argument: `${V}`,
    -                            types: [T.name]
    -                        })
    -                    }
    -
    -                    // 3. If the conversion is not to an IDL type associated
    -                    //    with the [AllowShared] extended attribute, and
    -                    //    IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is
    -                    //    true, then throw a TypeError.
    -                    if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) {
    -                        throw webidl.errors.exception({
    -                            header: 'ArrayBuffer',
    -                            message: 'SharedArrayBuffer is not allowed.'
    -                        })
    -                    }
    -
    -                    // 4. If the conversion is not to an IDL type associated
    -                    //    with the [AllowResizable] extended attribute, and
    -                    //    IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is
    -                    //    true, then throw a TypeError.
    -                    // Note: resizable array buffers are currently a proposal
    -
    -                    // 5. Return the IDL value of type T that is a reference
    -                    //    to the same object as V.
    -                    return V
    -                }
    -
    -                webidl.converters.DataView = function (V, opts = {}) {
    -                    // 1. If Type(V) is not Object, or V does not have a
    -                    //    [[DataView]] internal slot, then throw a TypeError.
    -                    if (webidl.util.Type(V) !== 'Object' || !types.isDataView(V)) {
    -                        throw webidl.errors.exception({
    -                            header: 'DataView',
    -                            message: 'Object is not a DataView.'
    -                        })
    -                    }
    -
    -                    // 2. If the conversion is not to an IDL type associated
    -                    //    with the [AllowShared] extended attribute, and
    -                    //    IsSharedArrayBuffer(V.[[ViewedArrayBuffer]]) is true,
    -                    //    then throw a TypeError.
    -                    if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) {
    -                        throw webidl.errors.exception({
    -                            header: 'ArrayBuffer',
    -                            message: 'SharedArrayBuffer is not allowed.'
    -                        })
    -                    }
    -
    -                    // 3. If the conversion is not to an IDL type associated
    -                    //    with the [AllowResizable] extended attribute, and
    -                    //    IsResizableArrayBuffer(V.[[ViewedArrayBuffer]]) is
    -                    //    true, then throw a TypeError.
    -                    // Note: resizable ArrayBuffers are currently a proposal
    -
    -                    // 4. Return the IDL DataView value that is a reference
    -                    //    to the same object as V.
    -                    return V
    -                }
    -
    -                // https://webidl.spec.whatwg.org/#BufferSource
    -                webidl.converters.BufferSource = function (V, opts = {}) {
    -                    if (types.isAnyArrayBuffer(V)) {
    -                        return webidl.converters.ArrayBuffer(V, opts)
    -                    }
    -
    -                    if (types.isTypedArray(V)) {
    -                        return webidl.converters.TypedArray(V, V.constructor)
    -                    }
    -
    -                    if (types.isDataView(V)) {
    -                        return webidl.converters.DataView(V, opts)
    -                    }
    -
    -                    throw new TypeError(`Could not convert ${V} to a BufferSource.`)
    -                }
    -
    -                webidl.converters['sequence'] = webidl.sequenceConverter(
    -                    webidl.converters.ByteString
    -                )
    -
    -                webidl.converters['sequence>'] = webidl.sequenceConverter(
    -                    webidl.converters['sequence']
    -                )
    -
    -                webidl.converters['record'] = webidl.recordConverter(
    -                    webidl.converters.ByteString,
    -                    webidl.converters.ByteString
    -                )
    -
    -                module.exports = {
    -                    webidl
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 4854:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                /**
    -                 * @see https://encoding.spec.whatwg.org/#concept-encoding-get
    -                 * @param {string|undefined} label
    -                 */
    -                function getEncoding(label) {
    -                    if (!label) {
    -                        return 'failure'
    -                    }
    -
    -                    // 1. Remove any leading and trailing ASCII whitespace from label.
    -                    // 2. If label is an ASCII case-insensitive match for any of the
    -                    //    labels listed in the table below, then return the
    -                    //    corresponding encoding; otherwise return failure.
    -                    switch (label.trim().toLowerCase()) {
    -                        case 'unicode-1-1-utf-8':
    -                        case 'unicode11utf8':
    -                        case 'unicode20utf8':
    -                        case 'utf-8':
    -                        case 'utf8':
    -                        case 'x-unicode20utf8':
    -                            return 'UTF-8'
    -                        case '866':
    -                        case 'cp866':
    -                        case 'csibm866':
    -                        case 'ibm866':
    -                            return 'IBM866'
    -                        case 'csisolatin2':
    -                        case 'iso-8859-2':
    -                        case 'iso-ir-101':
    -                        case 'iso8859-2':
    -                        case 'iso88592':
    -                        case 'iso_8859-2':
    -                        case 'iso_8859-2:1987':
    -                        case 'l2':
    -                        case 'latin2':
    -                            return 'ISO-8859-2'
    -                        case 'csisolatin3':
    -                        case 'iso-8859-3':
    -                        case 'iso-ir-109':
    -                        case 'iso8859-3':
    -                        case 'iso88593':
    -                        case 'iso_8859-3':
    -                        case 'iso_8859-3:1988':
    -                        case 'l3':
    -                        case 'latin3':
    -                            return 'ISO-8859-3'
    -                        case 'csisolatin4':
    -                        case 'iso-8859-4':
    -                        case 'iso-ir-110':
    -                        case 'iso8859-4':
    -                        case 'iso88594':
    -                        case 'iso_8859-4':
    -                        case 'iso_8859-4:1988':
    -                        case 'l4':
    -                        case 'latin4':
    -                            return 'ISO-8859-4'
    -                        case 'csisolatincyrillic':
    -                        case 'cyrillic':
    -                        case 'iso-8859-5':
    -                        case 'iso-ir-144':
    -                        case 'iso8859-5':
    -                        case 'iso88595':
    -                        case 'iso_8859-5':
    -                        case 'iso_8859-5:1988':
    -                            return 'ISO-8859-5'
    -                        case 'arabic':
    -                        case 'asmo-708':
    -                        case 'csiso88596e':
    -                        case 'csiso88596i':
    -                        case 'csisolatinarabic':
    -                        case 'ecma-114':
    -                        case 'iso-8859-6':
    -                        case 'iso-8859-6-e':
    -                        case 'iso-8859-6-i':
    -                        case 'iso-ir-127':
    -                        case 'iso8859-6':
    -                        case 'iso88596':
    -                        case 'iso_8859-6':
    -                        case 'iso_8859-6:1987':
    -                            return 'ISO-8859-6'
    -                        case 'csisolatingreek':
    -                        case 'ecma-118':
    -                        case 'elot_928':
    -                        case 'greek':
    -                        case 'greek8':
    -                        case 'iso-8859-7':
    -                        case 'iso-ir-126':
    -                        case 'iso8859-7':
    -                        case 'iso88597':
    -                        case 'iso_8859-7':
    -                        case 'iso_8859-7:1987':
    -                        case 'sun_eu_greek':
    -                            return 'ISO-8859-7'
    -                        case 'csiso88598e':
    -                        case 'csisolatinhebrew':
    -                        case 'hebrew':
    -                        case 'iso-8859-8':
    -                        case 'iso-8859-8-e':
    -                        case 'iso-ir-138':
    -                        case 'iso8859-8':
    -                        case 'iso88598':
    -                        case 'iso_8859-8':
    -                        case 'iso_8859-8:1988':
    -                        case 'visual':
    -                            return 'ISO-8859-8'
    -                        case 'csiso88598i':
    -                        case 'iso-8859-8-i':
    -                        case 'logical':
    -                            return 'ISO-8859-8-I'
    -                        case 'csisolatin6':
    -                        case 'iso-8859-10':
    -                        case 'iso-ir-157':
    -                        case 'iso8859-10':
    -                        case 'iso885910':
    -                        case 'l6':
    -                        case 'latin6':
    -                            return 'ISO-8859-10'
    -                        case 'iso-8859-13':
    -                        case 'iso8859-13':
    -                        case 'iso885913':
    -                            return 'ISO-8859-13'
    -                        case 'iso-8859-14':
    -                        case 'iso8859-14':
    -                        case 'iso885914':
    -                            return 'ISO-8859-14'
    -                        case 'csisolatin9':
    -                        case 'iso-8859-15':
    -                        case 'iso8859-15':
    -                        case 'iso885915':
    -                        case 'iso_8859-15':
    -                        case 'l9':
    -                            return 'ISO-8859-15'
    -                        case 'iso-8859-16':
    -                            return 'ISO-8859-16'
    -                        case 'cskoi8r':
    -                        case 'koi':
    -                        case 'koi8':
    -                        case 'koi8-r':
    -                        case 'koi8_r':
    -                            return 'KOI8-R'
    -                        case 'koi8-ru':
    -                        case 'koi8-u':
    -                            return 'KOI8-U'
    -                        case 'csmacintosh':
    -                        case 'mac':
    -                        case 'macintosh':
    -                        case 'x-mac-roman':
    -                            return 'macintosh'
    -                        case 'iso-8859-11':
    -                        case 'iso8859-11':
    -                        case 'iso885911':
    -                        case 'tis-620':
    -                        case 'windows-874':
    -                            return 'windows-874'
    -                        case 'cp1250':
    -                        case 'windows-1250':
    -                        case 'x-cp1250':
    -                            return 'windows-1250'
    -                        case 'cp1251':
    -                        case 'windows-1251':
    -                        case 'x-cp1251':
    -                            return 'windows-1251'
    -                        case 'ansi_x3.4-1968':
    -                        case 'ascii':
    -                        case 'cp1252':
    -                        case 'cp819':
    -                        case 'csisolatin1':
    -                        case 'ibm819':
    -                        case 'iso-8859-1':
    -                        case 'iso-ir-100':
    -                        case 'iso8859-1':
    -                        case 'iso88591':
    -                        case 'iso_8859-1':
    -                        case 'iso_8859-1:1987':
    -                        case 'l1':
    -                        case 'latin1':
    -                        case 'us-ascii':
    -                        case 'windows-1252':
    -                        case 'x-cp1252':
    -                            return 'windows-1252'
    -                        case 'cp1253':
    -                        case 'windows-1253':
    -                        case 'x-cp1253':
    -                            return 'windows-1253'
    -                        case 'cp1254':
    -                        case 'csisolatin5':
    -                        case 'iso-8859-9':
    -                        case 'iso-ir-148':
    -                        case 'iso8859-9':
    -                        case 'iso88599':
    -                        case 'iso_8859-9':
    -                        case 'iso_8859-9:1989':
    -                        case 'l5':
    -                        case 'latin5':
    -                        case 'windows-1254':
    -                        case 'x-cp1254':
    -                            return 'windows-1254'
    -                        case 'cp1255':
    -                        case 'windows-1255':
    -                        case 'x-cp1255':
    -                            return 'windows-1255'
    -                        case 'cp1256':
    -                        case 'windows-1256':
    -                        case 'x-cp1256':
    -                            return 'windows-1256'
    -                        case 'cp1257':
    -                        case 'windows-1257':
    -                        case 'x-cp1257':
    -                            return 'windows-1257'
    -                        case 'cp1258':
    -                        case 'windows-1258':
    -                        case 'x-cp1258':
    -                            return 'windows-1258'
    -                        case 'x-mac-cyrillic':
    -                        case 'x-mac-ukrainian':
    -                            return 'x-mac-cyrillic'
    -                        case 'chinese':
    -                        case 'csgb2312':
    -                        case 'csiso58gb231280':
    -                        case 'gb2312':
    -                        case 'gb_2312':
    -                        case 'gb_2312-80':
    -                        case 'gbk':
    -                        case 'iso-ir-58':
    -                        case 'x-gbk':
    -                            return 'GBK'
    -                        case 'gb18030':
    -                            return 'gb18030'
    -                        case 'big5':
    -                        case 'big5-hkscs':
    -                        case 'cn-big5':
    -                        case 'csbig5':
    -                        case 'x-x-big5':
    -                            return 'Big5'
    -                        case 'cseucpkdfmtjapanese':
    -                        case 'euc-jp':
    -                        case 'x-euc-jp':
    -                            return 'EUC-JP'
    -                        case 'csiso2022jp':
    -                        case 'iso-2022-jp':
    -                            return 'ISO-2022-JP'
    -                        case 'csshiftjis':
    -                        case 'ms932':
    -                        case 'ms_kanji':
    -                        case 'shift-jis':
    -                        case 'shift_jis':
    -                        case 'sjis':
    -                        case 'windows-31j':
    -                        case 'x-sjis':
    -                            return 'Shift_JIS'
    -                        case 'cseuckr':
    -                        case 'csksc56011987':
    -                        case 'euc-kr':
    -                        case 'iso-ir-149':
    -                        case 'korean':
    -                        case 'ks_c_5601-1987':
    -                        case 'ks_c_5601-1989':
    -                        case 'ksc5601':
    -                        case 'ksc_5601':
    -                        case 'windows-949':
    -                            return 'EUC-KR'
    -                        case 'csiso2022kr':
    -                        case 'hz-gb-2312':
    -                        case 'iso-2022-cn':
    -                        case 'iso-2022-cn-ext':
    -                        case 'iso-2022-kr':
    -                        case 'replacement':
    -                            return 'replacement'
    -                        case 'unicodefffe':
    -                        case 'utf-16be':
    -                            return 'UTF-16BE'
    -                        case 'csunicode':
    -                        case 'iso-10646-ucs-2':
    -                        case 'ucs-2':
    -                        case 'unicode':
    -                        case 'unicodefeff':
    -                        case 'utf-16':
    -                        case 'utf-16le':
    -                            return 'UTF-16LE'
    -                        case 'x-user-defined':
    -                            return 'x-user-defined'
    -                        default: return 'failure'
    -                    }
    -                }
    -
    -                module.exports = {
    -                    getEncoding
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 1446:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const {
    -                    staticPropertyDescriptors,
    -                    readOperation,
    -                    fireAProgressEvent
    -                } = __nccwpck_require__(7530)
    -                const {
    -                    kState,
    -                    kError,
    -                    kResult,
    -                    kEvents,
    -                    kAborted
    -                } = __nccwpck_require__(9054)
    -                const { webidl } = __nccwpck_require__(1744)
    -                const { kEnumerableProperty } = __nccwpck_require__(3983)
    -
    -                class FileReader extends EventTarget {
    -                    constructor() {
    -                        super()
    -
    -                        this[kState] = 'empty'
    -                        this[kResult] = null
    -                        this[kError] = null
    -                        this[kEvents] = {
    -                            loadend: null,
    -                            error: null,
    -                            abort: null,
    -                            load: null,
    -                            progress: null,
    -                            loadstart: null
    -                        }
    -                    }
    -
    -                    /**
    -                     * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer
    -                     * @param {import('buffer').Blob} blob
    -                     */
    -                    readAsArrayBuffer(blob) {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsArrayBuffer' })
    -
    -                        blob = webidl.converters.Blob(blob, { strict: false })
    -
    -                        // The readAsArrayBuffer(blob) method, when invoked,
    -                        // must initiate a read operation for blob with ArrayBuffer.
    -                        readOperation(this, blob, 'ArrayBuffer')
    -                    }
    -
    -                    /**
    -                     * @see https://w3c.github.io/FileAPI/#readAsBinaryString
    -                     * @param {import('buffer').Blob} blob
    -                     */
    -                    readAsBinaryString(blob) {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsBinaryString' })
    -
    -                        blob = webidl.converters.Blob(blob, { strict: false })
    -
    -                        // The readAsBinaryString(blob) method, when invoked,
    -                        // must initiate a read operation for blob with BinaryString.
    -                        readOperation(this, blob, 'BinaryString')
    -                    }
    -
    -                    /**
    -                     * @see https://w3c.github.io/FileAPI/#readAsDataText
    -                     * @param {import('buffer').Blob} blob
    -                     * @param {string?} encoding
    -                     */
    -                    readAsText(blob, encoding = undefined) {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsText' })
    -
    -                        blob = webidl.converters.Blob(blob, { strict: false })
    -
    -                        if (encoding !== undefined) {
    -                            encoding = webidl.converters.DOMString(encoding)
    -                        }
    -
    -                        // The readAsText(blob, encoding) method, when invoked,
    -                        // must initiate a read operation for blob with Text and encoding.
    -                        readOperation(this, blob, 'Text', encoding)
    -                    }
    -
    -                    /**
    -                     * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL
    -                     * @param {import('buffer').Blob} blob
    -                     */
    -                    readAsDataURL(blob) {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'FileReader.readAsDataURL' })
    -
    -                        blob = webidl.converters.Blob(blob, { strict: false })
    -
    -                        // The readAsDataURL(blob) method, when invoked, must
    -                        // initiate a read operation for blob with DataURL.
    -                        readOperation(this, blob, 'DataURL')
    -                    }
    -
    -                    /**
    -                     * @see https://w3c.github.io/FileAPI/#dfn-abort
    -                     */
    -                    abort() {
    -                        // 1. If this's state is "empty" or if this's state is
    -                        //    "done" set this's result to null and terminate
    -                        //    this algorithm.
    -                        if (this[kState] === 'empty' || this[kState] === 'done') {
    -                            this[kResult] = null
    -                            return
    -                        }
    -
    -                        // 2. If this's state is "loading" set this's state to
    -                        //    "done" and set this's result to null.
    -                        if (this[kState] === 'loading') {
    -                            this[kState] = 'done'
    -                            this[kResult] = null
    -                        }
    -
    -                        // 3. If there are any tasks from this on the file reading
    -                        //    task source in an affiliated task queue, then remove
    -                        //    those tasks from that task queue.
    -                        this[kAborted] = true
    -
    -                        // 4. Terminate the algorithm for the read method being processed.
    -                        // TODO
    -
    -                        // 5. Fire a progress event called abort at this.
    -                        fireAProgressEvent('abort', this)
    -
    -                        // 6. If this's state is not "loading", fire a progress
    -                        //    event called loadend at this.
    -                        if (this[kState] !== 'loading') {
    -                            fireAProgressEvent('loadend', this)
    -                        }
    -                    }
    -
    -                    /**
    -                     * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate
    -                     */
    -                    get readyState() {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        switch (this[kState]) {
    -                            case 'empty': return this.EMPTY
    -                            case 'loading': return this.LOADING
    -                            case 'done': return this.DONE
    -                        }
    -                    }
    -
    -                    /**
    -                     * @see https://w3c.github.io/FileAPI/#dom-filereader-result
    -                     */
    -                    get result() {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        // The result attribute’s getter, when invoked, must return
    -                        // this's result.
    -                        return this[kResult]
    -                    }
    -
    -                    /**
    -                     * @see https://w3c.github.io/FileAPI/#dom-filereader-error
    -                     */
    -                    get error() {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        // The error attribute’s getter, when invoked, must return
    -                        // this's error.
    -                        return this[kError]
    -                    }
    -
    -                    get onloadend() {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        return this[kEvents].loadend
    -                    }
    -
    -                    set onloadend(fn) {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        if (this[kEvents].loadend) {
    -                            this.removeEventListener('loadend', this[kEvents].loadend)
    -                        }
    -
    -                        if (typeof fn === 'function') {
    -                            this[kEvents].loadend = fn
    -                            this.addEventListener('loadend', fn)
    -                        } else {
    -                            this[kEvents].loadend = null
    -                        }
    -                    }
    -
    -                    get onerror() {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        return this[kEvents].error
    -                    }
    -
    -                    set onerror(fn) {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        if (this[kEvents].error) {
    -                            this.removeEventListener('error', this[kEvents].error)
    -                        }
    -
    -                        if (typeof fn === 'function') {
    -                            this[kEvents].error = fn
    -                            this.addEventListener('error', fn)
    -                        } else {
    -                            this[kEvents].error = null
    -                        }
    -                    }
    -
    -                    get onloadstart() {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        return this[kEvents].loadstart
    -                    }
    -
    -                    set onloadstart(fn) {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        if (this[kEvents].loadstart) {
    -                            this.removeEventListener('loadstart', this[kEvents].loadstart)
    -                        }
    -
    -                        if (typeof fn === 'function') {
    -                            this[kEvents].loadstart = fn
    -                            this.addEventListener('loadstart', fn)
    -                        } else {
    -                            this[kEvents].loadstart = null
    -                        }
    -                    }
    -
    -                    get onprogress() {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        return this[kEvents].progress
    -                    }
    -
    -                    set onprogress(fn) {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        if (this[kEvents].progress) {
    -                            this.removeEventListener('progress', this[kEvents].progress)
    -                        }
    -
    -                        if (typeof fn === 'function') {
    -                            this[kEvents].progress = fn
    -                            this.addEventListener('progress', fn)
    -                        } else {
    -                            this[kEvents].progress = null
    -                        }
    -                    }
    -
    -                    get onload() {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        return this[kEvents].load
    -                    }
    -
    -                    set onload(fn) {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        if (this[kEvents].load) {
    -                            this.removeEventListener('load', this[kEvents].load)
    -                        }
    -
    -                        if (typeof fn === 'function') {
    -                            this[kEvents].load = fn
    -                            this.addEventListener('load', fn)
    -                        } else {
    -                            this[kEvents].load = null
    -                        }
    -                    }
    -
    -                    get onabort() {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        return this[kEvents].abort
    -                    }
    -
    -                    set onabort(fn) {
    -                        webidl.brandCheck(this, FileReader)
    -
    -                        if (this[kEvents].abort) {
    -                            this.removeEventListener('abort', this[kEvents].abort)
    -                        }
    -
    -                        if (typeof fn === 'function') {
    -                            this[kEvents].abort = fn
    -                            this.addEventListener('abort', fn)
    -                        } else {
    -                            this[kEvents].abort = null
    -                        }
    -                    }
    -                }
    -
    -                // https://w3c.github.io/FileAPI/#dom-filereader-empty
    -                FileReader.EMPTY = FileReader.prototype.EMPTY = 0
    -                // https://w3c.github.io/FileAPI/#dom-filereader-loading
    -                FileReader.LOADING = FileReader.prototype.LOADING = 1
    -                // https://w3c.github.io/FileAPI/#dom-filereader-done
    -                FileReader.DONE = FileReader.prototype.DONE = 2
    -
    -                Object.defineProperties(FileReader.prototype, {
    -                    EMPTY: staticPropertyDescriptors,
    -                    LOADING: staticPropertyDescriptors,
    -                    DONE: staticPropertyDescriptors,
    -                    readAsArrayBuffer: kEnumerableProperty,
    -                    readAsBinaryString: kEnumerableProperty,
    -                    readAsText: kEnumerableProperty,
    -                    readAsDataURL: kEnumerableProperty,
    -                    abort: kEnumerableProperty,
    -                    readyState: kEnumerableProperty,
    -                    result: kEnumerableProperty,
    -                    error: kEnumerableProperty,
    -                    onloadstart: kEnumerableProperty,
    -                    onprogress: kEnumerableProperty,
    -                    onload: kEnumerableProperty,
    -                    onabort: kEnumerableProperty,
    -                    onerror: kEnumerableProperty,
    -                    onloadend: kEnumerableProperty,
    -                    [Symbol.toStringTag]: {
    -                        value: 'FileReader',
    -                        writable: false,
    -                        enumerable: false,
    -                        configurable: true
    -                    }
    -                })
    -
    -                Object.defineProperties(FileReader, {
    -                    EMPTY: staticPropertyDescriptors,
    -                    LOADING: staticPropertyDescriptors,
    -                    DONE: staticPropertyDescriptors
    -                })
    -
    -                module.exports = {
    -                    FileReader
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 5504:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { webidl } = __nccwpck_require__(1744)
    -
    -                const kState = Symbol('ProgressEvent state')
    -
    -                /**
    -                 * @see https://xhr.spec.whatwg.org/#progressevent
    -                 */
    -                class ProgressEvent extends Event {
    -                    constructor(type, eventInitDict = {}) {
    -                        type = webidl.converters.DOMString(type)
    -                        eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {})
    -
    -                        super(type, eventInitDict)
    -
    -                        this[kState] = {
    -                            lengthComputable: eventInitDict.lengthComputable,
    -                            loaded: eventInitDict.loaded,
    -                            total: eventInitDict.total
    -                        }
    -                    }
    -
    -                    get lengthComputable() {
    -                        webidl.brandCheck(this, ProgressEvent)
    -
    -                        return this[kState].lengthComputable
    -                    }
    -
    -                    get loaded() {
    -                        webidl.brandCheck(this, ProgressEvent)
    -
    -                        return this[kState].loaded
    -                    }
    -
    -                    get total() {
    -                        webidl.brandCheck(this, ProgressEvent)
    -
    -                        return this[kState].total
    -                    }
    -                }
    -
    -                webidl.converters.ProgressEventInit = webidl.dictionaryConverter([
    -                    {
    -                        key: 'lengthComputable',
    -                        converter: webidl.converters.boolean,
    -                        defaultValue: false
    -                    },
    -                    {
    -                        key: 'loaded',
    -                        converter: webidl.converters['unsigned long long'],
    -                        defaultValue: 0
    -                    },
    -                    {
    -                        key: 'total',
    -                        converter: webidl.converters['unsigned long long'],
    -                        defaultValue: 0
    -                    },
    -                    {
    -                        key: 'bubbles',
    -                        converter: webidl.converters.boolean,
    -                        defaultValue: false
    -                    },
    -                    {
    -                        key: 'cancelable',
    -                        converter: webidl.converters.boolean,
    -                        defaultValue: false
    -                    },
    -                    {
    -                        key: 'composed',
    -                        converter: webidl.converters.boolean,
    -                        defaultValue: false
    -                    }
    -                ])
    -
    -                module.exports = {
    -                    ProgressEvent
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 9054:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                module.exports = {
    -                    kState: Symbol('FileReader state'),
    -                    kResult: Symbol('FileReader result'),
    -                    kError: Symbol('FileReader error'),
    -                    kLastProgressEventFired: Symbol('FileReader last progress event fired timestamp'),
    -                    kEvents: Symbol('FileReader events'),
    -                    kAborted: Symbol('FileReader aborted')
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 7530:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const {
    -                    kState,
    -                    kError,
    -                    kResult,
    -                    kAborted,
    -                    kLastProgressEventFired
    -                } = __nccwpck_require__(9054)
    -                const { ProgressEvent } = __nccwpck_require__(5504)
    -                const { getEncoding } = __nccwpck_require__(4854)
    -                const { DOMException } = __nccwpck_require__(1037)
    -                const { serializeAMimeType, parseMIMEType } = __nccwpck_require__(685)
    -                const { types } = __nccwpck_require__(3837)
    -                const { StringDecoder } = __nccwpck_require__(1576)
    -                const { btoa } = __nccwpck_require__(4300)
    -
    -                /** @type {PropertyDescriptor} */
    -                const staticPropertyDescriptors = {
    -                    enumerable: true,
    -                    writable: false,
    -                    configurable: false
    -                }
    -
    -                /**
    -                 * @see https://w3c.github.io/FileAPI/#readOperation
    -                 * @param {import('./filereader').FileReader} fr
    -                 * @param {import('buffer').Blob} blob
    -                 * @param {string} type
    -                 * @param {string?} encodingName
    -                 */
    -                function readOperation(fr, blob, type, encodingName) {
    -                    // 1. If fr’s state is "loading", throw an InvalidStateError
    -                    //    DOMException.
    -                    if (fr[kState] === 'loading') {
    -                        throw new DOMException('Invalid state', 'InvalidStateError')
    -                    }
    -
    -                    // 2. Set fr’s state to "loading".
    -                    fr[kState] = 'loading'
    -
    -                    // 3. Set fr’s result to null.
    -                    fr[kResult] = null
    -
    -                    // 4. Set fr’s error to null.
    -                    fr[kError] = null
    -
    -                    // 5. Let stream be the result of calling get stream on blob.
    -                    /** @type {import('stream/web').ReadableStream} */
    -                    const stream = blob.stream()
    -
    -                    // 6. Let reader be the result of getting a reader from stream.
    -                    const reader = stream.getReader()
    -
    -                    // 7. Let bytes be an empty byte sequence.
    -                    /** @type {Uint8Array[]} */
    -                    const bytes = []
    -
    -                    // 8. Let chunkPromise be the result of reading a chunk from
    -                    //    stream with reader.
    -                    let chunkPromise = reader.read()
    -
    -                    // 9. Let isFirstChunk be true.
    -                    let isFirstChunk = true
    -
    -                        // 10. In parallel, while true:
    -                        // Note: "In parallel" just means non-blocking
    -                        // Note 2: readOperation itself cannot be async as double
    -                        // reading the body would then reject the promise, instead
    -                        // of throwing an error.
    -                        ; (async () => {
    -                            while (!fr[kAborted]) {
    -                                // 1. Wait for chunkPromise to be fulfilled or rejected.
    -                                try {
    -                                    const { done, value } = await chunkPromise
    -
    -                                    // 2. If chunkPromise is fulfilled, and isFirstChunk is
    -                                    //    true, queue a task to fire a progress event called
    -                                    //    loadstart at fr.
    -                                    if (isFirstChunk && !fr[kAborted]) {
    -                                        queueMicrotask(() => {
    -                                            fireAProgressEvent('loadstart', fr)
    -                                        })
    -                                    }
    -
    -                                    // 3. Set isFirstChunk to false.
    -                                    isFirstChunk = false
    -
    -                                    // 4. If chunkPromise is fulfilled with an object whose
    -                                    //    done property is false and whose value property is
    -                                    //    a Uint8Array object, run these steps:
    -                                    if (!done && types.isUint8Array(value)) {
    -                                        // 1. Let bs be the byte sequence represented by the
    -                                        //    Uint8Array object.
    -
    -                                        // 2. Append bs to bytes.
    -                                        bytes.push(value)
    -
    -                                        // 3. If roughly 50ms have passed since these steps
    -                                        //    were last invoked, queue a task to fire a
    -                                        //    progress event called progress at fr.
    -                                        if (
    -                                            (
    -                                                fr[kLastProgressEventFired] === undefined ||
    -                                                Date.now() - fr[kLastProgressEventFired] >= 50
    -                                            ) &&
    -                                            !fr[kAborted]
    -                                        ) {
    -                                            fr[kLastProgressEventFired] = Date.now()
    -                                            queueMicrotask(() => {
    -                                                fireAProgressEvent('progress', fr)
    -                                            })
    -                                        }
    -
    -                                        // 4. Set chunkPromise to the result of reading a
    -                                        //    chunk from stream with reader.
    -                                        chunkPromise = reader.read()
    -                                    } else if (done) {
    -                                        // 5. Otherwise, if chunkPromise is fulfilled with an
    -                                        //    object whose done property is true, queue a task
    -                                        //    to run the following steps and abort this algorithm:
    -                                        queueMicrotask(() => {
    -                                            // 1. Set fr’s state to "done".
    -                                            fr[kState] = 'done'
    -
    -                                            // 2. Let result be the result of package data given
    -                                            //    bytes, type, blob’s type, and encodingName.
    -                                            try {
    -                                                const result = packageData(bytes, type, blob.type, encodingName)
    -
    -                                                // 4. Else:
    -
    -                                                if (fr[kAborted]) {
    -                                                    return
    -                                                }
    -
    -                                                // 1. Set fr’s result to result.
    -                                                fr[kResult] = result
    -
    -                                                // 2. Fire a progress event called load at the fr.
    -                                                fireAProgressEvent('load', fr)
    -                                            } catch (error) {
    -                                                // 3. If package data threw an exception error:
    -
    -                                                // 1. Set fr’s error to error.
    -                                                fr[kError] = error
    -
    -                                                // 2. Fire a progress event called error at fr.
    -                                                fireAProgressEvent('error', fr)
    -                                            }
    -
    -                                            // 5. If fr’s state is not "loading", fire a progress
    -                                            //    event called loadend at the fr.
    -                                            if (fr[kState] !== 'loading') {
    -                                                fireAProgressEvent('loadend', fr)
    -                                            }
    -                                        })
    -
    -                                        break
    -                                    }
    -                                } catch (error) {
    -                                    if (fr[kAborted]) {
    -                                        return
    -                                    }
    -
    -                                    // 6. Otherwise, if chunkPromise is rejected with an
    -                                    //    error error, queue a task to run the following
    -                                    //    steps and abort this algorithm:
    -                                    queueMicrotask(() => {
    -                                        // 1. Set fr’s state to "done".
    -                                        fr[kState] = 'done'
    -
    -                                        // 2. Set fr’s error to error.
    -                                        fr[kError] = error
    -
    -                                        // 3. Fire a progress event called error at fr.
    -                                        fireAProgressEvent('error', fr)
    -
    -                                        // 4. If fr’s state is not "loading", fire a progress
    -                                        //    event called loadend at fr.
    -                                        if (fr[kState] !== 'loading') {
    -                                            fireAProgressEvent('loadend', fr)
    -                                        }
    -                                    })
    -
    -                                    break
    -                                }
    -                            }
    -                        })()
    -                }
    -
    -                /**
    -                 * @see https://w3c.github.io/FileAPI/#fire-a-progress-event
    -                 * @see https://dom.spec.whatwg.org/#concept-event-fire
    -                 * @param {string} e The name of the event
    -                 * @param {import('./filereader').FileReader} reader
    -                 */
    -                function fireAProgressEvent(e, reader) {
    -                    // The progress event e does not bubble. e.bubbles must be false
    -                    // The progress event e is NOT cancelable. e.cancelable must be false
    -                    const event = new ProgressEvent(e, {
    -                        bubbles: false,
    -                        cancelable: false
    -                    })
    -
    -                    reader.dispatchEvent(event)
    -                }
    -
    -                /**
    -                 * @see https://w3c.github.io/FileAPI/#blob-package-data
    -                 * @param {Uint8Array[]} bytes
    -                 * @param {string} type
    -                 * @param {string?} mimeType
    -                 * @param {string?} encodingName
    -                 */
    -                function packageData(bytes, type, mimeType, encodingName) {
    -                    // 1. A Blob has an associated package data algorithm, given
    -                    //    bytes, a type, a optional mimeType, and a optional
    -                    //    encodingName, which switches on type and runs the
    -                    //    associated steps:
    -
    -                    switch (type) {
    -                        case 'DataURL': {
    -                            // 1. Return bytes as a DataURL [RFC2397] subject to
    -                            //    the considerations below:
    -                            //  * Use mimeType as part of the Data URL if it is
    -                            //    available in keeping with the Data URL
    -                            //    specification [RFC2397].
    -                            //  * If mimeType is not available return a Data URL
    -                            //    without a media-type. [RFC2397].
    -
    -                            // https://datatracker.ietf.org/doc/html/rfc2397#section-3
    -                            // dataurl    := "data:" [ mediatype ] [ ";base64" ] "," data
    -                            // mediatype  := [ type "/" subtype ] *( ";" parameter )
    -                            // data       := *urlchar
    -                            // parameter  := attribute "=" value
    -                            let dataURL = 'data:'
    -
    -                            const parsed = parseMIMEType(mimeType || 'application/octet-stream')
    -
    -                            if (parsed !== 'failure') {
    -                                dataURL += serializeAMimeType(parsed)
    -                            }
    -
    -                            dataURL += ';base64,'
    -
    -                            const decoder = new StringDecoder('latin1')
    -
    -                            for (const chunk of bytes) {
    -                                dataURL += btoa(decoder.write(chunk))
    -                            }
    -
    -                            dataURL += btoa(decoder.end())
    -
    -                            return dataURL
    -                        }
    -                        case 'Text': {
    -                            // 1. Let encoding be failure
    -                            let encoding = 'failure'
    -
    -                            // 2. If the encodingName is present, set encoding to the
    -                            //    result of getting an encoding from encodingName.
    -                            if (encodingName) {
    -                                encoding = getEncoding(encodingName)
    -                            }
    -
    -                            // 3. If encoding is failure, and mimeType is present:
    -                            if (encoding === 'failure' && mimeType) {
    -                                // 1. Let type be the result of parse a MIME type
    -                                //    given mimeType.
    -                                const type = parseMIMEType(mimeType)
    -
    -                                // 2. If type is not failure, set encoding to the result
    -                                //    of getting an encoding from type’s parameters["charset"].
    -                                if (type !== 'failure') {
    -                                    encoding = getEncoding(type.parameters.get('charset'))
    -                                }
    -                            }
    -
    -                            // 4. If encoding is failure, then set encoding to UTF-8.
    -                            if (encoding === 'failure') {
    -                                encoding = 'UTF-8'
    -                            }
    -
    -                            // 5. Decode bytes using fallback encoding encoding, and
    -                            //    return the result.
    -                            return decode(bytes, encoding)
    -                        }
    -                        case 'ArrayBuffer': {
    -                            // Return a new ArrayBuffer whose contents are bytes.
    -                            const sequence = combineByteSequences(bytes)
    -
    -                            return sequence.buffer
    -                        }
    -                        case 'BinaryString': {
    -                            // Return bytes as a binary string, in which every byte
    -                            //  is represented by a code unit of equal value [0..255].
    -                            let binaryString = ''
    -
    -                            const decoder = new StringDecoder('latin1')
    -
    -                            for (const chunk of bytes) {
    -                                binaryString += decoder.write(chunk)
    -                            }
    -
    -                            binaryString += decoder.end()
    -
    -                            return binaryString
    -                        }
    -                    }
    -                }
    -
    -                /**
    -                 * @see https://encoding.spec.whatwg.org/#decode
    -                 * @param {Uint8Array[]} ioQueue
    -                 * @param {string} encoding
    -                 */
    -                function decode(ioQueue, encoding) {
    -                    const bytes = combineByteSequences(ioQueue)
    -
    -                    // 1. Let BOMEncoding be the result of BOM sniffing ioQueue.
    -                    const BOMEncoding = BOMSniffing(bytes)
    -
    -                    let slice = 0
    -
    -                    // 2. If BOMEncoding is non-null:
    -                    if (BOMEncoding !== null) {
    -                        // 1. Set encoding to BOMEncoding.
    -                        encoding = BOMEncoding
    -
    -                        // 2. Read three bytes from ioQueue, if BOMEncoding is
    -                        //    UTF-8; otherwise read two bytes.
    -                        //    (Do nothing with those bytes.)
    -                        slice = BOMEncoding === 'UTF-8' ? 3 : 2
    -                    }
    -
    -                    // 3. Process a queue with an instance of encoding’s
    -                    //    decoder, ioQueue, output, and "replacement".
    -
    -                    // 4. Return output.
    -
    -                    const sliced = bytes.slice(slice)
    -                    return new TextDecoder(encoding).decode(sliced)
    -                }
    -
    -                /**
    -                 * @see https://encoding.spec.whatwg.org/#bom-sniff
    -                 * @param {Uint8Array} ioQueue
    -                 */
    -                function BOMSniffing(ioQueue) {
    -                    // 1. Let BOM be the result of peeking 3 bytes from ioQueue,
    -                    //    converted to a byte sequence.
    -                    const [a, b, c] = ioQueue
    -
    -                    // 2. For each of the rows in the table below, starting with
    -                    //    the first one and going down, if BOM starts with the
    -                    //    bytes given in the first column, then return the
    -                    //    encoding given in the cell in the second column of that
    -                    //    row. Otherwise, return null.
    -                    if (a === 0xEF && b === 0xBB && c === 0xBF) {
    -                        return 'UTF-8'
    -                    } else if (a === 0xFE && b === 0xFF) {
    -                        return 'UTF-16BE'
    -                    } else if (a === 0xFF && b === 0xFE) {
    -                        return 'UTF-16LE'
    -                    }
    -
    -                    return null
    -                }
    -
    -                /**
    -                 * @param {Uint8Array[]} sequences
    -                 */
    -                function combineByteSequences(sequences) {
    -                    const size = sequences.reduce((a, b) => {
    -                        return a + b.byteLength
    -                    }, 0)
    -
    -                    let offset = 0
    -
    -                    return sequences.reduce((a, b) => {
    -                        a.set(b, offset)
    -                        offset += b.byteLength
    -                        return a
    -                    }, new Uint8Array(size))
    -                }
    -
    -                module.exports = {
    -                    staticPropertyDescriptors,
    -                    readOperation,
    -                    fireAProgressEvent
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 1892:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                // We include a version number for the Dispatcher API. In case of breaking changes,
    -                // this version number must be increased to avoid conflicts.
    -                const globalDispatcher = Symbol.for('undici.globalDispatcher.1')
    -                const { InvalidArgumentError } = __nccwpck_require__(8045)
    -                const Agent = __nccwpck_require__(7890)
    -
    -                if (getGlobalDispatcher() === undefined) {
    -                    setGlobalDispatcher(new Agent())
    -                }
    -
    -                function setGlobalDispatcher(agent) {
    -                    if (!agent || typeof agent.dispatch !== 'function') {
    -                        throw new InvalidArgumentError('Argument agent must implement Agent')
    -                    }
    -                    Object.defineProperty(globalThis, globalDispatcher, {
    -                        value: agent,
    -                        writable: true,
    -                        enumerable: false,
    -                        configurable: false
    -                    })
    -                }
    -
    -                function getGlobalDispatcher() {
    -                    return globalThis[globalDispatcher]
    -                }
    -
    -                module.exports = {
    -                    setGlobalDispatcher,
    -                    getGlobalDispatcher
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 6930:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                module.exports = class DecoratorHandler {
    -                    constructor(handler) {
    -                        this.handler = handler
    -                    }
    -
    -                    onConnect(...args) {
    -                        return this.handler.onConnect(...args)
    -                    }
    -
    -                    onError(...args) {
    -                        return this.handler.onError(...args)
    -                    }
    -
    -                    onUpgrade(...args) {
    -                        return this.handler.onUpgrade(...args)
    -                    }
    -
    -                    onHeaders(...args) {
    -                        return this.handler.onHeaders(...args)
    -                    }
    -
    -                    onData(...args) {
    -                        return this.handler.onData(...args)
    -                    }
    -
    -                    onComplete(...args) {
    -                        return this.handler.onComplete(...args)
    -                    }
    -
    -                    onBodySent(...args) {
    -                        return this.handler.onBodySent(...args)
    -                    }
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 2860:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const util = __nccwpck_require__(3983)
    -                const { kBodyUsed } = __nccwpck_require__(2785)
    -                const assert = __nccwpck_require__(9491)
    -                const { InvalidArgumentError } = __nccwpck_require__(8045)
    -                const EE = __nccwpck_require__(2361)
    -
    -                const redirectableStatusCodes = [300, 301, 302, 303, 307, 308]
    -
    -                const kBody = Symbol('body')
    -
    -                class BodyAsyncIterable {
    -                    constructor(body) {
    -                        this[kBody] = body
    -                        this[kBodyUsed] = false
    -                    }
    -
    -                    async *[Symbol.asyncIterator]() {
    -                        assert(!this[kBodyUsed], 'disturbed')
    -                        this[kBodyUsed] = true
    -                        yield* this[kBody]
    -                    }
    -                }
    -
    -                class RedirectHandler {
    -                    constructor(dispatch, maxRedirections, opts, handler) {
    -                        if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) {
    -                            throw new InvalidArgumentError('maxRedirections must be a positive number')
    -                        }
    -
    -                        util.validateHandler(handler, opts.method, opts.upgrade)
    -
    -                        this.dispatch = dispatch
    -                        this.location = null
    -                        this.abort = null
    -                        this.opts = { ...opts, maxRedirections: 0 } // opts must be a copy
    -                        this.maxRedirections = maxRedirections
    -                        this.handler = handler
    -                        this.history = []
    -
    -                        if (util.isStream(this.opts.body)) {
    -                            // TODO (fix): Provide some way for the user to cache the file to e.g. /tmp
    -                            // so that it can be dispatched again?
    -                            // TODO (fix): Do we need 100-expect support to provide a way to do this properly?
    -                            if (util.bodyLength(this.opts.body) === 0) {
    -                                this.opts.body
    -                                    .on('data', function () {
    -                                        assert(false)
    -                                    })
    -                            }
    -
    -                            if (typeof this.opts.body.readableDidRead !== 'boolean') {
    -                                this.opts.body[kBodyUsed] = false
    -                                EE.prototype.on.call(this.opts.body, 'data', function () {
    -                                    this[kBodyUsed] = true
    -                                })
    -                            }
    -                        } else if (this.opts.body && typeof this.opts.body.pipeTo === 'function') {
    -                            // TODO (fix): We can't access ReadableStream internal state
    -                            // to determine whether or not it has been disturbed. This is just
    -                            // a workaround.
    -                            this.opts.body = new BodyAsyncIterable(this.opts.body)
    -                        } else if (
    -                            this.opts.body &&
    -                            typeof this.opts.body !== 'string' &&
    -                            !ArrayBuffer.isView(this.opts.body) &&
    -                            util.isIterable(this.opts.body)
    -                        ) {
    -                            // TODO: Should we allow re-using iterable if !this.opts.idempotent
    -                            // or through some other flag?
    -                            this.opts.body = new BodyAsyncIterable(this.opts.body)
    -                        }
    -                    }
    -
    -                    onConnect(abort) {
    -                        this.abort = abort
    -                        this.handler.onConnect(abort, { history: this.history })
    -                    }
    -
    -                    onUpgrade(statusCode, headers, socket) {
    -                        this.handler.onUpgrade(statusCode, headers, socket)
    -                    }
    -
    -                    onError(error) {
    -                        this.handler.onError(error)
    -                    }
    -
    -                    onHeaders(statusCode, headers, resume, statusText) {
    -                        this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body)
    -                            ? null
    -                            : parseLocation(statusCode, headers)
    -
    -                        if (this.opts.origin) {
    -                            this.history.push(new URL(this.opts.path, this.opts.origin))
    -                        }
    -
    -                        if (!this.location) {
    -                            return this.handler.onHeaders(statusCode, headers, resume, statusText)
    -                        }
    -
    -                        const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin)))
    -                        const path = search ? `${pathname}${search}` : pathname
    -
    -                        // Remove headers referring to the original URL.
    -                        // By default it is Host only, unless it's a 303 (see below), which removes also all Content-* headers.
    -                        // https://tools.ietf.org/html/rfc7231#section-6.4
    -                        this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin)
    -                        this.opts.path = path
    -                        this.opts.origin = origin
    -                        this.opts.maxRedirections = 0
    -                        this.opts.query = null
    -
    -                        // https://tools.ietf.org/html/rfc7231#section-6.4.4
    -                        // In case of HTTP 303, always replace method to be either HEAD or GET
    -                        if (statusCode === 303 && this.opts.method !== 'HEAD') {
    -                            this.opts.method = 'GET'
    -                            this.opts.body = null
    -                        }
    -                    }
    -
    -                    onData(chunk) {
    -                        if (this.location) {
    -                            /*
    -                              https://tools.ietf.org/html/rfc7231#section-6.4
    -                      
    -                              TLDR: undici always ignores 3xx response bodies.
    -                      
    -                              Redirection is used to serve the requested resource from another URL, so it is assumes that
    -                              no body is generated (and thus can be ignored). Even though generating a body is not prohibited.
    -                      
    -                              For status 301, 302, 303, 307 and 308 (the latter from RFC 7238), the specs mention that the body usually
    -                              (which means it's optional and not mandated) contain just an hyperlink to the value of
    -                              the Location response header, so the body can be ignored safely.
    -                      
    -                              For status 300, which is "Multiple Choices", the spec mentions both generating a Location
    -                              response header AND a response body with the other possible location to follow.
    -                              Since the spec explicitily chooses not to specify a format for such body and leave it to
    -                              servers and browsers implementors, we ignore the body as there is no specified way to eventually parse it.
    -                            */
    -                        } else {
    -                            return this.handler.onData(chunk)
    -                        }
    -                    }
    -
    -                    onComplete(trailers) {
    -                        if (this.location) {
    -                            /*
    -                              https://tools.ietf.org/html/rfc7231#section-6.4
    -                      
    -                              TLDR: undici always ignores 3xx response trailers as they are not expected in case of redirections
    -                              and neither are useful if present.
    -                      
    -                              See comment on onData method above for more detailed informations.
    -                            */
    -
    -                            this.location = null
    -                            this.abort = null
    -
    -                            this.dispatch(this.opts, this)
    -                        } else {
    -                            this.handler.onComplete(trailers)
    -                        }
    -                    }
    -
    -                    onBodySent(chunk) {
    -                        if (this.handler.onBodySent) {
    -                            this.handler.onBodySent(chunk)
    -                        }
    -                    }
    -                }
    -
    -                function parseLocation(statusCode, headers) {
    -                    if (redirectableStatusCodes.indexOf(statusCode) === -1) {
    -                        return null
    -                    }
    -
    -                    for (let i = 0; i < headers.length; i += 2) {
    -                        if (headers[i].toString().toLowerCase() === 'location') {
    -                            return headers[i + 1]
    -                        }
    -                    }
    -                }
    -
    -                // https://tools.ietf.org/html/rfc7231#section-6.4.4
    -                function shouldRemoveHeader(header, removeContent, unknownOrigin) {
    -                    if (header.length === 4) {
    -                        return util.headerNameToString(header) === 'host'
    -                    }
    -                    if (removeContent && util.headerNameToString(header).startsWith('content-')) {
    -                        return true
    -                    }
    -                    if (unknownOrigin && (header.length === 13 || header.length === 6 || header.length === 19)) {
    -                        const name = util.headerNameToString(header)
    -                        return name === 'authorization' || name === 'cookie' || name === 'proxy-authorization'
    -                    }
    -                    return false
    -                }
    -
    -                // https://tools.ietf.org/html/rfc7231#section-6.4
    -                function cleanRequestHeaders(headers, removeContent, unknownOrigin) {
    -                    const ret = []
    -                    if (Array.isArray(headers)) {
    -                        for (let i = 0; i < headers.length; i += 2) {
    -                            if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) {
    -                                ret.push(headers[i], headers[i + 1])
    -                            }
    -                        }
    -                    } else if (headers && typeof headers === 'object') {
    -                        for (const key of Object.keys(headers)) {
    -                            if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) {
    -                                ret.push(key, headers[key])
    -                            }
    -                        }
    -                    } else {
    -                        assert(headers == null, 'headers must be an object or an array')
    -                    }
    -                    return ret
    -                }
    -
    -                module.exports = RedirectHandler
    -
    -
    -                /***/
    -}),
    -
    -/***/ 2286:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                const assert = __nccwpck_require__(9491)
    -
    -                const { kRetryHandlerDefaultRetry } = __nccwpck_require__(2785)
    -                const { RequestRetryError } = __nccwpck_require__(8045)
    -                const { isDisturbed, parseHeaders, parseRangeHeader } = __nccwpck_require__(3983)
    -
    -                function calculateRetryAfterHeader(retryAfter) {
    -                    const current = Date.now()
    -                    const diff = new Date(retryAfter).getTime() - current
    -
    -                    return diff
    -                }
    -
    -                class RetryHandler {
    -                    constructor(opts, handlers) {
    -                        const { retryOptions, ...dispatchOpts } = opts
    -                        const {
    -                            // Retry scoped
    -                            retry: retryFn,
    -                            maxRetries,
    -                            maxTimeout,
    -                            minTimeout,
    -                            timeoutFactor,
    -                            // Response scoped
    -                            methods,
    -                            errorCodes,
    -                            retryAfter,
    -                            statusCodes
    -                        } = retryOptions ?? {}
    -
    -                        this.dispatch = handlers.dispatch
    -                        this.handler = handlers.handler
    -                        this.opts = dispatchOpts
    -                        this.abort = null
    -                        this.aborted = false
    -                        this.retryOpts = {
    -                            retry: retryFn ?? RetryHandler[kRetryHandlerDefaultRetry],
    -                            retryAfter: retryAfter ?? true,
    -                            maxTimeout: maxTimeout ?? 30 * 1000, // 30s,
    -                            timeout: minTimeout ?? 500, // .5s
    -                            timeoutFactor: timeoutFactor ?? 2,
    -                            maxRetries: maxRetries ?? 5,
    -                            // What errors we should retry
    -                            methods: methods ?? ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE', 'TRACE'],
    -                            // Indicates which errors to retry
    -                            statusCodes: statusCodes ?? [500, 502, 503, 504, 429],
    -                            // List of errors to retry
    -                            errorCodes: errorCodes ?? [
    -                                'ECONNRESET',
    -                                'ECONNREFUSED',
    -                                'ENOTFOUND',
    -                                'ENETDOWN',
    -                                'ENETUNREACH',
    -                                'EHOSTDOWN',
    -                                'EHOSTUNREACH',
    -                                'EPIPE'
    -                            ]
    -                        }
    -
    -                        this.retryCount = 0
    -                        this.start = 0
    -                        this.end = null
    -                        this.etag = null
    -                        this.resume = null
    -
    -                        // Handle possible onConnect duplication
    -                        this.handler.onConnect(reason => {
    -                            this.aborted = true
    -                            if (this.abort) {
    -                                this.abort(reason)
    -                            } else {
    -                                this.reason = reason
    -                            }
    -                        })
    -                    }
    -
    -                    onRequestSent() {
    -                        if (this.handler.onRequestSent) {
    -                            this.handler.onRequestSent()
    -                        }
    -                    }
    -
    -                    onUpgrade(statusCode, headers, socket) {
    -                        if (this.handler.onUpgrade) {
    -                            this.handler.onUpgrade(statusCode, headers, socket)
    -                        }
    -                    }
    -
    -                    onConnect(abort) {
    -                        if (this.aborted) {
    -                            abort(this.reason)
    -                        } else {
    -                            this.abort = abort
    -                        }
    -                    }
    -
    -                    onBodySent(chunk) {
    -                        if (this.handler.onBodySent) return this.handler.onBodySent(chunk)
    -                    }
    -
    -                    static [kRetryHandlerDefaultRetry](err, { state, opts }, cb) {
    -                        const { statusCode, code, headers } = err
    -                        const { method, retryOptions } = opts
    -                        const {
    -                            maxRetries,
    -                            timeout,
    -                            maxTimeout,
    -                            timeoutFactor,
    -                            statusCodes,
    -                            errorCodes,
    -                            methods
    -                        } = retryOptions
    -                        let { counter, currentTimeout } = state
    -
    -                        currentTimeout =
    -                            currentTimeout != null && currentTimeout > 0 ? currentTimeout : timeout
    -
    -                        // Any code that is not a Undici's originated and allowed to retry
    -                        if (
    -                            code &&
    -                            code !== 'UND_ERR_REQ_RETRY' &&
    -                            code !== 'UND_ERR_SOCKET' &&
    -                            !errorCodes.includes(code)
    -                        ) {
    -                            cb(err)
    -                            return
    -                        }
    -
    -                        // If a set of method are provided and the current method is not in the list
    -                        if (Array.isArray(methods) && !methods.includes(method)) {
    -                            cb(err)
    -                            return
    -                        }
    -
    -                        // If a set of status code are provided and the current status code is not in the list
    -                        if (
    -                            statusCode != null &&
    -                            Array.isArray(statusCodes) &&
    -                            !statusCodes.includes(statusCode)
    -                        ) {
    -                            cb(err)
    -                            return
    -                        }
    -
    -                        // If we reached the max number of retries
    -                        if (counter > maxRetries) {
    -                            cb(err)
    -                            return
    -                        }
    -
    -                        let retryAfterHeader = headers != null && headers['retry-after']
    -                        if (retryAfterHeader) {
    -                            retryAfterHeader = Number(retryAfterHeader)
    -                            retryAfterHeader = isNaN(retryAfterHeader)
    -                                ? calculateRetryAfterHeader(retryAfterHeader)
    -                                : retryAfterHeader * 1e3 // Retry-After is in seconds
    -                        }
    -
    -                        const retryTimeout =
    -                            retryAfterHeader > 0
    -                                ? Math.min(retryAfterHeader, maxTimeout)
    -                                : Math.min(currentTimeout * timeoutFactor ** counter, maxTimeout)
    -
    -                        state.currentTimeout = retryTimeout
    -
    -                        setTimeout(() => cb(null), retryTimeout)
    -                    }
    -
    -                    onHeaders(statusCode, rawHeaders, resume, statusMessage) {
    -                        const headers = parseHeaders(rawHeaders)
    -
    -                        this.retryCount += 1
    -
    -                        if (statusCode >= 300) {
    -                            this.abort(
    -                                new RequestRetryError('Request failed', statusCode, {
    -                                    headers,
    -                                    count: this.retryCount
    -                                })
    -                            )
    -                            return false
    -                        }
    -
    -                        // Checkpoint for resume from where we left it
    -                        if (this.resume != null) {
    -                            this.resume = null
    -
    -                            if (statusCode !== 206) {
    -                                return true
    -                            }
    -
    -                            const contentRange = parseRangeHeader(headers['content-range'])
    -                            // If no content range
    -                            if (!contentRange) {
    -                                this.abort(
    -                                    new RequestRetryError('Content-Range mismatch', statusCode, {
    -                                        headers,
    -                                        count: this.retryCount
    -                                    })
    -                                )
    -                                return false
    -                            }
    -
    -                            // Let's start with a weak etag check
    -                            if (this.etag != null && this.etag !== headers.etag) {
    -                                this.abort(
    -                                    new RequestRetryError('ETag mismatch', statusCode, {
    -                                        headers,
    -                                        count: this.retryCount
    -                                    })
    -                                )
    -                                return false
    -                            }
    -
    -                            const { start, size, end = size } = contentRange
    -
    -                            assert(this.start === start, 'content-range mismatch')
    -                            assert(this.end == null || this.end === end, 'content-range mismatch')
    -
    -                            this.resume = resume
    -                            return true
    -                        }
    -
    -                        if (this.end == null) {
    -                            if (statusCode === 206) {
    -                                // First time we receive 206
    -                                const range = parseRangeHeader(headers['content-range'])
    -
    -                                if (range == null) {
    -                                    return this.handler.onHeaders(
    -                                        statusCode,
    -                                        rawHeaders,
    -                                        resume,
    -                                        statusMessage
    -                                    )
    -                                }
    -
    -                                const { start, size, end = size } = range
    -
    -                                assert(
    -                                    start != null && Number.isFinite(start) && this.start !== start,
    -                                    'content-range mismatch'
    -                                )
    -                                assert(Number.isFinite(start))
    -                                assert(
    -                                    end != null && Number.isFinite(end) && this.end !== end,
    -                                    'invalid content-length'
    -                                )
    -
    -                                this.start = start
    -                                this.end = end
    -                            }
    -
    -                            // We make our best to checkpoint the body for further range headers
    -                            if (this.end == null) {
    -                                const contentLength = headers['content-length']
    -                                this.end = contentLength != null ? Number(contentLength) : null
    -                            }
    -
    -                            assert(Number.isFinite(this.start))
    -                            assert(
    -                                this.end == null || Number.isFinite(this.end),
    -                                'invalid content-length'
    -                            )
    -
    -                            this.resume = resume
    -                            this.etag = headers.etag != null ? headers.etag : null
    -
    -                            return this.handler.onHeaders(
    -                                statusCode,
    -                                rawHeaders,
    -                                resume,
    -                                statusMessage
    -                            )
    -                        }
    -
    -                        const err = new RequestRetryError('Request failed', statusCode, {
    -                            headers,
    -                            count: this.retryCount
    -                        })
    -
    -                        this.abort(err)
    -
    -                        return false
    -                    }
    -
    -                    onData(chunk) {
    -                        this.start += chunk.length
    -
    -                        return this.handler.onData(chunk)
    -                    }
    -
    -                    onComplete(rawTrailers) {
    -                        this.retryCount = 0
    -                        return this.handler.onComplete(rawTrailers)
    -                    }
    -
    -                    onError(err) {
    -                        if (this.aborted || isDisturbed(this.opts.body)) {
    -                            return this.handler.onError(err)
    -                        }
    -
    -                        this.retryOpts.retry(
    -                            err,
    -                            {
    -                                state: { counter: this.retryCount++, currentTimeout: this.retryAfter },
    -                                opts: { retryOptions: this.retryOpts, ...this.opts }
    -                            },
    -                            onRetry.bind(this)
    -                        )
    -
    -                        function onRetry(err) {
    -                            if (err != null || this.aborted || isDisturbed(this.opts.body)) {
    -                                return this.handler.onError(err)
    -                            }
    -
    -                            if (this.start !== 0) {
    -                                this.opts = {
    -                                    ...this.opts,
    -                                    headers: {
    -                                        ...this.opts.headers,
    -                                        range: `bytes=${this.start}-${this.end ?? ''}`
    -                                    }
    -                                }
    -                            }
    -
    -                            try {
    -                                this.dispatch(this.opts, this)
    -                            } catch (err) {
    -                                this.handler.onError(err)
    -                            }
    -                        }
    -                    }
    -                }
    -
    -                module.exports = RetryHandler
    -
    -
    -                /***/
    -}),
    -
    -/***/ 8861:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const RedirectHandler = __nccwpck_require__(2860)
    -
    -                function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) {
    -                    return (dispatch) => {
    -                        return function Intercept(opts, handler) {
    -                            const { maxRedirections = defaultMaxRedirections } = opts
    -
    -                            if (!maxRedirections) {
    -                                return dispatch(opts, handler)
    -                            }
    -
    -                            const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler)
    -                            opts = { ...opts, maxRedirections: 0 } // Stop sub dispatcher from also redirecting.
    -                            return dispatch(opts, redirectHandler)
    -                        }
    -                    }
    -                }
    -
    -                module.exports = createRedirectInterceptor
    -
    -
    -                /***/
    -}),
    -
    -/***/ 953:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.SPECIAL_HEADERS = exports.HEADER_STATE = exports.MINOR = exports.MAJOR = exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS = exports.TOKEN = exports.STRICT_TOKEN = exports.HEX = exports.URL_CHAR = exports.STRICT_URL_CHAR = exports.USERINFO_CHARS = exports.MARK = exports.ALPHANUM = exports.NUM = exports.HEX_MAP = exports.NUM_MAP = exports.ALPHA = exports.FINISH = exports.H_METHOD_MAP = exports.METHOD_MAP = exports.METHODS_RTSP = exports.METHODS_ICE = exports.METHODS_HTTP = exports.METHODS = exports.LENIENT_FLAGS = exports.FLAGS = exports.TYPE = exports.ERROR = void 0;
    -                const utils_1 = __nccwpck_require__(1891);
    -                // C headers
    -                var ERROR;
    -                (function (ERROR) {
    -                    ERROR[ERROR["OK"] = 0] = "OK";
    -                    ERROR[ERROR["INTERNAL"] = 1] = "INTERNAL";
    -                    ERROR[ERROR["STRICT"] = 2] = "STRICT";
    -                    ERROR[ERROR["LF_EXPECTED"] = 3] = "LF_EXPECTED";
    -                    ERROR[ERROR["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH";
    -                    ERROR[ERROR["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION";
    -                    ERROR[ERROR["INVALID_METHOD"] = 6] = "INVALID_METHOD";
    -                    ERROR[ERROR["INVALID_URL"] = 7] = "INVALID_URL";
    -                    ERROR[ERROR["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT";
    -                    ERROR[ERROR["INVALID_VERSION"] = 9] = "INVALID_VERSION";
    -                    ERROR[ERROR["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN";
    -                    ERROR[ERROR["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH";
    -                    ERROR[ERROR["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE";
    -                    ERROR[ERROR["INVALID_STATUS"] = 13] = "INVALID_STATUS";
    -                    ERROR[ERROR["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE";
    -                    ERROR[ERROR["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING";
    -                    ERROR[ERROR["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN";
    -                    ERROR[ERROR["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE";
    -                    ERROR[ERROR["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE";
    -                    ERROR[ERROR["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER";
    -                    ERROR[ERROR["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE";
    -                    ERROR[ERROR["PAUSED"] = 21] = "PAUSED";
    -                    ERROR[ERROR["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE";
    -                    ERROR[ERROR["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE";
    -                    ERROR[ERROR["USER"] = 24] = "USER";
    -                })(ERROR = exports.ERROR || (exports.ERROR = {}));
    -                var TYPE;
    -                (function (TYPE) {
    -                    TYPE[TYPE["BOTH"] = 0] = "BOTH";
    -                    TYPE[TYPE["REQUEST"] = 1] = "REQUEST";
    -                    TYPE[TYPE["RESPONSE"] = 2] = "RESPONSE";
    -                })(TYPE = exports.TYPE || (exports.TYPE = {}));
    -                var FLAGS;
    -                (function (FLAGS) {
    -                    FLAGS[FLAGS["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE";
    -                    FLAGS[FLAGS["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE";
    -                    FLAGS[FLAGS["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE";
    -                    FLAGS[FLAGS["CHUNKED"] = 8] = "CHUNKED";
    -                    FLAGS[FLAGS["UPGRADE"] = 16] = "UPGRADE";
    -                    FLAGS[FLAGS["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH";
    -                    FLAGS[FLAGS["SKIPBODY"] = 64] = "SKIPBODY";
    -                    FLAGS[FLAGS["TRAILING"] = 128] = "TRAILING";
    -                    // 1 << 8 is unused
    -                    FLAGS[FLAGS["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING";
    -                })(FLAGS = exports.FLAGS || (exports.FLAGS = {}));
    -                var LENIENT_FLAGS;
    -                (function (LENIENT_FLAGS) {
    -                    LENIENT_FLAGS[LENIENT_FLAGS["HEADERS"] = 1] = "HEADERS";
    -                    LENIENT_FLAGS[LENIENT_FLAGS["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH";
    -                    LENIENT_FLAGS[LENIENT_FLAGS["KEEP_ALIVE"] = 4] = "KEEP_ALIVE";
    -                })(LENIENT_FLAGS = exports.LENIENT_FLAGS || (exports.LENIENT_FLAGS = {}));
    -                var METHODS;
    -                (function (METHODS) {
    -                    METHODS[METHODS["DELETE"] = 0] = "DELETE";
    -                    METHODS[METHODS["GET"] = 1] = "GET";
    -                    METHODS[METHODS["HEAD"] = 2] = "HEAD";
    -                    METHODS[METHODS["POST"] = 3] = "POST";
    -                    METHODS[METHODS["PUT"] = 4] = "PUT";
    -                    /* pathological */
    -                    METHODS[METHODS["CONNECT"] = 5] = "CONNECT";
    -                    METHODS[METHODS["OPTIONS"] = 6] = "OPTIONS";
    -                    METHODS[METHODS["TRACE"] = 7] = "TRACE";
    -                    /* WebDAV */
    -                    METHODS[METHODS["COPY"] = 8] = "COPY";
    -                    METHODS[METHODS["LOCK"] = 9] = "LOCK";
    -                    METHODS[METHODS["MKCOL"] = 10] = "MKCOL";
    -                    METHODS[METHODS["MOVE"] = 11] = "MOVE";
    -                    METHODS[METHODS["PROPFIND"] = 12] = "PROPFIND";
    -                    METHODS[METHODS["PROPPATCH"] = 13] = "PROPPATCH";
    -                    METHODS[METHODS["SEARCH"] = 14] = "SEARCH";
    -                    METHODS[METHODS["UNLOCK"] = 15] = "UNLOCK";
    -                    METHODS[METHODS["BIND"] = 16] = "BIND";
    -                    METHODS[METHODS["REBIND"] = 17] = "REBIND";
    -                    METHODS[METHODS["UNBIND"] = 18] = "UNBIND";
    -                    METHODS[METHODS["ACL"] = 19] = "ACL";
    -                    /* subversion */
    -                    METHODS[METHODS["REPORT"] = 20] = "REPORT";
    -                    METHODS[METHODS["MKACTIVITY"] = 21] = "MKACTIVITY";
    -                    METHODS[METHODS["CHECKOUT"] = 22] = "CHECKOUT";
    -                    METHODS[METHODS["MERGE"] = 23] = "MERGE";
    -                    /* upnp */
    -                    METHODS[METHODS["M-SEARCH"] = 24] = "M-SEARCH";
    -                    METHODS[METHODS["NOTIFY"] = 25] = "NOTIFY";
    -                    METHODS[METHODS["SUBSCRIBE"] = 26] = "SUBSCRIBE";
    -                    METHODS[METHODS["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE";
    -                    /* RFC-5789 */
    -                    METHODS[METHODS["PATCH"] = 28] = "PATCH";
    -                    METHODS[METHODS["PURGE"] = 29] = "PURGE";
    -                    /* CalDAV */
    -                    METHODS[METHODS["MKCALENDAR"] = 30] = "MKCALENDAR";
    -                    /* RFC-2068, section 19.6.1.2 */
    -                    METHODS[METHODS["LINK"] = 31] = "LINK";
    -                    METHODS[METHODS["UNLINK"] = 32] = "UNLINK";
    -                    /* icecast */
    -                    METHODS[METHODS["SOURCE"] = 33] = "SOURCE";
    -                    /* RFC-7540, section 11.6 */
    -                    METHODS[METHODS["PRI"] = 34] = "PRI";
    -                    /* RFC-2326 RTSP */
    -                    METHODS[METHODS["DESCRIBE"] = 35] = "DESCRIBE";
    -                    METHODS[METHODS["ANNOUNCE"] = 36] = "ANNOUNCE";
    -                    METHODS[METHODS["SETUP"] = 37] = "SETUP";
    -                    METHODS[METHODS["PLAY"] = 38] = "PLAY";
    -                    METHODS[METHODS["PAUSE"] = 39] = "PAUSE";
    -                    METHODS[METHODS["TEARDOWN"] = 40] = "TEARDOWN";
    -                    METHODS[METHODS["GET_PARAMETER"] = 41] = "GET_PARAMETER";
    -                    METHODS[METHODS["SET_PARAMETER"] = 42] = "SET_PARAMETER";
    -                    METHODS[METHODS["REDIRECT"] = 43] = "REDIRECT";
    -                    METHODS[METHODS["RECORD"] = 44] = "RECORD";
    -                    /* RAOP */
    -                    METHODS[METHODS["FLUSH"] = 45] = "FLUSH";
    -                })(METHODS = exports.METHODS || (exports.METHODS = {}));
    -                exports.METHODS_HTTP = [
    -                    METHODS.DELETE,
    -                    METHODS.GET,
    -                    METHODS.HEAD,
    -                    METHODS.POST,
    -                    METHODS.PUT,
    -                    METHODS.CONNECT,
    -                    METHODS.OPTIONS,
    -                    METHODS.TRACE,
    -                    METHODS.COPY,
    -                    METHODS.LOCK,
    -                    METHODS.MKCOL,
    -                    METHODS.MOVE,
    -                    METHODS.PROPFIND,
    -                    METHODS.PROPPATCH,
    -                    METHODS.SEARCH,
    -                    METHODS.UNLOCK,
    -                    METHODS.BIND,
    -                    METHODS.REBIND,
    -                    METHODS.UNBIND,
    -                    METHODS.ACL,
    -                    METHODS.REPORT,
    -                    METHODS.MKACTIVITY,
    -                    METHODS.CHECKOUT,
    -                    METHODS.MERGE,
    -                    METHODS['M-SEARCH'],
    -                    METHODS.NOTIFY,
    -                    METHODS.SUBSCRIBE,
    -                    METHODS.UNSUBSCRIBE,
    -                    METHODS.PATCH,
    -                    METHODS.PURGE,
    -                    METHODS.MKCALENDAR,
    -                    METHODS.LINK,
    -                    METHODS.UNLINK,
    -                    METHODS.PRI,
    -                    // TODO(indutny): should we allow it with HTTP?
    -                    METHODS.SOURCE,
    -                ];
    -                exports.METHODS_ICE = [
    -                    METHODS.SOURCE,
    -                ];
    -                exports.METHODS_RTSP = [
    -                    METHODS.OPTIONS,
    -                    METHODS.DESCRIBE,
    -                    METHODS.ANNOUNCE,
    -                    METHODS.SETUP,
    -                    METHODS.PLAY,
    -                    METHODS.PAUSE,
    -                    METHODS.TEARDOWN,
    -                    METHODS.GET_PARAMETER,
    -                    METHODS.SET_PARAMETER,
    -                    METHODS.REDIRECT,
    -                    METHODS.RECORD,
    -                    METHODS.FLUSH,
    -                    // For AirPlay
    -                    METHODS.GET,
    -                    METHODS.POST,
    -                ];
    -                exports.METHOD_MAP = utils_1.enumToMap(METHODS);
    -                exports.H_METHOD_MAP = {};
    -                Object.keys(exports.METHOD_MAP).forEach((key) => {
    -                    if (/^H/.test(key)) {
    -                        exports.H_METHOD_MAP[key] = exports.METHOD_MAP[key];
    -                    }
    -                });
    -                var FINISH;
    -                (function (FINISH) {
    -                    FINISH[FINISH["SAFE"] = 0] = "SAFE";
    -                    FINISH[FINISH["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB";
    -                    FINISH[FINISH["UNSAFE"] = 2] = "UNSAFE";
    -                })(FINISH = exports.FINISH || (exports.FINISH = {}));
    -                exports.ALPHA = [];
    -                for (let i = 'A'.charCodeAt(0); i <= 'Z'.charCodeAt(0); i++) {
    -                    // Upper case
    -                    exports.ALPHA.push(String.fromCharCode(i));
    -                    // Lower case
    -                    exports.ALPHA.push(String.fromCharCode(i + 0x20));
    -                }
    -                exports.NUM_MAP = {
    -                    0: 0, 1: 1, 2: 2, 3: 3, 4: 4,
    -                    5: 5, 6: 6, 7: 7, 8: 8, 9: 9,
    -                };
    -                exports.HEX_MAP = {
    -                    0: 0, 1: 1, 2: 2, 3: 3, 4: 4,
    -                    5: 5, 6: 6, 7: 7, 8: 8, 9: 9,
    -                    A: 0XA, B: 0XB, C: 0XC, D: 0XD, E: 0XE, F: 0XF,
    -                    a: 0xa, b: 0xb, c: 0xc, d: 0xd, e: 0xe, f: 0xf,
    -                };
    -                exports.NUM = [
    -                    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
    -                ];
    -                exports.ALPHANUM = exports.ALPHA.concat(exports.NUM);
    -                exports.MARK = ['-', '_', '.', '!', '~', '*', '\'', '(', ')'];
    -                exports.USERINFO_CHARS = exports.ALPHANUM
    -                    .concat(exports.MARK)
    -                    .concat(['%', ';', ':', '&', '=', '+', '$', ',']);
    -                // TODO(indutny): use RFC
    -                exports.STRICT_URL_CHAR = [
    -                    '!', '"', '$', '%', '&', '\'',
    -                    '(', ')', '*', '+', ',', '-', '.', '/',
    -                    ':', ';', '<', '=', '>',
    -                    '@', '[', '\\', ']', '^', '_',
    -                    '`',
    -                    '{', '|', '}', '~',
    -                ].concat(exports.ALPHANUM);
    -                exports.URL_CHAR = exports.STRICT_URL_CHAR
    -                    .concat(['\t', '\f']);
    -                // All characters with 0x80 bit set to 1
    -                for (let i = 0x80; i <= 0xff; i++) {
    -                    exports.URL_CHAR.push(i);
    -                }
    -                exports.HEX = exports.NUM.concat(['a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F']);
    -                /* Tokens as defined by rfc 2616. Also lowercases them.
    -                 *        token       = 1*
    -                 *     separators     = "(" | ")" | "<" | ">" | "@"
    -                 *                    | "," | ";" | ":" | "\" | <">
    -                 *                    | "/" | "[" | "]" | "?" | "="
    -                 *                    | "{" | "}" | SP | HT
    -                 */
    -                exports.STRICT_TOKEN = [
    -                    '!', '#', '$', '%', '&', '\'',
    -                    '*', '+', '-', '.',
    -                    '^', '_', '`',
    -                    '|', '~',
    -                ].concat(exports.ALPHANUM);
    -                exports.TOKEN = exports.STRICT_TOKEN.concat([' ']);
    -                /*
    -                 * Verify that a char is a valid visible (printable) US-ASCII
    -                 * character or %x80-FF
    -                 */
    -                exports.HEADER_CHARS = ['\t'];
    -                for (let i = 32; i <= 255; i++) {
    -                    if (i !== 127) {
    -                        exports.HEADER_CHARS.push(i);
    -                    }
    -                }
    -                // ',' = \x44
    -                exports.CONNECTION_TOKEN_CHARS = exports.HEADER_CHARS.filter((c) => c !== 44);
    -                exports.MAJOR = exports.NUM_MAP;
    -                exports.MINOR = exports.MAJOR;
    -                var HEADER_STATE;
    -                (function (HEADER_STATE) {
    -                    HEADER_STATE[HEADER_STATE["GENERAL"] = 0] = "GENERAL";
    -                    HEADER_STATE[HEADER_STATE["CONNECTION"] = 1] = "CONNECTION";
    -                    HEADER_STATE[HEADER_STATE["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH";
    -                    HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING";
    -                    HEADER_STATE[HEADER_STATE["UPGRADE"] = 4] = "UPGRADE";
    -                    HEADER_STATE[HEADER_STATE["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE";
    -                    HEADER_STATE[HEADER_STATE["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE";
    -                    HEADER_STATE[HEADER_STATE["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE";
    -                    HEADER_STATE[HEADER_STATE["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED";
    -                })(HEADER_STATE = exports.HEADER_STATE || (exports.HEADER_STATE = {}));
    -                exports.SPECIAL_HEADERS = {
    -                    'connection': HEADER_STATE.CONNECTION,
    -                    'content-length': HEADER_STATE.CONTENT_LENGTH,
    -                    'proxy-connection': HEADER_STATE.CONNECTION,
    -                    'transfer-encoding': HEADER_STATE.TRANSFER_ENCODING,
    -                    'upgrade': HEADER_STATE.UPGRADE,
    -                };
    -                //# sourceMappingURL=constants.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 1145:
    -/***/ ((module) => {
    -
    -                module.exports = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCsLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC1kAIABBGGpCADcDACAAQgA3AwAgAEE4akIANwMAIABBMGpCADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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FCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAU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YWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8='
    -
    -
    -                /***/
    -}),
    -
    -/***/ 5627:
    -/***/ ((module) => {
    -
    -                module.exports = 'AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJs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IAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEB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QAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQID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YWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=='
    -
    -
    -                /***/
    -}),
    -
    -/***/ 1891:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.enumToMap = void 0;
    -                function enumToMap(obj) {
    -                    const res = {};
    -                    Object.keys(obj).forEach((key) => {
    -                        const value = obj[key];
    -                        if (typeof value === 'number') {
    -                            res[key] = value;
    -                        }
    -                    });
    -                    return res;
    -                }
    -                exports.enumToMap = enumToMap;
    -                //# sourceMappingURL=utils.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 6771:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { kClients } = __nccwpck_require__(2785)
    -                const Agent = __nccwpck_require__(7890)
    -                const {
    -                    kAgent,
    -                    kMockAgentSet,
    -                    kMockAgentGet,
    -                    kDispatches,
    -                    kIsMockActive,
    -                    kNetConnect,
    -                    kGetNetConnect,
    -                    kOptions,
    -                    kFactory
    -                } = __nccwpck_require__(4347)
    -                const MockClient = __nccwpck_require__(8687)
    -                const MockPool = __nccwpck_require__(6193)
    -                const { matchValue, buildMockOptions } = __nccwpck_require__(9323)
    -                const { InvalidArgumentError, UndiciError } = __nccwpck_require__(8045)
    -                const Dispatcher = __nccwpck_require__(412)
    -                const Pluralizer = __nccwpck_require__(8891)
    -                const PendingInterceptorsFormatter = __nccwpck_require__(6823)
    -
    -                class FakeWeakRef {
    -                    constructor(value) {
    -                        this.value = value
    -                    }
    -
    -                    deref() {
    -                        return this.value
    -                    }
    -                }
    -
    -                class MockAgent extends Dispatcher {
    -                    constructor(opts) {
    -                        super(opts)
    -
    -                        this[kNetConnect] = true
    -                        this[kIsMockActive] = true
    -
    -                        // Instantiate Agent and encapsulate
    -                        if ((opts && opts.agent && typeof opts.agent.dispatch !== 'function')) {
    -                            throw new InvalidArgumentError('Argument opts.agent must implement Agent')
    -                        }
    -                        const agent = opts && opts.agent ? opts.agent : new Agent(opts)
    -                        this[kAgent] = agent
    -
    -                        this[kClients] = agent[kClients]
    -                        this[kOptions] = buildMockOptions(opts)
    -                    }
    -
    -                    get(origin) {
    -                        let dispatcher = this[kMockAgentGet](origin)
    -
    -                        if (!dispatcher) {
    -                            dispatcher = this[kFactory](origin)
    -                            this[kMockAgentSet](origin, dispatcher)
    -                        }
    -                        return dispatcher
    -                    }
    -
    -                    dispatch(opts, handler) {
    -                        // Call MockAgent.get to perform additional setup before dispatching as normal
    -                        this.get(opts.origin)
    -                        return this[kAgent].dispatch(opts, handler)
    -                    }
    -
    -                    async close() {
    -                        await this[kAgent].close()
    -                        this[kClients].clear()
    -                    }
    -
    -                    deactivate() {
    -                        this[kIsMockActive] = false
    -                    }
    -
    -                    activate() {
    -                        this[kIsMockActive] = true
    -                    }
    -
    -                    enableNetConnect(matcher) {
    -                        if (typeof matcher === 'string' || typeof matcher === 'function' || matcher instanceof RegExp) {
    -                            if (Array.isArray(this[kNetConnect])) {
    -                                this[kNetConnect].push(matcher)
    -                            } else {
    -                                this[kNetConnect] = [matcher]
    -                            }
    -                        } else if (typeof matcher === 'undefined') {
    -                            this[kNetConnect] = true
    -                        } else {
    -                            throw new InvalidArgumentError('Unsupported matcher. Must be one of String|Function|RegExp.')
    -                        }
    -                    }
    -
    -                    disableNetConnect() {
    -                        this[kNetConnect] = false
    -                    }
    -
    -                    // This is required to bypass issues caused by using global symbols - see:
    -                    // https://github.com/nodejs/undici/issues/1447
    -                    get isMockActive() {
    -                        return this[kIsMockActive]
    -                    }
    -
    -                    [kMockAgentSet](origin, dispatcher) {
    -                        this[kClients].set(origin, new FakeWeakRef(dispatcher))
    -                    }
    -
    -                    [kFactory](origin) {
    -                        const mockOptions = Object.assign({ agent: this }, this[kOptions])
    -                        return this[kOptions] && this[kOptions].connections === 1
    -                            ? new MockClient(origin, mockOptions)
    -                            : new MockPool(origin, mockOptions)
    -                    }
    -
    -                    [kMockAgentGet](origin) {
    -                        // First check if we can immediately find it
    -                        const ref = this[kClients].get(origin)
    -                        if (ref) {
    -                            return ref.deref()
    -                        }
    -
    -                        // If the origin is not a string create a dummy parent pool and return to user
    -                        if (typeof origin !== 'string') {
    -                            const dispatcher = this[kFactory]('http://localhost:9999')
    -                            this[kMockAgentSet](origin, dispatcher)
    -                            return dispatcher
    -                        }
    -
    -                        // If we match, create a pool and assign the same dispatches
    -                        for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) {
    -                            const nonExplicitDispatcher = nonExplicitRef.deref()
    -                            if (nonExplicitDispatcher && typeof keyMatcher !== 'string' && matchValue(keyMatcher, origin)) {
    -                                const dispatcher = this[kFactory](origin)
    -                                this[kMockAgentSet](origin, dispatcher)
    -                                dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches]
    -                                return dispatcher
    -                            }
    -                        }
    -                    }
    -
    -                    [kGetNetConnect]() {
    -                        return this[kNetConnect]
    -                    }
    -
    -                    pendingInterceptors() {
    -                        const mockAgentClients = this[kClients]
    -
    -                        return Array.from(mockAgentClients.entries())
    -                            .flatMap(([origin, scope]) => scope.deref()[kDispatches].map(dispatch => ({ ...dispatch, origin })))
    -                            .filter(({ pending }) => pending)
    -                    }
    -
    -                    assertNoPendingInterceptors({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) {
    -                        const pending = this.pendingInterceptors()
    -
    -                        if (pending.length === 0) {
    -                            return
    -                        }
    -
    -                        const pluralizer = new Pluralizer('interceptor', 'interceptors').pluralize(pending.length)
    -
    -                        throw new UndiciError(`
    -${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending:
    -
    -${pendingInterceptorsFormatter.format(pending)}
    -`.trim())
    -                    }
    -                }
    -
    -                module.exports = MockAgent
    -
    -
    -                /***/
    -}),
    -
    -/***/ 8687:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { promisify } = __nccwpck_require__(3837)
    -                const Client = __nccwpck_require__(3598)
    -                const { buildMockDispatch } = __nccwpck_require__(9323)
    -                const {
    -                    kDispatches,
    -                    kMockAgent,
    -                    kClose,
    -                    kOriginalClose,
    -                    kOrigin,
    -                    kOriginalDispatch,
    -                    kConnected
    -                } = __nccwpck_require__(4347)
    -                const { MockInterceptor } = __nccwpck_require__(410)
    -                const Symbols = __nccwpck_require__(2785)
    -                const { InvalidArgumentError } = __nccwpck_require__(8045)
    -
    -                /**
    -                 * MockClient provides an API that extends the Client to influence the mockDispatches.
    -                 */
    -                class MockClient extends Client {
    -                    constructor(origin, opts) {
    -                        super(origin, opts)
    -
    -                        if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {
    -                            throw new InvalidArgumentError('Argument opts.agent must implement Agent')
    -                        }
    -
    -                        this[kMockAgent] = opts.agent
    -                        this[kOrigin] = origin
    -                        this[kDispatches] = []
    -                        this[kConnected] = 1
    -                        this[kOriginalDispatch] = this.dispatch
    -                        this[kOriginalClose] = this.close.bind(this)
    -
    -                        this.dispatch = buildMockDispatch.call(this)
    -                        this.close = this[kClose]
    -                    }
    -
    -                    get [Symbols.kConnected]() {
    -                        return this[kConnected]
    -                    }
    -
    -                    /**
    -                     * Sets up the base interceptor for mocking replies from undici.
    -                     */
    -                    intercept(opts) {
    -                        return new MockInterceptor(opts, this[kDispatches])
    -                    }
    -
    -                    async [kClose]() {
    -                        await promisify(this[kOriginalClose])()
    -                        this[kConnected] = 0
    -                        this[kMockAgent][Symbols.kClients].delete(this[kOrigin])
    -                    }
    -                }
    -
    -                module.exports = MockClient
    -
    -
    -                /***/
    -}),
    -
    -/***/ 888:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { UndiciError } = __nccwpck_require__(8045)
    -
    -                class MockNotMatchedError extends UndiciError {
    -                    constructor(message) {
    -                        super(message)
    -                        Error.captureStackTrace(this, MockNotMatchedError)
    -                        this.name = 'MockNotMatchedError'
    -                        this.message = message || 'The request does not match any registered mock dispatches'
    -                        this.code = 'UND_MOCK_ERR_MOCK_NOT_MATCHED'
    -                    }
    -                }
    -
    -                module.exports = {
    -                    MockNotMatchedError
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 410:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { getResponseData, buildKey, addMockDispatch } = __nccwpck_require__(9323)
    -                const {
    -                    kDispatches,
    -                    kDispatchKey,
    -                    kDefaultHeaders,
    -                    kDefaultTrailers,
    -                    kContentLength,
    -                    kMockDispatch
    -                } = __nccwpck_require__(4347)
    -                const { InvalidArgumentError } = __nccwpck_require__(8045)
    -                const { buildURL } = __nccwpck_require__(3983)
    -
    -                /**
    -                 * Defines the scope API for an interceptor reply
    -                 */
    -                class MockScope {
    -                    constructor(mockDispatch) {
    -                        this[kMockDispatch] = mockDispatch
    -                    }
    -
    -                    /**
    -                     * Delay a reply by a set amount in ms.
    -                     */
    -                    delay(waitInMs) {
    -                        if (typeof waitInMs !== 'number' || !Number.isInteger(waitInMs) || waitInMs <= 0) {
    -                            throw new InvalidArgumentError('waitInMs must be a valid integer > 0')
    -                        }
    -
    -                        this[kMockDispatch].delay = waitInMs
    -                        return this
    -                    }
    -
    -                    /**
    -                     * For a defined reply, never mark as consumed.
    -                     */
    -                    persist() {
    -                        this[kMockDispatch].persist = true
    -                        return this
    -                    }
    -
    -                    /**
    -                     * Allow one to define a reply for a set amount of matching requests.
    -                     */
    -                    times(repeatTimes) {
    -                        if (typeof repeatTimes !== 'number' || !Number.isInteger(repeatTimes) || repeatTimes <= 0) {
    -                            throw new InvalidArgumentError('repeatTimes must be a valid integer > 0')
    -                        }
    -
    -                        this[kMockDispatch].times = repeatTimes
    -                        return this
    -                    }
    -                }
    -
    -                /**
    -                 * Defines an interceptor for a Mock
    -                 */
    -                class MockInterceptor {
    -                    constructor(opts, mockDispatches) {
    -                        if (typeof opts !== 'object') {
    -                            throw new InvalidArgumentError('opts must be an object')
    -                        }
    -                        if (typeof opts.path === 'undefined') {
    -                            throw new InvalidArgumentError('opts.path must be defined')
    -                        }
    -                        if (typeof opts.method === 'undefined') {
    -                            opts.method = 'GET'
    -                        }
    -                        // See https://github.com/nodejs/undici/issues/1245
    -                        // As per RFC 3986, clients are not supposed to send URI
    -                        // fragments to servers when they retrieve a document,
    -                        if (typeof opts.path === 'string') {
    -                            if (opts.query) {
    -                                opts.path = buildURL(opts.path, opts.query)
    -                            } else {
    -                                // Matches https://github.com/nodejs/undici/blob/main/lib/fetch/index.js#L1811
    -                                const parsedURL = new URL(opts.path, 'data://')
    -                                opts.path = parsedURL.pathname + parsedURL.search
    -                            }
    -                        }
    -                        if (typeof opts.method === 'string') {
    -                            opts.method = opts.method.toUpperCase()
    -                        }
    -
    -                        this[kDispatchKey] = buildKey(opts)
    -                        this[kDispatches] = mockDispatches
    -                        this[kDefaultHeaders] = {}
    -                        this[kDefaultTrailers] = {}
    -                        this[kContentLength] = false
    -                    }
    -
    -                    createMockScopeDispatchData(statusCode, data, responseOptions = {}) {
    -                        const responseData = getResponseData(data)
    -                        const contentLength = this[kContentLength] ? { 'content-length': responseData.length } : {}
    -                        const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }
    -                        const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }
    -
    -                        return { statusCode, data, headers, trailers }
    -                    }
    -
    -                    validateReplyParameters(statusCode, data, responseOptions) {
    -                        if (typeof statusCode === 'undefined') {
    -                            throw new InvalidArgumentError('statusCode must be defined')
    -                        }
    -                        if (typeof data === 'undefined') {
    -                            throw new InvalidArgumentError('data must be defined')
    -                        }
    -                        if (typeof responseOptions !== 'object') {
    -                            throw new InvalidArgumentError('responseOptions must be an object')
    -                        }
    -                    }
    -
    -                    /**
    -                     * Mock an undici request with a defined reply.
    -                     */
    -                    reply(replyData) {
    -                        // Values of reply aren't available right now as they
    -                        // can only be available when the reply callback is invoked.
    -                        if (typeof replyData === 'function') {
    -                            // We'll first wrap the provided callback in another function,
    -                            // this function will properly resolve the data from the callback
    -                            // when invoked.
    -                            const wrappedDefaultsCallback = (opts) => {
    -                                // Our reply options callback contains the parameter for statusCode, data and options.
    -                                const resolvedData = replyData(opts)
    -
    -                                // Check if it is in the right format
    -                                if (typeof resolvedData !== 'object') {
    -                                    throw new InvalidArgumentError('reply options callback must return an object')
    -                                }
    -
    -                                const { statusCode, data = '', responseOptions = {} } = resolvedData
    -                                this.validateReplyParameters(statusCode, data, responseOptions)
    -                                // Since the values can be obtained immediately we return them
    -                                // from this higher order function that will be resolved later.
    -                                return {
    -                                    ...this.createMockScopeDispatchData(statusCode, data, responseOptions)
    -                                }
    -                            }
    -
    -                            // Add usual dispatch data, but this time set the data parameter to function that will eventually provide data.
    -                            const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback)
    -                            return new MockScope(newMockDispatch)
    -                        }
    -
    -                        // We can have either one or three parameters, if we get here,
    -                        // we should have 1-3 parameters. So we spread the arguments of
    -                        // this function to obtain the parameters, since replyData will always
    -                        // just be the statusCode.
    -                        const [statusCode, data = '', responseOptions = {}] = [...arguments]
    -                        this.validateReplyParameters(statusCode, data, responseOptions)
    -
    -                        // Send in-already provided data like usual
    -                        const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions)
    -                        const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData)
    -                        return new MockScope(newMockDispatch)
    -                    }
    -
    -                    /**
    -                     * Mock an undici request with a defined error.
    -                     */
    -                    replyWithError(error) {
    -                        if (typeof error === 'undefined') {
    -                            throw new InvalidArgumentError('error must be defined')
    -                        }
    -
    -                        const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error })
    -                        return new MockScope(newMockDispatch)
    -                    }
    -
    -                    /**
    -                     * Set default reply headers on the interceptor for subsequent replies
    -                     */
    -                    defaultReplyHeaders(headers) {
    -                        if (typeof headers === 'undefined') {
    -                            throw new InvalidArgumentError('headers must be defined')
    -                        }
    -
    -                        this[kDefaultHeaders] = headers
    -                        return this
    -                    }
    -
    -                    /**
    -                     * Set default reply trailers on the interceptor for subsequent replies
    -                     */
    -                    defaultReplyTrailers(trailers) {
    -                        if (typeof trailers === 'undefined') {
    -                            throw new InvalidArgumentError('trailers must be defined')
    -                        }
    -
    -                        this[kDefaultTrailers] = trailers
    -                        return this
    -                    }
    -
    -                    /**
    -                     * Set reply content length header for replies on the interceptor
    -                     */
    -                    replyContentLength() {
    -                        this[kContentLength] = true
    -                        return this
    -                    }
    -                }
    -
    -                module.exports.MockInterceptor = MockInterceptor
    -                module.exports.MockScope = MockScope
    -
    -
    -                /***/
    -}),
    -
    -/***/ 6193:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { promisify } = __nccwpck_require__(3837)
    -                const Pool = __nccwpck_require__(4634)
    -                const { buildMockDispatch } = __nccwpck_require__(9323)
    -                const {
    -                    kDispatches,
    -                    kMockAgent,
    -                    kClose,
    -                    kOriginalClose,
    -                    kOrigin,
    -                    kOriginalDispatch,
    -                    kConnected
    -                } = __nccwpck_require__(4347)
    -                const { MockInterceptor } = __nccwpck_require__(410)
    -                const Symbols = __nccwpck_require__(2785)
    -                const { InvalidArgumentError } = __nccwpck_require__(8045)
    -
    -                /**
    -                 * MockPool provides an API that extends the Pool to influence the mockDispatches.
    -                 */
    -                class MockPool extends Pool {
    -                    constructor(origin, opts) {
    -                        super(origin, opts)
    -
    -                        if (!opts || !opts.agent || typeof opts.agent.dispatch !== 'function') {
    -                            throw new InvalidArgumentError('Argument opts.agent must implement Agent')
    -                        }
    -
    -                        this[kMockAgent] = opts.agent
    -                        this[kOrigin] = origin
    -                        this[kDispatches] = []
    -                        this[kConnected] = 1
    -                        this[kOriginalDispatch] = this.dispatch
    -                        this[kOriginalClose] = this.close.bind(this)
    -
    -                        this.dispatch = buildMockDispatch.call(this)
    -                        this.close = this[kClose]
    -                    }
    -
    -                    get [Symbols.kConnected]() {
    -                        return this[kConnected]
    -                    }
    -
    -                    /**
    -                     * Sets up the base interceptor for mocking replies from undici.
    -                     */
    -                    intercept(opts) {
    -                        return new MockInterceptor(opts, this[kDispatches])
    -                    }
    -
    -                    async [kClose]() {
    -                        await promisify(this[kOriginalClose])()
    -                        this[kConnected] = 0
    -                        this[kMockAgent][Symbols.kClients].delete(this[kOrigin])
    -                    }
    -                }
    -
    -                module.exports = MockPool
    -
    -
    -                /***/
    -}),
    -
    -/***/ 4347:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                module.exports = {
    -                    kAgent: Symbol('agent'),
    -                    kOptions: Symbol('options'),
    -                    kFactory: Symbol('factory'),
    -                    kDispatches: Symbol('dispatches'),
    -                    kDispatchKey: Symbol('dispatch key'),
    -                    kDefaultHeaders: Symbol('default headers'),
    -                    kDefaultTrailers: Symbol('default trailers'),
    -                    kContentLength: Symbol('content length'),
    -                    kMockAgent: Symbol('mock agent'),
    -                    kMockAgentSet: Symbol('mock agent set'),
    -                    kMockAgentGet: Symbol('mock agent get'),
    -                    kMockDispatch: Symbol('mock dispatch'),
    -                    kClose: Symbol('close'),
    -                    kOriginalClose: Symbol('original agent close'),
    -                    kOrigin: Symbol('origin'),
    -                    kIsMockActive: Symbol('is mock active'),
    -                    kNetConnect: Symbol('net connect'),
    -                    kGetNetConnect: Symbol('get net connect'),
    -                    kConnected: Symbol('connected')
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 9323:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { MockNotMatchedError } = __nccwpck_require__(888)
    -                const {
    -                    kDispatches,
    -                    kMockAgent,
    -                    kOriginalDispatch,
    -                    kOrigin,
    -                    kGetNetConnect
    -                } = __nccwpck_require__(4347)
    -                const { buildURL, nop } = __nccwpck_require__(3983)
    -                const { STATUS_CODES } = __nccwpck_require__(3685)
    -                const {
    -                    types: {
    -                        isPromise
    -                    }
    -                } = __nccwpck_require__(3837)
    -
    -                function matchValue(match, value) {
    -                    if (typeof match === 'string') {
    -                        return match === value
    -                    }
    -                    if (match instanceof RegExp) {
    -                        return match.test(value)
    -                    }
    -                    if (typeof match === 'function') {
    -                        return match(value) === true
    -                    }
    -                    return false
    -                }
    -
    -                function lowerCaseEntries(headers) {
    -                    return Object.fromEntries(
    -                        Object.entries(headers).map(([headerName, headerValue]) => {
    -                            return [headerName.toLocaleLowerCase(), headerValue]
    -                        })
    -                    )
    -                }
    -
    -                /**
    -                 * @param {import('../../index').Headers|string[]|Record} headers
    -                 * @param {string} key
    -                 */
    -                function getHeaderByName(headers, key) {
    -                    if (Array.isArray(headers)) {
    -                        for (let i = 0; i < headers.length; i += 2) {
    -                            if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) {
    -                                return headers[i + 1]
    -                            }
    -                        }
    -
    -                        return undefined
    -                    } else if (typeof headers.get === 'function') {
    -                        return headers.get(key)
    -                    } else {
    -                        return lowerCaseEntries(headers)[key.toLocaleLowerCase()]
    -                    }
    -                }
    -
    -                /** @param {string[]} headers */
    -                function buildHeadersFromArray(headers) { // fetch HeadersList
    -                    const clone = headers.slice()
    -                    const entries = []
    -                    for (let index = 0; index < clone.length; index += 2) {
    -                        entries.push([clone[index], clone[index + 1]])
    -                    }
    -                    return Object.fromEntries(entries)
    -                }
    -
    -                function matchHeaders(mockDispatch, headers) {
    -                    if (typeof mockDispatch.headers === 'function') {
    -                        if (Array.isArray(headers)) { // fetch HeadersList
    -                            headers = buildHeadersFromArray(headers)
    -                        }
    -                        return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {})
    -                    }
    -                    if (typeof mockDispatch.headers === 'undefined') {
    -                        return true
    -                    }
    -                    if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') {
    -                        return false
    -                    }
    -
    -                    for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) {
    -                        const headerValue = getHeaderByName(headers, matchHeaderName)
    -
    -                        if (!matchValue(matchHeaderValue, headerValue)) {
    -                            return false
    -                        }
    -                    }
    -                    return true
    -                }
    -
    -                function safeUrl(path) {
    -                    if (typeof path !== 'string') {
    -                        return path
    -                    }
    -
    -                    const pathSegments = path.split('?')
    -
    -                    if (pathSegments.length !== 2) {
    -                        return path
    -                    }
    -
    -                    const qp = new URLSearchParams(pathSegments.pop())
    -                    qp.sort()
    -                    return [...pathSegments, qp.toString()].join('?')
    -                }
    -
    -                function matchKey(mockDispatch, { path, method, body, headers }) {
    -                    const pathMatch = matchValue(mockDispatch.path, path)
    -                    const methodMatch = matchValue(mockDispatch.method, method)
    -                    const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true
    -                    const headersMatch = matchHeaders(mockDispatch, headers)
    -                    return pathMatch && methodMatch && bodyMatch && headersMatch
    -                }
    -
    -                function getResponseData(data) {
    -                    if (Buffer.isBuffer(data)) {
    -                        return data
    -                    } else if (typeof data === 'object') {
    -                        return JSON.stringify(data)
    -                    } else {
    -                        return data.toString()
    -                    }
    -                }
    -
    -                function getMockDispatch(mockDispatches, key) {
    -                    const basePath = key.query ? buildURL(key.path, key.query) : key.path
    -                    const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath
    -
    -                    // Match path
    -                    let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath))
    -                    if (matchedMockDispatches.length === 0) {
    -                        throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`)
    -                    }
    -
    -                    // Match method
    -                    matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method))
    -                    if (matchedMockDispatches.length === 0) {
    -                        throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`)
    -                    }
    -
    -                    // Match body
    -                    matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true)
    -                    if (matchedMockDispatches.length === 0) {
    -                        throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`)
    -                    }
    -
    -                    // Match headers
    -                    matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers))
    -                    if (matchedMockDispatches.length === 0) {
    -                        throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers}'`)
    -                    }
    -
    -                    return matchedMockDispatches[0]
    -                }
    -
    -                function addMockDispatch(mockDispatches, key, data) {
    -                    const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false }
    -                    const replyData = typeof data === 'function' ? { callback: data } : { ...data }
    -                    const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }
    -                    mockDispatches.push(newMockDispatch)
    -                    return newMockDispatch
    -                }
    -
    -                function deleteMockDispatch(mockDispatches, key) {
    -                    const index = mockDispatches.findIndex(dispatch => {
    -                        if (!dispatch.consumed) {
    -                            return false
    -                        }
    -                        return matchKey(dispatch, key)
    -                    })
    -                    if (index !== -1) {
    -                        mockDispatches.splice(index, 1)
    -                    }
    -                }
    -
    -                function buildKey(opts) {
    -                    const { path, method, body, headers, query } = opts
    -                    return {
    -                        path,
    -                        method,
    -                        body,
    -                        headers,
    -                        query
    -                    }
    -                }
    -
    -                function generateKeyValues(data) {
    -                    return Object.entries(data).reduce((keyValuePairs, [key, value]) => [
    -                        ...keyValuePairs,
    -                        Buffer.from(`${key}`),
    -                        Array.isArray(value) ? value.map(x => Buffer.from(`${x}`)) : Buffer.from(`${value}`)
    -                    ], [])
    -                }
    -
    -                /**
    -                 * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
    -                 * @param {number} statusCode
    -                 */
    -                function getStatusText(statusCode) {
    -                    return STATUS_CODES[statusCode] || 'unknown'
    -                }
    -
    -                async function getResponse(body) {
    -                    const buffers = []
    -                    for await (const data of body) {
    -                        buffers.push(data)
    -                    }
    -                    return Buffer.concat(buffers).toString('utf8')
    -                }
    -
    -                /**
    -                 * Mock dispatch function used to simulate undici dispatches
    -                 */
    -                function mockDispatch(opts, handler) {
    -                    // Get mock dispatch from built key
    -                    const key = buildKey(opts)
    -                    const mockDispatch = getMockDispatch(this[kDispatches], key)
    -
    -                    mockDispatch.timesInvoked++
    -
    -                    // Here's where we resolve a callback if a callback is present for the dispatch data.
    -                    if (mockDispatch.data.callback) {
    -                        mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) }
    -                    }
    -
    -                    // Parse mockDispatch data
    -                    const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch
    -                    const { timesInvoked, times } = mockDispatch
    -
    -                    // If it's used up and not persistent, mark as consumed
    -                    mockDispatch.consumed = !persist && timesInvoked >= times
    -                    mockDispatch.pending = timesInvoked < times
    -
    -                    // If specified, trigger dispatch error
    -                    if (error !== null) {
    -                        deleteMockDispatch(this[kDispatches], key)
    -                        handler.onError(error)
    -                        return true
    -                    }
    -
    -                    // Handle the request with a delay if necessary
    -                    if (typeof delay === 'number' && delay > 0) {
    -                        setTimeout(() => {
    -                            handleReply(this[kDispatches])
    -                        }, delay)
    -                    } else {
    -                        handleReply(this[kDispatches])
    -                    }
    -
    -                    function handleReply(mockDispatches, _data = data) {
    -                        // fetch's HeadersList is a 1D string array
    -                        const optsHeaders = Array.isArray(opts.headers)
    -                            ? buildHeadersFromArray(opts.headers)
    -                            : opts.headers
    -                        const body = typeof _data === 'function'
    -                            ? _data({ ...opts, headers: optsHeaders })
    -                            : _data
    -
    -                        // util.types.isPromise is likely needed for jest.
    -                        if (isPromise(body)) {
    -                            // If handleReply is asynchronous, throwing an error
    -                            // in the callback will reject the promise, rather than
    -                            // synchronously throw the error, which breaks some tests.
    -                            // Rather, we wait for the callback to resolve if it is a
    -                            // promise, and then re-run handleReply with the new body.
    -                            body.then((newData) => handleReply(mockDispatches, newData))
    -                            return
    -                        }
    -
    -                        const responseData = getResponseData(body)
    -                        const responseHeaders = generateKeyValues(headers)
    -                        const responseTrailers = generateKeyValues(trailers)
    -
    -                        handler.abort = nop
    -                        handler.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode))
    -                        handler.onData(Buffer.from(responseData))
    -                        handler.onComplete(responseTrailers)
    -                        deleteMockDispatch(mockDispatches, key)
    -                    }
    -
    -                    function resume() { }
    -
    -                    return true
    -                }
    -
    -                function buildMockDispatch() {
    -                    const agent = this[kMockAgent]
    -                    const origin = this[kOrigin]
    -                    const originalDispatch = this[kOriginalDispatch]
    -
    -                    return function dispatch(opts, handler) {
    -                        if (agent.isMockActive) {
    -                            try {
    -                                mockDispatch.call(this, opts, handler)
    -                            } catch (error) {
    -                                if (error instanceof MockNotMatchedError) {
    -                                    const netConnect = agent[kGetNetConnect]()
    -                                    if (netConnect === false) {
    -                                        throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`)
    -                                    }
    -                                    if (checkNetConnect(netConnect, origin)) {
    -                                        originalDispatch.call(this, opts, handler)
    -                                    } else {
    -                                        throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`)
    -                                    }
    -                                } else {
    -                                    throw error
    -                                }
    -                            }
    -                        } else {
    -                            originalDispatch.call(this, opts, handler)
    -                        }
    -                    }
    -                }
    -
    -                function checkNetConnect(netConnect, origin) {
    -                    const url = new URL(origin)
    -                    if (netConnect === true) {
    -                        return true
    -                    } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) {
    -                        return true
    -                    }
    -                    return false
    -                }
    -
    -                function buildMockOptions(opts) {
    -                    if (opts) {
    -                        const { agent, ...mockOptions } = opts
    -                        return mockOptions
    -                    }
    -                }
    -
    -                module.exports = {
    -                    getResponseData,
    -                    getMockDispatch,
    -                    addMockDispatch,
    -                    deleteMockDispatch,
    -                    buildKey,
    -                    generateKeyValues,
    -                    matchValue,
    -                    getResponse,
    -                    getStatusText,
    -                    mockDispatch,
    -                    buildMockDispatch,
    -                    checkNetConnect,
    -                    buildMockOptions,
    -                    getHeaderByName
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 6823:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { Transform } = __nccwpck_require__(2781)
    -                const { Console } = __nccwpck_require__(6206)
    -
    -                /**
    -                 * Gets the output of `console.table(…)` as a string.
    -                 */
    -                module.exports = class PendingInterceptorsFormatter {
    -                    constructor({ disableColors } = {}) {
    -                        this.transform = new Transform({
    -                            transform(chunk, _enc, cb) {
    -                                cb(null, chunk)
    -                            }
    -                        })
    -
    -                        this.logger = new Console({
    -                            stdout: this.transform,
    -                            inspectOptions: {
    -                                colors: !disableColors && !process.env.CI
    -                            }
    -                        })
    -                    }
    -
    -                    format(pendingInterceptors) {
    -                        const withPrettyHeaders = pendingInterceptors.map(
    -                            ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({
    -                                Method: method,
    -                                Origin: origin,
    -                                Path: path,
    -                                'Status code': statusCode,
    -                                Persistent: persist ? '✅' : '❌',
    -                                Invocations: timesInvoked,
    -                                Remaining: persist ? Infinity : times - timesInvoked
    -                            }))
    -
    -                        this.logger.table(withPrettyHeaders)
    -                        return this.transform.read().toString()
    -                    }
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 8891:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                const singulars = {
    -                    pronoun: 'it',
    -                    is: 'is',
    -                    was: 'was',
    -                    this: 'this'
    -                }
    -
    -                const plurals = {
    -                    pronoun: 'they',
    -                    is: 'are',
    -                    was: 'were',
    -                    this: 'these'
    -                }
    -
    -                module.exports = class Pluralizer {
    -                    constructor(singular, plural) {
    -                        this.singular = singular
    -                        this.plural = plural
    -                    }
    -
    -                    pluralize(count) {
    -                        const one = count === 1
    -                        const keys = one ? singulars : plurals
    -                        const noun = one ? this.singular : this.plural
    -                        return { ...keys, count, noun }
    -                    }
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 8266:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                /* eslint-disable */
    -
    -
    -
    -                // Extracted from node/lib/internal/fixed_queue.js
    -
    -                // Currently optimal queue size, tested on V8 6.0 - 6.6. Must be power of two.
    -                const kSize = 2048;
    -                const kMask = kSize - 1;
    -
    -                // The FixedQueue is implemented as a singly-linked list of fixed-size
    -                // circular buffers. It looks something like this:
    -                //
    -                //  head                                                       tail
    -                //    |                                                          |
    -                //    v                                                          v
    -                // +-----------+ <-----\       +-----------+ <------\         +-----------+
    -                // |  [null]   |        \----- |   next    |         \------- |   next    |
    -                // +-----------+               +-----------+                  +-----------+
    -                // |   item    | <-- bottom    |   item    | <-- bottom       |  [empty]  |
    -                // |   item    |               |   item    |                  |  [empty]  |
    -                // |   item    |               |   item    |                  |  [empty]  |
    -                // |   item    |               |   item    |                  |  [empty]  |
    -                // |   item    |               |   item    |       bottom --> |   item    |
    -                // |   item    |               |   item    |                  |   item    |
    -                // |    ...    |               |    ...    |                  |    ...    |
    -                // |   item    |               |   item    |                  |   item    |
    -                // |   item    |               |   item    |                  |   item    |
    -                // |  [empty]  | <-- top       |   item    |                  |   item    |
    -                // |  [empty]  |               |   item    |                  |   item    |
    -                // |  [empty]  |               |  [empty]  | <-- top  top --> |  [empty]  |
    -                // +-----------+               +-----------+                  +-----------+
    -                //
    -                // Or, if there is only one circular buffer, it looks something
    -                // like either of these:
    -                //
    -                //  head   tail                                 head   tail
    -                //    |     |                                     |     |
    -                //    v     v                                     v     v
    -                // +-----------+                               +-----------+
    -                // |  [null]   |                               |  [null]   |
    -                // +-----------+                               +-----------+
    -                // |  [empty]  |                               |   item    |
    -                // |  [empty]  |                               |   item    |
    -                // |   item    | <-- bottom            top --> |  [empty]  |
    -                // |   item    |                               |  [empty]  |
    -                // |  [empty]  | <-- top            bottom --> |   item    |
    -                // |  [empty]  |                               |   item    |
    -                // +-----------+                               +-----------+
    -                //
    -                // Adding a value means moving `top` forward by one, removing means
    -                // moving `bottom` forward by one. After reaching the end, the queue
    -                // wraps around.
    -                //
    -                // When `top === bottom` the current queue is empty and when
    -                // `top + 1 === bottom` it's full. This wastes a single space of storage
    -                // but allows much quicker checks.
    -
    -                class FixedCircularBuffer {
    -                    constructor() {
    -                        this.bottom = 0;
    -                        this.top = 0;
    -                        this.list = new Array(kSize);
    -                        this.next = null;
    -                    }
    -
    -                    isEmpty() {
    -                        return this.top === this.bottom;
    -                    }
    -
    -                    isFull() {
    -                        return ((this.top + 1) & kMask) === this.bottom;
    -                    }
    -
    -                    push(data) {
    -                        this.list[this.top] = data;
    -                        this.top = (this.top + 1) & kMask;
    -                    }
    -
    -                    shift() {
    -                        const nextItem = this.list[this.bottom];
    -                        if (nextItem === undefined)
    -                            return null;
    -                        this.list[this.bottom] = undefined;
    -                        this.bottom = (this.bottom + 1) & kMask;
    -                        return nextItem;
    -                    }
    -                }
    -
    -                module.exports = class FixedQueue {
    -                    constructor() {
    -                        this.head = this.tail = new FixedCircularBuffer();
    -                    }
    -
    -                    isEmpty() {
    -                        return this.head.isEmpty();
    -                    }
    -
    -                    push(data) {
    -                        if (this.head.isFull()) {
    -                            // Head is full: Creates a new queue, sets the old queue's `.next` to it,
    -                            // and sets it as the new main queue.
    -                            this.head = this.head.next = new FixedCircularBuffer();
    -                        }
    -                        this.head.push(data);
    -                    }
    -
    -                    shift() {
    -                        const tail = this.tail;
    -                        const next = tail.shift();
    -                        if (tail.isEmpty() && tail.next !== null) {
    -                            // If there is another queue, it forms the new tail.
    -                            this.tail = tail.next;
    -                        }
    -                        return next;
    -                    }
    -                };
    -
    -
    -                /***/
    -}),
    -
    -/***/ 3198:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const DispatcherBase = __nccwpck_require__(4839)
    -                const FixedQueue = __nccwpck_require__(8266)
    -                const { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = __nccwpck_require__(2785)
    -                const PoolStats = __nccwpck_require__(9689)
    -
    -                const kClients = Symbol('clients')
    -                const kNeedDrain = Symbol('needDrain')
    -                const kQueue = Symbol('queue')
    -                const kClosedResolve = Symbol('closed resolve')
    -                const kOnDrain = Symbol('onDrain')
    -                const kOnConnect = Symbol('onConnect')
    -                const kOnDisconnect = Symbol('onDisconnect')
    -                const kOnConnectionError = Symbol('onConnectionError')
    -                const kGetDispatcher = Symbol('get dispatcher')
    -                const kAddClient = Symbol('add client')
    -                const kRemoveClient = Symbol('remove client')
    -                const kStats = Symbol('stats')
    -
    -                class PoolBase extends DispatcherBase {
    -                    constructor() {
    -                        super()
    -
    -                        this[kQueue] = new FixedQueue()
    -                        this[kClients] = []
    -                        this[kQueued] = 0
    -
    -                        const pool = this
    -
    -                        this[kOnDrain] = function onDrain(origin, targets) {
    -                            const queue = pool[kQueue]
    -
    -                            let needDrain = false
    -
    -                            while (!needDrain) {
    -                                const item = queue.shift()
    -                                if (!item) {
    -                                    break
    -                                }
    -                                pool[kQueued]--
    -                                needDrain = !this.dispatch(item.opts, item.handler)
    -                            }
    -
    -                            this[kNeedDrain] = needDrain
    -
    -                            if (!this[kNeedDrain] && pool[kNeedDrain]) {
    -                                pool[kNeedDrain] = false
    -                                pool.emit('drain', origin, [pool, ...targets])
    -                            }
    -
    -                            if (pool[kClosedResolve] && queue.isEmpty()) {
    -                                Promise
    -                                    .all(pool[kClients].map(c => c.close()))
    -                                    .then(pool[kClosedResolve])
    -                            }
    -                        }
    -
    -                        this[kOnConnect] = (origin, targets) => {
    -                            pool.emit('connect', origin, [pool, ...targets])
    -                        }
    -
    -                        this[kOnDisconnect] = (origin, targets, err) => {
    -                            pool.emit('disconnect', origin, [pool, ...targets], err)
    -                        }
    -
    -                        this[kOnConnectionError] = (origin, targets, err) => {
    -                            pool.emit('connectionError', origin, [pool, ...targets], err)
    -                        }
    -
    -                        this[kStats] = new PoolStats(this)
    -                    }
    -
    -                    get [kBusy]() {
    -                        return this[kNeedDrain]
    -                    }
    -
    -                    get [kConnected]() {
    -                        return this[kClients].filter(client => client[kConnected]).length
    -                    }
    -
    -                    get [kFree]() {
    -                        return this[kClients].filter(client => client[kConnected] && !client[kNeedDrain]).length
    -                    }
    -
    -                    get [kPending]() {
    -                        let ret = this[kQueued]
    -                        for (const { [kPending]: pending } of this[kClients]) {
    -                            ret += pending
    -                        }
    -                        return ret
    -                    }
    -
    -                    get [kRunning]() {
    -                        let ret = 0
    -                        for (const { [kRunning]: running } of this[kClients]) {
    -                            ret += running
    -                        }
    -                        return ret
    -                    }
    -
    -                    get [kSize]() {
    -                        let ret = this[kQueued]
    -                        for (const { [kSize]: size } of this[kClients]) {
    -                            ret += size
    -                        }
    -                        return ret
    -                    }
    -
    -                    get stats() {
    -                        return this[kStats]
    -                    }
    -
    -                    async [kClose]() {
    -                        if (this[kQueue].isEmpty()) {
    -                            return Promise.all(this[kClients].map(c => c.close()))
    -                        } else {
    -                            return new Promise((resolve) => {
    -                                this[kClosedResolve] = resolve
    -                            })
    -                        }
    -                    }
    -
    -                    async [kDestroy](err) {
    -                        while (true) {
    -                            const item = this[kQueue].shift()
    -                            if (!item) {
    -                                break
    -                            }
    -                            item.handler.onError(err)
    -                        }
    -
    -                        return Promise.all(this[kClients].map(c => c.destroy(err)))
    -                    }
    -
    -                    [kDispatch](opts, handler) {
    -                        const dispatcher = this[kGetDispatcher]()
    -
    -                        if (!dispatcher) {
    -                            this[kNeedDrain] = true
    -                            this[kQueue].push({ opts, handler })
    -                            this[kQueued]++
    -                        } else if (!dispatcher.dispatch(opts, handler)) {
    -                            dispatcher[kNeedDrain] = true
    -                            this[kNeedDrain] = !this[kGetDispatcher]()
    -                        }
    -
    -                        return !this[kNeedDrain]
    -                    }
    -
    -                    [kAddClient](client) {
    -                        client
    -                            .on('drain', this[kOnDrain])
    -                            .on('connect', this[kOnConnect])
    -                            .on('disconnect', this[kOnDisconnect])
    -                            .on('connectionError', this[kOnConnectionError])
    -
    -                        this[kClients].push(client)
    -
    -                        if (this[kNeedDrain]) {
    -                            process.nextTick(() => {
    -                                if (this[kNeedDrain]) {
    -                                    this[kOnDrain](client[kUrl], [this, client])
    -                                }
    -                            })
    -                        }
    -
    -                        return this
    -                    }
    -
    -                    [kRemoveClient](client) {
    -                        client.close(() => {
    -                            const idx = this[kClients].indexOf(client)
    -                            if (idx !== -1) {
    -                                this[kClients].splice(idx, 1)
    -                            }
    -                        })
    -
    -                        this[kNeedDrain] = this[kClients].some(dispatcher => (
    -                            !dispatcher[kNeedDrain] &&
    -                            dispatcher.closed !== true &&
    -                            dispatcher.destroyed !== true
    -                        ))
    -                    }
    -                }
    -
    -                module.exports = {
    -                    PoolBase,
    -                    kClients,
    -                    kNeedDrain,
    -                    kAddClient,
    -                    kRemoveClient,
    -                    kGetDispatcher
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 9689:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                const { kFree, kConnected, kPending, kQueued, kRunning, kSize } = __nccwpck_require__(2785)
    -                const kPool = Symbol('pool')
    -
    -                class PoolStats {
    -                    constructor(pool) {
    -                        this[kPool] = pool
    -                    }
    -
    -                    get connected() {
    -                        return this[kPool][kConnected]
    -                    }
    -
    -                    get free() {
    -                        return this[kPool][kFree]
    -                    }
    -
    -                    get pending() {
    -                        return this[kPool][kPending]
    -                    }
    -
    -                    get queued() {
    -                        return this[kPool][kQueued]
    -                    }
    -
    -                    get running() {
    -                        return this[kPool][kRunning]
    -                    }
    -
    -                    get size() {
    -                        return this[kPool][kSize]
    -                    }
    -                }
    -
    -                module.exports = PoolStats
    -
    -
    -                /***/
    -}),
    -
    -/***/ 4634:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const {
    -                    PoolBase,
    -                    kClients,
    -                    kNeedDrain,
    -                    kAddClient,
    -                    kGetDispatcher
    -                } = __nccwpck_require__(3198)
    -                const Client = __nccwpck_require__(3598)
    -                const {
    -                    InvalidArgumentError
    -                } = __nccwpck_require__(8045)
    -                const util = __nccwpck_require__(3983)
    -                const { kUrl, kInterceptors } = __nccwpck_require__(2785)
    -                const buildConnector = __nccwpck_require__(2067)
    -
    -                const kOptions = Symbol('options')
    -                const kConnections = Symbol('connections')
    -                const kFactory = Symbol('factory')
    -
    -                function defaultFactory(origin, opts) {
    -                    return new Client(origin, opts)
    -                }
    -
    -                class Pool extends PoolBase {
    -                    constructor(origin, {
    -                        connections,
    -                        factory = defaultFactory,
    -                        connect,
    -                        connectTimeout,
    -                        tls,
    -                        maxCachedSessions,
    -                        socketPath,
    -                        autoSelectFamily,
    -                        autoSelectFamilyAttemptTimeout,
    -                        allowH2,
    -                        ...options
    -                    } = {}) {
    -                        super()
    -
    -                        if (connections != null && (!Number.isFinite(connections) || connections < 0)) {
    -                            throw new InvalidArgumentError('invalid connections')
    -                        }
    -
    -                        if (typeof factory !== 'function') {
    -                            throw new InvalidArgumentError('factory must be a function.')
    -                        }
    -
    -                        if (connect != null && typeof connect !== 'function' && typeof connect !== 'object') {
    -                            throw new InvalidArgumentError('connect must be a function or an object')
    -                        }
    -
    -                        if (typeof connect !== 'function') {
    -                            connect = buildConnector({
    -                                ...tls,
    -                                maxCachedSessions,
    -                                allowH2,
    -                                socketPath,
    -                                timeout: connectTimeout,
    -                                ...(util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : undefined),
    -                                ...connect
    -                            })
    -                        }
    -
    -                        this[kInterceptors] = options.interceptors && options.interceptors.Pool && Array.isArray(options.interceptors.Pool)
    -                            ? options.interceptors.Pool
    -                            : []
    -                        this[kConnections] = connections || null
    -                        this[kUrl] = util.parseOrigin(origin)
    -                        this[kOptions] = { ...util.deepClone(options), connect, allowH2 }
    -                        this[kOptions].interceptors = options.interceptors
    -                            ? { ...options.interceptors }
    -                            : undefined
    -                        this[kFactory] = factory
    -                    }
    -
    -                    [kGetDispatcher]() {
    -                        let dispatcher = this[kClients].find(dispatcher => !dispatcher[kNeedDrain])
    -
    -                        if (dispatcher) {
    -                            return dispatcher
    -                        }
    -
    -                        if (!this[kConnections] || this[kClients].length < this[kConnections]) {
    -                            dispatcher = this[kFactory](this[kUrl], this[kOptions])
    -                            this[kAddClient](dispatcher)
    -                        }
    -
    -                        return dispatcher
    -                    }
    -                }
    -
    -                module.exports = Pool
    -
    -
    -                /***/
    -}),
    -
    -/***/ 7858:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { kProxy, kClose, kDestroy, kInterceptors } = __nccwpck_require__(2785)
    -                const { URL } = __nccwpck_require__(7310)
    -                const Agent = __nccwpck_require__(7890)
    -                const Pool = __nccwpck_require__(4634)
    -                const DispatcherBase = __nccwpck_require__(4839)
    -                const { InvalidArgumentError, RequestAbortedError } = __nccwpck_require__(8045)
    -                const buildConnector = __nccwpck_require__(2067)
    -
    -                const kAgent = Symbol('proxy agent')
    -                const kClient = Symbol('proxy client')
    -                const kProxyHeaders = Symbol('proxy headers')
    -                const kRequestTls = Symbol('request tls settings')
    -                const kProxyTls = Symbol('proxy tls settings')
    -                const kConnectEndpoint = Symbol('connect endpoint function')
    -
    -                function defaultProtocolPort(protocol) {
    -                    return protocol === 'https:' ? 443 : 80
    -                }
    -
    -                function buildProxyOptions(opts) {
    -                    if (typeof opts === 'string') {
    -                        opts = { uri: opts }
    -                    }
    -
    -                    if (!opts || !opts.uri) {
    -                        throw new InvalidArgumentError('Proxy opts.uri is mandatory')
    -                    }
    -
    -                    return {
    -                        uri: opts.uri,
    -                        protocol: opts.protocol || 'https'
    -                    }
    -                }
    -
    -                function defaultFactory(origin, opts) {
    -                    return new Pool(origin, opts)
    -                }
    -
    -                class ProxyAgent extends DispatcherBase {
    -                    constructor(opts) {
    -                        super(opts)
    -                        this[kProxy] = buildProxyOptions(opts)
    -                        this[kAgent] = new Agent(opts)
    -                        this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent)
    -                            ? opts.interceptors.ProxyAgent
    -                            : []
    -
    -                        if (typeof opts === 'string') {
    -                            opts = { uri: opts }
    -                        }
    -
    -                        if (!opts || !opts.uri) {
    -                            throw new InvalidArgumentError('Proxy opts.uri is mandatory')
    -                        }
    -
    -                        const { clientFactory = defaultFactory } = opts
    -
    -                        if (typeof clientFactory !== 'function') {
    -                            throw new InvalidArgumentError('Proxy opts.clientFactory must be a function.')
    -                        }
    -
    -                        this[kRequestTls] = opts.requestTls
    -                        this[kProxyTls] = opts.proxyTls
    -                        this[kProxyHeaders] = opts.headers || {}
    -
    -                        const resolvedUrl = new URL(opts.uri)
    -                        const { origin, port, host, username, password } = resolvedUrl
    -
    -                        if (opts.auth && opts.token) {
    -                            throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')
    -                        } else if (opts.auth) {
    -                            /* @deprecated in favour of opts.token */
    -                            this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`
    -                        } else if (opts.token) {
    -                            this[kProxyHeaders]['proxy-authorization'] = opts.token
    -                        } else if (username && password) {
    -                            this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`
    -                        }
    -
    -                        const connect = buildConnector({ ...opts.proxyTls })
    -                        this[kConnectEndpoint] = buildConnector({ ...opts.requestTls })
    -                        this[kClient] = clientFactory(resolvedUrl, { connect })
    -                        this[kAgent] = new Agent({
    -                            ...opts,
    -                            connect: async (opts, callback) => {
    -                                let requestedHost = opts.host
    -                                if (!opts.port) {
    -                                    requestedHost += `:${defaultProtocolPort(opts.protocol)}`
    -                                }
    -                                try {
    -                                    const { socket, statusCode } = await this[kClient].connect({
    -                                        origin,
    -                                        port,
    -                                        path: requestedHost,
    -                                        signal: opts.signal,
    -                                        headers: {
    -                                            ...this[kProxyHeaders],
    -                                            host
    -                                        }
    -                                    })
    -                                    if (statusCode !== 200) {
    -                                        socket.on('error', () => { }).destroy()
    -                                        callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`))
    -                                    }
    -                                    if (opts.protocol !== 'https:') {
    -                                        callback(null, socket)
    -                                        return
    -                                    }
    -                                    let servername
    -                                    if (this[kRequestTls]) {
    -                                        servername = this[kRequestTls].servername
    -                                    } else {
    -                                        servername = opts.servername
    -                                    }
    -                                    this[kConnectEndpoint]({ ...opts, servername, httpSocket: socket }, callback)
    -                                } catch (err) {
    -                                    callback(err)
    -                                }
    -                            }
    -                        })
    -                    }
    -
    -                    dispatch(opts, handler) {
    -                        const { host } = new URL(opts.origin)
    -                        const headers = buildHeaders(opts.headers)
    -                        throwIfProxyAuthIsSent(headers)
    -                        return this[kAgent].dispatch(
    -                            {
    -                                ...opts,
    -                                headers: {
    -                                    ...headers,
    -                                    host
    -                                }
    -                            },
    -                            handler
    -                        )
    -                    }
    -
    -                    async [kClose]() {
    -                        await this[kAgent].close()
    -                        await this[kClient].close()
    -                    }
    -
    -                    async [kDestroy]() {
    -                        await this[kAgent].destroy()
    -                        await this[kClient].destroy()
    -                    }
    -                }
    -
    -                /**
    -                 * @param {string[] | Record} headers
    -                 * @returns {Record}
    -                 */
    -                function buildHeaders(headers) {
    -                    // When using undici.fetch, the headers list is stored
    -                    // as an array.
    -                    if (Array.isArray(headers)) {
    -                        /** @type {Record} */
    -                        const headersPair = {}
    -
    -                        for (let i = 0; i < headers.length; i += 2) {
    -                            headersPair[headers[i]] = headers[i + 1]
    -                        }
    -
    -                        return headersPair
    -                    }
    -
    -                    return headers
    -                }
    -
    -                /**
    -                 * @param {Record} headers
    -                 *
    -                 * Previous versions of ProxyAgent suggests the Proxy-Authorization in request headers
    -                 * Nevertheless, it was changed and to avoid a security vulnerability by end users
    -                 * this check was created.
    -                 * It should be removed in the next major version for performance reasons
    -                 */
    -                function throwIfProxyAuthIsSent(headers) {
    -                    const existProxyAuth = headers && Object.keys(headers)
    -                        .find((key) => key.toLowerCase() === 'proxy-authorization')
    -                    if (existProxyAuth) {
    -                        throw new InvalidArgumentError('Proxy-Authorization should be sent in ProxyAgent constructor')
    -                    }
    -                }
    -
    -                module.exports = ProxyAgent
    -
    -
    -                /***/
    -}),
    -
    -/***/ 9459:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                let fastNow = Date.now()
    -                let fastNowTimeout
    -
    -                const fastTimers = []
    -
    -                function onTimeout() {
    -                    fastNow = Date.now()
    -
    -                    let len = fastTimers.length
    -                    let idx = 0
    -                    while (idx < len) {
    -                        const timer = fastTimers[idx]
    -
    -                        if (timer.state === 0) {
    -                            timer.state = fastNow + timer.delay
    -                        } else if (timer.state > 0 && fastNow >= timer.state) {
    -                            timer.state = -1
    -                            timer.callback(timer.opaque)
    -                        }
    -
    -                        if (timer.state === -1) {
    -                            timer.state = -2
    -                            if (idx !== len - 1) {
    -                                fastTimers[idx] = fastTimers.pop()
    -                            } else {
    -                                fastTimers.pop()
    -                            }
    -                            len -= 1
    -                        } else {
    -                            idx += 1
    -                        }
    -                    }
    -
    -                    if (fastTimers.length > 0) {
    -                        refreshTimeout()
    -                    }
    -                }
    -
    -                function refreshTimeout() {
    -                    if (fastNowTimeout && fastNowTimeout.refresh) {
    -                        fastNowTimeout.refresh()
    -                    } else {
    -                        clearTimeout(fastNowTimeout)
    -                        fastNowTimeout = setTimeout(onTimeout, 1e3)
    -                        if (fastNowTimeout.unref) {
    -                            fastNowTimeout.unref()
    -                        }
    -                    }
    -                }
    -
    -                class Timeout {
    -                    constructor(callback, delay, opaque) {
    -                        this.callback = callback
    -                        this.delay = delay
    -                        this.opaque = opaque
    -
    -                        //  -2 not in timer list
    -                        //  -1 in timer list but inactive
    -                        //   0 in timer list waiting for time
    -                        // > 0 in timer list waiting for time to expire
    -                        this.state = -2
    -
    -                        this.refresh()
    -                    }
    -
    -                    refresh() {
    -                        if (this.state === -2) {
    -                            fastTimers.push(this)
    -                            if (!fastNowTimeout || fastTimers.length === 1) {
    -                                refreshTimeout()
    -                            }
    -                        }
    -
    -                        this.state = 0
    -                    }
    -
    -                    clear() {
    -                        this.state = -1
    -                    }
    -                }
    -
    -                module.exports = {
    -                    setTimeout(callback, delay, opaque) {
    -                        return delay < 1e3
    -                            ? setTimeout(callback, delay, opaque)
    -                            : new Timeout(callback, delay, opaque)
    -                    },
    -                    clearTimeout(timeout) {
    -                        if (timeout instanceof Timeout) {
    -                            timeout.clear()
    -                        } else {
    -                            clearTimeout(timeout)
    -                        }
    -                    }
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 5354:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const diagnosticsChannel = __nccwpck_require__(7643)
    -                const { uid, states } = __nccwpck_require__(9188)
    -                const {
    -                    kReadyState,
    -                    kSentClose,
    -                    kByteParser,
    -                    kReceivedClose
    -                } = __nccwpck_require__(7578)
    -                const { fireEvent, failWebsocketConnection } = __nccwpck_require__(5515)
    -                const { CloseEvent } = __nccwpck_require__(2611)
    -                const { makeRequest } = __nccwpck_require__(8359)
    -                const { fetching } = __nccwpck_require__(4881)
    -                const { Headers } = __nccwpck_require__(554)
    -                const { getGlobalDispatcher } = __nccwpck_require__(1892)
    -                const { kHeadersList } = __nccwpck_require__(2785)
    -
    -                const channels = {}
    -                channels.open = diagnosticsChannel.channel('undici:websocket:open')
    -                channels.close = diagnosticsChannel.channel('undici:websocket:close')
    -                channels.socketError = diagnosticsChannel.channel('undici:websocket:socket_error')
    -
    -                /** @type {import('crypto')} */
    -                let crypto
    -                try {
    -                    crypto = __nccwpck_require__(6113)
    -                } catch {
    -
    -                }
    -
    -                /**
    -                 * @see https://websockets.spec.whatwg.org/#concept-websocket-establish
    -                 * @param {URL} url
    -                 * @param {string|string[]} protocols
    -                 * @param {import('./websocket').WebSocket} ws
    -                 * @param {(response: any) => void} onEstablish
    -                 * @param {Partial} options
    -                 */
    -                function establishWebSocketConnection(url, protocols, ws, onEstablish, options) {
    -                    // 1. Let requestURL be a copy of url, with its scheme set to "http", if url’s
    -                    //    scheme is "ws", and to "https" otherwise.
    -                    const requestURL = url
    -
    -                    requestURL.protocol = url.protocol === 'ws:' ? 'http:' : 'https:'
    -
    -                    // 2. Let request be a new request, whose URL is requestURL, client is client,
    -                    //    service-workers mode is "none", referrer is "no-referrer", mode is
    -                    //    "websocket", credentials mode is "include", cache mode is "no-store" ,
    -                    //    and redirect mode is "error".
    -                    const request = makeRequest({
    -                        urlList: [requestURL],
    -                        serviceWorkers: 'none',
    -                        referrer: 'no-referrer',
    -                        mode: 'websocket',
    -                        credentials: 'include',
    -                        cache: 'no-store',
    -                        redirect: 'error'
    -                    })
    -
    -                    // Note: undici extension, allow setting custom headers.
    -                    if (options.headers) {
    -                        const headersList = new Headers(options.headers)[kHeadersList]
    -
    -                        request.headersList = headersList
    -                    }
    -
    -                    // 3. Append (`Upgrade`, `websocket`) to request’s header list.
    -                    // 4. Append (`Connection`, `Upgrade`) to request’s header list.
    -                    // Note: both of these are handled by undici currently.
    -                    // https://github.com/nodejs/undici/blob/68c269c4144c446f3f1220951338daef4a6b5ec4/lib/client.js#L1397
    -
    -                    // 5. Let keyValue be a nonce consisting of a randomly selected
    -                    //    16-byte value that has been forgiving-base64-encoded and
    -                    //    isomorphic encoded.
    -                    const keyValue = crypto.randomBytes(16).toString('base64')
    -
    -                    // 6. Append (`Sec-WebSocket-Key`, keyValue) to request’s
    -                    //    header list.
    -                    request.headersList.append('sec-websocket-key', keyValue)
    -
    -                    // 7. Append (`Sec-WebSocket-Version`, `13`) to request’s
    -                    //    header list.
    -                    request.headersList.append('sec-websocket-version', '13')
    -
    -                    // 8. For each protocol in protocols, combine
    -                    //    (`Sec-WebSocket-Protocol`, protocol) in request’s header
    -                    //    list.
    -                    for (const protocol of protocols) {
    -                        request.headersList.append('sec-websocket-protocol', protocol)
    -                    }
    -
    -                    // 9. Let permessageDeflate be a user-agent defined
    -                    //    "permessage-deflate" extension header value.
    -                    // https://github.com/mozilla/gecko-dev/blob/ce78234f5e653a5d3916813ff990f053510227bc/netwerk/protocol/websocket/WebSocketChannel.cpp#L2673
    -                    // TODO: enable once permessage-deflate is supported
    -                    const permessageDeflate = '' // 'permessage-deflate; 15'
    -
    -                    // 10. Append (`Sec-WebSocket-Extensions`, permessageDeflate) to
    -                    //     request’s header list.
    -                    // request.headersList.append('sec-websocket-extensions', permessageDeflate)
    -
    -                    // 11. Fetch request with useParallelQueue set to true, and
    -                    //     processResponse given response being these steps:
    -                    const controller = fetching({
    -                        request,
    -                        useParallelQueue: true,
    -                        dispatcher: options.dispatcher ?? getGlobalDispatcher(),
    -                        processResponse(response) {
    -                            // 1. If response is a network error or its status is not 101,
    -                            //    fail the WebSocket connection.
    -                            if (response.type === 'error' || response.status !== 101) {
    -                                failWebsocketConnection(ws, 'Received network error or non-101 status code.')
    -                                return
    -                            }
    -
    -                            // 2. If protocols is not the empty list and extracting header
    -                            //    list values given `Sec-WebSocket-Protocol` and response’s
    -                            //    header list results in null, failure, or the empty byte
    -                            //    sequence, then fail the WebSocket connection.
    -                            if (protocols.length !== 0 && !response.headersList.get('Sec-WebSocket-Protocol')) {
    -                                failWebsocketConnection(ws, 'Server did not respond with sent protocols.')
    -                                return
    -                            }
    -
    -                            // 3. Follow the requirements stated step 2 to step 6, inclusive,
    -                            //    of the last set of steps in section 4.1 of The WebSocket
    -                            //    Protocol to validate response. This either results in fail
    -                            //    the WebSocket connection or the WebSocket connection is
    -                            //    established.
    -
    -                            // 2. If the response lacks an |Upgrade| header field or the |Upgrade|
    -                            //    header field contains a value that is not an ASCII case-
    -                            //    insensitive match for the value "websocket", the client MUST
    -                            //    _Fail the WebSocket Connection_.
    -                            if (response.headersList.get('Upgrade')?.toLowerCase() !== 'websocket') {
    -                                failWebsocketConnection(ws, 'Server did not set Upgrade header to "websocket".')
    -                                return
    -                            }
    -
    -                            // 3. If the response lacks a |Connection| header field or the
    -                            //    |Connection| header field doesn't contain a token that is an
    -                            //    ASCII case-insensitive match for the value "Upgrade", the client
    -                            //    MUST _Fail the WebSocket Connection_.
    -                            if (response.headersList.get('Connection')?.toLowerCase() !== 'upgrade') {
    -                                failWebsocketConnection(ws, 'Server did not set Connection header to "upgrade".')
    -                                return
    -                            }
    -
    -                            // 4. If the response lacks a |Sec-WebSocket-Accept| header field or
    -                            //    the |Sec-WebSocket-Accept| contains a value other than the
    -                            //    base64-encoded SHA-1 of the concatenation of the |Sec-WebSocket-
    -                            //    Key| (as a string, not base64-decoded) with the string "258EAFA5-
    -                            //    E914-47DA-95CA-C5AB0DC85B11" but ignoring any leading and
    -                            //    trailing whitespace, the client MUST _Fail the WebSocket
    -                            //    Connection_.
    -                            const secWSAccept = response.headersList.get('Sec-WebSocket-Accept')
    -                            const digest = crypto.createHash('sha1').update(keyValue + uid).digest('base64')
    -                            if (secWSAccept !== digest) {
    -                                failWebsocketConnection(ws, 'Incorrect hash received in Sec-WebSocket-Accept header.')
    -                                return
    -                            }
    -
    -                            // 5. If the response includes a |Sec-WebSocket-Extensions| header
    -                            //    field and this header field indicates the use of an extension
    -                            //    that was not present in the client's handshake (the server has
    -                            //    indicated an extension not requested by the client), the client
    -                            //    MUST _Fail the WebSocket Connection_.  (The parsing of this
    -                            //    header field to determine which extensions are requested is
    -                            //    discussed in Section 9.1.)
    -                            const secExtension = response.headersList.get('Sec-WebSocket-Extensions')
    -
    -                            if (secExtension !== null && secExtension !== permessageDeflate) {
    -                                failWebsocketConnection(ws, 'Received different permessage-deflate than the one set.')
    -                                return
    -                            }
    -
    -                            // 6. If the response includes a |Sec-WebSocket-Protocol| header field
    -                            //    and this header field indicates the use of a subprotocol that was
    -                            //    not present in the client's handshake (the server has indicated a
    -                            //    subprotocol not requested by the client), the client MUST _Fail
    -                            //    the WebSocket Connection_.
    -                            const secProtocol = response.headersList.get('Sec-WebSocket-Protocol')
    -
    -                            if (secProtocol !== null && secProtocol !== request.headersList.get('Sec-WebSocket-Protocol')) {
    -                                failWebsocketConnection(ws, 'Protocol was not set in the opening handshake.')
    -                                return
    -                            }
    -
    -                            response.socket.on('data', onSocketData)
    -                            response.socket.on('close', onSocketClose)
    -                            response.socket.on('error', onSocketError)
    -
    -                            if (channels.open.hasSubscribers) {
    -                                channels.open.publish({
    -                                    address: response.socket.address(),
    -                                    protocol: secProtocol,
    -                                    extensions: secExtension
    -                                })
    -                            }
    -
    -                            onEstablish(response)
    -                        }
    -                    })
    -
    -                    return controller
    -                }
    -
    -                /**
    -                 * @param {Buffer} chunk
    -                 */
    -                function onSocketData(chunk) {
    -                    if (!this.ws[kByteParser].write(chunk)) {
    -                        this.pause()
    -                    }
    -                }
    -
    -                /**
    -                 * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol
    -                 * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.4
    -                 */
    -                function onSocketClose() {
    -                    const { ws } = this
    -
    -                    // If the TCP connection was closed after the
    -                    // WebSocket closing handshake was completed, the WebSocket connection
    -                    // is said to have been closed _cleanly_.
    -                    const wasClean = ws[kSentClose] && ws[kReceivedClose]
    -
    -                    let code = 1005
    -                    let reason = ''
    -
    -                    const result = ws[kByteParser].closingInfo
    -
    -                    if (result) {
    -                        code = result.code ?? 1005
    -                        reason = result.reason
    -                    } else if (!ws[kSentClose]) {
    -                        // If _The WebSocket
    -                        // Connection is Closed_ and no Close control frame was received by the
    -                        // endpoint (such as could occur if the underlying transport connection
    -                        // is lost), _The WebSocket Connection Close Code_ is considered to be
    -                        // 1006.
    -                        code = 1006
    -                    }
    -
    -                    // 1. Change the ready state to CLOSED (3).
    -                    ws[kReadyState] = states.CLOSED
    -
    -                    // 2. If the user agent was required to fail the WebSocket
    -                    //    connection, or if the WebSocket connection was closed
    -                    //    after being flagged as full, fire an event named error
    -                    //    at the WebSocket object.
    -                    // TODO
    -
    -                    // 3. Fire an event named close at the WebSocket object,
    -                    //    using CloseEvent, with the wasClean attribute
    -                    //    initialized to true if the connection closed cleanly
    -                    //    and false otherwise, the code attribute initialized to
    -                    //    the WebSocket connection close code, and the reason
    -                    //    attribute initialized to the result of applying UTF-8
    -                    //    decode without BOM to the WebSocket connection close
    -                    //    reason.
    -                    fireEvent('close', ws, CloseEvent, {
    -                        wasClean, code, reason
    -                    })
    -
    -                    if (channels.close.hasSubscribers) {
    -                        channels.close.publish({
    -                            websocket: ws,
    -                            code,
    -                            reason
    -                        })
    -                    }
    -                }
    -
    -                function onSocketError(error) {
    -                    const { ws } = this
    -
    -                    ws[kReadyState] = states.CLOSING
    -
    -                    if (channels.socketError.hasSubscribers) {
    -                        channels.socketError.publish(error)
    -                    }
    -
    -                    this.destroy()
    -                }
    -
    -                module.exports = {
    -                    establishWebSocketConnection
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 9188:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                // This is a Globally Unique Identifier unique used
    -                // to validate that the endpoint accepts websocket
    -                // connections.
    -                // See https://www.rfc-editor.org/rfc/rfc6455.html#section-1.3
    -                const uid = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
    -
    -                /** @type {PropertyDescriptor} */
    -                const staticPropertyDescriptors = {
    -                    enumerable: true,
    -                    writable: false,
    -                    configurable: false
    -                }
    -
    -                const states = {
    -                    CONNECTING: 0,
    -                    OPEN: 1,
    -                    CLOSING: 2,
    -                    CLOSED: 3
    -                }
    -
    -                const opcodes = {
    -                    CONTINUATION: 0x0,
    -                    TEXT: 0x1,
    -                    BINARY: 0x2,
    -                    CLOSE: 0x8,
    -                    PING: 0x9,
    -                    PONG: 0xA
    -                }
    -
    -                const maxUnsigned16Bit = 2 ** 16 - 1 // 65535
    -
    -                const parserStates = {
    -                    INFO: 0,
    -                    PAYLOADLENGTH_16: 2,
    -                    PAYLOADLENGTH_64: 3,
    -                    READ_DATA: 4
    -                }
    -
    -                const emptyBuffer = Buffer.allocUnsafe(0)
    -
    -                module.exports = {
    -                    uid,
    -                    staticPropertyDescriptors,
    -                    states,
    -                    opcodes,
    -                    maxUnsigned16Bit,
    -                    parserStates,
    -                    emptyBuffer
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 2611:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { webidl } = __nccwpck_require__(1744)
    -                const { kEnumerableProperty } = __nccwpck_require__(3983)
    -                const { MessagePort } = __nccwpck_require__(1267)
    -
    -                /**
    -                 * @see https://html.spec.whatwg.org/multipage/comms.html#messageevent
    -                 */
    -                class MessageEvent extends Event {
    -                    #eventInit
    -
    -                    constructor(type, eventInitDict = {}) {
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent constructor' })
    -
    -                        type = webidl.converters.DOMString(type)
    -                        eventInitDict = webidl.converters.MessageEventInit(eventInitDict)
    -
    -                        super(type, eventInitDict)
    -
    -                        this.#eventInit = eventInitDict
    -                    }
    -
    -                    get data() {
    -                        webidl.brandCheck(this, MessageEvent)
    -
    -                        return this.#eventInit.data
    -                    }
    -
    -                    get origin() {
    -                        webidl.brandCheck(this, MessageEvent)
    -
    -                        return this.#eventInit.origin
    -                    }
    -
    -                    get lastEventId() {
    -                        webidl.brandCheck(this, MessageEvent)
    -
    -                        return this.#eventInit.lastEventId
    -                    }
    -
    -                    get source() {
    -                        webidl.brandCheck(this, MessageEvent)
    -
    -                        return this.#eventInit.source
    -                    }
    -
    -                    get ports() {
    -                        webidl.brandCheck(this, MessageEvent)
    -
    -                        if (!Object.isFrozen(this.#eventInit.ports)) {
    -                            Object.freeze(this.#eventInit.ports)
    -                        }
    -
    -                        return this.#eventInit.ports
    -                    }
    -
    -                    initMessageEvent(
    -                        type,
    -                        bubbles = false,
    -                        cancelable = false,
    -                        data = null,
    -                        origin = '',
    -                        lastEventId = '',
    -                        source = null,
    -                        ports = []
    -                    ) {
    -                        webidl.brandCheck(this, MessageEvent)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'MessageEvent.initMessageEvent' })
    -
    -                        return new MessageEvent(type, {
    -                            bubbles, cancelable, data, origin, lastEventId, source, ports
    -                        })
    -                    }
    -                }
    -
    -                /**
    -                 * @see https://websockets.spec.whatwg.org/#the-closeevent-interface
    -                 */
    -                class CloseEvent extends Event {
    -                    #eventInit
    -
    -                    constructor(type, eventInitDict = {}) {
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'CloseEvent constructor' })
    -
    -                        type = webidl.converters.DOMString(type)
    -                        eventInitDict = webidl.converters.CloseEventInit(eventInitDict)
    -
    -                        super(type, eventInitDict)
    -
    -                        this.#eventInit = eventInitDict
    -                    }
    -
    -                    get wasClean() {
    -                        webidl.brandCheck(this, CloseEvent)
    -
    -                        return this.#eventInit.wasClean
    -                    }
    -
    -                    get code() {
    -                        webidl.brandCheck(this, CloseEvent)
    -
    -                        return this.#eventInit.code
    -                    }
    -
    -                    get reason() {
    -                        webidl.brandCheck(this, CloseEvent)
    -
    -                        return this.#eventInit.reason
    -                    }
    -                }
    -
    -                // https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface
    -                class ErrorEvent extends Event {
    -                    #eventInit
    -
    -                    constructor(type, eventInitDict) {
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'ErrorEvent constructor' })
    -
    -                        super(type, eventInitDict)
    -
    -                        type = webidl.converters.DOMString(type)
    -                        eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {})
    -
    -                        this.#eventInit = eventInitDict
    -                    }
    -
    -                    get message() {
    -                        webidl.brandCheck(this, ErrorEvent)
    -
    -                        return this.#eventInit.message
    -                    }
    -
    -                    get filename() {
    -                        webidl.brandCheck(this, ErrorEvent)
    -
    -                        return this.#eventInit.filename
    -                    }
    -
    -                    get lineno() {
    -                        webidl.brandCheck(this, ErrorEvent)
    -
    -                        return this.#eventInit.lineno
    -                    }
    -
    -                    get colno() {
    -                        webidl.brandCheck(this, ErrorEvent)
    -
    -                        return this.#eventInit.colno
    -                    }
    -
    -                    get error() {
    -                        webidl.brandCheck(this, ErrorEvent)
    -
    -                        return this.#eventInit.error
    -                    }
    -                }
    -
    -                Object.defineProperties(MessageEvent.prototype, {
    -                    [Symbol.toStringTag]: {
    -                        value: 'MessageEvent',
    -                        configurable: true
    -                    },
    -                    data: kEnumerableProperty,
    -                    origin: kEnumerableProperty,
    -                    lastEventId: kEnumerableProperty,
    -                    source: kEnumerableProperty,
    -                    ports: kEnumerableProperty,
    -                    initMessageEvent: kEnumerableProperty
    -                })
    -
    -                Object.defineProperties(CloseEvent.prototype, {
    -                    [Symbol.toStringTag]: {
    -                        value: 'CloseEvent',
    -                        configurable: true
    -                    },
    -                    reason: kEnumerableProperty,
    -                    code: kEnumerableProperty,
    -                    wasClean: kEnumerableProperty
    -                })
    -
    -                Object.defineProperties(ErrorEvent.prototype, {
    -                    [Symbol.toStringTag]: {
    -                        value: 'ErrorEvent',
    -                        configurable: true
    -                    },
    -                    message: kEnumerableProperty,
    -                    filename: kEnumerableProperty,
    -                    lineno: kEnumerableProperty,
    -                    colno: kEnumerableProperty,
    -                    error: kEnumerableProperty
    -                })
    -
    -                webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort)
    -
    -                webidl.converters['sequence'] = webidl.sequenceConverter(
    -                    webidl.converters.MessagePort
    -                )
    -
    -                const eventInit = [
    -                    {
    -                        key: 'bubbles',
    -                        converter: webidl.converters.boolean,
    -                        defaultValue: false
    -                    },
    -                    {
    -                        key: 'cancelable',
    -                        converter: webidl.converters.boolean,
    -                        defaultValue: false
    -                    },
    -                    {
    -                        key: 'composed',
    -                        converter: webidl.converters.boolean,
    -                        defaultValue: false
    -                    }
    -                ]
    -
    -                webidl.converters.MessageEventInit = webidl.dictionaryConverter([
    -                    ...eventInit,
    -                    {
    -                        key: 'data',
    -                        converter: webidl.converters.any,
    -                        defaultValue: null
    -                    },
    -                    {
    -                        key: 'origin',
    -                        converter: webidl.converters.USVString,
    -                        defaultValue: ''
    -                    },
    -                    {
    -                        key: 'lastEventId',
    -                        converter: webidl.converters.DOMString,
    -                        defaultValue: ''
    -                    },
    -                    {
    -                        key: 'source',
    -                        // Node doesn't implement WindowProxy or ServiceWorker, so the only
    -                        // valid value for source is a MessagePort.
    -                        converter: webidl.nullableConverter(webidl.converters.MessagePort),
    -                        defaultValue: null
    -                    },
    -                    {
    -                        key: 'ports',
    -                        converter: webidl.converters['sequence'],
    -                        get defaultValue() {
    -                            return []
    -                        }
    -                    }
    -                ])
    -
    -                webidl.converters.CloseEventInit = webidl.dictionaryConverter([
    -                    ...eventInit,
    -                    {
    -                        key: 'wasClean',
    -                        converter: webidl.converters.boolean,
    -                        defaultValue: false
    -                    },
    -                    {
    -                        key: 'code',
    -                        converter: webidl.converters['unsigned short'],
    -                        defaultValue: 0
    -                    },
    -                    {
    -                        key: 'reason',
    -                        converter: webidl.converters.USVString,
    -                        defaultValue: ''
    -                    }
    -                ])
    -
    -                webidl.converters.ErrorEventInit = webidl.dictionaryConverter([
    -                    ...eventInit,
    -                    {
    -                        key: 'message',
    -                        converter: webidl.converters.DOMString,
    -                        defaultValue: ''
    -                    },
    -                    {
    -                        key: 'filename',
    -                        converter: webidl.converters.USVString,
    -                        defaultValue: ''
    -                    },
    -                    {
    -                        key: 'lineno',
    -                        converter: webidl.converters['unsigned long'],
    -                        defaultValue: 0
    -                    },
    -                    {
    -                        key: 'colno',
    -                        converter: webidl.converters['unsigned long'],
    -                        defaultValue: 0
    -                    },
    -                    {
    -                        key: 'error',
    -                        converter: webidl.converters.any
    -                    }
    -                ])
    -
    -                module.exports = {
    -                    MessageEvent,
    -                    CloseEvent,
    -                    ErrorEvent
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 5444:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { maxUnsigned16Bit } = __nccwpck_require__(9188)
    -
    -                /** @type {import('crypto')} */
    -                let crypto
    -                try {
    -                    crypto = __nccwpck_require__(6113)
    -                } catch {
    -
    -                }
    -
    -                class WebsocketFrameSend {
    -                    /**
    -                     * @param {Buffer|undefined} data
    -                     */
    -                    constructor(data) {
    -                        this.frameData = data
    -                        this.maskKey = crypto.randomBytes(4)
    -                    }
    -
    -                    createFrame(opcode) {
    -                        const bodyLength = this.frameData?.byteLength ?? 0
    -
    -                        /** @type {number} */
    -                        let payloadLength = bodyLength // 0-125
    -                        let offset = 6
    -
    -                        if (bodyLength > maxUnsigned16Bit) {
    -                            offset += 8 // payload length is next 8 bytes
    -                            payloadLength = 127
    -                        } else if (bodyLength > 125) {
    -                            offset += 2 // payload length is next 2 bytes
    -                            payloadLength = 126
    -                        }
    -
    -                        const buffer = Buffer.allocUnsafe(bodyLength + offset)
    -
    -                        // Clear first 2 bytes, everything else is overwritten
    -                        buffer[0] = buffer[1] = 0
    -                        buffer[0] |= 0x80 // FIN
    -                        buffer[0] = (buffer[0] & 0xF0) + opcode // opcode
    -
    -                        /*! ws. MIT License. Einar Otto Stangvik  */
    -                        buffer[offset - 4] = this.maskKey[0]
    -                        buffer[offset - 3] = this.maskKey[1]
    -                        buffer[offset - 2] = this.maskKey[2]
    -                        buffer[offset - 1] = this.maskKey[3]
    -
    -                        buffer[1] = payloadLength
    -
    -                        if (payloadLength === 126) {
    -                            buffer.writeUInt16BE(bodyLength, 2)
    -                        } else if (payloadLength === 127) {
    -                            // Clear extended payload length
    -                            buffer[2] = buffer[3] = 0
    -                            buffer.writeUIntBE(bodyLength, 4, 6)
    -                        }
    -
    -                        buffer[1] |= 0x80 // MASK
    -
    -                        // mask body
    -                        for (let i = 0; i < bodyLength; i++) {
    -                            buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]
    -                        }
    -
    -                        return buffer
    -                    }
    -                }
    -
    -                module.exports = {
    -                    WebsocketFrameSend
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 1688:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { Writable } = __nccwpck_require__(2781)
    -                const diagnosticsChannel = __nccwpck_require__(7643)
    -                const { parserStates, opcodes, states, emptyBuffer } = __nccwpck_require__(9188)
    -                const { kReadyState, kSentClose, kResponse, kReceivedClose } = __nccwpck_require__(7578)
    -                const { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = __nccwpck_require__(5515)
    -                const { WebsocketFrameSend } = __nccwpck_require__(5444)
    -
    -                // This code was influenced by ws released under the MIT license.
    -                // Copyright (c) 2011 Einar Otto Stangvik 
    -                // Copyright (c) 2013 Arnout Kazemier and contributors
    -                // Copyright (c) 2016 Luigi Pinca and contributors
    -
    -                const channels = {}
    -                channels.ping = diagnosticsChannel.channel('undici:websocket:ping')
    -                channels.pong = diagnosticsChannel.channel('undici:websocket:pong')
    -
    -                class ByteParser extends Writable {
    -                    #buffers = []
    -                    #byteOffset = 0
    -
    -                    #state = parserStates.INFO
    -
    -                    #info = {}
    -                    #fragments = []
    -
    -                    constructor(ws) {
    -                        super()
    -
    -                        this.ws = ws
    -                    }
    -
    -                    /**
    -                     * @param {Buffer} chunk
    -                     * @param {() => void} callback
    -                     */
    -                    _write(chunk, _, callback) {
    -                        this.#buffers.push(chunk)
    -                        this.#byteOffset += chunk.length
    -
    -                        this.run(callback)
    -                    }
    -
    -                    /**
    -                     * Runs whenever a new chunk is received.
    -                     * Callback is called whenever there are no more chunks buffering,
    -                     * or not enough bytes are buffered to parse.
    -                     */
    -                    run(callback) {
    -                        while (true) {
    -                            if (this.#state === parserStates.INFO) {
    -                                // If there aren't enough bytes to parse the payload length, etc.
    -                                if (this.#byteOffset < 2) {
    -                                    return callback()
    -                                }
    -
    -                                const buffer = this.consume(2)
    -
    -                                this.#info.fin = (buffer[0] & 0x80) !== 0
    -                                this.#info.opcode = buffer[0] & 0x0F
    -
    -                                // If we receive a fragmented message, we use the type of the first
    -                                // frame to parse the full message as binary/text, when it's terminated
    -                                this.#info.originalOpcode ??= this.#info.opcode
    -
    -                                this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION
    -
    -                                if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) {
    -                                    // Only text and binary frames can be fragmented
    -                                    failWebsocketConnection(this.ws, 'Invalid frame type was fragmented.')
    -                                    return
    -                                }
    -
    -                                const payloadLength = buffer[1] & 0x7F
    -
    -                                if (payloadLength <= 125) {
    -                                    this.#info.payloadLength = payloadLength
    -                                    this.#state = parserStates.READ_DATA
    -                                } else if (payloadLength === 126) {
    -                                    this.#state = parserStates.PAYLOADLENGTH_16
    -                                } else if (payloadLength === 127) {
    -                                    this.#state = parserStates.PAYLOADLENGTH_64
    -                                }
    -
    -                                if (this.#info.fragmented && payloadLength > 125) {
    -                                    // A fragmented frame can't be fragmented itself
    -                                    failWebsocketConnection(this.ws, 'Fragmented frame exceeded 125 bytes.')
    -                                    return
    -                                } else if (
    -                                    (this.#info.opcode === opcodes.PING ||
    -                                        this.#info.opcode === opcodes.PONG ||
    -                                        this.#info.opcode === opcodes.CLOSE) &&
    -                                    payloadLength > 125
    -                                ) {
    -                                    // Control frames can have a payload length of 125 bytes MAX
    -                                    failWebsocketConnection(this.ws, 'Payload length for control frame exceeded 125 bytes.')
    -                                    return
    -                                } else if (this.#info.opcode === opcodes.CLOSE) {
    -                                    if (payloadLength === 1) {
    -                                        failWebsocketConnection(this.ws, 'Received close frame with a 1-byte body.')
    -                                        return
    -                                    }
    -
    -                                    const body = this.consume(payloadLength)
    -
    -                                    this.#info.closeInfo = this.parseCloseBody(false, body)
    -
    -                                    if (!this.ws[kSentClose]) {
    -                                        // If an endpoint receives a Close frame and did not previously send a
    -                                        // Close frame, the endpoint MUST send a Close frame in response.  (When
    -                                        // sending a Close frame in response, the endpoint typically echos the
    -                                        // status code it received.)
    -                                        const body = Buffer.allocUnsafe(2)
    -                                        body.writeUInt16BE(this.#info.closeInfo.code, 0)
    -                                        const closeFrame = new WebsocketFrameSend(body)
    -
    -                                        this.ws[kResponse].socket.write(
    -                                            closeFrame.createFrame(opcodes.CLOSE),
    -                                            (err) => {
    -                                                if (!err) {
    -                                                    this.ws[kSentClose] = true
    -                                                }
    -                                            }
    -                                        )
    -                                    }
    -
    -                                    // Upon either sending or receiving a Close control frame, it is said
    -                                    // that _The WebSocket Closing Handshake is Started_ and that the
    -                                    // WebSocket connection is in the CLOSING state.
    -                                    this.ws[kReadyState] = states.CLOSING
    -                                    this.ws[kReceivedClose] = true
    -
    -                                    this.end()
    -
    -                                    return
    -                                } else if (this.#info.opcode === opcodes.PING) {
    -                                    // Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in
    -                                    // response, unless it already received a Close frame.
    -                                    // A Pong frame sent in response to a Ping frame must have identical
    -                                    // "Application data"
    -
    -                                    const body = this.consume(payloadLength)
    -
    -                                    if (!this.ws[kReceivedClose]) {
    -                                        const frame = new WebsocketFrameSend(body)
    -
    -                                        this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG))
    -
    -                                        if (channels.ping.hasSubscribers) {
    -                                            channels.ping.publish({
    -                                                payload: body
    -                                            })
    -                                        }
    -                                    }
    -
    -                                    this.#state = parserStates.INFO
    -
    -                                    if (this.#byteOffset > 0) {
    -                                        continue
    -                                    } else {
    -                                        callback()
    -                                        return
    -                                    }
    -                                } else if (this.#info.opcode === opcodes.PONG) {
    -                                    // A Pong frame MAY be sent unsolicited.  This serves as a
    -                                    // unidirectional heartbeat.  A response to an unsolicited Pong frame is
    -                                    // not expected.
    -
    -                                    const body = this.consume(payloadLength)
    -
    -                                    if (channels.pong.hasSubscribers) {
    -                                        channels.pong.publish({
    -                                            payload: body
    -                                        })
    -                                    }
    -
    -                                    if (this.#byteOffset > 0) {
    -                                        continue
    -                                    } else {
    -                                        callback()
    -                                        return
    -                                    }
    -                                }
    -                            } else if (this.#state === parserStates.PAYLOADLENGTH_16) {
    -                                if (this.#byteOffset < 2) {
    -                                    return callback()
    -                                }
    -
    -                                const buffer = this.consume(2)
    -
    -                                this.#info.payloadLength = buffer.readUInt16BE(0)
    -                                this.#state = parserStates.READ_DATA
    -                            } else if (this.#state === parserStates.PAYLOADLENGTH_64) {
    -                                if (this.#byteOffset < 8) {
    -                                    return callback()
    -                                }
    -
    -                                const buffer = this.consume(8)
    -                                const upper = buffer.readUInt32BE(0)
    -
    -                                // 2^31 is the maxinimum bytes an arraybuffer can contain
    -                                // on 32-bit systems. Although, on 64-bit systems, this is
    -                                // 2^53-1 bytes.
    -                                // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length
    -                                // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/common/globals.h;drc=1946212ac0100668f14eb9e2843bdd846e510a1e;bpv=1;bpt=1;l=1275
    -                                // https://source.chromium.org/chromium/chromium/src/+/main:v8/src/objects/js-array-buffer.h;l=34;drc=1946212ac0100668f14eb9e2843bdd846e510a1e
    -                                if (upper > 2 ** 31 - 1) {
    -                                    failWebsocketConnection(this.ws, 'Received payload length > 2^31 bytes.')
    -                                    return
    -                                }
    -
    -                                const lower = buffer.readUInt32BE(4)
    -
    -                                this.#info.payloadLength = (upper << 8) + lower
    -                                this.#state = parserStates.READ_DATA
    -                            } else if (this.#state === parserStates.READ_DATA) {
    -                                if (this.#byteOffset < this.#info.payloadLength) {
    -                                    // If there is still more data in this chunk that needs to be read
    -                                    return callback()
    -                                } else if (this.#byteOffset >= this.#info.payloadLength) {
    -                                    // If the server sent multiple frames in a single chunk
    -
    -                                    const body = this.consume(this.#info.payloadLength)
    -
    -                                    this.#fragments.push(body)
    -
    -                                    // If the frame is unfragmented, or a fragmented frame was terminated,
    -                                    // a message was received
    -                                    if (!this.#info.fragmented || (this.#info.fin && this.#info.opcode === opcodes.CONTINUATION)) {
    -                                        const fullMessage = Buffer.concat(this.#fragments)
    -
    -                                        websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage)
    -
    -                                        this.#info = {}
    -                                        this.#fragments.length = 0
    -                                    }
    -
    -                                    this.#state = parserStates.INFO
    -                                }
    -                            }
    -
    -                            if (this.#byteOffset > 0) {
    -                                continue
    -                            } else {
    -                                callback()
    -                                break
    -                            }
    -                        }
    -                    }
    -
    -                    /**
    -                     * Take n bytes from the buffered Buffers
    -                     * @param {number} n
    -                     * @returns {Buffer|null}
    -                     */
    -                    consume(n) {
    -                        if (n > this.#byteOffset) {
    -                            return null
    -                        } else if (n === 0) {
    -                            return emptyBuffer
    -                        }
    -
    -                        if (this.#buffers[0].length === n) {
    -                            this.#byteOffset -= this.#buffers[0].length
    -                            return this.#buffers.shift()
    -                        }
    -
    -                        const buffer = Buffer.allocUnsafe(n)
    -                        let offset = 0
    -
    -                        while (offset !== n) {
    -                            const next = this.#buffers[0]
    -                            const { length } = next
    -
    -                            if (length + offset === n) {
    -                                buffer.set(this.#buffers.shift(), offset)
    -                                break
    -                            } else if (length + offset > n) {
    -                                buffer.set(next.subarray(0, n - offset), offset)
    -                                this.#buffers[0] = next.subarray(n - offset)
    -                                break
    -                            } else {
    -                                buffer.set(this.#buffers.shift(), offset)
    -                                offset += next.length
    -                            }
    -                        }
    -
    -                        this.#byteOffset -= n
    -
    -                        return buffer
    -                    }
    -
    -                    parseCloseBody(onlyCode, data) {
    -                        // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.5
    -                        /** @type {number|undefined} */
    -                        let code
    -
    -                        if (data.length >= 2) {
    -                            // _The WebSocket Connection Close Code_ is
    -                            // defined as the status code (Section 7.4) contained in the first Close
    -                            // control frame received by the application
    -                            code = data.readUInt16BE(0)
    -                        }
    -
    -                        if (onlyCode) {
    -                            if (!isValidStatusCode(code)) {
    -                                return null
    -                            }
    -
    -                            return { code }
    -                        }
    -
    -                        // https://datatracker.ietf.org/doc/html/rfc6455#section-7.1.6
    -                        /** @type {Buffer} */
    -                        let reason = data.subarray(2)
    -
    -                        // Remove BOM
    -                        if (reason[0] === 0xEF && reason[1] === 0xBB && reason[2] === 0xBF) {
    -                            reason = reason.subarray(3)
    -                        }
    -
    -                        if (code !== undefined && !isValidStatusCode(code)) {
    -                            return null
    -                        }
    -
    -                        try {
    -                            // TODO: optimize this
    -                            reason = new TextDecoder('utf-8', { fatal: true }).decode(reason)
    -                        } catch {
    -                            return null
    -                        }
    -
    -                        return { code, reason }
    -                    }
    -
    -                    get closingInfo() {
    -                        return this.#info.closeInfo
    -                    }
    -                }
    -
    -                module.exports = {
    -                    ByteParser
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 7578:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                module.exports = {
    -                    kWebSocketURL: Symbol('url'),
    -                    kReadyState: Symbol('ready state'),
    -                    kController: Symbol('controller'),
    -                    kResponse: Symbol('response'),
    -                    kBinaryType: Symbol('binary type'),
    -                    kSentClose: Symbol('sent close'),
    -                    kReceivedClose: Symbol('received close'),
    -                    kByteParser: Symbol('byte parser')
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 5515:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = __nccwpck_require__(7578)
    -                const { states, opcodes } = __nccwpck_require__(9188)
    -                const { MessageEvent, ErrorEvent } = __nccwpck_require__(2611)
    -
    -                /* globals Blob */
    -
    -                /**
    -                 * @param {import('./websocket').WebSocket} ws
    -                 */
    -                function isEstablished(ws) {
    -                    // If the server's response is validated as provided for above, it is
    -                    // said that _The WebSocket Connection is Established_ and that the
    -                    // WebSocket Connection is in the OPEN state.
    -                    return ws[kReadyState] === states.OPEN
    -                }
    -
    -                /**
    -                 * @param {import('./websocket').WebSocket} ws
    -                 */
    -                function isClosing(ws) {
    -                    // Upon either sending or receiving a Close control frame, it is said
    -                    // that _The WebSocket Closing Handshake is Started_ and that the
    -                    // WebSocket connection is in the CLOSING state.
    -                    return ws[kReadyState] === states.CLOSING
    -                }
    -
    -                /**
    -                 * @param {import('./websocket').WebSocket} ws
    -                 */
    -                function isClosed(ws) {
    -                    return ws[kReadyState] === states.CLOSED
    -                }
    -
    -                /**
    -                 * @see https://dom.spec.whatwg.org/#concept-event-fire
    -                 * @param {string} e
    -                 * @param {EventTarget} target
    -                 * @param {EventInit | undefined} eventInitDict
    -                 */
    -                function fireEvent(e, target, eventConstructor = Event, eventInitDict) {
    -                    // 1. If eventConstructor is not given, then let eventConstructor be Event.
    -
    -                    // 2. Let event be the result of creating an event given eventConstructor,
    -                    //    in the relevant realm of target.
    -                    // 3. Initialize event’s type attribute to e.
    -                    const event = new eventConstructor(e, eventInitDict) // eslint-disable-line new-cap
    -
    -                    // 4. Initialize any other IDL attributes of event as described in the
    -                    //    invocation of this algorithm.
    -
    -                    // 5. Return the result of dispatching event at target, with legacy target
    -                    //    override flag set if set.
    -                    target.dispatchEvent(event)
    -                }
    -
    -                /**
    -                 * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol
    -                 * @param {import('./websocket').WebSocket} ws
    -                 * @param {number} type Opcode
    -                 * @param {Buffer} data application data
    -                 */
    -                function websocketMessageReceived(ws, type, data) {
    -                    // 1. If ready state is not OPEN (1), then return.
    -                    if (ws[kReadyState] !== states.OPEN) {
    -                        return
    -                    }
    -
    -                    // 2. Let dataForEvent be determined by switching on type and binary type:
    -                    let dataForEvent
    -
    -                    if (type === opcodes.TEXT) {
    -                        // -> type indicates that the data is Text
    -                        //      a new DOMString containing data
    -                        try {
    -                            dataForEvent = new TextDecoder('utf-8', { fatal: true }).decode(data)
    -                        } catch {
    -                            failWebsocketConnection(ws, 'Received invalid UTF-8 in text frame.')
    -                            return
    -                        }
    -                    } else if (type === opcodes.BINARY) {
    -                        if (ws[kBinaryType] === 'blob') {
    -                            // -> type indicates that the data is Binary and binary type is "blob"
    -                            //      a new Blob object, created in the relevant Realm of the WebSocket
    -                            //      object, that represents data as its raw data
    -                            dataForEvent = new Blob([data])
    -                        } else {
    -                            // -> type indicates that the data is Binary and binary type is "arraybuffer"
    -                            //      a new ArrayBuffer object, created in the relevant Realm of the
    -                            //      WebSocket object, whose contents are data
    -                            dataForEvent = new Uint8Array(data).buffer
    -                        }
    -                    }
    -
    -                    // 3. Fire an event named message at the WebSocket object, using MessageEvent,
    -                    //    with the origin attribute initialized to the serialization of the WebSocket
    -                    //    object’s url's origin, and the data attribute initialized to dataForEvent.
    -                    fireEvent('message', ws, MessageEvent, {
    -                        origin: ws[kWebSocketURL].origin,
    -                        data: dataForEvent
    -                    })
    -                }
    -
    -                /**
    -                 * @see https://datatracker.ietf.org/doc/html/rfc6455
    -                 * @see https://datatracker.ietf.org/doc/html/rfc2616
    -                 * @see https://bugs.chromium.org/p/chromium/issues/detail?id=398407
    -                 * @param {string} protocol
    -                 */
    -                function isValidSubprotocol(protocol) {
    -                    // If present, this value indicates one
    -                    // or more comma-separated subprotocol the client wishes to speak,
    -                    // ordered by preference.  The elements that comprise this value
    -                    // MUST be non-empty strings with characters in the range U+0021 to
    -                    // U+007E not including separator characters as defined in
    -                    // [RFC2616] and MUST all be unique strings.
    -                    if (protocol.length === 0) {
    -                        return false
    -                    }
    -
    -                    for (const char of protocol) {
    -                        const code = char.charCodeAt(0)
    -
    -                        if (
    -                            code < 0x21 ||
    -                            code > 0x7E ||
    -                            char === '(' ||
    -                            char === ')' ||
    -                            char === '<' ||
    -                            char === '>' ||
    -                            char === '@' ||
    -                            char === ',' ||
    -                            char === ';' ||
    -                            char === ':' ||
    -                            char === '\\' ||
    -                            char === '"' ||
    -                            char === '/' ||
    -                            char === '[' ||
    -                            char === ']' ||
    -                            char === '?' ||
    -                            char === '=' ||
    -                            char === '{' ||
    -                            char === '}' ||
    -                            code === 32 || // SP
    -                            code === 9 // HT
    -                        ) {
    -                            return false
    -                        }
    -                    }
    -
    -                    return true
    -                }
    -
    -                /**
    -                 * @see https://datatracker.ietf.org/doc/html/rfc6455#section-7-4
    -                 * @param {number} code
    -                 */
    -                function isValidStatusCode(code) {
    -                    if (code >= 1000 && code < 1015) {
    -                        return (
    -                            code !== 1004 && // reserved
    -                            code !== 1005 && // "MUST NOT be set as a status code"
    -                            code !== 1006 // "MUST NOT be set as a status code"
    -                        )
    -                    }
    -
    -                    return code >= 3000 && code <= 4999
    -                }
    -
    -                /**
    -                 * @param {import('./websocket').WebSocket} ws
    -                 * @param {string|undefined} reason
    -                 */
    -                function failWebsocketConnection(ws, reason) {
    -                    const { [kController]: controller, [kResponse]: response } = ws
    -
    -                    controller.abort()
    -
    -                    if (response?.socket && !response.socket.destroyed) {
    -                        response.socket.destroy()
    -                    }
    -
    -                    if (reason) {
    -                        fireEvent('error', ws, ErrorEvent, {
    -                            error: new Error(reason)
    -                        })
    -                    }
    -                }
    -
    -                module.exports = {
    -                    isEstablished,
    -                    isClosing,
    -                    isClosed,
    -                    fireEvent,
    -                    isValidSubprotocol,
    -                    isValidStatusCode,
    -                    failWebsocketConnection,
    -                    websocketMessageReceived
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 4284:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const { webidl } = __nccwpck_require__(1744)
    -                const { DOMException } = __nccwpck_require__(1037)
    -                const { URLSerializer } = __nccwpck_require__(685)
    -                const { getGlobalOrigin } = __nccwpck_require__(1246)
    -                const { staticPropertyDescriptors, states, opcodes, emptyBuffer } = __nccwpck_require__(9188)
    -                const {
    -                    kWebSocketURL,
    -                    kReadyState,
    -                    kController,
    -                    kBinaryType,
    -                    kResponse,
    -                    kSentClose,
    -                    kByteParser
    -                } = __nccwpck_require__(7578)
    -                const { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = __nccwpck_require__(5515)
    -                const { establishWebSocketConnection } = __nccwpck_require__(5354)
    -                const { WebsocketFrameSend } = __nccwpck_require__(5444)
    -                const { ByteParser } = __nccwpck_require__(1688)
    -                const { kEnumerableProperty, isBlobLike } = __nccwpck_require__(3983)
    -                const { getGlobalDispatcher } = __nccwpck_require__(1892)
    -                const { types } = __nccwpck_require__(3837)
    -
    -                let experimentalWarned = false
    -
    -                // https://websockets.spec.whatwg.org/#interface-definition
    -                class WebSocket extends EventTarget {
    -                    #events = {
    -                        open: null,
    -                        error: null,
    -                        close: null,
    -                        message: null
    -                    }
    -
    -                    #bufferedAmount = 0
    -                    #protocol = ''
    -                    #extensions = ''
    -
    -                    /**
    -                     * @param {string} url
    -                     * @param {string|string[]} protocols
    -                     */
    -                    constructor(url, protocols = []) {
    -                        super()
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket constructor' })
    -
    -                        if (!experimentalWarned) {
    -                            experimentalWarned = true
    -                            process.emitWarning('WebSockets are experimental, expect them to change at any time.', {
    -                                code: 'UNDICI-WS'
    -                            })
    -                        }
    -
    -                        const options = webidl.converters['DOMString or sequence or WebSocketInit'](protocols)
    -
    -                        url = webidl.converters.USVString(url)
    -                        protocols = options.protocols
    -
    -                        // 1. Let baseURL be this's relevant settings object's API base URL.
    -                        const baseURL = getGlobalOrigin()
    -
    -                        // 1. Let urlRecord be the result of applying the URL parser to url with baseURL.
    -                        let urlRecord
    -
    -                        try {
    -                            urlRecord = new URL(url, baseURL)
    -                        } catch (e) {
    -                            // 3. If urlRecord is failure, then throw a "SyntaxError" DOMException.
    -                            throw new DOMException(e, 'SyntaxError')
    -                        }
    -
    -                        // 4. If urlRecord’s scheme is "http", then set urlRecord’s scheme to "ws".
    -                        if (urlRecord.protocol === 'http:') {
    -                            urlRecord.protocol = 'ws:'
    -                        } else if (urlRecord.protocol === 'https:') {
    -                            // 5. Otherwise, if urlRecord’s scheme is "https", set urlRecord’s scheme to "wss".
    -                            urlRecord.protocol = 'wss:'
    -                        }
    -
    -                        // 6. If urlRecord’s scheme is not "ws" or "wss", then throw a "SyntaxError" DOMException.
    -                        if (urlRecord.protocol !== 'ws:' && urlRecord.protocol !== 'wss:') {
    -                            throw new DOMException(
    -                                `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`,
    -                                'SyntaxError'
    -                            )
    -                        }
    -
    -                        // 7. If urlRecord’s fragment is non-null, then throw a "SyntaxError"
    -                        //    DOMException.
    -                        if (urlRecord.hash || urlRecord.href.endsWith('#')) {
    -                            throw new DOMException('Got fragment', 'SyntaxError')
    -                        }
    -
    -                        // 8. If protocols is a string, set protocols to a sequence consisting
    -                        //    of just that string.
    -                        if (typeof protocols === 'string') {
    -                            protocols = [protocols]
    -                        }
    -
    -                        // 9. If any of the values in protocols occur more than once or otherwise
    -                        //    fail to match the requirements for elements that comprise the value
    -                        //    of `Sec-WebSocket-Protocol` fields as defined by The WebSocket
    -                        //    protocol, then throw a "SyntaxError" DOMException.
    -                        if (protocols.length !== new Set(protocols.map(p => p.toLowerCase())).size) {
    -                            throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')
    -                        }
    -
    -                        if (protocols.length > 0 && !protocols.every(p => isValidSubprotocol(p))) {
    -                            throw new DOMException('Invalid Sec-WebSocket-Protocol value', 'SyntaxError')
    -                        }
    -
    -                        // 10. Set this's url to urlRecord.
    -                        this[kWebSocketURL] = new URL(urlRecord.href)
    -
    -                        // 11. Let client be this's relevant settings object.
    -
    -                        // 12. Run this step in parallel:
    -
    -                        //    1. Establish a WebSocket connection given urlRecord, protocols,
    -                        //       and client.
    -                        this[kController] = establishWebSocketConnection(
    -                            urlRecord,
    -                            protocols,
    -                            this,
    -                            (response) => this.#onConnectionEstablished(response),
    -                            options
    -                        )
    -
    -                        // Each WebSocket object has an associated ready state, which is a
    -                        // number representing the state of the connection. Initially it must
    -                        // be CONNECTING (0).
    -                        this[kReadyState] = WebSocket.CONNECTING
    -
    -                        // The extensions attribute must initially return the empty string.
    -
    -                        // The protocol attribute must initially return the empty string.
    -
    -                        // Each WebSocket object has an associated binary type, which is a
    -                        // BinaryType. Initially it must be "blob".
    -                        this[kBinaryType] = 'blob'
    -                    }
    -
    -                    /**
    -                     * @see https://websockets.spec.whatwg.org/#dom-websocket-close
    -                     * @param {number|undefined} code
    -                     * @param {string|undefined} reason
    -                     */
    -                    close(code = undefined, reason = undefined) {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        if (code !== undefined) {
    -                            code = webidl.converters['unsigned short'](code, { clamp: true })
    -                        }
    -
    -                        if (reason !== undefined) {
    -                            reason = webidl.converters.USVString(reason)
    -                        }
    -
    -                        // 1. If code is present, but is neither an integer equal to 1000 nor an
    -                        //    integer in the range 3000 to 4999, inclusive, throw an
    -                        //    "InvalidAccessError" DOMException.
    -                        if (code !== undefined) {
    -                            if (code !== 1000 && (code < 3000 || code > 4999)) {
    -                                throw new DOMException('invalid code', 'InvalidAccessError')
    -                            }
    -                        }
    -
    -                        let reasonByteLength = 0
    -
    -                        // 2. If reason is present, then run these substeps:
    -                        if (reason !== undefined) {
    -                            // 1. Let reasonBytes be the result of encoding reason.
    -                            // 2. If reasonBytes is longer than 123 bytes, then throw a
    -                            //    "SyntaxError" DOMException.
    -                            reasonByteLength = Buffer.byteLength(reason)
    -
    -                            if (reasonByteLength > 123) {
    -                                throw new DOMException(
    -                                    `Reason must be less than 123 bytes; received ${reasonByteLength}`,
    -                                    'SyntaxError'
    -                                )
    -                            }
    -                        }
    -
    -                        // 3. Run the first matching steps from the following list:
    -                        if (this[kReadyState] === WebSocket.CLOSING || this[kReadyState] === WebSocket.CLOSED) {
    -                            // If this's ready state is CLOSING (2) or CLOSED (3)
    -                            // Do nothing.
    -                        } else if (!isEstablished(this)) {
    -                            // If the WebSocket connection is not yet established
    -                            // Fail the WebSocket connection and set this's ready state
    -                            // to CLOSING (2).
    -                            failWebsocketConnection(this, 'Connection was closed before it was established.')
    -                            this[kReadyState] = WebSocket.CLOSING
    -                        } else if (!isClosing(this)) {
    -                            // If the WebSocket closing handshake has not yet been started
    -                            // Start the WebSocket closing handshake and set this's ready
    -                            // state to CLOSING (2).
    -                            // - If neither code nor reason is present, the WebSocket Close
    -                            //   message must not have a body.
    -                            // - If code is present, then the status code to use in the
    -                            //   WebSocket Close message must be the integer given by code.
    -                            // - If reason is also present, then reasonBytes must be
    -                            //   provided in the Close message after the status code.
    -
    -                            const frame = new WebsocketFrameSend()
    -
    -                            // If neither code nor reason is present, the WebSocket Close
    -                            // message must not have a body.
    -
    -                            // If code is present, then the status code to use in the
    -                            // WebSocket Close message must be the integer given by code.
    -                            if (code !== undefined && reason === undefined) {
    -                                frame.frameData = Buffer.allocUnsafe(2)
    -                                frame.frameData.writeUInt16BE(code, 0)
    -                            } else if (code !== undefined && reason !== undefined) {
    -                                // If reason is also present, then reasonBytes must be
    -                                // provided in the Close message after the status code.
    -                                frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength)
    -                                frame.frameData.writeUInt16BE(code, 0)
    -                                // the body MAY contain UTF-8-encoded data with value /reason/
    -                                frame.frameData.write(reason, 2, 'utf-8')
    -                            } else {
    -                                frame.frameData = emptyBuffer
    -                            }
    -
    -                            /** @type {import('stream').Duplex} */
    -                            const socket = this[kResponse].socket
    -
    -                            socket.write(frame.createFrame(opcodes.CLOSE), (err) => {
    -                                if (!err) {
    -                                    this[kSentClose] = true
    -                                }
    -                            })
    -
    -                            // Upon either sending or receiving a Close control frame, it is said
    -                            // that _The WebSocket Closing Handshake is Started_ and that the
    -                            // WebSocket connection is in the CLOSING state.
    -                            this[kReadyState] = states.CLOSING
    -                        } else {
    -                            // Otherwise
    -                            // Set this's ready state to CLOSING (2).
    -                            this[kReadyState] = WebSocket.CLOSING
    -                        }
    -                    }
    -
    -                    /**
    -                     * @see https://websockets.spec.whatwg.org/#dom-websocket-send
    -                     * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data
    -                     */
    -                    send(data) {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        webidl.argumentLengthCheck(arguments, 1, { header: 'WebSocket.send' })
    -
    -                        data = webidl.converters.WebSocketSendData(data)
    -
    -                        // 1. If this's ready state is CONNECTING, then throw an
    -                        //    "InvalidStateError" DOMException.
    -                        if (this[kReadyState] === WebSocket.CONNECTING) {
    -                            throw new DOMException('Sent before connected.', 'InvalidStateError')
    -                        }
    -
    -                        // 2. Run the appropriate set of steps from the following list:
    -                        // https://datatracker.ietf.org/doc/html/rfc6455#section-6.1
    -                        // https://datatracker.ietf.org/doc/html/rfc6455#section-5.2
    -
    -                        if (!isEstablished(this) || isClosing(this)) {
    -                            return
    -                        }
    -
    -                        /** @type {import('stream').Duplex} */
    -                        const socket = this[kResponse].socket
    -
    -                        // If data is a string
    -                        if (typeof data === 'string') {
    -                            // If the WebSocket connection is established and the WebSocket
    -                            // closing handshake has not yet started, then the user agent
    -                            // must send a WebSocket Message comprised of the data argument
    -                            // using a text frame opcode; if the data cannot be sent, e.g.
    -                            // because it would need to be buffered but the buffer is full,
    -                            // the user agent must flag the WebSocket as full and then close
    -                            // the WebSocket connection. Any invocation of this method with a
    -                            // string argument that does not throw an exception must increase
    -                            // the bufferedAmount attribute by the number of bytes needed to
    -                            // express the argument as UTF-8.
    -
    -                            const value = Buffer.from(data)
    -                            const frame = new WebsocketFrameSend(value)
    -                            const buffer = frame.createFrame(opcodes.TEXT)
    -
    -                            this.#bufferedAmount += value.byteLength
    -                            socket.write(buffer, () => {
    -                                this.#bufferedAmount -= value.byteLength
    -                            })
    -                        } else if (types.isArrayBuffer(data)) {
    -                            // If the WebSocket connection is established, and the WebSocket
    -                            // closing handshake has not yet started, then the user agent must
    -                            // send a WebSocket Message comprised of data using a binary frame
    -                            // opcode; if the data cannot be sent, e.g. because it would need
    -                            // to be buffered but the buffer is full, the user agent must flag
    -                            // the WebSocket as full and then close the WebSocket connection.
    -                            // The data to be sent is the data stored in the buffer described
    -                            // by the ArrayBuffer object. Any invocation of this method with an
    -                            // ArrayBuffer argument that does not throw an exception must
    -                            // increase the bufferedAmount attribute by the length of the
    -                            // ArrayBuffer in bytes.
    -
    -                            const value = Buffer.from(data)
    -                            const frame = new WebsocketFrameSend(value)
    -                            const buffer = frame.createFrame(opcodes.BINARY)
    -
    -                            this.#bufferedAmount += value.byteLength
    -                            socket.write(buffer, () => {
    -                                this.#bufferedAmount -= value.byteLength
    -                            })
    -                        } else if (ArrayBuffer.isView(data)) {
    -                            // If the WebSocket connection is established, and the WebSocket
    -                            // closing handshake has not yet started, then the user agent must
    -                            // send a WebSocket Message comprised of data using a binary frame
    -                            // opcode; if the data cannot be sent, e.g. because it would need to
    -                            // be buffered but the buffer is full, the user agent must flag the
    -                            // WebSocket as full and then close the WebSocket connection. The
    -                            // data to be sent is the data stored in the section of the buffer
    -                            // described by the ArrayBuffer object that data references. Any
    -                            // invocation of this method with this kind of argument that does
    -                            // not throw an exception must increase the bufferedAmount attribute
    -                            // by the length of data’s buffer in bytes.
    -
    -                            const ab = Buffer.from(data, data.byteOffset, data.byteLength)
    -
    -                            const frame = new WebsocketFrameSend(ab)
    -                            const buffer = frame.createFrame(opcodes.BINARY)
    -
    -                            this.#bufferedAmount += ab.byteLength
    -                            socket.write(buffer, () => {
    -                                this.#bufferedAmount -= ab.byteLength
    -                            })
    -                        } else if (isBlobLike(data)) {
    -                            // If the WebSocket connection is established, and the WebSocket
    -                            // closing handshake has not yet started, then the user agent must
    -                            // send a WebSocket Message comprised of data using a binary frame
    -                            // opcode; if the data cannot be sent, e.g. because it would need to
    -                            // be buffered but the buffer is full, the user agent must flag the
    -                            // WebSocket as full and then close the WebSocket connection. The data
    -                            // to be sent is the raw data represented by the Blob object. Any
    -                            // invocation of this method with a Blob argument that does not throw
    -                            // an exception must increase the bufferedAmount attribute by the size
    -                            // of the Blob object’s raw data, in bytes.
    -
    -                            const frame = new WebsocketFrameSend()
    -
    -                            data.arrayBuffer().then((ab) => {
    -                                const value = Buffer.from(ab)
    -                                frame.frameData = value
    -                                const buffer = frame.createFrame(opcodes.BINARY)
    -
    -                                this.#bufferedAmount += value.byteLength
    -                                socket.write(buffer, () => {
    -                                    this.#bufferedAmount -= value.byteLength
    -                                })
    -                            })
    -                        }
    -                    }
    -
    -                    get readyState() {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        // The readyState getter steps are to return this's ready state.
    -                        return this[kReadyState]
    -                    }
    -
    -                    get bufferedAmount() {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        return this.#bufferedAmount
    -                    }
    -
    -                    get url() {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        // The url getter steps are to return this's url, serialized.
    -                        return URLSerializer(this[kWebSocketURL])
    -                    }
    -
    -                    get extensions() {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        return this.#extensions
    -                    }
    -
    -                    get protocol() {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        return this.#protocol
    -                    }
    -
    -                    get onopen() {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        return this.#events.open
    -                    }
    -
    -                    set onopen(fn) {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        if (this.#events.open) {
    -                            this.removeEventListener('open', this.#events.open)
    -                        }
    -
    -                        if (typeof fn === 'function') {
    -                            this.#events.open = fn
    -                            this.addEventListener('open', fn)
    -                        } else {
    -                            this.#events.open = null
    -                        }
    -                    }
    -
    -                    get onerror() {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        return this.#events.error
    -                    }
    -
    -                    set onerror(fn) {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        if (this.#events.error) {
    -                            this.removeEventListener('error', this.#events.error)
    -                        }
    -
    -                        if (typeof fn === 'function') {
    -                            this.#events.error = fn
    -                            this.addEventListener('error', fn)
    -                        } else {
    -                            this.#events.error = null
    -                        }
    -                    }
    -
    -                    get onclose() {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        return this.#events.close
    -                    }
    -
    -                    set onclose(fn) {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        if (this.#events.close) {
    -                            this.removeEventListener('close', this.#events.close)
    -                        }
    -
    -                        if (typeof fn === 'function') {
    -                            this.#events.close = fn
    -                            this.addEventListener('close', fn)
    -                        } else {
    -                            this.#events.close = null
    -                        }
    -                    }
    -
    -                    get onmessage() {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        return this.#events.message
    -                    }
    -
    -                    set onmessage(fn) {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        if (this.#events.message) {
    -                            this.removeEventListener('message', this.#events.message)
    -                        }
    -
    -                        if (typeof fn === 'function') {
    -                            this.#events.message = fn
    -                            this.addEventListener('message', fn)
    -                        } else {
    -                            this.#events.message = null
    -                        }
    -                    }
    -
    -                    get binaryType() {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        return this[kBinaryType]
    -                    }
    -
    -                    set binaryType(type) {
    -                        webidl.brandCheck(this, WebSocket)
    -
    -                        if (type !== 'blob' && type !== 'arraybuffer') {
    -                            this[kBinaryType] = 'blob'
    -                        } else {
    -                            this[kBinaryType] = type
    -                        }
    -                    }
    -
    -                    /**
    -                     * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol
    -                     */
    -                    #onConnectionEstablished(response) {
    -                        // processResponse is called when the "response’s header list has been received and initialized."
    -                        // once this happens, the connection is open
    -                        this[kResponse] = response
    -
    -                        const parser = new ByteParser(this)
    -                        parser.on('drain', function onParserDrain() {
    -                            this.ws[kResponse].socket.resume()
    -                        })
    -
    -                        response.socket.ws = this
    -                        this[kByteParser] = parser
    -
    -                        // 1. Change the ready state to OPEN (1).
    -                        this[kReadyState] = states.OPEN
    -
    -                        // 2. Change the extensions attribute’s value to the extensions in use, if
    -                        //    it is not the null value.
    -                        // https://datatracker.ietf.org/doc/html/rfc6455#section-9.1
    -                        const extensions = response.headersList.get('sec-websocket-extensions')
    -
    -                        if (extensions !== null) {
    -                            this.#extensions = extensions
    -                        }
    -
    -                        // 3. Change the protocol attribute’s value to the subprotocol in use, if
    -                        //    it is not the null value.
    -                        // https://datatracker.ietf.org/doc/html/rfc6455#section-1.9
    -                        const protocol = response.headersList.get('sec-websocket-protocol')
    -
    -                        if (protocol !== null) {
    -                            this.#protocol = protocol
    -                        }
    -
    -                        // 4. Fire an event named open at the WebSocket object.
    -                        fireEvent('open', this)
    -                    }
    -                }
    -
    -                // https://websockets.spec.whatwg.org/#dom-websocket-connecting
    -                WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING
    -                // https://websockets.spec.whatwg.org/#dom-websocket-open
    -                WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN
    -                // https://websockets.spec.whatwg.org/#dom-websocket-closing
    -                WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING
    -                // https://websockets.spec.whatwg.org/#dom-websocket-closed
    -                WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED
    -
    -                Object.defineProperties(WebSocket.prototype, {
    -                    CONNECTING: staticPropertyDescriptors,
    -                    OPEN: staticPropertyDescriptors,
    -                    CLOSING: staticPropertyDescriptors,
    -                    CLOSED: staticPropertyDescriptors,
    -                    url: kEnumerableProperty,
    -                    readyState: kEnumerableProperty,
    -                    bufferedAmount: kEnumerableProperty,
    -                    onopen: kEnumerableProperty,
    -                    onerror: kEnumerableProperty,
    -                    onclose: kEnumerableProperty,
    -                    close: kEnumerableProperty,
    -                    onmessage: kEnumerableProperty,
    -                    binaryType: kEnumerableProperty,
    -                    send: kEnumerableProperty,
    -                    extensions: kEnumerableProperty,
    -                    protocol: kEnumerableProperty,
    -                    [Symbol.toStringTag]: {
    -                        value: 'WebSocket',
    -                        writable: false,
    -                        enumerable: false,
    -                        configurable: true
    -                    }
    -                })
    -
    -                Object.defineProperties(WebSocket, {
    -                    CONNECTING: staticPropertyDescriptors,
    -                    OPEN: staticPropertyDescriptors,
    -                    CLOSING: staticPropertyDescriptors,
    -                    CLOSED: staticPropertyDescriptors
    -                })
    -
    -                webidl.converters['sequence'] = webidl.sequenceConverter(
    -                    webidl.converters.DOMString
    -                )
    -
    -                webidl.converters['DOMString or sequence'] = function (V) {
    -                    if (webidl.util.Type(V) === 'Object' && Symbol.iterator in V) {
    -                        return webidl.converters['sequence'](V)
    -                    }
    -
    -                    return webidl.converters.DOMString(V)
    -                }
    -
    -                // This implements the propsal made in https://github.com/whatwg/websockets/issues/42
    -                webidl.converters.WebSocketInit = webidl.dictionaryConverter([
    -                    {
    -                        key: 'protocols',
    -                        converter: webidl.converters['DOMString or sequence'],
    -                        get defaultValue() {
    -                            return []
    -                        }
    -                    },
    -                    {
    -                        key: 'dispatcher',
    -                        converter: (V) => V,
    -                        get defaultValue() {
    -                            return getGlobalDispatcher()
    -                        }
    -                    },
    -                    {
    -                        key: 'headers',
    -                        converter: webidl.nullableConverter(webidl.converters.HeadersInit)
    -                    }
    -                ])
    -
    -                webidl.converters['DOMString or sequence or WebSocketInit'] = function (V) {
    -                    if (webidl.util.Type(V) === 'Object' && !(Symbol.iterator in V)) {
    -                        return webidl.converters.WebSocketInit(V)
    -                    }
    -
    -                    return { protocols: webidl.converters['DOMString or sequence'](V) }
    -                }
    -
    -                webidl.converters.WebSocketSendData = function (V) {
    -                    if (webidl.util.Type(V) === 'Object') {
    -                        if (isBlobLike(V)) {
    -                            return webidl.converters.Blob(V, { strict: false })
    -                        }
    -
    -                        if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) {
    -                            return webidl.converters.BufferSource(V)
    -                        }
    -                    }
    -
    -                    return webidl.converters.USVString(V)
    -                }
    -
    -                module.exports = {
    -                    WebSocket
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 5840:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                Object.defineProperty(exports, "v1", ({
    -                    enumerable: true,
    -                    get: function () {
    -                        return _v.default;
    -                    }
    -                }));
    -                Object.defineProperty(exports, "v3", ({
    -                    enumerable: true,
    -                    get: function () {
    -                        return _v2.default;
    -                    }
    -                }));
    -                Object.defineProperty(exports, "v4", ({
    -                    enumerable: true,
    -                    get: function () {
    -                        return _v3.default;
    -                    }
    -                }));
    -                Object.defineProperty(exports, "v5", ({
    -                    enumerable: true,
    -                    get: function () {
    -                        return _v4.default;
    -                    }
    -                }));
    -                Object.defineProperty(exports, "NIL", ({
    -                    enumerable: true,
    -                    get: function () {
    -                        return _nil.default;
    -                    }
    -                }));
    -                Object.defineProperty(exports, "version", ({
    -                    enumerable: true,
    -                    get: function () {
    -                        return _version.default;
    -                    }
    -                }));
    -                Object.defineProperty(exports, "validate", ({
    -                    enumerable: true,
    -                    get: function () {
    -                        return _validate.default;
    -                    }
    -                }));
    -                Object.defineProperty(exports, "stringify", ({
    -                    enumerable: true,
    -                    get: function () {
    -                        return _stringify.default;
    -                    }
    -                }));
    -                Object.defineProperty(exports, "parse", ({
    -                    enumerable: true,
    -                    get: function () {
    -                        return _parse.default;
    -                    }
    -                }));
    -
    -                var _v = _interopRequireDefault(__nccwpck_require__(8628));
    -
    -                var _v2 = _interopRequireDefault(__nccwpck_require__(6409));
    -
    -                var _v3 = _interopRequireDefault(__nccwpck_require__(5122));
    -
    -                var _v4 = _interopRequireDefault(__nccwpck_require__(9120));
    -
    -                var _nil = _interopRequireDefault(__nccwpck_require__(5332));
    -
    -                var _version = _interopRequireDefault(__nccwpck_require__(1595));
    -
    -                var _validate = _interopRequireDefault(__nccwpck_require__(6900));
    -
    -                var _stringify = _interopRequireDefault(__nccwpck_require__(8950));
    -
    -                var _parse = _interopRequireDefault(__nccwpck_require__(2746));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                /***/
    -}),
    -
    -/***/ 4569:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = void 0;
    -
    -                var _crypto = _interopRequireDefault(__nccwpck_require__(6113));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                function md5(bytes) {
    -                    if (Array.isArray(bytes)) {
    -                        bytes = Buffer.from(bytes);
    -                    } else if (typeof bytes === 'string') {
    -                        bytes = Buffer.from(bytes, 'utf8');
    -                    }
    -
    -                    return _crypto.default.createHash('md5').update(bytes).digest();
    -                }
    -
    -                var _default = md5;
    -                exports["default"] = _default;
    -
    -                /***/
    -}),
    -
    -/***/ 5332:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = void 0;
    -                var _default = '00000000-0000-0000-0000-000000000000';
    -                exports["default"] = _default;
    -
    -                /***/
    -}),
    -
    -/***/ 2746:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = void 0;
    -
    -                var _validate = _interopRequireDefault(__nccwpck_require__(6900));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                function parse(uuid) {
    -                    if (!(0, _validate.default)(uuid)) {
    -                        throw TypeError('Invalid UUID');
    -                    }
    -
    -                    let v;
    -                    const arr = new Uint8Array(16); // Parse ########-....-....-....-............
    -
    -                    arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;
    -                    arr[1] = v >>> 16 & 0xff;
    -                    arr[2] = v >>> 8 & 0xff;
    -                    arr[3] = v & 0xff; // Parse ........-####-....-....-............
    -
    -                    arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;
    -                    arr[5] = v & 0xff; // Parse ........-....-####-....-............
    -
    -                    arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;
    -                    arr[7] = v & 0xff; // Parse ........-....-....-####-............
    -
    -                    arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;
    -                    arr[9] = v & 0xff; // Parse ........-....-....-....-############
    -                    // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes)
    -
    -                    arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;
    -                    arr[11] = v / 0x100000000 & 0xff;
    -                    arr[12] = v >>> 24 & 0xff;
    -                    arr[13] = v >>> 16 & 0xff;
    -                    arr[14] = v >>> 8 & 0xff;
    -                    arr[15] = v & 0xff;
    -                    return arr;
    -                }
    -
    -                var _default = parse;
    -                exports["default"] = _default;
    -
    -                /***/
    -}),
    -
    -/***/ 814:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = void 0;
    -                var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
    -                exports["default"] = _default;
    -
    -                /***/
    -}),
    -
    -/***/ 807:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = rng;
    -
    -                var _crypto = _interopRequireDefault(__nccwpck_require__(6113));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate
    -
    -                let poolPtr = rnds8Pool.length;
    -
    -                function rng() {
    -                    if (poolPtr > rnds8Pool.length - 16) {
    -                        _crypto.default.randomFillSync(rnds8Pool);
    -
    -                        poolPtr = 0;
    -                    }
    -
    -                    return rnds8Pool.slice(poolPtr, poolPtr += 16);
    -                }
    -
    -                /***/
    -}),
    -
    -/***/ 5274:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = void 0;
    -
    -                var _crypto = _interopRequireDefault(__nccwpck_require__(6113));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                function sha1(bytes) {
    -                    if (Array.isArray(bytes)) {
    -                        bytes = Buffer.from(bytes);
    -                    } else if (typeof bytes === 'string') {
    -                        bytes = Buffer.from(bytes, 'utf8');
    -                    }
    -
    -                    return _crypto.default.createHash('sha1').update(bytes).digest();
    -                }
    -
    -                var _default = sha1;
    -                exports["default"] = _default;
    -
    -                /***/
    -}),
    -
    -/***/ 8950:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = void 0;
    -
    -                var _validate = _interopRequireDefault(__nccwpck_require__(6900));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                /**
    -                 * Convert array of 16 byte values to UUID string format of the form:
    -                 * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
    -                 */
    -                const byteToHex = [];
    -
    -                for (let i = 0; i < 256; ++i) {
    -                    byteToHex.push((i + 0x100).toString(16).substr(1));
    -                }
    -
    -                function stringify(arr, offset = 0) {
    -                    // Note: Be careful editing this code!  It's been tuned for performance
    -                    // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434
    -                    const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one
    -                    // of the following:
    -                    // - One or more input array values don't map to a hex octet (leading to
    -                    // "undefined" in the uuid)
    -                    // - Invalid input values for the RFC `version` or `variant` fields
    -
    -                    if (!(0, _validate.default)(uuid)) {
    -                        throw TypeError('Stringified UUID is invalid');
    -                    }
    -
    -                    return uuid;
    -                }
    -
    -                var _default = stringify;
    -                exports["default"] = _default;
    -
    -                /***/
    -}),
    -
    -/***/ 8628:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = void 0;
    -
    -                var _rng = _interopRequireDefault(__nccwpck_require__(807));
    -
    -                var _stringify = _interopRequireDefault(__nccwpck_require__(8950));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                // **`v1()` - Generate time-based UUID**
    -                //
    -                // Inspired by https://github.com/LiosK/UUID.js
    -                // and http://docs.python.org/library/uuid.html
    -                let _nodeId;
    -
    -                let _clockseq; // Previous uuid creation time
    -
    -
    -                let _lastMSecs = 0;
    -                let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details
    -
    -                function v1(options, buf, offset) {
    -                    let i = buf && offset || 0;
    -                    const b = buf || new Array(16);
    -                    options = options || {};
    -                    let node = options.node || _nodeId;
    -                    let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not
    -                    // specified.  We do this lazily to minimize issues related to insufficient
    -                    // system entropy.  See #189
    -
    -                    if (node == null || clockseq == null) {
    -                        const seedBytes = options.random || (options.rng || _rng.default)();
    -
    -                        if (node == null) {
    -                            // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
    -                            node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];
    -                        }
    -
    -                        if (clockseq == null) {
    -                            // Per 4.2.2, randomize (14 bit) clockseq
    -                            clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;
    -                        }
    -                    } // UUID timestamps are 100 nano-second units since the Gregorian epoch,
    -                    // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
    -                    // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
    -                    // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
    -
    -
    -                    let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock
    -                    // cycle to simulate higher resolution clock
    -
    -                    let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)
    -
    -                    const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression
    -
    -                    if (dt < 0 && options.clockseq === undefined) {
    -                        clockseq = clockseq + 1 & 0x3fff;
    -                    } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
    -                    // time interval
    -
    -
    -                    if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {
    -                        nsecs = 0;
    -                    } // Per 4.2.1.2 Throw error if too many uuids are requested
    -
    -
    -                    if (nsecs >= 10000) {
    -                        throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
    -                    }
    -
    -                    _lastMSecs = msecs;
    -                    _lastNSecs = nsecs;
    -                    _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
    -
    -                    msecs += 12219292800000; // `time_low`
    -
    -                    const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
    -                    b[i++] = tl >>> 24 & 0xff;
    -                    b[i++] = tl >>> 16 & 0xff;
    -                    b[i++] = tl >>> 8 & 0xff;
    -                    b[i++] = tl & 0xff; // `time_mid`
    -
    -                    const tmh = msecs / 0x100000000 * 10000 & 0xfffffff;
    -                    b[i++] = tmh >>> 8 & 0xff;
    -                    b[i++] = tmh & 0xff; // `time_high_and_version`
    -
    -                    b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
    -
    -                    b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
    -
    -                    b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`
    -
    -                    b[i++] = clockseq & 0xff; // `node`
    -
    -                    for (let n = 0; n < 6; ++n) {
    -                        b[i + n] = node[n];
    -                    }
    -
    -                    return buf || (0, _stringify.default)(b);
    -                }
    -
    -                var _default = v1;
    -                exports["default"] = _default;
    -
    -                /***/
    -}),
    -
    -/***/ 6409:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = void 0;
    -
    -                var _v = _interopRequireDefault(__nccwpck_require__(5998));
    -
    -                var _md = _interopRequireDefault(__nccwpck_require__(4569));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                const v3 = (0, _v.default)('v3', 0x30, _md.default);
    -                var _default = v3;
    -                exports["default"] = _default;
    -
    -                /***/
    -}),
    -
    -/***/ 5998:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = _default;
    -                exports.URL = exports.DNS = void 0;
    -
    -                var _stringify = _interopRequireDefault(__nccwpck_require__(8950));
    -
    -                var _parse = _interopRequireDefault(__nccwpck_require__(2746));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                function stringToBytes(str) {
    -                    str = unescape(encodeURIComponent(str)); // UTF8 escape
    -
    -                    const bytes = [];
    -
    -                    for (let i = 0; i < str.length; ++i) {
    -                        bytes.push(str.charCodeAt(i));
    -                    }
    -
    -                    return bytes;
    -                }
    -
    -                const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
    -                exports.DNS = DNS;
    -                const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';
    -                exports.URL = URL;
    -
    -                function _default(name, version, hashfunc) {
    -                    function generateUUID(value, namespace, buf, offset) {
    -                        if (typeof value === 'string') {
    -                            value = stringToBytes(value);
    -                        }
    -
    -                        if (typeof namespace === 'string') {
    -                            namespace = (0, _parse.default)(namespace);
    -                        }
    -
    -                        if (namespace.length !== 16) {
    -                            throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');
    -                        } // Compute hash of namespace and value, Per 4.3
    -                        // Future: Use spread syntax when supported on all platforms, e.g. `bytes =
    -                        // hashfunc([...namespace, ... value])`
    -
    -
    -                        let bytes = new Uint8Array(16 + value.length);
    -                        bytes.set(namespace);
    -                        bytes.set(value, namespace.length);
    -                        bytes = hashfunc(bytes);
    -                        bytes[6] = bytes[6] & 0x0f | version;
    -                        bytes[8] = bytes[8] & 0x3f | 0x80;
    -
    -                        if (buf) {
    -                            offset = offset || 0;
    -
    -                            for (let i = 0; i < 16; ++i) {
    -                                buf[offset + i] = bytes[i];
    -                            }
    -
    -                            return buf;
    -                        }
    -
    -                        return (0, _stringify.default)(bytes);
    -                    } // Function#name is not settable on some platforms (#270)
    -
    -
    -                    try {
    -                        generateUUID.name = name; // eslint-disable-next-line no-empty
    -                    } catch (err) { } // For CommonJS default export support
    -
    -
    -                    generateUUID.DNS = DNS;
    -                    generateUUID.URL = URL;
    -                    return generateUUID;
    -                }
    -
    -                /***/
    -}),
    -
    -/***/ 5122:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = void 0;
    -
    -                var _rng = _interopRequireDefault(__nccwpck_require__(807));
    -
    -                var _stringify = _interopRequireDefault(__nccwpck_require__(8950));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                function v4(options, buf, offset) {
    -                    options = options || {};
    -
    -                    const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
    -
    -
    -                    rnds[6] = rnds[6] & 0x0f | 0x40;
    -                    rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided
    -
    -                    if (buf) {
    -                        offset = offset || 0;
    -
    -                        for (let i = 0; i < 16; ++i) {
    -                            buf[offset + i] = rnds[i];
    -                        }
    -
    -                        return buf;
    -                    }
    -
    -                    return (0, _stringify.default)(rnds);
    -                }
    -
    -                var _default = v4;
    -                exports["default"] = _default;
    -
    -                /***/
    -}),
    -
    -/***/ 9120:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = void 0;
    -
    -                var _v = _interopRequireDefault(__nccwpck_require__(5998));
    -
    -                var _sha = _interopRequireDefault(__nccwpck_require__(5274));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                const v5 = (0, _v.default)('v5', 0x50, _sha.default);
    -                var _default = v5;
    -                exports["default"] = _default;
    -
    -                /***/
    -}),
    -
    -/***/ 6900:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = void 0;
    -
    -                var _regex = _interopRequireDefault(__nccwpck_require__(814));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                function validate(uuid) {
    -                    return typeof uuid === 'string' && _regex.default.test(uuid);
    -                }
    -
    -                var _default = validate;
    -                exports["default"] = _default;
    -
    -                /***/
    -}),
    -
    -/***/ 1595:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                Object.defineProperty(exports, "__esModule", ({
    -                    value: true
    -                }));
    -                exports["default"] = void 0;
    -
    -                var _validate = _interopRequireDefault(__nccwpck_require__(6900));
    -
    -                function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
    -
    -                function version(uuid) {
    -                    if (!(0, _validate.default)(uuid)) {
    -                        throw TypeError('Invalid UUID');
    -                    }
    -
    -                    return parseInt(uuid.substr(14, 1), 16);
    -                }
    -
    -                var _default = version;
    -                exports["default"] = _default;
    -
    -                /***/
    -}),
    -
    -/***/ 6455:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    var desc = Object.getOwnPropertyDescriptor(m, k);
    -                    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    -                        desc = { enumerable: true, get: function () { return m[k]; } };
    -                    }
    -                    Object.defineProperty(o, k2, desc);
    -                }) : (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    o[k2] = m[k];
    -                }));
    -                var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) {
    -                    Object.defineProperty(o, "default", { enumerable: true, value: v });
    -                }) : function (o, v) {
    -                    o["default"] = v;
    -                });
    -                var __importStar = (this && this.__importStar) || function (mod) {
    -                    if (mod && mod.__esModule) return mod;
    -                    var result = {};
    -                    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    -                    __setModuleDefault(result, mod);
    -                    return result;
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.getInputs = getInputs;
    -                const core = __importStar(__nccwpck_require__(2186));
    -                const path = __importStar(__nccwpck_require__(1017));
    -                function validateRepositoryPath(repositoryPath) {
    -                    const repoParts = repositoryPath.split('/');
    -                    if (repoParts.length !== 2 || !repoParts[0] || !repoParts[1]) {
    -                        throw new Error(`Invalid repository '${repositoryPath}'. Expected format {owner}/{repo}.`);
    -                    }
    -                }
    -                function validateReleaseVersion(latestFlag, ghTag, releaseId) {
    -                    if ((latestFlag && ghTag && releaseId) || (ghTag && releaseId)) {
    -                        throw new Error(`Invalid inputs. latest=${latestFlag}, tag=${ghTag}, and releaseId=${releaseId} can't coexist`);
    -                    }
    -                }
    -                function getInputs() {
    -                    let githubWorkspacePath = process.env['GITHUB_WORKSPACE'];
    -                    if (!githubWorkspacePath) {
    -                        throw new Error('$GITHUB_WORKSPACE not defined');
    -                    }
    -                    githubWorkspacePath = path.resolve(githubWorkspacePath);
    -                    const repositoryPath = core.getInput('repository');
    -                    validateRepositoryPath(repositoryPath);
    -                    const latestFlag = core.getBooleanInput('latest');
    -                    const preReleaseFlag = core.getBooleanInput('preRelease');
    -                    const ghTag = core.getInput('tag');
    -                    const releaseId = core.getInput('releaseId');
    -                    validateReleaseVersion(latestFlag, ghTag, releaseId);
    -                    return {
    -                        sourceRepoPath: repositoryPath,
    -                        isLatest: latestFlag,
    -                        preRelease: preReleaseFlag,
    -                        tag: ghTag,
    -                        id: releaseId,
    -                        fileName: core.getInput('fileName'),
    -                        tarBall: core.getBooleanInput('tarBall'),
    -                        zipBall: core.getBooleanInput('zipBall'),
    -                        extractAssets: core.getBooleanInput('extract'),
    -                        outFilePath: path.resolve(githubWorkspacePath, core.getInput('out-file-path') || '.'),
    -                        addToPathEnvironmentVariable: core.getBooleanInput('addToPath'),
    -                    };
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 399:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    var desc = Object.getOwnPropertyDescriptor(m, k);
    -                    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    -                        desc = { enumerable: true, get: function () { return m[k]; } };
    -                    }
    -                    Object.defineProperty(o, k2, desc);
    -                }) : (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    o[k2] = m[k];
    -                }));
    -                var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) {
    -                    Object.defineProperty(o, "default", { enumerable: true, value: v });
    -                }) : function (o, v) {
    -                    o["default"] = v;
    -                });
    -                var __importStar = (this && this.__importStar) || function (mod) {
    -                    if (mod && mod.__esModule) return mod;
    -                    var result = {};
    -                    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    -                    __setModuleDefault(result, mod);
    -                    return result;
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                const core = __importStar(__nccwpck_require__(2186));
    -                const handlers = __importStar(__nccwpck_require__(4442));
    -                const inputHelper = __importStar(__nccwpck_require__(6455));
    -                const thc = __importStar(__nccwpck_require__(5538));
    -                const node_fs_1 = __nccwpck_require__(7561);
    -                const node_path_1 = __nccwpck_require__(9411);
    -                const release_downloader_1 = __nccwpck_require__(785);
    -                const unarchive_1 = __nccwpck_require__(8512);
    -                async function run() {
    -                    try {
    -                        const downloadSettings = inputHelper.getInputs();
    -                        const authToken = core.getInput('token');
    -                        const githubApiUrl = core.getInput('github-api-url');
    -                        const credentialHandler = new handlers.BearerCredentialHandler(authToken, false);
    -                        const httpClient = new thc.HttpClient('gh-api-client', [
    -                            credentialHandler
    -                        ]);
    -                        const downloader = new release_downloader_1.ReleaseDownloader(httpClient, githubApiUrl);
    -                        const res = await downloader.download(downloadSettings);
    -                        if (downloadSettings.extractAssets) {
    -                            for (const asset of res) {
    -                                await (0, unarchive_1.extract)(asset, downloadSettings.outFilePath);
    -                            }
    -                        }
    -                        if (downloadSettings.addToPathEnvironmentVariable) {
    -                            const out = downloadSettings.outFilePath;
    -                            // Make executables executable
    -                            for (const file of (0, node_fs_1.readdirSync)(out)) {
    -                                let full = (0, node_path_1.join)(out, file);
    -                                const toSliceTo = /-[0-9]/.exec(file);
    -                                if (toSliceTo) {
    -                                    const old = full;
    -                                    full = (0, node_path_1.join)(out, file.slice(0, toSliceTo.index));
    -                                    (0, node_fs_1.renameSync)(old, full);
    -                                    core.debug(`Renamed ${old} to ${full}`);
    -                                }
    -                                const newMode = (0, node_fs_1.statSync)(full).mode | node_fs_1.constants.S_IXUSR | node_fs_1.constants.S_IXGRP | node_fs_1.constants.S_IXOTH;
    -                                (0, node_fs_1.chmodSync)(full, newMode);
    -                                core.info(`Added ${full} executable`);
    -                            }
    -                            core.addPath(out);
    -                            core.info(`Added ${out} to PATH`);
    -                        }
    -                        core.info(`Done: ${res}`);
    -                    }
    -                    catch (error) {
    -                        if (error instanceof Error) {
    -                            core.setFailed(error.message);
    -                        }
    -                    }
    -                }
    -                run();
    -
    -
    -                /***/
    -}),
    -
    -/***/ 785:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    var desc = Object.getOwnPropertyDescriptor(m, k);
    -                    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    -                        desc = { enumerable: true, get: function () { return m[k]; } };
    -                    }
    -                    Object.defineProperty(o, k2, desc);
    -                }) : (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    o[k2] = m[k];
    -                }));
    -                var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) {
    -                    Object.defineProperty(o, "default", { enumerable: true, value: v });
    -                }) : function (o, v) {
    -                    o["default"] = v;
    -                });
    -                var __importStar = (this && this.__importStar) || function (mod) {
    -                    if (mod && mod.__esModule) return mod;
    -                    var result = {};
    -                    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    -                    __setModuleDefault(result, mod);
    -                    return result;
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.ReleaseDownloader = void 0;
    -                const core = __importStar(__nccwpck_require__(2186));
    -                const fs = __importStar(__nccwpck_require__(7147));
    -                const io = __importStar(__nccwpck_require__(7436));
    -                const path = __importStar(__nccwpck_require__(1017));
    -                const minimatch_1 = __nccwpck_require__(4501);
    -                class ReleaseDownloader {
    -                    httpClient;
    -                    apiRoot;
    -                    constructor(httpClient, githubApiUrl) {
    -                        this.httpClient = httpClient;
    -                        this.apiRoot = githubApiUrl;
    -                    }
    -                    async download(downloadSettings) {
    -                        let ghRelease;
    -                        if (downloadSettings.isLatest) {
    -                            ghRelease = await this.getlatestRelease(downloadSettings.sourceRepoPath, downloadSettings.preRelease);
    -                        }
    -                        else if (downloadSettings.tag !== '') {
    -                            ghRelease = await this.getReleaseByTag(downloadSettings.sourceRepoPath, downloadSettings.tag);
    -                        }
    -                        else if (downloadSettings.id !== '') {
    -                            ghRelease = await this.getReleaseById(downloadSettings.sourceRepoPath, downloadSettings.id);
    -                        }
    -                        else {
    -                            throw new Error('Config error: Please input a valid tag or release ID, or specify `latest`');
    -                        }
    -                        const resolvedAssets = this.resolveAssets(ghRelease, downloadSettings);
    -                        const result = await this.downloadReleaseAssets(resolvedAssets, downloadSettings.outFilePath);
    -                        // Set the output variables for use by other actions
    -                        core.setOutput('tag_name', ghRelease.tag_name);
    -                        core.setOutput('release_name', ghRelease.name);
    -                        core.setOutput('downloaded_files', result);
    -                        return result;
    -                    }
    -                    /**
    -                     * Gets the latest release metadata from github api
    -                     * @param repoPath The source repository path. {owner}/{repo}
    -                     */
    -                    async getlatestRelease(repoPath, preRelease) {
    -                        core.info(`Fetching latest release for repo ${repoPath}`);
    -                        const headers = { Accept: 'application/vnd.github.v3+json' };
    -                        let response;
    -                        if (!preRelease) {
    -                            response = await this.httpClient.get(`${this.apiRoot}/repos/${repoPath}/releases/latest`, headers);
    -                        }
    -                        else {
    -                            response = await this.httpClient.get(`${this.apiRoot}/repos/${repoPath}/releases`, headers);
    -                        }
    -                        if (response.message.statusCode !== 200) {
    -                            const err = new Error(`[getlatestRelease] Unexpected response: ${response.message.statusCode}`);
    -                            throw err;
    -                        }
    -                        const responseBody = await response.readBody();
    -                        let release;
    -                        if (!preRelease) {
    -                            release = JSON.parse(responseBody.toString());
    -                            core.info(`Found latest release version: ${release.tag_name}`);
    -                        }
    -                        else {
    -                            const allReleases = JSON.parse(responseBody.toString());
    -                            const latestPreRelease = allReleases.find(r => r.prerelease === true);
    -                            if (latestPreRelease) {
    -                                release = latestPreRelease;
    -                                core.info(`Found latest pre-release version: ${release.tag_name}`);
    -                            }
    -                            else {
    -                                throw new Error('No prereleases found!');
    -                            }
    -                        }
    -                        return release;
    -                    }
    -                    /**
    -                     * Gets release data of the specified tag
    -                     * @param repoPath The source repository
    -                     * @param tag The github tag to fetch release from.
    -                     */
    -                    async getReleaseByTag(repoPath, tag) {
    -                        core.info(`Fetching release ${tag} from repo ${repoPath}`);
    -                        if (tag === '') {
    -                            throw new Error('Config error: Please input a valid tag');
    -                        }
    -                        const headers = { Accept: 'application/vnd.github.v3+json' };
    -                        const response = await this.httpClient.get(`${this.apiRoot}/repos/${repoPath}/releases/tags/${tag}`, headers);
    -                        if (response.message.statusCode !== 200) {
    -                            const err = new Error(`[getReleaseByTag] Unexpected response: ${response.message.statusCode}`);
    -                            throw err;
    -                        }
    -                        const responseBody = await response.readBody();
    -                        const release = JSON.parse(responseBody.toString());
    -                        core.info(`Found release tag: ${release.tag_name}`);
    -                        return release;
    -                    }
    -                    /**
    -                     * Gets release data of the specified release ID
    -                     * @param repoPath The source repository
    -                     * @param id The github release ID to fetch.
    -                     */
    -                    async getReleaseById(repoPath, id) {
    -                        core.info(`Fetching release id:${id} from repo ${repoPath}`);
    -                        if (id === '') {
    -                            throw new Error('Config error: Please input a valid release ID');
    -                        }
    -                        const headers = { Accept: 'application/vnd.github.v3+json' };
    -                        const response = await this.httpClient.get(`${this.apiRoot}/repos/${repoPath}/releases/${id}`, headers);
    -                        if (response.message.statusCode !== 200) {
    -                            const err = new Error(`[getReleaseById] Unexpected response: ${response.message.statusCode}`);
    -                            throw err;
    -                        }
    -                        const responseBody = await response.readBody();
    -                        const release = JSON.parse(responseBody.toString());
    -                        core.info(`Found release tag: ${release.tag_name}`);
    -                        return release;
    -                    }
    -                    resolveAssets(ghRelease, downloadSettings) {
    -                        const downloads = [];
    -                        if (downloadSettings.fileName.length > 0) {
    -                            if (ghRelease && ghRelease.assets.length > 0) {
    -                                for (const asset of ghRelease.assets) {
    -                                    // download only matching file names
    -                                    if (!(0, minimatch_1.minimatch)(asset.name, downloadSettings.fileName)) {
    -                                        continue;
    -                                    }
    -                                    const dData = {
    -                                        fileName: asset.name,
    -                                        url: asset['url'],
    -                                        isTarBallOrZipBall: false
    -                                    };
    -                                    downloads.push(dData);
    -                                }
    -                                if (downloads.length === 0) {
    -                                    throw new Error(`Asset with name ${downloadSettings.fileName} not found!`);
    -                                }
    -                            }
    -                            else {
    -                                throw new Error(`No assets found in release ${ghRelease.name}`);
    -                            }
    -                        }
    -                        if (downloadSettings.tarBall) {
    -                            const repoName = downloadSettings.sourceRepoPath.split('/')[1];
    -                            downloads.push({
    -                                fileName: `${repoName}-${ghRelease.tag_name}.tar.gz`,
    -                                url: ghRelease.tarball_url,
    -                                isTarBallOrZipBall: true
    -                            });
    -                        }
    -                        if (downloadSettings.zipBall) {
    -                            const repoName = downloadSettings.sourceRepoPath.split('/')[1];
    -                            downloads.push({
    -                                fileName: `${repoName}-${ghRelease.tag_name}.zip`,
    -                                url: ghRelease.zipball_url,
    -                                isTarBallOrZipBall: true
    -                            });
    -                        }
    -                        return downloads;
    -                    }
    -                    /**
    -                     * Downloads the specified assets from a given URL
    -                     * @param dData The download metadata
    -                     * @param out Target directory
    -                     */
    -                    async downloadReleaseAssets(dData, out) {
    -                        const outFileDir = path.resolve(out);
    -                        if (!fs.existsSync(outFileDir)) {
    -                            io.mkdirP(outFileDir);
    -                        }
    -                        const downloads = [];
    -                        for (const asset of dData) {
    -                            downloads.push(this.downloadFile(asset, out));
    -                        }
    -                        const result = await Promise.all(downloads);
    -                        return result;
    -                    }
    -                    async downloadFile(asset, outputPath) {
    -                        const headers = {
    -                            Accept: 'application/octet-stream'
    -                        };
    -                        if (asset.isTarBallOrZipBall) {
    -                            headers['Accept'] = '*/*';
    -                        }
    -                        core.info(`Downloading file: ${asset.fileName} to: ${outputPath}`);
    -                        const response = await this.httpClient.get(asset.url, headers);
    -                        if (response.message.statusCode === 200) {
    -                            return this.saveFile(outputPath, asset.fileName, response);
    -                        }
    -                        else {
    -                            const err = new Error(`Unexpected response: ${response.message.statusCode}`);
    -                            throw err;
    -                        }
    -                    }
    -                    async saveFile(outputPath, fileName, httpClientResponse) {
    -                        const outFilePath = path.resolve(outputPath, fileName);
    -                        const fileStream = fs.createWriteStream(outFilePath);
    -                        return new Promise((resolve, reject) => {
    -                            fileStream.on('error', err => reject(err));
    -                            const outStream = httpClientResponse.message.pipe(fileStream);
    -                            outStream.on('close', () => {
    -                                resolve(outFilePath);
    -                            });
    -                        });
    -                    }
    -                }
    -                exports.ReleaseDownloader = ReleaseDownloader;
    -
    -
    -                /***/
    -}),
    -
    -/***/ 8512:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    var desc = Object.getOwnPropertyDescriptor(m, k);
    -                    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    -                        desc = { enumerable: true, get: function () { return m[k]; } };
    -                    }
    -                    Object.defineProperty(o, k2, desc);
    -                }) : (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    o[k2] = m[k];
    -                }));
    -                var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) {
    -                    Object.defineProperty(o, "default", { enumerable: true, value: v });
    -                }) : function (o, v) {
    -                    o["default"] = v;
    -                });
    -                var __importStar = (this && this.__importStar) || function (mod) {
    -                    if (mod && mod.__esModule) return mod;
    -                    var result = {};
    -                    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    -                    __setModuleDefault(result, mod);
    -                    return result;
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.extract = void 0;
    -                const core = __importStar(__nccwpck_require__(2186));
    -                const fs = __importStar(__nccwpck_require__(7147));
    -                const path = __importStar(__nccwpck_require__(1017));
    -                const tar = __importStar(__nccwpck_require__(6630));
    -                const StreamZip = __importStar(__nccwpck_require__(8119));
    -                const extract = async (filePath, destDir) => {
    -                    const isTarGz = filePath.endsWith('.tar.gz') || filePath.endsWith('.tar');
    -                    const isZip = filePath.endsWith('.zip');
    -                    const filename = path.basename(filePath);
    -                    if (!isTarGz && !isZip) {
    -                        core.warning(`The file ${filename} is not a supported archive. It will be skipped`);
    -                        return;
    -                    }
    -                    // Create the destination directory if it doesn't already exist
    -                    if (!fs.existsSync(destDir)) {
    -                        fs.mkdirSync(destDir, { recursive: true });
    -                    }
    -                    // Extract the file to the destination directory
    -                    if (isTarGz) {
    -                        await tar.x({
    -                            file: filePath,
    -                            cwd: destDir
    -                        });
    -                    }
    -                    if (isZip) {
    -                        const zip = new StreamZip.async({ file: filePath });
    -                        await zip.extract(null, destDir);
    -                        await zip.close();
    -                    }
    -                    core.info(`Extracted ${filename} to ${destDir}`);
    -                };
    -                exports.extract = extract;
    -
    -
    -                /***/
    -}),
    -
    -/***/ 9491:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("assert");
    -
    -                /***/
    -}),
    -
    -/***/ 852:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("async_hooks");
    -
    -                /***/
    -}),
    -
    -/***/ 4300:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("buffer");
    -
    -                /***/
    -}),
    -
    -/***/ 6206:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("console");
    -
    -                /***/
    -}),
    -
    -/***/ 6113:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("crypto");
    -
    -                /***/
    -}),
    -
    -/***/ 7643:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("diagnostics_channel");
    -
    -                /***/
    -}),
    -
    -/***/ 2361:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("events");
    -
    -                /***/
    -}),
    -
    -/***/ 7147:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("fs");
    -
    -                /***/
    -}),
    -
    -/***/ 3685:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("http");
    -
    -                /***/
    -}),
    -
    -/***/ 5158:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("http2");
    -
    -                /***/
    -}),
    -
    -/***/ 5687:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("https");
    -
    -                /***/
    -}),
    -
    -/***/ 1808:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("net");
    -
    -                /***/
    -}),
    -
    -/***/ 8061:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("node:assert");
    -
    -                /***/
    -}),
    -
    -/***/ 6005:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("node:crypto");
    -
    -                /***/
    -}),
    -
    -/***/ 5673:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("node:events");
    -
    -                /***/
    -}),
    -
    -/***/ 7561:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("node:fs");
    -
    -                /***/
    -}),
    -
    -/***/ 9411:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("node:path");
    -
    -                /***/
    -}),
    -
    -/***/ 4492:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("node:stream");
    -
    -                /***/
    -}),
    -
    -/***/ 6915:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("node:string_decoder");
    -
    -                /***/
    -}),
    -
    -/***/ 7261:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("node:util");
    -
    -                /***/
    -}),
    -
    -/***/ 2037:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("os");
    -
    -                /***/
    -}),
    -
    -/***/ 1017:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("path");
    -
    -                /***/
    -}),
    -
    -/***/ 4074:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("perf_hooks");
    -
    -                /***/
    -}),
    -
    -/***/ 3477:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("querystring");
    -
    -                /***/
    -}),
    -
    -/***/ 2781:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("stream");
    -
    -                /***/
    -}),
    -
    -/***/ 5356:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("stream/web");
    -
    -                /***/
    -}),
    -
    -/***/ 1576:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("string_decoder");
    -
    -                /***/
    -}),
    -
    -/***/ 4404:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("tls");
    -
    -                /***/
    -}),
    -
    -/***/ 7310:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("url");
    -
    -                /***/
    -}),
    -
    -/***/ 3837:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("util");
    -
    -                /***/
    -}),
    -
    -/***/ 9830:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("util/types");
    -
    -                /***/
    -}),
    -
    -/***/ 1267:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("worker_threads");
    -
    -                /***/
    -}),
    -
    -/***/ 9796:
    -/***/ ((module) => {
    -
    -                "use strict";
    -                module.exports = require("zlib");
    -
    -                /***/
    -}),
    -
    -/***/ 2960:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const WritableStream = (__nccwpck_require__(4492).Writable)
    -                const inherits = (__nccwpck_require__(7261).inherits)
    -
    -                const StreamSearch = __nccwpck_require__(1142)
    -
    -                const PartStream = __nccwpck_require__(1620)
    -                const HeaderParser = __nccwpck_require__(2032)
    -
    -                const DASH = 45
    -                const B_ONEDASH = Buffer.from('-')
    -                const B_CRLF = Buffer.from('\r\n')
    -                const EMPTY_FN = function () { }
    -
    -                function Dicer(cfg) {
    -                    if (!(this instanceof Dicer)) { return new Dicer(cfg) }
    -                    WritableStream.call(this, cfg)
    -
    -                    if (!cfg || (!cfg.headerFirst && typeof cfg.boundary !== 'string')) { throw new TypeError('Boundary required') }
    -
    -                    if (typeof cfg.boundary === 'string') { this.setBoundary(cfg.boundary) } else { this._bparser = undefined }
    -
    -                    this._headerFirst = cfg.headerFirst
    -
    -                    this._dashes = 0
    -                    this._parts = 0
    -                    this._finished = false
    -                    this._realFinish = false
    -                    this._isPreamble = true
    -                    this._justMatched = false
    -                    this._firstWrite = true
    -                    this._inHeader = true
    -                    this._part = undefined
    -                    this._cb = undefined
    -                    this._ignoreData = false
    -                    this._partOpts = { highWaterMark: cfg.partHwm }
    -                    this._pause = false
    -
    -                    const self = this
    -                    this._hparser = new HeaderParser(cfg)
    -                    this._hparser.on('header', function (header) {
    -                        self._inHeader = false
    -                        self._part.emit('header', header)
    -                    })
    -                }
    -                inherits(Dicer, WritableStream)
    -
    -                Dicer.prototype.emit = function (ev) {
    -                    if (ev === 'finish' && !this._realFinish) {
    -                        if (!this._finished) {
    -                            const self = this
    -                            process.nextTick(function () {
    -                                self.emit('error', new Error('Unexpected end of multipart data'))
    -                                if (self._part && !self._ignoreData) {
    -                                    const type = (self._isPreamble ? 'Preamble' : 'Part')
    -                                    self._part.emit('error', new Error(type + ' terminated early due to unexpected end of multipart data'))
    -                                    self._part.push(null)
    -                                    process.nextTick(function () {
    -                                        self._realFinish = true
    -                                        self.emit('finish')
    -                                        self._realFinish = false
    -                                    })
    -                                    return
    -                                }
    -                                self._realFinish = true
    -                                self.emit('finish')
    -                                self._realFinish = false
    -                            })
    -                        }
    -                    } else { WritableStream.prototype.emit.apply(this, arguments) }
    -                }
    -
    -                Dicer.prototype._write = function (data, encoding, cb) {
    -                    // ignore unexpected data (e.g. extra trailer data after finished)
    -                    if (!this._hparser && !this._bparser) { return cb() }
    -
    -                    if (this._headerFirst && this._isPreamble) {
    -                        if (!this._part) {
    -                            this._part = new PartStream(this._partOpts)
    -                            if (this.listenerCount('preamble') !== 0) { this.emit('preamble', this._part) } else { this._ignore() }
    -                        }
    -                        const r = this._hparser.push(data)
    -                        if (!this._inHeader && r !== undefined && r < data.length) { data = data.slice(r) } else { return cb() }
    -                    }
    -
    -                    // allows for "easier" testing
    -                    if (this._firstWrite) {
    -                        this._bparser.push(B_CRLF)
    -                        this._firstWrite = false
    -                    }
    -
    -                    this._bparser.push(data)
    -
    -                    if (this._pause) { this._cb = cb } else { cb() }
    -                }
    -
    -                Dicer.prototype.reset = function () {
    -                    this._part = undefined
    -                    this._bparser = undefined
    -                    this._hparser = undefined
    -                }
    -
    -                Dicer.prototype.setBoundary = function (boundary) {
    -                    const self = this
    -                    this._bparser = new StreamSearch('\r\n--' + boundary)
    -                    this._bparser.on('info', function (isMatch, data, start, end) {
    -                        self._oninfo(isMatch, data, start, end)
    -                    })
    -                }
    -
    -                Dicer.prototype._ignore = function () {
    -                    if (this._part && !this._ignoreData) {
    -                        this._ignoreData = true
    -                        this._part.on('error', EMPTY_FN)
    -                        // we must perform some kind of read on the stream even though we are
    -                        // ignoring the data, otherwise node's Readable stream will not emit 'end'
    -                        // after pushing null to the stream
    -                        this._part.resume()
    -                    }
    -                }
    -
    -                Dicer.prototype._oninfo = function (isMatch, data, start, end) {
    -                    let buf; const self = this; let i = 0; let r; let shouldWriteMore = true
    -
    -                    if (!this._part && this._justMatched && data) {
    -                        while (this._dashes < 2 && (start + i) < end) {
    -                            if (data[start + i] === DASH) {
    -                                ++i
    -                                ++this._dashes
    -                            } else {
    -                                if (this._dashes) { buf = B_ONEDASH }
    -                                this._dashes = 0
    -                                break
    -                            }
    -                        }
    -                        if (this._dashes === 2) {
    -                            if ((start + i) < end && this.listenerCount('trailer') !== 0) { this.emit('trailer', data.slice(start + i, end)) }
    -                            this.reset()
    -                            this._finished = true
    -                            // no more parts will be added
    -                            if (self._parts === 0) {
    -                                self._realFinish = true
    -                                self.emit('finish')
    -                                self._realFinish = false
    -                            }
    -                        }
    -                        if (this._dashes) { return }
    -                    }
    -                    if (this._justMatched) { this._justMatched = false }
    -                    if (!this._part) {
    -                        this._part = new PartStream(this._partOpts)
    -                        this._part._read = function (n) {
    -                            self._unpause()
    -                        }
    -                        if (this._isPreamble && this.listenerCount('preamble') !== 0) {
    -                            this.emit('preamble', this._part)
    -                        } else if (this._isPreamble !== true && this.listenerCount('part') !== 0) {
    -                            this.emit('part', this._part)
    -                        } else {
    -                            this._ignore()
    -                        }
    -                        if (!this._isPreamble) { this._inHeader = true }
    -                    }
    -                    if (data && start < end && !this._ignoreData) {
    -                        if (this._isPreamble || !this._inHeader) {
    -                            if (buf) { shouldWriteMore = this._part.push(buf) }
    -                            shouldWriteMore = this._part.push(data.slice(start, end))
    -                            if (!shouldWriteMore) { this._pause = true }
    -                        } else if (!this._isPreamble && this._inHeader) {
    -                            if (buf) { this._hparser.push(buf) }
    -                            r = this._hparser.push(data.slice(start, end))
    -                            if (!this._inHeader && r !== undefined && r < end) { this._oninfo(false, data, start + r, end) }
    -                        }
    -                    }
    -                    if (isMatch) {
    -                        this._hparser.reset()
    -                        if (this._isPreamble) { this._isPreamble = false } else {
    -                            if (start !== end) {
    -                                ++this._parts
    -                                this._part.on('end', function () {
    -                                    if (--self._parts === 0) {
    -                                        if (self._finished) {
    -                                            self._realFinish = true
    -                                            self.emit('finish')
    -                                            self._realFinish = false
    -                                        } else {
    -                                            self._unpause()
    -                                        }
    -                                    }
    -                                })
    -                            }
    -                        }
    -                        this._part.push(null)
    -                        this._part = undefined
    -                        this._ignoreData = false
    -                        this._justMatched = true
    -                        this._dashes = 0
    -                    }
    -                }
    -
    -                Dicer.prototype._unpause = function () {
    -                    if (!this._pause) { return }
    -
    -                    this._pause = false
    -                    if (this._cb) {
    -                        const cb = this._cb
    -                        this._cb = undefined
    -                        cb()
    -                    }
    -                }
    -
    -                module.exports = Dicer
    -
    -
    -                /***/
    -}),
    -
    -/***/ 2032:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const EventEmitter = (__nccwpck_require__(5673).EventEmitter)
    -                const inherits = (__nccwpck_require__(7261).inherits)
    -                const getLimit = __nccwpck_require__(1467)
    -
    -                const StreamSearch = __nccwpck_require__(1142)
    -
    -                const B_DCRLF = Buffer.from('\r\n\r\n')
    -                const RE_CRLF = /\r\n/g
    -                const RE_HDR = /^([^:]+):[ \t]?([\x00-\xFF]+)?$/ // eslint-disable-line no-control-regex
    -
    -                function HeaderParser(cfg) {
    -                    EventEmitter.call(this)
    -
    -                    cfg = cfg || {}
    -                    const self = this
    -                    this.nread = 0
    -                    this.maxed = false
    -                    this.npairs = 0
    -                    this.maxHeaderPairs = getLimit(cfg, 'maxHeaderPairs', 2000)
    -                    this.maxHeaderSize = getLimit(cfg, 'maxHeaderSize', 80 * 1024)
    -                    this.buffer = ''
    -                    this.header = {}
    -                    this.finished = false
    -                    this.ss = new StreamSearch(B_DCRLF)
    -                    this.ss.on('info', function (isMatch, data, start, end) {
    -                        if (data && !self.maxed) {
    -                            if (self.nread + end - start >= self.maxHeaderSize) {
    -                                end = self.maxHeaderSize - self.nread + start
    -                                self.nread = self.maxHeaderSize
    -                                self.maxed = true
    -                            } else { self.nread += (end - start) }
    -
    -                            self.buffer += data.toString('binary', start, end)
    -                        }
    -                        if (isMatch) { self._finish() }
    -                    })
    -                }
    -                inherits(HeaderParser, EventEmitter)
    -
    -                HeaderParser.prototype.push = function (data) {
    -                    const r = this.ss.push(data)
    -                    if (this.finished) { return r }
    -                }
    -
    -                HeaderParser.prototype.reset = function () {
    -                    this.finished = false
    -                    this.buffer = ''
    -                    this.header = {}
    -                    this.ss.reset()
    -                }
    -
    -                HeaderParser.prototype._finish = function () {
    -                    if (this.buffer) { this._parseHeader() }
    -                    this.ss.matches = this.ss.maxMatches
    -                    const header = this.header
    -                    this.header = {}
    -                    this.buffer = ''
    -                    this.finished = true
    -                    this.nread = this.npairs = 0
    -                    this.maxed = false
    -                    this.emit('header', header)
    -                }
    -
    -                HeaderParser.prototype._parseHeader = function () {
    -                    if (this.npairs === this.maxHeaderPairs) { return }
    -
    -                    const lines = this.buffer.split(RE_CRLF)
    -                    const len = lines.length
    -                    let m, h
    -
    -                    for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
    -                        if (lines[i].length === 0) { continue }
    -                        if (lines[i][0] === '\t' || lines[i][0] === ' ') {
    -                            // folded header content
    -                            // RFC2822 says to just remove the CRLF and not the whitespace following
    -                            // it, so we follow the RFC and include the leading whitespace ...
    -                            if (h) {
    -                                this.header[h][this.header[h].length - 1] += lines[i]
    -                                continue
    -                            }
    -                        }
    -
    -                        const posColon = lines[i].indexOf(':')
    -                        if (
    -                            posColon === -1 ||
    -                            posColon === 0
    -                        ) {
    -                            return
    -                        }
    -                        m = RE_HDR.exec(lines[i])
    -                        h = m[1].toLowerCase()
    -                        this.header[h] = this.header[h] || []
    -                        this.header[h].push((m[2] || ''))
    -                        if (++this.npairs === this.maxHeaderPairs) { break }
    -                    }
    -                }
    -
    -                module.exports = HeaderParser
    -
    -
    -                /***/
    -}),
    -
    -/***/ 1620:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const inherits = (__nccwpck_require__(7261).inherits)
    -                const ReadableStream = (__nccwpck_require__(4492).Readable)
    -
    -                function PartStream(opts) {
    -                    ReadableStream.call(this, opts)
    -                }
    -                inherits(PartStream, ReadableStream)
    -
    -                PartStream.prototype._read = function (n) { }
    -
    -                module.exports = PartStream
    -
    -
    -                /***/
    -}),
    -
    -/***/ 1142:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                /**
    -                 * Copyright Brian White. All rights reserved.
    -                 *
    -                 * @see https://github.com/mscdex/streamsearch
    -                 *
    -                 * Permission is hereby granted, free of charge, to any person obtaining a copy
    -                 * of this software and associated documentation files (the "Software"), to
    -                 * deal in the Software without restriction, including without limitation the
    -                 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
    -                 * sell copies of the Software, and to permit persons to whom the Software is
    -                 * furnished to do so, subject to the following conditions:
    -                 *
    -                 * The above copyright notice and this permission notice shall be included in
    -                 * all copies or substantial portions of the Software.
    -                 *
    -                 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    -                 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    -                 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    -                 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    -                 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    -                 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
    -                 * IN THE SOFTWARE.
    -                 *
    -                 * Based heavily on the Streaming Boyer-Moore-Horspool C++ implementation
    -                 * by Hongli Lai at: https://github.com/FooBarWidget/boyer-moore-horspool
    -                 */
    -                const EventEmitter = (__nccwpck_require__(5673).EventEmitter)
    -                const inherits = (__nccwpck_require__(7261).inherits)
    -
    -                function SBMH(needle) {
    -                    if (typeof needle === 'string') {
    -                        needle = Buffer.from(needle)
    -                    }
    -
    -                    if (!Buffer.isBuffer(needle)) {
    -                        throw new TypeError('The needle has to be a String or a Buffer.')
    -                    }
    -
    -                    const needleLength = needle.length
    -
    -                    if (needleLength === 0) {
    -                        throw new Error('The needle cannot be an empty String/Buffer.')
    -                    }
    -
    -                    if (needleLength > 256) {
    -                        throw new Error('The needle cannot have a length bigger than 256.')
    -                    }
    -
    -                    this.maxMatches = Infinity
    -                    this.matches = 0
    -
    -                    this._occ = new Array(256)
    -                        .fill(needleLength) // Initialize occurrence table.
    -                    this._lookbehind_size = 0
    -                    this._needle = needle
    -                    this._bufpos = 0
    -
    -                    this._lookbehind = Buffer.alloc(needleLength)
    -
    -                    // Populate occurrence table with analysis of the needle,
    -                    // ignoring last letter.
    -                    for (var i = 0; i < needleLength - 1; ++i) { // eslint-disable-line no-var
    -                        this._occ[needle[i]] = needleLength - 1 - i
    -                    }
    -                }
    -                inherits(SBMH, EventEmitter)
    -
    -                SBMH.prototype.reset = function () {
    -                    this._lookbehind_size = 0
    -                    this.matches = 0
    -                    this._bufpos = 0
    -                }
    -
    -                SBMH.prototype.push = function (chunk, pos) {
    -                    if (!Buffer.isBuffer(chunk)) {
    -                        chunk = Buffer.from(chunk, 'binary')
    -                    }
    -                    const chlen = chunk.length
    -                    this._bufpos = pos || 0
    -                    let r
    -                    while (r !== chlen && this.matches < this.maxMatches) { r = this._sbmh_feed(chunk) }
    -                    return r
    -                }
    -
    -                SBMH.prototype._sbmh_feed = function (data) {
    -                    const len = data.length
    -                    const needle = this._needle
    -                    const needleLength = needle.length
    -                    const lastNeedleChar = needle[needleLength - 1]
    -
    -                    // Positive: points to a position in `data`
    -                    //           pos == 3 points to data[3]
    -                    // Negative: points to a position in the lookbehind buffer
    -                    //           pos == -2 points to lookbehind[lookbehind_size - 2]
    -                    let pos = -this._lookbehind_size
    -                    let ch
    -
    -                    if (pos < 0) {
    -                        // Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool
    -                        // search with character lookup code that considers both the
    -                        // lookbehind buffer and the current round's haystack data.
    -                        //
    -                        // Loop until
    -                        //   there is a match.
    -                        // or until
    -                        //   we've moved past the position that requires the
    -                        //   lookbehind buffer. In this case we switch to the
    -                        //   optimized loop.
    -                        // or until
    -                        //   the character to look at lies outside the haystack.
    -                        while (pos < 0 && pos <= len - needleLength) {
    -                            ch = this._sbmh_lookup_char(data, pos + needleLength - 1)
    -
    -                            if (
    -                                ch === lastNeedleChar &&
    -                                this._sbmh_memcmp(data, pos, needleLength - 1)
    -                            ) {
    -                                this._lookbehind_size = 0
    -                                ++this.matches
    -                                this.emit('info', true)
    -
    -                                return (this._bufpos = pos + needleLength)
    -                            }
    -                            pos += this._occ[ch]
    -                        }
    -
    -                        // No match.
    -
    -                        if (pos < 0) {
    -                            // There's too few data for Boyer-Moore-Horspool to run,
    -                            // so let's use a different algorithm to skip as much as
    -                            // we can.
    -                            // Forward pos until
    -                            //   the trailing part of lookbehind + data
    -                            //   looks like the beginning of the needle
    -                            // or until
    -                            //   pos == 0
    -                            while (pos < 0 && !this._sbmh_memcmp(data, pos, len - pos)) { ++pos }
    -                        }
    -
    -                        if (pos >= 0) {
    -                            // Discard lookbehind buffer.
    -                            this.emit('info', false, this._lookbehind, 0, this._lookbehind_size)
    -                            this._lookbehind_size = 0
    -                        } else {
    -                            // Cut off part of the lookbehind buffer that has
    -                            // been processed and append the entire haystack
    -                            // into it.
    -                            const bytesToCutOff = this._lookbehind_size + pos
    -                            if (bytesToCutOff > 0) {
    -                                // The cut off data is guaranteed not to contain the needle.
    -                                this.emit('info', false, this._lookbehind, 0, bytesToCutOff)
    -                            }
    -
    -                            this._lookbehind.copy(this._lookbehind, 0, bytesToCutOff,
    -                                this._lookbehind_size - bytesToCutOff)
    -                            this._lookbehind_size -= bytesToCutOff
    -
    -                            data.copy(this._lookbehind, this._lookbehind_size)
    -                            this._lookbehind_size += len
    -
    -                            this._bufpos = len
    -                            return len
    -                        }
    -                    }
    -
    -                    pos += (pos >= 0) * this._bufpos
    -
    -                    // Lookbehind buffer is now empty. We only need to check if the
    -                    // needle is in the haystack.
    -                    if (data.indexOf(needle, pos) !== -1) {
    -                        pos = data.indexOf(needle, pos)
    -                        ++this.matches
    -                        if (pos > 0) { this.emit('info', true, data, this._bufpos, pos) } else { this.emit('info', true) }
    -
    -                        return (this._bufpos = pos + needleLength)
    -                    } else {
    -                        pos = len - needleLength
    -                    }
    -
    -                    // There was no match. If there's trailing haystack data that we cannot
    -                    // match yet using the Boyer-Moore-Horspool algorithm (because the trailing
    -                    // data is less than the needle size) then match using a modified
    -                    // algorithm that starts matching from the beginning instead of the end.
    -                    // Whatever trailing data is left after running this algorithm is added to
    -                    // the lookbehind buffer.
    -                    while (
    -                        pos < len &&
    -                        (
    -                            data[pos] !== needle[0] ||
    -                            (
    -                                (Buffer.compare(
    -                                    data.subarray(pos, pos + len - pos),
    -                                    needle.subarray(0, len - pos)
    -                                ) !== 0)
    -                            )
    -                        )
    -                    ) {
    -                        ++pos
    -                    }
    -                    if (pos < len) {
    -                        data.copy(this._lookbehind, 0, pos, pos + (len - pos))
    -                        this._lookbehind_size = len - pos
    -                    }
    -
    -                    // Everything until pos is guaranteed not to contain needle data.
    -                    if (pos > 0) { this.emit('info', false, data, this._bufpos, pos < len ? pos : len) }
    -
    -                    this._bufpos = len
    -                    return len
    -                }
    -
    -                SBMH.prototype._sbmh_lookup_char = function (data, pos) {
    -                    return (pos < 0)
    -                        ? this._lookbehind[this._lookbehind_size + pos]
    -                        : data[pos]
    -                }
    -
    -                SBMH.prototype._sbmh_memcmp = function (data, pos, len) {
    -                    for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
    -                        if (this._sbmh_lookup_char(data, pos + i) !== this._needle[i]) { return false }
    -                    }
    -                    return true
    -                }
    -
    -                module.exports = SBMH
    -
    -
    -                /***/
    -}),
    -
    -/***/ 727:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const WritableStream = (__nccwpck_require__(4492).Writable)
    -                const { inherits } = __nccwpck_require__(7261)
    -                const Dicer = __nccwpck_require__(2960)
    -
    -                const MultipartParser = __nccwpck_require__(2183)
    -                const UrlencodedParser = __nccwpck_require__(8306)
    -                const parseParams = __nccwpck_require__(1854)
    -
    -                function Busboy(opts) {
    -                    if (!(this instanceof Busboy)) { return new Busboy(opts) }
    -
    -                    if (typeof opts !== 'object') {
    -                        throw new TypeError('Busboy expected an options-Object.')
    -                    }
    -                    if (typeof opts.headers !== 'object') {
    -                        throw new TypeError('Busboy expected an options-Object with headers-attribute.')
    -                    }
    -                    if (typeof opts.headers['content-type'] !== 'string') {
    -                        throw new TypeError('Missing Content-Type-header.')
    -                    }
    -
    -                    const {
    -                        headers,
    -                        ...streamOptions
    -                    } = opts
    -
    -                    this.opts = {
    -                        autoDestroy: false,
    -                        ...streamOptions
    -                    }
    -                    WritableStream.call(this, this.opts)
    -
    -                    this._done = false
    -                    this._parser = this.getParserByHeaders(headers)
    -                    this._finished = false
    -                }
    -                inherits(Busboy, WritableStream)
    -
    -                Busboy.prototype.emit = function (ev) {
    -                    if (ev === 'finish') {
    -                        if (!this._done) {
    -                            this._parser?.end()
    -                            return
    -                        } else if (this._finished) {
    -                            return
    -                        }
    -                        this._finished = true
    -                    }
    -                    WritableStream.prototype.emit.apply(this, arguments)
    -                }
    -
    -                Busboy.prototype.getParserByHeaders = function (headers) {
    -                    const parsed = parseParams(headers['content-type'])
    -
    -                    const cfg = {
    -                        defCharset: this.opts.defCharset,
    -                        fileHwm: this.opts.fileHwm,
    -                        headers,
    -                        highWaterMark: this.opts.highWaterMark,
    -                        isPartAFile: this.opts.isPartAFile,
    -                        limits: this.opts.limits,
    -                        parsedConType: parsed,
    -                        preservePath: this.opts.preservePath
    -                    }
    -
    -                    if (MultipartParser.detect.test(parsed[0])) {
    -                        return new MultipartParser(this, cfg)
    -                    }
    -                    if (UrlencodedParser.detect.test(parsed[0])) {
    -                        return new UrlencodedParser(this, cfg)
    -                    }
    -                    throw new Error('Unsupported Content-Type.')
    -                }
    -
    -                Busboy.prototype._write = function (chunk, encoding, cb) {
    -                    this._parser.write(chunk, cb)
    -                }
    -
    -                module.exports = Busboy
    -                module.exports["default"] = Busboy
    -                module.exports.Busboy = Busboy
    -
    -                module.exports.Dicer = Dicer
    -
    -
    -                /***/
    -}),
    -
    -/***/ 2183:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                // TODO:
    -                //  * support 1 nested multipart level
    -                //    (see second multipart example here:
    -                //     http://www.w3.org/TR/html401/interact/forms.html#didx-multipartform-data)
    -                //  * support limits.fieldNameSize
    -                //     -- this will require modifications to utils.parseParams
    -
    -                const { Readable } = __nccwpck_require__(4492)
    -                const { inherits } = __nccwpck_require__(7261)
    -
    -                const Dicer = __nccwpck_require__(2960)
    -
    -                const parseParams = __nccwpck_require__(1854)
    -                const decodeText = __nccwpck_require__(4619)
    -                const basename = __nccwpck_require__(8647)
    -                const getLimit = __nccwpck_require__(1467)
    -
    -                const RE_BOUNDARY = /^boundary$/i
    -                const RE_FIELD = /^form-data$/i
    -                const RE_CHARSET = /^charset$/i
    -                const RE_FILENAME = /^filename$/i
    -                const RE_NAME = /^name$/i
    -
    -                Multipart.detect = /^multipart\/form-data/i
    -                function Multipart(boy, cfg) {
    -                    let i
    -                    let len
    -                    const self = this
    -                    let boundary
    -                    const limits = cfg.limits
    -                    const isPartAFile = cfg.isPartAFile || ((fieldName, contentType, fileName) => (contentType === 'application/octet-stream' || fileName !== undefined))
    -                    const parsedConType = cfg.parsedConType || []
    -                    const defCharset = cfg.defCharset || 'utf8'
    -                    const preservePath = cfg.preservePath
    -                    const fileOpts = { highWaterMark: cfg.fileHwm }
    -
    -                    for (i = 0, len = parsedConType.length; i < len; ++i) {
    -                        if (Array.isArray(parsedConType[i]) &&
    -                            RE_BOUNDARY.test(parsedConType[i][0])) {
    -                            boundary = parsedConType[i][1]
    -                            break
    -                        }
    -                    }
    -
    -                    function checkFinished() {
    -                        if (nends === 0 && finished && !boy._done) {
    -                            finished = false
    -                            self.end()
    -                        }
    -                    }
    -
    -                    if (typeof boundary !== 'string') { throw new Error('Multipart: Boundary not found') }
    -
    -                    const fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)
    -                    const fileSizeLimit = getLimit(limits, 'fileSize', Infinity)
    -                    const filesLimit = getLimit(limits, 'files', Infinity)
    -                    const fieldsLimit = getLimit(limits, 'fields', Infinity)
    -                    const partsLimit = getLimit(limits, 'parts', Infinity)
    -                    const headerPairsLimit = getLimit(limits, 'headerPairs', 2000)
    -                    const headerSizeLimit = getLimit(limits, 'headerSize', 80 * 1024)
    -
    -                    let nfiles = 0
    -                    let nfields = 0
    -                    let nends = 0
    -                    let curFile
    -                    let curField
    -                    let finished = false
    -
    -                    this._needDrain = false
    -                    this._pause = false
    -                    this._cb = undefined
    -                    this._nparts = 0
    -                    this._boy = boy
    -
    -                    const parserCfg = {
    -                        boundary,
    -                        maxHeaderPairs: headerPairsLimit,
    -                        maxHeaderSize: headerSizeLimit,
    -                        partHwm: fileOpts.highWaterMark,
    -                        highWaterMark: cfg.highWaterMark
    -                    }
    -
    -                    this.parser = new Dicer(parserCfg)
    -                    this.parser.on('drain', function () {
    -                        self._needDrain = false
    -                        if (self._cb && !self._pause) {
    -                            const cb = self._cb
    -                            self._cb = undefined
    -                            cb()
    -                        }
    -                    }).on('part', function onPart(part) {
    -                        if (++self._nparts > partsLimit) {
    -                            self.parser.removeListener('part', onPart)
    -                            self.parser.on('part', skipPart)
    -                            boy.hitPartsLimit = true
    -                            boy.emit('partsLimit')
    -                            return skipPart(part)
    -                        }
    -
    -                        // hack because streams2 _always_ doesn't emit 'end' until nextTick, so let
    -                        // us emit 'end' early since we know the part has ended if we are already
    -                        // seeing the next part
    -                        if (curField) {
    -                            const field = curField
    -                            field.emit('end')
    -                            field.removeAllListeners('end')
    -                        }
    -
    -                        part.on('header', function (header) {
    -                            let contype
    -                            let fieldname
    -                            let parsed
    -                            let charset
    -                            let encoding
    -                            let filename
    -                            let nsize = 0
    -
    -                            if (header['content-type']) {
    -                                parsed = parseParams(header['content-type'][0])
    -                                if (parsed[0]) {
    -                                    contype = parsed[0].toLowerCase()
    -                                    for (i = 0, len = parsed.length; i < len; ++i) {
    -                                        if (RE_CHARSET.test(parsed[i][0])) {
    -                                            charset = parsed[i][1].toLowerCase()
    -                                            break
    -                                        }
    -                                    }
    -                                }
    -                            }
    -
    -                            if (contype === undefined) { contype = 'text/plain' }
    -                            if (charset === undefined) { charset = defCharset }
    -
    -                            if (header['content-disposition']) {
    -                                parsed = parseParams(header['content-disposition'][0])
    -                                if (!RE_FIELD.test(parsed[0])) { return skipPart(part) }
    -                                for (i = 0, len = parsed.length; i < len; ++i) {
    -                                    if (RE_NAME.test(parsed[i][0])) {
    -                                        fieldname = parsed[i][1]
    -                                    } else if (RE_FILENAME.test(parsed[i][0])) {
    -                                        filename = parsed[i][1]
    -                                        if (!preservePath) { filename = basename(filename) }
    -                                    }
    -                                }
    -                            } else { return skipPart(part) }
    -
    -                            if (header['content-transfer-encoding']) { encoding = header['content-transfer-encoding'][0].toLowerCase() } else { encoding = '7bit' }
    -
    -                            let onData,
    -                                onEnd
    -
    -                            if (isPartAFile(fieldname, contype, filename)) {
    -                                // file/binary field
    -                                if (nfiles === filesLimit) {
    -                                    if (!boy.hitFilesLimit) {
    -                                        boy.hitFilesLimit = true
    -                                        boy.emit('filesLimit')
    -                                    }
    -                                    return skipPart(part)
    -                                }
    -
    -                                ++nfiles
    -
    -                                if (boy.listenerCount('file') === 0) {
    -                                    self.parser._ignore()
    -                                    return
    -                                }
    -
    -                                ++nends
    -                                const file = new FileStream(fileOpts)
    -                                curFile = file
    -                                file.on('end', function () {
    -                                    --nends
    -                                    self._pause = false
    -                                    checkFinished()
    -                                    if (self._cb && !self._needDrain) {
    -                                        const cb = self._cb
    -                                        self._cb = undefined
    -                                        cb()
    -                                    }
    -                                })
    -                                file._read = function (n) {
    -                                    if (!self._pause) { return }
    -                                    self._pause = false
    -                                    if (self._cb && !self._needDrain) {
    -                                        const cb = self._cb
    -                                        self._cb = undefined
    -                                        cb()
    -                                    }
    -                                }
    -                                boy.emit('file', fieldname, file, filename, encoding, contype)
    -
    -                                onData = function (data) {
    -                                    if ((nsize += data.length) > fileSizeLimit) {
    -                                        const extralen = fileSizeLimit - nsize + data.length
    -                                        if (extralen > 0) { file.push(data.slice(0, extralen)) }
    -                                        file.truncated = true
    -                                        file.bytesRead = fileSizeLimit
    -                                        part.removeAllListeners('data')
    -                                        file.emit('limit')
    -                                        return
    -                                    } else if (!file.push(data)) { self._pause = true }
    -
    -                                    file.bytesRead = nsize
    -                                }
    -
    -                                onEnd = function () {
    -                                    curFile = undefined
    -                                    file.push(null)
    -                                }
    -                            } else {
    -                                // non-file field
    -                                if (nfields === fieldsLimit) {
    -                                    if (!boy.hitFieldsLimit) {
    -                                        boy.hitFieldsLimit = true
    -                                        boy.emit('fieldsLimit')
    -                                    }
    -                                    return skipPart(part)
    -                                }
    -
    -                                ++nfields
    -                                ++nends
    -                                let buffer = ''
    -                                let truncated = false
    -                                curField = part
    -
    -                                onData = function (data) {
    -                                    if ((nsize += data.length) > fieldSizeLimit) {
    -                                        const extralen = (fieldSizeLimit - (nsize - data.length))
    -                                        buffer += data.toString('binary', 0, extralen)
    -                                        truncated = true
    -                                        part.removeAllListeners('data')
    -                                    } else { buffer += data.toString('binary') }
    -                                }
    -
    -                                onEnd = function () {
    -                                    curField = undefined
    -                                    if (buffer.length) { buffer = decodeText(buffer, 'binary', charset) }
    -                                    boy.emit('field', fieldname, buffer, false, truncated, encoding, contype)
    -                                    --nends
    -                                    checkFinished()
    -                                }
    -                            }
    -
    -                            /* As of node@2efe4ab761666 (v0.10.29+/v0.11.14+), busboy had become
    -                               broken. Streams2/streams3 is a huge black box of confusion, but
    -                               somehow overriding the sync state seems to fix things again (and still
    -                               seems to work for previous node versions).
    -                            */
    -                            part._readableState.sync = false
    -
    -                            part.on('data', onData)
    -                            part.on('end', onEnd)
    -                        }).on('error', function (err) {
    -                            if (curFile) { curFile.emit('error', err) }
    -                        })
    -                    }).on('error', function (err) {
    -                        boy.emit('error', err)
    -                    }).on('finish', function () {
    -                        finished = true
    -                        checkFinished()
    -                    })
    -                }
    -
    -                Multipart.prototype.write = function (chunk, cb) {
    -                    const r = this.parser.write(chunk)
    -                    if (r && !this._pause) {
    -                        cb()
    -                    } else {
    -                        this._needDrain = !r
    -                        this._cb = cb
    -                    }
    -                }
    -
    -                Multipart.prototype.end = function () {
    -                    const self = this
    -
    -                    if (self.parser.writable) {
    -                        self.parser.end()
    -                    } else if (!self._boy._done) {
    -                        process.nextTick(function () {
    -                            self._boy._done = true
    -                            self._boy.emit('finish')
    -                        })
    -                    }
    -                }
    -
    -                function skipPart(part) {
    -                    part.resume()
    -                }
    -
    -                function FileStream(opts) {
    -                    Readable.call(this, opts)
    -
    -                    this.bytesRead = 0
    -
    -                    this.truncated = false
    -                }
    -
    -                inherits(FileStream, Readable)
    -
    -                FileStream.prototype._read = function (n) { }
    -
    -                module.exports = Multipart
    -
    -
    -                /***/
    -}),
    -
    -/***/ 8306:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -
    -                const Decoder = __nccwpck_require__(7100)
    -                const decodeText = __nccwpck_require__(4619)
    -                const getLimit = __nccwpck_require__(1467)
    -
    -                const RE_CHARSET = /^charset$/i
    -
    -                UrlEncoded.detect = /^application\/x-www-form-urlencoded/i
    -                function UrlEncoded(boy, cfg) {
    -                    const limits = cfg.limits
    -                    const parsedConType = cfg.parsedConType
    -                    this.boy = boy
    -
    -                    this.fieldSizeLimit = getLimit(limits, 'fieldSize', 1 * 1024 * 1024)
    -                    this.fieldNameSizeLimit = getLimit(limits, 'fieldNameSize', 100)
    -                    this.fieldsLimit = getLimit(limits, 'fields', Infinity)
    -
    -                    let charset
    -                    for (var i = 0, len = parsedConType.length; i < len; ++i) { // eslint-disable-line no-var
    -                        if (Array.isArray(parsedConType[i]) &&
    -                            RE_CHARSET.test(parsedConType[i][0])) {
    -                            charset = parsedConType[i][1].toLowerCase()
    -                            break
    -                        }
    -                    }
    -
    -                    if (charset === undefined) { charset = cfg.defCharset || 'utf8' }
    -
    -                    this.decoder = new Decoder()
    -                    this.charset = charset
    -                    this._fields = 0
    -                    this._state = 'key'
    -                    this._checkingBytes = true
    -                    this._bytesKey = 0
    -                    this._bytesVal = 0
    -                    this._key = ''
    -                    this._val = ''
    -                    this._keyTrunc = false
    -                    this._valTrunc = false
    -                    this._hitLimit = false
    -                }
    -
    -                UrlEncoded.prototype.write = function (data, cb) {
    -                    if (this._fields === this.fieldsLimit) {
    -                        if (!this.boy.hitFieldsLimit) {
    -                            this.boy.hitFieldsLimit = true
    -                            this.boy.emit('fieldsLimit')
    -                        }
    -                        return cb()
    -                    }
    -
    -                    let idxeq; let idxamp; let i; let p = 0; const len = data.length
    -
    -                    while (p < len) {
    -                        if (this._state === 'key') {
    -                            idxeq = idxamp = undefined
    -                            for (i = p; i < len; ++i) {
    -                                if (!this._checkingBytes) { ++p }
    -                                if (data[i] === 0x3D/* = */) {
    -                                    idxeq = i
    -                                    break
    -                                } else if (data[i] === 0x26/* & */) {
    -                                    idxamp = i
    -                                    break
    -                                }
    -                                if (this._checkingBytes && this._bytesKey === this.fieldNameSizeLimit) {
    -                                    this._hitLimit = true
    -                                    break
    -                                } else if (this._checkingBytes) { ++this._bytesKey }
    -                            }
    -
    -                            if (idxeq !== undefined) {
    -                                // key with assignment
    -                                if (idxeq > p) { this._key += this.decoder.write(data.toString('binary', p, idxeq)) }
    -                                this._state = 'val'
    -
    -                                this._hitLimit = false
    -                                this._checkingBytes = true
    -                                this._val = ''
    -                                this._bytesVal = 0
    -                                this._valTrunc = false
    -                                this.decoder.reset()
    -
    -                                p = idxeq + 1
    -                            } else if (idxamp !== undefined) {
    -                                // key with no assignment
    -                                ++this._fields
    -                                let key; const keyTrunc = this._keyTrunc
    -                                if (idxamp > p) { key = (this._key += this.decoder.write(data.toString('binary', p, idxamp))) } else { key = this._key }
    -
    -                                this._hitLimit = false
    -                                this._checkingBytes = true
    -                                this._key = ''
    -                                this._bytesKey = 0
    -                                this._keyTrunc = false
    -                                this.decoder.reset()
    -
    -                                if (key.length) {
    -                                    this.boy.emit('field', decodeText(key, 'binary', this.charset),
    -                                        '',
    -                                        keyTrunc,
    -                                        false)
    -                                }
    -
    -                                p = idxamp + 1
    -                                if (this._fields === this.fieldsLimit) { return cb() }
    -                            } else if (this._hitLimit) {
    -                                // we may not have hit the actual limit if there are encoded bytes...
    -                                if (i > p) { this._key += this.decoder.write(data.toString('binary', p, i)) }
    -                                p = i
    -                                if ((this._bytesKey = this._key.length) === this.fieldNameSizeLimit) {
    -                                    // yep, we actually did hit the limit
    -                                    this._checkingBytes = false
    -                                    this._keyTrunc = true
    -                                }
    -                            } else {
    -                                if (p < len) { this._key += this.decoder.write(data.toString('binary', p)) }
    -                                p = len
    -                            }
    -                        } else {
    -                            idxamp = undefined
    -                            for (i = p; i < len; ++i) {
    -                                if (!this._checkingBytes) { ++p }
    -                                if (data[i] === 0x26/* & */) {
    -                                    idxamp = i
    -                                    break
    -                                }
    -                                if (this._checkingBytes && this._bytesVal === this.fieldSizeLimit) {
    -                                    this._hitLimit = true
    -                                    break
    -                                } else if (this._checkingBytes) { ++this._bytesVal }
    -                            }
    -
    -                            if (idxamp !== undefined) {
    -                                ++this._fields
    -                                if (idxamp > p) { this._val += this.decoder.write(data.toString('binary', p, idxamp)) }
    -                                this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
    -                                    decodeText(this._val, 'binary', this.charset),
    -                                    this._keyTrunc,
    -                                    this._valTrunc)
    -                                this._state = 'key'
    -
    -                                this._hitLimit = false
    -                                this._checkingBytes = true
    -                                this._key = ''
    -                                this._bytesKey = 0
    -                                this._keyTrunc = false
    -                                this.decoder.reset()
    -
    -                                p = idxamp + 1
    -                                if (this._fields === this.fieldsLimit) { return cb() }
    -                            } else if (this._hitLimit) {
    -                                // we may not have hit the actual limit if there are encoded bytes...
    -                                if (i > p) { this._val += this.decoder.write(data.toString('binary', p, i)) }
    -                                p = i
    -                                if ((this._val === '' && this.fieldSizeLimit === 0) ||
    -                                    (this._bytesVal = this._val.length) === this.fieldSizeLimit) {
    -                                    // yep, we actually did hit the limit
    -                                    this._checkingBytes = false
    -                                    this._valTrunc = true
    -                                }
    -                            } else {
    -                                if (p < len) { this._val += this.decoder.write(data.toString('binary', p)) }
    -                                p = len
    -                            }
    -                        }
    -                    }
    -                    cb()
    -                }
    -
    -                UrlEncoded.prototype.end = function () {
    -                    if (this.boy._done) { return }
    -
    -                    if (this._state === 'key' && this._key.length > 0) {
    -                        this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
    -                            '',
    -                            this._keyTrunc,
    -                            false)
    -                    } else if (this._state === 'val') {
    -                        this.boy.emit('field', decodeText(this._key, 'binary', this.charset),
    -                            decodeText(this._val, 'binary', this.charset),
    -                            this._keyTrunc,
    -                            this._valTrunc)
    -                    }
    -                    this.boy._done = true
    -                    this.boy.emit('finish')
    -                }
    -
    -                module.exports = UrlEncoded
    -
    -
    -                /***/
    -}),
    -
    -/***/ 7100:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                const RE_PLUS = /\+/g
    -
    -                const HEX = [
    -                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    -                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    -                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    -                    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
    -                    0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    -                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    -                    0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    -                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    -                ]
    -
    -                function Decoder() {
    -                    this.buffer = undefined
    -                }
    -                Decoder.prototype.write = function (str) {
    -                    // Replace '+' with ' ' before decoding
    -                    str = str.replace(RE_PLUS, ' ')
    -                    let res = ''
    -                    let i = 0; let p = 0; const len = str.length
    -                    for (; i < len; ++i) {
    -                        if (this.buffer !== undefined) {
    -                            if (!HEX[str.charCodeAt(i)]) {
    -                                res += '%' + this.buffer
    -                                this.buffer = undefined
    -                                --i // retry character
    -                            } else {
    -                                this.buffer += str[i]
    -                                ++p
    -                                if (this.buffer.length === 2) {
    -                                    res += String.fromCharCode(parseInt(this.buffer, 16))
    -                                    this.buffer = undefined
    -                                }
    -                            }
    -                        } else if (str[i] === '%') {
    -                            if (i > p) {
    -                                res += str.substring(p, i)
    -                                p = i
    -                            }
    -                            this.buffer = ''
    -                            ++p
    -                        }
    -                    }
    -                    if (p < len && this.buffer === undefined) { res += str.substring(p) }
    -                    return res
    -                }
    -                Decoder.prototype.reset = function () {
    -                    this.buffer = undefined
    -                }
    -
    -                module.exports = Decoder
    -
    -
    -                /***/
    -}),
    -
    -/***/ 8647:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                module.exports = function basename(path) {
    -                    if (typeof path !== 'string') { return '' }
    -                    for (var i = path.length - 1; i >= 0; --i) { // eslint-disable-line no-var
    -                        switch (path.charCodeAt(i)) {
    -                            case 0x2F: // '/'
    -                            case 0x5C: // '\'
    -                                path = path.slice(i + 1)
    -                                return (path === '..' || path === '.' ? '' : path)
    -                        }
    -                    }
    -                    return (path === '..' || path === '.' ? '' : path)
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 4619:
    -/***/ (function (module) {
    -
    -                "use strict";
    -
    -
    -                // Node has always utf-8
    -                const utf8Decoder = new TextDecoder('utf-8')
    -                const textDecoders = new Map([
    -                    ['utf-8', utf8Decoder],
    -                    ['utf8', utf8Decoder]
    -                ])
    -
    -                function getDecoder(charset) {
    -                    let lc
    -                    while (true) {
    -                        switch (charset) {
    -                            case 'utf-8':
    -                            case 'utf8':
    -                                return decoders.utf8
    -                            case 'latin1':
    -                            case 'ascii': // TODO: Make these a separate, strict decoder?
    -                            case 'us-ascii':
    -                            case 'iso-8859-1':
    -                            case 'iso8859-1':
    -                            case 'iso88591':
    -                            case 'iso_8859-1':
    -                            case 'windows-1252':
    -                            case 'iso_8859-1:1987':
    -                            case 'cp1252':
    -                            case 'x-cp1252':
    -                                return decoders.latin1
    -                            case 'utf16le':
    -                            case 'utf-16le':
    -                            case 'ucs2':
    -                            case 'ucs-2':
    -                                return decoders.utf16le
    -                            case 'base64':
    -                                return decoders.base64
    -                            default:
    -                                if (lc === undefined) {
    -                                    lc = true
    -                                    charset = charset.toLowerCase()
    -                                    continue
    -                                }
    -                                return decoders.other.bind(charset)
    -                        }
    -                    }
    -                }
    -
    -                const decoders = {
    -                    utf8: (data, sourceEncoding) => {
    -                        if (data.length === 0) {
    -                            return ''
    -                        }
    -                        if (typeof data === 'string') {
    -                            data = Buffer.from(data, sourceEncoding)
    -                        }
    -                        return data.utf8Slice(0, data.length)
    -                    },
    -
    -                    latin1: (data, sourceEncoding) => {
    -                        if (data.length === 0) {
    -                            return ''
    -                        }
    -                        if (typeof data === 'string') {
    -                            return data
    -                        }
    -                        return data.latin1Slice(0, data.length)
    -                    },
    -
    -                    utf16le: (data, sourceEncoding) => {
    -                        if (data.length === 0) {
    -                            return ''
    -                        }
    -                        if (typeof data === 'string') {
    -                            data = Buffer.from(data, sourceEncoding)
    -                        }
    -                        return data.ucs2Slice(0, data.length)
    -                    },
    -
    -                    base64: (data, sourceEncoding) => {
    -                        if (data.length === 0) {
    -                            return ''
    -                        }
    -                        if (typeof data === 'string') {
    -                            data = Buffer.from(data, sourceEncoding)
    -                        }
    -                        return data.base64Slice(0, data.length)
    -                    },
    -
    -                    other: (data, sourceEncoding) => {
    -                        if (data.length === 0) {
    -                            return ''
    -                        }
    -                        if (typeof data === 'string') {
    -                            data = Buffer.from(data, sourceEncoding)
    -                        }
    -
    -                        if (textDecoders.has(this.toString())) {
    -                            try {
    -                                return textDecoders.get(this).decode(data)
    -                            } catch { }
    -                        }
    -                        return typeof data === 'string'
    -                            ? data
    -                            : data.toString()
    -                    }
    -                }
    -
    -                function decodeText(text, sourceEncoding, destEncoding) {
    -                    if (text) {
    -                        return getDecoder(destEncoding)(text, sourceEncoding)
    -                    }
    -                    return text
    -                }
    -
    -                module.exports = decodeText
    -
    -
    -                /***/
    -}),
    -
    -/***/ 1467:
    -/***/ ((module) => {
    -
    -                "use strict";
    -
    -
    -                module.exports = function getLimit(limits, name, defaultLimit) {
    -                    if (
    -                        !limits ||
    -                        limits[name] === undefined ||
    -                        limits[name] === null
    -                    ) { return defaultLimit }
    -
    -                    if (
    -                        typeof limits[name] !== 'number' ||
    -                        isNaN(limits[name])
    -                    ) { throw new TypeError('Limit ' + name + ' is not a valid number') }
    -
    -                    return limits[name]
    -                }
    -
    -
    -                /***/
    -}),
    -
    -/***/ 1854:
    -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -                /* eslint-disable object-property-newline */
    -
    -
    -                const decodeText = __nccwpck_require__(4619)
    -
    -                const RE_ENCODED = /%[a-fA-F0-9][a-fA-F0-9]/g
    -
    -                const EncodedLookup = {
    -                    '%00': '\x00', '%01': '\x01', '%02': '\x02', '%03': '\x03', '%04': '\x04',
    -                    '%05': '\x05', '%06': '\x06', '%07': '\x07', '%08': '\x08', '%09': '\x09',
    -                    '%0a': '\x0a', '%0A': '\x0a', '%0b': '\x0b', '%0B': '\x0b', '%0c': '\x0c',
    -                    '%0C': '\x0c', '%0d': '\x0d', '%0D': '\x0d', '%0e': '\x0e', '%0E': '\x0e',
    -                    '%0f': '\x0f', '%0F': '\x0f', '%10': '\x10', '%11': '\x11', '%12': '\x12',
    -                    '%13': '\x13', '%14': '\x14', '%15': '\x15', '%16': '\x16', '%17': '\x17',
    -                    '%18': '\x18', '%19': '\x19', '%1a': '\x1a', '%1A': '\x1a', '%1b': '\x1b',
    -                    '%1B': '\x1b', '%1c': '\x1c', '%1C': '\x1c', '%1d': '\x1d', '%1D': '\x1d',
    -                    '%1e': '\x1e', '%1E': '\x1e', '%1f': '\x1f', '%1F': '\x1f', '%20': '\x20',
    -                    '%21': '\x21', '%22': '\x22', '%23': '\x23', '%24': '\x24', '%25': '\x25',
    -                    '%26': '\x26', '%27': '\x27', '%28': '\x28', '%29': '\x29', '%2a': '\x2a',
    -                    '%2A': '\x2a', '%2b': '\x2b', '%2B': '\x2b', '%2c': '\x2c', '%2C': '\x2c',
    -                    '%2d': '\x2d', '%2D': '\x2d', '%2e': '\x2e', '%2E': '\x2e', '%2f': '\x2f',
    -                    '%2F': '\x2f', '%30': '\x30', '%31': '\x31', '%32': '\x32', '%33': '\x33',
    -                    '%34': '\x34', '%35': '\x35', '%36': '\x36', '%37': '\x37', '%38': '\x38',
    -                    '%39': '\x39', '%3a': '\x3a', '%3A': '\x3a', '%3b': '\x3b', '%3B': '\x3b',
    -                    '%3c': '\x3c', '%3C': '\x3c', '%3d': '\x3d', '%3D': '\x3d', '%3e': '\x3e',
    -                    '%3E': '\x3e', '%3f': '\x3f', '%3F': '\x3f', '%40': '\x40', '%41': '\x41',
    -                    '%42': '\x42', '%43': '\x43', '%44': '\x44', '%45': '\x45', '%46': '\x46',
    -                    '%47': '\x47', '%48': '\x48', '%49': '\x49', '%4a': '\x4a', '%4A': '\x4a',
    -                    '%4b': '\x4b', '%4B': '\x4b', '%4c': '\x4c', '%4C': '\x4c', '%4d': '\x4d',
    -                    '%4D': '\x4d', '%4e': '\x4e', '%4E': '\x4e', '%4f': '\x4f', '%4F': '\x4f',
    -                    '%50': '\x50', '%51': '\x51', '%52': '\x52', '%53': '\x53', '%54': '\x54',
    -                    '%55': '\x55', '%56': '\x56', '%57': '\x57', '%58': '\x58', '%59': '\x59',
    -                    '%5a': '\x5a', '%5A': '\x5a', '%5b': '\x5b', '%5B': '\x5b', '%5c': '\x5c',
    -                    '%5C': '\x5c', '%5d': '\x5d', '%5D': '\x5d', '%5e': '\x5e', '%5E': '\x5e',
    -                    '%5f': '\x5f', '%5F': '\x5f', '%60': '\x60', '%61': '\x61', '%62': '\x62',
    -                    '%63': '\x63', '%64': '\x64', '%65': '\x65', '%66': '\x66', '%67': '\x67',
    -                    '%68': '\x68', '%69': '\x69', '%6a': '\x6a', '%6A': '\x6a', '%6b': '\x6b',
    -                    '%6B': '\x6b', '%6c': '\x6c', '%6C': '\x6c', '%6d': '\x6d', '%6D': '\x6d',
    -                    '%6e': '\x6e', '%6E': '\x6e', '%6f': '\x6f', '%6F': '\x6f', '%70': '\x70',
    -                    '%71': '\x71', '%72': '\x72', '%73': '\x73', '%74': '\x74', '%75': '\x75',
    -                    '%76': '\x76', '%77': '\x77', '%78': '\x78', '%79': '\x79', '%7a': '\x7a',
    -                    '%7A': '\x7a', '%7b': '\x7b', '%7B': '\x7b', '%7c': '\x7c', '%7C': '\x7c',
    -                    '%7d': '\x7d', '%7D': '\x7d', '%7e': '\x7e', '%7E': '\x7e', '%7f': '\x7f',
    -                    '%7F': '\x7f', '%80': '\x80', '%81': '\x81', '%82': '\x82', '%83': '\x83',
    -                    '%84': '\x84', '%85': '\x85', '%86': '\x86', '%87': '\x87', '%88': '\x88',
    -                    '%89': '\x89', '%8a': '\x8a', '%8A': '\x8a', '%8b': '\x8b', '%8B': '\x8b',
    -                    '%8c': '\x8c', '%8C': '\x8c', '%8d': '\x8d', '%8D': '\x8d', '%8e': '\x8e',
    -                    '%8E': '\x8e', '%8f': '\x8f', '%8F': '\x8f', '%90': '\x90', '%91': '\x91',
    -                    '%92': '\x92', '%93': '\x93', '%94': '\x94', '%95': '\x95', '%96': '\x96',
    -                    '%97': '\x97', '%98': '\x98', '%99': '\x99', '%9a': '\x9a', '%9A': '\x9a',
    -                    '%9b': '\x9b', '%9B': '\x9b', '%9c': '\x9c', '%9C': '\x9c', '%9d': '\x9d',
    -                    '%9D': '\x9d', '%9e': '\x9e', '%9E': '\x9e', '%9f': '\x9f', '%9F': '\x9f',
    -                    '%a0': '\xa0', '%A0': '\xa0', '%a1': '\xa1', '%A1': '\xa1', '%a2': '\xa2',
    -                    '%A2': '\xa2', '%a3': '\xa3', '%A3': '\xa3', '%a4': '\xa4', '%A4': '\xa4',
    -                    '%a5': '\xa5', '%A5': '\xa5', '%a6': '\xa6', '%A6': '\xa6', '%a7': '\xa7',
    -                    '%A7': '\xa7', '%a8': '\xa8', '%A8': '\xa8', '%a9': '\xa9', '%A9': '\xa9',
    -                    '%aa': '\xaa', '%Aa': '\xaa', '%aA': '\xaa', '%AA': '\xaa', '%ab': '\xab',
    -                    '%Ab': '\xab', '%aB': '\xab', '%AB': '\xab', '%ac': '\xac', '%Ac': '\xac',
    -                    '%aC': '\xac', '%AC': '\xac', '%ad': '\xad', '%Ad': '\xad', '%aD': '\xad',
    -                    '%AD': '\xad', '%ae': '\xae', '%Ae': '\xae', '%aE': '\xae', '%AE': '\xae',
    -                    '%af': '\xaf', '%Af': '\xaf', '%aF': '\xaf', '%AF': '\xaf', '%b0': '\xb0',
    -                    '%B0': '\xb0', '%b1': '\xb1', '%B1': '\xb1', '%b2': '\xb2', '%B2': '\xb2',
    -                    '%b3': '\xb3', '%B3': '\xb3', '%b4': '\xb4', '%B4': '\xb4', '%b5': '\xb5',
    -                    '%B5': '\xb5', '%b6': '\xb6', '%B6': '\xb6', '%b7': '\xb7', '%B7': '\xb7',
    -                    '%b8': '\xb8', '%B8': '\xb8', '%b9': '\xb9', '%B9': '\xb9', '%ba': '\xba',
    -                    '%Ba': '\xba', '%bA': '\xba', '%BA': '\xba', '%bb': '\xbb', '%Bb': '\xbb',
    -                    '%bB': '\xbb', '%BB': '\xbb', '%bc': '\xbc', '%Bc': '\xbc', '%bC': '\xbc',
    -                    '%BC': '\xbc', '%bd': '\xbd', '%Bd': '\xbd', '%bD': '\xbd', '%BD': '\xbd',
    -                    '%be': '\xbe', '%Be': '\xbe', '%bE': '\xbe', '%BE': '\xbe', '%bf': '\xbf',
    -                    '%Bf': '\xbf', '%bF': '\xbf', '%BF': '\xbf', '%c0': '\xc0', '%C0': '\xc0',
    -                    '%c1': '\xc1', '%C1': '\xc1', '%c2': '\xc2', '%C2': '\xc2', '%c3': '\xc3',
    -                    '%C3': '\xc3', '%c4': '\xc4', '%C4': '\xc4', '%c5': '\xc5', '%C5': '\xc5',
    -                    '%c6': '\xc6', '%C6': '\xc6', '%c7': '\xc7', '%C7': '\xc7', '%c8': '\xc8',
    -                    '%C8': '\xc8', '%c9': '\xc9', '%C9': '\xc9', '%ca': '\xca', '%Ca': '\xca',
    -                    '%cA': '\xca', '%CA': '\xca', '%cb': '\xcb', '%Cb': '\xcb', '%cB': '\xcb',
    -                    '%CB': '\xcb', '%cc': '\xcc', '%Cc': '\xcc', '%cC': '\xcc', '%CC': '\xcc',
    -                    '%cd': '\xcd', '%Cd': '\xcd', '%cD': '\xcd', '%CD': '\xcd', '%ce': '\xce',
    -                    '%Ce': '\xce', '%cE': '\xce', '%CE': '\xce', '%cf': '\xcf', '%Cf': '\xcf',
    -                    '%cF': '\xcf', '%CF': '\xcf', '%d0': '\xd0', '%D0': '\xd0', '%d1': '\xd1',
    -                    '%D1': '\xd1', '%d2': '\xd2', '%D2': '\xd2', '%d3': '\xd3', '%D3': '\xd3',
    -                    '%d4': '\xd4', '%D4': '\xd4', '%d5': '\xd5', '%D5': '\xd5', '%d6': '\xd6',
    -                    '%D6': '\xd6', '%d7': '\xd7', '%D7': '\xd7', '%d8': '\xd8', '%D8': '\xd8',
    -                    '%d9': '\xd9', '%D9': '\xd9', '%da': '\xda', '%Da': '\xda', '%dA': '\xda',
    -                    '%DA': '\xda', '%db': '\xdb', '%Db': '\xdb', '%dB': '\xdb', '%DB': '\xdb',
    -                    '%dc': '\xdc', '%Dc': '\xdc', '%dC': '\xdc', '%DC': '\xdc', '%dd': '\xdd',
    -                    '%Dd': '\xdd', '%dD': '\xdd', '%DD': '\xdd', '%de': '\xde', '%De': '\xde',
    -                    '%dE': '\xde', '%DE': '\xde', '%df': '\xdf', '%Df': '\xdf', '%dF': '\xdf',
    -                    '%DF': '\xdf', '%e0': '\xe0', '%E0': '\xe0', '%e1': '\xe1', '%E1': '\xe1',
    -                    '%e2': '\xe2', '%E2': '\xe2', '%e3': '\xe3', '%E3': '\xe3', '%e4': '\xe4',
    -                    '%E4': '\xe4', '%e5': '\xe5', '%E5': '\xe5', '%e6': '\xe6', '%E6': '\xe6',
    -                    '%e7': '\xe7', '%E7': '\xe7', '%e8': '\xe8', '%E8': '\xe8', '%e9': '\xe9',
    -                    '%E9': '\xe9', '%ea': '\xea', '%Ea': '\xea', '%eA': '\xea', '%EA': '\xea',
    -                    '%eb': '\xeb', '%Eb': '\xeb', '%eB': '\xeb', '%EB': '\xeb', '%ec': '\xec',
    -                    '%Ec': '\xec', '%eC': '\xec', '%EC': '\xec', '%ed': '\xed', '%Ed': '\xed',
    -                    '%eD': '\xed', '%ED': '\xed', '%ee': '\xee', '%Ee': '\xee', '%eE': '\xee',
    -                    '%EE': '\xee', '%ef': '\xef', '%Ef': '\xef', '%eF': '\xef', '%EF': '\xef',
    -                    '%f0': '\xf0', '%F0': '\xf0', '%f1': '\xf1', '%F1': '\xf1', '%f2': '\xf2',
    -                    '%F2': '\xf2', '%f3': '\xf3', '%F3': '\xf3', '%f4': '\xf4', '%F4': '\xf4',
    -                    '%f5': '\xf5', '%F5': '\xf5', '%f6': '\xf6', '%F6': '\xf6', '%f7': '\xf7',
    -                    '%F7': '\xf7', '%f8': '\xf8', '%F8': '\xf8', '%f9': '\xf9', '%F9': '\xf9',
    -                    '%fa': '\xfa', '%Fa': '\xfa', '%fA': '\xfa', '%FA': '\xfa', '%fb': '\xfb',
    -                    '%Fb': '\xfb', '%fB': '\xfb', '%FB': '\xfb', '%fc': '\xfc', '%Fc': '\xfc',
    -                    '%fC': '\xfc', '%FC': '\xfc', '%fd': '\xfd', '%Fd': '\xfd', '%fD': '\xfd',
    -                    '%FD': '\xfd', '%fe': '\xfe', '%Fe': '\xfe', '%fE': '\xfe', '%FE': '\xfe',
    -                    '%ff': '\xff', '%Ff': '\xff', '%fF': '\xff', '%FF': '\xff'
    -                }
    -
    -                function encodedReplacer(match) {
    -                    return EncodedLookup[match]
    -                }
    -
    -                const STATE_KEY = 0
    -                const STATE_VALUE = 1
    -                const STATE_CHARSET = 2
    -                const STATE_LANG = 3
    -
    -                function parseParams(str) {
    -                    const res = []
    -                    let state = STATE_KEY
    -                    let charset = ''
    -                    let inquote = false
    -                    let escaping = false
    -                    let p = 0
    -                    let tmp = ''
    -                    const len = str.length
    -
    -                    for (var i = 0; i < len; ++i) { // eslint-disable-line no-var
    -                        const char = str[i]
    -                        if (char === '\\' && inquote) {
    -                            if (escaping) { escaping = false } else {
    -                                escaping = true
    -                                continue
    -                            }
    -                        } else if (char === '"') {
    -                            if (!escaping) {
    -                                if (inquote) {
    -                                    inquote = false
    -                                    state = STATE_KEY
    -                                } else { inquote = true }
    -                                continue
    -                            } else { escaping = false }
    -                        } else {
    -                            if (escaping && inquote) { tmp += '\\' }
    -                            escaping = false
    -                            if ((state === STATE_CHARSET || state === STATE_LANG) && char === "'") {
    -                                if (state === STATE_CHARSET) {
    -                                    state = STATE_LANG
    -                                    charset = tmp.substring(1)
    -                                } else { state = STATE_VALUE }
    -                                tmp = ''
    -                                continue
    -                            } else if (state === STATE_KEY &&
    -                                (char === '*' || char === '=') &&
    -                                res.length) {
    -                                state = char === '*'
    -                                    ? STATE_CHARSET
    -                                    : STATE_VALUE
    -                                res[p] = [tmp, undefined]
    -                                tmp = ''
    -                                continue
    -                            } else if (!inquote && char === ';') {
    -                                state = STATE_KEY
    -                                if (charset) {
    -                                    if (tmp.length) {
    -                                        tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
    -                                            'binary',
    -                                            charset)
    -                                    }
    -                                    charset = ''
    -                                } else if (tmp.length) {
    -                                    tmp = decodeText(tmp, 'binary', 'utf8')
    -                                }
    -                                if (res[p] === undefined) { res[p] = tmp } else { res[p][1] = tmp }
    -                                tmp = ''
    -                                ++p
    -                                continue
    -                            } else if (!inquote && (char === ' ' || char === '\t')) { continue }
    -                        }
    -                        tmp += char
    -                    }
    -                    if (charset && tmp.length) {
    -                        tmp = decodeText(tmp.replace(RE_ENCODED, encodedReplacer),
    -                            'binary',
    -                            charset)
    -                    } else if (tmp) {
    -                        tmp = decodeText(tmp, 'binary', 'utf8')
    -                    }
    -
    -                    if (res[p] === undefined) {
    -                        if (tmp) { res[p] = tmp }
    -                    } else { res[p][1] = tmp }
    -
    -                    return res
    -                }
    -
    -                module.exports = parseParams
    -
    -
    -                /***/
    -}),
    -
    -/***/ 675:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.WriteStreamSync = exports.WriteStream = exports.ReadStreamSync = exports.ReadStream = void 0;
    -                const events_1 = __importDefault(__nccwpck_require__(2361));
    -                const fs_1 = __importDefault(__nccwpck_require__(7147));
    -                const minipass_1 = __nccwpck_require__(1062);
    -                const writev = fs_1.default.writev;
    -                const _autoClose = Symbol('_autoClose');
    -                const _close = Symbol('_close');
    -                const _ended = Symbol('_ended');
    -                const _fd = Symbol('_fd');
    -                const _finished = Symbol('_finished');
    -                const _flags = Symbol('_flags');
    -                const _flush = Symbol('_flush');
    -                const _handleChunk = Symbol('_handleChunk');
    -                const _makeBuf = Symbol('_makeBuf');
    -                const _mode = Symbol('_mode');
    -                const _needDrain = Symbol('_needDrain');
    -                const _onerror = Symbol('_onerror');
    -                const _onopen = Symbol('_onopen');
    -                const _onread = Symbol('_onread');
    -                const _onwrite = Symbol('_onwrite');
    -                const _open = Symbol('_open');
    -                const _path = Symbol('_path');
    -                const _pos = Symbol('_pos');
    -                const _queue = Symbol('_queue');
    -                const _read = Symbol('_read');
    -                const _readSize = Symbol('_readSize');
    -                const _reading = Symbol('_reading');
    -                const _remain = Symbol('_remain');
    -                const _size = Symbol('_size');
    -                const _write = Symbol('_write');
    -                const _writing = Symbol('_writing');
    -                const _defaultFlag = Symbol('_defaultFlag');
    -                const _errored = Symbol('_errored');
    -                class ReadStream extends minipass_1.Minipass {
    -                    [_errored] = false;
    -                    [_fd];
    -                    [_path];
    -                    [_readSize];
    -                    [_reading] = false;
    -                    [_size];
    -                    [_remain];
    -                    [_autoClose];
    -                    constructor(path, opt) {
    -                        opt = opt || {};
    -                        super(opt);
    -                        this.readable = true;
    -                        this.writable = false;
    -                        if (typeof path !== 'string') {
    -                            throw new TypeError('path must be a string');
    -                        }
    -                        this[_errored] = false;
    -                        this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined;
    -                        this[_path] = path;
    -                        this[_readSize] = opt.readSize || 16 * 1024 * 1024;
    -                        this[_reading] = false;
    -                        this[_size] = typeof opt.size === 'number' ? opt.size : Infinity;
    -                        this[_remain] = this[_size];
    -                        this[_autoClose] =
    -                            typeof opt.autoClose === 'boolean' ? opt.autoClose : true;
    -                        if (typeof this[_fd] === 'number') {
    -                            this[_read]();
    -                        }
    -                        else {
    -                            this[_open]();
    -                        }
    -                    }
    -                    get fd() {
    -                        return this[_fd];
    -                    }
    -                    get path() {
    -                        return this[_path];
    -                    }
    -                    //@ts-ignore
    -                    write() {
    -                        throw new TypeError('this is a readable stream');
    -                    }
    -                    //@ts-ignore
    -                    end() {
    -                        throw new TypeError('this is a readable stream');
    -                    }
    -                    [_open]() {
    -                        fs_1.default.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd));
    -                    }
    -                    [_onopen](er, fd) {
    -                        if (er) {
    -                            this[_onerror](er);
    -                        }
    -                        else {
    -                            this[_fd] = fd;
    -                            this.emit('open', fd);
    -                            this[_read]();
    -                        }
    -                    }
    -                    [_makeBuf]() {
    -                        return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain]));
    -                    }
    -                    [_read]() {
    -                        if (!this[_reading]) {
    -                            this[_reading] = true;
    -                            const buf = this[_makeBuf]();
    -                            /* c8 ignore start */
    -                            if (buf.length === 0) {
    -                                return process.nextTick(() => this[_onread](null, 0, buf));
    -                            }
    -                            /* c8 ignore stop */
    -                            fs_1.default.read(this[_fd], buf, 0, buf.length, null, (er, br, b) => this[_onread](er, br, b));
    -                        }
    -                    }
    -                    [_onread](er, br, buf) {
    -                        this[_reading] = false;
    -                        if (er) {
    -                            this[_onerror](er);
    -                        }
    -                        else if (this[_handleChunk](br, buf)) {
    -                            this[_read]();
    -                        }
    -                    }
    -                    [_close]() {
    -                        if (this[_autoClose] && typeof this[_fd] === 'number') {
    -                            const fd = this[_fd];
    -                            this[_fd] = undefined;
    -                            fs_1.default.close(fd, er => er ? this.emit('error', er) : this.emit('close'));
    -                        }
    -                    }
    -                    [_onerror](er) {
    -                        this[_reading] = true;
    -                        this[_close]();
    -                        this.emit('error', er);
    -                    }
    -                    [_handleChunk](br, buf) {
    -                        let ret = false;
    -                        // no effect if infinite
    -                        this[_remain] -= br;
    -                        if (br > 0) {
    -                            ret = super.write(br < buf.length ? buf.subarray(0, br) : buf);
    -                        }
    -                        if (br === 0 || this[_remain] <= 0) {
    -                            ret = false;
    -                            this[_close]();
    -                            super.end();
    -                        }
    -                        return ret;
    -                    }
    -                    emit(ev, ...args) {
    -                        switch (ev) {
    -                            case 'prefinish':
    -                            case 'finish':
    -                                return false;
    -                            case 'drain':
    -                                if (typeof this[_fd] === 'number') {
    -                                    this[_read]();
    -                                }
    -                                return false;
    -                            case 'error':
    -                                if (this[_errored]) {
    -                                    return false;
    -                                }
    -                                this[_errored] = true;
    -                                return super.emit(ev, ...args);
    -                            default:
    -                                return super.emit(ev, ...args);
    -                        }
    -                    }
    -                }
    -                exports.ReadStream = ReadStream;
    -                class ReadStreamSync extends ReadStream {
    -                    [_open]() {
    -                        let threw = true;
    -                        try {
    -                            this[_onopen](null, fs_1.default.openSync(this[_path], 'r'));
    -                            threw = false;
    -                        }
    -                        finally {
    -                            if (threw) {
    -                                this[_close]();
    -                            }
    -                        }
    -                    }
    -                    [_read]() {
    -                        let threw = true;
    -                        try {
    -                            if (!this[_reading]) {
    -                                this[_reading] = true;
    -                                do {
    -                                    const buf = this[_makeBuf]();
    -                                    /* c8 ignore start */
    -                                    const br = buf.length === 0
    -                                        ? 0
    -                                        : fs_1.default.readSync(this[_fd], buf, 0, buf.length, null);
    -                                    /* c8 ignore stop */
    -                                    if (!this[_handleChunk](br, buf)) {
    -                                        break;
    -                                    }
    -                                } while (true);
    -                                this[_reading] = false;
    -                            }
    -                            threw = false;
    -                        }
    -                        finally {
    -                            if (threw) {
    -                                this[_close]();
    -                            }
    -                        }
    -                    }
    -                    [_close]() {
    -                        if (this[_autoClose] && typeof this[_fd] === 'number') {
    -                            const fd = this[_fd];
    -                            this[_fd] = undefined;
    -                            fs_1.default.closeSync(fd);
    -                            this.emit('close');
    -                        }
    -                    }
    -                }
    -                exports.ReadStreamSync = ReadStreamSync;
    -                class WriteStream extends events_1.default {
    -                    readable = false;
    -                    writable = true;
    -                    [_errored] = false;
    -                    [_writing] = false;
    -                    [_ended] = false;
    -                    [_queue] = [];
    -                    [_needDrain] = false;
    -                    [_path];
    -                    [_mode];
    -                    [_autoClose];
    -                    [_fd];
    -                    [_defaultFlag];
    -                    [_flags];
    -                    [_finished] = false;
    -                    [_pos];
    -                    constructor(path, opt) {
    -                        opt = opt || {};
    -                        super(opt);
    -                        this[_path] = path;
    -                        this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined;
    -                        this[_mode] = opt.mode === undefined ? 0o666 : opt.mode;
    -                        this[_pos] = typeof opt.start === 'number' ? opt.start : undefined;
    -                        this[_autoClose] =
    -                            typeof opt.autoClose === 'boolean' ? opt.autoClose : true;
    -                        // truncating makes no sense when writing into the middle
    -                        const defaultFlag = this[_pos] !== undefined ? 'r+' : 'w';
    -                        this[_defaultFlag] = opt.flags === undefined;
    -                        this[_flags] = opt.flags === undefined ? defaultFlag : opt.flags;
    -                        if (this[_fd] === undefined) {
    -                            this[_open]();
    -                        }
    -                    }
    -                    emit(ev, ...args) {
    -                        if (ev === 'error') {
    -                            if (this[_errored]) {
    -                                return false;
    -                            }
    -                            this[_errored] = true;
    -                        }
    -                        return super.emit(ev, ...args);
    -                    }
    -                    get fd() {
    -                        return this[_fd];
    -                    }
    -                    get path() {
    -                        return this[_path];
    -                    }
    -                    [_onerror](er) {
    -                        this[_close]();
    -                        this[_writing] = true;
    -                        this.emit('error', er);
    -                    }
    -                    [_open]() {
    -                        fs_1.default.open(this[_path], this[_flags], this[_mode], (er, fd) => this[_onopen](er, fd));
    -                    }
    -                    [_onopen](er, fd) {
    -                        if (this[_defaultFlag] &&
    -                            this[_flags] === 'r+' &&
    -                            er &&
    -                            er.code === 'ENOENT') {
    -                            this[_flags] = 'w';
    -                            this[_open]();
    -                        }
    -                        else if (er) {
    -                            this[_onerror](er);
    -                        }
    -                        else {
    -                            this[_fd] = fd;
    -                            this.emit('open', fd);
    -                            if (!this[_writing]) {
    -                                this[_flush]();
    -                            }
    -                        }
    -                    }
    -                    end(buf, enc) {
    -                        if (buf) {
    -                            //@ts-ignore
    -                            this.write(buf, enc);
    -                        }
    -                        this[_ended] = true;
    -                        // synthetic after-write logic, where drain/finish live
    -                        if (!this[_writing] &&
    -                            !this[_queue].length &&
    -                            typeof this[_fd] === 'number') {
    -                            this[_onwrite](null, 0);
    -                        }
    -                        return this;
    -                    }
    -                    write(buf, enc) {
    -                        if (typeof buf === 'string') {
    -                            buf = Buffer.from(buf, enc);
    -                        }
    -                        if (this[_ended]) {
    -                            this.emit('error', new Error('write() after end()'));
    -                            return false;
    -                        }
    -                        if (this[_fd] === undefined || this[_writing] || this[_queue].length) {
    -                            this[_queue].push(buf);
    -                            this[_needDrain] = true;
    -                            return false;
    -                        }
    -                        this[_writing] = true;
    -                        this[_write](buf);
    -                        return true;
    -                    }
    -                    [_write](buf) {
    -                        fs_1.default.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => this[_onwrite](er, bw));
    -                    }
    -                    [_onwrite](er, bw) {
    -                        if (er) {
    -                            this[_onerror](er);
    -                        }
    -                        else {
    -                            if (this[_pos] !== undefined && typeof bw === 'number') {
    -                                this[_pos] += bw;
    -                            }
    -                            if (this[_queue].length) {
    -                                this[_flush]();
    -                            }
    -                            else {
    -                                this[_writing] = false;
    -                                if (this[_ended] && !this[_finished]) {
    -                                    this[_finished] = true;
    -                                    this[_close]();
    -                                    this.emit('finish');
    -                                }
    -                                else if (this[_needDrain]) {
    -                                    this[_needDrain] = false;
    -                                    this.emit('drain');
    -                                }
    -                            }
    -                        }
    -                    }
    -                    [_flush]() {
    -                        if (this[_queue].length === 0) {
    -                            if (this[_ended]) {
    -                                this[_onwrite](null, 0);
    -                            }
    -                        }
    -                        else if (this[_queue].length === 1) {
    -                            this[_write](this[_queue].pop());
    -                        }
    -                        else {
    -                            const iovec = this[_queue];
    -                            this[_queue] = [];
    -                            writev(this[_fd], iovec, this[_pos], (er, bw) => this[_onwrite](er, bw));
    -                        }
    -                    }
    -                    [_close]() {
    -                        if (this[_autoClose] && typeof this[_fd] === 'number') {
    -                            const fd = this[_fd];
    -                            this[_fd] = undefined;
    -                            fs_1.default.close(fd, er => er ? this.emit('error', er) : this.emit('close'));
    -                        }
    -                    }
    -                }
    -                exports.WriteStream = WriteStream;
    -                class WriteStreamSync extends WriteStream {
    -                    [_open]() {
    -                        let fd;
    -                        // only wrap in a try{} block if we know we'll retry, to avoid
    -                        // the rethrow obscuring the error's source frame in most cases.
    -                        if (this[_defaultFlag] && this[_flags] === 'r+') {
    -                            try {
    -                                fd = fs_1.default.openSync(this[_path], this[_flags], this[_mode]);
    -                            }
    -                            catch (er) {
    -                                if (er?.code === 'ENOENT') {
    -                                    this[_flags] = 'w';
    -                                    return this[_open]();
    -                                }
    -                                else {
    -                                    throw er;
    -                                }
    -                            }
    -                        }
    -                        else {
    -                            fd = fs_1.default.openSync(this[_path], this[_flags], this[_mode]);
    -                        }
    -                        this[_onopen](null, fd);
    -                    }
    -                    [_close]() {
    -                        if (this[_autoClose] && typeof this[_fd] === 'number') {
    -                            const fd = this[_fd];
    -                            this[_fd] = undefined;
    -                            fs_1.default.closeSync(fd);
    -                            this.emit('close');
    -                        }
    -                    }
    -                    [_write](buf) {
    -                        // throw the original, but try to close if it fails
    -                        let threw = true;
    -                        try {
    -                            this[_onwrite](null, fs_1.default.writeSync(this[_fd], buf, 0, buf.length, this[_pos]));
    -                            threw = false;
    -                        }
    -                        finally {
    -                            if (threw) {
    -                                try {
    -                                    this[_close]();
    -                                }
    -                                catch {
    -                                    // ok error
    -                                }
    -                            }
    -                        }
    -                    }
    -                }
    -                exports.WriteStreamSync = WriteStreamSync;
    -                //# sourceMappingURL=index.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 1062:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.Minipass = exports.isWritable = exports.isReadable = exports.isStream = void 0;
    -                const proc = typeof process === 'object' && process
    -                    ? process
    -                    : {
    -                        stdout: null,
    -                        stderr: null,
    -                    };
    -                const events_1 = __nccwpck_require__(2361);
    -                const stream_1 = __importDefault(__nccwpck_require__(2781));
    -                const string_decoder_1 = __nccwpck_require__(1576);
    -                /**
    -                 * Return true if the argument is a Minipass stream, Node stream, or something
    -                 * else that Minipass can interact with.
    -                 */
    -                const isStream = (s) => !!s &&
    -                    typeof s === 'object' &&
    -                    (s instanceof Minipass ||
    -                        s instanceof stream_1.default ||
    -                        (0, exports.isReadable)(s) ||
    -                        (0, exports.isWritable)(s));
    -                exports.isStream = isStream;
    -                /**
    -                 * Return true if the argument is a valid {@link Minipass.Readable}
    -                 */
    -                const isReadable = (s) => !!s &&
    -                    typeof s === 'object' &&
    -                    s instanceof events_1.EventEmitter &&
    -                    typeof s.pipe === 'function' &&
    -                    // node core Writable streams have a pipe() method, but it throws
    -                    s.pipe !== stream_1.default.Writable.prototype.pipe;
    -                exports.isReadable = isReadable;
    -                /**
    -                 * Return true if the argument is a valid {@link Minipass.Writable}
    -                 */
    -                const isWritable = (s) => !!s &&
    -                    typeof s === 'object' &&
    -                    s instanceof events_1.EventEmitter &&
    -                    typeof s.write === 'function' &&
    -                    typeof s.end === 'function';
    -                exports.isWritable = isWritable;
    -                const EOF = Symbol('EOF');
    -                const MAYBE_EMIT_END = Symbol('maybeEmitEnd');
    -                const EMITTED_END = Symbol('emittedEnd');
    -                const EMITTING_END = Symbol('emittingEnd');
    -                const EMITTED_ERROR = Symbol('emittedError');
    -                const CLOSED = Symbol('closed');
    -                const READ = Symbol('read');
    -                const FLUSH = Symbol('flush');
    -                const FLUSHCHUNK = Symbol('flushChunk');
    -                const ENCODING = Symbol('encoding');
    -                const DECODER = Symbol('decoder');
    -                const FLOWING = Symbol('flowing');
    -                const PAUSED = Symbol('paused');
    -                const RESUME = Symbol('resume');
    -                const BUFFER = Symbol('buffer');
    -                const PIPES = Symbol('pipes');
    -                const BUFFERLENGTH = Symbol('bufferLength');
    -                const BUFFERPUSH = Symbol('bufferPush');
    -                const BUFFERSHIFT = Symbol('bufferShift');
    -                const OBJECTMODE = Symbol('objectMode');
    -                // internal event when stream is destroyed
    -                const DESTROYED = Symbol('destroyed');
    -                // internal event when stream has an error
    -                const ERROR = Symbol('error');
    -                const EMITDATA = Symbol('emitData');
    -                const EMITEND = Symbol('emitEnd');
    -                const EMITEND2 = Symbol('emitEnd2');
    -                const ASYNC = Symbol('async');
    -                const ABORT = Symbol('abort');
    -                const ABORTED = Symbol('aborted');
    -                const SIGNAL = Symbol('signal');
    -                const DATALISTENERS = Symbol('dataListeners');
    -                const DISCARDED = Symbol('discarded');
    -                const defer = (fn) => Promise.resolve().then(fn);
    -                const nodefer = (fn) => fn();
    -                const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish';
    -                const isArrayBufferLike = (b) => b instanceof ArrayBuffer ||
    -                    (!!b &&
    -                        typeof b === 'object' &&
    -                        b.constructor &&
    -                        b.constructor.name === 'ArrayBuffer' &&
    -                        b.byteLength >= 0);
    -                const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b);
    -                /**
    -                 * Internal class representing a pipe to a destination stream.
    -                 *
    -                 * @internal
    -                 */
    -                class Pipe {
    -                    src;
    -                    dest;
    -                    opts;
    -                    ondrain;
    -                    constructor(src, dest, opts) {
    -                        this.src = src;
    -                        this.dest = dest;
    -                        this.opts = opts;
    -                        this.ondrain = () => src[RESUME]();
    -                        this.dest.on('drain', this.ondrain);
    -                    }
    -                    unpipe() {
    -                        this.dest.removeListener('drain', this.ondrain);
    -                    }
    -                    // only here for the prototype
    -                    /* c8 ignore start */
    -                    proxyErrors(_er) { }
    -                    /* c8 ignore stop */
    -                    end() {
    -                        this.unpipe();
    -                        if (this.opts.end)
    -                            this.dest.end();
    -                    }
    -                }
    -                /**
    -                 * Internal class representing a pipe to a destination stream where
    -                 * errors are proxied.
    -                 *
    -                 * @internal
    -                 */
    -                class PipeProxyErrors extends Pipe {
    -                    unpipe() {
    -                        this.src.removeListener('error', this.proxyErrors);
    -                        super.unpipe();
    -                    }
    -                    constructor(src, dest, opts) {
    -                        super(src, dest, opts);
    -                        this.proxyErrors = er => dest.emit('error', er);
    -                        src.on('error', this.proxyErrors);
    -                    }
    -                }
    -                const isObjectModeOptions = (o) => !!o.objectMode;
    -                const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer';
    -                /**
    -                 * Main export, the Minipass class
    -                 *
    -                 * `RType` is the type of data emitted, defaults to Buffer
    -                 *
    -                 * `WType` is the type of data to be written, if RType is buffer or string,
    -                 * then any {@link Minipass.ContiguousData} is allowed.
    -                 *
    -                 * `Events` is the set of event handler signatures that this object
    -                 * will emit, see {@link Minipass.Events}
    -                 */
    -                class Minipass extends events_1.EventEmitter {
    -                    [FLOWING] = false;
    -                    [PAUSED] = false;
    -                    [PIPES] = [];
    -                    [BUFFER] = [];
    -                    [OBJECTMODE];
    -                    [ENCODING];
    -                    [ASYNC];
    -                    [DECODER];
    -                    [EOF] = false;
    -                    [EMITTED_END] = false;
    -                    [EMITTING_END] = false;
    -                    [CLOSED] = false;
    -                    [EMITTED_ERROR] = null;
    -                    [BUFFERLENGTH] = 0;
    -                    [DESTROYED] = false;
    -                    [SIGNAL];
    -                    [ABORTED] = false;
    -                    [DATALISTENERS] = 0;
    -                    [DISCARDED] = false;
    -                    /**
    -                     * true if the stream can be written
    -                     */
    -                    writable = true;
    -                    /**
    -                     * true if the stream can be read
    -                     */
    -                    readable = true;
    -                    /**
    -                     * If `RType` is Buffer, then options do not need to be provided.
    -                     * Otherwise, an options object must be provided to specify either
    -                     * {@link Minipass.SharedOptions.objectMode} or
    -                     * {@link Minipass.SharedOptions.encoding}, as appropriate.
    -                     */
    -                    constructor(...args) {
    -                        const options = (args[0] ||
    -                            {});
    -                        super();
    -                        if (options.objectMode && typeof options.encoding === 'string') {
    -                            throw new TypeError('Encoding and objectMode may not be used together');
    -                        }
    -                        if (isObjectModeOptions(options)) {
    -                            this[OBJECTMODE] = true;
    -                            this[ENCODING] = null;
    -                        }
    -                        else if (isEncodingOptions(options)) {
    -                            this[ENCODING] = options.encoding;
    -                            this[OBJECTMODE] = false;
    -                        }
    -                        else {
    -                            this[OBJECTMODE] = false;
    -                            this[ENCODING] = null;
    -                        }
    -                        this[ASYNC] = !!options.async;
    -                        this[DECODER] = this[ENCODING]
    -                            ? new string_decoder_1.StringDecoder(this[ENCODING])
    -                            : null;
    -                        //@ts-ignore - private option for debugging and testing
    -                        if (options && options.debugExposeBuffer === true) {
    -                            Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] });
    -                        }
    -                        //@ts-ignore - private option for debugging and testing
    -                        if (options && options.debugExposePipes === true) {
    -                            Object.defineProperty(this, 'pipes', { get: () => this[PIPES] });
    -                        }
    -                        const { signal } = options;
    -                        if (signal) {
    -                            this[SIGNAL] = signal;
    -                            if (signal.aborted) {
    -                                this[ABORT]();
    -                            }
    -                            else {
    -                                signal.addEventListener('abort', () => this[ABORT]());
    -                            }
    -                        }
    -                    }
    -                    /**
    -                     * The amount of data stored in the buffer waiting to be read.
    -                     *
    -                     * For Buffer strings, this will be the total byte length.
    -                     * For string encoding streams, this will be the string character length,
    -                     * according to JavaScript's `string.length` logic.
    -                     * For objectMode streams, this is a count of the items waiting to be
    -                     * emitted.
    -                     */
    -                    get bufferLength() {
    -                        return this[BUFFERLENGTH];
    -                    }
    -                    /**
    -                     * The `BufferEncoding` currently in use, or `null`
    -                     */
    -                    get encoding() {
    -                        return this[ENCODING];
    -                    }
    -                    /**
    -                     * @deprecated - This is a read only property
    -                     */
    -                    set encoding(_enc) {
    -                        throw new Error('Encoding must be set at instantiation time');
    -                    }
    -                    /**
    -                     * @deprecated - Encoding may only be set at instantiation time
    -                     */
    -                    setEncoding(_enc) {
    -                        throw new Error('Encoding must be set at instantiation time');
    -                    }
    -                    /**
    -                     * True if this is an objectMode stream
    -                     */
    -                    get objectMode() {
    -                        return this[OBJECTMODE];
    -                    }
    -                    /**
    -                     * @deprecated - This is a read-only property
    -                     */
    -                    set objectMode(_om) {
    -                        throw new Error('objectMode must be set at instantiation time');
    -                    }
    -                    /**
    -                     * true if this is an async stream
    -                     */
    -                    get ['async']() {
    -                        return this[ASYNC];
    -                    }
    -                    /**
    -                     * Set to true to make this stream async.
    -                     *
    -                     * Once set, it cannot be unset, as this would potentially cause incorrect
    -                     * behavior.  Ie, a sync stream can be made async, but an async stream
    -                     * cannot be safely made sync.
    -                     */
    -                    set ['async'](a) {
    -                        this[ASYNC] = this[ASYNC] || !!a;
    -                    }
    -                    // drop everything and get out of the flow completely
    -                    [ABORT]() {
    -                        this[ABORTED] = true;
    -                        this.emit('abort', this[SIGNAL]?.reason);
    -                        this.destroy(this[SIGNAL]?.reason);
    -                    }
    -                    /**
    -                     * True if the stream has been aborted.
    -                     */
    -                    get aborted() {
    -                        return this[ABORTED];
    -                    }
    -                    /**
    -                     * No-op setter. Stream aborted status is set via the AbortSignal provided
    -                     * in the constructor options.
    -                     */
    -                    set aborted(_) { }
    -                    write(chunk, encoding, cb) {
    -                        if (this[ABORTED])
    -                            return false;
    -                        if (this[EOF])
    -                            throw new Error('write after end');
    -                        if (this[DESTROYED]) {
    -                            this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' }));
    -                            return true;
    -                        }
    -                        if (typeof encoding === 'function') {
    -                            cb = encoding;
    -                            encoding = 'utf8';
    -                        }
    -                        if (!encoding)
    -                            encoding = 'utf8';
    -                        const fn = this[ASYNC] ? defer : nodefer;
    -                        // convert array buffers and typed array views into buffers
    -                        // at some point in the future, we may want to do the opposite!
    -                        // leave strings and buffers as-is
    -                        // anything is only allowed if in object mode, so throw
    -                        if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
    -                            if (isArrayBufferView(chunk)) {
    -                                //@ts-ignore - sinful unsafe type changing
    -                                chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
    -                            }
    -                            else if (isArrayBufferLike(chunk)) {
    -                                //@ts-ignore - sinful unsafe type changing
    -                                chunk = Buffer.from(chunk);
    -                            }
    -                            else if (typeof chunk !== 'string') {
    -                                throw new Error('Non-contiguous data written to non-objectMode stream');
    -                            }
    -                        }
    -                        // handle object mode up front, since it's simpler
    -                        // this yields better performance, fewer checks later.
    -                        if (this[OBJECTMODE]) {
    -                            // maybe impossible?
    -                            /* c8 ignore start */
    -                            if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    -                                this[FLUSH](true);
    -                            /* c8 ignore stop */
    -                            if (this[FLOWING])
    -                                this.emit('data', chunk);
    -                            else
    -                                this[BUFFERPUSH](chunk);
    -                            if (this[BUFFERLENGTH] !== 0)
    -                                this.emit('readable');
    -                            if (cb)
    -                                fn(cb);
    -                            return this[FLOWING];
    -                        }
    -                        // at this point the chunk is a buffer or string
    -                        // don't buffer it up or send it to the decoder
    -                        if (!chunk.length) {
    -                            if (this[BUFFERLENGTH] !== 0)
    -                                this.emit('readable');
    -                            if (cb)
    -                                fn(cb);
    -                            return this[FLOWING];
    -                        }
    -                        // fast-path writing strings of same encoding to a stream with
    -                        // an empty buffer, skipping the buffer/decoder dance
    -                        if (typeof chunk === 'string' &&
    -                            // unless it is a string already ready for us to use
    -                            !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) {
    -                            //@ts-ignore - sinful unsafe type change
    -                            chunk = Buffer.from(chunk, encoding);
    -                        }
    -                        if (Buffer.isBuffer(chunk) && this[ENCODING]) {
    -                            //@ts-ignore - sinful unsafe type change
    -                            chunk = this[DECODER].write(chunk);
    -                        }
    -                        // Note: flushing CAN potentially switch us into not-flowing mode
    -                        if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    -                            this[FLUSH](true);
    -                        if (this[FLOWING])
    -                            this.emit('data', chunk);
    -                        else
    -                            this[BUFFERPUSH](chunk);
    -                        if (this[BUFFERLENGTH] !== 0)
    -                            this.emit('readable');
    -                        if (cb)
    -                            fn(cb);
    -                        return this[FLOWING];
    -                    }
    -                    /**
    -                     * Low-level explicit read method.
    -                     *
    -                     * In objectMode, the argument is ignored, and one item is returned if
    -                     * available.
    -                     *
    -                     * `n` is the number of bytes (or in the case of encoding streams,
    -                     * characters) to consume. If `n` is not provided, then the entire buffer
    -                     * is returned, or `null` is returned if no data is available.
    -                     *
    -                     * If `n` is greater that the amount of data in the internal buffer,
    -                     * then `null` is returned.
    -                     */
    -                    read(n) {
    -                        if (this[DESTROYED])
    -                            return null;
    -                        this[DISCARDED] = false;
    -                        if (this[BUFFERLENGTH] === 0 ||
    -                            n === 0 ||
    -                            (n && n > this[BUFFERLENGTH])) {
    -                            this[MAYBE_EMIT_END]();
    -                            return null;
    -                        }
    -                        if (this[OBJECTMODE])
    -                            n = null;
    -                        if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
    -                            // not object mode, so if we have an encoding, then RType is string
    -                            // otherwise, must be Buffer
    -                            this[BUFFER] = [
    -                                (this[ENCODING]
    -                                    ? this[BUFFER].join('')
    -                                    : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])),
    -                            ];
    -                        }
    -                        const ret = this[READ](n || null, this[BUFFER][0]);
    -                        this[MAYBE_EMIT_END]();
    -                        return ret;
    -                    }
    -                    [READ](n, chunk) {
    -                        if (this[OBJECTMODE])
    -                            this[BUFFERSHIFT]();
    -                        else {
    -                            const c = chunk;
    -                            if (n === c.length || n === null)
    -                                this[BUFFERSHIFT]();
    -                            else if (typeof c === 'string') {
    -                                this[BUFFER][0] = c.slice(n);
    -                                chunk = c.slice(0, n);
    -                                this[BUFFERLENGTH] -= n;
    -                            }
    -                            else {
    -                                this[BUFFER][0] = c.subarray(n);
    -                                chunk = c.subarray(0, n);
    -                                this[BUFFERLENGTH] -= n;
    -                            }
    -                        }
    -                        this.emit('data', chunk);
    -                        if (!this[BUFFER].length && !this[EOF])
    -                            this.emit('drain');
    -                        return chunk;
    -                    }
    -                    end(chunk, encoding, cb) {
    -                        if (typeof chunk === 'function') {
    -                            cb = chunk;
    -                            chunk = undefined;
    -                        }
    -                        if (typeof encoding === 'function') {
    -                            cb = encoding;
    -                            encoding = 'utf8';
    -                        }
    -                        if (chunk !== undefined)
    -                            this.write(chunk, encoding);
    -                        if (cb)
    -                            this.once('end', cb);
    -                        this[EOF] = true;
    -                        this.writable = false;
    -                        // if we haven't written anything, then go ahead and emit,
    -                        // even if we're not reading.
    -                        // we'll re-emit if a new 'end' listener is added anyway.
    -                        // This makes MP more suitable to write-only use cases.
    -                        if (this[FLOWING] || !this[PAUSED])
    -                            this[MAYBE_EMIT_END]();
    -                        return this;
    -                    }
    -                    // don't let the internal resume be overwritten
    -                    [RESUME]() {
    -                        if (this[DESTROYED])
    -                            return;
    -                        if (!this[DATALISTENERS] && !this[PIPES].length) {
    -                            this[DISCARDED] = true;
    -                        }
    -                        this[PAUSED] = false;
    -                        this[FLOWING] = true;
    -                        this.emit('resume');
    -                        if (this[BUFFER].length)
    -                            this[FLUSH]();
    -                        else if (this[EOF])
    -                            this[MAYBE_EMIT_END]();
    -                        else
    -                            this.emit('drain');
    -                    }
    -                    /**
    -                     * Resume the stream if it is currently in a paused state
    -                     *
    -                     * If called when there are no pipe destinations or `data` event listeners,
    -                     * this will place the stream in a "discarded" state, where all data will
    -                     * be thrown away. The discarded state is removed if a pipe destination or
    -                     * data handler is added, if pause() is called, or if any synchronous or
    -                     * asynchronous iteration is started.
    -                     */
    -                    resume() {
    -                        return this[RESUME]();
    -                    }
    -                    /**
    -                     * Pause the stream
    -                     */
    -                    pause() {
    -                        this[FLOWING] = false;
    -                        this[PAUSED] = true;
    -                        this[DISCARDED] = false;
    -                    }
    -                    /**
    -                     * true if the stream has been forcibly destroyed
    -                     */
    -                    get destroyed() {
    -                        return this[DESTROYED];
    -                    }
    -                    /**
    -                     * true if the stream is currently in a flowing state, meaning that
    -                     * any writes will be immediately emitted.
    -                     */
    -                    get flowing() {
    -                        return this[FLOWING];
    -                    }
    -                    /**
    -                     * true if the stream is currently in a paused state
    -                     */
    -                    get paused() {
    -                        return this[PAUSED];
    -                    }
    -                    [BUFFERPUSH](chunk) {
    -                        if (this[OBJECTMODE])
    -                            this[BUFFERLENGTH] += 1;
    -                        else
    -                            this[BUFFERLENGTH] += chunk.length;
    -                        this[BUFFER].push(chunk);
    -                    }
    -                    [BUFFERSHIFT]() {
    -                        if (this[OBJECTMODE])
    -                            this[BUFFERLENGTH] -= 1;
    -                        else
    -                            this[BUFFERLENGTH] -= this[BUFFER][0].length;
    -                        return this[BUFFER].shift();
    -                    }
    -                    [FLUSH](noDrain = false) {
    -                        do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&
    -                            this[BUFFER].length);
    -                        if (!noDrain && !this[BUFFER].length && !this[EOF])
    -                            this.emit('drain');
    -                    }
    -                    [FLUSHCHUNK](chunk) {
    -                        this.emit('data', chunk);
    -                        return this[FLOWING];
    -                    }
    -                    /**
    -                     * Pipe all data emitted by this stream into the destination provided.
    -                     *
    -                     * Triggers the flow of data.
    -                     */
    -                    pipe(dest, opts) {
    -                        if (this[DESTROYED])
    -                            return dest;
    -                        this[DISCARDED] = false;
    -                        const ended = this[EMITTED_END];
    -                        opts = opts || {};
    -                        if (dest === proc.stdout || dest === proc.stderr)
    -                            opts.end = false;
    -                        else
    -                            opts.end = opts.end !== false;
    -                        opts.proxyErrors = !!opts.proxyErrors;
    -                        // piping an ended stream ends immediately
    -                        if (ended) {
    -                            if (opts.end)
    -                                dest.end();
    -                        }
    -                        else {
    -                            // "as" here just ignores the WType, which pipes don't care about,
    -                            // since they're only consuming from us, and writing to the dest
    -                            this[PIPES].push(!opts.proxyErrors
    -                                ? new Pipe(this, dest, opts)
    -                                : new PipeProxyErrors(this, dest, opts));
    -                            if (this[ASYNC])
    -                                defer(() => this[RESUME]());
    -                            else
    -                                this[RESUME]();
    -                        }
    -                        return dest;
    -                    }
    -                    /**
    -                     * Fully unhook a piped destination stream.
    -                     *
    -                     * If the destination stream was the only consumer of this stream (ie,
    -                     * there are no other piped destinations or `'data'` event listeners)
    -                     * then the flow of data will stop until there is another consumer or
    -                     * {@link Minipass#resume} is explicitly called.
    -                     */
    -                    unpipe(dest) {
    -                        const p = this[PIPES].find(p => p.dest === dest);
    -                        if (p) {
    -                            if (this[PIPES].length === 1) {
    -                                if (this[FLOWING] && this[DATALISTENERS] === 0) {
    -                                    this[FLOWING] = false;
    -                                }
    -                                this[PIPES] = [];
    -                            }
    -                            else
    -                                this[PIPES].splice(this[PIPES].indexOf(p), 1);
    -                            p.unpipe();
    -                        }
    -                    }
    -                    /**
    -                     * Alias for {@link Minipass#on}
    -                     */
    -                    addListener(ev, handler) {
    -                        return this.on(ev, handler);
    -                    }
    -                    /**
    -                     * Mostly identical to `EventEmitter.on`, with the following
    -                     * behavior differences to prevent data loss and unnecessary hangs:
    -                     *
    -                     * - Adding a 'data' event handler will trigger the flow of data
    -                     *
    -                     * - Adding a 'readable' event handler when there is data waiting to be read
    -                     *   will cause 'readable' to be emitted immediately.
    -                     *
    -                     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
    -                     *   already passed will cause the event to be emitted immediately and all
    -                     *   handlers removed.
    -                     *
    -                     * - Adding an 'error' event handler after an error has been emitted will
    -                     *   cause the event to be re-emitted immediately with the error previously
    -                     *   raised.
    -                     */
    -                    on(ev, handler) {
    -                        const ret = super.on(ev, handler);
    -                        if (ev === 'data') {
    -                            this[DISCARDED] = false;
    -                            this[DATALISTENERS]++;
    -                            if (!this[PIPES].length && !this[FLOWING]) {
    -                                this[RESUME]();
    -                            }
    -                        }
    -                        else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {
    -                            super.emit('readable');
    -                        }
    -                        else if (isEndish(ev) && this[EMITTED_END]) {
    -                            super.emit(ev);
    -                            this.removeAllListeners(ev);
    -                        }
    -                        else if (ev === 'error' && this[EMITTED_ERROR]) {
    -                            const h = handler;
    -                            if (this[ASYNC])
    -                                defer(() => h.call(this, this[EMITTED_ERROR]));
    -                            else
    -                                h.call(this, this[EMITTED_ERROR]);
    -                        }
    -                        return ret;
    -                    }
    -                    /**
    -                     * Alias for {@link Minipass#off}
    -                     */
    -                    removeListener(ev, handler) {
    -                        return this.off(ev, handler);
    -                    }
    -                    /**
    -                     * Mostly identical to `EventEmitter.off`
    -                     *
    -                     * If a 'data' event handler is removed, and it was the last consumer
    -                     * (ie, there are no pipe destinations or other 'data' event listeners),
    -                     * then the flow of data will stop until there is another consumer or
    -                     * {@link Minipass#resume} is explicitly called.
    -                     */
    -                    off(ev, handler) {
    -                        const ret = super.off(ev, handler);
    -                        // if we previously had listeners, and now we don't, and we don't
    -                        // have any pipes, then stop the flow, unless it's been explicitly
    -                        // put in a discarded flowing state via stream.resume().
    -                        if (ev === 'data') {
    -                            this[DATALISTENERS] = this.listeners('data').length;
    -                            if (this[DATALISTENERS] === 0 &&
    -                                !this[DISCARDED] &&
    -                                !this[PIPES].length) {
    -                                this[FLOWING] = false;
    -                            }
    -                        }
    -                        return ret;
    -                    }
    -                    /**
    -                     * Mostly identical to `EventEmitter.removeAllListeners`
    -                     *
    -                     * If all 'data' event handlers are removed, and they were the last consumer
    -                     * (ie, there are no pipe destinations), then the flow of data will stop
    -                     * until there is another consumer or {@link Minipass#resume} is explicitly
    -                     * called.
    -                     */
    -                    removeAllListeners(ev) {
    -                        const ret = super.removeAllListeners(ev);
    -                        if (ev === 'data' || ev === undefined) {
    -                            this[DATALISTENERS] = 0;
    -                            if (!this[DISCARDED] && !this[PIPES].length) {
    -                                this[FLOWING] = false;
    -                            }
    -                        }
    -                        return ret;
    -                    }
    -                    /**
    -                     * true if the 'end' event has been emitted
    -                     */
    -                    get emittedEnd() {
    -                        return this[EMITTED_END];
    -                    }
    -                    [MAYBE_EMIT_END]() {
    -                        if (!this[EMITTING_END] &&
    -                            !this[EMITTED_END] &&
    -                            !this[DESTROYED] &&
    -                            this[BUFFER].length === 0 &&
    -                            this[EOF]) {
    -                            this[EMITTING_END] = true;
    -                            this.emit('end');
    -                            this.emit('prefinish');
    -                            this.emit('finish');
    -                            if (this[CLOSED])
    -                                this.emit('close');
    -                            this[EMITTING_END] = false;
    -                        }
    -                    }
    -                    /**
    -                     * Mostly identical to `EventEmitter.emit`, with the following
    -                     * behavior differences to prevent data loss and unnecessary hangs:
    -                     *
    -                     * If the stream has been destroyed, and the event is something other
    -                     * than 'close' or 'error', then `false` is returned and no handlers
    -                     * are called.
    -                     *
    -                     * If the event is 'end', and has already been emitted, then the event
    -                     * is ignored. If the stream is in a paused or non-flowing state, then
    -                     * the event will be deferred until data flow resumes. If the stream is
    -                     * async, then handlers will be called on the next tick rather than
    -                     * immediately.
    -                     *
    -                     * If the event is 'close', and 'end' has not yet been emitted, then
    -                     * the event will be deferred until after 'end' is emitted.
    -                     *
    -                     * If the event is 'error', and an AbortSignal was provided for the stream,
    -                     * and there are no listeners, then the event is ignored, matching the
    -                     * behavior of node core streams in the presense of an AbortSignal.
    -                     *
    -                     * If the event is 'finish' or 'prefinish', then all listeners will be
    -                     * removed after emitting the event, to prevent double-firing.
    -                     */
    -                    emit(ev, ...args) {
    -                        const data = args[0];
    -                        // error and close are only events allowed after calling destroy()
    -                        if (ev !== 'error' &&
    -                            ev !== 'close' &&
    -                            ev !== DESTROYED &&
    -                            this[DESTROYED]) {
    -                            return false;
    -                        }
    -                        else if (ev === 'data') {
    -                            return !this[OBJECTMODE] && !data
    -                                ? false
    -                                : this[ASYNC]
    -                                    ? (defer(() => this[EMITDATA](data)), true)
    -                                    : this[EMITDATA](data);
    -                        }
    -                        else if (ev === 'end') {
    -                            return this[EMITEND]();
    -                        }
    -                        else if (ev === 'close') {
    -                            this[CLOSED] = true;
    -                            // don't emit close before 'end' and 'finish'
    -                            if (!this[EMITTED_END] && !this[DESTROYED])
    -                                return false;
    -                            const ret = super.emit('close');
    -                            this.removeAllListeners('close');
    -                            return ret;
    -                        }
    -                        else if (ev === 'error') {
    -                            this[EMITTED_ERROR] = data;
    -                            super.emit(ERROR, data);
    -                            const ret = !this[SIGNAL] || this.listeners('error').length
    -                                ? super.emit('error', data)
    -                                : false;
    -                            this[MAYBE_EMIT_END]();
    -                            return ret;
    -                        }
    -                        else if (ev === 'resume') {
    -                            const ret = super.emit('resume');
    -                            this[MAYBE_EMIT_END]();
    -                            return ret;
    -                        }
    -                        else if (ev === 'finish' || ev === 'prefinish') {
    -                            const ret = super.emit(ev);
    -                            this.removeAllListeners(ev);
    -                            return ret;
    -                        }
    -                        // Some other unknown event
    -                        const ret = super.emit(ev, ...args);
    -                        this[MAYBE_EMIT_END]();
    -                        return ret;
    -                    }
    -                    [EMITDATA](data) {
    -                        for (const p of this[PIPES]) {
    -                            if (p.dest.write(data) === false)
    -                                this.pause();
    -                        }
    -                        const ret = this[DISCARDED] ? false : super.emit('data', data);
    -                        this[MAYBE_EMIT_END]();
    -                        return ret;
    -                    }
    -                    [EMITEND]() {
    -                        if (this[EMITTED_END])
    -                            return false;
    -                        this[EMITTED_END] = true;
    -                        this.readable = false;
    -                        return this[ASYNC]
    -                            ? (defer(() => this[EMITEND2]()), true)
    -                            : this[EMITEND2]();
    -                    }
    -                    [EMITEND2]() {
    -                        if (this[DECODER]) {
    -                            const data = this[DECODER].end();
    -                            if (data) {
    -                                for (const p of this[PIPES]) {
    -                                    p.dest.write(data);
    -                                }
    -                                if (!this[DISCARDED])
    -                                    super.emit('data', data);
    -                            }
    -                        }
    -                        for (const p of this[PIPES]) {
    -                            p.end();
    -                        }
    -                        const ret = super.emit('end');
    -                        this.removeAllListeners('end');
    -                        return ret;
    -                    }
    -                    /**
    -                     * Return a Promise that resolves to an array of all emitted data once
    -                     * the stream ends.
    -                     */
    -                    async collect() {
    -                        const buf = Object.assign([], {
    -                            dataLength: 0,
    -                        });
    -                        if (!this[OBJECTMODE])
    -                            buf.dataLength = 0;
    -                        // set the promise first, in case an error is raised
    -                        // by triggering the flow here.
    -                        const p = this.promise();
    -                        this.on('data', c => {
    -                            buf.push(c);
    -                            if (!this[OBJECTMODE])
    -                                buf.dataLength += c.length;
    -                        });
    -                        await p;
    -                        return buf;
    -                    }
    -                    /**
    -                     * Return a Promise that resolves to the concatenation of all emitted data
    -                     * once the stream ends.
    -                     *
    -                     * Not allowed on objectMode streams.
    -                     */
    -                    async concat() {
    -                        if (this[OBJECTMODE]) {
    -                            throw new Error('cannot concat in objectMode');
    -                        }
    -                        const buf = await this.collect();
    -                        return (this[ENCODING]
    -                            ? buf.join('')
    -                            : Buffer.concat(buf, buf.dataLength));
    -                    }
    -                    /**
    -                     * Return a void Promise that resolves once the stream ends.
    -                     */
    -                    async promise() {
    -                        return new Promise((resolve, reject) => {
    -                            this.on(DESTROYED, () => reject(new Error('stream destroyed')));
    -                            this.on('error', er => reject(er));
    -                            this.on('end', () => resolve());
    -                        });
    -                    }
    -                    /**
    -                     * Asynchronous `for await of` iteration.
    -                     *
    -                     * This will continue emitting all chunks until the stream terminates.
    -                     */
    -                    [Symbol.asyncIterator]() {
    -                        // set this up front, in case the consumer doesn't call next()
    -                        // right away.
    -                        this[DISCARDED] = false;
    -                        let stopped = false;
    -                        const stop = async () => {
    -                            this.pause();
    -                            stopped = true;
    -                            return { value: undefined, done: true };
    -                        };
    -                        const next = () => {
    -                            if (stopped)
    -                                return stop();
    -                            const res = this.read();
    -                            if (res !== null)
    -                                return Promise.resolve({ done: false, value: res });
    -                            if (this[EOF])
    -                                return stop();
    -                            let resolve;
    -                            let reject;
    -                            const onerr = (er) => {
    -                                this.off('data', ondata);
    -                                this.off('end', onend);
    -                                this.off(DESTROYED, ondestroy);
    -                                stop();
    -                                reject(er);
    -                            };
    -                            const ondata = (value) => {
    -                                this.off('error', onerr);
    -                                this.off('end', onend);
    -                                this.off(DESTROYED, ondestroy);
    -                                this.pause();
    -                                resolve({ value, done: !!this[EOF] });
    -                            };
    -                            const onend = () => {
    -                                this.off('error', onerr);
    -                                this.off('data', ondata);
    -                                this.off(DESTROYED, ondestroy);
    -                                stop();
    -                                resolve({ done: true, value: undefined });
    -                            };
    -                            const ondestroy = () => onerr(new Error('stream destroyed'));
    -                            return new Promise((res, rej) => {
    -                                reject = rej;
    -                                resolve = res;
    -                                this.once(DESTROYED, ondestroy);
    -                                this.once('error', onerr);
    -                                this.once('end', onend);
    -                                this.once('data', ondata);
    -                            });
    -                        };
    -                        return {
    -                            next,
    -                            throw: stop,
    -                            return: stop,
    -                            [Symbol.asyncIterator]() {
    -                                return this;
    -                            },
    -                        };
    -                    }
    -                    /**
    -                     * Synchronous `for of` iteration.
    -                     *
    -                     * The iteration will terminate when the internal buffer runs out, even
    -                     * if the stream has not yet terminated.
    -                     */
    -                    [Symbol.iterator]() {
    -                        // set this up front, in case the consumer doesn't call next()
    -                        // right away.
    -                        this[DISCARDED] = false;
    -                        let stopped = false;
    -                        const stop = () => {
    -                            this.pause();
    -                            this.off(ERROR, stop);
    -                            this.off(DESTROYED, stop);
    -                            this.off('end', stop);
    -                            stopped = true;
    -                            return { done: true, value: undefined };
    -                        };
    -                        const next = () => {
    -                            if (stopped)
    -                                return stop();
    -                            const value = this.read();
    -                            return value === null ? stop() : { done: false, value };
    -                        };
    -                        this.once('end', stop);
    -                        this.once(ERROR, stop);
    -                        this.once(DESTROYED, stop);
    -                        return {
    -                            next,
    -                            throw: stop,
    -                            return: stop,
    -                            [Symbol.iterator]() {
    -                                return this;
    -                            },
    -                        };
    -                    }
    -                    /**
    -                     * Destroy a stream, preventing it from being used for any further purpose.
    -                     *
    -                     * If the stream has a `close()` method, then it will be called on
    -                     * destruction.
    -                     *
    -                     * After destruction, any attempt to write data, read data, or emit most
    -                     * events will be ignored.
    -                     *
    -                     * If an error argument is provided, then it will be emitted in an
    -                     * 'error' event.
    -                     */
    -                    destroy(er) {
    -                        if (this[DESTROYED]) {
    -                            if (er)
    -                                this.emit('error', er);
    -                            else
    -                                this.emit(DESTROYED);
    -                            return this;
    -                        }
    -                        this[DESTROYED] = true;
    -                        this[DISCARDED] = true;
    -                        // throw away all buffered data, it's never coming out
    -                        this[BUFFER].length = 0;
    -                        this[BUFFERLENGTH] = 0;
    -                        const wc = this;
    -                        if (typeof wc.close === 'function' && !this[CLOSED])
    -                            wc.close();
    -                        if (er)
    -                            this.emit('error', er);
    -                        // if no error to emit, still reject pending promises
    -                        else
    -                            this.emit(DESTROYED);
    -                        return this;
    -                    }
    -                    /**
    -                     * Alias for {@link isStream}
    -                     *
    -                     * Former export location, maintained for backwards compatibility.
    -                     *
    -                     * @deprecated
    -                     */
    -                    static get isStream() {
    -                        return exports.isStream;
    -                    }
    -                }
    -                exports.Minipass = Minipass;
    -                //# sourceMappingURL=index.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 235:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.chownrSync = exports.chownr = void 0;
    -                const node_fs_1 = __importDefault(__nccwpck_require__(7561));
    -                const node_path_1 = __importDefault(__nccwpck_require__(9411));
    -                const lchownSync = (path, uid, gid) => {
    -                    try {
    -                        return node_fs_1.default.lchownSync(path, uid, gid);
    -                    }
    -                    catch (er) {
    -                        if (er?.code !== 'ENOENT')
    -                            throw er;
    -                    }
    -                };
    -                const chown = (cpath, uid, gid, cb) => {
    -                    node_fs_1.default.lchown(cpath, uid, gid, er => {
    -                        // Skip ENOENT error
    -                        cb(er && er?.code !== 'ENOENT' ? er : null);
    -                    });
    -                };
    -                const chownrKid = (p, child, uid, gid, cb) => {
    -                    if (child.isDirectory()) {
    -                        (0, exports.chownr)(node_path_1.default.resolve(p, child.name), uid, gid, (er) => {
    -                            if (er)
    -                                return cb(er);
    -                            const cpath = node_path_1.default.resolve(p, child.name);
    -                            chown(cpath, uid, gid, cb);
    -                        });
    -                    }
    -                    else {
    -                        const cpath = node_path_1.default.resolve(p, child.name);
    -                        chown(cpath, uid, gid, cb);
    -                    }
    -                };
    -                const chownr = (p, uid, gid, cb) => {
    -                    node_fs_1.default.readdir(p, { withFileTypes: true }, (er, children) => {
    -                        // any error other than ENOTDIR or ENOTSUP means it's not readable,
    -                        // or doesn't exist.  give up.
    -                        if (er) {
    -                            if (er.code === 'ENOENT')
    -                                return cb();
    -                            else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP')
    -                                return cb(er);
    -                        }
    -                        if (er || !children.length)
    -                            return chown(p, uid, gid, cb);
    -                        let len = children.length;
    -                        let errState = null;
    -                        const then = (er) => {
    -                            /* c8 ignore start */
    -                            if (errState)
    -                                return;
    -                            /* c8 ignore stop */
    -                            if (er)
    -                                return cb((errState = er));
    -                            if (--len === 0)
    -                                return chown(p, uid, gid, cb);
    -                        };
    -                        for (const child of children) {
    -                            chownrKid(p, child, uid, gid, then);
    -                        }
    -                    });
    -                };
    -                exports.chownr = chownr;
    -                const chownrKidSync = (p, child, uid, gid) => {
    -                    if (child.isDirectory())
    -                        (0, exports.chownrSync)(node_path_1.default.resolve(p, child.name), uid, gid);
    -                    lchownSync(node_path_1.default.resolve(p, child.name), uid, gid);
    -                };
    -                const chownrSync = (p, uid, gid) => {
    -                    let children;
    -                    try {
    -                        children = node_fs_1.default.readdirSync(p, { withFileTypes: true });
    -                    }
    -                    catch (er) {
    -                        const e = er;
    -                        if (e?.code === 'ENOENT')
    -                            return;
    -                        else if (e?.code === 'ENOTDIR' || e?.code === 'ENOTSUP')
    -                            return lchownSync(p, uid, gid);
    -                        else
    -                            throw e;
    -                    }
    -                    for (const child of children) {
    -                        chownrKidSync(p, child, uid, gid);
    -                    }
    -                    return lchownSync(p, uid, gid);
    -                };
    -                exports.chownrSync = chownrSync;
    -                //# sourceMappingURL=index.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 4149:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.assertValidPattern = void 0;
    -                const MAX_PATTERN_LENGTH = 1024 * 64;
    -                const assertValidPattern = (pattern) => {
    -                    if (typeof pattern !== 'string') {
    -                        throw new TypeError('invalid pattern');
    -                    }
    -                    if (pattern.length > MAX_PATTERN_LENGTH) {
    -                        throw new TypeError('pattern is too long');
    -                    }
    -                };
    -                exports.assertValidPattern = assertValidPattern;
    -                //# sourceMappingURL=assert-valid-pattern.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 5136:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -                // parse a single path portion
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.AST = void 0;
    -                const brace_expressions_js_1 = __nccwpck_require__(1812);
    -                const unescape_js_1 = __nccwpck_require__(5698);
    -                const types = new Set(['!', '?', '+', '*', '@']);
    -                const isExtglobType = (c) => types.has(c);
    -                // Patterns that get prepended to bind to the start of either the
    -                // entire string, or just a single path portion, to prevent dots
    -                // and/or traversal patterns, when needed.
    -                // Exts don't need the ^ or / bit, because the root binds that already.
    -                const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))';
    -                const startNoDot = '(?!\\.)';
    -                // characters that indicate a start of pattern needs the "no dots" bit,
    -                // because a dot *might* be matched. ( is not in the list, because in
    -                // the case of a child extglob, it will handle the prevention itself.
    -                const addPatternStart = new Set(['[', '.']);
    -                // cases where traversal is A-OK, no dot prevention needed
    -                const justDots = new Set(['..', '.']);
    -                const reSpecials = new Set('().*{}+?[]^$\\!');
    -                const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -                // any single thing other than /
    -                const qmark = '[^/]';
    -                // * => any number of characters
    -                const star = qmark + '*?';
    -                // use + when we need to ensure that *something* matches, because the * is
    -                // the only thing in the path portion.
    -                const starNoEmpty = qmark + '+?';
    -                // remove the \ chars that we added if we end up doing a nonmagic compare
    -                // const deslash = (s: string) => s.replace(/\\(.)/g, '$1')
    -                class AST {
    -                    type;
    -                    #root;
    -                    #hasMagic;
    -                    #uflag = false;
    -                    #parts = [];
    -                    #parent;
    -                    #parentIndex;
    -                    #negs;
    -                    #filledNegs = false;
    -                    #options;
    -                    #toString;
    -                    // set to true if it's an extglob with no children
    -                    // (which really means one child of '')
    -                    #emptyExt = false;
    -                    constructor(type, parent, options = {}) {
    -                        this.type = type;
    -                        // extglobs are inherently magical
    -                        if (type)
    -                            this.#hasMagic = true;
    -                        this.#parent = parent;
    -                        this.#root = this.#parent ? this.#parent.#root : this;
    -                        this.#options = this.#root === this ? options : this.#root.#options;
    -                        this.#negs = this.#root === this ? [] : this.#root.#negs;
    -                        if (type === '!' && !this.#root.#filledNegs)
    -                            this.#negs.push(this);
    -                        this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;
    -                    }
    -                    get hasMagic() {
    -                        /* c8 ignore start */
    -                        if (this.#hasMagic !== undefined)
    -                            return this.#hasMagic;
    -                        /* c8 ignore stop */
    -                        for (const p of this.#parts) {
    -                            if (typeof p === 'string')
    -                                continue;
    -                            if (p.type || p.hasMagic)
    -                                return (this.#hasMagic = true);
    -                        }
    -                        // note: will be undefined until we generate the regexp src and find out
    -                        return this.#hasMagic;
    -                    }
    -                    // reconstructs the pattern
    -                    toString() {
    -                        if (this.#toString !== undefined)
    -                            return this.#toString;
    -                        if (!this.type) {
    -                            return (this.#toString = this.#parts.map(p => String(p)).join(''));
    -                        }
    -                        else {
    -                            return (this.#toString =
    -                                this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')');
    -                        }
    -                    }
    -                    #fillNegs() {
    -                        /* c8 ignore start */
    -                        if (this !== this.#root)
    -                            throw new Error('should only call on root');
    -                        if (this.#filledNegs)
    -                            return this;
    -                        /* c8 ignore stop */
    -                        // call toString() once to fill this out
    -                        this.toString();
    -                        this.#filledNegs = true;
    -                        let n;
    -                        while ((n = this.#negs.pop())) {
    -                            if (n.type !== '!')
    -                                continue;
    -                            // walk up the tree, appending everthing that comes AFTER parentIndex
    -                            let p = n;
    -                            let pp = p.#parent;
    -                            while (pp) {
    -                                for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {
    -                                    for (const part of n.#parts) {
    -                                        /* c8 ignore start */
    -                                        if (typeof part === 'string') {
    -                                            throw new Error('string part in extglob AST??');
    -                                        }
    -                                        /* c8 ignore stop */
    -                                        part.copyIn(pp.#parts[i]);
    -                                    }
    -                                }
    -                                p = pp;
    -                                pp = p.#parent;
    -                            }
    -                        }
    -                        return this;
    -                    }
    -                    push(...parts) {
    -                        for (const p of parts) {
    -                            if (p === '')
    -                                continue;
    -                            /* c8 ignore start */
    -                            if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {
    -                                throw new Error('invalid part: ' + p);
    -                            }
    -                            /* c8 ignore stop */
    -                            this.#parts.push(p);
    -                        }
    -                    }
    -                    toJSON() {
    -                        const ret = this.type === null
    -                            ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))
    -                            : [this.type, ...this.#parts.map(p => p.toJSON())];
    -                        if (this.isStart() && !this.type)
    -                            ret.unshift([]);
    -                        if (this.isEnd() &&
    -                            (this === this.#root ||
    -                                (this.#root.#filledNegs && this.#parent?.type === '!'))) {
    -                            ret.push({});
    -                        }
    -                        return ret;
    -                    }
    -                    isStart() {
    -                        if (this.#root === this)
    -                            return true;
    -                        // if (this.type) return !!this.#parent?.isStart()
    -                        if (!this.#parent?.isStart())
    -                            return false;
    -                        if (this.#parentIndex === 0)
    -                            return true;
    -                        // if everything AHEAD of this is a negation, then it's still the "start"
    -                        const p = this.#parent;
    -                        for (let i = 0; i < this.#parentIndex; i++) {
    -                            const pp = p.#parts[i];
    -                            if (!(pp instanceof AST && pp.type === '!')) {
    -                                return false;
    -                            }
    -                        }
    -                        return true;
    -                    }
    -                    isEnd() {
    -                        if (this.#root === this)
    -                            return true;
    -                        if (this.#parent?.type === '!')
    -                            return true;
    -                        if (!this.#parent?.isEnd())
    -                            return false;
    -                        if (!this.type)
    -                            return this.#parent?.isEnd();
    -                        // if not root, it'll always have a parent
    -                        /* c8 ignore start */
    -                        const pl = this.#parent ? this.#parent.#parts.length : 0;
    -                        /* c8 ignore stop */
    -                        return this.#parentIndex === pl - 1;
    -                    }
    -                    copyIn(part) {
    -                        if (typeof part === 'string')
    -                            this.push(part);
    -                        else
    -                            this.push(part.clone(this));
    -                    }
    -                    clone(parent) {
    -                        const c = new AST(this.type, parent);
    -                        for (const p of this.#parts) {
    -                            c.copyIn(p);
    -                        }
    -                        return c;
    -                    }
    -                    static #parseAST(str, ast, pos, opt) {
    -                        let escaping = false;
    -                        let inBrace = false;
    -                        let braceStart = -1;
    -                        let braceNeg = false;
    -                        if (ast.type === null) {
    -                            // outside of a extglob, append until we find a start
    -                            let i = pos;
    -                            let acc = '';
    -                            while (i < str.length) {
    -                                const c = str.charAt(i++);
    -                                // still accumulate escapes at this point, but we do ignore
    -                                // starts that are escaped
    -                                if (escaping || c === '\\') {
    -                                    escaping = !escaping;
    -                                    acc += c;
    -                                    continue;
    -                                }
    -                                if (inBrace) {
    -                                    if (i === braceStart + 1) {
    -                                        if (c === '^' || c === '!') {
    -                                            braceNeg = true;
    -                                        }
    -                                    }
    -                                    else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
    -                                        inBrace = false;
    -                                    }
    -                                    acc += c;
    -                                    continue;
    -                                }
    -                                else if (c === '[') {
    -                                    inBrace = true;
    -                                    braceStart = i;
    -                                    braceNeg = false;
    -                                    acc += c;
    -                                    continue;
    -                                }
    -                                if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {
    -                                    ast.push(acc);
    -                                    acc = '';
    -                                    const ext = new AST(c, ast);
    -                                    i = AST.#parseAST(str, ext, i, opt);
    -                                    ast.push(ext);
    -                                    continue;
    -                                }
    -                                acc += c;
    -                            }
    -                            ast.push(acc);
    -                            return i;
    -                        }
    -                        // some kind of extglob, pos is at the (
    -                        // find the next | or )
    -                        let i = pos + 1;
    -                        let part = new AST(null, ast);
    -                        const parts = [];
    -                        let acc = '';
    -                        while (i < str.length) {
    -                            const c = str.charAt(i++);
    -                            // still accumulate escapes at this point, but we do ignore
    -                            // starts that are escaped
    -                            if (escaping || c === '\\') {
    -                                escaping = !escaping;
    -                                acc += c;
    -                                continue;
    -                            }
    -                            if (inBrace) {
    -                                if (i === braceStart + 1) {
    -                                    if (c === '^' || c === '!') {
    -                                        braceNeg = true;
    -                                    }
    -                                }
    -                                else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
    -                                    inBrace = false;
    -                                }
    -                                acc += c;
    -                                continue;
    -                            }
    -                            else if (c === '[') {
    -                                inBrace = true;
    -                                braceStart = i;
    -                                braceNeg = false;
    -                                acc += c;
    -                                continue;
    -                            }
    -                            if (isExtglobType(c) && str.charAt(i) === '(') {
    -                                part.push(acc);
    -                                acc = '';
    -                                const ext = new AST(c, part);
    -                                part.push(ext);
    -                                i = AST.#parseAST(str, ext, i, opt);
    -                                continue;
    -                            }
    -                            if (c === '|') {
    -                                part.push(acc);
    -                                acc = '';
    -                                parts.push(part);
    -                                part = new AST(null, ast);
    -                                continue;
    -                            }
    -                            if (c === ')') {
    -                                if (acc === '' && ast.#parts.length === 0) {
    -                                    ast.#emptyExt = true;
    -                                }
    -                                part.push(acc);
    -                                acc = '';
    -                                ast.push(...parts, part);
    -                                return i;
    -                            }
    -                            acc += c;
    -                        }
    -                        // unfinished extglob
    -                        // if we got here, it was a malformed extglob! not an extglob, but
    -                        // maybe something else in there.
    -                        ast.type = null;
    -                        ast.#hasMagic = undefined;
    -                        ast.#parts = [str.substring(pos - 1)];
    -                        return i;
    -                    }
    -                    static fromGlob(pattern, options = {}) {
    -                        const ast = new AST(null, undefined, options);
    -                        AST.#parseAST(pattern, ast, 0, options);
    -                        return ast;
    -                    }
    -                    // returns the regular expression if there's magic, or the unescaped
    -                    // string if not.
    -                    toMMPattern() {
    -                        // should only be called on root
    -                        /* c8 ignore start */
    -                        if (this !== this.#root)
    -                            return this.#root.toMMPattern();
    -                        /* c8 ignore stop */
    -                        const glob = this.toString();
    -                        const [re, body, hasMagic, uflag] = this.toRegExpSource();
    -                        // if we're in nocase mode, and not nocaseMagicOnly, then we do
    -                        // still need a regular expression if we have to case-insensitively
    -                        // match capital/lowercase characters.
    -                        const anyMagic = hasMagic ||
    -                            this.#hasMagic ||
    -                            (this.#options.nocase &&
    -                                !this.#options.nocaseMagicOnly &&
    -                                glob.toUpperCase() !== glob.toLowerCase());
    -                        if (!anyMagic) {
    -                            return body;
    -                        }
    -                        const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');
    -                        return Object.assign(new RegExp(`^${re}$`, flags), {
    -                            _src: re,
    -                            _glob: glob,
    -                        });
    -                    }
    -                    get options() {
    -                        return this.#options;
    -                    }
    -                    // returns the string match, the regexp source, whether there's magic
    -                    // in the regexp (so a regular expression is required) and whether or
    -                    // not the uflag is needed for the regular expression (for posix classes)
    -                    // TODO: instead of injecting the start/end at this point, just return
    -                    // the BODY of the regexp, along with the start/end portions suitable
    -                    // for binding the start/end in either a joined full-path makeRe context
    -                    // (where we bind to (^|/), or a standalone matchPart context (where
    -                    // we bind to ^, and not /).  Otherwise slashes get duped!
    -                    //
    -                    // In part-matching mode, the start is:
    -                    // - if not isStart: nothing
    -                    // - if traversal possible, but not allowed: ^(?!\.\.?$)
    -                    // - if dots allowed or not possible: ^
    -                    // - if dots possible and not allowed: ^(?!\.)
    -                    // end is:
    -                    // - if not isEnd(): nothing
    -                    // - else: $
    -                    //
    -                    // In full-path matching mode, we put the slash at the START of the
    -                    // pattern, so start is:
    -                    // - if first pattern: same as part-matching mode
    -                    // - if not isStart(): nothing
    -                    // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))
    -                    // - if dots allowed or not possible: /
    -                    // - if dots possible and not allowed: /(?!\.)
    -                    // end is:
    -                    // - if last pattern, same as part-matching mode
    -                    // - else nothing
    -                    //
    -                    // Always put the (?:$|/) on negated tails, though, because that has to be
    -                    // there to bind the end of the negated pattern portion, and it's easier to
    -                    // just stick it in now rather than try to inject it later in the middle of
    -                    // the pattern.
    -                    //
    -                    // We can just always return the same end, and leave it up to the caller
    -                    // to know whether it's going to be used joined or in parts.
    -                    // And, if the start is adjusted slightly, can do the same there:
    -                    // - if not isStart: nothing
    -                    // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)
    -                    // - if dots allowed or not possible: (?:/|^)
    -                    // - if dots possible and not allowed: (?:/|^)(?!\.)
    -                    //
    -                    // But it's better to have a simpler binding without a conditional, for
    -                    // performance, so probably better to return both start options.
    -                    //
    -                    // Then the caller just ignores the end if it's not the first pattern,
    -                    // and the start always gets applied.
    -                    //
    -                    // But that's always going to be $ if it's the ending pattern, or nothing,
    -                    // so the caller can just attach $ at the end of the pattern when building.
    -                    //
    -                    // So the todo is:
    -                    // - better detect what kind of start is needed
    -                    // - return both flavors of starting pattern
    -                    // - attach $ at the end of the pattern when creating the actual RegExp
    -                    //
    -                    // Ah, but wait, no, that all only applies to the root when the first pattern
    -                    // is not an extglob. If the first pattern IS an extglob, then we need all
    -                    // that dot prevention biz to live in the extglob portions, because eg
    -                    // +(*|.x*) can match .xy but not .yx.
    -                    //
    -                    // So, return the two flavors if it's #root and the first child is not an
    -                    // AST, otherwise leave it to the child AST to handle it, and there,
    -                    // use the (?:^|/) style of start binding.
    -                    //
    -                    // Even simplified further:
    -                    // - Since the start for a join is eg /(?!\.) and the start for a part
    -                    // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root
    -                    // or start or whatever) and prepend ^ or / at the Regexp construction.
    -                    toRegExpSource(allowDot) {
    -                        const dot = allowDot ?? !!this.#options.dot;
    -                        if (this.#root === this)
    -                            this.#fillNegs();
    -                        if (!this.type) {
    -                            const noEmpty = this.isStart() && this.isEnd();
    -                            const src = this.#parts
    -                                .map(p => {
    -                                    const [re, _, hasMagic, uflag] = typeof p === 'string'
    -                                        ? AST.#parseGlob(p, this.#hasMagic, noEmpty)
    -                                        : p.toRegExpSource(allowDot);
    -                                    this.#hasMagic = this.#hasMagic || hasMagic;
    -                                    this.#uflag = this.#uflag || uflag;
    -                                    return re;
    -                                })
    -                                .join('');
    -                            let start = '';
    -                            if (this.isStart()) {
    -                                if (typeof this.#parts[0] === 'string') {
    -                                    // this is the string that will match the start of the pattern,
    -                                    // so we need to protect against dots and such.
    -                                    // '.' and '..' cannot match unless the pattern is that exactly,
    -                                    // even if it starts with . or dot:true is set.
    -                                    const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);
    -                                    if (!dotTravAllowed) {
    -                                        const aps = addPatternStart;
    -                                        // check if we have a possibility of matching . or ..,
    -                                        // and prevent that.
    -                                        const needNoTrav =
    -                                            // dots are allowed, and the pattern starts with [ or .
    -                                            (dot && aps.has(src.charAt(0))) ||
    -                                            // the pattern starts with \., and then [ or .
    -                                            (src.startsWith('\\.') && aps.has(src.charAt(2))) ||
    -                                            // the pattern starts with \.\., and then [ or .
    -                                            (src.startsWith('\\.\\.') && aps.has(src.charAt(4)));
    -                                        // no need to prevent dots if it can't match a dot, or if a
    -                                        // sub-pattern will be preventing it anyway.
    -                                        const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));
    -                                        start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : '';
    -                                    }
    -                                }
    -                            }
    -                            // append the "end of path portion" pattern to negation tails
    -                            let end = '';
    -                            if (this.isEnd() &&
    -                                this.#root.#filledNegs &&
    -                                this.#parent?.type === '!') {
    -                                end = '(?:$|\\/)';
    -                            }
    -                            const final = start + src + end;
    -                            return [
    -                                final,
    -                                (0, unescape_js_1.unescape)(src),
    -                                (this.#hasMagic = !!this.#hasMagic),
    -                                this.#uflag,
    -                            ];
    -                        }
    -                        // We need to calculate the body *twice* if it's a repeat pattern
    -                        // at the start, once in nodot mode, then again in dot mode, so a
    -                        // pattern like *(?) can match 'x.y'
    -                        const repeated = this.type === '*' || this.type === '+';
    -                        // some kind of extglob
    -                        const start = this.type === '!' ? '(?:(?!(?:' : '(?:';
    -                        let body = this.#partsToRegExp(dot);
    -                        if (this.isStart() && this.isEnd() && !body && this.type !== '!') {
    -                            // invalid extglob, has to at least be *something* present, if it's
    -                            // the entire path portion.
    -                            const s = this.toString();
    -                            this.#parts = [s];
    -                            this.type = null;
    -                            this.#hasMagic = undefined;
    -                            return [s, (0, unescape_js_1.unescape)(this.toString()), false, false];
    -                        }
    -                        // XXX abstract out this map method
    -                        let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot
    -                            ? ''
    -                            : this.#partsToRegExp(true);
    -                        if (bodyDotAllowed === body) {
    -                            bodyDotAllowed = '';
    -                        }
    -                        if (bodyDotAllowed) {
    -                            body = `(?:${body})(?:${bodyDotAllowed})*?`;
    -                        }
    -                        // an empty !() is exactly equivalent to a starNoEmpty
    -                        let final = '';
    -                        if (this.type === '!' && this.#emptyExt) {
    -                            final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;
    -                        }
    -                        else {
    -                            const close = this.type === '!'
    -                                ? // !() must match something,but !(x) can match ''
    -                                '))' +
    -                                (this.isStart() && !dot && !allowDot ? startNoDot : '') +
    -                                star +
    -                                ')'
    -                                : this.type === '@'
    -                                    ? ')'
    -                                    : this.type === '?'
    -                                        ? ')?'
    -                                        : this.type === '+' && bodyDotAllowed
    -                                            ? ')'
    -                                            : this.type === '*' && bodyDotAllowed
    -                                                ? `)?`
    -                                                : `)${this.type}`;
    -                            final = start + body + close;
    -                        }
    -                        return [
    -                            final,
    -                            (0, unescape_js_1.unescape)(body),
    -                            (this.#hasMagic = !!this.#hasMagic),
    -                            this.#uflag,
    -                        ];
    -                    }
    -                    #partsToRegExp(dot) {
    -                        return this.#parts
    -                            .map(p => {
    -                                // extglob ASTs should only contain parent ASTs
    -                                /* c8 ignore start */
    -                                if (typeof p === 'string') {
    -                                    throw new Error('string type in extglob ast??');
    -                                }
    -                                /* c8 ignore stop */
    -                                // can ignore hasMagic, because extglobs are already always magic
    -                                const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);
    -                                this.#uflag = this.#uflag || uflag;
    -                                return re;
    -                            })
    -                            .filter(p => !(this.isStart() && this.isEnd()) || !!p)
    -                            .join('|');
    -                    }
    -                    static #parseGlob(glob, hasMagic, noEmpty = false) {
    -                        let escaping = false;
    -                        let re = '';
    -                        let uflag = false;
    -                        for (let i = 0; i < glob.length; i++) {
    -                            const c = glob.charAt(i);
    -                            if (escaping) {
    -                                escaping = false;
    -                                re += (reSpecials.has(c) ? '\\' : '') + c;
    -                                continue;
    -                            }
    -                            if (c === '\\') {
    -                                if (i === glob.length - 1) {
    -                                    re += '\\\\';
    -                                }
    -                                else {
    -                                    escaping = true;
    -                                }
    -                                continue;
    -                            }
    -                            if (c === '[') {
    -                                const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i);
    -                                if (consumed) {
    -                                    re += src;
    -                                    uflag = uflag || needUflag;
    -                                    i += consumed - 1;
    -                                    hasMagic = hasMagic || magic;
    -                                    continue;
    -                                }
    -                            }
    -                            if (c === '*') {
    -                                if (noEmpty && glob === '*')
    -                                    re += starNoEmpty;
    -                                else
    -                                    re += star;
    -                                hasMagic = true;
    -                                continue;
    -                            }
    -                            if (c === '?') {
    -                                re += qmark;
    -                                hasMagic = true;
    -                                continue;
    -                            }
    -                            re += regExpEscape(c);
    -                        }
    -                        return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag];
    -                    }
    -                }
    -                exports.AST = AST;
    -                //# sourceMappingURL=ast.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 1812:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                // translate the various posix character classes into unicode properties
    -                // this works across all unicode locales
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.parseClass = void 0;
    -                // { : [, /u flag required, negated]
    -                const posixClasses = {
    -                    '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true],
    -                    '[:alpha:]': ['\\p{L}\\p{Nl}', true],
    -                    '[:ascii:]': ['\\x' + '00-\\x' + '7f', false],
    -                    '[:blank:]': ['\\p{Zs}\\t', true],
    -                    '[:cntrl:]': ['\\p{Cc}', true],
    -                    '[:digit:]': ['\\p{Nd}', true],
    -                    '[:graph:]': ['\\p{Z}\\p{C}', true, true],
    -                    '[:lower:]': ['\\p{Ll}', true],
    -                    '[:print:]': ['\\p{C}', true],
    -                    '[:punct:]': ['\\p{P}', true],
    -                    '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true],
    -                    '[:upper:]': ['\\p{Lu}', true],
    -                    '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true],
    -                    '[:xdigit:]': ['A-Fa-f0-9', false],
    -                };
    -                // only need to escape a few things inside of brace expressions
    -                // escapes: [ \ ] -
    -                const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&');
    -                // escape all regexp magic characters
    -                const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -                // everything has already been escaped, we just have to join
    -                const rangesToString = (ranges) => ranges.join('');
    -                // takes a glob string at a posix brace expression, and returns
    -                // an equivalent regular expression source, and boolean indicating
    -                // whether the /u flag needs to be applied, and the number of chars
    -                // consumed to parse the character class.
    -                // This also removes out of order ranges, and returns ($.) if the
    -                // entire class just no good.
    -                const parseClass = (glob, position) => {
    -                    const pos = position;
    -                    /* c8 ignore start */
    -                    if (glob.charAt(pos) !== '[') {
    -                        throw new Error('not in a brace expression');
    -                    }
    -                    /* c8 ignore stop */
    -                    const ranges = [];
    -                    const negs = [];
    -                    let i = pos + 1;
    -                    let sawStart = false;
    -                    let uflag = false;
    -                    let escaping = false;
    -                    let negate = false;
    -                    let endPos = pos;
    -                    let rangeStart = '';
    -                    WHILE: while (i < glob.length) {
    -                        const c = glob.charAt(i);
    -                        if ((c === '!' || c === '^') && i === pos + 1) {
    -                            negate = true;
    -                            i++;
    -                            continue;
    -                        }
    -                        if (c === ']' && sawStart && !escaping) {
    -                            endPos = i + 1;
    -                            break;
    -                        }
    -                        sawStart = true;
    -                        if (c === '\\') {
    -                            if (!escaping) {
    -                                escaping = true;
    -                                i++;
    -                                continue;
    -                            }
    -                            // escaped \ char, fall through and treat like normal char
    -                        }
    -                        if (c === '[' && !escaping) {
    -                            // either a posix class, a collation equivalent, or just a [
    -                            for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {
    -                                if (glob.startsWith(cls, i)) {
    -                                    // invalid, [a-[] is fine, but not [a-[:alpha]]
    -                                    if (rangeStart) {
    -                                        return ['$.', false, glob.length - pos, true];
    -                                    }
    -                                    i += cls.length;
    -                                    if (neg)
    -                                        negs.push(unip);
    -                                    else
    -                                        ranges.push(unip);
    -                                    uflag = uflag || u;
    -                                    continue WHILE;
    -                                }
    -                            }
    -                        }
    -                        // now it's just a normal character, effectively
    -                        escaping = false;
    -                        if (rangeStart) {
    -                            // throw this range away if it's not valid, but others
    -                            // can still match.
    -                            if (c > rangeStart) {
    -                                ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));
    -                            }
    -                            else if (c === rangeStart) {
    -                                ranges.push(braceEscape(c));
    -                            }
    -                            rangeStart = '';
    -                            i++;
    -                            continue;
    -                        }
    -                        // now might be the start of a range.
    -                        // can be either c-d or c-] or c] or c] at this point
    -                        if (glob.startsWith('-]', i + 1)) {
    -                            ranges.push(braceEscape(c + '-'));
    -                            i += 2;
    -                            continue;
    -                        }
    -                        if (glob.startsWith('-', i + 1)) {
    -                            rangeStart = c;
    -                            i += 2;
    -                            continue;
    -                        }
    -                        // not the start of a range, just a single character
    -                        ranges.push(braceEscape(c));
    -                        i++;
    -                    }
    -                    if (endPos < i) {
    -                        // didn't see the end of the class, not a valid class,
    -                        // but might still be valid as a literal match.
    -                        return ['', false, 0, false];
    -                    }
    -                    // if we got no ranges and no negates, then we have a range that
    -                    // cannot possibly match anything, and that poisons the whole glob
    -                    if (!ranges.length && !negs.length) {
    -                        return ['$.', false, glob.length - pos, true];
    -                    }
    -                    // if we got one positive range, and it's a single character, then that's
    -                    // not actually a magic pattern, it's just that one literal character.
    -                    // we should not treat that as "magic", we should just return the literal
    -                    // character. [_] is a perfectly valid way to escape glob magic chars.
    -                    if (negs.length === 0 &&
    -                        ranges.length === 1 &&
    -                        /^\\?.$/.test(ranges[0]) &&
    -                        !negate) {
    -                        const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];
    -                        return [regexpEscape(r), false, endPos - pos, false];
    -                    }
    -                    const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';
    -                    const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';
    -                    const comb = ranges.length && negs.length
    -                        ? '(' + sranges + '|' + snegs + ')'
    -                        : ranges.length
    -                            ? sranges
    -                            : snegs;
    -                    return [comb, uflag, endPos - pos, true];
    -                };
    -                exports.parseClass = parseClass;
    -                //# sourceMappingURL=brace-expressions.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 2804:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.escape = void 0;
    -                /**
    -                 * Escape all magic characters in a glob pattern.
    -                 *
    -                 * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}
    -                 * option is used, then characters are escaped by wrapping in `[]`, because
    -                 * a magic character wrapped in a character class can only be satisfied by
    -                 * that exact character.  In this mode, `\` is _not_ escaped, because it is
    -                 * not interpreted as a magic character, but instead as a path separator.
    -                 */
    -                const escape = (s, { windowsPathsNoEscape = false, } = {}) => {
    -                    // don't need to escape +@! because we escape the parens
    -                    // that make those magic, and escaping ! as [!] isn't valid,
    -                    // because [!]] is a valid glob class meaning not ']'.
    -                    return windowsPathsNoEscape
    -                        ? s.replace(/[?*()[\]]/g, '[$&]')
    -                        : s.replace(/[?*()[\]\\]/g, '\\$&');
    -                };
    -                exports.escape = escape;
    -                //# sourceMappingURL=escape.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 4501:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0;
    -                const brace_expansion_1 = __importDefault(__nccwpck_require__(3717));
    -                const assert_valid_pattern_js_1 = __nccwpck_require__(4149);
    -                const ast_js_1 = __nccwpck_require__(5136);
    -                const escape_js_1 = __nccwpck_require__(2804);
    -                const unescape_js_1 = __nccwpck_require__(5698);
    -                const minimatch = (p, pattern, options = {}) => {
    -                    (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
    -                    // shortcut: comments match nothing.
    -                    if (!options.nocomment && pattern.charAt(0) === '#') {
    -                        return false;
    -                    }
    -                    return new Minimatch(pattern, options).match(p);
    -                };
    -                exports.minimatch = minimatch;
    -                // Optimized checking for the most common glob patterns.
    -                const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/;
    -                const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);
    -                const starDotExtTestDot = (ext) => (f) => f.endsWith(ext);
    -                const starDotExtTestNocase = (ext) => {
    -                    ext = ext.toLowerCase();
    -                    return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);
    -                };
    -                const starDotExtTestNocaseDot = (ext) => {
    -                    ext = ext.toLowerCase();
    -                    return (f) => f.toLowerCase().endsWith(ext);
    -                };
    -                const starDotStarRE = /^\*+\.\*+$/;
    -                const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');
    -                const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');
    -                const dotStarRE = /^\.\*+$/;
    -                const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');
    -                const starRE = /^\*+$/;
    -                const starTest = (f) => f.length !== 0 && !f.startsWith('.');
    -                const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';
    -                const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/;
    -                const qmarksTestNocase = ([$0, ext = '']) => {
    -                    const noext = qmarksTestNoExt([$0]);
    -                    if (!ext)
    -                        return noext;
    -                    ext = ext.toLowerCase();
    -                    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
    -                };
    -                const qmarksTestNocaseDot = ([$0, ext = '']) => {
    -                    const noext = qmarksTestNoExtDot([$0]);
    -                    if (!ext)
    -                        return noext;
    -                    ext = ext.toLowerCase();
    -                    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
    -                };
    -                const qmarksTestDot = ([$0, ext = '']) => {
    -                    const noext = qmarksTestNoExtDot([$0]);
    -                    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
    -                };
    -                const qmarksTest = ([$0, ext = '']) => {
    -                    const noext = qmarksTestNoExt([$0]);
    -                    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
    -                };
    -                const qmarksTestNoExt = ([$0]) => {
    -                    const len = $0.length;
    -                    return (f) => f.length === len && !f.startsWith('.');
    -                };
    -                const qmarksTestNoExtDot = ([$0]) => {
    -                    const len = $0.length;
    -                    return (f) => f.length === len && f !== '.' && f !== '..';
    -                };
    -                /* c8 ignore start */
    -                const defaultPlatform = (typeof process === 'object' && process
    -                    ? (typeof process.env === 'object' &&
    -                        process.env &&
    -                        process.env.__MINIMATCH_TESTING_PLATFORM__) ||
    -                    process.platform
    -                    : 'posix');
    -                const path = {
    -                    win32: { sep: '\\' },
    -                    posix: { sep: '/' },
    -                };
    -                /* c8 ignore stop */
    -                exports.sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;
    -                exports.minimatch.sep = exports.sep;
    -                exports.GLOBSTAR = Symbol('globstar **');
    -                exports.minimatch.GLOBSTAR = exports.GLOBSTAR;
    -                // any single thing other than /
    -                // don't need to escape / when using new RegExp()
    -                const qmark = '[^/]';
    -                // * => any number of characters
    -                const star = qmark + '*?';
    -                // ** when dots are allowed.  Anything goes, except .. and .
    -                // not (^ or / followed by one or two dots followed by $ or /),
    -                // followed by anything, any number of times.
    -                const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';
    -                // not a ^ or / followed by a dot,
    -                // followed by anything, any number of times.
    -                const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';
    -                const filter = (pattern, options = {}) => (p) => (0, exports.minimatch)(p, pattern, options);
    -                exports.filter = filter;
    -                exports.minimatch.filter = exports.filter;
    -                const ext = (a, b = {}) => Object.assign({}, a, b);
    -                const defaults = (def) => {
    -                    if (!def || typeof def !== 'object' || !Object.keys(def).length) {
    -                        return exports.minimatch;
    -                    }
    -                    const orig = exports.minimatch;
    -                    const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));
    -                    return Object.assign(m, {
    -                        Minimatch: class Minimatch extends orig.Minimatch {
    -                            constructor(pattern, options = {}) {
    -                                super(pattern, ext(def, options));
    -                            }
    -                            static defaults(options) {
    -                                return orig.defaults(ext(def, options)).Minimatch;
    -                            }
    -                        },
    -                        AST: class AST extends orig.AST {
    -                            /* c8 ignore start */
    -                            constructor(type, parent, options = {}) {
    -                                super(type, parent, ext(def, options));
    -                            }
    -                            /* c8 ignore stop */
    -                            static fromGlob(pattern, options = {}) {
    -                                return orig.AST.fromGlob(pattern, ext(def, options));
    -                            }
    -                        },
    -                        unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),
    -                        escape: (s, options = {}) => orig.escape(s, ext(def, options)),
    -                        filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),
    -                        defaults: (options) => orig.defaults(ext(def, options)),
    -                        makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),
    -                        braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),
    -                        match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),
    -                        sep: orig.sep,
    -                        GLOBSTAR: exports.GLOBSTAR,
    -                    });
    -                };
    -                exports.defaults = defaults;
    -                exports.minimatch.defaults = exports.defaults;
    -                // Brace expansion:
    -                // a{b,c}d -> abd acd
    -                // a{b,}c -> abc ac
    -                // a{0..3}d -> a0d a1d a2d a3d
    -                // a{b,c{d,e}f}g -> abg acdfg acefg
    -                // a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
    -                //
    -                // Invalid sets are not expanded.
    -                // a{2..}b -> a{2..}b
    -                // a{b}c -> a{b}c
    -                const braceExpand = (pattern, options = {}) => {
    -                    (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
    -                    // Thanks to Yeting Li  for
    -                    // improving this regexp to avoid a ReDOS vulnerability.
    -                    if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
    -                        // shortcut. no need to expand.
    -                        return [pattern];
    -                    }
    -                    return (0, brace_expansion_1.default)(pattern);
    -                };
    -                exports.braceExpand = braceExpand;
    -                exports.minimatch.braceExpand = exports.braceExpand;
    -                // parse a component of the expanded set.
    -                // At this point, no pattern may contain "/" in it
    -                // so we're going to return a 2d array, where each entry is the full
    -                // pattern, split on '/', and then turned into a regular expression.
    -                // A regexp is made at the end which joins each array with an
    -                // escaped /, and another full one which joins each regexp with |.
    -                //
    -                // Following the lead of Bash 4.1, note that "**" only has special meaning
    -                // when it is the *only* thing in a path portion.  Otherwise, any series
    -                // of * is equivalent to a single *.  Globstar behavior is enabled by
    -                // default, and can be disabled by setting options.noglobstar.
    -                const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();
    -                exports.makeRe = makeRe;
    -                exports.minimatch.makeRe = exports.makeRe;
    -                const match = (list, pattern, options = {}) => {
    -                    const mm = new Minimatch(pattern, options);
    -                    list = list.filter(f => mm.match(f));
    -                    if (mm.options.nonull && !list.length) {
    -                        list.push(pattern);
    -                    }
    -                    return list;
    -                };
    -                exports.match = match;
    -                exports.minimatch.match = exports.match;
    -                // replace stuff like \* with *
    -                const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;
    -                const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
    -                class Minimatch {
    -                    options;
    -                    set;
    -                    pattern;
    -                    windowsPathsNoEscape;
    -                    nonegate;
    -                    negate;
    -                    comment;
    -                    empty;
    -                    preserveMultipleSlashes;
    -                    partial;
    -                    globSet;
    -                    globParts;
    -                    nocase;
    -                    isWindows;
    -                    platform;
    -                    windowsNoMagicRoot;
    -                    regexp;
    -                    constructor(pattern, options = {}) {
    -                        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
    -                        options = options || {};
    -                        this.options = options;
    -                        this.pattern = pattern;
    -                        this.platform = options.platform || defaultPlatform;
    -                        this.isWindows = this.platform === 'win32';
    -                        this.windowsPathsNoEscape =
    -                            !!options.windowsPathsNoEscape || options.allowWindowsEscape === false;
    -                        if (this.windowsPathsNoEscape) {
    -                            this.pattern = this.pattern.replace(/\\/g, '/');
    -                        }
    -                        this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;
    -                        this.regexp = null;
    -                        this.negate = false;
    -                        this.nonegate = !!options.nonegate;
    -                        this.comment = false;
    -                        this.empty = false;
    -                        this.partial = !!options.partial;
    -                        this.nocase = !!this.options.nocase;
    -                        this.windowsNoMagicRoot =
    -                            options.windowsNoMagicRoot !== undefined
    -                                ? options.windowsNoMagicRoot
    -                                : !!(this.isWindows && this.nocase);
    -                        this.globSet = [];
    -                        this.globParts = [];
    -                        this.set = [];
    -                        // make the set of regexps etc.
    -                        this.make();
    -                    }
    -                    hasMagic() {
    -                        if (this.options.magicalBraces && this.set.length > 1) {
    -                            return true;
    -                        }
    -                        for (const pattern of this.set) {
    -                            for (const part of pattern) {
    -                                if (typeof part !== 'string')
    -                                    return true;
    -                            }
    -                        }
    -                        return false;
    -                    }
    -                    debug(..._) { }
    -                    make() {
    -                        const pattern = this.pattern;
    -                        const options = this.options;
    -                        // empty patterns and comments match nothing.
    -                        if (!options.nocomment && pattern.charAt(0) === '#') {
    -                            this.comment = true;
    -                            return;
    -                        }
    -                        if (!pattern) {
    -                            this.empty = true;
    -                            return;
    -                        }
    -                        // step 1: figure out negation, etc.
    -                        this.parseNegate();
    -                        // step 2: expand braces
    -                        this.globSet = [...new Set(this.braceExpand())];
    -                        if (options.debug) {
    -                            this.debug = (...args) => console.error(...args);
    -                        }
    -                        this.debug(this.pattern, this.globSet);
    -                        // step 3: now we have a set, so turn each one into a series of
    -                        // path-portion matching patterns.
    -                        // These will be regexps, except in the case of "**", which is
    -                        // set to the GLOBSTAR object for globstar behavior,
    -                        // and will not contain any / characters
    -                        //
    -                        // First, we preprocess to make the glob pattern sets a bit simpler
    -                        // and deduped.  There are some perf-killing patterns that can cause
    -                        // problems with a glob walk, but we can simplify them down a bit.
    -                        const rawGlobParts = this.globSet.map(s => this.slashSplit(s));
    -                        this.globParts = this.preprocess(rawGlobParts);
    -                        this.debug(this.pattern, this.globParts);
    -                        // glob --> regexps
    -                        let set = this.globParts.map((s, _, __) => {
    -                            if (this.isWindows && this.windowsNoMagicRoot) {
    -                                // check if it's a drive or unc path.
    -                                const isUNC = s[0] === '' &&
    -                                    s[1] === '' &&
    -                                    (s[2] === '?' || !globMagic.test(s[2])) &&
    -                                    !globMagic.test(s[3]);
    -                                const isDrive = /^[a-z]:/i.test(s[0]);
    -                                if (isUNC) {
    -                                    return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))];
    -                                }
    -                                else if (isDrive) {
    -                                    return [s[0], ...s.slice(1).map(ss => this.parse(ss))];
    -                                }
    -                            }
    -                            return s.map(ss => this.parse(ss));
    -                        });
    -                        this.debug(this.pattern, set);
    -                        // filter out everything that didn't compile properly.
    -                        this.set = set.filter(s => s.indexOf(false) === -1);
    -                        // do not treat the ? in UNC paths as magic
    -                        if (this.isWindows) {
    -                            for (let i = 0; i < this.set.length; i++) {
    -                                const p = this.set[i];
    -                                if (p[0] === '' &&
    -                                    p[1] === '' &&
    -                                    this.globParts[i][2] === '?' &&
    -                                    typeof p[3] === 'string' &&
    -                                    /^[a-z]:$/i.test(p[3])) {
    -                                    p[2] = '?';
    -                                }
    -                            }
    -                        }
    -                        this.debug(this.pattern, this.set);
    -                    }
    -                    // various transforms to equivalent pattern sets that are
    -                    // faster to process in a filesystem walk.  The goal is to
    -                    // eliminate what we can, and push all ** patterns as far
    -                    // to the right as possible, even if it increases the number
    -                    // of patterns that we have to process.
    -                    preprocess(globParts) {
    -                        // if we're not in globstar mode, then turn all ** into *
    -                        if (this.options.noglobstar) {
    -                            for (let i = 0; i < globParts.length; i++) {
    -                                for (let j = 0; j < globParts[i].length; j++) {
    -                                    if (globParts[i][j] === '**') {
    -                                        globParts[i][j] = '*';
    -                                    }
    -                                }
    -                            }
    -                        }
    -                        const { optimizationLevel = 1 } = this.options;
    -                        if (optimizationLevel >= 2) {
    -                            // aggressive optimization for the purpose of fs walking
    -                            globParts = this.firstPhasePreProcess(globParts);
    -                            globParts = this.secondPhasePreProcess(globParts);
    -                        }
    -                        else if (optimizationLevel >= 1) {
    -                            // just basic optimizations to remove some .. parts
    -                            globParts = this.levelOneOptimize(globParts);
    -                        }
    -                        else {
    -                            // just collapse multiple ** portions into one
    -                            globParts = this.adjascentGlobstarOptimize(globParts);
    -                        }
    -                        return globParts;
    -                    }
    -                    // just get rid of adjascent ** portions
    -                    adjascentGlobstarOptimize(globParts) {
    -                        return globParts.map(parts => {
    -                            let gs = -1;
    -                            while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
    -                                let i = gs;
    -                                while (parts[i + 1] === '**') {
    -                                    i++;
    -                                }
    -                                if (i !== gs) {
    -                                    parts.splice(gs, i - gs);
    -                                }
    -                            }
    -                            return parts;
    -                        });
    -                    }
    -                    // get rid of adjascent ** and resolve .. portions
    -                    levelOneOptimize(globParts) {
    -                        return globParts.map(parts => {
    -                            parts = parts.reduce((set, part) => {
    -                                const prev = set[set.length - 1];
    -                                if (part === '**' && prev === '**') {
    -                                    return set;
    -                                }
    -                                if (part === '..') {
    -                                    if (prev && prev !== '..' && prev !== '.' && prev !== '**') {
    -                                        set.pop();
    -                                        return set;
    -                                    }
    -                                }
    -                                set.push(part);
    -                                return set;
    -                            }, []);
    -                            return parts.length === 0 ? [''] : parts;
    -                        });
    -                    }
    -                    levelTwoFileOptimize(parts) {
    -                        if (!Array.isArray(parts)) {
    -                            parts = this.slashSplit(parts);
    -                        }
    -                        let didSomething = false;
    -                        do {
    -                            didSomething = false;
    -                            // 
    // -> 
    /
    -                            if (!this.preserveMultipleSlashes) {
    -                                for (let i = 1; i < parts.length - 1; i++) {
    -                                    const p = parts[i];
    -                                    // don't squeeze out UNC patterns
    -                                    if (i === 1 && p === '' && parts[0] === '')
    -                                        continue;
    -                                    if (p === '.' || p === '') {
    -                                        didSomething = true;
    -                                        parts.splice(i, 1);
    -                                        i--;
    -                                    }
    -                                }
    -                                if (parts[0] === '.' &&
    -                                    parts.length === 2 &&
    -                                    (parts[1] === '.' || parts[1] === '')) {
    -                                    didSomething = true;
    -                                    parts.pop();
    -                                }
    -                            }
    -                            // 
    /

    /../ ->

    /
    -                            let dd = 0;
    -                            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                                const p = parts[dd - 1];
    -                                if (p && p !== '.' && p !== '..' && p !== '**') {
    -                                    didSomething = true;
    -                                    parts.splice(dd - 1, 2);
    -                                    dd -= 2;
    -                                }
    -                            }
    -                        } while (didSomething);
    -                        return parts.length === 0 ? [''] : parts;
    -                    }
    -                    // First phase: single-pattern processing
    -                    // 
     is 1 or more portions
    -                    //  is 1 or more portions
    -                    // 

    is any portion other than ., .., '', or ** - // is . or '' - // - // **/.. is *brutal* for filesystem walking performance, because - // it effectively resets the recursive walk each time it occurs, - // and ** cannot be reduced out by a .. pattern part like a regexp - // or most strings (other than .., ., and '') can be. - // - //

    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - //

    // -> 
    /
    -                    // 
    /

    /../ ->

    /
    -                    // **/**/ -> **/
    -                    //
    -                    // **/*/ -> */**/ <== not valid because ** doesn't follow
    -                    // this WOULD be allowed if ** did follow symlinks, or * didn't
    -                    firstPhasePreProcess(globParts) {
    -                        let didSomething = false;
    -                        do {
    -                            didSomething = false;
    -                            // 
    /**/../

    /

    / -> {

    /../

    /

    /,

    /**/

    /

    /} - for (let parts of globParts) { - let gs = -1; - while (-1 !== (gs = parts.indexOf('**', gs + 1))) { - let gss = gs; - while (parts[gss + 1] === '**') { - //

    /**/**/ -> 
    /**/
    -                                        gss++;
    -                                    }
    -                                    // eg, if gs is 2 and gss is 4, that means we have 3 **
    -                                    // parts, and can remove 2 of them.
    -                                    if (gss > gs) {
    -                                        parts.splice(gs + 1, gss - gs);
    -                                    }
    -                                    let next = parts[gs + 1];
    -                                    const p = parts[gs + 2];
    -                                    const p2 = parts[gs + 3];
    -                                    if (next !== '..')
    -                                        continue;
    -                                    if (!p ||
    -                                        p === '.' ||
    -                                        p === '..' ||
    -                                        !p2 ||
    -                                        p2 === '.' ||
    -                                        p2 === '..') {
    -                                        continue;
    -                                    }
    -                                    didSomething = true;
    -                                    // edit parts in place, and push the new one
    -                                    parts.splice(gs, 1);
    -                                    const other = parts.slice(0);
    -                                    other[gs] = '**';
    -                                    globParts.push(other);
    -                                    gs--;
    -                                }
    -                                // 
    // -> 
    /
    -                                if (!this.preserveMultipleSlashes) {
    -                                    for (let i = 1; i < parts.length - 1; i++) {
    -                                        const p = parts[i];
    -                                        // don't squeeze out UNC patterns
    -                                        if (i === 1 && p === '' && parts[0] === '')
    -                                            continue;
    -                                        if (p === '.' || p === '') {
    -                                            didSomething = true;
    -                                            parts.splice(i, 1);
    -                                            i--;
    -                                        }
    -                                    }
    -                                    if (parts[0] === '.' &&
    -                                        parts.length === 2 &&
    -                                        (parts[1] === '.' || parts[1] === '')) {
    -                                        didSomething = true;
    -                                        parts.pop();
    -                                    }
    -                                }
    -                                // 
    /

    /../ ->

    /
    -                                let dd = 0;
    -                                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
    -                                    const p = parts[dd - 1];
    -                                    if (p && p !== '.' && p !== '..' && p !== '**') {
    -                                        didSomething = true;
    -                                        const needDot = dd === 1 && parts[dd + 1] === '**';
    -                                        const splin = needDot ? ['.'] : [];
    -                                        parts.splice(dd - 1, 2, ...splin);
    -                                        if (parts.length === 0)
    -                                            parts.push('');
    -                                        dd -= 2;
    -                                    }
    -                                }
    -                            }
    -                        } while (didSomething);
    -                        return globParts;
    -                    }
    -                    // second phase: multi-pattern dedupes
    -                    // {
    /*/,
    /

    /} ->

    /*/
    -                    // {
    /,
    /} -> 
    /
    -                    // {
    /**/,
    /} -> 
    /**/
    -                    //
    -                    // {
    /**/,
    /**/

    /} ->

    /**/
    -                    // ^-- not valid because ** doens't follow symlinks
    -                    secondPhasePreProcess(globParts) {
    -                        for (let i = 0; i < globParts.length - 1; i++) {
    -                            for (let j = i + 1; j < globParts.length; j++) {
    -                                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
    -                                if (!matched)
    -                                    continue;
    -                                globParts[i] = matched;
    -                                globParts[j] = [];
    -                            }
    -                        }
    -                        return globParts.filter(gs => gs.length);
    -                    }
    -                    partsMatch(a, b, emptyGSMatch = false) {
    -                        let ai = 0;
    -                        let bi = 0;
    -                        let result = [];
    -                        let which = '';
    -                        while (ai < a.length && bi < b.length) {
    -                            if (a[ai] === b[bi]) {
    -                                result.push(which === 'b' ? b[bi] : a[ai]);
    -                                ai++;
    -                                bi++;
    -                            }
    -                            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
    -                                result.push(a[ai]);
    -                                ai++;
    -                            }
    -                            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
    -                                result.push(b[bi]);
    -                                bi++;
    -                            }
    -                            else if (a[ai] === '*' &&
    -                                b[bi] &&
    -                                (this.options.dot || !b[bi].startsWith('.')) &&
    -                                b[bi] !== '**') {
    -                                if (which === 'b')
    -                                    return false;
    -                                which = 'a';
    -                                result.push(a[ai]);
    -                                ai++;
    -                                bi++;
    -                            }
    -                            else if (b[bi] === '*' &&
    -                                a[ai] &&
    -                                (this.options.dot || !a[ai].startsWith('.')) &&
    -                                a[ai] !== '**') {
    -                                if (which === 'a')
    -                                    return false;
    -                                which = 'b';
    -                                result.push(b[bi]);
    -                                ai++;
    -                                bi++;
    -                            }
    -                            else {
    -                                return false;
    -                            }
    -                        }
    -                        // if we fall out of the loop, it means they two are identical
    -                        // as long as their lengths match
    -                        return a.length === b.length && result;
    -                    }
    -                    parseNegate() {
    -                        if (this.nonegate)
    -                            return;
    -                        const pattern = this.pattern;
    -                        let negate = false;
    -                        let negateOffset = 0;
    -                        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
    -                            negate = !negate;
    -                            negateOffset++;
    -                        }
    -                        if (negateOffset)
    -                            this.pattern = pattern.slice(negateOffset);
    -                        this.negate = negate;
    -                    }
    -                    // set partial to true to test if, for example,
    -                    // "/a/b" matches the start of "/*/b/*/d"
    -                    // Partial means, if you run out of file before you run
    -                    // out of pattern, then that's fine, as long as all
    -                    // the parts match.
    -                    matchOne(file, pattern, partial = false) {
    -                        const options = this.options;
    -                        // UNC paths like //?/X:/... can match X:/... and vice versa
    -                        // Drive letters in absolute drive or unc paths are always compared
    -                        // case-insensitively.
    -                        if (this.isWindows) {
    -                            const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
    -                            const fileUNC = !fileDrive &&
    -                                file[0] === '' &&
    -                                file[1] === '' &&
    -                                file[2] === '?' &&
    -                                /^[a-z]:$/i.test(file[3]);
    -                            const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
    -                            const patternUNC = !patternDrive &&
    -                                pattern[0] === '' &&
    -                                pattern[1] === '' &&
    -                                pattern[2] === '?' &&
    -                                typeof pattern[3] === 'string' &&
    -                                /^[a-z]:$/i.test(pattern[3]);
    -                            const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
    -                            const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
    -                            if (typeof fdi === 'number' && typeof pdi === 'number') {
    -                                const [fd, pd] = [file[fdi], pattern[pdi]];
    -                                if (fd.toLowerCase() === pd.toLowerCase()) {
    -                                    pattern[pdi] = fd;
    -                                    if (pdi > fdi) {
    -                                        pattern = pattern.slice(pdi);
    -                                    }
    -                                    else if (fdi > pdi) {
    -                                        file = file.slice(fdi);
    -                                    }
    -                                }
    -                            }
    -                        }
    -                        // resolve and reduce . and .. portions in the file as well.
    -                        // dont' need to do the second phase, because it's only one string[]
    -                        const { optimizationLevel = 1 } = this.options;
    -                        if (optimizationLevel >= 2) {
    -                            file = this.levelTwoFileOptimize(file);
    -                        }
    -                        this.debug('matchOne', this, { file, pattern });
    -                        this.debug('matchOne', file.length, pattern.length);
    -                        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
    -                            this.debug('matchOne loop');
    -                            var p = pattern[pi];
    -                            var f = file[fi];
    -                            this.debug(pattern, p, f);
    -                            // should be impossible.
    -                            // some invalid regexp stuff in the set.
    -                            /* c8 ignore start */
    -                            if (p === false) {
    -                                return false;
    -                            }
    -                            /* c8 ignore stop */
    -                            if (p === exports.GLOBSTAR) {
    -                                this.debug('GLOBSTAR', [pattern, p, f]);
    -                                // "**"
    -                                // a/**/b/**/c would match the following:
    -                                // a/b/x/y/z/c
    -                                // a/x/y/z/b/c
    -                                // a/b/x/b/x/c
    -                                // a/b/c
    -                                // To do this, take the rest of the pattern after
    -                                // the **, and see if it would match the file remainder.
    -                                // If so, return success.
    -                                // If not, the ** "swallows" a segment, and try again.
    -                                // This is recursively awful.
    -                                //
    -                                // a/**/b/**/c matching a/b/x/y/z/c
    -                                // - a matches a
    -                                // - doublestar
    -                                //   - matchOne(b/x/y/z/c, b/**/c)
    -                                //     - b matches b
    -                                //     - doublestar
    -                                //       - matchOne(x/y/z/c, c) -> no
    -                                //       - matchOne(y/z/c, c) -> no
    -                                //       - matchOne(z/c, c) -> no
    -                                //       - matchOne(c, c) yes, hit
    -                                var fr = fi;
    -                                var pr = pi + 1;
    -                                if (pr === pl) {
    -                                    this.debug('** at the end');
    -                                    // a ** at the end will just swallow the rest.
    -                                    // We have found a match.
    -                                    // however, it will not swallow /.x, unless
    -                                    // options.dot is set.
    -                                    // . and .. are *never* matched by **, for explosively
    -                                    // exponential reasons.
    -                                    for (; fi < fl; fi++) {
    -                                        if (file[fi] === '.' ||
    -                                            file[fi] === '..' ||
    -                                            (!options.dot && file[fi].charAt(0) === '.'))
    -                                            return false;
    -                                    }
    -                                    return true;
    -                                }
    -                                // ok, let's see if we can swallow whatever we can.
    -                                while (fr < fl) {
    -                                    var swallowee = file[fr];
    -                                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
    -                                    // XXX remove this slice.  Just pass the start index.
    -                                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
    -                                        this.debug('globstar found match!', fr, fl, swallowee);
    -                                        // found a match.
    -                                        return true;
    -                                    }
    -                                    else {
    -                                        // can't swallow "." or ".." ever.
    -                                        // can only swallow ".foo" when explicitly asked.
    -                                        if (swallowee === '.' ||
    -                                            swallowee === '..' ||
    -                                            (!options.dot && swallowee.charAt(0) === '.')) {
    -                                            this.debug('dot detected!', file, fr, pattern, pr);
    -                                            break;
    -                                        }
    -                                        // ** swallows a segment, and continue.
    -                                        this.debug('globstar swallow a segment, and continue');
    -                                        fr++;
    -                                    }
    -                                }
    -                                // no match was found.
    -                                // However, in partial mode, we can't say this is necessarily over.
    -                                /* c8 ignore start */
    -                                if (partial) {
    -                                    // ran out of file
    -                                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
    -                                    if (fr === fl) {
    -                                        return true;
    -                                    }
    -                                }
    -                                /* c8 ignore stop */
    -                                return false;
    -                            }
    -                            // something other than **
    -                            // non-magic patterns just have to match exactly
    -                            // patterns with magic have been turned into regexps.
    -                            let hit;
    -                            if (typeof p === 'string') {
    -                                hit = f === p;
    -                                this.debug('string match', p, f, hit);
    -                            }
    -                            else {
    -                                hit = p.test(f);
    -                                this.debug('pattern match', p, f, hit);
    -                            }
    -                            if (!hit)
    -                                return false;
    -                        }
    -                        // Note: ending in / means that we'll get a final ""
    -                        // at the end of the pattern.  This can only match a
    -                        // corresponding "" at the end of the file.
    -                        // If the file ends in /, then it can only match a
    -                        // a pattern that ends in /, unless the pattern just
    -                        // doesn't have any more for it. But, a/b/ should *not*
    -                        // match "a/b/*", even though "" matches against the
    -                        // [^/]*? pattern, except in partial mode, where it might
    -                        // simply not be reached yet.
    -                        // However, a/b/ should still satisfy a/*
    -                        // now either we fell off the end of the pattern, or we're done.
    -                        if (fi === fl && pi === pl) {
    -                            // ran out of pattern and filename at the same time.
    -                            // an exact hit!
    -                            return true;
    -                        }
    -                        else if (fi === fl) {
    -                            // ran out of file, but still had pattern left.
    -                            // this is ok if we're doing the match as part of
    -                            // a glob fs traversal.
    -                            return partial;
    -                        }
    -                        else if (pi === pl) {
    -                            // ran out of pattern, still have file left.
    -                            // this is only acceptable if we're on the very last
    -                            // empty segment of a file with a trailing slash.
    -                            // a/* should match a/b/
    -                            return fi === fl - 1 && file[fi] === '';
    -                            /* c8 ignore start */
    -                        }
    -                        else {
    -                            // should be unreachable.
    -                            throw new Error('wtf?');
    -                        }
    -                        /* c8 ignore stop */
    -                    }
    -                    braceExpand() {
    -                        return (0, exports.braceExpand)(this.pattern, this.options);
    -                    }
    -                    parse(pattern) {
    -                        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
    -                        const options = this.options;
    -                        // shortcuts
    -                        if (pattern === '**')
    -                            return exports.GLOBSTAR;
    -                        if (pattern === '')
    -                            return '';
    -                        // far and away, the most common glob pattern parts are
    -                        // *, *.*, and *.  Add a fast check method for those.
    -                        let m;
    -                        let fastTest = null;
    -                        if ((m = pattern.match(starRE))) {
    -                            fastTest = options.dot ? starTestDot : starTest;
    -                        }
    -                        else if ((m = pattern.match(starDotExtRE))) {
    -                            fastTest = (options.nocase
    -                                ? options.dot
    -                                    ? starDotExtTestNocaseDot
    -                                    : starDotExtTestNocase
    -                                : options.dot
    -                                    ? starDotExtTestDot
    -                                    : starDotExtTest)(m[1]);
    -                        }
    -                        else if ((m = pattern.match(qmarksRE))) {
    -                            fastTest = (options.nocase
    -                                ? options.dot
    -                                    ? qmarksTestNocaseDot
    -                                    : qmarksTestNocase
    -                                : options.dot
    -                                    ? qmarksTestDot
    -                                    : qmarksTest)(m);
    -                        }
    -                        else if ((m = pattern.match(starDotStarRE))) {
    -                            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
    -                        }
    -                        else if ((m = pattern.match(dotStarRE))) {
    -                            fastTest = dotStarTest;
    -                        }
    -                        const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
    -                        if (fastTest && typeof re === 'object') {
    -                            // Avoids overriding in frozen environments
    -                            Reflect.defineProperty(re, 'test', { value: fastTest });
    -                        }
    -                        return re;
    -                    }
    -                    makeRe() {
    -                        if (this.regexp || this.regexp === false)
    -                            return this.regexp;
    -                        // at this point, this.set is a 2d array of partial
    -                        // pattern strings, or "**".
    -                        //
    -                        // It's better to use .match().  This function shouldn't
    -                        // be used, really, but it's pretty convenient sometimes,
    -                        // when you just want to work with a regex.
    -                        const set = this.set;
    -                        if (!set.length) {
    -                            this.regexp = false;
    -                            return this.regexp;
    -                        }
    -                        const options = this.options;
    -                        const twoStar = options.noglobstar
    -                            ? star
    -                            : options.dot
    -                                ? twoStarDot
    -                                : twoStarNoDot;
    -                        const flags = new Set(options.nocase ? ['i'] : []);
    -                        // regexpify non-globstar patterns
    -                        // if ** is only item, then we just do one twoStar
    -                        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
    -                        // if ** is last, append (\/twoStar|) to previous
    -                        // if ** is in the middle, append (\/|\/twoStar\/) to previous
    -                        // then filter out GLOBSTAR symbols
    -                        let re = set
    -                            .map(pattern => {
    -                                const pp = pattern.map(p => {
    -                                    if (p instanceof RegExp) {
    -                                        for (const f of p.flags.split(''))
    -                                            flags.add(f);
    -                                    }
    -                                    return typeof p === 'string'
    -                                        ? regExpEscape(p)
    -                                        : p === exports.GLOBSTAR
    -                                            ? exports.GLOBSTAR
    -                                            : p._src;
    -                                });
    -                                pp.forEach((p, i) => {
    -                                    const next = pp[i + 1];
    -                                    const prev = pp[i - 1];
    -                                    if (p !== exports.GLOBSTAR || prev === exports.GLOBSTAR) {
    -                                        return;
    -                                    }
    -                                    if (prev === undefined) {
    -                                        if (next !== undefined && next !== exports.GLOBSTAR) {
    -                                            pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
    -                                        }
    -                                        else {
    -                                            pp[i] = twoStar;
    -                                        }
    -                                    }
    -                                    else if (next === undefined) {
    -                                        pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
    -                                    }
    -                                    else if (next !== exports.GLOBSTAR) {
    -                                        pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
    -                                        pp[i + 1] = exports.GLOBSTAR;
    -                                    }
    -                                });
    -                                return pp.filter(p => p !== exports.GLOBSTAR).join('/');
    -                            })
    -                            .join('|');
    -                        // need to wrap in parens if we had more than one thing with |,
    -                        // otherwise only the first will be anchored to ^ and the last to $
    -                        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
    -                        // must match entire pattern
    -                        // ending in a * or ** will make it less strict.
    -                        re = '^' + open + re + close + '$';
    -                        // can match anything, as long as it's not this.
    -                        if (this.negate)
    -                            re = '^(?!' + re + ').+$';
    -                        try {
    -                            this.regexp = new RegExp(re, [...flags].join(''));
    -                            /* c8 ignore start */
    -                        }
    -                        catch (ex) {
    -                            // should be impossible
    -                            this.regexp = false;
    -                        }
    -                        /* c8 ignore stop */
    -                        return this.regexp;
    -                    }
    -                    slashSplit(p) {
    -                        // if p starts with // on windows, we preserve that
    -                        // so that UNC paths aren't broken.  Otherwise, any number of
    -                        // / characters are coalesced into one, unless
    -                        // preserveMultipleSlashes is set to true.
    -                        if (this.preserveMultipleSlashes) {
    -                            return p.split('/');
    -                        }
    -                        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
    -                            // add an extra '' for the one we lose
    -                            return ['', ...p.split(/\/+/)];
    -                        }
    -                        else {
    -                            return p.split(/\/+/);
    -                        }
    -                    }
    -                    match(f, partial = this.partial) {
    -                        this.debug('match', f, this.pattern);
    -                        // short-circuit in the case of busted things.
    -                        // comments, etc.
    -                        if (this.comment) {
    -                            return false;
    -                        }
    -                        if (this.empty) {
    -                            return f === '';
    -                        }
    -                        if (f === '/' && partial) {
    -                            return true;
    -                        }
    -                        const options = this.options;
    -                        // windows: need to use /, not \
    -                        if (this.isWindows) {
    -                            f = f.split('\\').join('/');
    -                        }
    -                        // treat the test path as a set of pathparts.
    -                        const ff = this.slashSplit(f);
    -                        this.debug(this.pattern, 'split', ff);
    -                        // just ONE of the pattern sets in this.set needs to match
    -                        // in order for it to be valid.  If negating, then just one
    -                        // match means that we have failed.
    -                        // Either way, return on the first hit.
    -                        const set = this.set;
    -                        this.debug(this.pattern, 'set', set);
    -                        // Find the basename of the path by looking for the last non-empty segment
    -                        let filename = ff[ff.length - 1];
    -                        if (!filename) {
    -                            for (let i = ff.length - 2; !filename && i >= 0; i--) {
    -                                filename = ff[i];
    -                            }
    -                        }
    -                        for (let i = 0; i < set.length; i++) {
    -                            const pattern = set[i];
    -                            let file = ff;
    -                            if (options.matchBase && pattern.length === 1) {
    -                                file = [filename];
    -                            }
    -                            const hit = this.matchOne(file, pattern, partial);
    -                            if (hit) {
    -                                if (options.flipNegate) {
    -                                    return true;
    -                                }
    -                                return !this.negate;
    -                            }
    -                        }
    -                        // didn't get any hits.  this is success if it's a negative
    -                        // pattern, failure otherwise.
    -                        if (options.flipNegate) {
    -                            return false;
    -                        }
    -                        return this.negate;
    -                    }
    -                    static defaults(def) {
    -                        return exports.minimatch.defaults(def).Minimatch;
    -                    }
    -                }
    -                exports.Minimatch = Minimatch;
    -                /* c8 ignore start */
    -                var ast_js_2 = __nccwpck_require__(5136);
    -                Object.defineProperty(exports, "AST", ({ enumerable: true, get: function () { return ast_js_2.AST; } }));
    -                var escape_js_2 = __nccwpck_require__(2804);
    -                Object.defineProperty(exports, "escape", ({ enumerable: true, get: function () { return escape_js_2.escape; } }));
    -                var unescape_js_2 = __nccwpck_require__(5698);
    -                Object.defineProperty(exports, "unescape", ({ enumerable: true, get: function () { return unescape_js_2.unescape; } }));
    -                /* c8 ignore stop */
    -                exports.minimatch.AST = ast_js_1.AST;
    -                exports.minimatch.Minimatch = Minimatch;
    -                exports.minimatch.escape = escape_js_1.escape;
    -                exports.minimatch.unescape = unescape_js_1.unescape;
    -                //# sourceMappingURL=index.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 5698:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.unescape = void 0;
    -                /**
    -                 * Un-escape a string that has been escaped with {@link escape}.
    -                 *
    -                 * If the {@link windowsPathsNoEscape} option is used, then square-brace
    -                 * escapes are removed, but not backslash escapes.  For example, it will turn
    -                 * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
    -                 * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
    -                 *
    -                 * When `windowsPathsNoEscape` is not set, then both brace escapes and
    -                 * backslash escapes are removed.
    -                 *
    -                 * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
    -                 * or unescaped.
    -                 */
    -                const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
    -                    return windowsPathsNoEscape
    -                        ? s.replace(/\[([^\/\\])\]/g, '$1')
    -                        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
    -                };
    -                exports.unescape = unescape;
    -                //# sourceMappingURL=unescape.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 499:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.constants = void 0;
    -                // Update with any zlib constants that are added or changed in the future.
    -                // Node v6 didn't export this, so we just hard code the version and rely
    -                // on all the other hard-coded values from zlib v4736.  When node v6
    -                // support drops, we can just export the realZlibConstants object.
    -                const zlib_1 = __importDefault(__nccwpck_require__(9796));
    -                /* c8 ignore start */
    -                const realZlibConstants = zlib_1.default.constants || { ZLIB_VERNUM: 4736 };
    -                /* c8 ignore stop */
    -                exports.constants = Object.freeze(Object.assign(Object.create(null), {
    -                    Z_NO_FLUSH: 0,
    -                    Z_PARTIAL_FLUSH: 1,
    -                    Z_SYNC_FLUSH: 2,
    -                    Z_FULL_FLUSH: 3,
    -                    Z_FINISH: 4,
    -                    Z_BLOCK: 5,
    -                    Z_OK: 0,
    -                    Z_STREAM_END: 1,
    -                    Z_NEED_DICT: 2,
    -                    Z_ERRNO: -1,
    -                    Z_STREAM_ERROR: -2,
    -                    Z_DATA_ERROR: -3,
    -                    Z_MEM_ERROR: -4,
    -                    Z_BUF_ERROR: -5,
    -                    Z_VERSION_ERROR: -6,
    -                    Z_NO_COMPRESSION: 0,
    -                    Z_BEST_SPEED: 1,
    -                    Z_BEST_COMPRESSION: 9,
    -                    Z_DEFAULT_COMPRESSION: -1,
    -                    Z_FILTERED: 1,
    -                    Z_HUFFMAN_ONLY: 2,
    -                    Z_RLE: 3,
    -                    Z_FIXED: 4,
    -                    Z_DEFAULT_STRATEGY: 0,
    -                    DEFLATE: 1,
    -                    INFLATE: 2,
    -                    GZIP: 3,
    -                    GUNZIP: 4,
    -                    DEFLATERAW: 5,
    -                    INFLATERAW: 6,
    -                    UNZIP: 7,
    -                    BROTLI_DECODE: 8,
    -                    BROTLI_ENCODE: 9,
    -                    Z_MIN_WINDOWBITS: 8,
    -                    Z_MAX_WINDOWBITS: 15,
    -                    Z_DEFAULT_WINDOWBITS: 15,
    -                    Z_MIN_CHUNK: 64,
    -                    Z_MAX_CHUNK: Infinity,
    -                    Z_DEFAULT_CHUNK: 16384,
    -                    Z_MIN_MEMLEVEL: 1,
    -                    Z_MAX_MEMLEVEL: 9,
    -                    Z_DEFAULT_MEMLEVEL: 8,
    -                    Z_MIN_LEVEL: -1,
    -                    Z_MAX_LEVEL: 9,
    -                    Z_DEFAULT_LEVEL: -1,
    -                    BROTLI_OPERATION_PROCESS: 0,
    -                    BROTLI_OPERATION_FLUSH: 1,
    -                    BROTLI_OPERATION_FINISH: 2,
    -                    BROTLI_OPERATION_EMIT_METADATA: 3,
    -                    BROTLI_MODE_GENERIC: 0,
    -                    BROTLI_MODE_TEXT: 1,
    -                    BROTLI_MODE_FONT: 2,
    -                    BROTLI_DEFAULT_MODE: 0,
    -                    BROTLI_MIN_QUALITY: 0,
    -                    BROTLI_MAX_QUALITY: 11,
    -                    BROTLI_DEFAULT_QUALITY: 11,
    -                    BROTLI_MIN_WINDOW_BITS: 10,
    -                    BROTLI_MAX_WINDOW_BITS: 24,
    -                    BROTLI_LARGE_MAX_WINDOW_BITS: 30,
    -                    BROTLI_DEFAULT_WINDOW: 22,
    -                    BROTLI_MIN_INPUT_BLOCK_BITS: 16,
    -                    BROTLI_MAX_INPUT_BLOCK_BITS: 24,
    -                    BROTLI_PARAM_MODE: 0,
    -                    BROTLI_PARAM_QUALITY: 1,
    -                    BROTLI_PARAM_LGWIN: 2,
    -                    BROTLI_PARAM_LGBLOCK: 3,
    -                    BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING: 4,
    -                    BROTLI_PARAM_SIZE_HINT: 5,
    -                    BROTLI_PARAM_LARGE_WINDOW: 6,
    -                    BROTLI_PARAM_NPOSTFIX: 7,
    -                    BROTLI_PARAM_NDIRECT: 8,
    -                    BROTLI_DECODER_RESULT_ERROR: 0,
    -                    BROTLI_DECODER_RESULT_SUCCESS: 1,
    -                    BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT: 2,
    -                    BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT: 3,
    -                    BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION: 0,
    -                    BROTLI_DECODER_PARAM_LARGE_WINDOW: 1,
    -                    BROTLI_DECODER_NO_ERROR: 0,
    -                    BROTLI_DECODER_SUCCESS: 1,
    -                    BROTLI_DECODER_NEEDS_MORE_INPUT: 2,
    -                    BROTLI_DECODER_NEEDS_MORE_OUTPUT: 3,
    -                    BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE: -1,
    -                    BROTLI_DECODER_ERROR_FORMAT_RESERVED: -2,
    -                    BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE: -3,
    -                    BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET: -4,
    -                    BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME: -5,
    -                    BROTLI_DECODER_ERROR_FORMAT_CL_SPACE: -6,
    -                    BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE: -7,
    -                    BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT: -8,
    -                    BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1: -9,
    -                    BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2: -10,
    -                    BROTLI_DECODER_ERROR_FORMAT_TRANSFORM: -11,
    -                    BROTLI_DECODER_ERROR_FORMAT_DICTIONARY: -12,
    -                    BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS: -13,
    -                    BROTLI_DECODER_ERROR_FORMAT_PADDING_1: -14,
    -                    BROTLI_DECODER_ERROR_FORMAT_PADDING_2: -15,
    -                    BROTLI_DECODER_ERROR_FORMAT_DISTANCE: -16,
    -                    BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET: -19,
    -                    BROTLI_DECODER_ERROR_INVALID_ARGUMENTS: -20,
    -                    BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES: -21,
    -                    BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS: -22,
    -                    BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP: -25,
    -                    BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1: -26,
    -                    BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2: -27,
    -                    BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES: -30,
    -                    BROTLI_DECODER_ERROR_UNREACHABLE: -31,
    -                }, realZlibConstants));
    -                //# sourceMappingURL=constants.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 6139:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.BrotliDecompress = exports.BrotliCompress = exports.Brotli = exports.Unzip = exports.InflateRaw = exports.DeflateRaw = exports.Gunzip = exports.Gzip = exports.Inflate = exports.Deflate = exports.Zlib = exports.ZlibError = exports.constants = void 0;
    -                const assert_1 = __importDefault(__nccwpck_require__(9491));
    -                const buffer_1 = __nccwpck_require__(4300);
    -                const minipass_1 = __nccwpck_require__(4824);
    -                const zlib_1 = __importDefault(__nccwpck_require__(9796));
    -                const constants_js_1 = __nccwpck_require__(499);
    -                var constants_js_2 = __nccwpck_require__(499);
    -                Object.defineProperty(exports, "constants", ({ enumerable: true, get: function () { return constants_js_2.constants; } }));
    -                const OriginalBufferConcat = buffer_1.Buffer.concat;
    -                const _superWrite = Symbol('_superWrite');
    -                class ZlibError extends Error {
    -                    code;
    -                    errno;
    -                    constructor(err) {
    -                        super('zlib: ' + err.message);
    -                        this.code = err.code;
    -                        this.errno = err.errno;
    -                        /* c8 ignore next */
    -                        if (!this.code)
    -                            this.code = 'ZLIB_ERROR';
    -                        this.message = 'zlib: ' + err.message;
    -                        Error.captureStackTrace(this, this.constructor);
    -                    }
    -                    get name() {
    -                        return 'ZlibError';
    -                    }
    -                }
    -                exports.ZlibError = ZlibError;
    -                // the Zlib class they all inherit from
    -                // This thing manages the queue of requests, and returns
    -                // true or false if there is anything in the queue when
    -                // you call the .write() method.
    -                const _flushFlag = Symbol('flushFlag');
    -                class ZlibBase extends minipass_1.Minipass {
    -                    #sawError = false;
    -                    #ended = false;
    -                    #flushFlag;
    -                    #finishFlushFlag;
    -                    #fullFlushFlag;
    -                    #handle;
    -                    #onError;
    -                    get sawError() {
    -                        return this.#sawError;
    -                    }
    -                    get handle() {
    -                        return this.#handle;
    -                    }
    -                    /* c8 ignore start */
    -                    get flushFlag() {
    -                        return this.#flushFlag;
    -                    }
    -                    /* c8 ignore stop */
    -                    constructor(opts, mode) {
    -                        if (!opts || typeof opts !== 'object')
    -                            throw new TypeError('invalid options for ZlibBase constructor');
    -                        //@ts-ignore
    -                        super(opts);
    -                        /* c8 ignore start */
    -                        this.#flushFlag = opts.flush ?? 0;
    -                        this.#finishFlushFlag = opts.finishFlush ?? 0;
    -                        this.#fullFlushFlag = opts.fullFlushFlag ?? 0;
    -                        /* c8 ignore stop */
    -                        // this will throw if any options are invalid for the class selected
    -                        try {
    -                            // @types/node doesn't know that it exports the classes, but they're there
    -                            //@ts-ignore
    -                            this.#handle = new zlib_1.default[mode](opts);
    -                        }
    -                        catch (er) {
    -                            // make sure that all errors get decorated properly
    -                            throw new ZlibError(er);
    -                        }
    -                        this.#onError = err => {
    -                            // no sense raising multiple errors, since we abort on the first one.
    -                            if (this.#sawError)
    -                                return;
    -                            this.#sawError = true;
    -                            // there is no way to cleanly recover.
    -                            // continuing only obscures problems.
    -                            this.close();
    -                            this.emit('error', err);
    -                        };
    -                        this.#handle?.on('error', er => this.#onError(new ZlibError(er)));
    -                        this.once('end', () => this.close);
    -                    }
    -                    close() {
    -                        if (this.#handle) {
    -                            this.#handle.close();
    -                            this.#handle = undefined;
    -                            this.emit('close');
    -                        }
    -                    }
    -                    reset() {
    -                        if (!this.#sawError) {
    -                            (0, assert_1.default)(this.#handle, 'zlib binding closed');
    -                            //@ts-ignore
    -                            return this.#handle.reset?.();
    -                        }
    -                    }
    -                    flush(flushFlag) {
    -                        if (this.ended)
    -                            return;
    -                        if (typeof flushFlag !== 'number')
    -                            flushFlag = this.#fullFlushFlag;
    -                        this.write(Object.assign(buffer_1.Buffer.alloc(0), { [_flushFlag]: flushFlag }));
    -                    }
    -                    end(chunk, encoding, cb) {
    -                        /* c8 ignore start */
    -                        if (typeof chunk === 'function') {
    -                            cb = chunk;
    -                            encoding = undefined;
    -                            chunk = undefined;
    -                        }
    -                        if (typeof encoding === 'function') {
    -                            cb = encoding;
    -                            encoding = undefined;
    -                        }
    -                        /* c8 ignore stop */
    -                        if (chunk) {
    -                            if (encoding)
    -                                this.write(chunk, encoding);
    -                            else
    -                                this.write(chunk);
    -                        }
    -                        this.flush(this.#finishFlushFlag);
    -                        this.#ended = true;
    -                        return super.end(cb);
    -                    }
    -                    get ended() {
    -                        return this.#ended;
    -                    }
    -                    // overridden in the gzip classes to do portable writes
    -                    [_superWrite](data) {
    -                        return super.write(data);
    -                    }
    -                    write(chunk, encoding, cb) {
    -                        // process the chunk using the sync process
    -                        // then super.write() all the outputted chunks
    -                        if (typeof encoding === 'function')
    -                            (cb = encoding), (encoding = 'utf8');
    -                        if (typeof chunk === 'string')
    -                            chunk = buffer_1.Buffer.from(chunk, encoding);
    -                        if (this.#sawError)
    -                            return;
    -                        (0, assert_1.default)(this.#handle, 'zlib binding closed');
    -                        // _processChunk tries to .close() the native handle after it's done, so we
    -                        // intercept that by temporarily making it a no-op.
    -                        // diving into the node:zlib internals a bit here
    -                        const nativeHandle = this.#handle
    -                            ._handle;
    -                        const originalNativeClose = nativeHandle.close;
    -                        nativeHandle.close = () => { };
    -                        const originalClose = this.#handle.close;
    -                        this.#handle.close = () => { };
    -                        // It also calls `Buffer.concat()` at the end, which may be convenient
    -                        // for some, but which we are not interested in as it slows us down.
    -                        buffer_1.Buffer.concat = args => args;
    -                        let result = undefined;
    -                        try {
    -                            const flushFlag = typeof chunk[_flushFlag] === 'number'
    -                                ? chunk[_flushFlag]
    -                                : this.#flushFlag;
    -                            result = this.#handle._processChunk(chunk, flushFlag);
    -                            // if we don't throw, reset it back how it was
    -                            buffer_1.Buffer.concat = OriginalBufferConcat;
    -                        }
    -                        catch (err) {
    -                            // or if we do, put Buffer.concat() back before we emit error
    -                            // Error events call into user code, which may call Buffer.concat()
    -                            buffer_1.Buffer.concat = OriginalBufferConcat;
    -                            this.#onError(new ZlibError(err));
    -                        }
    -                        finally {
    -                            if (this.#handle) {
    -                                // Core zlib resets `_handle` to null after attempting to close the
    -                                // native handle. Our no-op handler prevented actual closure, but we
    -                                // need to restore the `._handle` property.
    -                                ;
    -                                this.#handle._handle =
    -                                    nativeHandle;
    -                                nativeHandle.close = originalNativeClose;
    -                                this.#handle.close = originalClose;
    -                                // `_processChunk()` adds an 'error' listener. If we don't remove it
    -                                // after each call, these handlers start piling up.
    -                                this.#handle.removeAllListeners('error');
    -                                // make sure OUR error listener is still attached tho
    -                            }
    -                        }
    -                        if (this.#handle)
    -                            this.#handle.on('error', er => this.#onError(new ZlibError(er)));
    -                        let writeReturn;
    -                        if (result) {
    -                            if (Array.isArray(result) && result.length > 0) {
    -                                const r = result[0];
    -                                // The first buffer is always `handle._outBuffer`, which would be
    -                                // re-used for later invocations; so, we always have to copy that one.
    -                                writeReturn = this[_superWrite](buffer_1.Buffer.from(r));
    -                                for (let i = 1; i < result.length; i++) {
    -                                    writeReturn = this[_superWrite](result[i]);
    -                                }
    -                            }
    -                            else {
    -                                // either a single Buffer or an empty array
    -                                writeReturn = this[_superWrite](buffer_1.Buffer.from(result));
    -                            }
    -                        }
    -                        if (cb)
    -                            cb();
    -                        return writeReturn;
    -                    }
    -                }
    -                class Zlib extends ZlibBase {
    -                    #level;
    -                    #strategy;
    -                    constructor(opts, mode) {
    -                        opts = opts || {};
    -                        opts.flush = opts.flush || constants_js_1.constants.Z_NO_FLUSH;
    -                        opts.finishFlush = opts.finishFlush || constants_js_1.constants.Z_FINISH;
    -                        opts.fullFlushFlag = constants_js_1.constants.Z_FULL_FLUSH;
    -                        super(opts, mode);
    -                        this.#level = opts.level;
    -                        this.#strategy = opts.strategy;
    -                    }
    -                    params(level, strategy) {
    -                        if (this.sawError)
    -                            return;
    -                        if (!this.handle)
    -                            throw new Error('cannot switch params when binding is closed');
    -                        // no way to test this without also not supporting params at all
    -                        /* c8 ignore start */
    -                        if (!this.handle.params)
    -                            throw new Error('not supported in this implementation');
    -                        /* c8 ignore stop */
    -                        if (this.#level !== level || this.#strategy !== strategy) {
    -                            this.flush(constants_js_1.constants.Z_SYNC_FLUSH);
    -                            (0, assert_1.default)(this.handle, 'zlib binding closed');
    -                            // .params() calls .flush(), but the latter is always async in the
    -                            // core zlib. We override .flush() temporarily to intercept that and
    -                            // flush synchronously.
    -                            const origFlush = this.handle.flush;
    -                            this.handle.flush = (flushFlag, cb) => {
    -                                /* c8 ignore start */
    -                                if (typeof flushFlag === 'function') {
    -                                    cb = flushFlag;
    -                                    flushFlag = this.flushFlag;
    -                                }
    -                                /* c8 ignore stop */
    -                                this.flush(flushFlag);
    -                                cb?.();
    -                            };
    -                            try {
    -                                ;
    -                                this.handle.params(level, strategy);
    -                            }
    -                            finally {
    -                                this.handle.flush = origFlush;
    -                            }
    -                            /* c8 ignore start */
    -                            if (this.handle) {
    -                                this.#level = level;
    -                                this.#strategy = strategy;
    -                            }
    -                            /* c8 ignore stop */
    -                        }
    -                    }
    -                }
    -                exports.Zlib = Zlib;
    -                // minimal 2-byte header
    -                class Deflate extends Zlib {
    -                    constructor(opts) {
    -                        super(opts, 'Deflate');
    -                    }
    -                }
    -                exports.Deflate = Deflate;
    -                class Inflate extends Zlib {
    -                    constructor(opts) {
    -                        super(opts, 'Inflate');
    -                    }
    -                }
    -                exports.Inflate = Inflate;
    -                class Gzip extends Zlib {
    -                    #portable;
    -                    constructor(opts) {
    -                        super(opts, 'Gzip');
    -                        this.#portable = opts && !!opts.portable;
    -                    }
    -                    [_superWrite](data) {
    -                        if (!this.#portable)
    -                            return super[_superWrite](data);
    -                        // we'll always get the header emitted in one first chunk
    -                        // overwrite the OS indicator byte with 0xFF
    -                        this.#portable = false;
    -                        data[9] = 255;
    -                        return super[_superWrite](data);
    -                    }
    -                }
    -                exports.Gzip = Gzip;
    -                class Gunzip extends Zlib {
    -                    constructor(opts) {
    -                        super(opts, 'Gunzip');
    -                    }
    -                }
    -                exports.Gunzip = Gunzip;
    -                // raw - no header
    -                class DeflateRaw extends Zlib {
    -                    constructor(opts) {
    -                        super(opts, 'DeflateRaw');
    -                    }
    -                }
    -                exports.DeflateRaw = DeflateRaw;
    -                class InflateRaw extends Zlib {
    -                    constructor(opts) {
    -                        super(opts, 'InflateRaw');
    -                    }
    -                }
    -                exports.InflateRaw = InflateRaw;
    -                // auto-detect header.
    -                class Unzip extends Zlib {
    -                    constructor(opts) {
    -                        super(opts, 'Unzip');
    -                    }
    -                }
    -                exports.Unzip = Unzip;
    -                class Brotli extends ZlibBase {
    -                    constructor(opts, mode) {
    -                        opts = opts || {};
    -                        opts.flush = opts.flush || constants_js_1.constants.BROTLI_OPERATION_PROCESS;
    -                        opts.finishFlush =
    -                            opts.finishFlush || constants_js_1.constants.BROTLI_OPERATION_FINISH;
    -                        opts.fullFlushFlag = constants_js_1.constants.BROTLI_OPERATION_FLUSH;
    -                        super(opts, mode);
    -                    }
    -                }
    -                exports.Brotli = Brotli;
    -                class BrotliCompress extends Brotli {
    -                    constructor(opts) {
    -                        super(opts, 'BrotliCompress');
    -                    }
    -                }
    -                exports.BrotliCompress = BrotliCompress;
    -                class BrotliDecompress extends Brotli {
    -                    constructor(opts) {
    -                        super(opts, 'BrotliDecompress');
    -                    }
    -                }
    -                exports.BrotliDecompress = BrotliDecompress;
    -                //# sourceMappingURL=index.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 4824:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.Minipass = exports.isWritable = exports.isReadable = exports.isStream = void 0;
    -                const proc = typeof process === 'object' && process
    -                    ? process
    -                    : {
    -                        stdout: null,
    -                        stderr: null,
    -                    };
    -                const events_1 = __nccwpck_require__(2361);
    -                const stream_1 = __importDefault(__nccwpck_require__(2781));
    -                const string_decoder_1 = __nccwpck_require__(1576);
    -                /**
    -                 * Return true if the argument is a Minipass stream, Node stream, or something
    -                 * else that Minipass can interact with.
    -                 */
    -                const isStream = (s) => !!s &&
    -                    typeof s === 'object' &&
    -                    (s instanceof Minipass ||
    -                        s instanceof stream_1.default ||
    -                        (0, exports.isReadable)(s) ||
    -                        (0, exports.isWritable)(s));
    -                exports.isStream = isStream;
    -                /**
    -                 * Return true if the argument is a valid {@link Minipass.Readable}
    -                 */
    -                const isReadable = (s) => !!s &&
    -                    typeof s === 'object' &&
    -                    s instanceof events_1.EventEmitter &&
    -                    typeof s.pipe === 'function' &&
    -                    // node core Writable streams have a pipe() method, but it throws
    -                    s.pipe !== stream_1.default.Writable.prototype.pipe;
    -                exports.isReadable = isReadable;
    -                /**
    -                 * Return true if the argument is a valid {@link Minipass.Writable}
    -                 */
    -                const isWritable = (s) => !!s &&
    -                    typeof s === 'object' &&
    -                    s instanceof events_1.EventEmitter &&
    -                    typeof s.write === 'function' &&
    -                    typeof s.end === 'function';
    -                exports.isWritable = isWritable;
    -                const EOF = Symbol('EOF');
    -                const MAYBE_EMIT_END = Symbol('maybeEmitEnd');
    -                const EMITTED_END = Symbol('emittedEnd');
    -                const EMITTING_END = Symbol('emittingEnd');
    -                const EMITTED_ERROR = Symbol('emittedError');
    -                const CLOSED = Symbol('closed');
    -                const READ = Symbol('read');
    -                const FLUSH = Symbol('flush');
    -                const FLUSHCHUNK = Symbol('flushChunk');
    -                const ENCODING = Symbol('encoding');
    -                const DECODER = Symbol('decoder');
    -                const FLOWING = Symbol('flowing');
    -                const PAUSED = Symbol('paused');
    -                const RESUME = Symbol('resume');
    -                const BUFFER = Symbol('buffer');
    -                const PIPES = Symbol('pipes');
    -                const BUFFERLENGTH = Symbol('bufferLength');
    -                const BUFFERPUSH = Symbol('bufferPush');
    -                const BUFFERSHIFT = Symbol('bufferShift');
    -                const OBJECTMODE = Symbol('objectMode');
    -                // internal event when stream is destroyed
    -                const DESTROYED = Symbol('destroyed');
    -                // internal event when stream has an error
    -                const ERROR = Symbol('error');
    -                const EMITDATA = Symbol('emitData');
    -                const EMITEND = Symbol('emitEnd');
    -                const EMITEND2 = Symbol('emitEnd2');
    -                const ASYNC = Symbol('async');
    -                const ABORT = Symbol('abort');
    -                const ABORTED = Symbol('aborted');
    -                const SIGNAL = Symbol('signal');
    -                const DATALISTENERS = Symbol('dataListeners');
    -                const DISCARDED = Symbol('discarded');
    -                const defer = (fn) => Promise.resolve().then(fn);
    -                const nodefer = (fn) => fn();
    -                const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish';
    -                const isArrayBufferLike = (b) => b instanceof ArrayBuffer ||
    -                    (!!b &&
    -                        typeof b === 'object' &&
    -                        b.constructor &&
    -                        b.constructor.name === 'ArrayBuffer' &&
    -                        b.byteLength >= 0);
    -                const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b);
    -                /**
    -                 * Internal class representing a pipe to a destination stream.
    -                 *
    -                 * @internal
    -                 */
    -                class Pipe {
    -                    src;
    -                    dest;
    -                    opts;
    -                    ondrain;
    -                    constructor(src, dest, opts) {
    -                        this.src = src;
    -                        this.dest = dest;
    -                        this.opts = opts;
    -                        this.ondrain = () => src[RESUME]();
    -                        this.dest.on('drain', this.ondrain);
    -                    }
    -                    unpipe() {
    -                        this.dest.removeListener('drain', this.ondrain);
    -                    }
    -                    // only here for the prototype
    -                    /* c8 ignore start */
    -                    proxyErrors(_er) { }
    -                    /* c8 ignore stop */
    -                    end() {
    -                        this.unpipe();
    -                        if (this.opts.end)
    -                            this.dest.end();
    -                    }
    -                }
    -                /**
    -                 * Internal class representing a pipe to a destination stream where
    -                 * errors are proxied.
    -                 *
    -                 * @internal
    -                 */
    -                class PipeProxyErrors extends Pipe {
    -                    unpipe() {
    -                        this.src.removeListener('error', this.proxyErrors);
    -                        super.unpipe();
    -                    }
    -                    constructor(src, dest, opts) {
    -                        super(src, dest, opts);
    -                        this.proxyErrors = er => dest.emit('error', er);
    -                        src.on('error', this.proxyErrors);
    -                    }
    -                }
    -                const isObjectModeOptions = (o) => !!o.objectMode;
    -                const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer';
    -                /**
    -                 * Main export, the Minipass class
    -                 *
    -                 * `RType` is the type of data emitted, defaults to Buffer
    -                 *
    -                 * `WType` is the type of data to be written, if RType is buffer or string,
    -                 * then any {@link Minipass.ContiguousData} is allowed.
    -                 *
    -                 * `Events` is the set of event handler signatures that this object
    -                 * will emit, see {@link Minipass.Events}
    -                 */
    -                class Minipass extends events_1.EventEmitter {
    -                    [FLOWING] = false;
    -                    [PAUSED] = false;
    -                    [PIPES] = [];
    -                    [BUFFER] = [];
    -                    [OBJECTMODE];
    -                    [ENCODING];
    -                    [ASYNC];
    -                    [DECODER];
    -                    [EOF] = false;
    -                    [EMITTED_END] = false;
    -                    [EMITTING_END] = false;
    -                    [CLOSED] = false;
    -                    [EMITTED_ERROR] = null;
    -                    [BUFFERLENGTH] = 0;
    -                    [DESTROYED] = false;
    -                    [SIGNAL];
    -                    [ABORTED] = false;
    -                    [DATALISTENERS] = 0;
    -                    [DISCARDED] = false;
    -                    /**
    -                     * true if the stream can be written
    -                     */
    -                    writable = true;
    -                    /**
    -                     * true if the stream can be read
    -                     */
    -                    readable = true;
    -                    /**
    -                     * If `RType` is Buffer, then options do not need to be provided.
    -                     * Otherwise, an options object must be provided to specify either
    -                     * {@link Minipass.SharedOptions.objectMode} or
    -                     * {@link Minipass.SharedOptions.encoding}, as appropriate.
    -                     */
    -                    constructor(...args) {
    -                        const options = (args[0] ||
    -                            {});
    -                        super();
    -                        if (options.objectMode && typeof options.encoding === 'string') {
    -                            throw new TypeError('Encoding and objectMode may not be used together');
    -                        }
    -                        if (isObjectModeOptions(options)) {
    -                            this[OBJECTMODE] = true;
    -                            this[ENCODING] = null;
    -                        }
    -                        else if (isEncodingOptions(options)) {
    -                            this[ENCODING] = options.encoding;
    -                            this[OBJECTMODE] = false;
    -                        }
    -                        else {
    -                            this[OBJECTMODE] = false;
    -                            this[ENCODING] = null;
    -                        }
    -                        this[ASYNC] = !!options.async;
    -                        this[DECODER] = this[ENCODING]
    -                            ? new string_decoder_1.StringDecoder(this[ENCODING])
    -                            : null;
    -                        //@ts-ignore - private option for debugging and testing
    -                        if (options && options.debugExposeBuffer === true) {
    -                            Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] });
    -                        }
    -                        //@ts-ignore - private option for debugging and testing
    -                        if (options && options.debugExposePipes === true) {
    -                            Object.defineProperty(this, 'pipes', { get: () => this[PIPES] });
    -                        }
    -                        const { signal } = options;
    -                        if (signal) {
    -                            this[SIGNAL] = signal;
    -                            if (signal.aborted) {
    -                                this[ABORT]();
    -                            }
    -                            else {
    -                                signal.addEventListener('abort', () => this[ABORT]());
    -                            }
    -                        }
    -                    }
    -                    /**
    -                     * The amount of data stored in the buffer waiting to be read.
    -                     *
    -                     * For Buffer strings, this will be the total byte length.
    -                     * For string encoding streams, this will be the string character length,
    -                     * according to JavaScript's `string.length` logic.
    -                     * For objectMode streams, this is a count of the items waiting to be
    -                     * emitted.
    -                     */
    -                    get bufferLength() {
    -                        return this[BUFFERLENGTH];
    -                    }
    -                    /**
    -                     * The `BufferEncoding` currently in use, or `null`
    -                     */
    -                    get encoding() {
    -                        return this[ENCODING];
    -                    }
    -                    /**
    -                     * @deprecated - This is a read only property
    -                     */
    -                    set encoding(_enc) {
    -                        throw new Error('Encoding must be set at instantiation time');
    -                    }
    -                    /**
    -                     * @deprecated - Encoding may only be set at instantiation time
    -                     */
    -                    setEncoding(_enc) {
    -                        throw new Error('Encoding must be set at instantiation time');
    -                    }
    -                    /**
    -                     * True if this is an objectMode stream
    -                     */
    -                    get objectMode() {
    -                        return this[OBJECTMODE];
    -                    }
    -                    /**
    -                     * @deprecated - This is a read-only property
    -                     */
    -                    set objectMode(_om) {
    -                        throw new Error('objectMode must be set at instantiation time');
    -                    }
    -                    /**
    -                     * true if this is an async stream
    -                     */
    -                    get ['async']() {
    -                        return this[ASYNC];
    -                    }
    -                    /**
    -                     * Set to true to make this stream async.
    -                     *
    -                     * Once set, it cannot be unset, as this would potentially cause incorrect
    -                     * behavior.  Ie, a sync stream can be made async, but an async stream
    -                     * cannot be safely made sync.
    -                     */
    -                    set ['async'](a) {
    -                        this[ASYNC] = this[ASYNC] || !!a;
    -                    }
    -                    // drop everything and get out of the flow completely
    -                    [ABORT]() {
    -                        this[ABORTED] = true;
    -                        this.emit('abort', this[SIGNAL]?.reason);
    -                        this.destroy(this[SIGNAL]?.reason);
    -                    }
    -                    /**
    -                     * True if the stream has been aborted.
    -                     */
    -                    get aborted() {
    -                        return this[ABORTED];
    -                    }
    -                    /**
    -                     * No-op setter. Stream aborted status is set via the AbortSignal provided
    -                     * in the constructor options.
    -                     */
    -                    set aborted(_) { }
    -                    write(chunk, encoding, cb) {
    -                        if (this[ABORTED])
    -                            return false;
    -                        if (this[EOF])
    -                            throw new Error('write after end');
    -                        if (this[DESTROYED]) {
    -                            this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' }));
    -                            return true;
    -                        }
    -                        if (typeof encoding === 'function') {
    -                            cb = encoding;
    -                            encoding = 'utf8';
    -                        }
    -                        if (!encoding)
    -                            encoding = 'utf8';
    -                        const fn = this[ASYNC] ? defer : nodefer;
    -                        // convert array buffers and typed array views into buffers
    -                        // at some point in the future, we may want to do the opposite!
    -                        // leave strings and buffers as-is
    -                        // anything is only allowed if in object mode, so throw
    -                        if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
    -                            if (isArrayBufferView(chunk)) {
    -                                //@ts-ignore - sinful unsafe type changing
    -                                chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
    -                            }
    -                            else if (isArrayBufferLike(chunk)) {
    -                                //@ts-ignore - sinful unsafe type changing
    -                                chunk = Buffer.from(chunk);
    -                            }
    -                            else if (typeof chunk !== 'string') {
    -                                throw new Error('Non-contiguous data written to non-objectMode stream');
    -                            }
    -                        }
    -                        // handle object mode up front, since it's simpler
    -                        // this yields better performance, fewer checks later.
    -                        if (this[OBJECTMODE]) {
    -                            // maybe impossible?
    -                            /* c8 ignore start */
    -                            if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    -                                this[FLUSH](true);
    -                            /* c8 ignore stop */
    -                            if (this[FLOWING])
    -                                this.emit('data', chunk);
    -                            else
    -                                this[BUFFERPUSH](chunk);
    -                            if (this[BUFFERLENGTH] !== 0)
    -                                this.emit('readable');
    -                            if (cb)
    -                                fn(cb);
    -                            return this[FLOWING];
    -                        }
    -                        // at this point the chunk is a buffer or string
    -                        // don't buffer it up or send it to the decoder
    -                        if (!chunk.length) {
    -                            if (this[BUFFERLENGTH] !== 0)
    -                                this.emit('readable');
    -                            if (cb)
    -                                fn(cb);
    -                            return this[FLOWING];
    -                        }
    -                        // fast-path writing strings of same encoding to a stream with
    -                        // an empty buffer, skipping the buffer/decoder dance
    -                        if (typeof chunk === 'string' &&
    -                            // unless it is a string already ready for us to use
    -                            !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) {
    -                            //@ts-ignore - sinful unsafe type change
    -                            chunk = Buffer.from(chunk, encoding);
    -                        }
    -                        if (Buffer.isBuffer(chunk) && this[ENCODING]) {
    -                            //@ts-ignore - sinful unsafe type change
    -                            chunk = this[DECODER].write(chunk);
    -                        }
    -                        // Note: flushing CAN potentially switch us into not-flowing mode
    -                        if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    -                            this[FLUSH](true);
    -                        if (this[FLOWING])
    -                            this.emit('data', chunk);
    -                        else
    -                            this[BUFFERPUSH](chunk);
    -                        if (this[BUFFERLENGTH] !== 0)
    -                            this.emit('readable');
    -                        if (cb)
    -                            fn(cb);
    -                        return this[FLOWING];
    -                    }
    -                    /**
    -                     * Low-level explicit read method.
    -                     *
    -                     * In objectMode, the argument is ignored, and one item is returned if
    -                     * available.
    -                     *
    -                     * `n` is the number of bytes (or in the case of encoding streams,
    -                     * characters) to consume. If `n` is not provided, then the entire buffer
    -                     * is returned, or `null` is returned if no data is available.
    -                     *
    -                     * If `n` is greater that the amount of data in the internal buffer,
    -                     * then `null` is returned.
    -                     */
    -                    read(n) {
    -                        if (this[DESTROYED])
    -                            return null;
    -                        this[DISCARDED] = false;
    -                        if (this[BUFFERLENGTH] === 0 ||
    -                            n === 0 ||
    -                            (n && n > this[BUFFERLENGTH])) {
    -                            this[MAYBE_EMIT_END]();
    -                            return null;
    -                        }
    -                        if (this[OBJECTMODE])
    -                            n = null;
    -                        if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
    -                            // not object mode, so if we have an encoding, then RType is string
    -                            // otherwise, must be Buffer
    -                            this[BUFFER] = [
    -                                (this[ENCODING]
    -                                    ? this[BUFFER].join('')
    -                                    : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])),
    -                            ];
    -                        }
    -                        const ret = this[READ](n || null, this[BUFFER][0]);
    -                        this[MAYBE_EMIT_END]();
    -                        return ret;
    -                    }
    -                    [READ](n, chunk) {
    -                        if (this[OBJECTMODE])
    -                            this[BUFFERSHIFT]();
    -                        else {
    -                            const c = chunk;
    -                            if (n === c.length || n === null)
    -                                this[BUFFERSHIFT]();
    -                            else if (typeof c === 'string') {
    -                                this[BUFFER][0] = c.slice(n);
    -                                chunk = c.slice(0, n);
    -                                this[BUFFERLENGTH] -= n;
    -                            }
    -                            else {
    -                                this[BUFFER][0] = c.subarray(n);
    -                                chunk = c.subarray(0, n);
    -                                this[BUFFERLENGTH] -= n;
    -                            }
    -                        }
    -                        this.emit('data', chunk);
    -                        if (!this[BUFFER].length && !this[EOF])
    -                            this.emit('drain');
    -                        return chunk;
    -                    }
    -                    end(chunk, encoding, cb) {
    -                        if (typeof chunk === 'function') {
    -                            cb = chunk;
    -                            chunk = undefined;
    -                        }
    -                        if (typeof encoding === 'function') {
    -                            cb = encoding;
    -                            encoding = 'utf8';
    -                        }
    -                        if (chunk !== undefined)
    -                            this.write(chunk, encoding);
    -                        if (cb)
    -                            this.once('end', cb);
    -                        this[EOF] = true;
    -                        this.writable = false;
    -                        // if we haven't written anything, then go ahead and emit,
    -                        // even if we're not reading.
    -                        // we'll re-emit if a new 'end' listener is added anyway.
    -                        // This makes MP more suitable to write-only use cases.
    -                        if (this[FLOWING] || !this[PAUSED])
    -                            this[MAYBE_EMIT_END]();
    -                        return this;
    -                    }
    -                    // don't let the internal resume be overwritten
    -                    [RESUME]() {
    -                        if (this[DESTROYED])
    -                            return;
    -                        if (!this[DATALISTENERS] && !this[PIPES].length) {
    -                            this[DISCARDED] = true;
    -                        }
    -                        this[PAUSED] = false;
    -                        this[FLOWING] = true;
    -                        this.emit('resume');
    -                        if (this[BUFFER].length)
    -                            this[FLUSH]();
    -                        else if (this[EOF])
    -                            this[MAYBE_EMIT_END]();
    -                        else
    -                            this.emit('drain');
    -                    }
    -                    /**
    -                     * Resume the stream if it is currently in a paused state
    -                     *
    -                     * If called when there are no pipe destinations or `data` event listeners,
    -                     * this will place the stream in a "discarded" state, where all data will
    -                     * be thrown away. The discarded state is removed if a pipe destination or
    -                     * data handler is added, if pause() is called, or if any synchronous or
    -                     * asynchronous iteration is started.
    -                     */
    -                    resume() {
    -                        return this[RESUME]();
    -                    }
    -                    /**
    -                     * Pause the stream
    -                     */
    -                    pause() {
    -                        this[FLOWING] = false;
    -                        this[PAUSED] = true;
    -                        this[DISCARDED] = false;
    -                    }
    -                    /**
    -                     * true if the stream has been forcibly destroyed
    -                     */
    -                    get destroyed() {
    -                        return this[DESTROYED];
    -                    }
    -                    /**
    -                     * true if the stream is currently in a flowing state, meaning that
    -                     * any writes will be immediately emitted.
    -                     */
    -                    get flowing() {
    -                        return this[FLOWING];
    -                    }
    -                    /**
    -                     * true if the stream is currently in a paused state
    -                     */
    -                    get paused() {
    -                        return this[PAUSED];
    -                    }
    -                    [BUFFERPUSH](chunk) {
    -                        if (this[OBJECTMODE])
    -                            this[BUFFERLENGTH] += 1;
    -                        else
    -                            this[BUFFERLENGTH] += chunk.length;
    -                        this[BUFFER].push(chunk);
    -                    }
    -                    [BUFFERSHIFT]() {
    -                        if (this[OBJECTMODE])
    -                            this[BUFFERLENGTH] -= 1;
    -                        else
    -                            this[BUFFERLENGTH] -= this[BUFFER][0].length;
    -                        return this[BUFFER].shift();
    -                    }
    -                    [FLUSH](noDrain = false) {
    -                        do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&
    -                            this[BUFFER].length);
    -                        if (!noDrain && !this[BUFFER].length && !this[EOF])
    -                            this.emit('drain');
    -                    }
    -                    [FLUSHCHUNK](chunk) {
    -                        this.emit('data', chunk);
    -                        return this[FLOWING];
    -                    }
    -                    /**
    -                     * Pipe all data emitted by this stream into the destination provided.
    -                     *
    -                     * Triggers the flow of data.
    -                     */
    -                    pipe(dest, opts) {
    -                        if (this[DESTROYED])
    -                            return dest;
    -                        this[DISCARDED] = false;
    -                        const ended = this[EMITTED_END];
    -                        opts = opts || {};
    -                        if (dest === proc.stdout || dest === proc.stderr)
    -                            opts.end = false;
    -                        else
    -                            opts.end = opts.end !== false;
    -                        opts.proxyErrors = !!opts.proxyErrors;
    -                        // piping an ended stream ends immediately
    -                        if (ended) {
    -                            if (opts.end)
    -                                dest.end();
    -                        }
    -                        else {
    -                            // "as" here just ignores the WType, which pipes don't care about,
    -                            // since they're only consuming from us, and writing to the dest
    -                            this[PIPES].push(!opts.proxyErrors
    -                                ? new Pipe(this, dest, opts)
    -                                : new PipeProxyErrors(this, dest, opts));
    -                            if (this[ASYNC])
    -                                defer(() => this[RESUME]());
    -                            else
    -                                this[RESUME]();
    -                        }
    -                        return dest;
    -                    }
    -                    /**
    -                     * Fully unhook a piped destination stream.
    -                     *
    -                     * If the destination stream was the only consumer of this stream (ie,
    -                     * there are no other piped destinations or `'data'` event listeners)
    -                     * then the flow of data will stop until there is another consumer or
    -                     * {@link Minipass#resume} is explicitly called.
    -                     */
    -                    unpipe(dest) {
    -                        const p = this[PIPES].find(p => p.dest === dest);
    -                        if (p) {
    -                            if (this[PIPES].length === 1) {
    -                                if (this[FLOWING] && this[DATALISTENERS] === 0) {
    -                                    this[FLOWING] = false;
    -                                }
    -                                this[PIPES] = [];
    -                            }
    -                            else
    -                                this[PIPES].splice(this[PIPES].indexOf(p), 1);
    -                            p.unpipe();
    -                        }
    -                    }
    -                    /**
    -                     * Alias for {@link Minipass#on}
    -                     */
    -                    addListener(ev, handler) {
    -                        return this.on(ev, handler);
    -                    }
    -                    /**
    -                     * Mostly identical to `EventEmitter.on`, with the following
    -                     * behavior differences to prevent data loss and unnecessary hangs:
    -                     *
    -                     * - Adding a 'data' event handler will trigger the flow of data
    -                     *
    -                     * - Adding a 'readable' event handler when there is data waiting to be read
    -                     *   will cause 'readable' to be emitted immediately.
    -                     *
    -                     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
    -                     *   already passed will cause the event to be emitted immediately and all
    -                     *   handlers removed.
    -                     *
    -                     * - Adding an 'error' event handler after an error has been emitted will
    -                     *   cause the event to be re-emitted immediately with the error previously
    -                     *   raised.
    -                     */
    -                    on(ev, handler) {
    -                        const ret = super.on(ev, handler);
    -                        if (ev === 'data') {
    -                            this[DISCARDED] = false;
    -                            this[DATALISTENERS]++;
    -                            if (!this[PIPES].length && !this[FLOWING]) {
    -                                this[RESUME]();
    -                            }
    -                        }
    -                        else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {
    -                            super.emit('readable');
    -                        }
    -                        else if (isEndish(ev) && this[EMITTED_END]) {
    -                            super.emit(ev);
    -                            this.removeAllListeners(ev);
    -                        }
    -                        else if (ev === 'error' && this[EMITTED_ERROR]) {
    -                            const h = handler;
    -                            if (this[ASYNC])
    -                                defer(() => h.call(this, this[EMITTED_ERROR]));
    -                            else
    -                                h.call(this, this[EMITTED_ERROR]);
    -                        }
    -                        return ret;
    -                    }
    -                    /**
    -                     * Alias for {@link Minipass#off}
    -                     */
    -                    removeListener(ev, handler) {
    -                        return this.off(ev, handler);
    -                    }
    -                    /**
    -                     * Mostly identical to `EventEmitter.off`
    -                     *
    -                     * If a 'data' event handler is removed, and it was the last consumer
    -                     * (ie, there are no pipe destinations or other 'data' event listeners),
    -                     * then the flow of data will stop until there is another consumer or
    -                     * {@link Minipass#resume} is explicitly called.
    -                     */
    -                    off(ev, handler) {
    -                        const ret = super.off(ev, handler);
    -                        // if we previously had listeners, and now we don't, and we don't
    -                        // have any pipes, then stop the flow, unless it's been explicitly
    -                        // put in a discarded flowing state via stream.resume().
    -                        if (ev === 'data') {
    -                            this[DATALISTENERS] = this.listeners('data').length;
    -                            if (this[DATALISTENERS] === 0 &&
    -                                !this[DISCARDED] &&
    -                                !this[PIPES].length) {
    -                                this[FLOWING] = false;
    -                            }
    -                        }
    -                        return ret;
    -                    }
    -                    /**
    -                     * Mostly identical to `EventEmitter.removeAllListeners`
    -                     *
    -                     * If all 'data' event handlers are removed, and they were the last consumer
    -                     * (ie, there are no pipe destinations), then the flow of data will stop
    -                     * until there is another consumer or {@link Minipass#resume} is explicitly
    -                     * called.
    -                     */
    -                    removeAllListeners(ev) {
    -                        const ret = super.removeAllListeners(ev);
    -                        if (ev === 'data' || ev === undefined) {
    -                            this[DATALISTENERS] = 0;
    -                            if (!this[DISCARDED] && !this[PIPES].length) {
    -                                this[FLOWING] = false;
    -                            }
    -                        }
    -                        return ret;
    -                    }
    -                    /**
    -                     * true if the 'end' event has been emitted
    -                     */
    -                    get emittedEnd() {
    -                        return this[EMITTED_END];
    -                    }
    -                    [MAYBE_EMIT_END]() {
    -                        if (!this[EMITTING_END] &&
    -                            !this[EMITTED_END] &&
    -                            !this[DESTROYED] &&
    -                            this[BUFFER].length === 0 &&
    -                            this[EOF]) {
    -                            this[EMITTING_END] = true;
    -                            this.emit('end');
    -                            this.emit('prefinish');
    -                            this.emit('finish');
    -                            if (this[CLOSED])
    -                                this.emit('close');
    -                            this[EMITTING_END] = false;
    -                        }
    -                    }
    -                    /**
    -                     * Mostly identical to `EventEmitter.emit`, with the following
    -                     * behavior differences to prevent data loss and unnecessary hangs:
    -                     *
    -                     * If the stream has been destroyed, and the event is something other
    -                     * than 'close' or 'error', then `false` is returned and no handlers
    -                     * are called.
    -                     *
    -                     * If the event is 'end', and has already been emitted, then the event
    -                     * is ignored. If the stream is in a paused or non-flowing state, then
    -                     * the event will be deferred until data flow resumes. If the stream is
    -                     * async, then handlers will be called on the next tick rather than
    -                     * immediately.
    -                     *
    -                     * If the event is 'close', and 'end' has not yet been emitted, then
    -                     * the event will be deferred until after 'end' is emitted.
    -                     *
    -                     * If the event is 'error', and an AbortSignal was provided for the stream,
    -                     * and there are no listeners, then the event is ignored, matching the
    -                     * behavior of node core streams in the presense of an AbortSignal.
    -                     *
    -                     * If the event is 'finish' or 'prefinish', then all listeners will be
    -                     * removed after emitting the event, to prevent double-firing.
    -                     */
    -                    emit(ev, ...args) {
    -                        const data = args[0];
    -                        // error and close are only events allowed after calling destroy()
    -                        if (ev !== 'error' &&
    -                            ev !== 'close' &&
    -                            ev !== DESTROYED &&
    -                            this[DESTROYED]) {
    -                            return false;
    -                        }
    -                        else if (ev === 'data') {
    -                            return !this[OBJECTMODE] && !data
    -                                ? false
    -                                : this[ASYNC]
    -                                    ? (defer(() => this[EMITDATA](data)), true)
    -                                    : this[EMITDATA](data);
    -                        }
    -                        else if (ev === 'end') {
    -                            return this[EMITEND]();
    -                        }
    -                        else if (ev === 'close') {
    -                            this[CLOSED] = true;
    -                            // don't emit close before 'end' and 'finish'
    -                            if (!this[EMITTED_END] && !this[DESTROYED])
    -                                return false;
    -                            const ret = super.emit('close');
    -                            this.removeAllListeners('close');
    -                            return ret;
    -                        }
    -                        else if (ev === 'error') {
    -                            this[EMITTED_ERROR] = data;
    -                            super.emit(ERROR, data);
    -                            const ret = !this[SIGNAL] || this.listeners('error').length
    -                                ? super.emit('error', data)
    -                                : false;
    -                            this[MAYBE_EMIT_END]();
    -                            return ret;
    -                        }
    -                        else if (ev === 'resume') {
    -                            const ret = super.emit('resume');
    -                            this[MAYBE_EMIT_END]();
    -                            return ret;
    -                        }
    -                        else if (ev === 'finish' || ev === 'prefinish') {
    -                            const ret = super.emit(ev);
    -                            this.removeAllListeners(ev);
    -                            return ret;
    -                        }
    -                        // Some other unknown event
    -                        const ret = super.emit(ev, ...args);
    -                        this[MAYBE_EMIT_END]();
    -                        return ret;
    -                    }
    -                    [EMITDATA](data) {
    -                        for (const p of this[PIPES]) {
    -                            if (p.dest.write(data) === false)
    -                                this.pause();
    -                        }
    -                        const ret = this[DISCARDED] ? false : super.emit('data', data);
    -                        this[MAYBE_EMIT_END]();
    -                        return ret;
    -                    }
    -                    [EMITEND]() {
    -                        if (this[EMITTED_END])
    -                            return false;
    -                        this[EMITTED_END] = true;
    -                        this.readable = false;
    -                        return this[ASYNC]
    -                            ? (defer(() => this[EMITEND2]()), true)
    -                            : this[EMITEND2]();
    -                    }
    -                    [EMITEND2]() {
    -                        if (this[DECODER]) {
    -                            const data = this[DECODER].end();
    -                            if (data) {
    -                                for (const p of this[PIPES]) {
    -                                    p.dest.write(data);
    -                                }
    -                                if (!this[DISCARDED])
    -                                    super.emit('data', data);
    -                            }
    -                        }
    -                        for (const p of this[PIPES]) {
    -                            p.end();
    -                        }
    -                        const ret = super.emit('end');
    -                        this.removeAllListeners('end');
    -                        return ret;
    -                    }
    -                    /**
    -                     * Return a Promise that resolves to an array of all emitted data once
    -                     * the stream ends.
    -                     */
    -                    async collect() {
    -                        const buf = Object.assign([], {
    -                            dataLength: 0,
    -                        });
    -                        if (!this[OBJECTMODE])
    -                            buf.dataLength = 0;
    -                        // set the promise first, in case an error is raised
    -                        // by triggering the flow here.
    -                        const p = this.promise();
    -                        this.on('data', c => {
    -                            buf.push(c);
    -                            if (!this[OBJECTMODE])
    -                                buf.dataLength += c.length;
    -                        });
    -                        await p;
    -                        return buf;
    -                    }
    -                    /**
    -                     * Return a Promise that resolves to the concatenation of all emitted data
    -                     * once the stream ends.
    -                     *
    -                     * Not allowed on objectMode streams.
    -                     */
    -                    async concat() {
    -                        if (this[OBJECTMODE]) {
    -                            throw new Error('cannot concat in objectMode');
    -                        }
    -                        const buf = await this.collect();
    -                        return (this[ENCODING]
    -                            ? buf.join('')
    -                            : Buffer.concat(buf, buf.dataLength));
    -                    }
    -                    /**
    -                     * Return a void Promise that resolves once the stream ends.
    -                     */
    -                    async promise() {
    -                        return new Promise((resolve, reject) => {
    -                            this.on(DESTROYED, () => reject(new Error('stream destroyed')));
    -                            this.on('error', er => reject(er));
    -                            this.on('end', () => resolve());
    -                        });
    -                    }
    -                    /**
    -                     * Asynchronous `for await of` iteration.
    -                     *
    -                     * This will continue emitting all chunks until the stream terminates.
    -                     */
    -                    [Symbol.asyncIterator]() {
    -                        // set this up front, in case the consumer doesn't call next()
    -                        // right away.
    -                        this[DISCARDED] = false;
    -                        let stopped = false;
    -                        const stop = async () => {
    -                            this.pause();
    -                            stopped = true;
    -                            return { value: undefined, done: true };
    -                        };
    -                        const next = () => {
    -                            if (stopped)
    -                                return stop();
    -                            const res = this.read();
    -                            if (res !== null)
    -                                return Promise.resolve({ done: false, value: res });
    -                            if (this[EOF])
    -                                return stop();
    -                            let resolve;
    -                            let reject;
    -                            const onerr = (er) => {
    -                                this.off('data', ondata);
    -                                this.off('end', onend);
    -                                this.off(DESTROYED, ondestroy);
    -                                stop();
    -                                reject(er);
    -                            };
    -                            const ondata = (value) => {
    -                                this.off('error', onerr);
    -                                this.off('end', onend);
    -                                this.off(DESTROYED, ondestroy);
    -                                this.pause();
    -                                resolve({ value, done: !!this[EOF] });
    -                            };
    -                            const onend = () => {
    -                                this.off('error', onerr);
    -                                this.off('data', ondata);
    -                                this.off(DESTROYED, ondestroy);
    -                                stop();
    -                                resolve({ done: true, value: undefined });
    -                            };
    -                            const ondestroy = () => onerr(new Error('stream destroyed'));
    -                            return new Promise((res, rej) => {
    -                                reject = rej;
    -                                resolve = res;
    -                                this.once(DESTROYED, ondestroy);
    -                                this.once('error', onerr);
    -                                this.once('end', onend);
    -                                this.once('data', ondata);
    -                            });
    -                        };
    -                        return {
    -                            next,
    -                            throw: stop,
    -                            return: stop,
    -                            [Symbol.asyncIterator]() {
    -                                return this;
    -                            },
    -                        };
    -                    }
    -                    /**
    -                     * Synchronous `for of` iteration.
    -                     *
    -                     * The iteration will terminate when the internal buffer runs out, even
    -                     * if the stream has not yet terminated.
    -                     */
    -                    [Symbol.iterator]() {
    -                        // set this up front, in case the consumer doesn't call next()
    -                        // right away.
    -                        this[DISCARDED] = false;
    -                        let stopped = false;
    -                        const stop = () => {
    -                            this.pause();
    -                            this.off(ERROR, stop);
    -                            this.off(DESTROYED, stop);
    -                            this.off('end', stop);
    -                            stopped = true;
    -                            return { done: true, value: undefined };
    -                        };
    -                        const next = () => {
    -                            if (stopped)
    -                                return stop();
    -                            const value = this.read();
    -                            return value === null ? stop() : { done: false, value };
    -                        };
    -                        this.once('end', stop);
    -                        this.once(ERROR, stop);
    -                        this.once(DESTROYED, stop);
    -                        return {
    -                            next,
    -                            throw: stop,
    -                            return: stop,
    -                            [Symbol.iterator]() {
    -                                return this;
    -                            },
    -                        };
    -                    }
    -                    /**
    -                     * Destroy a stream, preventing it from being used for any further purpose.
    -                     *
    -                     * If the stream has a `close()` method, then it will be called on
    -                     * destruction.
    -                     *
    -                     * After destruction, any attempt to write data, read data, or emit most
    -                     * events will be ignored.
    -                     *
    -                     * If an error argument is provided, then it will be emitted in an
    -                     * 'error' event.
    -                     */
    -                    destroy(er) {
    -                        if (this[DESTROYED]) {
    -                            if (er)
    -                                this.emit('error', er);
    -                            else
    -                                this.emit(DESTROYED);
    -                            return this;
    -                        }
    -                        this[DESTROYED] = true;
    -                        this[DISCARDED] = true;
    -                        // throw away all buffered data, it's never coming out
    -                        this[BUFFER].length = 0;
    -                        this[BUFFERLENGTH] = 0;
    -                        const wc = this;
    -                        if (typeof wc.close === 'function' && !this[CLOSED])
    -                            wc.close();
    -                        if (er)
    -                            this.emit('error', er);
    -                        // if no error to emit, still reject pending promises
    -                        else
    -                            this.emit(DESTROYED);
    -                        return this;
    -                    }
    -                    /**
    -                     * Alias for {@link isStream}
    -                     *
    -                     * Former export location, maintained for backwards compatibility.
    -                     *
    -                     * @deprecated
    -                     */
    -                    static get isStream() {
    -                        return exports.isStream;
    -                    }
    -                }
    -                exports.Minipass = Minipass;
    -                //# sourceMappingURL=index.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 7329:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.create = void 0;
    -                const fs_minipass_1 = __nccwpck_require__(675);
    -                const node_path_1 = __importDefault(__nccwpck_require__(9411));
    -                const list_js_1 = __nccwpck_require__(4306);
    -                const make_command_js_1 = __nccwpck_require__(3830);
    -                const pack_js_1 = __nccwpck_require__(7788);
    -                function create(opt_, files, cb) {
    -                    if (typeof files === 'function') {
    -                        cb = files;
    -                    }
    -                    if (Array.isArray(opt_)) {
    -                        ;
    -                        (files = opt_), (opt_ = {});
    -                    }
    -                    if (!files || !Array.isArray(files) || !files.length) {
    -                        throw new TypeError('no files or directories specified');
    -                    }
    -                    files = Array.from(files);
    -                    const opt = (0, options_js_1.dealias)(opt_);
    -                    if (opt.sync && typeof cb === 'function') {
    -                        throw new TypeError('callback not supported for sync tar functions');
    -                    }
    -                    if (!opt.file && typeof cb === 'function') {
    -                        throw new TypeError('callback only supported with file option');
    -                    }
    -                    return (0, options_js_1.isSyncFile)(opt)
    -                        ? createFileSync(opt, files)
    -                        : (0, options_js_1.isFile)(opt)
    -                            ? createFile(opt, files, cb)
    -                            : (0, options_js_1.isSync)(opt)
    -                                ? createSync(opt, files)
    -                                : create_(opt, files);
    -                }
    -                exports.create = create;
    -                const createFileSync = (opt, files) => {
    -                    const p = new pack_js_1.PackSync(opt);
    -                    const stream = new fs_minipass_1.WriteStreamSync(opt.file, {
    -                        mode: opt.mode || 0o666,
    -                    });
    -                    p.pipe(stream);
    -                    addFilesSync(p, files);
    -                };
    -                const createFile = (opt, files) => {
    -                    const p = new pack_js_1.Pack(opt);
    -                    const stream = new fs_minipass_1.WriteStream(opt.file, {
    -                        mode: opt.mode || 0o666,
    -                    });
    -                    p.pipe(stream);
    -                    const promise = new Promise((res, rej) => {
    -                        stream.on('error', rej);
    -                        stream.on('close', res);
    -                        p.on('error', rej);
    -                    });
    -                    addFilesAsync(p, files);
    -                    return promise;
    -                };
    -                const addFilesSync = (p, files) => {
    -                    files.forEach(file => {
    -                        if (file.charAt(0) === '@') {
    -                            (0, list_js_1.list)({
    -                                file: node_path_1.default.resolve(p.cwd, file.slice(1)),
    -                                sync: true,
    -                                noResume: true,
    -                                onReadEntry: entry => p.add(entry),
    -                            });
    -                        }
    -                        else {
    -                            p.add(file);
    -                        }
    -                    });
    -                    p.end();
    -                };
    -                const addFilesAsync = async (p, files) => {
    -                    for (let i = 0; i < files.length; i++) {
    -                        const file = String(files[i]);
    -                        if (file.charAt(0) === '@') {
    -                            await (0, list_js_1.list)({
    -                                file: node_path_1.default.resolve(String(p.cwd), file.slice(1)),
    -                                noResume: true,
    -                                onReadEntry: entry => {
    -                                    p.add(entry);
    -                                },
    -                            });
    -                        }
    -                        else {
    -                            p.add(file);
    -                        }
    -                    }
    -                    p.end();
    -                };
    -                const createSync = (opt, files) => {
    -                    const p = new pack_js_1.PackSync(opt);
    -                    addFilesSync(p, files);
    -                    return p;
    -                };
    -                const createAsync = (opt, files) => {
    -                    const p = new pack_js_1.Pack(opt);
    -                    addFilesAsync(p, files);
    -                    return p;
    -                };
    -                exports.create = (0, make_command_js_1.makeCommand)(createFileSync, createFile, createSync, createAsync, (_opt, files) => {
    -                    if (!files?.length) {
    -                        throw new TypeError('no paths specified to add to archive');
    -                    }
    -                });
    -                //# sourceMappingURL=create.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 6861:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.CwdError = void 0;
    -                class CwdError extends Error {
    -                    path;
    -                    code;
    -                    syscall = 'chdir';
    -                    constructor(path, code) {
    -                        super(`${code}: Cannot cd into '${path}'`);
    -                        this.path = path;
    -                        this.code = code;
    -                    }
    -                    get name() {
    -                        return 'CwdError';
    -                    }
    -                }
    -                exports.CwdError = CwdError;
    -                //# sourceMappingURL=cwd-error.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 2476:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    var desc = Object.getOwnPropertyDescriptor(m, k);
    -                    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    -                        desc = { enumerable: true, get: function () { return m[k]; } };
    -                    }
    -                    Object.defineProperty(o, k2, desc);
    -                }) : (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    o[k2] = m[k];
    -                }));
    -                var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) {
    -                    Object.defineProperty(o, "default", { enumerable: true, value: v });
    -                }) : function (o, v) {
    -                    o["default"] = v;
    -                });
    -                var __importStar = (this && this.__importStar) || function (mod) {
    -                    if (mod && mod.__esModule) return mod;
    -                    var result = {};
    -                    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    -                    __setModuleDefault(result, mod);
    -                    return result;
    -                };
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.extract = void 0;
    -                // tar -x
    -                const fsm = __importStar(__nccwpck_require__(675));
    -                const node_fs_1 = __importDefault(__nccwpck_require__(7561));
    -                const list_js_1 = __nccwpck_require__(4306);
    -                const make_command_js_1 = __nccwpck_require__(3830);
    -                const unpack_js_1 = __nccwpck_require__(6973);
    -                function extract(opt_, files, cb) {
    -                    if (typeof opt_ === 'function') {
    -                        ;
    -                        (cb = opt_), (files = undefined), (opt_ = {});
    -                    }
    -                    else if (Array.isArray(opt_)) {
    -                        ;
    -                        (files = opt_), (opt_ = {});
    -                    }
    -                    if (typeof files === 'function') {
    -                        ;
    -                        (cb = files), (files = undefined);
    -                    }
    -                    if (!files) {
    -                        files = [];
    -                    }
    -                    else {
    -                        files = Array.from(files);
    -                    }
    -                    const opt = (0, options_js_1.dealias)(opt_);
    -                    if (opt.sync && typeof cb === 'function') {
    -                        throw new TypeError('callback not supported for sync tar functions');
    -                    }
    -                    if (!opt.file && typeof cb === 'function') {
    -                        throw new TypeError('callback only supported with file option');
    -                    }
    -                    if (files.length) {
    -                        filesFilter(opt, files);
    -                    }
    -                    return (0, options_js_1.isSyncFile)(opt)
    -                        ? extractFileSync(opt)
    -                        : (0, options_js_1.isFile)(opt)
    -                            ? extractFile(opt, cb)
    -                            : (0, options_js_1.isSync)(opt)
    -                                ? extractSync(opt)
    -                                : extract_(opt);
    -                }
    -                exports.extract = extract;
    -                // construct a filter that limits the file entries listed
    -                // include child entries if a dir is included
    -                const filesFilter = (opt, files) => {
    -                    const map = new Map(files.map(f => [(0, strip_trailing_slashes_js_1.stripTrailingSlashes)(f), true]));
    -                    const filter = opt.filter;
    -                    const mapHas = (file, r = '') => {
    -                        const root = r || (0, node_path_1.parse)(file).root || '.';
    -                        let ret;
    -                        if (file === root)
    -                            ret = false;
    -                        else {
    -                            const m = map.get(file);
    -                            if (m !== undefined) {
    -                                ret = m;
    -                            }
    -                            else {
    -                                ret = mapHas((0, node_path_1.dirname)(file), root);
    -                            }
    -                        }
    -                        map.set(file, ret);
    -                        return ret;
    -                    };
    -                    opt.filter = filter
    -                        ? (file, entry) => filter(file, entry) && mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file))
    -                        : file => mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file));
    -                };
    -                const extractFileSync = (opt) => {
    -                    const u = new unpack_js_1.UnpackSync(opt);
    -                    const file = opt.file;
    -                    const stat = node_fs_1.default.statSync(file);
    -                    // This trades a zero-byte read() syscall for a stat
    -                    // However, it will usually result in less memory allocation
    -                    const readSize = opt.maxReadSize || 16 * 1024 * 1024;
    -                    const stream = new fsm.ReadStreamSync(file, {
    -                        readSize: readSize,
    -                        size: stat.size,
    -                    });
    -                    stream.pipe(u);
    -                };
    -                const extractFile = (opt, _) => {
    -                    const u = new unpack_js_1.Unpack(opt);
    -                    const readSize = opt.maxReadSize || 16 * 1024 * 1024;
    -                    const file = opt.file;
    -                    const p = new Promise((resolve, reject) => {
    -                        u.on('error', reject);
    -                        u.on('close', resolve);
    -                        // This trades a zero-byte read() syscall for a stat
    -                        // However, it will usually result in less memory allocation
    -                        node_fs_1.default.stat(file, (er, stat) => {
    -                            if (er) {
    -                                reject(er);
    -                            }
    -                            else {
    -                                const stream = new fsm.ReadStream(file, {
    -                                    readSize: readSize,
    -                                    size: stat.size,
    -                                });
    -                                stream.on('error', reject);
    -                                stream.pipe(u);
    -                            }
    -                        });
    -                    });
    -                    return p;
    -                };
    -                exports.extract = (0, make_command_js_1.makeCommand)(extractFileSync, extractFile, opt => new unpack_js_1.UnpackSync(opt), opt => new unpack_js_1.Unpack(opt), (opt, files) => {
    -                    if (files?.length)
    -                        (0, list_js_1.filesFilter)(opt, files);
    -                });
    -                //# sourceMappingURL=extract.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 1663:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                // Get the appropriate flag to use for creating files
    -                // We use fmap on Windows platforms for files less than
    -                // 512kb.  This is a fairly low limit, but avoids making
    -                // things slower in some cases.  Since most of what this
    -                // library is used for is extracting tarballs of many
    -                // relatively small files in npm packages and the like,
    -                // it can be a big boost on Windows platforms.
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.getWriteFlag = void 0;
    -                const fs_1 = __importDefault(__nccwpck_require__(7147));
    -                const platform = process.env.__FAKE_PLATFORM__ || process.platform;
    -                const isWindows = platform === 'win32';
    -                /* c8 ignore start */
    -                const { O_CREAT, O_TRUNC, O_WRONLY } = fs_1.default.constants;
    -                const UV_FS_O_FILEMAP = Number(process.env.__FAKE_FS_O_FILENAME__) ||
    -                    fs_1.default.constants.UV_FS_O_FILEMAP ||
    -                    0;
    -                /* c8 ignore stop */
    -                const fMapEnabled = isWindows && !!UV_FS_O_FILEMAP;
    -                const fMapLimit = 512 * 1024;
    -                const fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY;
    -                exports.getWriteFlag = !fMapEnabled ?
    -                    () => 'w'
    -                    : (size) => (size < fMapLimit ? fMapFlag : 'w');
    -                //# sourceMappingURL=get-write-flag.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 2374:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                // parse a 512-byte header block to a data object, or vice-versa
    -                // encode returns `true` if a pax extended header is needed, because
    -                // the data could not be faithfully encoded in a simple header.
    -                // (Also, check header.needPax to see if it needs a pax header.)
    -                var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    var desc = Object.getOwnPropertyDescriptor(m, k);
    -                    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    -                        desc = { enumerable: true, get: function () { return m[k]; } };
    -                    }
    -                    Object.defineProperty(o, k2, desc);
    -                }) : (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    o[k2] = m[k];
    -                }));
    -                var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) {
    -                    Object.defineProperty(o, "default", { enumerable: true, value: v });
    -                }) : function (o, v) {
    -                    o["default"] = v;
    -                });
    -                var __importStar = (this && this.__importStar) || function (mod) {
    -                    if (mod && mod.__esModule) return mod;
    -                    var result = {};
    -                    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    -                    __setModuleDefault(result, mod);
    -                    return result;
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.Header = void 0;
    -                const node_path_1 = __nccwpck_require__(9411);
    -                const large = __importStar(__nccwpck_require__(8520));
    -                const types = __importStar(__nccwpck_require__(7390));
    -                class Header {
    -                    cksumValid = false;
    -                    needPax = false;
    -                    nullBlock = false;
    -                    block;
    -                    path;
    -                    mode;
    -                    uid;
    -                    gid;
    -                    size;
    -                    cksum;
    -                    #type = 'Unsupported';
    -                    linkpath;
    -                    uname;
    -                    gname;
    -                    devmaj = 0;
    -                    devmin = 0;
    -                    atime;
    -                    ctime;
    -                    mtime;
    -                    charset;
    -                    comment;
    -                    constructor(data, off = 0, ex, gex) {
    -                        if (Buffer.isBuffer(data)) {
    -                            this.decode(data, off || 0, ex, gex);
    -                        }
    -                        else if (data) {
    -                            this.#slurp(data);
    -                        }
    -                    }
    -                    decode(buf, off, ex, gex) {
    -                        if (!off) {
    -                            off = 0;
    -                        }
    -                        if (!buf || !(buf.length >= off + 512)) {
    -                            throw new Error('need 512 bytes for header');
    -                        }
    -                        this.path = decString(buf, off, 100);
    -                        this.mode = decNumber(buf, off + 100, 8);
    -                        this.uid = decNumber(buf, off + 108, 8);
    -                        this.gid = decNumber(buf, off + 116, 8);
    -                        this.size = decNumber(buf, off + 124, 12);
    -                        this.mtime = decDate(buf, off + 136, 12);
    -                        this.cksum = decNumber(buf, off + 148, 12);
    -                        // if we have extended or global extended headers, apply them now
    -                        // See https://github.com/npm/node-tar/pull/187
    -                        // Apply global before local, so it overrides
    -                        if (gex)
    -                            this.#slurp(gex, true);
    -                        if (ex)
    -                            this.#slurp(ex);
    -                        // old tar versions marked dirs as a file with a trailing /
    -                        const t = decString(buf, off + 156, 1);
    -                        if (types.isCode(t)) {
    -                            this.#type = t || '0';
    -                        }
    -                        if (this.#type === '0' && this.path.slice(-1) === '/') {
    -                            this.#type = '5';
    -                        }
    -                        // tar implementations sometimes incorrectly put the stat(dir).size
    -                        // as the size in the tarball, even though Directory entries are
    -                        // not able to have any body at all.  In the very rare chance that
    -                        // it actually DOES have a body, we weren't going to do anything with
    -                        // it anyway, and it'll just be a warning about an invalid header.
    -                        if (this.#type === '5') {
    -                            this.size = 0;
    -                        }
    -                        this.linkpath = decString(buf, off + 157, 100);
    -                        if (buf.subarray(off + 257, off + 265).toString() ===
    -                            'ustar\u000000') {
    -                            this.uname = decString(buf, off + 265, 32);
    -                            this.gname = decString(buf, off + 297, 32);
    -                            /* c8 ignore start */
    -                            this.devmaj = decNumber(buf, off + 329, 8) ?? 0;
    -                            this.devmin = decNumber(buf, off + 337, 8) ?? 0;
    -                            /* c8 ignore stop */
    -                            if (buf[off + 475] !== 0) {
    -                                // definitely a prefix, definitely >130 chars.
    -                                const prefix = decString(buf, off + 345, 155);
    -                                this.path = prefix + '/' + this.path;
    -                            }
    -                            else {
    -                                const prefix = decString(buf, off + 345, 130);
    -                                if (prefix) {
    -                                    this.path = prefix + '/' + this.path;
    -                                }
    -                                this.atime = decDate(buf, off + 476, 12);
    -                                this.ctime = decDate(buf, off + 488, 12);
    -                            }
    -                        }
    -                        let sum = 8 * 0x20;
    -                        for (let i = off; i < off + 148; i++) {
    -                            sum += buf[i];
    -                        }
    -                        for (let i = off + 156; i < off + 512; i++) {
    -                            sum += buf[i];
    -                        }
    -                        this.cksumValid = sum === this.cksum;
    -                        if (this.cksum === undefined && sum === 8 * 0x20) {
    -                            this.nullBlock = true;
    -                        }
    -                    }
    -                    #slurp(ex, gex = false) {
    -                        Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => {
    -                            // we slurp in everything except for the path attribute in
    -                            // a global extended header, because that's weird. Also, any
    -                            // null/undefined values are ignored.
    -                            return !(v === null ||
    -                                v === undefined ||
    -                                (k === 'path' && gex) ||
    -                                (k === 'linkpath' && gex) ||
    -                                k === 'global');
    -                        })));
    -                    }
    -                    encode(buf, off = 0) {
    -                        if (!buf) {
    -                            buf = this.block = Buffer.alloc(512);
    -                        }
    -                        if (this.#type === 'Unsupported') {
    -                            this.#type = '0';
    -                        }
    -                        if (!(buf.length >= off + 512)) {
    -                            throw new Error('need 512 bytes for header');
    -                        }
    -                        const prefixSize = this.ctime || this.atime ? 130 : 155;
    -                        const split = splitPrefix(this.path || '', prefixSize);
    -                        const path = split[0];
    -                        const prefix = split[1];
    -                        this.needPax = !!split[2];
    -                        this.needPax = encString(buf, off, 100, path) || this.needPax;
    -                        this.needPax =
    -                            encNumber(buf, off + 100, 8, this.mode) || this.needPax;
    -                        this.needPax =
    -                            encNumber(buf, off + 108, 8, this.uid) || this.needPax;
    -                        this.needPax =
    -                            encNumber(buf, off + 116, 8, this.gid) || this.needPax;
    -                        this.needPax =
    -                            encNumber(buf, off + 124, 12, this.size) || this.needPax;
    -                        this.needPax =
    -                            encDate(buf, off + 136, 12, this.mtime) || this.needPax;
    -                        buf[off + 156] = this.#type.charCodeAt(0);
    -                        this.needPax =
    -                            encString(buf, off + 157, 100, this.linkpath) || this.needPax;
    -                        buf.write('ustar\u000000', off + 257, 8);
    -                        this.needPax =
    -                            encString(buf, off + 265, 32, this.uname) || this.needPax;
    -                        this.needPax =
    -                            encString(buf, off + 297, 32, this.gname) || this.needPax;
    -                        this.needPax =
    -                            encNumber(buf, off + 329, 8, this.devmaj) || this.needPax;
    -                        this.needPax =
    -                            encNumber(buf, off + 337, 8, this.devmin) || this.needPax;
    -                        this.needPax =
    -                            encString(buf, off + 345, prefixSize, prefix) || this.needPax;
    -                        if (buf[off + 475] !== 0) {
    -                            this.needPax =
    -                                encString(buf, off + 345, 155, prefix) || this.needPax;
    -                        }
    -                        else {
    -                            this.needPax =
    -                                encString(buf, off + 345, 130, prefix) || this.needPax;
    -                            this.needPax =
    -                                encDate(buf, off + 476, 12, this.atime) || this.needPax;
    -                            this.needPax =
    -                                encDate(buf, off + 488, 12, this.ctime) || this.needPax;
    -                        }
    -                        let sum = 8 * 0x20;
    -                        for (let i = off; i < off + 148; i++) {
    -                            sum += buf[i];
    -                        }
    -                        for (let i = off + 156; i < off + 512; i++) {
    -                            sum += buf[i];
    -                        }
    -                        this.cksum = sum;
    -                        encNumber(buf, off + 148, 8, this.cksum);
    -                        this.cksumValid = true;
    -                        return this.needPax;
    -                    }
    -                    get type() {
    -                        return (this.#type === 'Unsupported' ?
    -                            this.#type
    -                            : types.name.get(this.#type));
    -                    }
    -                    get typeKey() {
    -                        return this.#type;
    -                    }
    -                    set type(type) {
    -                        const c = String(types.code.get(type));
    -                        if (types.isCode(c) || c === 'Unsupported') {
    -                            this.#type = c;
    -                        }
    -                        else if (types.isCode(type)) {
    -                            this.#type = type;
    -                        }
    -                        else {
    -                            throw new TypeError('invalid entry type: ' + type);
    -                        }
    -                    }
    -                }
    -                exports.Header = Header;
    -                const splitPrefix = (p, prefixSize) => {
    -                    const pathSize = 100;
    -                    let pp = p;
    -                    let prefix = '';
    -                    let ret = undefined;
    -                    const root = node_path_1.posix.parse(p).root || '.';
    -                    if (Buffer.byteLength(pp) < pathSize) {
    -                        ret = [pp, prefix, false];
    -                    }
    -                    else {
    -                        // first set prefix to the dir, and path to the base
    -                        prefix = node_path_1.posix.dirname(pp);
    -                        pp = node_path_1.posix.basename(pp);
    -                        do {
    -                            if (Buffer.byteLength(pp) <= pathSize &&
    -                                Buffer.byteLength(prefix) <= prefixSize) {
    -                                // both fit!
    -                                ret = [pp, prefix, false];
    -                            }
    -                            else if (Buffer.byteLength(pp) > pathSize &&
    -                                Buffer.byteLength(prefix) <= prefixSize) {
    -                                // prefix fits in prefix, but path doesn't fit in path
    -                                ret = [pp.slice(0, pathSize - 1), prefix, true];
    -                            }
    -                            else {
    -                                // make path take a bit from prefix
    -                                pp = node_path_1.posix.join(node_path_1.posix.basename(prefix), pp);
    -                                prefix = node_path_1.posix.dirname(prefix);
    -                            }
    -                        } while (prefix !== root && ret === undefined);
    -                        // at this point, found no resolution, just truncate
    -                        if (!ret) {
    -                            ret = [p.slice(0, pathSize - 1), '', true];
    -                        }
    -                    }
    -                    return ret;
    -                };
    -                const decString = (buf, off, size) => buf
    -                    .subarray(off, off + size)
    -                    .toString('utf8')
    -                    .replace(/\0.*/, '');
    -                const decDate = (buf, off, size) => numToDate(decNumber(buf, off, size));
    -                const numToDate = (num) => num === undefined ? undefined : new Date(num * 1000);
    -                const decNumber = (buf, off, size) => Number(buf[off]) & 0x80 ?
    -                    large.parse(buf.subarray(off, off + size))
    -                    : decSmallNumber(buf, off, size);
    -                const nanUndef = (value) => (isNaN(value) ? undefined : value);
    -                const decSmallNumber = (buf, off, size) => nanUndef(parseInt(buf
    -                    .subarray(off, off + size)
    -                    .toString('utf8')
    -                    .replace(/\0.*$/, '')
    -                    .trim(), 8));
    -                // the maximum encodable as a null-terminated octal, by field size
    -                const MAXNUM = {
    -                    12: 0o77777777777,
    -                    8: 0o7777777,
    -                };
    -                const encNumber = (buf, off, size, num) => num === undefined ? false
    -                    : num > MAXNUM[size] || num < 0 ?
    -                        (large.encode(num, buf.subarray(off, off + size)), true)
    -                        : (encSmallNumber(buf, off, size, num), false);
    -                const encSmallNumber = (buf, off, size, num) => buf.write(octalString(num, size), off, size, 'ascii');
    -                const octalString = (num, size) => padOctal(Math.floor(num).toString(8), size);
    -                const padOctal = (str, size) => (str.length === size - 1 ?
    -                    str
    -                    : new Array(size - str.length - 1).join('0') + str + ' ') + '\0';
    -                const encDate = (buf, off, size, date) => date === undefined ? false : (encNumber(buf, off, size, date.getTime() / 1000));
    -                // enough to fill the longest string we've got
    -                const NULLS = new Array(156).join('\0');
    -                // pad with nulls, return true if it's longer or non-ascii
    -                const encString = (buf, off, size, str) => str === undefined ? false : ((buf.write(str + NULLS, off, size, 'utf8'),
    -                    str.length !== Buffer.byteLength(str) || str.length > size));
    -                //# sourceMappingURL=header.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 6630:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    var desc = Object.getOwnPropertyDescriptor(m, k);
    -                    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    -                        desc = { enumerable: true, get: function () { return m[k]; } };
    -                    }
    -                    Object.defineProperty(o, k2, desc);
    -                }) : (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    o[k2] = m[k];
    -                }));
    -                var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) {
    -                    Object.defineProperty(o, "default", { enumerable: true, value: v });
    -                }) : function (o, v) {
    -                    o["default"] = v;
    -                });
    -                var __exportStar = (this && this.__exportStar) || function (m, exports) {
    -                    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
    -                };
    -                var __importStar = (this && this.__importStar) || function (mod) {
    -                    if (mod && mod.__esModule) return mod;
    -                    var result = {};
    -                    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    -                    __setModuleDefault(result, mod);
    -                    return result;
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.u = exports.types = exports.r = exports.t = exports.x = exports.c = void 0;
    -                __exportStar(__nccwpck_require__(7329), exports);
    -                var create_js_1 = __nccwpck_require__(7329);
    -                Object.defineProperty(exports, "c", ({ enumerable: true, get: function () { return create_js_1.create; } }));
    -                __exportStar(__nccwpck_require__(2476), exports);
    -                var extract_js_1 = __nccwpck_require__(2476);
    -                Object.defineProperty(exports, "x", ({ enumerable: true, get: function () { return extract_js_1.extract; } }));
    -                __exportStar(__nccwpck_require__(2374), exports);
    -                __exportStar(__nccwpck_require__(4306), exports);
    -                var list_js_1 = __nccwpck_require__(4306);
    -                Object.defineProperty(exports, "t", ({ enumerable: true, get: function () { return list_js_1.list; } }));
    -                // classes
    -                __exportStar(__nccwpck_require__(7788), exports);
    -                __exportStar(__nccwpck_require__(2522), exports);
    -                __exportStar(__nccwpck_require__(8567), exports);
    -                __exportStar(__nccwpck_require__(7369), exports);
    -                __exportStar(__nccwpck_require__(5478), exports);
    -                var replace_js_1 = __nccwpck_require__(5478);
    -                Object.defineProperty(exports, "r", ({ enumerable: true, get: function () { return replace_js_1.replace; } }));
    -                exports.types = __importStar(__nccwpck_require__(7390));
    -                __exportStar(__nccwpck_require__(6973), exports);
    -                __exportStar(__nccwpck_require__(8780), exports);
    -                var update_js_1 = __nccwpck_require__(8780);
    -                Object.defineProperty(exports, "u", ({ enumerable: true, get: function () { return update_js_1.update; } }));
    -                __exportStar(__nccwpck_require__(4028), exports);
    -                //# sourceMappingURL=index.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 8520:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                // Tar can encode large and negative numbers using a leading byte of
    -                // 0xff for negative, and 0x80 for positive.
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.parse = exports.encode = void 0;
    -                const encode = (num, buf) => {
    -                    if (!Number.isSafeInteger(num)) {
    -                        // The number is so large that javascript cannot represent it with integer
    -                        // precision.
    -                        throw Error('cannot encode number outside of javascript safe integer range');
    -                    }
    -                    else if (num < 0) {
    -                        encodeNegative(num, buf);
    -                    }
    -                    else {
    -                        encodePositive(num, buf);
    -                    }
    -                    return buf;
    -                };
    -                exports.encode = encode;
    -                const encodePositive = (num, buf) => {
    -                    buf[0] = 0x80;
    -                    for (var i = buf.length; i > 1; i--) {
    -                        buf[i - 1] = num & 0xff;
    -                        num = Math.floor(num / 0x100);
    -                    }
    -                };
    -                const encodeNegative = (num, buf) => {
    -                    buf[0] = 0xff;
    -                    var flipped = false;
    -                    num = num * -1;
    -                    for (var i = buf.length; i > 1; i--) {
    -                        var byte = num & 0xff;
    -                        num = Math.floor(num / 0x100);
    -                        if (flipped) {
    -                            buf[i - 1] = onesComp(byte);
    -                        }
    -                        else if (byte === 0) {
    -                            buf[i - 1] = 0;
    -                        }
    -                        else {
    -                            flipped = true;
    -                            buf[i - 1] = twosComp(byte);
    -                        }
    -                    }
    -                };
    -                const parse = (buf) => {
    -                    const pre = buf[0];
    -                    const value = pre === 0x80 ? pos(buf.subarray(1, buf.length))
    -                        : pre === 0xff ? twos(buf)
    -                            : null;
    -                    if (value === null) {
    -                        throw Error('invalid base256 encoding');
    -                    }
    -                    if (!Number.isSafeInteger(value)) {
    -                        // The number is so large that javascript cannot represent it with integer
    -                        // precision.
    -                        throw Error('parsed number outside of javascript safe integer range');
    -                    }
    -                    return value;
    -                };
    -                exports.parse = parse;
    -                const twos = (buf) => {
    -                    var len = buf.length;
    -                    var sum = 0;
    -                    var flipped = false;
    -                    for (var i = len - 1; i > -1; i--) {
    -                        var byte = Number(buf[i]);
    -                        var f;
    -                        if (flipped) {
    -                            f = onesComp(byte);
    -                        }
    -                        else if (byte === 0) {
    -                            f = byte;
    -                        }
    -                        else {
    -                            flipped = true;
    -                            f = twosComp(byte);
    -                        }
    -                        if (f !== 0) {
    -                            sum -= f * Math.pow(256, len - i - 1);
    -                        }
    -                    }
    -                    return sum;
    -                };
    -                const pos = (buf) => {
    -                    var len = buf.length;
    -                    var sum = 0;
    -                    for (var i = len - 1; i > -1; i--) {
    -                        var byte = Number(buf[i]);
    -                        if (byte !== 0) {
    -                            sum += byte * Math.pow(256, len - i - 1);
    -                        }
    -                    }
    -                    return sum;
    -                };
    -                const onesComp = (byte) => (0xff ^ byte) & 0xff;
    -                const twosComp = (byte) => ((0xff ^ byte) + 1) & 0xff;
    -                //# sourceMappingURL=large-numbers.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 4306:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    var desc = Object.getOwnPropertyDescriptor(m, k);
    -                    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    -                        desc = { enumerable: true, get: function () { return m[k]; } };
    -                    }
    -                    Object.defineProperty(o, k2, desc);
    -                }) : (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    o[k2] = m[k];
    -                }));
    -                var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) {
    -                    Object.defineProperty(o, "default", { enumerable: true, value: v });
    -                }) : function (o, v) {
    -                    o["default"] = v;
    -                });
    -                var __importStar = (this && this.__importStar) || function (mod) {
    -                    if (mod && mod.__esModule) return mod;
    -                    var result = {};
    -                    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    -                    __setModuleDefault(result, mod);
    -                    return result;
    -                };
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.list = exports.filesFilter = void 0;
    -                // tar -t
    -                const fsm = __importStar(__nccwpck_require__(675));
    -                const node_fs_1 = __importDefault(__nccwpck_require__(7561));
    -                const path_1 = __nccwpck_require__(1017);
    -                const make_command_js_1 = __nccwpck_require__(3830);
    -                const parse_js_1 = __nccwpck_require__(2522);
    -                const strip_trailing_slashes_js_1 = __nccwpck_require__(6018);
    -                function list(opt_, files, cb) {
    -                    if (typeof opt_ === 'function') {
    -                        ;
    -                        (cb = opt_), (files = undefined), (opt_ = {});
    -                    }
    -                    else if (Array.isArray(opt_)) {
    -                        ;
    -                        (files = opt_), (opt_ = {});
    -                    }
    -                    if (typeof files === 'function') {
    -                        ;
    -                        (cb = files), (files = undefined);
    -                    }
    -                    if (!files) {
    -                        files = [];
    -                    }
    -                    else {
    -                        files = Array.from(files);
    -                    }
    -                    const opt = (0, options_js_1.dealias)(opt_);
    -                    if (opt.sync && typeof cb === 'function') {
    -                        throw new TypeError('callback not supported for sync tar functions');
    -                    }
    -                    if (!opt.file && typeof cb === 'function') {
    -                        throw new TypeError('callback only supported with file option');
    -                    }
    -                    if (files.length) {
    -                        filesFilter(opt, files);
    -                    }
    -                    if (!opt.noResume) {
    -                        onentryFunction(opt);
    -                    }
    -                    return (0, options_js_1.isSyncFile)(opt)
    -                        ? listFileSync(opt)
    -                        : (0, options_js_1.isFile)(opt)
    -                            ? listFile(opt, cb)
    -                            : list_(opt);
    -                }
    -                exports.list = list;
    -                const onentryFunction = (opt) => {
    -                    const onentry = opt.onentry;
    -                    opt.onentry = onentry
    -                        ? e => {
    -                            onentry(e);
    -                            e.resume();
    -                        }
    -                        : e => e.resume();
    -                };
    -                // construct a filter that limits the file entries listed
    -                // include child entries if a dir is included
    -                const filesFilter = (opt, files) => {
    -                    const map = new Map(files.map(f => [(0, strip_trailing_slashes_js_1.stripTrailingSlashes)(f), true]));
    -                    const filter = opt.filter;
    -                    const mapHas = (file, r = '') => {
    -                        const root = r || (0, path_1.parse)(file).root || '.';
    -                        let ret;
    -                        if (file === root)
    -                            ret = false;
    -                        else {
    -                            const m = map.get(file);
    -                            if (m !== undefined) {
    -                                ret = m;
    -                            }
    -                            else {
    -                                ret = mapHas((0, path_1.dirname)(file), root);
    -                            }
    -                        }
    -                        map.set(file, ret);
    -                        return ret;
    -                    };
    -                    opt.filter =
    -                        filter ?
    -                            (file, entry) => filter(file, entry) && mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file))
    -                            : file => mapHas((0, strip_trailing_slashes_js_1.stripTrailingSlashes)(file));
    -                };
    -                exports.filesFilter = filesFilter;
    -                const listFileSync = (opt) => {
    -                    const p = new parse_js_1.Parser(opt);
    -                    const file = opt.file;
    -                    let fd;
    -                    try {
    -                        const stat = node_fs_1.default.statSync(file);
    -                        const readSize = opt.maxReadSize || 16 * 1024 * 1024;
    -                        if (stat.size < readSize) {
    -                            p.end(node_fs_1.default.readFileSync(file));
    -                        }
    -                        else {
    -                            let pos = 0;
    -                            const buf = Buffer.allocUnsafe(readSize);
    -                            fd = node_fs_1.default.openSync(file, 'r');
    -                            while (pos < stat.size) {
    -                                const bytesRead = node_fs_1.default.readSync(fd, buf, 0, readSize, pos);
    -                                pos += bytesRead;
    -                                p.write(buf.subarray(0, bytesRead));
    -                            }
    -                            p.end();
    -                        }
    -                    }
    -                    finally {
    -                        if (typeof fd === 'number') {
    -                            try {
    -                                node_fs_1.default.closeSync(fd);
    -                                /* c8 ignore next */
    -                            }
    -                            catch (er) { }
    -                        }
    -                    }
    -                };
    -                const listFile = (opt, _files) => {
    -                    const parse = new parse_js_1.Parser(opt);
    -                    const readSize = opt.maxReadSize || 16 * 1024 * 1024;
    -                    const file = opt.file;
    -                    const p = new Promise((resolve, reject) => {
    -                        parse.on('error', reject);
    -                        parse.on('end', resolve);
    -                        node_fs_1.default.stat(file, (er, stat) => {
    -                            if (er) {
    -                                reject(er);
    -                            }
    -                            else {
    -                                const stream = new fsm.ReadStream(file, {
    -                                    readSize: readSize,
    -                                    size: stat.size,
    -                                });
    -                                stream.on('error', reject);
    -                                stream.pipe(parse);
    -                            }
    -                        });
    -                    });
    -                    return p;
    -                };
    -                exports.list = (0, make_command_js_1.makeCommand)(listFileSync, listFile, opt => new parse_js_1.Parser(opt), opt => new parse_js_1.Parser(opt), (opt, files) => {
    -                    if (files?.length)
    -                        (0, exports.filesFilter)(opt, files);
    -                    if (!opt.noResume)
    -                        onReadEntryFunction(opt);
    -                });
    -                //# sourceMappingURL=list.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 3830:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.makeCommand = void 0;
    -                const options_js_1 = __nccwpck_require__(9060);
    -                const makeCommand = (syncFile, asyncFile, syncNoFile, asyncNoFile, validate) => {
    -                    return Object.assign((opt_ = [], entries, cb) => {
    -                        if (Array.isArray(opt_)) {
    -                            entries = opt_;
    -                            opt_ = {};
    -                        }
    -                        if (typeof entries === 'function') {
    -                            cb = entries;
    -                            entries = undefined;
    -                        }
    -                        if (!entries) {
    -                            entries = [];
    -                        }
    -                        else {
    -                            entries = Array.from(entries);
    -                        }
    -                        const opt = (0, options_js_1.dealias)(opt_);
    -                        validate?.(opt, entries);
    -                        if ((0, options_js_1.isSyncFile)(opt)) {
    -                            if (typeof cb === 'function') {
    -                                throw new TypeError('callback not supported for sync tar functions');
    -                            }
    -                            return syncFile(opt, entries);
    -                        }
    -                        else if ((0, options_js_1.isAsyncFile)(opt)) {
    -                            const p = asyncFile(opt, entries);
    -                            // weirdness to make TS happy
    -                            const c = cb ? cb : undefined;
    -                            return c ? p.then(() => c(), c) : p;
    -                        }
    -                        else if ((0, options_js_1.isSyncNoFile)(opt)) {
    -                            if (typeof cb === 'function') {
    -                                throw new TypeError('callback not supported for sync tar functions');
    -                            }
    -                            return syncNoFile(opt, entries);
    -                        }
    -                        else if ((0, options_js_1.isAsyncNoFile)(opt)) {
    -                            if (typeof cb === 'function') {
    -                                throw new TypeError('callback only supported with file option');
    -                            }
    -                            return asyncNoFile(opt, entries);
    -                            /* c8 ignore start */
    -                        }
    -                        else {
    -                            throw new Error('impossible options??');
    -                        }
    -                        /* c8 ignore stop */
    -                    }, {
    -                        syncFile,
    -                        asyncFile,
    -                        syncNoFile,
    -                        asyncNoFile,
    -                        validate,
    -                    });
    -                };
    -                exports.makeCommand = makeCommand;
    -                //# sourceMappingURL=make-command.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 8704:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.mkdirSync = exports.mkdir = void 0;
    -                const chownr_1 = __nccwpck_require__(235);
    -                const fs_1 = __importDefault(__nccwpck_require__(7147));
    -                const mkdirp_1 = __nccwpck_require__(7280);
    -                const node_path_1 = __importDefault(__nccwpck_require__(9411));
    -                const cwd_error_js_1 = __nccwpck_require__(6861);
    -                const normalize_windows_path_js_1 = __nccwpck_require__(762);
    -                const symlink_error_js_1 = __nccwpck_require__(3012);
    -                const cGet = (cache, key) => cache.get((0, normalize_windows_path_js_1.normalizeWindowsPath)(key));
    -                const cSet = (cache, key, val) => cache.set((0, normalize_windows_path_js_1.normalizeWindowsPath)(key), val);
    -                const checkCwd = (dir, cb) => {
    -                    fs_1.default.stat(dir, (er, st) => {
    -                        if (er || !st.isDirectory()) {
    -                            er = new cwd_error_js_1.CwdError(dir, er?.code || 'ENOTDIR');
    -                        }
    -                        cb(er);
    -                    });
    -                };
    -                /**
    -                 * Wrapper around mkdirp for tar's needs.
    -                 *
    -                 * The main purpose is to avoid creating directories if we know that
    -                 * they already exist (and track which ones exist for this purpose),
    -                 * and prevent entries from being extracted into symlinked folders,
    -                 * if `preservePaths` is not set.
    -                 */
    -                const mkdir = (dir, opt, cb) => {
    -                    dir = (0, normalize_windows_path_js_1.normalizeWindowsPath)(dir);
    -                    // if there's any overlap between mask and mode,
    -                    // then we'll need an explicit chmod
    -                    /* c8 ignore next */
    -                    const umask = opt.umask ?? 0o22;
    -                    const mode = opt.mode | 0o0700;
    -                    const needChmod = (mode & umask) !== 0;
    -                    const uid = opt.uid;
    -                    const gid = opt.gid;
    -                    const doChown = typeof uid === 'number' &&
    -                        typeof gid === 'number' &&
    -                        (uid !== opt.processUid || gid !== opt.processGid);
    -                    const preserve = opt.preserve;
    -                    const unlink = opt.unlink;
    -                    const cache = opt.cache;
    -                    const cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.cwd);
    -                    const done = (er, created) => {
    -                        if (er) {
    -                            cb(er);
    -                        }
    -                        else {
    -                            cSet(cache, dir, true);
    -                            if (created && doChown) {
    -                                (0, chownr_1.chownr)(created, uid, gid, er => done(er));
    -                            }
    -                            else if (needChmod) {
    -                                fs_1.default.chmod(dir, mode, cb);
    -                            }
    -                            else {
    -                                cb();
    -                            }
    -                        }
    -                    };
    -                    if (cache && cGet(cache, dir) === true) {
    -                        return done();
    -                    }
    -                    if (dir === cwd) {
    -                        return checkCwd(dir, done);
    -                    }
    -                    if (preserve) {
    -                        return (0, mkdirp_1.mkdirp)(dir, { mode }).then(made => done(null, made ?? undefined), // oh, ts
    -                            done);
    -                    }
    -                    const sub = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.relative(cwd, dir));
    -                    const parts = sub.split('/');
    -                    mkdir_(cwd, parts, mode, cache, unlink, cwd, undefined, done);
    -                };
    -                exports.mkdir = mkdir;
    -                const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => {
    -                    if (!parts.length) {
    -                        return cb(null, created);
    -                    }
    -                    const p = parts.shift();
    -                    const part = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(base + '/' + p));
    -                    if (cGet(cache, part)) {
    -                        return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb);
    -                    }
    -                    fs_1.default.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb));
    -                };
    -                const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => (er) => {
    -                    if (er) {
    -                        fs_1.default.lstat(part, (statEr, st) => {
    -                            if (statEr) {
    -                                statEr.path =
    -                                    statEr.path && (0, normalize_windows_path_js_1.normalizeWindowsPath)(statEr.path);
    -                                cb(statEr);
    -                            }
    -                            else if (st.isDirectory()) {
    -                                mkdir_(part, parts, mode, cache, unlink, cwd, created, cb);
    -                            }
    -                            else if (unlink) {
    -                                fs_1.default.unlink(part, er => {
    -                                    if (er) {
    -                                        return cb(er);
    -                                    }
    -                                    fs_1.default.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb));
    -                                });
    -                            }
    -                            else if (st.isSymbolicLink()) {
    -                                return cb(new symlink_error_js_1.SymlinkError(part, part + '/' + parts.join('/')));
    -                            }
    -                            else {
    -                                cb(er);
    -                            }
    -                        });
    -                    }
    -                    else {
    -                        created = created || part;
    -                        mkdir_(part, parts, mode, cache, unlink, cwd, created, cb);
    -                    }
    -                };
    -                const checkCwdSync = (dir) => {
    -                    let ok = false;
    -                    let code = undefined;
    -                    try {
    -                        ok = fs_1.default.statSync(dir).isDirectory();
    -                    }
    -                    catch (er) {
    -                        code = er?.code;
    -                    }
    -                    finally {
    -                        if (!ok) {
    -                            throw new cwd_error_js_1.CwdError(dir, code ?? 'ENOTDIR');
    -                        }
    -                    }
    -                };
    -                const mkdirSync = (dir, opt) => {
    -                    dir = (0, normalize_windows_path_js_1.normalizeWindowsPath)(dir);
    -                    // if there's any overlap between mask and mode,
    -                    // then we'll need an explicit chmod
    -                    /* c8 ignore next */
    -                    const umask = opt.umask ?? 0o22;
    -                    const mode = opt.mode | 0o700;
    -                    const needChmod = (mode & umask) !== 0;
    -                    const uid = opt.uid;
    -                    const gid = opt.gid;
    -                    const doChown = typeof uid === 'number' &&
    -                        typeof gid === 'number' &&
    -                        (uid !== opt.processUid || gid !== opt.processGid);
    -                    const preserve = opt.preserve;
    -                    const unlink = opt.unlink;
    -                    const cache = opt.cache;
    -                    const cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.cwd);
    -                    const done = (created) => {
    -                        cSet(cache, dir, true);
    -                        if (created && doChown) {
    -                            (0, chownr_1.chownrSync)(created, uid, gid);
    -                        }
    -                        if (needChmod) {
    -                            fs_1.default.chmodSync(dir, mode);
    -                        }
    -                    };
    -                    if (cache && cGet(cache, dir) === true) {
    -                        return done();
    -                    }
    -                    if (dir === cwd) {
    -                        checkCwdSync(cwd);
    -                        return done();
    -                    }
    -                    if (preserve) {
    -                        return done((0, mkdirp_1.mkdirpSync)(dir, mode) ?? undefined);
    -                    }
    -                    const sub = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.relative(cwd, dir));
    -                    const parts = sub.split('/');
    -                    let created = undefined;
    -                    for (let p = parts.shift(), part = cwd; p && (part += '/' + p); p = parts.shift()) {
    -                        part = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(part));
    -                        if (cGet(cache, part)) {
    -                            continue;
    -                        }
    -                        try {
    -                            fs_1.default.mkdirSync(part, mode);
    -                            created = created || part;
    -                            cSet(cache, part, true);
    -                        }
    -                        catch (er) {
    -                            const st = fs_1.default.lstatSync(part);
    -                            if (st.isDirectory()) {
    -                                cSet(cache, part, true);
    -                                continue;
    -                            }
    -                            else if (unlink) {
    -                                fs_1.default.unlinkSync(part);
    -                                fs_1.default.mkdirSync(part, mode);
    -                                created = created || part;
    -                                cSet(cache, part, true);
    -                                continue;
    -                            }
    -                            else if (st.isSymbolicLink()) {
    -                                return new symlink_error_js_1.SymlinkError(part, part + '/' + parts.join('/'));
    -                            }
    -                        }
    -                    }
    -                    return done(created);
    -                };
    -                exports.mkdirSync = mkdirSync;
    -                //# sourceMappingURL=mkdir.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 1810:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.modeFix = void 0;
    -                const modeFix = (mode, isDir, portable) => {
    -                    mode &= 0o7777;
    -                    // in portable mode, use the minimum reasonable umask
    -                    // if this system creates files with 0o664 by default
    -                    // (as some linux distros do), then we'll write the
    -                    // archive with 0o644 instead.  Also, don't ever create
    -                    // a file that is not readable/writable by the owner.
    -                    if (portable) {
    -                        mode = (mode | 0o600) & ~0o22;
    -                    }
    -                    // if dirs are readable, then they should be listable
    -                    if (isDir) {
    -                        if (mode & 0o400) {
    -                            mode |= 0o100;
    -                        }
    -                        if (mode & 0o40) {
    -                            mode |= 0o10;
    -                        }
    -                        if (mode & 0o4) {
    -                            mode |= 0o1;
    -                        }
    -                    }
    -                    return mode;
    -                };
    -                exports.modeFix = modeFix;
    -                //# sourceMappingURL=mode-fix.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 9862:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.normalizeUnicode = void 0;
    -                // warning: extremely hot code path.
    -                // This has been meticulously optimized for use
    -                // within npm install on large package trees.
    -                // Do not edit without careful benchmarking.
    -                const normalizeCache = Object.create(null);
    -                const { hasOwnProperty } = Object.prototype;
    -                const normalizeUnicode = (s) => {
    -                    if (!hasOwnProperty.call(normalizeCache, s)) {
    -                        normalizeCache[s] = s.normalize('NFD');
    -                    }
    -                    return normalizeCache[s];
    -                };
    -                exports.normalizeUnicode = normalizeUnicode;
    -                //# sourceMappingURL=normalize-unicode.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 762:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                // on windows, either \ or / are valid directory separators.
    -                // on unix, \ is a valid character in filenames.
    -                // so, on windows, and only on windows, we replace all \ chars with /,
    -                // so that we can use / as our one and only directory separator char.
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.normalizeWindowsPath = void 0;
    -                const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform;
    -                exports.normalizeWindowsPath = platform !== 'win32' ?
    -                    (p) => p
    -                    : (p) => p && p.replace(/\\/g, '/');
    -                //# sourceMappingURL=normalize-windows-path.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 9060:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                // turn tar(1) style args like `C` into the more verbose things like `cwd`
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.dealias = exports.isNoFile = exports.isFile = exports.isAsync = exports.isSync = exports.isAsyncNoFile = exports.isSyncNoFile = exports.isAsyncFile = exports.isSyncFile = void 0;
    -                const argmap = new Map([
    -                    ['C', 'cwd'],
    -                    ['f', 'file'],
    -                    ['z', 'gzip'],
    -                    ['P', 'preservePaths'],
    -                    ['U', 'unlink'],
    -                    ['strip-components', 'strip'],
    -                    ['stripComponents', 'strip'],
    -                    ['keep-newer', 'newer'],
    -                    ['keepNewer', 'newer'],
    -                    ['keep-newer-files', 'newer'],
    -                    ['keepNewerFiles', 'newer'],
    -                    ['k', 'keep'],
    -                    ['keep-existing', 'keep'],
    -                    ['keepExisting', 'keep'],
    -                    ['m', 'noMtime'],
    -                    ['no-mtime', 'noMtime'],
    -                    ['p', 'preserveOwner'],
    -                    ['L', 'follow'],
    -                    ['h', 'follow'],
    -                    ['onentry', 'onReadEntry'],
    -                ]);
    -                const isSyncFile = (o) => !!o.sync && !!o.file;
    -                exports.isSyncFile = isSyncFile;
    -                const isAsyncFile = (o) => !o.sync && !!o.file;
    -                exports.isAsyncFile = isAsyncFile;
    -                const isSyncNoFile = (o) => !!o.sync && !o.file;
    -                exports.isSyncNoFile = isSyncNoFile;
    -                const isAsyncNoFile = (o) => !o.sync && !o.file;
    -                exports.isAsyncNoFile = isAsyncNoFile;
    -                const isSync = (o) => !!o.sync;
    -                exports.isSync = isSync;
    -                const isAsync = (o) => !o.sync;
    -                exports.isAsync = isAsync;
    -                const isFile = (o) => !!o.file;
    -                exports.isFile = isFile;
    -                const isNoFile = (o) => !o.file;
    -                exports.isNoFile = isNoFile;
    -                const dealiasKey = (k) => {
    -                    const d = argmap.get(k);
    -                    if (d)
    -                        return d;
    -                    return k;
    -                };
    -                const dealias = (opt = {}) => {
    -                    if (!opt)
    -                        return {};
    -                    const result = {};
    -                    for (const [key, v] of Object.entries(opt)) {
    -                        // TS doesn't know that aliases are going to always be the same type
    -                        const k = dealiasKey(key);
    -                        result[k] = v;
    -                    }
    -                    // affordance for deprecated noChmod -> chmod
    -                    if (result.chmod === undefined && result.noChmod === false) {
    -                        result.chmod = true;
    -                    }
    -                    delete result.noChmod;
    -                    return result;
    -                };
    -                exports.dealias = dealias;
    -                //# sourceMappingURL=options.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 7788:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                // A readable tar stream creator
    -                // Technically, this is a transform stream that you write paths into,
    -                // and tar format comes out of.
    -                // The `add()` method is like `write()` but returns this,
    -                // and end() return `this` as well, so you can
    -                // do `new Pack(opt).add('files').add('dir').end().pipe(output)
    -                // You could also do something like:
    -                // streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar'))
    -                var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    var desc = Object.getOwnPropertyDescriptor(m, k);
    -                    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    -                        desc = { enumerable: true, get: function () { return m[k]; } };
    -                    }
    -                    Object.defineProperty(o, k2, desc);
    -                }) : (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    o[k2] = m[k];
    -                }));
    -                var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) {
    -                    Object.defineProperty(o, "default", { enumerable: true, value: v });
    -                }) : function (o, v) {
    -                    o["default"] = v;
    -                });
    -                var __importStar = (this && this.__importStar) || function (mod) {
    -                    if (mod && mod.__esModule) return mod;
    -                    var result = {};
    -                    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    -                    __setModuleDefault(result, mod);
    -                    return result;
    -                };
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.PackSync = exports.Pack = exports.PackJob = void 0;
    -                const fs_1 = __importDefault(__nccwpck_require__(7147));
    -                const write_entry_js_1 = __nccwpck_require__(4028);
    -                class PackJob {
    -                    path;
    -                    absolute;
    -                    entry;
    -                    stat;
    -                    readdir;
    -                    pending = false;
    -                    ignore = false;
    -                    piped = false;
    -                    constructor(path, absolute) {
    -                        this.path = path || './';
    -                        this.absolute = absolute;
    -                    }
    -                }
    -                exports.PackJob = PackJob;
    -                const minipass_1 = __nccwpck_require__(4721);
    -                const zlib = __importStar(__nccwpck_require__(6139));
    -                //@ts-ignore
    -                const yallist_1 = __nccwpck_require__(3796);
    -                const read_entry_js_1 = __nccwpck_require__(7369);
    -                const warn_method_js_1 = __nccwpck_require__(449);
    -                const EOF = Buffer.alloc(1024);
    -                const ONSTAT = Symbol('onStat');
    -                const ENDED = Symbol('ended');
    -                const QUEUE = Symbol('queue');
    -                const CURRENT = Symbol('current');
    -                const PROCESS = Symbol('process');
    -                const PROCESSING = Symbol('processing');
    -                const PROCESSJOB = Symbol('processJob');
    -                const JOBS = Symbol('jobs');
    -                const JOBDONE = Symbol('jobDone');
    -                const ADDFSENTRY = Symbol('addFSEntry');
    -                const ADDTARENTRY = Symbol('addTarEntry');
    -                const STAT = Symbol('stat');
    -                const READDIR = Symbol('readdir');
    -                const ONREADDIR = Symbol('onreaddir');
    -                const PIPE = Symbol('pipe');
    -                const ENTRY = Symbol('entry');
    -                const ENTRYOPT = Symbol('entryOpt');
    -                const WRITEENTRYCLASS = Symbol('writeEntryClass');
    -                const WRITE = Symbol('write');
    -                const ONDRAIN = Symbol('ondrain');
    -                const path_1 = __importDefault(__nccwpck_require__(1017));
    -                const normalize_windows_path_js_1 = __nccwpck_require__(762);
    -                class Pack extends minipass_1.Minipass {
    -                    opt;
    -                    cwd;
    -                    maxReadSize;
    -                    preservePaths;
    -                    strict;
    -                    noPax;
    -                    prefix;
    -                    linkCache;
    -                    statCache;
    -                    file;
    -                    portable;
    -                    zip;
    -                    readdirCache;
    -                    noDirRecurse;
    -                    follow;
    -                    noMtime;
    -                    mtime;
    -                    filter;
    -                    jobs;
    -                    [WRITEENTRYCLASS];
    -                    onWriteEntry;
    -                    [QUEUE];
    -                    [JOBS] = 0;
    -                    [PROCESSING] = false;
    -                    [ENDED] = false;
    -                    constructor(opt = {}) {
    -                        super();
    -                        this.opt = opt;
    -                        this.file = opt.file || '';
    -                        this.cwd = opt.cwd || process.cwd();
    -                        this.maxReadSize = opt.maxReadSize;
    -                        this.preservePaths = !!opt.preservePaths;
    -                        this.strict = !!opt.strict;
    -                        this.noPax = !!opt.noPax;
    -                        this.prefix = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.prefix || '');
    -                        this.linkCache = opt.linkCache || new Map();
    -                        this.statCache = opt.statCache || new Map();
    -                        this.readdirCache = opt.readdirCache || new Map();
    -                        this.onWriteEntry = opt.onWriteEntry;
    -                        this[WRITEENTRYCLASS] = write_entry_js_1.WriteEntry;
    -                        if (typeof opt.onwarn === 'function') {
    -                            this.on('warn', opt.onwarn);
    -                        }
    -                        this.portable = !!opt.portable;
    -                        if (opt.gzip || opt.brotli) {
    -                            if (opt.gzip && opt.brotli) {
    -                                throw new TypeError('gzip and brotli are mutually exclusive');
    -                            }
    -                            if (opt.gzip) {
    -                                if (typeof opt.gzip !== 'object') {
    -                                    opt.gzip = {};
    -                                }
    -                                if (this.portable) {
    -                                    opt.gzip.portable = true;
    -                                }
    -                                this.zip = new zlib.Gzip(opt.gzip);
    -                            }
    -                            if (opt.brotli) {
    -                                if (typeof opt.brotli !== 'object') {
    -                                    opt.brotli = {};
    -                                }
    -                                this.zip = new zlib.BrotliCompress(opt.brotli);
    -                            }
    -                            /* c8 ignore next */
    -                            if (!this.zip)
    -                                throw new Error('impossible');
    -                            const zip = this.zip;
    -                            zip.on('data', chunk => super.write(chunk));
    -                            zip.on('end', () => super.end());
    -                            zip.on('drain', () => this[ONDRAIN]());
    -                            this.on('resume', () => zip.resume());
    -                        }
    -                        else {
    -                            this.on('drain', this[ONDRAIN]);
    -                        }
    -                        this.noDirRecurse = !!opt.noDirRecurse;
    -                        this.follow = !!opt.follow;
    -                        this.noMtime = !!opt.noMtime;
    -                        if (opt.mtime)
    -                            this.mtime = opt.mtime;
    -                        this.filter =
    -                            typeof opt.filter === 'function' ? opt.filter : () => true;
    -                        this[QUEUE] = new yallist_1.Yallist();
    -                        this[JOBS] = 0;
    -                        this.jobs = Number(opt.jobs) || 4;
    -                        this[PROCESSING] = false;
    -                        this[ENDED] = false;
    -                    }
    -                    [WRITE](chunk) {
    -                        return super.write(chunk);
    -                    }
    -                    add(path) {
    -                        this.write(path);
    -                        return this;
    -                    }
    -                    //@ts-ignore
    -                    end(path) {
    -                        if (path) {
    -                            this.add(path);
    -                        }
    -                        this[ENDED] = true;
    -                        this[PROCESS]();
    -                        return this;
    -                    }
    -                    //@ts-ignore
    -                    write(path) {
    -                        if (this[ENDED]) {
    -                            throw new Error('write after end');
    -                        }
    -                        if (path instanceof read_entry_js_1.ReadEntry) {
    -                            this[ADDTARENTRY](path);
    -                        }
    -                        else {
    -                            this[ADDFSENTRY](path);
    -                        }
    -                        return this.flowing;
    -                    }
    -                    [ADDTARENTRY](p) {
    -                        const absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path_1.default.resolve(this.cwd, p.path));
    -                        // in this case, we don't have to wait for the stat
    -                        if (!this.filter(p.path, p)) {
    -                            p.resume();
    -                        }
    -                        else {
    -                            const job = new PackJob(p.path, absolute);
    -                            job.entry = new write_entry_js_1.WriteEntryTar(p, this[ENTRYOPT](job));
    -                            job.entry.on('end', () => this[JOBDONE](job));
    -                            this[JOBS] += 1;
    -                            this[QUEUE].push(job);
    -                        }
    -                        this[PROCESS]();
    -                    }
    -                    [ADDFSENTRY](p) {
    -                        const absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path_1.default.resolve(this.cwd, p));
    -                        this[QUEUE].push(new PackJob(p, absolute));
    -                        this[PROCESS]();
    -                    }
    -                    [STAT](job) {
    -                        job.pending = true;
    -                        this[JOBS] += 1;
    -                        const stat = this.follow ? 'stat' : 'lstat';
    -                        fs_1.default[stat](job.absolute, (er, stat) => {
    -                            job.pending = false;
    -                            this[JOBS] -= 1;
    -                            if (er) {
    -                                this.emit('error', er);
    -                            }
    -                            else {
    -                                this[ONSTAT](job, stat);
    -                            }
    -                        });
    -                    }
    -                    [ONSTAT](job, stat) {
    -                        this.statCache.set(job.absolute, stat);
    -                        job.stat = stat;
    -                        // now we have the stat, we can filter it.
    -                        if (!this.filter(job.path, stat)) {
    -                            job.ignore = true;
    -                        }
    -                        this[PROCESS]();
    -                    }
    -                    [READDIR](job) {
    -                        job.pending = true;
    -                        this[JOBS] += 1;
    -                        fs_1.default.readdir(job.absolute, (er, entries) => {
    -                            job.pending = false;
    -                            this[JOBS] -= 1;
    -                            if (er) {
    -                                return this.emit('error', er);
    -                            }
    -                            this[ONREADDIR](job, entries);
    -                        });
    -                    }
    -                    [ONREADDIR](job, entries) {
    -                        this.readdirCache.set(job.absolute, entries);
    -                        job.readdir = entries;
    -                        this[PROCESS]();
    -                    }
    -                    [PROCESS]() {
    -                        if (this[PROCESSING]) {
    -                            return;
    -                        }
    -                        this[PROCESSING] = true;
    -                        for (let w = this[QUEUE].head; !!w && this[JOBS] < this.jobs; w = w.next) {
    -                            this[PROCESSJOB](w.value);
    -                            if (w.value.ignore) {
    -                                const p = w.next;
    -                                this[QUEUE].removeNode(w);
    -                                w.next = p;
    -                            }
    -                        }
    -                        this[PROCESSING] = false;
    -                        if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) {
    -                            if (this.zip) {
    -                                this.zip.end(EOF);
    -                            }
    -                            else {
    -                                super.write(EOF);
    -                                super.end();
    -                            }
    -                        }
    -                    }
    -                    get [CURRENT]() {
    -                        return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value;
    -                    }
    -                    [JOBDONE](_job) {
    -                        this[QUEUE].shift();
    -                        this[JOBS] -= 1;
    -                        this[PROCESS]();
    -                    }
    -                    [PROCESSJOB](job) {
    -                        if (job.pending) {
    -                            return;
    -                        }
    -                        if (job.entry) {
    -                            if (job === this[CURRENT] && !job.piped) {
    -                                this[PIPE](job);
    -                            }
    -                            return;
    -                        }
    -                        if (!job.stat) {
    -                            const sc = this.statCache.get(job.absolute);
    -                            if (sc) {
    -                                this[ONSTAT](job, sc);
    -                            }
    -                            else {
    -                                this[STAT](job);
    -                            }
    -                        }
    -                        if (!job.stat) {
    -                            return;
    -                        }
    -                        // filtered out!
    -                        if (job.ignore) {
    -                            return;
    -                        }
    -                        if (!this.noDirRecurse &&
    -                            job.stat.isDirectory() &&
    -                            !job.readdir) {
    -                            const rc = this.readdirCache.get(job.absolute);
    -                            if (rc) {
    -                                this[ONREADDIR](job, rc);
    -                            }
    -                            else {
    -                                this[READDIR](job);
    -                            }
    -                            if (!job.readdir) {
    -                                return;
    -                            }
    -                        }
    -                        // we know it doesn't have an entry, because that got checked above
    -                        job.entry = this[ENTRY](job);
    -                        if (!job.entry) {
    -                            job.ignore = true;
    -                            return;
    -                        }
    -                        if (job === this[CURRENT] && !job.piped) {
    -                            this[PIPE](job);
    -                        }
    -                    }
    -                    [ENTRYOPT](job) {
    -                        return {
    -                            onwarn: (code, msg, data) => this.warn(code, msg, data),
    -                            noPax: this.noPax,
    -                            cwd: this.cwd,
    -                            absolute: job.absolute,
    -                            preservePaths: this.preservePaths,
    -                            maxReadSize: this.maxReadSize,
    -                            strict: this.strict,
    -                            portable: this.portable,
    -                            linkCache: this.linkCache,
    -                            statCache: this.statCache,
    -                            noMtime: this.noMtime,
    -                            mtime: this.mtime,
    -                            prefix: this.prefix,
    -                        };
    -                    }
    -                    [ENTRY](job) {
    -                        this[JOBS] += 1;
    -                        try {
    -                            const e = new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job));
    -                            this.onWriteEntry?.(e);
    -                            return e.on('end', () => this[JOBDONE](job))
    -                                .on('error', er => this.emit('error', er));
    -                        }
    -                        catch (er) {
    -                            this.emit('error', er);
    -                        }
    -                    }
    -                    [ONDRAIN]() {
    -                        if (this[CURRENT] && this[CURRENT].entry) {
    -                            this[CURRENT].entry.resume();
    -                        }
    -                    }
    -                    // like .pipe() but using super, because our write() is special
    -                    [PIPE](job) {
    -                        job.piped = true;
    -                        if (job.readdir) {
    -                            job.readdir.forEach(entry => {
    -                                const p = job.path;
    -                                const base = p === './' ? '' : p.replace(/\/*$/, '/');
    -                                this[ADDFSENTRY](base + entry);
    -                            });
    -                        }
    -                        const source = job.entry;
    -                        const zip = this.zip;
    -                        /* c8 ignore start */
    -                        if (!source)
    -                            throw new Error('cannot pipe without source');
    -                        /* c8 ignore stop */
    -                        if (zip) {
    -                            source.on('data', chunk => {
    -                                if (!zip.write(chunk)) {
    -                                    source.pause();
    -                                }
    -                            });
    -                        }
    -                        else {
    -                            source.on('data', chunk => {
    -                                if (!super.write(chunk)) {
    -                                    source.pause();
    -                                }
    -                            });
    -                        }
    -                    }
    -                    pause() {
    -                        if (this.zip) {
    -                            this.zip.pause();
    -                        }
    -                        return super.pause();
    -                    }
    -                    warn(code, message, data = {}) {
    -                        (0, warn_method_js_1.warnMethod)(this, code, message, data);
    -                    }
    -                }
    -                exports.Pack = Pack;
    -                class PackSync extends Pack {
    -                    sync = true;
    -                    constructor(opt) {
    -                        super(opt);
    -                        this[WRITEENTRYCLASS] = write_entry_js_1.WriteEntrySync;
    -                    }
    -                    // pause/resume are no-ops in sync streams.
    -                    pause() { }
    -                    resume() { }
    -                    [STAT](job) {
    -                        const stat = this.follow ? 'statSync' : 'lstatSync';
    -                        this[ONSTAT](job, fs_1.default[stat](job.absolute));
    -                    }
    -                    [READDIR](job) {
    -                        this[ONREADDIR](job, fs_1.default.readdirSync(job.absolute));
    -                    }
    -                    // gotta get it all in this tick
    -                    [PIPE](job) {
    -                        const source = job.entry;
    -                        const zip = this.zip;
    -                        if (job.readdir) {
    -                            job.readdir.forEach(entry => {
    -                                const p = job.path;
    -                                const base = p === './' ? '' : p.replace(/\/*$/, '/');
    -                                this[ADDFSENTRY](base + entry);
    -                            });
    -                        }
    -                        /* c8 ignore start */
    -                        if (!source)
    -                            throw new Error('Cannot pipe without source');
    -                        /* c8 ignore stop */
    -                        if (zip) {
    -                            source.on('data', chunk => {
    -                                zip.write(chunk);
    -                            });
    -                        }
    -                        else {
    -                            source.on('data', chunk => {
    -                                super[WRITE](chunk);
    -                            });
    -                        }
    -                    }
    -                }
    -                exports.PackSync = PackSync;
    -                //# sourceMappingURL=pack.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 2522:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -                // this[BUFFER] is the remainder of a chunk if we're waiting for
    -                // the full 512 bytes of a header to come in.  We will Buffer.concat()
    -                // it to the next write(), which is a mem copy, but a small one.
    -                //
    -                // this[QUEUE] is a Yallist of entries that haven't been emitted
    -                // yet this can only get filled up if the user keeps write()ing after
    -                // a write() returns false, or does a write() with more than one entry
    -                //
    -                // We don't buffer chunks, we always parse them and either create an
    -                // entry, or push it into the active entry.  The ReadEntry class knows
    -                // to throw data away if .ignore=true
    -                //
    -                // Shift entry off the buffer when it emits 'end', and emit 'entry' for
    -                // the next one in the list.
    -                //
    -                // At any time, we're pushing body chunks into the entry at WRITEENTRY,
    -                // and waiting for 'end' on the entry at READENTRY
    -                //
    -                // ignored entries get .resume() called on them straight away
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.Parser = void 0;
    -                const events_1 = __nccwpck_require__(2361);
    -                const minizlib_1 = __nccwpck_require__(6139);
    -                const yallist_1 = __nccwpck_require__(3796);
    -                const header_js_1 = __nccwpck_require__(2374);
    -                const pax_js_1 = __nccwpck_require__(8567);
    -                const read_entry_js_1 = __nccwpck_require__(7369);
    -                const warn_method_js_1 = __nccwpck_require__(449);
    -                const maxMetaEntrySize = 1024 * 1024;
    -                const gzipHeader = Buffer.from([0x1f, 0x8b]);
    -                const STATE = Symbol('state');
    -                const WRITEENTRY = Symbol('writeEntry');
    -                const READENTRY = Symbol('readEntry');
    -                const NEXTENTRY = Symbol('nextEntry');
    -                const PROCESSENTRY = Symbol('processEntry');
    -                const EX = Symbol('extendedHeader');
    -                const GEX = Symbol('globalExtendedHeader');
    -                const META = Symbol('meta');
    -                const EMITMETA = Symbol('emitMeta');
    -                const BUFFER = Symbol('buffer');
    -                const QUEUE = Symbol('queue');
    -                const ENDED = Symbol('ended');
    -                const EMITTEDEND = Symbol('emittedEnd');
    -                const EMIT = Symbol('emit');
    -                const UNZIP = Symbol('unzip');
    -                const CONSUMECHUNK = Symbol('consumeChunk');
    -                const CONSUMECHUNKSUB = Symbol('consumeChunkSub');
    -                const CONSUMEBODY = Symbol('consumeBody');
    -                const CONSUMEMETA = Symbol('consumeMeta');
    -                const CONSUMEHEADER = Symbol('consumeHeader');
    -                const CONSUMING = Symbol('consuming');
    -                const BUFFERCONCAT = Symbol('bufferConcat');
    -                const MAYBEEND = Symbol('maybeEnd');
    -                const WRITING = Symbol('writing');
    -                const ABORTED = Symbol('aborted');
    -                const DONE = Symbol('onDone');
    -                const SAW_VALID_ENTRY = Symbol('sawValidEntry');
    -                const SAW_NULL_BLOCK = Symbol('sawNullBlock');
    -                const SAW_EOF = Symbol('sawEOF');
    -                const CLOSESTREAM = Symbol('closeStream');
    -                const noop = () => true;
    -                class Parser extends events_1.EventEmitter {
    -                    file;
    -                    strict;
    -                    maxMetaEntrySize;
    -                    filter;
    -                    brotli;
    -                    writable = true;
    -                    readable = false;
    -                    [QUEUE] = new yallist_1.Yallist();
    -                    [BUFFER];
    -                    [READENTRY];
    -                    [WRITEENTRY];
    -                    [STATE] = 'begin';
    -                    [META] = '';
    -                    [EX];
    -                    [GEX];
    -                    [ENDED] = false;
    -                    [UNZIP];
    -                    [ABORTED] = false;
    -                    [SAW_VALID_ENTRY];
    -                    [SAW_NULL_BLOCK] = false;
    -                    [SAW_EOF] = false;
    -                    [WRITING] = false;
    -                    [CONSUMING] = false;
    -                    [EMITTEDEND] = false;
    -                    constructor(opt = {}) {
    -                        super();
    -                        this.file = opt.file || '';
    -                        // these BADARCHIVE errors can't be detected early. listen on DONE.
    -                        this.on(DONE, () => {
    -                            if (this[STATE] === 'begin' ||
    -                                this[SAW_VALID_ENTRY] === false) {
    -                                // either less than 1 block of data, or all entries were invalid.
    -                                // Either way, probably not even a tarball.
    -                                this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format');
    -                            }
    -                        });
    -                        if (opt.ondone) {
    -                            this.on(DONE, opt.ondone);
    -                        }
    -                        else {
    -                            this.on(DONE, () => {
    -                                this.emit('prefinish');
    -                                this.emit('finish');
    -                                this.emit('end');
    -                            });
    -                        }
    -                        this.strict = !!opt.strict;
    -                        this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize;
    -                        this.filter = typeof opt.filter === 'function' ? opt.filter : noop;
    -                        // Unlike gzip, brotli doesn't have any magic bytes to identify it
    -                        // Users need to explicitly tell us they're extracting a brotli file
    -                        // Or we infer from the file extension
    -                        const isTBR = opt.file &&
    -                            (opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr'));
    -                        // if it's a tbr file it MIGHT be brotli, but we don't know until
    -                        // we look at it and verify it's not a valid tar file.
    -                        this.brotli =
    -                            !opt.gzip && opt.brotli !== undefined ? opt.brotli
    -                                : isTBR ? undefined
    -                                    : false;
    -                        // have to set this so that streams are ok piping into it
    -                        this.on('end', () => this[CLOSESTREAM]());
    -                        if (typeof opt.onwarn === 'function') {
    -                            this.on('warn', opt.onwarn);
    -                        }
    -                        if (typeof opt.onReadEntry === 'function') {
    -                            this.on('entry', opt.onReadEntry);
    -                        }
    -                    }
    -                    warn(code, message, data = {}) {
    -                        (0, warn_method_js_1.warnMethod)(this, code, message, data);
    -                    }
    -                    [CONSUMEHEADER](chunk, position) {
    -                        if (this[SAW_VALID_ENTRY] === undefined) {
    -                            this[SAW_VALID_ENTRY] = false;
    -                        }
    -                        let header;
    -                        try {
    -                            header = new header_js_1.Header(chunk, position, this[EX], this[GEX]);
    -                        }
    -                        catch (er) {
    -                            return this.warn('TAR_ENTRY_INVALID', er);
    -                        }
    -                        if (header.nullBlock) {
    -                            if (this[SAW_NULL_BLOCK]) {
    -                                this[SAW_EOF] = true;
    -                                // ending an archive with no entries.  pointless, but legal.
    -                                if (this[STATE] === 'begin') {
    -                                    this[STATE] = 'header';
    -                                }
    -                                this[EMIT]('eof');
    -                            }
    -                            else {
    -                                this[SAW_NULL_BLOCK] = true;
    -                                this[EMIT]('nullBlock');
    -                            }
    -                        }
    -                        else {
    -                            this[SAW_NULL_BLOCK] = false;
    -                            if (!header.cksumValid) {
    -                                this.warn('TAR_ENTRY_INVALID', 'checksum failure', { header });
    -                            }
    -                            else if (!header.path) {
    -                                this.warn('TAR_ENTRY_INVALID', 'path is required', { header });
    -                            }
    -                            else {
    -                                const type = header.type;
    -                                if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) {
    -                                    this.warn('TAR_ENTRY_INVALID', 'linkpath required', {
    -                                        header,
    -                                    });
    -                                }
    -                                else if (!/^(Symbolic)?Link$/.test(type) &&
    -                                    !/^(Global)?ExtendedHeader$/.test(type) &&
    -                                    header.linkpath) {
    -                                    this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', {
    -                                        header,
    -                                    });
    -                                }
    -                                else {
    -                                    const entry = (this[WRITEENTRY] = new read_entry_js_1.ReadEntry(header, this[EX], this[GEX]));
    -                                    // we do this for meta & ignored entries as well, because they
    -                                    // are still valid tar, or else we wouldn't know to ignore them
    -                                    if (!this[SAW_VALID_ENTRY]) {
    -                                        if (entry.remain) {
    -                                            // this might be the one!
    -                                            const onend = () => {
    -                                                if (!entry.invalid) {
    -                                                    this[SAW_VALID_ENTRY] = true;
    -                                                }
    -                                            };
    -                                            entry.on('end', onend);
    -                                        }
    -                                        else {
    -                                            this[SAW_VALID_ENTRY] = true;
    -                                        }
    -                                    }
    -                                    if (entry.meta) {
    -                                        if (entry.size > this.maxMetaEntrySize) {
    -                                            entry.ignore = true;
    -                                            this[EMIT]('ignoredEntry', entry);
    -                                            this[STATE] = 'ignore';
    -                                            entry.resume();
    -                                        }
    -                                        else if (entry.size > 0) {
    -                                            this[META] = '';
    -                                            entry.on('data', c => (this[META] += c));
    -                                            this[STATE] = 'meta';
    -                                        }
    -                                    }
    -                                    else {
    -                                        this[EX] = undefined;
    -                                        entry.ignore =
    -                                            entry.ignore || !this.filter(entry.path, entry);
    -                                        if (entry.ignore) {
    -                                            // probably valid, just not something we care about
    -                                            this[EMIT]('ignoredEntry', entry);
    -                                            this[STATE] = entry.remain ? 'ignore' : 'header';
    -                                            entry.resume();
    -                                        }
    -                                        else {
    -                                            if (entry.remain) {
    -                                                this[STATE] = 'body';
    -                                            }
    -                                            else {
    -                                                this[STATE] = 'header';
    -                                                entry.end();
    -                                            }
    -                                            if (!this[READENTRY]) {
    -                                                this[QUEUE].push(entry);
    -                                                this[NEXTENTRY]();
    -                                            }
    -                                            else {
    -                                                this[QUEUE].push(entry);
    -                                            }
    -                                        }
    -                                    }
    -                                }
    -                            }
    -                        }
    -                    }
    -                    [CLOSESTREAM]() {
    -                        queueMicrotask(() => this.emit('close'));
    -                    }
    -                    [PROCESSENTRY](entry) {
    -                        let go = true;
    -                        if (!entry) {
    -                            this[READENTRY] = undefined;
    -                            go = false;
    -                        }
    -                        else if (Array.isArray(entry)) {
    -                            const [ev, ...args] = entry;
    -                            this.emit(ev, ...args);
    -                        }
    -                        else {
    -                            this[READENTRY] = entry;
    -                            this.emit('entry', entry);
    -                            if (!entry.emittedEnd) {
    -                                entry.on('end', () => this[NEXTENTRY]());
    -                                go = false;
    -                            }
    -                        }
    -                        return go;
    -                    }
    -                    [NEXTENTRY]() {
    -                        do { } while (this[PROCESSENTRY](this[QUEUE].shift()));
    -                        if (!this[QUEUE].length) {
    -                            // At this point, there's nothing in the queue, but we may have an
    -                            // entry which is being consumed (readEntry).
    -                            // If we don't, then we definitely can handle more data.
    -                            // If we do, and either it's flowing, or it has never had any data
    -                            // written to it, then it needs more.
    -                            // The only other possibility is that it has returned false from a
    -                            // write() call, so we wait for the next drain to continue.
    -                            const re = this[READENTRY];
    -                            const drainNow = !re || re.flowing || re.size === re.remain;
    -                            if (drainNow) {
    -                                if (!this[WRITING]) {
    -                                    this.emit('drain');
    -                                }
    -                            }
    -                            else {
    -                                re.once('drain', () => this.emit('drain'));
    -                            }
    -                        }
    -                    }
    -                    [CONSUMEBODY](chunk, position) {
    -                        // write up to but no  more than writeEntry.blockRemain
    -                        const entry = this[WRITEENTRY];
    -                        /* c8 ignore start */
    -                        if (!entry) {
    -                            throw new Error('attempt to consume body without entry??');
    -                        }
    -                        const br = entry.blockRemain ?? 0;
    -                        /* c8 ignore stop */
    -                        const c = br >= chunk.length && position === 0 ?
    -                            chunk
    -                            : chunk.subarray(position, position + br);
    -                        entry.write(c);
    -                        if (!entry.blockRemain) {
    -                            this[STATE] = 'header';
    -                            this[WRITEENTRY] = undefined;
    -                            entry.end();
    -                        }
    -                        return c.length;
    -                    }
    -                    [CONSUMEMETA](chunk, position) {
    -                        const entry = this[WRITEENTRY];
    -                        const ret = this[CONSUMEBODY](chunk, position);
    -                        // if we finished, then the entry is reset
    -                        if (!this[WRITEENTRY] && entry) {
    -                            this[EMITMETA](entry);
    -                        }
    -                        return ret;
    -                    }
    -                    [EMIT](ev, data, extra) {
    -                        if (!this[QUEUE].length && !this[READENTRY]) {
    -                            this.emit(ev, data, extra);
    -                        }
    -                        else {
    -                            this[QUEUE].push([ev, data, extra]);
    -                        }
    -                    }
    -                    [EMITMETA](entry) {
    -                        this[EMIT]('meta', this[META]);
    -                        switch (entry.type) {
    -                            case 'ExtendedHeader':
    -                            case 'OldExtendedHeader':
    -                                this[EX] = pax_js_1.Pax.parse(this[META], this[EX], false);
    -                                break;
    -                            case 'GlobalExtendedHeader':
    -                                this[GEX] = pax_js_1.Pax.parse(this[META], this[GEX], true);
    -                                break;
    -                            case 'NextFileHasLongPath':
    -                            case 'OldGnuLongPath': {
    -                                const ex = this[EX] ?? Object.create(null);
    -                                this[EX] = ex;
    -                                ex.path = this[META].replace(/\0.*/, '');
    -                                break;
    -                            }
    -                            case 'NextFileHasLongLinkpath': {
    -                                const ex = this[EX] || Object.create(null);
    -                                this[EX] = ex;
    -                                ex.linkpath = this[META].replace(/\0.*/, '');
    -                                break;
    -                            }
    -                            /* c8 ignore start */
    -                            default:
    -                                throw new Error('unknown meta: ' + entry.type);
    -                            /* c8 ignore stop */
    -                        }
    -                    }
    -                    abort(error) {
    -                        this[ABORTED] = true;
    -                        this.emit('abort', error);
    -                        // always throws, even in non-strict mode
    -                        this.warn('TAR_ABORT', error, { recoverable: false });
    -                    }
    -                    write(chunk, encoding, cb) {
    -                        if (typeof encoding === 'function') {
    -                            cb = encoding;
    -                            encoding = undefined;
    -                        }
    -                        if (typeof chunk === 'string') {
    -                            chunk = Buffer.from(chunk,
    -                                /* c8 ignore next */
    -                                typeof encoding === 'string' ? encoding : 'utf8');
    -                        }
    -                        if (this[ABORTED]) {
    -                            /* c8 ignore next */
    -                            cb?.();
    -                            return false;
    -                        }
    -                        // first write, might be gzipped
    -                        const needSniff = this[UNZIP] === undefined ||
    -                            (this.brotli === undefined && this[UNZIP] === false);
    -                        if (needSniff && chunk) {
    -                            if (this[BUFFER]) {
    -                                chunk = Buffer.concat([this[BUFFER], chunk]);
    -                                this[BUFFER] = undefined;
    -                            }
    -                            if (chunk.length < gzipHeader.length) {
    -                                this[BUFFER] = chunk;
    -                                /* c8 ignore next */
    -                                cb?.();
    -                                return true;
    -                            }
    -                            // look for gzip header
    -                            for (let i = 0; this[UNZIP] === undefined && i < gzipHeader.length; i++) {
    -                                if (chunk[i] !== gzipHeader[i]) {
    -                                    this[UNZIP] = false;
    -                                }
    -                            }
    -                            const maybeBrotli = this.brotli === undefined;
    -                            if (this[UNZIP] === false && maybeBrotli) {
    -                                // read the first header to see if it's a valid tar file. If so,
    -                                // we can safely assume that it's not actually brotli, despite the
    -                                // .tbr or .tar.br file extension.
    -                                // if we ended before getting a full chunk, yes, def brotli
    -                                if (chunk.length < 512) {
    -                                    if (this[ENDED]) {
    -                                        this.brotli = true;
    -                                    }
    -                                    else {
    -                                        this[BUFFER] = chunk;
    -                                        /* c8 ignore next */
    -                                        cb?.();
    -                                        return true;
    -                                    }
    -                                }
    -                                else {
    -                                    // if it's tar, it's pretty reliably not brotli, chances of
    -                                    // that happening are astronomical.
    -                                    try {
    -                                        new header_js_1.Header(chunk.subarray(0, 512));
    -                                        this.brotli = false;
    -                                    }
    -                                    catch (_) {
    -                                        this.brotli = true;
    -                                    }
    -                                }
    -                            }
    -                            if (this[UNZIP] === undefined ||
    -                                (this[UNZIP] === false && this.brotli)) {
    -                                const ended = this[ENDED];
    -                                this[ENDED] = false;
    -                                this[UNZIP] =
    -                                    this[UNZIP] === undefined ?
    -                                        new minizlib_1.Unzip({})
    -                                        : new minizlib_1.BrotliDecompress({});
    -                                this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk));
    -                                this[UNZIP].on('error', er => this.abort(er));
    -                                this[UNZIP].on('end', () => {
    -                                    this[ENDED] = true;
    -                                    this[CONSUMECHUNK]();
    -                                });
    -                                this[WRITING] = true;
    -                                const ret = !!this[UNZIP][ended ? 'end' : 'write'](chunk);
    -                                this[WRITING] = false;
    -                                cb?.();
    -                                return ret;
    -                            }
    -                        }
    -                        this[WRITING] = true;
    -                        if (this[UNZIP]) {
    -                            this[UNZIP].write(chunk);
    -                        }
    -                        else {
    -                            this[CONSUMECHUNK](chunk);
    -                        }
    -                        this[WRITING] = false;
    -                        // return false if there's a queue, or if the current entry isn't flowing
    -                        const ret = this[QUEUE].length ? false
    -                            : this[READENTRY] ? this[READENTRY].flowing
    -                                : true;
    -                        // if we have no queue, then that means a clogged READENTRY
    -                        if (!ret && !this[QUEUE].length) {
    -                            this[READENTRY]?.once('drain', () => this.emit('drain'));
    -                        }
    -                        /* c8 ignore next */
    -                        cb?.();
    -                        return ret;
    -                    }
    -                    [BUFFERCONCAT](c) {
    -                        if (c && !this[ABORTED]) {
    -                            this[BUFFER] =
    -                                this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c;
    -                        }
    -                    }
    -                    [MAYBEEND]() {
    -                        if (this[ENDED] &&
    -                            !this[EMITTEDEND] &&
    -                            !this[ABORTED] &&
    -                            !this[CONSUMING]) {
    -                            this[EMITTEDEND] = true;
    -                            const entry = this[WRITEENTRY];
    -                            if (entry && entry.blockRemain) {
    -                                // truncated, likely a damaged file
    -                                const have = this[BUFFER] ? this[BUFFER].length : 0;
    -                                this.warn('TAR_BAD_ARCHIVE', `Truncated input (needed ${entry.blockRemain} more bytes, only ${have} available)`, { entry });
    -                                if (this[BUFFER]) {
    -                                    entry.write(this[BUFFER]);
    -                                }
    -                                entry.end();
    -                            }
    -                            this[EMIT](DONE);
    -                        }
    -                    }
    -                    [CONSUMECHUNK](chunk) {
    -                        if (this[CONSUMING] && chunk) {
    -                            this[BUFFERCONCAT](chunk);
    -                        }
    -                        else if (!chunk && !this[BUFFER]) {
    -                            this[MAYBEEND]();
    -                        }
    -                        else if (chunk) {
    -                            this[CONSUMING] = true;
    -                            if (this[BUFFER]) {
    -                                this[BUFFERCONCAT](chunk);
    -                                const c = this[BUFFER];
    -                                this[BUFFER] = undefined;
    -                                this[CONSUMECHUNKSUB](c);
    -                            }
    -                            else {
    -                                this[CONSUMECHUNKSUB](chunk);
    -                            }
    -                            while (this[BUFFER] &&
    -                                this[BUFFER]?.length >= 512 &&
    -                                !this[ABORTED] &&
    -                                !this[SAW_EOF]) {
    -                                const c = this[BUFFER];
    -                                this[BUFFER] = undefined;
    -                                this[CONSUMECHUNKSUB](c);
    -                            }
    -                            this[CONSUMING] = false;
    -                        }
    -                        if (!this[BUFFER] || this[ENDED]) {
    -                            this[MAYBEEND]();
    -                        }
    -                    }
    -                    [CONSUMECHUNKSUB](chunk) {
    -                        // we know that we are in CONSUMING mode, so anything written goes into
    -                        // the buffer.  Advance the position and put any remainder in the buffer.
    -                        let position = 0;
    -                        const length = chunk.length;
    -                        while (position + 512 <= length &&
    -                            !this[ABORTED] &&
    -                            !this[SAW_EOF]) {
    -                            switch (this[STATE]) {
    -                                case 'begin':
    -                                case 'header':
    -                                    this[CONSUMEHEADER](chunk, position);
    -                                    position += 512;
    -                                    break;
    -                                case 'ignore':
    -                                case 'body':
    -                                    position += this[CONSUMEBODY](chunk, position);
    -                                    break;
    -                                case 'meta':
    -                                    position += this[CONSUMEMETA](chunk, position);
    -                                    break;
    -                                /* c8 ignore start */
    -                                default:
    -                                    throw new Error('invalid state: ' + this[STATE]);
    -                                /* c8 ignore stop */
    -                            }
    -                        }
    -                        if (position < length) {
    -                            if (this[BUFFER]) {
    -                                this[BUFFER] = Buffer.concat([
    -                                    chunk.subarray(position),
    -                                    this[BUFFER],
    -                                ]);
    -                            }
    -                            else {
    -                                this[BUFFER] = chunk.subarray(position);
    -                            }
    -                        }
    -                    }
    -                    end(chunk, encoding, cb) {
    -                        if (typeof chunk === 'function') {
    -                            cb = chunk;
    -                            encoding = undefined;
    -                            chunk = undefined;
    -                        }
    -                        if (typeof encoding === 'function') {
    -                            cb = encoding;
    -                            encoding = undefined;
    -                        }
    -                        if (typeof chunk === 'string') {
    -                            chunk = Buffer.from(chunk, encoding);
    -                        }
    -                        if (cb)
    -                            this.once('finish', cb);
    -                        if (!this[ABORTED]) {
    -                            if (this[UNZIP]) {
    -                                /* c8 ignore start */
    -                                if (chunk)
    -                                    this[UNZIP].write(chunk);
    -                                /* c8 ignore stop */
    -                                this[UNZIP].end();
    -                            }
    -                            else {
    -                                this[ENDED] = true;
    -                                if (this.brotli === undefined)
    -                                    chunk = chunk || Buffer.alloc(0);
    -                                if (chunk)
    -                                    this.write(chunk);
    -                                this[MAYBEEND]();
    -                            }
    -                        }
    -                        return this;
    -                    }
    -                }
    -                exports.Parser = Parser;
    -                //# sourceMappingURL=parse.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 3588:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -                // A path exclusive reservation system
    -                // reserve([list, of, paths], fn)
    -                // When the fn is first in line for all its paths, it
    -                // is called with a cb that clears the reservation.
    -                //
    -                // Used by async unpack to avoid clobbering paths in use,
    -                // while still allowing maximal safe parallelization.
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.PathReservations = void 0;
    -                const node_path_1 = __nccwpck_require__(9411);
    -                const normalize_unicode_js_1 = __nccwpck_require__(9862);
    -                const strip_trailing_slashes_js_1 = __nccwpck_require__(6018);
    -                const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform;
    -                const isWindows = platform === 'win32';
    -                // return a set of parent dirs for a given path
    -                // '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d']
    -                const getDirs = (path) => {
    -                    const dirs = path
    -                        .split('/')
    -                        .slice(0, -1)
    -                        .reduce((set, path) => {
    -                            const s = set[set.length - 1];
    -                            if (s !== undefined) {
    -                                path = (0, node_path_1.join)(s, path);
    -                            }
    -                            set.push(path || '/');
    -                            return set;
    -                        }, []);
    -                    return dirs;
    -                };
    -                class PathReservations {
    -                    // path => [function or Set]
    -                    // A Set object means a directory reservation
    -                    // A fn is a direct reservation on that path
    -                    #queues = new Map();
    -                    // fn => {paths:[path,...], dirs:[path, ...]}
    -                    #reservations = new Map();
    -                    // functions currently running
    -                    #running = new Set();
    -                    reserve(paths, fn) {
    -                        paths =
    -                            isWindows ?
    -                                ['win32 parallelization disabled']
    -                                : paths.map(p => {
    -                                    // don't need normPath, because we skip this entirely for windows
    -                                    return (0, strip_trailing_slashes_js_1.stripTrailingSlashes)((0, node_path_1.join)((0, normalize_unicode_js_1.normalizeUnicode)(p))).toLowerCase();
    -                                });
    -                        const dirs = new Set(paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b)));
    -                        this.#reservations.set(fn, { dirs, paths });
    -                        for (const p of paths) {
    -                            const q = this.#queues.get(p);
    -                            if (!q) {
    -                                this.#queues.set(p, [fn]);
    -                            }
    -                            else {
    -                                q.push(fn);
    -                            }
    -                        }
    -                        for (const dir of dirs) {
    -                            const q = this.#queues.get(dir);
    -                            if (!q) {
    -                                this.#queues.set(dir, [new Set([fn])]);
    -                            }
    -                            else {
    -                                const l = q[q.length - 1];
    -                                if (l instanceof Set) {
    -                                    l.add(fn);
    -                                }
    -                                else {
    -                                    q.push(new Set([fn]));
    -                                }
    -                            }
    -                        }
    -                        return this.#run(fn);
    -                    }
    -                    // return the queues for each path the function cares about
    -                    // fn => {paths, dirs}
    -                    #getQueues(fn) {
    -                        const res = this.#reservations.get(fn);
    -                        /* c8 ignore start */
    -                        if (!res) {
    -                            throw new Error('function does not have any path reservations');
    -                        }
    -                        /* c8 ignore stop */
    -                        return {
    -                            paths: res.paths.map((path) => this.#queues.get(path)),
    -                            dirs: [...res.dirs].map(path => this.#queues.get(path)),
    -                        };
    -                    }
    -                    // check if fn is first in line for all its paths, and is
    -                    // included in the first set for all its dir queues
    -                    check(fn) {
    -                        const { paths, dirs } = this.#getQueues(fn);
    -                        return (paths.every(q => q && q[0] === fn) &&
    -                            dirs.every(q => q && q[0] instanceof Set && q[0].has(fn)));
    -                    }
    -                    // run the function if it's first in line and not already running
    -                    #run(fn) {
    -                        if (this.#running.has(fn) || !this.check(fn)) {
    -                            return false;
    -                        }
    -                        this.#running.add(fn);
    -                        fn(() => this.#clear(fn));
    -                        return true;
    -                    }
    -                    #clear(fn) {
    -                        if (!this.#running.has(fn)) {
    -                            return false;
    -                        }
    -                        const res = this.#reservations.get(fn);
    -                        /* c8 ignore start */
    -                        if (!res) {
    -                            throw new Error('invalid reservation');
    -                        }
    -                        /* c8 ignore stop */
    -                        const { paths, dirs } = res;
    -                        const next = new Set();
    -                        for (const path of paths) {
    -                            const q = this.#queues.get(path);
    -                            /* c8 ignore start */
    -                            if (!q || q?.[0] !== fn) {
    -                                continue;
    -                            }
    -                            /* c8 ignore stop */
    -                            const q0 = q[1];
    -                            if (!q0) {
    -                                this.#queues.delete(path);
    -                                continue;
    -                            }
    -                            q.shift();
    -                            if (typeof q0 === 'function') {
    -                                next.add(q0);
    -                            }
    -                            else {
    -                                for (const f of q0) {
    -                                    next.add(f);
    -                                }
    -                            }
    -                        }
    -                        for (const dir of dirs) {
    -                            const q = this.#queues.get(dir);
    -                            const q0 = q?.[0];
    -                            /* c8 ignore next - type safety only */
    -                            if (!q || !(q0 instanceof Set))
    -                                continue;
    -                            if (q0.size === 1 && q.length === 1) {
    -                                this.#queues.delete(dir);
    -                                continue;
    -                            }
    -                            else if (q0.size === 1) {
    -                                q.shift();
    -                                // next one must be a function,
    -                                // or else the Set would've been reused
    -                                const n = q[0];
    -                                if (typeof n === 'function') {
    -                                    next.add(n);
    -                                }
    -                            }
    -                            else {
    -                                q0.delete(fn);
    -                            }
    -                        }
    -                        this.#running.delete(fn);
    -                        next.forEach(fn => this.#run(fn));
    -                        return true;
    -                    }
    -                }
    -                exports.PathReservations = PathReservations;
    -                //# sourceMappingURL=path-reservations.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 8567:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.Pax = void 0;
    -                const node_path_1 = __nccwpck_require__(9411);
    -                const header_js_1 = __nccwpck_require__(2374);
    -                class Pax {
    -                    atime;
    -                    mtime;
    -                    ctime;
    -                    charset;
    -                    comment;
    -                    gid;
    -                    uid;
    -                    gname;
    -                    uname;
    -                    linkpath;
    -                    dev;
    -                    ino;
    -                    nlink;
    -                    path;
    -                    size;
    -                    mode;
    -                    global;
    -                    constructor(obj, global = false) {
    -                        this.atime = obj.atime;
    -                        this.charset = obj.charset;
    -                        this.comment = obj.comment;
    -                        this.ctime = obj.ctime;
    -                        this.dev = obj.dev;
    -                        this.gid = obj.gid;
    -                        this.global = global;
    -                        this.gname = obj.gname;
    -                        this.ino = obj.ino;
    -                        this.linkpath = obj.linkpath;
    -                        this.mtime = obj.mtime;
    -                        this.nlink = obj.nlink;
    -                        this.path = obj.path;
    -                        this.size = obj.size;
    -                        this.uid = obj.uid;
    -                        this.uname = obj.uname;
    -                    }
    -                    encode() {
    -                        const body = this.encodeBody();
    -                        if (body === '') {
    -                            return Buffer.allocUnsafe(0);
    -                        }
    -                        const bodyLen = Buffer.byteLength(body);
    -                        // round up to 512 bytes
    -                        // add 512 for header
    -                        const bufLen = 512 * Math.ceil(1 + bodyLen / 512);
    -                        const buf = Buffer.allocUnsafe(bufLen);
    -                        // 0-fill the header section, it might not hit every field
    -                        for (let i = 0; i < 512; i++) {
    -                            buf[i] = 0;
    -                        }
    -                        new header_js_1.Header({
    -                            // XXX split the path
    -                            // then the path should be PaxHeader + basename, but less than 99,
    -                            // prepend with the dirname
    -                            /* c8 ignore start */
    -                            path: ('PaxHeader/' + (0, node_path_1.basename)(this.path ?? '')).slice(0, 99),
    -                            /* c8 ignore stop */
    -                            mode: this.mode || 0o644,
    -                            uid: this.uid,
    -                            gid: this.gid,
    -                            size: bodyLen,
    -                            mtime: this.mtime,
    -                            type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader',
    -                            linkpath: '',
    -                            uname: this.uname || '',
    -                            gname: this.gname || '',
    -                            devmaj: 0,
    -                            devmin: 0,
    -                            atime: this.atime,
    -                            ctime: this.ctime,
    -                        }).encode(buf);
    -                        buf.write(body, 512, bodyLen, 'utf8');
    -                        // null pad after the body
    -                        for (let i = bodyLen + 512; i < buf.length; i++) {
    -                            buf[i] = 0;
    -                        }
    -                        return buf;
    -                    }
    -                    encodeBody() {
    -                        return (this.encodeField('path') +
    -                            this.encodeField('ctime') +
    -                            this.encodeField('atime') +
    -                            this.encodeField('dev') +
    -                            this.encodeField('ino') +
    -                            this.encodeField('nlink') +
    -                            this.encodeField('charset') +
    -                            this.encodeField('comment') +
    -                            this.encodeField('gid') +
    -                            this.encodeField('gname') +
    -                            this.encodeField('linkpath') +
    -                            this.encodeField('mtime') +
    -                            this.encodeField('size') +
    -                            this.encodeField('uid') +
    -                            this.encodeField('uname'));
    -                    }
    -                    encodeField(field) {
    -                        if (this[field] === undefined) {
    -                            return '';
    -                        }
    -                        const r = this[field];
    -                        const v = r instanceof Date ? r.getTime() / 1000 : r;
    -                        const s = ' ' +
    -                            (field === 'dev' || field === 'ino' || field === 'nlink' ?
    -                                'SCHILY.'
    -                                : '') +
    -                            field +
    -                            '=' +
    -                            v +
    -                            '\n';
    -                        const byteLen = Buffer.byteLength(s);
    -                        // the digits includes the length of the digits in ascii base-10
    -                        // so if it's 9 characters, then adding 1 for the 9 makes it 10
    -                        // which makes it 11 chars.
    -                        let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1;
    -                        if (byteLen + digits >= Math.pow(10, digits)) {
    -                            digits += 1;
    -                        }
    -                        const len = digits + byteLen;
    -                        return len + s;
    -                    }
    -                    static parse(str, ex, g = false) {
    -                        return new Pax(merge(parseKV(str), ex), g);
    -                    }
    -                }
    -                exports.Pax = Pax;
    -                const merge = (a, b) => b ? Object.assign({}, b, a) : a;
    -                const parseKV = (str) => str
    -                    .replace(/\n$/, '')
    -                    .split('\n')
    -                    .reduce(parseKVLine, Object.create(null));
    -                const parseKVLine = (set, line) => {
    -                    const n = parseInt(line, 10);
    -                    // XXX Values with \n in them will fail this.
    -                    // Refactor to not be a naive line-by-line parse.
    -                    if (n !== Buffer.byteLength(line) + 1) {
    -                        return set;
    -                    }
    -                    line = line.slice((n + ' ').length);
    -                    const kv = line.split('=');
    -                    const r = kv.shift();
    -                    if (!r) {
    -                        return set;
    -                    }
    -                    const k = r.replace(/^SCHILY\.(dev|ino|nlink)/, '$1');
    -                    const v = kv.join('=');
    -                    set[k] =
    -                        /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) ?
    -                            new Date(Number(v) * 1000)
    -                            : /^[0-9]+$/.test(v) ? +v
    -                                : v;
    -                    return set;
    -                };
    -                //# sourceMappingURL=pax.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 7369:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.ReadEntry = void 0;
    -                const minipass_1 = __nccwpck_require__(4721);
    -                const normalize_windows_path_js_1 = __nccwpck_require__(762);
    -                class ReadEntry extends minipass_1.Minipass {
    -                    extended;
    -                    globalExtended;
    -                    header;
    -                    startBlockSize;
    -                    blockRemain;
    -                    remain;
    -                    type;
    -                    meta = false;
    -                    ignore = false;
    -                    path;
    -                    mode;
    -                    uid;
    -                    gid;
    -                    uname;
    -                    gname;
    -                    size = 0;
    -                    mtime;
    -                    atime;
    -                    ctime;
    -                    linkpath;
    -                    dev;
    -                    ino;
    -                    nlink;
    -                    invalid = false;
    -                    absolute;
    -                    unsupported = false;
    -                    constructor(header, ex, gex) {
    -                        super({});
    -                        // read entries always start life paused.  this is to avoid the
    -                        // situation where Minipass's auto-ending empty streams results
    -                        // in an entry ending before we're ready for it.
    -                        this.pause();
    -                        this.extended = ex;
    -                        this.globalExtended = gex;
    -                        this.header = header;
    -                        /* c8 ignore start */
    -                        this.remain = header.size ?? 0;
    -                        /* c8 ignore stop */
    -                        this.startBlockSize = 512 * Math.ceil(this.remain / 512);
    -                        this.blockRemain = this.startBlockSize;
    -                        this.type = header.type;
    -                        switch (this.type) {
    -                            case 'File':
    -                            case 'OldFile':
    -                            case 'Link':
    -                            case 'SymbolicLink':
    -                            case 'CharacterDevice':
    -                            case 'BlockDevice':
    -                            case 'Directory':
    -                            case 'FIFO':
    -                            case 'ContiguousFile':
    -                            case 'GNUDumpDir':
    -                                break;
    -                            case 'NextFileHasLongLinkpath':
    -                            case 'NextFileHasLongPath':
    -                            case 'OldGnuLongPath':
    -                            case 'GlobalExtendedHeader':
    -                            case 'ExtendedHeader':
    -                            case 'OldExtendedHeader':
    -                                this.meta = true;
    -                                break;
    -                            // NOTE: gnutar and bsdtar treat unrecognized types as 'File'
    -                            // it may be worth doing the same, but with a warning.
    -                            default:
    -                                this.ignore = true;
    -                        }
    -                        /* c8 ignore start */
    -                        if (!header.path) {
    -                            throw new Error('no path provided for tar.ReadEntry');
    -                        }
    -                        /* c8 ignore stop */
    -                        this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(header.path);
    -                        this.mode = header.mode;
    -                        if (this.mode) {
    -                            this.mode = this.mode & 0o7777;
    -                        }
    -                        this.uid = header.uid;
    -                        this.gid = header.gid;
    -                        this.uname = header.uname;
    -                        this.gname = header.gname;
    -                        this.size = this.remain;
    -                        this.mtime = header.mtime;
    -                        this.atime = header.atime;
    -                        this.ctime = header.ctime;
    -                        /* c8 ignore start */
    -                        this.linkpath =
    -                            header.linkpath ?
    -                                (0, normalize_windows_path_js_1.normalizeWindowsPath)(header.linkpath)
    -                                : undefined;
    -                        /* c8 ignore stop */
    -                        this.uname = header.uname;
    -                        this.gname = header.gname;
    -                        if (ex) {
    -                            this.#slurp(ex);
    -                        }
    -                        if (gex) {
    -                            this.#slurp(gex, true);
    -                        }
    -                    }
    -                    write(data) {
    -                        const writeLen = data.length;
    -                        if (writeLen > this.blockRemain) {
    -                            throw new Error('writing more to entry than is appropriate');
    -                        }
    -                        const r = this.remain;
    -                        const br = this.blockRemain;
    -                        this.remain = Math.max(0, r - writeLen);
    -                        this.blockRemain = Math.max(0, br - writeLen);
    -                        if (this.ignore) {
    -                            return true;
    -                        }
    -                        if (r >= writeLen) {
    -                            return super.write(data);
    -                        }
    -                        // r < writeLen
    -                        return super.write(data.subarray(0, r));
    -                    }
    -                    #slurp(ex, gex = false) {
    -                        if (ex.path)
    -                            ex.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(ex.path);
    -                        if (ex.linkpath)
    -                            ex.linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(ex.linkpath);
    -                        Object.assign(this, Object.fromEntries(Object.entries(ex).filter(([k, v]) => {
    -                            // we slurp in everything except for the path attribute in
    -                            // a global extended header, because that's weird. Also, any
    -                            // null/undefined values are ignored.
    -                            return !(v === null ||
    -                                v === undefined ||
    -                                (k === 'path' && gex));
    -                        })));
    -                    }
    -                }
    -                exports.ReadEntry = ReadEntry;
    -                //# sourceMappingURL=read-entry.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 5478:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.replace = void 0;
    -                // tar -r
    -                const fs_minipass_1 = __nccwpck_require__(675);
    -                const node_fs_1 = __importDefault(__nccwpck_require__(7561));
    -                const node_path_1 = __importDefault(__nccwpck_require__(9411));
    -                const header_js_1 = __nccwpck_require__(2374);
    -                const list_js_1 = __nccwpck_require__(4306);
    -                const make_command_js_1 = __nccwpck_require__(3830);
    -                const options_js_1 = __nccwpck_require__(9060);
    -                const pack_js_1 = __nccwpck_require__(7788);
    -                function replace(opt_, files, cb) {
    -                    const opt = (0, options_js_1.dealias)(opt_);
    -                    if (!(0, options_js_1.isFile)(opt)) {
    -                        throw new TypeError('file is required');
    -                    }
    -                    if (opt.gzip ||
    -                        opt.brotli ||
    -                        opt.file.endsWith('.br') ||
    -                        opt.file.endsWith('.tbr')) {
    -                        throw new TypeError('cannot append to compressed archives');
    -                    }
    -                    if (!files || !Array.isArray(files) || !files.length) {
    -                        throw new TypeError('no files or directories specified');
    -                    }
    -                    files = Array.from(files);
    -                    return (0, options_js_1.isSyncFile)(opt)
    -                        ? replaceSync(opt, files)
    -                        : replace_(opt, files, cb);
    -                }
    -                exports.replace = replace;
    -                const replaceSync = (opt, files) => {
    -                    const p = new pack_js_1.PackSync(opt);
    -                    let threw = true;
    -                    let fd;
    -                    let position;
    -                    try {
    -                        try {
    -                            fd = node_fs_1.default.openSync(opt.file, 'r+');
    -                        }
    -                        catch (er) {
    -                            if (er?.code === 'ENOENT') {
    -                                fd = node_fs_1.default.openSync(opt.file, 'w+');
    -                            }
    -                            else {
    -                                throw er;
    -                            }
    -                        }
    -                        const st = node_fs_1.default.fstatSync(fd);
    -                        const headBuf = Buffer.alloc(512);
    -                        POSITION: for (position = 0; position < st.size; position += 512) {
    -                            for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) {
    -                                bytes = node_fs_1.default.readSync(fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos);
    -                                if (position === 0 &&
    -                                    headBuf[0] === 0x1f &&
    -                                    headBuf[1] === 0x8b) {
    -                                    throw new Error('cannot append to compressed archives');
    -                                }
    -                                if (!bytes) {
    -                                    break POSITION;
    -                                }
    -                            }
    -                            const h = new header_js_1.Header(headBuf);
    -                            if (!h.cksumValid) {
    -                                break;
    -                            }
    -                            const entryBlockSize = 512 * Math.ceil((h.size || 0) / 512);
    -                            if (position + entryBlockSize + 512 > st.size) {
    -                                break;
    -                            }
    -                            // the 512 for the header we just parsed will be added as well
    -                            // also jump ahead all the blocks for the body
    -                            position += entryBlockSize;
    -                            if (opt.mtimeCache && h.mtime) {
    -                                opt.mtimeCache.set(String(h.path), h.mtime);
    -                            }
    -                        }
    -                        threw = false;
    -                        streamSync(opt, p, position, fd, files);
    -                    }
    -                    finally {
    -                        if (threw) {
    -                            try {
    -                                node_fs_1.default.closeSync(fd);
    -                            }
    -                            catch (er) { }
    -                        }
    -                    }
    -                };
    -                const streamSync = (opt, p, position, fd, files) => {
    -                    const stream = new fs_minipass_1.WriteStreamSync(opt.file, {
    -                        fd: fd,
    -                        start: position,
    -                    });
    -                    p.pipe(stream);
    -                    addFilesSync(p, files);
    -                };
    -                const replaceAsync = (opt, files) => {
    -                    files = Array.from(files);
    -                    const p = new pack_js_1.Pack(opt);
    -                    const getPos = (fd, size, cb_) => {
    -                        const cb = (er, pos) => {
    -                            if (er) {
    -                                node_fs_1.default.close(fd, _ => cb_(er));
    -                            }
    -                            else {
    -                                cb_(null, pos);
    -                            }
    -                        };
    -                        let position = 0;
    -                        if (size === 0) {
    -                            return cb(null, 0);
    -                        }
    -                        let bufPos = 0;
    -                        const headBuf = Buffer.alloc(512);
    -                        const onread = (er, bytes) => {
    -                            if (er || typeof bytes === 'undefined') {
    -                                return cb(er);
    -                            }
    -                            bufPos += bytes;
    -                            if (bufPos < 512 && bytes) {
    -                                return node_fs_1.default.read(fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos, onread);
    -                            }
    -                            if (position === 0 &&
    -                                headBuf[0] === 0x1f &&
    -                                headBuf[1] === 0x8b) {
    -                                return cb(new Error('cannot append to compressed archives'));
    -                            }
    -                            // truncated header
    -                            if (bufPos < 512) {
    -                                return cb(null, position);
    -                            }
    -                            const h = new header_js_1.Header(headBuf);
    -                            if (!h.cksumValid) {
    -                                return cb(null, position);
    -                            }
    -                            /* c8 ignore next */
    -                            const entryBlockSize = 512 * Math.ceil((h.size ?? 0) / 512);
    -                            if (position + entryBlockSize + 512 > size) {
    -                                return cb(null, position);
    -                            }
    -                            position += entryBlockSize + 512;
    -                            if (position >= size) {
    -                                return cb(null, position);
    -                            }
    -                            if (opt.mtimeCache && h.mtime) {
    -                                opt.mtimeCache.set(String(h.path), h.mtime);
    -                            }
    -                            bufPos = 0;
    -                            node_fs_1.default.read(fd, headBuf, 0, 512, position, onread);
    -                        };
    -                        node_fs_1.default.read(fd, headBuf, 0, 512, position, onread);
    -                    };
    -                    const promise = new Promise((resolve, reject) => {
    -                        p.on('error', reject);
    -                        let flag = 'r+';
    -                        const onopen = (er, fd) => {
    -                            if (er && er.code === 'ENOENT' && flag === 'r+') {
    -                                flag = 'w+';
    -                                return node_fs_1.default.open(opt.file, flag, onopen);
    -                            }
    -                            if (er || !fd) {
    -                                return reject(er);
    -                            }
    -                            node_fs_1.default.fstat(fd, (er, st) => {
    -                                if (er) {
    -                                    return node_fs_1.default.close(fd, () => reject(er));
    -                                }
    -                                getPos(fd, st.size, (er, position) => {
    -                                    if (er) {
    -                                        return reject(er);
    -                                    }
    -                                    const stream = new fs_minipass_1.WriteStream(opt.file, {
    -                                        fd: fd,
    -                                        start: position,
    -                                    });
    -                                    p.pipe(stream);
    -                                    stream.on('error', reject);
    -                                    stream.on('close', resolve);
    -                                    addFilesAsync(p, files);
    -                                });
    -                            });
    -                        };
    -                        node_fs_1.default.open(opt.file, flag, onopen);
    -                    });
    -                    return promise;
    -                };
    -                const addFilesSync = (p, files) => {
    -                    files.forEach(file => {
    -                        if (file.charAt(0) === '@') {
    -                            (0, list_js_1.list)({
    -                                file: node_path_1.default.resolve(p.cwd, file.slice(1)),
    -                                sync: true,
    -                                noResume: true,
    -                                onReadEntry: entry => p.add(entry),
    -                            });
    -                        }
    -                        else {
    -                            p.add(file);
    -                        }
    -                    });
    -                    p.end();
    -                };
    -                const addFilesAsync = async (p, files) => {
    -                    for (let i = 0; i < files.length; i++) {
    -                        const file = String(files[i]);
    -                        if (file.charAt(0) === '@') {
    -                            await (0, list_js_1.list)({
    -                                file: node_path_1.default.resolve(String(p.cwd), file.slice(1)),
    -                                noResume: true,
    -                                onReadEntry: entry => p.add(entry),
    -                            });
    -                        }
    -                        else {
    -                            p.add(file);
    -                        }
    -                    }
    -                    p.end();
    -                };
    -                exports.replace = (0, make_command_js_1.makeCommand)(replaceSync, replaceAsync,
    -                    /* c8 ignore start */
    -                    () => {
    -                        throw new TypeError('file is required');
    -                    }, () => {
    -                        throw new TypeError('file is required');
    -                    },
    -                    /* c8 ignore stop */
    -                    (opt, entries) => {
    -                        if (!(0, options_js_1.isFile)(opt)) {
    -                            throw new TypeError('file is required');
    -                        }
    -                        if (opt.gzip ||
    -                            opt.brotli ||
    -                            opt.file.endsWith('.br') ||
    -                            opt.file.endsWith('.tbr')) {
    -                            throw new TypeError('cannot append to compressed archives');
    -                        }
    -                        if (!entries?.length) {
    -                            throw new TypeError('no paths specified to add/replace');
    -                        }
    -                    });
    -                //# sourceMappingURL=replace.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 1126:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.stripAbsolutePath = void 0;
    -                // unix absolute paths are also absolute on win32, so we use this for both
    -                const node_path_1 = __nccwpck_require__(9411);
    -                const { isAbsolute, parse } = node_path_1.win32;
    -                // returns [root, stripped]
    -                // Note that windows will think that //x/y/z/a has a "root" of //x/y, and in
    -                // those cases, we want to sanitize it to x/y/z/a, not z/a, so we strip /
    -                // explicitly if it's the first character.
    -                // drive-specific relative paths on Windows get their root stripped off even
    -                // though they are not absolute, so `c:../foo` becomes ['c:', '../foo']
    -                const stripAbsolutePath = (path) => {
    -                    let r = '';
    -                    let parsed = parse(path);
    -                    while (isAbsolute(path) || parsed.root) {
    -                        // windows will think that //x/y/z has a "root" of //x/y/
    -                        // but strip the //?/C:/ off of //?/C:/path
    -                        const root = path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' ?
    -                            '/'
    -                            : parsed.root;
    -                        path = path.slice(root.length);
    -                        r += root;
    -                        parsed = parse(path);
    -                    }
    -                    return [r, path];
    -                };
    -                exports.stripAbsolutePath = stripAbsolutePath;
    -                //# sourceMappingURL=strip-absolute-path.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 6018:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.stripTrailingSlashes = void 0;
    -                // warning: extremely hot code path.
    -                // This has been meticulously optimized for use
    -                // within npm install on large package trees.
    -                // Do not edit without careful benchmarking.
    -                const stripTrailingSlashes = (str) => {
    -                    let i = str.length - 1;
    -                    let slashesStart = -1;
    -                    while (i > -1 && str.charAt(i) === '/') {
    -                        slashesStart = i;
    -                        i--;
    -                    }
    -                    return slashesStart === -1 ? str : str.slice(0, slashesStart);
    -                };
    -                exports.stripTrailingSlashes = stripTrailingSlashes;
    -                //# sourceMappingURL=strip-trailing-slashes.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 3012:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.SymlinkError = void 0;
    -                class SymlinkError extends Error {
    -                    path;
    -                    symlink;
    -                    syscall = 'symlink';
    -                    code = 'TAR_SYMLINK_ERROR';
    -                    constructor(symlink, path) {
    -                        super('TAR_SYMLINK_ERROR: Cannot extract through symbolic link');
    -                        this.symlink = symlink;
    -                        this.path = path;
    -                    }
    -                    get name() {
    -                        return 'SymlinkError';
    -                    }
    -                }
    -                exports.SymlinkError = SymlinkError;
    -                //# sourceMappingURL=symlink-error.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 7390:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.code = exports.name = exports.isName = exports.isCode = void 0;
    -                const isCode = (c) => exports.name.has(c);
    -                exports.isCode = isCode;
    -                const isName = (c) => exports.code.has(c);
    -                exports.isName = isName;
    -                // map types from key to human-friendly name
    -                exports.name = new Map([
    -                    ['0', 'File'],
    -                    // same as File
    -                    ['', 'OldFile'],
    -                    ['1', 'Link'],
    -                    ['2', 'SymbolicLink'],
    -                    // Devices and FIFOs aren't fully supported
    -                    // they are parsed, but skipped when unpacking
    -                    ['3', 'CharacterDevice'],
    -                    ['4', 'BlockDevice'],
    -                    ['5', 'Directory'],
    -                    ['6', 'FIFO'],
    -                    // same as File
    -                    ['7', 'ContiguousFile'],
    -                    // pax headers
    -                    ['g', 'GlobalExtendedHeader'],
    -                    ['x', 'ExtendedHeader'],
    -                    // vendor-specific stuff
    -                    // skip
    -                    ['A', 'SolarisACL'],
    -                    // like 5, but with data, which should be skipped
    -                    ['D', 'GNUDumpDir'],
    -                    // metadata only, skip
    -                    ['I', 'Inode'],
    -                    // data = link path of next file
    -                    ['K', 'NextFileHasLongLinkpath'],
    -                    // data = path of next file
    -                    ['L', 'NextFileHasLongPath'],
    -                    // skip
    -                    ['M', 'ContinuationFile'],
    -                    // like L
    -                    ['N', 'OldGnuLongPath'],
    -                    // skip
    -                    ['S', 'SparseFile'],
    -                    // skip
    -                    ['V', 'TapeVolumeHeader'],
    -                    // like x
    -                    ['X', 'OldExtendedHeader'],
    -                ]);
    -                // map the other direction
    -                exports.code = new Map(Array.from(exports.name).map(kv => [kv[1], kv[0]]));
    -                //# sourceMappingURL=types.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 6973:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                // the PEND/UNPEND stuff tracks whether we're ready to emit end/close yet.
    -                // but the path reservations are required to avoid race conditions where
    -                // parallelized unpack ops may mess with one another, due to dependencies
    -                // (like a Link depending on its target) or destructive operations (like
    -                // clobbering an fs object to create one of a different type.)
    -                var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    var desc = Object.getOwnPropertyDescriptor(m, k);
    -                    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    -                        desc = { enumerable: true, get: function () { return m[k]; } };
    -                    }
    -                    Object.defineProperty(o, k2, desc);
    -                }) : (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    o[k2] = m[k];
    -                }));
    -                var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) {
    -                    Object.defineProperty(o, "default", { enumerable: true, value: v });
    -                }) : function (o, v) {
    -                    o["default"] = v;
    -                });
    -                var __importStar = (this && this.__importStar) || function (mod) {
    -                    if (mod && mod.__esModule) return mod;
    -                    var result = {};
    -                    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    -                    __setModuleDefault(result, mod);
    -                    return result;
    -                };
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.UnpackSync = exports.Unpack = void 0;
    -                const fsm = __importStar(__nccwpck_require__(675));
    -                const node_assert_1 = __importDefault(__nccwpck_require__(8061));
    -                const node_crypto_1 = __nccwpck_require__(6005);
    -                const node_fs_1 = __importDefault(__nccwpck_require__(7561));
    -                const node_path_1 = __importDefault(__nccwpck_require__(9411));
    -                const get_write_flag_js_1 = __nccwpck_require__(1663);
    -                const mkdir_js_1 = __nccwpck_require__(8704);
    -                const normalize_unicode_js_1 = __nccwpck_require__(9862);
    -                const normalize_windows_path_js_1 = __nccwpck_require__(762);
    -                const parse_js_1 = __nccwpck_require__(2522);
    -                const strip_absolute_path_js_1 = __nccwpck_require__(1126);
    -                const strip_trailing_slashes_js_1 = __nccwpck_require__(6018);
    -                const wc = __importStar(__nccwpck_require__(4978));
    -                const path_reservations_js_1 = __nccwpck_require__(3588);
    -                const ONENTRY = Symbol('onEntry');
    -                const CHECKFS = Symbol('checkFs');
    -                const CHECKFS2 = Symbol('checkFs2');
    -                const PRUNECACHE = Symbol('pruneCache');
    -                const ISREUSABLE = Symbol('isReusable');
    -                const MAKEFS = Symbol('makeFs');
    -                const FILE = Symbol('file');
    -                const DIRECTORY = Symbol('directory');
    -                const LINK = Symbol('link');
    -                const SYMLINK = Symbol('symlink');
    -                const HARDLINK = Symbol('hardlink');
    -                const UNSUPPORTED = Symbol('unsupported');
    -                const CHECKPATH = Symbol('checkPath');
    -                const MKDIR = Symbol('mkdir');
    -                const ONERROR = Symbol('onError');
    -                const PENDING = Symbol('pending');
    -                const PEND = Symbol('pend');
    -                const UNPEND = Symbol('unpend');
    -                const ENDED = Symbol('ended');
    -                const MAYBECLOSE = Symbol('maybeClose');
    -                const SKIP = Symbol('skip');
    -                const DOCHOWN = Symbol('doChown');
    -                const UID = Symbol('uid');
    -                const GID = Symbol('gid');
    -                const CHECKED_CWD = Symbol('checkedCwd');
    -                const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform;
    -                const isWindows = platform === 'win32';
    -                const DEFAULT_MAX_DEPTH = 1024;
    -                // Unlinks on Windows are not atomic.
    -                //
    -                // This means that if you have a file entry, followed by another
    -                // file entry with an identical name, and you cannot re-use the file
    -                // (because it's a hardlink, or because unlink:true is set, or it's
    -                // Windows, which does not have useful nlink values), then the unlink
    -                // will be committed to the disk AFTER the new file has been written
    -                // over the old one, deleting the new file.
    -                //
    -                // To work around this, on Windows systems, we rename the file and then
    -                // delete the renamed file.  It's a sloppy kludge, but frankly, I do not
    -                // know of a better way to do this, given windows' non-atomic unlink
    -                // semantics.
    -                //
    -                // See: https://github.com/npm/node-tar/issues/183
    -                /* c8 ignore start */
    -                const unlinkFile = (path, cb) => {
    -                    if (!isWindows) {
    -                        return node_fs_1.default.unlink(path, cb);
    -                    }
    -                    const name = path + '.DELETE.' + (0, node_crypto_1.randomBytes)(16).toString('hex');
    -                    node_fs_1.default.rename(path, name, er => {
    -                        if (er) {
    -                            return cb(er);
    -                        }
    -                        node_fs_1.default.unlink(name, cb);
    -                    });
    -                };
    -                /* c8 ignore stop */
    -                /* c8 ignore start */
    -                const unlinkFileSync = (path) => {
    -                    if (!isWindows) {
    -                        return node_fs_1.default.unlinkSync(path);
    -                    }
    -                    const name = path + '.DELETE.' + (0, node_crypto_1.randomBytes)(16).toString('hex');
    -                    node_fs_1.default.renameSync(path, name);
    -                    node_fs_1.default.unlinkSync(name);
    -                };
    -                /* c8 ignore stop */
    -                // this.gid, entry.gid, this.processUid
    -                const uint32 = (a, b, c) => a !== undefined && a === a >>> 0 ? a
    -                    : b !== undefined && b === b >>> 0 ? b
    -                        : c;
    -                // clear the cache if it's a case-insensitive unicode-squashing match.
    -                // we can't know if the current file system is case-sensitive or supports
    -                // unicode fully, so we check for similarity on the maximally compatible
    -                // representation.  Err on the side of pruning, since all it's doing is
    -                // preventing lstats, and it's not the end of the world if we get a false
    -                // positive.
    -                // Note that on windows, we always drop the entire cache whenever a
    -                // symbolic link is encountered, because 8.3 filenames are impossible
    -                // to reason about, and collisions are hazards rather than just failures.
    -                const cacheKeyNormalize = (path) => (0, strip_trailing_slashes_js_1.stripTrailingSlashes)((0, normalize_windows_path_js_1.normalizeWindowsPath)((0, normalize_unicode_js_1.normalizeUnicode)(path))).toLowerCase();
    -                // remove all cache entries matching ${abs}/**
    -                const pruneCache = (cache, abs) => {
    -                    abs = cacheKeyNormalize(abs);
    -                    for (const path of cache.keys()) {
    -                        const pnorm = cacheKeyNormalize(path);
    -                        if (pnorm === abs || pnorm.indexOf(abs + '/') === 0) {
    -                            cache.delete(path);
    -                        }
    -                    }
    -                };
    -                const dropCache = (cache) => {
    -                    for (const key of cache.keys()) {
    -                        cache.delete(key);
    -                    }
    -                };
    -                class Unpack extends parse_js_1.Parser {
    -                    [ENDED] = false;
    -                    [CHECKED_CWD] = false;
    -                    [PENDING] = 0;
    -                    reservations = new path_reservations_js_1.PathReservations();
    -                    transform;
    -                    writable = true;
    -                    readable = false;
    -                    dirCache;
    -                    uid;
    -                    gid;
    -                    setOwner;
    -                    preserveOwner;
    -                    processGid;
    -                    processUid;
    -                    maxDepth;
    -                    forceChown;
    -                    win32;
    -                    newer;
    -                    keep;
    -                    noMtime;
    -                    preservePaths;
    -                    unlink;
    -                    cwd;
    -                    strip;
    -                    processUmask;
    -                    umask;
    -                    dmode;
    -                    fmode;
    -                    chmod;
    -                    constructor(opt = {}) {
    -                        opt.ondone = () => {
    -                            this[ENDED] = true;
    -                            this[MAYBECLOSE]();
    -                        };
    -                        super(opt);
    -                        this.transform = opt.transform;
    -                        this.dirCache = opt.dirCache || new Map();
    -                        this.chmod = !!opt.chmod;
    -                        if (typeof opt.uid === 'number' || typeof opt.gid === 'number') {
    -                            // need both or neither
    -                            if (typeof opt.uid !== 'number' ||
    -                                typeof opt.gid !== 'number') {
    -                                throw new TypeError('cannot set owner without number uid and gid');
    -                            }
    -                            if (opt.preserveOwner) {
    -                                throw new TypeError('cannot preserve owner in archive and also set owner explicitly');
    -                            }
    -                            this.uid = opt.uid;
    -                            this.gid = opt.gid;
    -                            this.setOwner = true;
    -                        }
    -                        else {
    -                            this.uid = undefined;
    -                            this.gid = undefined;
    -                            this.setOwner = false;
    -                        }
    -                        // default true for root
    -                        if (opt.preserveOwner === undefined &&
    -                            typeof opt.uid !== 'number') {
    -                            this.preserveOwner = !!(process.getuid && process.getuid() === 0);
    -                        }
    -                        else {
    -                            this.preserveOwner = !!opt.preserveOwner;
    -                        }
    -                        this.processUid =
    -                            (this.preserveOwner || this.setOwner) && process.getuid ?
    -                                process.getuid()
    -                                : undefined;
    -                        this.processGid =
    -                            (this.preserveOwner || this.setOwner) && process.getgid ?
    -                                process.getgid()
    -                                : undefined;
    -                        // prevent excessively deep nesting of subfolders
    -                        // set to `Infinity` to remove this restriction
    -                        this.maxDepth =
    -                            typeof opt.maxDepth === 'number' ?
    -                                opt.maxDepth
    -                                : DEFAULT_MAX_DEPTH;
    -                        // mostly just for testing, but useful in some cases.
    -                        // Forcibly trigger a chown on every entry, no matter what
    -                        this.forceChown = opt.forceChown === true;
    -                        // turn > this[ONENTRY](entry));
    -                    }
    -                    // a bad or damaged archive is a warning for Parser, but an error
    -                    // when extracting.  Mark those errors as unrecoverable, because
    -                    // the Unpack contract cannot be met.
    -                    warn(code, msg, data = {}) {
    -                        if (code === 'TAR_BAD_ARCHIVE' || code === 'TAR_ABORT') {
    -                            data.recoverable = false;
    -                        }
    -                        return super.warn(code, msg, data);
    -                    }
    -                    [MAYBECLOSE]() {
    -                        if (this[ENDED] && this[PENDING] === 0) {
    -                            this.emit('prefinish');
    -                            this.emit('finish');
    -                            this.emit('end');
    -                        }
    -                    }
    -                    [CHECKPATH](entry) {
    -                        const p = (0, normalize_windows_path_js_1.normalizeWindowsPath)(entry.path);
    -                        const parts = p.split('/');
    -                        if (this.strip) {
    -                            if (parts.length < this.strip) {
    -                                return false;
    -                            }
    -                            if (entry.type === 'Link') {
    -                                const linkparts = (0, normalize_windows_path_js_1.normalizeWindowsPath)(String(entry.linkpath)).split('/');
    -                                if (linkparts.length >= this.strip) {
    -                                    entry.linkpath = linkparts.slice(this.strip).join('/');
    -                                }
    -                                else {
    -                                    return false;
    -                                }
    -                            }
    -                            parts.splice(0, this.strip);
    -                            entry.path = parts.join('/');
    -                        }
    -                        if (isFinite(this.maxDepth) && parts.length > this.maxDepth) {
    -                            this.warn('TAR_ENTRY_ERROR', 'path excessively deep', {
    -                                entry,
    -                                path: p,
    -                                depth: parts.length,
    -                                maxDepth: this.maxDepth,
    -                            });
    -                            return false;
    -                        }
    -                        if (!this.preservePaths) {
    -                            if (parts.includes('..') ||
    -                                /* c8 ignore next */
    -                                (isWindows && /^[a-z]:\.\.$/i.test(parts[0] ?? ''))) {
    -                                this.warn('TAR_ENTRY_ERROR', `path contains '..'`, {
    -                                    entry,
    -                                    path: p,
    -                                });
    -                                return false;
    -                            }
    -                            // strip off the root
    -                            const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(p);
    -                            if (root) {
    -                                entry.path = String(stripped);
    -                                this.warn('TAR_ENTRY_INFO', `stripping ${root} from absolute path`, {
    -                                    entry,
    -                                    path: p,
    -                                });
    -                            }
    -                        }
    -                        if (node_path_1.default.isAbsolute(entry.path)) {
    -                            entry.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(entry.path));
    -                        }
    -                        else {
    -                            entry.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(this.cwd, entry.path));
    -                        }
    -                        // if we somehow ended up with a path that escapes the cwd, and we are
    -                        // not in preservePaths mode, then something is fishy!  This should have
    -                        // been prevented above, so ignore this for coverage.
    -                        /* c8 ignore start - defense in depth */
    -                        if (!this.preservePaths &&
    -                            typeof entry.absolute === 'string' &&
    -                            entry.absolute.indexOf(this.cwd + '/') !== 0 &&
    -                            entry.absolute !== this.cwd) {
    -                            this.warn('TAR_ENTRY_ERROR', 'path escaped extraction target', {
    -                                entry,
    -                                path: (0, normalize_windows_path_js_1.normalizeWindowsPath)(entry.path),
    -                                resolvedPath: entry.absolute,
    -                                cwd: this.cwd,
    -                            });
    -                            return false;
    -                        }
    -                        /* c8 ignore stop */
    -                        // an archive can set properties on the extraction directory, but it
    -                        // may not replace the cwd with a different kind of thing entirely.
    -                        if (entry.absolute === this.cwd &&
    -                            entry.type !== 'Directory' &&
    -                            entry.type !== 'GNUDumpDir') {
    -                            return false;
    -                        }
    -                        // only encode : chars that aren't drive letter indicators
    -                        if (this.win32) {
    -                            const { root: aRoot } = node_path_1.default.win32.parse(String(entry.absolute));
    -                            entry.absolute =
    -                                aRoot + wc.encode(String(entry.absolute).slice(aRoot.length));
    -                            const { root: pRoot } = node_path_1.default.win32.parse(entry.path);
    -                            entry.path = pRoot + wc.encode(entry.path.slice(pRoot.length));
    -                        }
    -                        return true;
    -                    }
    -                    [ONENTRY](entry) {
    -                        if (!this[CHECKPATH](entry)) {
    -                            return entry.resume();
    -                        }
    -                        node_assert_1.default.equal(typeof entry.absolute, 'string');
    -                        switch (entry.type) {
    -                            case 'Directory':
    -                            case 'GNUDumpDir':
    -                                if (entry.mode) {
    -                                    entry.mode = entry.mode | 0o700;
    -                                }
    -                            // eslint-disable-next-line no-fallthrough
    -                            case 'File':
    -                            case 'OldFile':
    -                            case 'ContiguousFile':
    -                            case 'Link':
    -                            case 'SymbolicLink':
    -                                return this[CHECKFS](entry);
    -                            case 'CharacterDevice':
    -                            case 'BlockDevice':
    -                            case 'FIFO':
    -                            default:
    -                                return this[UNSUPPORTED](entry);
    -                        }
    -                    }
    -                    [ONERROR](er, entry) {
    -                        // Cwd has to exist, or else nothing works. That's serious.
    -                        // Other errors are warnings, which raise the error in strict
    -                        // mode, but otherwise continue on.
    -                        if (er.name === 'CwdError') {
    -                            this.emit('error', er);
    -                        }
    -                        else {
    -                            this.warn('TAR_ENTRY_ERROR', er, { entry });
    -                            this[UNPEND]();
    -                            entry.resume();
    -                        }
    -                    }
    -                    [MKDIR](dir, mode, cb) {
    -                        (0, mkdir_js_1.mkdir)((0, normalize_windows_path_js_1.normalizeWindowsPath)(dir), {
    -                            uid: this.uid,
    -                            gid: this.gid,
    -                            processUid: this.processUid,
    -                            processGid: this.processGid,
    -                            umask: this.processUmask,
    -                            preserve: this.preservePaths,
    -                            unlink: this.unlink,
    -                            cache: this.dirCache,
    -                            cwd: this.cwd,
    -                            mode: mode,
    -                        }, cb);
    -                    }
    -                    [DOCHOWN](entry) {
    -                        // in preserve owner mode, chown if the entry doesn't match process
    -                        // in set owner mode, chown if setting doesn't match process
    -                        return (this.forceChown ||
    -                            (this.preserveOwner &&
    -                                ((typeof entry.uid === 'number' &&
    -                                    entry.uid !== this.processUid) ||
    -                                    (typeof entry.gid === 'number' &&
    -                                        entry.gid !== this.processGid))) ||
    -                            (typeof this.uid === 'number' &&
    -                                this.uid !== this.processUid) ||
    -                            (typeof this.gid === 'number' && this.gid !== this.processGid));
    -                    }
    -                    [UID](entry) {
    -                        return uint32(this.uid, entry.uid, this.processUid);
    -                    }
    -                    [GID](entry) {
    -                        return uint32(this.gid, entry.gid, this.processGid);
    -                    }
    -                    [FILE](entry, fullyDone) {
    -                        const mode = typeof entry.mode === 'number' ?
    -                            entry.mode & 0o7777
    -                            : this.fmode;
    -                        const stream = new fsm.WriteStream(String(entry.absolute), {
    -                            // slight lie, but it can be numeric flags
    -                            flags: (0, get_write_flag_js_1.getWriteFlag)(entry.size),
    -                            mode: mode,
    -                            autoClose: false,
    -                        });
    -                        stream.on('error', (er) => {
    -                            if (stream.fd) {
    -                                node_fs_1.default.close(stream.fd, () => { });
    -                            }
    -                            // flush all the data out so that we aren't left hanging
    -                            // if the error wasn't actually fatal.  otherwise the parse
    -                            // is blocked, and we never proceed.
    -                            stream.write = () => true;
    -                            this[ONERROR](er, entry);
    -                            fullyDone();
    -                        });
    -                        let actions = 1;
    -                        const done = (er) => {
    -                            if (er) {
    -                                /* c8 ignore start - we should always have a fd by now */
    -                                if (stream.fd) {
    -                                    node_fs_1.default.close(stream.fd, () => { });
    -                                }
    -                                /* c8 ignore stop */
    -                                this[ONERROR](er, entry);
    -                                fullyDone();
    -                                return;
    -                            }
    -                            if (--actions === 0) {
    -                                if (stream.fd !== undefined) {
    -                                    node_fs_1.default.close(stream.fd, er => {
    -                                        if (er) {
    -                                            this[ONERROR](er, entry);
    -                                        }
    -                                        else {
    -                                            this[UNPEND]();
    -                                        }
    -                                        fullyDone();
    -                                    });
    -                                }
    -                            }
    -                        };
    -                        stream.on('finish', () => {
    -                            // if futimes fails, try utimes
    -                            // if utimes fails, fail with the original error
    -                            // same for fchown/chown
    -                            const abs = String(entry.absolute);
    -                            const fd = stream.fd;
    -                            if (typeof fd === 'number' && entry.mtime && !this.noMtime) {
    -                                actions++;
    -                                const atime = entry.atime || new Date();
    -                                const mtime = entry.mtime;
    -                                node_fs_1.default.futimes(fd, atime, mtime, er => er ?
    -                                    node_fs_1.default.utimes(abs, atime, mtime, er2 => done(er2 && er))
    -                                    : done());
    -                            }
    -                            if (typeof fd === 'number' && this[DOCHOWN](entry)) {
    -                                actions++;
    -                                const uid = this[UID](entry);
    -                                const gid = this[GID](entry);
    -                                if (typeof uid === 'number' && typeof gid === 'number') {
    -                                    node_fs_1.default.fchown(fd, uid, gid, er => er ?
    -                                        node_fs_1.default.chown(abs, uid, gid, er2 => done(er2 && er))
    -                                        : done());
    -                                }
    -                            }
    -                            done();
    -                        });
    -                        const tx = this.transform ? this.transform(entry) || entry : entry;
    -                        if (tx !== entry) {
    -                            tx.on('error', (er) => {
    -                                this[ONERROR](er, entry);
    -                                fullyDone();
    -                            });
    -                            entry.pipe(tx);
    -                        }
    -                        tx.pipe(stream);
    -                    }
    -                    [DIRECTORY](entry, fullyDone) {
    -                        const mode = typeof entry.mode === 'number' ?
    -                            entry.mode & 0o7777
    -                            : this.dmode;
    -                        this[MKDIR](String(entry.absolute), mode, er => {
    -                            if (er) {
    -                                this[ONERROR](er, entry);
    -                                fullyDone();
    -                                return;
    -                            }
    -                            let actions = 1;
    -                            const done = () => {
    -                                if (--actions === 0) {
    -                                    fullyDone();
    -                                    this[UNPEND]();
    -                                    entry.resume();
    -                                }
    -                            };
    -                            if (entry.mtime && !this.noMtime) {
    -                                actions++;
    -                                node_fs_1.default.utimes(String(entry.absolute), entry.atime || new Date(), entry.mtime, done);
    -                            }
    -                            if (this[DOCHOWN](entry)) {
    -                                actions++;
    -                                node_fs_1.default.chown(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)), done);
    -                            }
    -                            done();
    -                        });
    -                    }
    -                    [UNSUPPORTED](entry) {
    -                        entry.unsupported = true;
    -                        this.warn('TAR_ENTRY_UNSUPPORTED', `unsupported entry type: ${entry.type}`, { entry });
    -                        entry.resume();
    -                    }
    -                    [SYMLINK](entry, done) {
    -                        this[LINK](entry, String(entry.linkpath), 'symlink', done);
    -                    }
    -                    [HARDLINK](entry, done) {
    -                        const linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(this.cwd, String(entry.linkpath)));
    -                        this[LINK](entry, linkpath, 'link', done);
    -                    }
    -                    [PEND]() {
    -                        this[PENDING]++;
    -                    }
    -                    [UNPEND]() {
    -                        this[PENDING]--;
    -                        this[MAYBECLOSE]();
    -                    }
    -                    [SKIP](entry) {
    -                        this[UNPEND]();
    -                        entry.resume();
    -                    }
    -                    // Check if we can reuse an existing filesystem entry safely and
    -                    // overwrite it, rather than unlinking and recreating
    -                    // Windows doesn't report a useful nlink, so we just never reuse entries
    -                    [ISREUSABLE](entry, st) {
    -                        return (entry.type === 'File' &&
    -                            !this.unlink &&
    -                            st.isFile() &&
    -                            st.nlink <= 1 &&
    -                            !isWindows);
    -                    }
    -                    // check if a thing is there, and if so, try to clobber it
    -                    [CHECKFS](entry) {
    -                        this[PEND]();
    -                        const paths = [entry.path];
    -                        if (entry.linkpath) {
    -                            paths.push(entry.linkpath);
    -                        }
    -                        this.reservations.reserve(paths, done => this[CHECKFS2](entry, done));
    -                    }
    -                    [PRUNECACHE](entry) {
    -                        // if we are not creating a directory, and the path is in the dirCache,
    -                        // then that means we are about to delete the directory we created
    -                        // previously, and it is no longer going to be a directory, and neither
    -                        // is any of its children.
    -                        // If a symbolic link is encountered, all bets are off.  There is no
    -                        // reasonable way to sanitize the cache in such a way we will be able to
    -                        // avoid having filesystem collisions.  If this happens with a non-symlink
    -                        // entry, it'll just fail to unpack, but a symlink to a directory, using an
    -                        // 8.3 shortname or certain unicode attacks, can evade detection and lead
    -                        // to arbitrary writes to anywhere on the system.
    -                        if (entry.type === 'SymbolicLink') {
    -                            dropCache(this.dirCache);
    -                        }
    -                        else if (entry.type !== 'Directory') {
    -                            pruneCache(this.dirCache, String(entry.absolute));
    -                        }
    -                    }
    -                    [CHECKFS2](entry, fullyDone) {
    -                        this[PRUNECACHE](entry);
    -                        const done = (er) => {
    -                            this[PRUNECACHE](entry);
    -                            fullyDone(er);
    -                        };
    -                        const checkCwd = () => {
    -                            this[MKDIR](this.cwd, this.dmode, er => {
    -                                if (er) {
    -                                    this[ONERROR](er, entry);
    -                                    done();
    -                                    return;
    -                                }
    -                                this[CHECKED_CWD] = true;
    -                                start();
    -                            });
    -                        };
    -                        const start = () => {
    -                            if (entry.absolute !== this.cwd) {
    -                                const parent = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.dirname(String(entry.absolute)));
    -                                if (parent !== this.cwd) {
    -                                    return this[MKDIR](parent, this.dmode, er => {
    -                                        if (er) {
    -                                            this[ONERROR](er, entry);
    -                                            done();
    -                                            return;
    -                                        }
    -                                        afterMakeParent();
    -                                    });
    -                                }
    -                            }
    -                            afterMakeParent();
    -                        };
    -                        const afterMakeParent = () => {
    -                            node_fs_1.default.lstat(String(entry.absolute), (lstatEr, st) => {
    -                                if (st &&
    -                                    (this.keep ||
    -                                        /* c8 ignore next */
    -                                        (this.newer && st.mtime > (entry.mtime ?? st.mtime)))) {
    -                                    this[SKIP](entry);
    -                                    done();
    -                                    return;
    -                                }
    -                                if (lstatEr || this[ISREUSABLE](entry, st)) {
    -                                    return this[MAKEFS](null, entry, done);
    -                                }
    -                                if (st.isDirectory()) {
    -                                    if (entry.type === 'Directory') {
    -                                        const needChmod = this.chmod &&
    -                                            entry.mode &&
    -                                            (st.mode & 0o7777) !== entry.mode;
    -                                        const afterChmod = (er) => this[MAKEFS](er ?? null, entry, done);
    -                                        if (!needChmod) {
    -                                            return afterChmod();
    -                                        }
    -                                        return node_fs_1.default.chmod(String(entry.absolute), Number(entry.mode), afterChmod);
    -                                    }
    -                                    // Not a dir entry, have to remove it.
    -                                    // NB: the only way to end up with an entry that is the cwd
    -                                    // itself, in such a way that == does not detect, is a
    -                                    // tricky windows absolute path with UNC or 8.3 parts (and
    -                                    // preservePaths:true, or else it will have been stripped).
    -                                    // In that case, the user has opted out of path protections
    -                                    // explicitly, so if they blow away the cwd, c'est la vie.
    -                                    if (entry.absolute !== this.cwd) {
    -                                        return node_fs_1.default.rmdir(String(entry.absolute), (er) => this[MAKEFS](er ?? null, entry, done));
    -                                    }
    -                                }
    -                                // not a dir, and not reusable
    -                                // don't remove if the cwd, we want that error
    -                                if (entry.absolute === this.cwd) {
    -                                    return this[MAKEFS](null, entry, done);
    -                                }
    -                                unlinkFile(String(entry.absolute), er => this[MAKEFS](er ?? null, entry, done));
    -                            });
    -                        };
    -                        if (this[CHECKED_CWD]) {
    -                            start();
    -                        }
    -                        else {
    -                            checkCwd();
    -                        }
    -                    }
    -                    [MAKEFS](er, entry, done) {
    -                        if (er) {
    -                            this[ONERROR](er, entry);
    -                            done();
    -                            return;
    -                        }
    -                        switch (entry.type) {
    -                            case 'File':
    -                            case 'OldFile':
    -                            case 'ContiguousFile':
    -                                return this[FILE](entry, done);
    -                            case 'Link':
    -                                return this[HARDLINK](entry, done);
    -                            case 'SymbolicLink':
    -                                return this[SYMLINK](entry, done);
    -                            case 'Directory':
    -                            case 'GNUDumpDir':
    -                                return this[DIRECTORY](entry, done);
    -                        }
    -                    }
    -                    [LINK](entry, linkpath, link, done) {
    -                        // XXX: get the type ('symlink' or 'junction') for windows
    -                        node_fs_1.default[link](linkpath, String(entry.absolute), er => {
    -                            if (er) {
    -                                this[ONERROR](er, entry);
    -                            }
    -                            else {
    -                                this[UNPEND]();
    -                                entry.resume();
    -                            }
    -                            done();
    -                        });
    -                    }
    -                }
    -                exports.Unpack = Unpack;
    -                const callSync = (fn) => {
    -                    try {
    -                        return [null, fn()];
    -                    }
    -                    catch (er) {
    -                        return [er, null];
    -                    }
    -                };
    -                class UnpackSync extends Unpack {
    -                    sync = true;
    -                    [MAKEFS](er, entry) {
    -                        return super[MAKEFS](er, entry, () => { });
    -                    }
    -                    [CHECKFS](entry) {
    -                        this[PRUNECACHE](entry);
    -                        if (!this[CHECKED_CWD]) {
    -                            const er = this[MKDIR](this.cwd, this.dmode);
    -                            if (er) {
    -                                return this[ONERROR](er, entry);
    -                            }
    -                            this[CHECKED_CWD] = true;
    -                        }
    -                        // don't bother to make the parent if the current entry is the cwd,
    -                        // we've already checked it.
    -                        if (entry.absolute !== this.cwd) {
    -                            const parent = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.dirname(String(entry.absolute)));
    -                            if (parent !== this.cwd) {
    -                                const mkParent = this[MKDIR](parent, this.dmode);
    -                                if (mkParent) {
    -                                    return this[ONERROR](mkParent, entry);
    -                                }
    -                            }
    -                        }
    -                        const [lstatEr, st] = callSync(() => node_fs_1.default.lstatSync(String(entry.absolute)));
    -                        if (st &&
    -                            (this.keep ||
    -                                /* c8 ignore next */
    -                                (this.newer && st.mtime > (entry.mtime ?? st.mtime)))) {
    -                            return this[SKIP](entry);
    -                        }
    -                        if (lstatEr || this[ISREUSABLE](entry, st)) {
    -                            return this[MAKEFS](null, entry);
    -                        }
    -                        if (st.isDirectory()) {
    -                            if (entry.type === 'Directory') {
    -                                const needChmod = this.chmod &&
    -                                    entry.mode &&
    -                                    (st.mode & 0o7777) !== entry.mode;
    -                                const [er] = needChmod ?
    -                                    callSync(() => {
    -                                        node_fs_1.default.chmodSync(String(entry.absolute), Number(entry.mode));
    -                                    })
    -                                    : [];
    -                                return this[MAKEFS](er, entry);
    -                            }
    -                            // not a dir entry, have to remove it
    -                            const [er] = callSync(() => node_fs_1.default.rmdirSync(String(entry.absolute)));
    -                            this[MAKEFS](er, entry);
    -                        }
    -                        // not a dir, and not reusable.
    -                        // don't remove if it's the cwd, since we want that error.
    -                        const [er] = entry.absolute === this.cwd ?
    -                            []
    -                            : callSync(() => unlinkFileSync(String(entry.absolute)));
    -                        this[MAKEFS](er, entry);
    -                    }
    -                    [FILE](entry, done) {
    -                        const mode = typeof entry.mode === 'number' ?
    -                            entry.mode & 0o7777
    -                            : this.fmode;
    -                        const oner = (er) => {
    -                            let closeError;
    -                            try {
    -                                node_fs_1.default.closeSync(fd);
    -                            }
    -                            catch (e) {
    -                                closeError = e;
    -                            }
    -                            if (er || closeError) {
    -                                this[ONERROR](er || closeError, entry);
    -                            }
    -                            done();
    -                        };
    -                        let fd;
    -                        try {
    -                            fd = node_fs_1.default.openSync(String(entry.absolute), (0, get_write_flag_js_1.getWriteFlag)(entry.size), mode);
    -                        }
    -                        catch (er) {
    -                            return oner(er);
    -                        }
    -                        const tx = this.transform ? this.transform(entry) || entry : entry;
    -                        if (tx !== entry) {
    -                            tx.on('error', (er) => this[ONERROR](er, entry));
    -                            entry.pipe(tx);
    -                        }
    -                        tx.on('data', (chunk) => {
    -                            try {
    -                                node_fs_1.default.writeSync(fd, chunk, 0, chunk.length);
    -                            }
    -                            catch (er) {
    -                                oner(er);
    -                            }
    -                        });
    -                        tx.on('end', () => {
    -                            let er = null;
    -                            // try both, falling futimes back to utimes
    -                            // if either fails, handle the first error
    -                            if (entry.mtime && !this.noMtime) {
    -                                const atime = entry.atime || new Date();
    -                                const mtime = entry.mtime;
    -                                try {
    -                                    node_fs_1.default.futimesSync(fd, atime, mtime);
    -                                }
    -                                catch (futimeser) {
    -                                    try {
    -                                        node_fs_1.default.utimesSync(String(entry.absolute), atime, mtime);
    -                                    }
    -                                    catch (utimeser) {
    -                                        er = futimeser;
    -                                    }
    -                                }
    -                            }
    -                            if (this[DOCHOWN](entry)) {
    -                                const uid = this[UID](entry);
    -                                const gid = this[GID](entry);
    -                                try {
    -                                    node_fs_1.default.fchownSync(fd, Number(uid), Number(gid));
    -                                }
    -                                catch (fchowner) {
    -                                    try {
    -                                        node_fs_1.default.chownSync(String(entry.absolute), Number(uid), Number(gid));
    -                                    }
    -                                    catch (chowner) {
    -                                        er = er || fchowner;
    -                                    }
    -                                }
    -                            }
    -                            oner(er);
    -                        });
    -                    }
    -                    [DIRECTORY](entry, done) {
    -                        const mode = typeof entry.mode === 'number' ?
    -                            entry.mode & 0o7777
    -                            : this.dmode;
    -                        const er = this[MKDIR](String(entry.absolute), mode);
    -                        if (er) {
    -                            this[ONERROR](er, entry);
    -                            done();
    -                            return;
    -                        }
    -                        if (entry.mtime && !this.noMtime) {
    -                            try {
    -                                node_fs_1.default.utimesSync(String(entry.absolute), entry.atime || new Date(), entry.mtime);
    -                                /* c8 ignore next */
    -                            }
    -                            catch (er) { }
    -                        }
    -                        if (this[DOCHOWN](entry)) {
    -                            try {
    -                                node_fs_1.default.chownSync(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)));
    -                            }
    -                            catch (er) { }
    -                        }
    -                        done();
    -                        entry.resume();
    -                    }
    -                    [MKDIR](dir, mode) {
    -                        try {
    -                            return (0, mkdir_js_1.mkdirSync)((0, normalize_windows_path_js_1.normalizeWindowsPath)(dir), {
    -                                uid: this.uid,
    -                                gid: this.gid,
    -                                processUid: this.processUid,
    -                                processGid: this.processGid,
    -                                umask: this.processUmask,
    -                                preserve: this.preservePaths,
    -                                unlink: this.unlink,
    -                                cache: this.dirCache,
    -                                cwd: this.cwd,
    -                                mode: mode,
    -                            });
    -                        }
    -                        catch (er) {
    -                            return er;
    -                        }
    -                    }
    -                    [LINK](entry, linkpath, link, done) {
    -                        const ls = `${link}Sync`;
    -                        try {
    -                            node_fs_1.default[ls](linkpath, String(entry.absolute));
    -                            done();
    -                            entry.resume();
    -                        }
    -                        catch (er) {
    -                            return this[ONERROR](er, entry);
    -                        }
    -                    }
    -                }
    -                exports.UnpackSync = UnpackSync;
    -                //# sourceMappingURL=unpack.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 8780:
    -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
    -
    -                "use strict";
    -
    -                // tar -u
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.update = void 0;
    -                const make_command_js_1 = __nccwpck_require__(3830);
    -                const replace_js_1 = __nccwpck_require__(5478);
    -                // just call tar.r with the filter and mtimeCache
    -                exports.update = (0, make_command_js_1.makeCommand)(replace_js_1.replace.syncFile, replace_js_1.replace.asyncFile, replace_js_1.replace.syncNoFile, replace_js_1.replace.asyncNoFile, (opt, entries = []) => {
    -                    replace_js_1.replace.validate?.(opt, entries);
    -                    mtimeFilter(opt);
    -                });
    -                const mtimeFilter = (opt) => {
    -                    const filter = opt.filter;
    -                    if (!opt.mtimeCache) {
    -                        opt.mtimeCache = new Map();
    -                    }
    -                    opt.filter =
    -                        filter ?
    -                            (path, stat) => filter(path, stat) &&
    -                                !(
    -                                    /* c8 ignore start */
    -                                    ((opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) >
    -                                        (stat.mtime ?? 0))
    -                                    /* c8 ignore stop */
    -                                )
    -                            : (path, stat) => !(
    -                                /* c8 ignore start */
    -                                ((opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) >
    -                                    (stat.mtime ?? 0))
    -                                /* c8 ignore stop */
    -                            );
    -                };
    -                //# sourceMappingURL=update.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 449:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.warnMethod = void 0;
    -                const warnMethod = (self, code, message, data = {}) => {
    -                    if (self.file) {
    -                        data.file = self.file;
    -                    }
    -                    if (self.cwd) {
    -                        data.cwd = self.cwd;
    -                    }
    -                    data.code =
    -                        (message instanceof Error &&
    -                            message.code) ||
    -                        code;
    -                    data.tarCode = code;
    -                    if (!self.strict && data.recoverable !== false) {
    -                        if (message instanceof Error) {
    -                            data = Object.assign(message, data);
    -                            message = message.message;
    -                        }
    -                        self.emit('warn', code, message, data);
    -                    }
    -                    else if (message instanceof Error) {
    -                        self.emit('error', Object.assign(message, data));
    -                    }
    -                    else {
    -                        self.emit('error', Object.assign(new Error(`${code}: ${message}`), data));
    -                    }
    -                };
    -                exports.warnMethod = warnMethod;
    -                //# sourceMappingURL=warn-method.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 4978:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                // When writing files on Windows, translate the characters to their
    -                // 0xf000 higher-encoded versions.
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.decode = exports.encode = void 0;
    -                const raw = ['|', '<', '>', '?', ':'];
    -                const win = raw.map(char => String.fromCharCode(0xf000 + char.charCodeAt(0)));
    -                const toWin = new Map(raw.map((char, i) => [char, win[i]]));
    -                const toRaw = new Map(win.map((char, i) => [char, raw[i]]));
    -                const encode = (s) => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s);
    -                exports.encode = encode;
    -                const decode = (s) => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s);
    -                exports.decode = decode;
    -                //# sourceMappingURL=winchars.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 4028:
    -/***/ (function (__unused_webpack_module, exports, __nccwpck_require__) {
    -
    -                "use strict";
    -
    -                var __createBinding = (this && this.__createBinding) || (Object.create ? (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    var desc = Object.getOwnPropertyDescriptor(m, k);
    -                    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    -                        desc = { enumerable: true, get: function () { return m[k]; } };
    -                    }
    -                    Object.defineProperty(o, k2, desc);
    -                }) : (function (o, m, k, k2) {
    -                    if (k2 === undefined) k2 = k;
    -                    o[k2] = m[k];
    -                }));
    -                var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function (o, v) {
    -                    Object.defineProperty(o, "default", { enumerable: true, value: v });
    -                }) : function (o, v) {
    -                    o["default"] = v;
    -                });
    -                var __importStar = (this && this.__importStar) || function (mod) {
    -                    if (mod && mod.__esModule) return mod;
    -                    var result = {};
    -                    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    -                    __setModuleDefault(result, mod);
    -                    return result;
    -                };
    -                var __importDefault = (this && this.__importDefault) || function (mod) {
    -                    return (mod && mod.__esModule) ? mod : { "default": mod };
    -                };
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.WriteEntryTar = exports.WriteEntrySync = exports.WriteEntry = void 0;
    -                const fs_1 = __importDefault(__nccwpck_require__(7147));
    -                const minipass_1 = __nccwpck_require__(4721);
    -                const path_1 = __importDefault(__nccwpck_require__(1017));
    -                const header_js_1 = __nccwpck_require__(2374);
    -                const mode_fix_js_1 = __nccwpck_require__(1810);
    -                const normalize_windows_path_js_1 = __nccwpck_require__(762);
    -                const options_js_1 = __nccwpck_require__(9060);
    -                const pax_js_1 = __nccwpck_require__(8567);
    -                const strip_absolute_path_js_1 = __nccwpck_require__(1126);
    -                const strip_trailing_slashes_js_1 = __nccwpck_require__(6018);
    -                const warn_method_js_1 = __nccwpck_require__(449);
    -                const winchars = __importStar(__nccwpck_require__(4978));
    -                const prefixPath = (path, prefix) => {
    -                    if (!prefix) {
    -                        return (0, normalize_windows_path_js_1.normalizeWindowsPath)(path);
    -                    }
    -                    path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path).replace(/^\.(\/|$)/, '');
    -                    return (0, strip_trailing_slashes_js_1.stripTrailingSlashes)(prefix) + '/' + path;
    -                };
    -                const maxReadSize = 16 * 1024 * 1024;
    -                const PROCESS = Symbol('process');
    -                const FILE = Symbol('file');
    -                const DIRECTORY = Symbol('directory');
    -                const SYMLINK = Symbol('symlink');
    -                const HARDLINK = Symbol('hardlink');
    -                const HEADER = Symbol('header');
    -                const READ = Symbol('read');
    -                const LSTAT = Symbol('lstat');
    -                const ONLSTAT = Symbol('onlstat');
    -                const ONREAD = Symbol('onread');
    -                const ONREADLINK = Symbol('onreadlink');
    -                const OPENFILE = Symbol('openfile');
    -                const ONOPENFILE = Symbol('onopenfile');
    -                const CLOSE = Symbol('close');
    -                const MODE = Symbol('mode');
    -                const AWAITDRAIN = Symbol('awaitDrain');
    -                const ONDRAIN = Symbol('ondrain');
    -                const PREFIX = Symbol('prefix');
    -                class WriteEntry extends minipass_1.Minipass {
    -                    path;
    -                    portable;
    -                    myuid = (process.getuid && process.getuid()) || 0;
    -                    // until node has builtin pwnam functions, this'll have to do
    -                    myuser = process.env.USER || '';
    -                    maxReadSize;
    -                    linkCache;
    -                    statCache;
    -                    preservePaths;
    -                    cwd;
    -                    strict;
    -                    mtime;
    -                    noPax;
    -                    noMtime;
    -                    prefix;
    -                    fd;
    -                    blockLen = 0;
    -                    blockRemain = 0;
    -                    buf;
    -                    pos = 0;
    -                    remain = 0;
    -                    length = 0;
    -                    offset = 0;
    -                    win32;
    -                    absolute;
    -                    header;
    -                    type;
    -                    linkpath;
    -                    stat;
    -                    /* c8 ignore start */
    -                    #hadError = false;
    -                    constructor(p, opt_ = {}) {
    -                        const opt = (0, options_js_1.dealias)(opt_);
    -                        super();
    -                        this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(p);
    -                        // suppress atime, ctime, uid, gid, uname, gname
    -                        this.portable = !!opt.portable;
    -                        this.maxReadSize = opt.maxReadSize || maxReadSize;
    -                        this.linkCache = opt.linkCache || new Map();
    -                        this.statCache = opt.statCache || new Map();
    -                        this.preservePaths = !!opt.preservePaths;
    -                        this.cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.cwd || process.cwd());
    -                        this.strict = !!opt.strict;
    -                        this.noPax = !!opt.noPax;
    -                        this.noMtime = !!opt.noMtime;
    -                        this.mtime = opt.mtime;
    -                        this.prefix =
    -                            opt.prefix ? (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.prefix) : undefined;
    -                        if (typeof opt.onwarn === 'function') {
    -                            this.on('warn', opt.onwarn);
    -                        }
    -                        let pathWarn = false;
    -                        if (!this.preservePaths) {
    -                            const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(this.path);
    -                            if (root && typeof stripped === 'string') {
    -                                this.path = stripped;
    -                                pathWarn = root;
    -                            }
    -                        }
    -                        this.win32 = !!opt.win32 || process.platform === 'win32';
    -                        if (this.win32) {
    -                            // force the \ to / normalization, since we might not *actually*
    -                            // be on windows, but want \ to be considered a path separator.
    -                            this.path = winchars.decode(this.path.replace(/\\/g, '/'));
    -                            p = p.replace(/\\/g, '/');
    -                        }
    -                        this.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.absolute || path_1.default.resolve(this.cwd, p));
    -                        if (this.path === '') {
    -                            this.path = './';
    -                        }
    -                        if (pathWarn) {
    -                            this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, {
    -                                entry: this,
    -                                path: pathWarn + this.path,
    -                            });
    -                        }
    -                        const cs = this.statCache.get(this.absolute);
    -                        if (cs) {
    -                            this[ONLSTAT](cs);
    -                        }
    -                        else {
    -                            this[LSTAT]();
    -                        }
    -                    }
    -                    warn(code, message, data = {}) {
    -                        return (0, warn_method_js_1.warnMethod)(this, code, message, data);
    -                    }
    -                    emit(ev, ...data) {
    -                        if (ev === 'error') {
    -                            this.#hadError = true;
    -                        }
    -                        return super.emit(ev, ...data);
    -                    }
    -                    [LSTAT]() {
    -                        fs_1.default.lstat(this.absolute, (er, stat) => {
    -                            if (er) {
    -                                return this.emit('error', er);
    -                            }
    -                            this[ONLSTAT](stat);
    -                        });
    -                    }
    -                    [ONLSTAT](stat) {
    -                        this.statCache.set(this.absolute, stat);
    -                        this.stat = stat;
    -                        if (!stat.isFile()) {
    -                            stat.size = 0;
    -                        }
    -                        this.type = getType(stat);
    -                        this.emit('stat', stat);
    -                        this[PROCESS]();
    -                    }
    -                    [PROCESS]() {
    -                        switch (this.type) {
    -                            case 'File':
    -                                return this[FILE]();
    -                            case 'Directory':
    -                                return this[DIRECTORY]();
    -                            case 'SymbolicLink':
    -                                return this[SYMLINK]();
    -                            // unsupported types are ignored.
    -                            default:
    -                                return this.end();
    -                        }
    -                    }
    -                    [MODE](mode) {
    -                        return (0, mode_fix_js_1.modeFix)(mode, this.type === 'Directory', this.portable);
    -                    }
    -                    [PREFIX](path) {
    -                        return prefixPath(path, this.prefix);
    -                    }
    -                    [HEADER]() {
    -                        /* c8 ignore start */
    -                        if (!this.stat) {
    -                            throw new Error('cannot write header before stat');
    -                        }
    -                        /* c8 ignore stop */
    -                        if (this.type === 'Directory' && this.portable) {
    -                            this.noMtime = true;
    -                        }
    -                        this.header = new header_js_1.Header({
    -                            path: this[PREFIX](this.path),
    -                            // only apply the prefix to hard links.
    -                            linkpath: this.type === 'Link' && this.linkpath !== undefined ?
    -                                this[PREFIX](this.linkpath)
    -                                : this.linkpath,
    -                            // only the permissions and setuid/setgid/sticky bitflags
    -                            // not the higher-order bits that specify file type
    -                            mode: this[MODE](this.stat.mode),
    -                            uid: this.portable ? undefined : this.stat.uid,
    -                            gid: this.portable ? undefined : this.stat.gid,
    -                            size: this.stat.size,
    -                            mtime: this.noMtime ? undefined : this.mtime || this.stat.mtime,
    -                            /* c8 ignore next */
    -                            type: this.type === 'Unsupported' ? undefined : this.type,
    -                            uname: this.portable ? undefined
    -                                : this.stat.uid === this.myuid ? this.myuser
    -                                    : '',
    -                            atime: this.portable ? undefined : this.stat.atime,
    -                            ctime: this.portable ? undefined : this.stat.ctime,
    -                        });
    -                        if (this.header.encode() && !this.noPax) {
    -                            super.write(new pax_js_1.Pax({
    -                                atime: this.portable ? undefined : this.header.atime,
    -                                ctime: this.portable ? undefined : this.header.ctime,
    -                                gid: this.portable ? undefined : this.header.gid,
    -                                mtime: this.noMtime ? undefined : (this.mtime || this.header.mtime),
    -                                path: this[PREFIX](this.path),
    -                                linkpath: this.type === 'Link' && this.linkpath !== undefined ?
    -                                    this[PREFIX](this.linkpath)
    -                                    : this.linkpath,
    -                                size: this.header.size,
    -                                uid: this.portable ? undefined : this.header.uid,
    -                                uname: this.portable ? undefined : this.header.uname,
    -                                dev: this.portable ? undefined : this.stat.dev,
    -                                ino: this.portable ? undefined : this.stat.ino,
    -                                nlink: this.portable ? undefined : this.stat.nlink,
    -                            }).encode());
    -                        }
    -                        const block = this.header?.block;
    -                        /* c8 ignore start */
    -                        if (!block) {
    -                            throw new Error('failed to encode header');
    -                        }
    -                        /* c8 ignore stop */
    -                        super.write(block);
    -                    }
    -                    [DIRECTORY]() {
    -                        /* c8 ignore start */
    -                        if (!this.stat) {
    -                            throw new Error('cannot create directory entry without stat');
    -                        }
    -                        /* c8 ignore stop */
    -                        if (this.path.slice(-1) !== '/') {
    -                            this.path += '/';
    -                        }
    -                        this.stat.size = 0;
    -                        this[HEADER]();
    -                        this.end();
    -                    }
    -                    [SYMLINK]() {
    -                        fs_1.default.readlink(this.absolute, (er, linkpath) => {
    -                            if (er) {
    -                                return this.emit('error', er);
    -                            }
    -                            this[ONREADLINK](linkpath);
    -                        });
    -                    }
    -                    [ONREADLINK](linkpath) {
    -                        this.linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(linkpath);
    -                        this[HEADER]();
    -                        this.end();
    -                    }
    -                    [HARDLINK](linkpath) {
    -                        /* c8 ignore start */
    -                        if (!this.stat) {
    -                            throw new Error('cannot create link entry without stat');
    -                        }
    -                        /* c8 ignore stop */
    -                        this.type = 'Link';
    -                        this.linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path_1.default.relative(this.cwd, linkpath));
    -                        this.stat.size = 0;
    -                        this[HEADER]();
    -                        this.end();
    -                    }
    -                    [FILE]() {
    -                        /* c8 ignore start */
    -                        if (!this.stat) {
    -                            throw new Error('cannot create file entry without stat');
    -                        }
    -                        /* c8 ignore stop */
    -                        if (this.stat.nlink > 1) {
    -                            const linkKey = `${this.stat.dev}:${this.stat.ino}`;
    -                            const linkpath = this.linkCache.get(linkKey);
    -                            if (linkpath?.indexOf(this.cwd) === 0) {
    -                                return this[HARDLINK](linkpath);
    -                            }
    -                            this.linkCache.set(linkKey, this.absolute);
    -                        }
    -                        this[HEADER]();
    -                        if (this.stat.size === 0) {
    -                            return this.end();
    -                        }
    -                        this[OPENFILE]();
    -                    }
    -                    [OPENFILE]() {
    -                        fs_1.default.open(this.absolute, 'r', (er, fd) => {
    -                            if (er) {
    -                                return this.emit('error', er);
    -                            }
    -                            this[ONOPENFILE](fd);
    -                        });
    -                    }
    -                    [ONOPENFILE](fd) {
    -                        this.fd = fd;
    -                        if (this.#hadError) {
    -                            return this[CLOSE]();
    -                        }
    -                        /* c8 ignore start */
    -                        if (!this.stat) {
    -                            throw new Error('should stat before calling onopenfile');
    -                        }
    -                        /* c8 ignore start */
    -                        this.blockLen = 512 * Math.ceil(this.stat.size / 512);
    -                        this.blockRemain = this.blockLen;
    -                        const bufLen = Math.min(this.blockLen, this.maxReadSize);
    -                        this.buf = Buffer.allocUnsafe(bufLen);
    -                        this.offset = 0;
    -                        this.pos = 0;
    -                        this.remain = this.stat.size;
    -                        this.length = this.buf.length;
    -                        this[READ]();
    -                    }
    -                    [READ]() {
    -                        const { fd, buf, offset, length, pos } = this;
    -                        if (fd === undefined || buf === undefined) {
    -                            throw new Error('cannot read file without first opening');
    -                        }
    -                        fs_1.default.read(fd, buf, offset, length, pos, (er, bytesRead) => {
    -                            if (er) {
    -                                // ignoring the error from close(2) is a bad practice, but at
    -                                // this point we already have an error, don't need another one
    -                                return this[CLOSE](() => this.emit('error', er));
    -                            }
    -                            this[ONREAD](bytesRead);
    -                        });
    -                    }
    -                    /* c8 ignore start */
    -                    [CLOSE](cb = () => { }) {
    -                        /* c8 ignore stop */
    -                        if (this.fd !== undefined)
    -                            fs_1.default.close(this.fd, cb);
    -                    }
    -                    [ONREAD](bytesRead) {
    -                        if (bytesRead <= 0 && this.remain > 0) {
    -                            const er = Object.assign(new Error('encountered unexpected EOF'), {
    -                                path: this.absolute,
    -                                syscall: 'read',
    -                                code: 'EOF',
    -                            });
    -                            return this[CLOSE](() => this.emit('error', er));
    -                        }
    -                        if (bytesRead > this.remain) {
    -                            const er = Object.assign(new Error('did not encounter expected EOF'), {
    -                                path: this.absolute,
    -                                syscall: 'read',
    -                                code: 'EOF',
    -                            });
    -                            return this[CLOSE](() => this.emit('error', er));
    -                        }
    -                        /* c8 ignore start */
    -                        if (!this.buf) {
    -                            throw new Error('should have created buffer prior to reading');
    -                        }
    -                        /* c8 ignore stop */
    -                        // null out the rest of the buffer, if we could fit the block padding
    -                        // at the end of this loop, we've incremented bytesRead and this.remain
    -                        // to be incremented up to the blockRemain level, as if we had expected
    -                        // to get a null-padded file, and read it until the end.  then we will
    -                        // decrement both remain and blockRemain by bytesRead, and know that we
    -                        // reached the expected EOF, without any null buffer to append.
    -                        if (bytesRead === this.remain) {
    -                            for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) {
    -                                this.buf[i + this.offset] = 0;
    -                                bytesRead++;
    -                                this.remain++;
    -                            }
    -                        }
    -                        const chunk = this.offset === 0 && bytesRead === this.buf.length ?
    -                            this.buf
    -                            : this.buf.subarray(this.offset, this.offset + bytesRead);
    -                        const flushed = this.write(chunk);
    -                        if (!flushed) {
    -                            this[AWAITDRAIN](() => this[ONDRAIN]());
    -                        }
    -                        else {
    -                            this[ONDRAIN]();
    -                        }
    -                    }
    -                    [AWAITDRAIN](cb) {
    -                        this.once('drain', cb);
    -                    }
    -                    write(chunk, encoding, cb) {
    -                        /* c8 ignore start - just junk to comply with NodeJS.WritableStream */
    -                        if (typeof encoding === 'function') {
    -                            cb = encoding;
    -                            encoding = undefined;
    -                        }
    -                        if (typeof chunk === 'string') {
    -                            chunk = Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8');
    -                        }
    -                        /* c8 ignore stop */
    -                        if (this.blockRemain < chunk.length) {
    -                            const er = Object.assign(new Error('writing more data than expected'), {
    -                                path: this.absolute,
    -                            });
    -                            return this.emit('error', er);
    -                        }
    -                        this.remain -= chunk.length;
    -                        this.blockRemain -= chunk.length;
    -                        this.pos += chunk.length;
    -                        this.offset += chunk.length;
    -                        return super.write(chunk, null, cb);
    -                    }
    -                    [ONDRAIN]() {
    -                        if (!this.remain) {
    -                            if (this.blockRemain) {
    -                                super.write(Buffer.alloc(this.blockRemain));
    -                            }
    -                            return this[CLOSE](er => er ? this.emit('error', er) : this.end());
    -                        }
    -                        /* c8 ignore start */
    -                        if (!this.buf) {
    -                            throw new Error('buffer lost somehow in ONDRAIN');
    -                        }
    -                        /* c8 ignore stop */
    -                        if (this.offset >= this.length) {
    -                            // if we only have a smaller bit left to read, alloc a smaller buffer
    -                            // otherwise, keep it the same length it was before.
    -                            this.buf = Buffer.allocUnsafe(Math.min(this.blockRemain, this.buf.length));
    -                            this.offset = 0;
    -                        }
    -                        this.length = this.buf.length - this.offset;
    -                        this[READ]();
    -                    }
    -                }
    -                exports.WriteEntry = WriteEntry;
    -                class WriteEntrySync extends WriteEntry {
    -                    sync = true;
    -                    [LSTAT]() {
    -                        this[ONLSTAT](fs_1.default.lstatSync(this.absolute));
    -                    }
    -                    [SYMLINK]() {
    -                        this[ONREADLINK](fs_1.default.readlinkSync(this.absolute));
    -                    }
    -                    [OPENFILE]() {
    -                        this[ONOPENFILE](fs_1.default.openSync(this.absolute, 'r'));
    -                    }
    -                    [READ]() {
    -                        let threw = true;
    -                        try {
    -                            const { fd, buf, offset, length, pos } = this;
    -                            /* c8 ignore start */
    -                            if (fd === undefined || buf === undefined) {
    -                                throw new Error('fd and buf must be set in READ method');
    -                            }
    -                            /* c8 ignore stop */
    -                            const bytesRead = fs_1.default.readSync(fd, buf, offset, length, pos);
    -                            this[ONREAD](bytesRead);
    -                            threw = false;
    -                        }
    -                        finally {
    -                            // ignoring the error from close(2) is a bad practice, but at
    -                            // this point we already have an error, don't need another one
    -                            if (threw) {
    -                                try {
    -                                    this[CLOSE](() => { });
    -                                }
    -                                catch (er) { }
    -                            }
    -                        }
    -                    }
    -                    [AWAITDRAIN](cb) {
    -                        cb();
    -                    }
    -                    /* c8 ignore start */
    -                    [CLOSE](cb = () => { }) {
    -                        /* c8 ignore stop */
    -                        if (this.fd !== undefined)
    -                            fs_1.default.closeSync(this.fd);
    -                        cb();
    -                    }
    -                }
    -                exports.WriteEntrySync = WriteEntrySync;
    -                class WriteEntryTar extends minipass_1.Minipass {
    -                    blockLen = 0;
    -                    blockRemain = 0;
    -                    buf = 0;
    -                    pos = 0;
    -                    remain = 0;
    -                    length = 0;
    -                    preservePaths;
    -                    portable;
    -                    strict;
    -                    noPax;
    -                    noMtime;
    -                    readEntry;
    -                    type;
    -                    prefix;
    -                    path;
    -                    mode;
    -                    uid;
    -                    gid;
    -                    uname;
    -                    gname;
    -                    header;
    -                    mtime;
    -                    atime;
    -                    ctime;
    -                    linkpath;
    -                    size;
    -                    warn(code, message, data = {}) {
    -                        return (0, warn_method_js_1.warnMethod)(this, code, message, data);
    -                    }
    -                    constructor(readEntry, opt_ = {}) {
    -                        const opt = (0, options_js_1.dealias)(opt_);
    -                        super();
    -                        this.preservePaths = !!opt.preservePaths;
    -                        this.portable = !!opt.portable;
    -                        this.strict = !!opt.strict;
    -                        this.noPax = !!opt.noPax;
    -                        this.noMtime = !!opt.noMtime;
    -                        this.readEntry = readEntry;
    -                        const { type } = readEntry;
    -                        /* c8 ignore start */
    -                        if (type === 'Unsupported') {
    -                            throw new Error('writing entry that should be ignored');
    -                        }
    -                        /* c8 ignore stop */
    -                        this.type = type;
    -                        if (this.type === 'Directory' && this.portable) {
    -                            this.noMtime = true;
    -                        }
    -                        this.prefix = opt.prefix;
    -                        this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(readEntry.path);
    -                        this.mode =
    -                            readEntry.mode !== undefined ?
    -                                this[MODE](readEntry.mode)
    -                                : undefined;
    -                        this.uid = this.portable ? undefined : readEntry.uid;
    -                        this.gid = this.portable ? undefined : readEntry.gid;
    -                        this.uname = this.portable ? undefined : readEntry.uname;
    -                        this.gname = this.portable ? undefined : readEntry.gname;
    -                        this.size = readEntry.size;
    -                        this.mtime =
    -                            this.noMtime ? undefined : opt.mtime || readEntry.mtime;
    -                        this.atime = this.portable ? undefined : readEntry.atime;
    -                        this.ctime = this.portable ? undefined : readEntry.ctime;
    -                        this.linkpath =
    -                            readEntry.linkpath !== undefined ?
    -                                (0, normalize_windows_path_js_1.normalizeWindowsPath)(readEntry.linkpath)
    -                                : undefined;
    -                        if (typeof opt.onwarn === 'function') {
    -                            this.on('warn', opt.onwarn);
    -                        }
    -                        let pathWarn = false;
    -                        if (!this.preservePaths) {
    -                            const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(this.path);
    -                            if (root && typeof stripped === 'string') {
    -                                this.path = stripped;
    -                                pathWarn = root;
    -                            }
    -                        }
    -                        this.remain = readEntry.size;
    -                        this.blockRemain = readEntry.startBlockSize;
    -                        this.header = new header_js_1.Header({
    -                            path: this[PREFIX](this.path),
    -                            linkpath: this.type === 'Link' && this.linkpath !== undefined ?
    -                                this[PREFIX](this.linkpath)
    -                                : this.linkpath,
    -                            // only the permissions and setuid/setgid/sticky bitflags
    -                            // not the higher-order bits that specify file type
    -                            mode: this.mode,
    -                            uid: this.portable ? undefined : this.uid,
    -                            gid: this.portable ? undefined : this.gid,
    -                            size: this.size,
    -                            mtime: this.noMtime ? undefined : this.mtime,
    -                            type: this.type,
    -                            uname: this.portable ? undefined : this.uname,
    -                            atime: this.portable ? undefined : this.atime,
    -                            ctime: this.portable ? undefined : this.ctime,
    -                        });
    -                        if (pathWarn) {
    -                            this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, {
    -                                entry: this,
    -                                path: pathWarn + this.path,
    -                            });
    -                        }
    -                        if (this.header.encode() && !this.noPax) {
    -                            super.write(new pax_js_1.Pax({
    -                                atime: this.portable ? undefined : this.atime,
    -                                ctime: this.portable ? undefined : this.ctime,
    -                                gid: this.portable ? undefined : this.gid,
    -                                mtime: this.noMtime ? undefined : this.mtime,
    -                                path: this[PREFIX](this.path),
    -                                linkpath: this.type === 'Link' && this.linkpath !== undefined ?
    -                                    this[PREFIX](this.linkpath)
    -                                    : this.linkpath,
    -                                size: this.size,
    -                                uid: this.portable ? undefined : this.uid,
    -                                uname: this.portable ? undefined : this.uname,
    -                                dev: this.portable ? undefined : this.readEntry.dev,
    -                                ino: this.portable ? undefined : this.readEntry.ino,
    -                                nlink: this.portable ? undefined : this.readEntry.nlink,
    -                            }).encode());
    -                        }
    -                        const b = this.header?.block;
    -                        /* c8 ignore start */
    -                        if (!b)
    -                            throw new Error('failed to encode header');
    -                        /* c8 ignore stop */
    -                        super.write(b);
    -                        readEntry.pipe(this);
    -                    }
    -                    [PREFIX](path) {
    -                        return prefixPath(path, this.prefix);
    -                    }
    -                    [MODE](mode) {
    -                        return (0, mode_fix_js_1.modeFix)(mode, this.type === 'Directory', this.portable);
    -                    }
    -                    write(chunk, encoding, cb) {
    -                        /* c8 ignore start - just junk to comply with NodeJS.WritableStream */
    -                        if (typeof encoding === 'function') {
    -                            cb = encoding;
    -                            encoding = undefined;
    -                        }
    -                        if (typeof chunk === 'string') {
    -                            chunk = Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8');
    -                        }
    -                        /* c8 ignore stop */
    -                        const writeLen = chunk.length;
    -                        if (writeLen > this.blockRemain) {
    -                            throw new Error('writing more to entry than is appropriate');
    -                        }
    -                        this.blockRemain -= writeLen;
    -                        return super.write(chunk, cb);
    -                    }
    -                    end(chunk, encoding, cb) {
    -                        if (this.blockRemain) {
    -                            super.write(Buffer.alloc(this.blockRemain));
    -                        }
    -                        /* c8 ignore start - just junk to comply with NodeJS.WritableStream */
    -                        if (typeof chunk === 'function') {
    -                            cb = chunk;
    -                            encoding = undefined;
    -                            chunk = undefined;
    -                        }
    -                        if (typeof encoding === 'function') {
    -                            cb = encoding;
    -                            encoding = undefined;
    -                        }
    -                        if (typeof chunk === 'string') {
    -                            chunk = Buffer.from(chunk, encoding ?? 'utf8');
    -                        }
    -                        if (cb)
    -                            this.once('finish', cb);
    -                        chunk ? super.end(chunk, cb) : super.end(cb);
    -                        /* c8 ignore stop */
    -                        return this;
    -                    }
    -                }
    -                exports.WriteEntryTar = WriteEntryTar;
    -                const getType = (stat) => stat.isFile() ? 'File'
    -                    : stat.isDirectory() ? 'Directory'
    -                        : stat.isSymbolicLink() ? 'SymbolicLink'
    -                            : 'Unsupported';
    -                //# sourceMappingURL=write-entry.js.map
    -
    -                /***/
    -}),
    -
    -/***/ 3796:
    -/***/ ((__unused_webpack_module, exports) => {
    -
    -                "use strict";
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -                exports.Node = exports.Yallist = void 0;
    -                class Yallist {
    -                    tail;
    -                    head;
    -                    length = 0;
    -                    static create(list = []) {
    -                        return new Yallist(list);
    -                    }
    -                    constructor(list = []) {
    -                        for (const item of list) {
    -                            this.push(item);
    -                        }
    -                    }
    -                    *[Symbol.iterator]() {
    -                        for (let walker = this.head; walker; walker = walker.next) {
    -                            yield walker.value;
    -                        }
    -                    }
    -                    removeNode(node) {
    -                        if (node.list !== this) {
    -                            throw new Error('removing node which does not belong to this list');
    -                        }
    -                        const next = node.next;
    -                        const prev = node.prev;
    -                        if (next) {
    -                            next.prev = prev;
    -                        }
    -                        if (prev) {
    -                            prev.next = next;
    -                        }
    -                        if (node === this.head) {
    -                            this.head = next;
    -                        }
    -                        if (node === this.tail) {
    -                            this.tail = prev;
    -                        }
    -                        this.length--;
    -                        node.next = undefined;
    -                        node.prev = undefined;
    -                        node.list = undefined;
    -                        return next;
    -                    }
    -                    unshiftNode(node) {
    -                        if (node === this.head) {
    -                            return;
    -                        }
    -                        if (node.list) {
    -                            node.list.removeNode(node);
    -                        }
    -                        const head = this.head;
    -                        node.list = this;
    -                        node.next = head;
    -                        if (head) {
    -                            head.prev = node;
    -                        }
    -                        this.head = node;
    -                        if (!this.tail) {
    -                            this.tail = node;
    -                        }
    -                        this.length++;
    -                    }
    -                    pushNode(node) {
    -                        if (node === this.tail) {
    -                            return;
    -                        }
    -                        if (node.list) {
    -                            node.list.removeNode(node);
    -                        }
    -                        const tail = this.tail;
    -                        node.list = this;
    -                        node.prev = tail;
    -                        if (tail) {
    -                            tail.next = node;
    -                        }
    -                        this.tail = node;
    -                        if (!this.head) {
    -                            this.head = node;
    -                        }
    -                        this.length++;
    -                    }
    -                    push(...args) {
    -                        for (let i = 0, l = args.length; i < l; i++) {
    -                            push(this, args[i]);
    -                        }
    -                        return this.length;
    -                    }
    -                    unshift(...args) {
    -                        for (var i = 0, l = args.length; i < l; i++) {
    -                            unshift(this, args[i]);
    -                        }
    -                        return this.length;
    -                    }
    -                    pop() {
    -                        if (!this.tail) {
    -                            return undefined;
    -                        }
    -                        const res = this.tail.value;
    -                        const t = this.tail;
    -                        this.tail = this.tail.prev;
    -                        if (this.tail) {
    -                            this.tail.next = undefined;
    -                        }
    -                        else {
    -                            this.head = undefined;
    -                        }
    -                        t.list = undefined;
    -                        this.length--;
    -                        return res;
    -                    }
    -                    shift() {
    -                        if (!this.head) {
    -                            return undefined;
    -                        }
    -                        const res = this.head.value;
    -                        const h = this.head;
    -                        this.head = this.head.next;
    -                        if (this.head) {
    -                            this.head.prev = undefined;
    -                        }
    -                        else {
    -                            this.tail = undefined;
    -                        }
    -                        h.list = undefined;
    -                        this.length--;
    -                        return res;
    -                    }
    -                    forEach(fn, thisp) {
    -                        thisp = thisp || this;
    -                        for (let walker = this.head, i = 0; !!walker; i++) {
    -                            fn.call(thisp, walker.value, i, this);
    -                            walker = walker.next;
    -                        }
    -                    }
    -                    forEachReverse(fn, thisp) {
    -                        thisp = thisp || this;
    -                        for (let walker = this.tail, i = this.length - 1; !!walker; i--) {
    -                            fn.call(thisp, walker.value, i, this);
    -                            walker = walker.prev;
    -                        }
    -                    }
    -                    get(n) {
    -                        let i = 0;
    -                        let walker = this.head;
    -                        for (; !!walker && i < n; i++) {
    -                            walker = walker.next;
    -                        }
    -                        if (i === n && !!walker) {
    -                            return walker.value;
    -                        }
    -                    }
    -                    getReverse(n) {
    -                        let i = 0;
    -                        let walker = this.tail;
    -                        for (; !!walker && i < n; i++) {
    -                            // abort out of the list early if we hit a cycle
    -                            walker = walker.prev;
    -                        }
    -                        if (i === n && !!walker) {
    -                            return walker.value;
    -                        }
    -                    }
    -                    map(fn, thisp) {
    -                        thisp = thisp || this;
    -                        const res = new Yallist();
    -                        for (let walker = this.head; !!walker;) {
    -                            res.push(fn.call(thisp, walker.value, this));
    -                            walker = walker.next;
    -                        }
    -                        return res;
    -                    }
    -                    mapReverse(fn, thisp) {
    -                        thisp = thisp || this;
    -                        var res = new Yallist();
    -                        for (let walker = this.tail; !!walker;) {
    -                            res.push(fn.call(thisp, walker.value, this));
    -                            walker = walker.prev;
    -                        }
    -                        return res;
    -                    }
    -                    reduce(fn, initial) {
    -                        let acc;
    -                        let walker = this.head;
    -                        if (arguments.length > 1) {
    -                            acc = initial;
    -                        }
    -                        else if (this.head) {
    -                            walker = this.head.next;
    -                            acc = this.head.value;
    -                        }
    -                        else {
    -                            throw new TypeError('Reduce of empty list with no initial value');
    -                        }
    -                        for (var i = 0; !!walker; i++) {
    -                            acc = fn(acc, walker.value, i);
    -                            walker = walker.next;
    -                        }
    -                        return acc;
    -                    }
    -                    reduceReverse(fn, initial) {
    -                        let acc;
    -                        let walker = this.tail;
    -                        if (arguments.length > 1) {
    -                            acc = initial;
    -                        }
    -                        else if (this.tail) {
    -                            walker = this.tail.prev;
    -                            acc = this.tail.value;
    -                        }
    -                        else {
    -                            throw new TypeError('Reduce of empty list with no initial value');
    -                        }
    -                        for (let i = this.length - 1; !!walker; i--) {
    -                            acc = fn(acc, walker.value, i);
    -                            walker = walker.prev;
    -                        }
    -                        return acc;
    -                    }
    -                    toArray() {
    -                        const arr = new Array(this.length);
    -                        for (let i = 0, walker = this.head; !!walker; i++) {
    -                            arr[i] = walker.value;
    -                            walker = walker.next;
    -                        }
    -                        return arr;
    -                    }
    -                    toArrayReverse() {
    -                        const arr = new Array(this.length);
    -                        for (let i = 0, walker = this.tail; !!walker; i++) {
    -                            arr[i] = walker.value;
    -                            walker = walker.prev;
    -                        }
    -                        return arr;
    -                    }
    -                    slice(from = 0, to = this.length) {
    -                        if (to < 0) {
    -                            to += this.length;
    -                        }
    -                        if (from < 0) {
    -                            from += this.length;
    -                        }
    -                        const ret = new Yallist();
    -                        if (to < from || to < 0) {
    -                            return ret;
    -                        }
    -                        if (from < 0) {
    -                            from = 0;
    -                        }
    -                        if (to > this.length) {
    -                            to = this.length;
    -                        }
    -                        let walker = this.head;
    -                        let i = 0;
    -                        for (i = 0; !!walker && i < from; i++) {
    -                            walker = walker.next;
    -                        }
    -                        for (; !!walker && i < to; i++, walker = walker.next) {
    -                            ret.push(walker.value);
    -                        }
    -                        return ret;
    -                    }
    -                    sliceReverse(from = 0, to = this.length) {
    -                        if (to < 0) {
    -                            to += this.length;
    -                        }
    -                        if (from < 0) {
    -                            from += this.length;
    -                        }
    -                        const ret = new Yallist();
    -                        if (to < from || to < 0) {
    -                            return ret;
    -                        }
    -                        if (from < 0) {
    -                            from = 0;
    -                        }
    -                        if (to > this.length) {
    -                            to = this.length;
    -                        }
    -                        let i = this.length;
    -                        let walker = this.tail;
    -                        for (; !!walker && i > to; i--) {
    -                            walker = walker.prev;
    -                        }
    -                        for (; !!walker && i > from; i--, walker = walker.prev) {
    -                            ret.push(walker.value);
    -                        }
    -                        return ret;
    -                    }
    -                    splice(start, deleteCount = 0, ...nodes) {
    -                        if (start > this.length) {
    -                            start = this.length - 1;
    -                        }
    -                        if (start < 0) {
    -                            start = this.length + start;
    -                        }
    -                        let walker = this.head;
    -                        for (let i = 0; !!walker && i < start; i++) {
    -                            walker = walker.next;
    -                        }
    -                        const ret = [];
    -                        for (let i = 0; !!walker && i < deleteCount; i++) {
    -                            ret.push(walker.value);
    -                            walker = this.removeNode(walker);
    -                        }
    -                        if (!walker) {
    -                            walker = this.tail;
    -                        }
    -                        else if (walker !== this.tail) {
    -                            walker = walker.prev;
    +/***/ }),
    +
    +/***/ 7390:
    +/***/ ((__unused_webpack_module, exports) => {
    +
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.code = exports.name = exports.isName = exports.isCode = void 0;
    +const isCode = (c) => exports.name.has(c);
    +exports.isCode = isCode;
    +const isName = (c) => exports.code.has(c);
    +exports.isName = isName;
    +// map types from key to human-friendly name
    +exports.name = new Map([
    +    ['0', 'File'],
    +    // same as File
    +    ['', 'OldFile'],
    +    ['1', 'Link'],
    +    ['2', 'SymbolicLink'],
    +    // Devices and FIFOs aren't fully supported
    +    // they are parsed, but skipped when unpacking
    +    ['3', 'CharacterDevice'],
    +    ['4', 'BlockDevice'],
    +    ['5', 'Directory'],
    +    ['6', 'FIFO'],
    +    // same as File
    +    ['7', 'ContiguousFile'],
    +    // pax headers
    +    ['g', 'GlobalExtendedHeader'],
    +    ['x', 'ExtendedHeader'],
    +    // vendor-specific stuff
    +    // skip
    +    ['A', 'SolarisACL'],
    +    // like 5, but with data, which should be skipped
    +    ['D', 'GNUDumpDir'],
    +    // metadata only, skip
    +    ['I', 'Inode'],
    +    // data = link path of next file
    +    ['K', 'NextFileHasLongLinkpath'],
    +    // data = path of next file
    +    ['L', 'NextFileHasLongPath'],
    +    // skip
    +    ['M', 'ContinuationFile'],
    +    // like L
    +    ['N', 'OldGnuLongPath'],
    +    // skip
    +    ['S', 'SparseFile'],
    +    // skip
    +    ['V', 'TapeVolumeHeader'],
    +    // like x
    +    ['X', 'OldExtendedHeader'],
    +]);
    +// map the other direction
    +exports.code = new Map(Array.from(exports.name).map(kv => [kv[1], kv[0]]));
    +//# sourceMappingURL=types.js.map
    +
    +/***/ }),
    +
    +/***/ 6973:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
    +
    +"use strict";
    +
    +// the PEND/UNPEND stuff tracks whether we're ready to emit end/close yet.
    +// but the path reservations are required to avoid race conditions where
    +// parallelized unpack ops may mess with one another, due to dependencies
    +// (like a Link depending on its target) or destructive operations (like
    +// clobbering an fs object to create one of a different type.)
    +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    var desc = Object.getOwnPropertyDescriptor(m, k);
    +    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    +      desc = { enumerable: true, get: function() { return m[k]; } };
    +    }
    +    Object.defineProperty(o, k2, desc);
    +}) : (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    o[k2] = m[k];
    +}));
    +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    +    Object.defineProperty(o, "default", { enumerable: true, value: v });
    +}) : function(o, v) {
    +    o["default"] = v;
    +});
    +var __importStar = (this && this.__importStar) || function (mod) {
    +    if (mod && mod.__esModule) return mod;
    +    var result = {};
    +    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    +    __setModuleDefault(result, mod);
    +    return result;
    +};
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.UnpackSync = exports.Unpack = void 0;
    +const fsm = __importStar(__nccwpck_require__(675));
    +const node_assert_1 = __importDefault(__nccwpck_require__(8061));
    +const node_crypto_1 = __nccwpck_require__(6005);
    +const node_fs_1 = __importDefault(__nccwpck_require__(7561));
    +const node_path_1 = __importDefault(__nccwpck_require__(9411));
    +const get_write_flag_js_1 = __nccwpck_require__(1663);
    +const mkdir_js_1 = __nccwpck_require__(8704);
    +const normalize_unicode_js_1 = __nccwpck_require__(9862);
    +const normalize_windows_path_js_1 = __nccwpck_require__(762);
    +const parse_js_1 = __nccwpck_require__(2522);
    +const strip_absolute_path_js_1 = __nccwpck_require__(1126);
    +const strip_trailing_slashes_js_1 = __nccwpck_require__(6018);
    +const wc = __importStar(__nccwpck_require__(4978));
    +const path_reservations_js_1 = __nccwpck_require__(3588);
    +const ONENTRY = Symbol('onEntry');
    +const CHECKFS = Symbol('checkFs');
    +const CHECKFS2 = Symbol('checkFs2');
    +const PRUNECACHE = Symbol('pruneCache');
    +const ISREUSABLE = Symbol('isReusable');
    +const MAKEFS = Symbol('makeFs');
    +const FILE = Symbol('file');
    +const DIRECTORY = Symbol('directory');
    +const LINK = Symbol('link');
    +const SYMLINK = Symbol('symlink');
    +const HARDLINK = Symbol('hardlink');
    +const UNSUPPORTED = Symbol('unsupported');
    +const CHECKPATH = Symbol('checkPath');
    +const MKDIR = Symbol('mkdir');
    +const ONERROR = Symbol('onError');
    +const PENDING = Symbol('pending');
    +const PEND = Symbol('pend');
    +const UNPEND = Symbol('unpend');
    +const ENDED = Symbol('ended');
    +const MAYBECLOSE = Symbol('maybeClose');
    +const SKIP = Symbol('skip');
    +const DOCHOWN = Symbol('doChown');
    +const UID = Symbol('uid');
    +const GID = Symbol('gid');
    +const CHECKED_CWD = Symbol('checkedCwd');
    +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform;
    +const isWindows = platform === 'win32';
    +const DEFAULT_MAX_DEPTH = 1024;
    +// Unlinks on Windows are not atomic.
    +//
    +// This means that if you have a file entry, followed by another
    +// file entry with an identical name, and you cannot re-use the file
    +// (because it's a hardlink, or because unlink:true is set, or it's
    +// Windows, which does not have useful nlink values), then the unlink
    +// will be committed to the disk AFTER the new file has been written
    +// over the old one, deleting the new file.
    +//
    +// To work around this, on Windows systems, we rename the file and then
    +// delete the renamed file.  It's a sloppy kludge, but frankly, I do not
    +// know of a better way to do this, given windows' non-atomic unlink
    +// semantics.
    +//
    +// See: https://github.com/npm/node-tar/issues/183
    +/* c8 ignore start */
    +const unlinkFile = (path, cb) => {
    +    if (!isWindows) {
    +        return node_fs_1.default.unlink(path, cb);
    +    }
    +    const name = path + '.DELETE.' + (0, node_crypto_1.randomBytes)(16).toString('hex');
    +    node_fs_1.default.rename(path, name, er => {
    +        if (er) {
    +            return cb(er);
    +        }
    +        node_fs_1.default.unlink(name, cb);
    +    });
    +};
    +/* c8 ignore stop */
    +/* c8 ignore start */
    +const unlinkFileSync = (path) => {
    +    if (!isWindows) {
    +        return node_fs_1.default.unlinkSync(path);
    +    }
    +    const name = path + '.DELETE.' + (0, node_crypto_1.randomBytes)(16).toString('hex');
    +    node_fs_1.default.renameSync(path, name);
    +    node_fs_1.default.unlinkSync(name);
    +};
    +/* c8 ignore stop */
    +// this.gid, entry.gid, this.processUid
    +const uint32 = (a, b, c) => a !== undefined && a === a >>> 0 ? a
    +    : b !== undefined && b === b >>> 0 ? b
    +        : c;
    +// clear the cache if it's a case-insensitive unicode-squashing match.
    +// we can't know if the current file system is case-sensitive or supports
    +// unicode fully, so we check for similarity on the maximally compatible
    +// representation.  Err on the side of pruning, since all it's doing is
    +// preventing lstats, and it's not the end of the world if we get a false
    +// positive.
    +// Note that on windows, we always drop the entire cache whenever a
    +// symbolic link is encountered, because 8.3 filenames are impossible
    +// to reason about, and collisions are hazards rather than just failures.
    +const cacheKeyNormalize = (path) => (0, strip_trailing_slashes_js_1.stripTrailingSlashes)((0, normalize_windows_path_js_1.normalizeWindowsPath)((0, normalize_unicode_js_1.normalizeUnicode)(path))).toLowerCase();
    +// remove all cache entries matching ${abs}/**
    +const pruneCache = (cache, abs) => {
    +    abs = cacheKeyNormalize(abs);
    +    for (const path of cache.keys()) {
    +        const pnorm = cacheKeyNormalize(path);
    +        if (pnorm === abs || pnorm.indexOf(abs + '/') === 0) {
    +            cache.delete(path);
    +        }
    +    }
    +};
    +const dropCache = (cache) => {
    +    for (const key of cache.keys()) {
    +        cache.delete(key);
    +    }
    +};
    +class Unpack extends parse_js_1.Parser {
    +    [ENDED] = false;
    +    [CHECKED_CWD] = false;
    +    [PENDING] = 0;
    +    reservations = new path_reservations_js_1.PathReservations();
    +    transform;
    +    writable = true;
    +    readable = false;
    +    dirCache;
    +    uid;
    +    gid;
    +    setOwner;
    +    preserveOwner;
    +    processGid;
    +    processUid;
    +    maxDepth;
    +    forceChown;
    +    win32;
    +    newer;
    +    keep;
    +    noMtime;
    +    preservePaths;
    +    unlink;
    +    cwd;
    +    strip;
    +    processUmask;
    +    umask;
    +    dmode;
    +    fmode;
    +    chmod;
    +    constructor(opt = {}) {
    +        opt.ondone = () => {
    +            this[ENDED] = true;
    +            this[MAYBECLOSE]();
    +        };
    +        super(opt);
    +        this.transform = opt.transform;
    +        this.dirCache = opt.dirCache || new Map();
    +        this.chmod = !!opt.chmod;
    +        if (typeof opt.uid === 'number' || typeof opt.gid === 'number') {
    +            // need both or neither
    +            if (typeof opt.uid !== 'number' ||
    +                typeof opt.gid !== 'number') {
    +                throw new TypeError('cannot set owner without number uid and gid');
    +            }
    +            if (opt.preserveOwner) {
    +                throw new TypeError('cannot preserve owner in archive and also set owner explicitly');
    +            }
    +            this.uid = opt.uid;
    +            this.gid = opt.gid;
    +            this.setOwner = true;
    +        }
    +        else {
    +            this.uid = undefined;
    +            this.gid = undefined;
    +            this.setOwner = false;
    +        }
    +        // default true for root
    +        if (opt.preserveOwner === undefined &&
    +            typeof opt.uid !== 'number') {
    +            this.preserveOwner = !!(process.getuid && process.getuid() === 0);
    +        }
    +        else {
    +            this.preserveOwner = !!opt.preserveOwner;
    +        }
    +        this.processUid =
    +            (this.preserveOwner || this.setOwner) && process.getuid ?
    +                process.getuid()
    +                : undefined;
    +        this.processGid =
    +            (this.preserveOwner || this.setOwner) && process.getgid ?
    +                process.getgid()
    +                : undefined;
    +        // prevent excessively deep nesting of subfolders
    +        // set to `Infinity` to remove this restriction
    +        this.maxDepth =
    +            typeof opt.maxDepth === 'number' ?
    +                opt.maxDepth
    +                : DEFAULT_MAX_DEPTH;
    +        // mostly just for testing, but useful in some cases.
    +        // Forcibly trigger a chown on every entry, no matter what
    +        this.forceChown = opt.forceChown === true;
    +        // turn > this[ONENTRY](entry));
    +    }
    +    // a bad or damaged archive is a warning for Parser, but an error
    +    // when extracting.  Mark those errors as unrecoverable, because
    +    // the Unpack contract cannot be met.
    +    warn(code, msg, data = {}) {
    +        if (code === 'TAR_BAD_ARCHIVE' || code === 'TAR_ABORT') {
    +            data.recoverable = false;
    +        }
    +        return super.warn(code, msg, data);
    +    }
    +    [MAYBECLOSE]() {
    +        if (this[ENDED] && this[PENDING] === 0) {
    +            this.emit('prefinish');
    +            this.emit('finish');
    +            this.emit('end');
    +        }
    +    }
    +    [CHECKPATH](entry) {
    +        const p = (0, normalize_windows_path_js_1.normalizeWindowsPath)(entry.path);
    +        const parts = p.split('/');
    +        if (this.strip) {
    +            if (parts.length < this.strip) {
    +                return false;
    +            }
    +            if (entry.type === 'Link') {
    +                const linkparts = (0, normalize_windows_path_js_1.normalizeWindowsPath)(String(entry.linkpath)).split('/');
    +                if (linkparts.length >= this.strip) {
    +                    entry.linkpath = linkparts.slice(this.strip).join('/');
    +                }
    +                else {
    +                    return false;
    +                }
    +            }
    +            parts.splice(0, this.strip);
    +            entry.path = parts.join('/');
    +        }
    +        if (isFinite(this.maxDepth) && parts.length > this.maxDepth) {
    +            this.warn('TAR_ENTRY_ERROR', 'path excessively deep', {
    +                entry,
    +                path: p,
    +                depth: parts.length,
    +                maxDepth: this.maxDepth,
    +            });
    +            return false;
    +        }
    +        if (!this.preservePaths) {
    +            if (parts.includes('..') ||
    +                /* c8 ignore next */
    +                (isWindows && /^[a-z]:\.\.$/i.test(parts[0] ?? ''))) {
    +                this.warn('TAR_ENTRY_ERROR', `path contains '..'`, {
    +                    entry,
    +                    path: p,
    +                });
    +                return false;
    +            }
    +            // strip off the root
    +            const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(p);
    +            if (root) {
    +                entry.path = String(stripped);
    +                this.warn('TAR_ENTRY_INFO', `stripping ${root} from absolute path`, {
    +                    entry,
    +                    path: p,
    +                });
    +            }
    +        }
    +        if (node_path_1.default.isAbsolute(entry.path)) {
    +            entry.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(entry.path));
    +        }
    +        else {
    +            entry.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(this.cwd, entry.path));
    +        }
    +        // if we somehow ended up with a path that escapes the cwd, and we are
    +        // not in preservePaths mode, then something is fishy!  This should have
    +        // been prevented above, so ignore this for coverage.
    +        /* c8 ignore start - defense in depth */
    +        if (!this.preservePaths &&
    +            typeof entry.absolute === 'string' &&
    +            entry.absolute.indexOf(this.cwd + '/') !== 0 &&
    +            entry.absolute !== this.cwd) {
    +            this.warn('TAR_ENTRY_ERROR', 'path escaped extraction target', {
    +                entry,
    +                path: (0, normalize_windows_path_js_1.normalizeWindowsPath)(entry.path),
    +                resolvedPath: entry.absolute,
    +                cwd: this.cwd,
    +            });
    +            return false;
    +        }
    +        /* c8 ignore stop */
    +        // an archive can set properties on the extraction directory, but it
    +        // may not replace the cwd with a different kind of thing entirely.
    +        if (entry.absolute === this.cwd &&
    +            entry.type !== 'Directory' &&
    +            entry.type !== 'GNUDumpDir') {
    +            return false;
    +        }
    +        // only encode : chars that aren't drive letter indicators
    +        if (this.win32) {
    +            const { root: aRoot } = node_path_1.default.win32.parse(String(entry.absolute));
    +            entry.absolute =
    +                aRoot + wc.encode(String(entry.absolute).slice(aRoot.length));
    +            const { root: pRoot } = node_path_1.default.win32.parse(entry.path);
    +            entry.path = pRoot + wc.encode(entry.path.slice(pRoot.length));
    +        }
    +        return true;
    +    }
    +    [ONENTRY](entry) {
    +        if (!this[CHECKPATH](entry)) {
    +            return entry.resume();
    +        }
    +        node_assert_1.default.equal(typeof entry.absolute, 'string');
    +        switch (entry.type) {
    +            case 'Directory':
    +            case 'GNUDumpDir':
    +                if (entry.mode) {
    +                    entry.mode = entry.mode | 0o700;
    +                }
    +            // eslint-disable-next-line no-fallthrough
    +            case 'File':
    +            case 'OldFile':
    +            case 'ContiguousFile':
    +            case 'Link':
    +            case 'SymbolicLink':
    +                return this[CHECKFS](entry);
    +            case 'CharacterDevice':
    +            case 'BlockDevice':
    +            case 'FIFO':
    +            default:
    +                return this[UNSUPPORTED](entry);
    +        }
    +    }
    +    [ONERROR](er, entry) {
    +        // Cwd has to exist, or else nothing works. That's serious.
    +        // Other errors are warnings, which raise the error in strict
    +        // mode, but otherwise continue on.
    +        if (er.name === 'CwdError') {
    +            this.emit('error', er);
    +        }
    +        else {
    +            this.warn('TAR_ENTRY_ERROR', er, { entry });
    +            this[UNPEND]();
    +            entry.resume();
    +        }
    +    }
    +    [MKDIR](dir, mode, cb) {
    +        (0, mkdir_js_1.mkdir)((0, normalize_windows_path_js_1.normalizeWindowsPath)(dir), {
    +            uid: this.uid,
    +            gid: this.gid,
    +            processUid: this.processUid,
    +            processGid: this.processGid,
    +            umask: this.processUmask,
    +            preserve: this.preservePaths,
    +            unlink: this.unlink,
    +            cache: this.dirCache,
    +            cwd: this.cwd,
    +            mode: mode,
    +        }, cb);
    +    }
    +    [DOCHOWN](entry) {
    +        // in preserve owner mode, chown if the entry doesn't match process
    +        // in set owner mode, chown if setting doesn't match process
    +        return (this.forceChown ||
    +            (this.preserveOwner &&
    +                ((typeof entry.uid === 'number' &&
    +                    entry.uid !== this.processUid) ||
    +                    (typeof entry.gid === 'number' &&
    +                        entry.gid !== this.processGid))) ||
    +            (typeof this.uid === 'number' &&
    +                this.uid !== this.processUid) ||
    +            (typeof this.gid === 'number' && this.gid !== this.processGid));
    +    }
    +    [UID](entry) {
    +        return uint32(this.uid, entry.uid, this.processUid);
    +    }
    +    [GID](entry) {
    +        return uint32(this.gid, entry.gid, this.processGid);
    +    }
    +    [FILE](entry, fullyDone) {
    +        const mode = typeof entry.mode === 'number' ?
    +            entry.mode & 0o7777
    +            : this.fmode;
    +        const stream = new fsm.WriteStream(String(entry.absolute), {
    +            // slight lie, but it can be numeric flags
    +            flags: (0, get_write_flag_js_1.getWriteFlag)(entry.size),
    +            mode: mode,
    +            autoClose: false,
    +        });
    +        stream.on('error', (er) => {
    +            if (stream.fd) {
    +                node_fs_1.default.close(stream.fd, () => { });
    +            }
    +            // flush all the data out so that we aren't left hanging
    +            // if the error wasn't actually fatal.  otherwise the parse
    +            // is blocked, and we never proceed.
    +            stream.write = () => true;
    +            this[ONERROR](er, entry);
    +            fullyDone();
    +        });
    +        let actions = 1;
    +        const done = (er) => {
    +            if (er) {
    +                /* c8 ignore start - we should always have a fd by now */
    +                if (stream.fd) {
    +                    node_fs_1.default.close(stream.fd, () => { });
    +                }
    +                /* c8 ignore stop */
    +                this[ONERROR](er, entry);
    +                fullyDone();
    +                return;
    +            }
    +            if (--actions === 0) {
    +                if (stream.fd !== undefined) {
    +                    node_fs_1.default.close(stream.fd, er => {
    +                        if (er) {
    +                            this[ONERROR](er, entry);
                             }
    -                        for (const v of nodes) {
    -                            walker = insertAfter(this, walker, v);
    +                        else {
    +                            this[UNPEND]();
                             }
    -                        return ret;
    -                    }
    -                    reverse() {
    -                        const head = this.head;
    -                        const tail = this.tail;
    -                        for (let walker = head; !!walker; walker = walker.prev) {
    -                            const p = walker.prev;
    -                            walker.prev = walker.next;
    -                            walker.next = p;
    +                        fullyDone();
    +                    });
    +                }
    +            }
    +        };
    +        stream.on('finish', () => {
    +            // if futimes fails, try utimes
    +            // if utimes fails, fail with the original error
    +            // same for fchown/chown
    +            const abs = String(entry.absolute);
    +            const fd = stream.fd;
    +            if (typeof fd === 'number' && entry.mtime && !this.noMtime) {
    +                actions++;
    +                const atime = entry.atime || new Date();
    +                const mtime = entry.mtime;
    +                node_fs_1.default.futimes(fd, atime, mtime, er => er ?
    +                    node_fs_1.default.utimes(abs, atime, mtime, er2 => done(er2 && er))
    +                    : done());
    +            }
    +            if (typeof fd === 'number' && this[DOCHOWN](entry)) {
    +                actions++;
    +                const uid = this[UID](entry);
    +                const gid = this[GID](entry);
    +                if (typeof uid === 'number' && typeof gid === 'number') {
    +                    node_fs_1.default.fchown(fd, uid, gid, er => er ?
    +                        node_fs_1.default.chown(abs, uid, gid, er2 => done(er2 && er))
    +                        : done());
    +                }
    +            }
    +            done();
    +        });
    +        const tx = this.transform ? this.transform(entry) || entry : entry;
    +        if (tx !== entry) {
    +            tx.on('error', (er) => {
    +                this[ONERROR](er, entry);
    +                fullyDone();
    +            });
    +            entry.pipe(tx);
    +        }
    +        tx.pipe(stream);
    +    }
    +    [DIRECTORY](entry, fullyDone) {
    +        const mode = typeof entry.mode === 'number' ?
    +            entry.mode & 0o7777
    +            : this.dmode;
    +        this[MKDIR](String(entry.absolute), mode, er => {
    +            if (er) {
    +                this[ONERROR](er, entry);
    +                fullyDone();
    +                return;
    +            }
    +            let actions = 1;
    +            const done = () => {
    +                if (--actions === 0) {
    +                    fullyDone();
    +                    this[UNPEND]();
    +                    entry.resume();
    +                }
    +            };
    +            if (entry.mtime && !this.noMtime) {
    +                actions++;
    +                node_fs_1.default.utimes(String(entry.absolute), entry.atime || new Date(), entry.mtime, done);
    +            }
    +            if (this[DOCHOWN](entry)) {
    +                actions++;
    +                node_fs_1.default.chown(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)), done);
    +            }
    +            done();
    +        });
    +    }
    +    [UNSUPPORTED](entry) {
    +        entry.unsupported = true;
    +        this.warn('TAR_ENTRY_UNSUPPORTED', `unsupported entry type: ${entry.type}`, { entry });
    +        entry.resume();
    +    }
    +    [SYMLINK](entry, done) {
    +        this[LINK](entry, String(entry.linkpath), 'symlink', done);
    +    }
    +    [HARDLINK](entry, done) {
    +        const linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.resolve(this.cwd, String(entry.linkpath)));
    +        this[LINK](entry, linkpath, 'link', done);
    +    }
    +    [PEND]() {
    +        this[PENDING]++;
    +    }
    +    [UNPEND]() {
    +        this[PENDING]--;
    +        this[MAYBECLOSE]();
    +    }
    +    [SKIP](entry) {
    +        this[UNPEND]();
    +        entry.resume();
    +    }
    +    // Check if we can reuse an existing filesystem entry safely and
    +    // overwrite it, rather than unlinking and recreating
    +    // Windows doesn't report a useful nlink, so we just never reuse entries
    +    [ISREUSABLE](entry, st) {
    +        return (entry.type === 'File' &&
    +            !this.unlink &&
    +            st.isFile() &&
    +            st.nlink <= 1 &&
    +            !isWindows);
    +    }
    +    // check if a thing is there, and if so, try to clobber it
    +    [CHECKFS](entry) {
    +        this[PEND]();
    +        const paths = [entry.path];
    +        if (entry.linkpath) {
    +            paths.push(entry.linkpath);
    +        }
    +        this.reservations.reserve(paths, done => this[CHECKFS2](entry, done));
    +    }
    +    [PRUNECACHE](entry) {
    +        // if we are not creating a directory, and the path is in the dirCache,
    +        // then that means we are about to delete the directory we created
    +        // previously, and it is no longer going to be a directory, and neither
    +        // is any of its children.
    +        // If a symbolic link is encountered, all bets are off.  There is no
    +        // reasonable way to sanitize the cache in such a way we will be able to
    +        // avoid having filesystem collisions.  If this happens with a non-symlink
    +        // entry, it'll just fail to unpack, but a symlink to a directory, using an
    +        // 8.3 shortname or certain unicode attacks, can evade detection and lead
    +        // to arbitrary writes to anywhere on the system.
    +        if (entry.type === 'SymbolicLink') {
    +            dropCache(this.dirCache);
    +        }
    +        else if (entry.type !== 'Directory') {
    +            pruneCache(this.dirCache, String(entry.absolute));
    +        }
    +    }
    +    [CHECKFS2](entry, fullyDone) {
    +        this[PRUNECACHE](entry);
    +        const done = (er) => {
    +            this[PRUNECACHE](entry);
    +            fullyDone(er);
    +        };
    +        const checkCwd = () => {
    +            this[MKDIR](this.cwd, this.dmode, er => {
    +                if (er) {
    +                    this[ONERROR](er, entry);
    +                    done();
    +                    return;
    +                }
    +                this[CHECKED_CWD] = true;
    +                start();
    +            });
    +        };
    +        const start = () => {
    +            if (entry.absolute !== this.cwd) {
    +                const parent = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.dirname(String(entry.absolute)));
    +                if (parent !== this.cwd) {
    +                    return this[MKDIR](parent, this.dmode, er => {
    +                        if (er) {
    +                            this[ONERROR](er, entry);
    +                            done();
    +                            return;
                             }
    -                        this.head = tail;
    -                        this.tail = head;
    -                        return this;
    -                    }
    +                        afterMakeParent();
    +                    });
                     }
    -                exports.Yallist = Yallist;
    -                // insertAfter undefined means "make the node the new head of list"
    -                function insertAfter(self, node, value) {
    -                    const prev = node;
    -                    const next = node ? node.next : self.head;
    -                    const inserted = new Node(value, prev, next, self);
    -                    if (inserted.next === undefined) {
    -                        self.tail = inserted;
    -                    }
    -                    if (inserted.prev === undefined) {
    -                        self.head = inserted;
    -                    }
    -                    self.length++;
    -                    return inserted;
    +            }
    +            afterMakeParent();
    +        };
    +        const afterMakeParent = () => {
    +            node_fs_1.default.lstat(String(entry.absolute), (lstatEr, st) => {
    +                if (st &&
    +                    (this.keep ||
    +                        /* c8 ignore next */
    +                        (this.newer && st.mtime > (entry.mtime ?? st.mtime)))) {
    +                    this[SKIP](entry);
    +                    done();
    +                    return;
    +                }
    +                if (lstatEr || this[ISREUSABLE](entry, st)) {
    +                    return this[MAKEFS](null, entry, done);
    +                }
    +                if (st.isDirectory()) {
    +                    if (entry.type === 'Directory') {
    +                        const needChmod = this.chmod &&
    +                            entry.mode &&
    +                            (st.mode & 0o7777) !== entry.mode;
    +                        const afterChmod = (er) => this[MAKEFS](er ?? null, entry, done);
    +                        if (!needChmod) {
    +                            return afterChmod();
    +                        }
    +                        return node_fs_1.default.chmod(String(entry.absolute), Number(entry.mode), afterChmod);
    +                    }
    +                    // Not a dir entry, have to remove it.
    +                    // NB: the only way to end up with an entry that is the cwd
    +                    // itself, in such a way that == does not detect, is a
    +                    // tricky windows absolute path with UNC or 8.3 parts (and
    +                    // preservePaths:true, or else it will have been stripped).
    +                    // In that case, the user has opted out of path protections
    +                    // explicitly, so if they blow away the cwd, c'est la vie.
    +                    if (entry.absolute !== this.cwd) {
    +                        return node_fs_1.default.rmdir(String(entry.absolute), (er) => this[MAKEFS](er ?? null, entry, done));
    +                    }
    +                }
    +                // not a dir, and not reusable
    +                // don't remove if the cwd, we want that error
    +                if (entry.absolute === this.cwd) {
    +                    return this[MAKEFS](null, entry, done);
    +                }
    +                unlinkFile(String(entry.absolute), er => this[MAKEFS](er ?? null, entry, done));
    +            });
    +        };
    +        if (this[CHECKED_CWD]) {
    +            start();
    +        }
    +        else {
    +            checkCwd();
    +        }
    +    }
    +    [MAKEFS](er, entry, done) {
    +        if (er) {
    +            this[ONERROR](er, entry);
    +            done();
    +            return;
    +        }
    +        switch (entry.type) {
    +            case 'File':
    +            case 'OldFile':
    +            case 'ContiguousFile':
    +                return this[FILE](entry, done);
    +            case 'Link':
    +                return this[HARDLINK](entry, done);
    +            case 'SymbolicLink':
    +                return this[SYMLINK](entry, done);
    +            case 'Directory':
    +            case 'GNUDumpDir':
    +                return this[DIRECTORY](entry, done);
    +        }
    +    }
    +    [LINK](entry, linkpath, link, done) {
    +        // XXX: get the type ('symlink' or 'junction') for windows
    +        node_fs_1.default[link](linkpath, String(entry.absolute), er => {
    +            if (er) {
    +                this[ONERROR](er, entry);
    +            }
    +            else {
    +                this[UNPEND]();
    +                entry.resume();
    +            }
    +            done();
    +        });
    +    }
    +}
    +exports.Unpack = Unpack;
    +const callSync = (fn) => {
    +    try {
    +        return [null, fn()];
    +    }
    +    catch (er) {
    +        return [er, null];
    +    }
    +};
    +class UnpackSync extends Unpack {
    +    [MAKEFS](er, entry) {
    +        return super[MAKEFS](er, entry, () => { });
    +    }
    +    [CHECKFS](entry) {
    +        this[PRUNECACHE](entry);
    +        if (!this[CHECKED_CWD]) {
    +            const er = this[MKDIR](this.cwd, this.dmode);
    +            if (er) {
    +                return this[ONERROR](er, entry);
    +            }
    +            this[CHECKED_CWD] = true;
    +        }
    +        // don't bother to make the parent if the current entry is the cwd,
    +        // we've already checked it.
    +        if (entry.absolute !== this.cwd) {
    +            const parent = (0, normalize_windows_path_js_1.normalizeWindowsPath)(node_path_1.default.dirname(String(entry.absolute)));
    +            if (parent !== this.cwd) {
    +                const mkParent = this[MKDIR](parent, this.dmode);
    +                if (mkParent) {
    +                    return this[ONERROR](mkParent, entry);
    +                }
    +            }
    +        }
    +        const [lstatEr, st] = callSync(() => node_fs_1.default.lstatSync(String(entry.absolute)));
    +        if (st &&
    +            (this.keep ||
    +                /* c8 ignore next */
    +                (this.newer && st.mtime > (entry.mtime ?? st.mtime)))) {
    +            return this[SKIP](entry);
    +        }
    +        if (lstatEr || this[ISREUSABLE](entry, st)) {
    +            return this[MAKEFS](null, entry);
    +        }
    +        if (st.isDirectory()) {
    +            if (entry.type === 'Directory') {
    +                const needChmod = this.chmod &&
    +                    entry.mode &&
    +                    (st.mode & 0o7777) !== entry.mode;
    +                const [er] = needChmod ?
    +                    callSync(() => {
    +                        node_fs_1.default.chmodSync(String(entry.absolute), Number(entry.mode));
    +                    })
    +                    : [];
    +                return this[MAKEFS](er, entry);
    +            }
    +            // not a dir entry, have to remove it
    +            const [er] = callSync(() => node_fs_1.default.rmdirSync(String(entry.absolute)));
    +            this[MAKEFS](er, entry);
    +        }
    +        // not a dir, and not reusable.
    +        // don't remove if it's the cwd, since we want that error.
    +        const [er] = entry.absolute === this.cwd ?
    +            []
    +            : callSync(() => unlinkFileSync(String(entry.absolute)));
    +        this[MAKEFS](er, entry);
    +    }
    +    [FILE](entry, done) {
    +        const mode = typeof entry.mode === 'number' ?
    +            entry.mode & 0o7777
    +            : this.fmode;
    +        const oner = (er) => {
    +            let closeError;
    +            try {
    +                node_fs_1.default.closeSync(fd);
    +            }
    +            catch (e) {
    +                closeError = e;
    +            }
    +            if (er || closeError) {
    +                this[ONERROR](er || closeError, entry);
    +            }
    +            done();
    +        };
    +        let fd;
    +        try {
    +            fd = node_fs_1.default.openSync(String(entry.absolute), (0, get_write_flag_js_1.getWriteFlag)(entry.size), mode);
    +        }
    +        catch (er) {
    +            return oner(er);
    +        }
    +        const tx = this.transform ? this.transform(entry) || entry : entry;
    +        if (tx !== entry) {
    +            tx.on('error', (er) => this[ONERROR](er, entry));
    +            entry.pipe(tx);
    +        }
    +        tx.on('data', (chunk) => {
    +            try {
    +                node_fs_1.default.writeSync(fd, chunk, 0, chunk.length);
    +            }
    +            catch (er) {
    +                oner(er);
    +            }
    +        });
    +        tx.on('end', () => {
    +            let er = null;
    +            // try both, falling futimes back to utimes
    +            // if either fails, handle the first error
    +            if (entry.mtime && !this.noMtime) {
    +                const atime = entry.atime || new Date();
    +                const mtime = entry.mtime;
    +                try {
    +                    node_fs_1.default.futimesSync(fd, atime, mtime);
                     }
    -                function push(self, item) {
    -                    self.tail = new Node(item, self.tail, undefined, self);
    -                    if (!self.head) {
    -                        self.head = self.tail;
    +                catch (futimeser) {
    +                    try {
    +                        node_fs_1.default.utimesSync(String(entry.absolute), atime, mtime);
                         }
    -                    self.length++;
    -                }
    -                function unshift(self, item) {
    -                    self.head = new Node(item, undefined, self.head, self);
    -                    if (!self.tail) {
    -                        self.tail = self.head;
    +                    catch (utimeser) {
    +                        er = futimeser;
                         }
    -                    self.length++;
                     }
    -                class Node {
    -                    list;
    -                    next;
    -                    prev;
    -                    value;
    -                    constructor(value, prev, next, list) {
    -                        this.list = list;
    -                        this.value = value;
    -                        if (prev) {
    -                            prev.next = this;
    -                            this.prev = prev;
    -                        }
    -                        else {
    -                            this.prev = undefined;
    -                        }
    -                        if (next) {
    -                            next.prev = this;
    -                            this.next = next;
    -                        }
    -                        else {
    -                            this.next = undefined;
    -                        }
    -                    }
    +            }
    +            if (this[DOCHOWN](entry)) {
    +                const uid = this[UID](entry);
    +                const gid = this[GID](entry);
    +                try {
    +                    node_fs_1.default.fchownSync(fd, Number(uid), Number(gid));
                     }
    -                exports.Node = Node;
    -                //# sourceMappingURL=index.js.map
    -
    -                /***/
    -}),
    +                catch (fchowner) {
    +                    try {
    +                        node_fs_1.default.chownSync(String(entry.absolute), Number(uid), Number(gid));
    +                    }
    +                    catch (chowner) {
    +                        er = er || fchowner;
    +                    }
    +                }
    +            }
    +            oner(er);
    +        });
    +    }
    +    [DIRECTORY](entry, done) {
    +        const mode = typeof entry.mode === 'number' ?
    +            entry.mode & 0o7777
    +            : this.dmode;
    +        const er = this[MKDIR](String(entry.absolute), mode);
    +        if (er) {
    +            this[ONERROR](er, entry);
    +            done();
    +            return;
    +        }
    +        if (entry.mtime && !this.noMtime) {
    +            try {
    +                node_fs_1.default.utimesSync(String(entry.absolute), entry.atime || new Date(), entry.mtime);
    +                /* c8 ignore next */
    +            }
    +            catch (er) { }
    +        }
    +        if (this[DOCHOWN](entry)) {
    +            try {
    +                node_fs_1.default.chownSync(String(entry.absolute), Number(this[UID](entry)), Number(this[GID](entry)));
    +            }
    +            catch (er) { }
    +        }
    +        done();
    +        entry.resume();
    +    }
    +    [MKDIR](dir, mode) {
    +        try {
    +            return (0, mkdir_js_1.mkdirSync)((0, normalize_windows_path_js_1.normalizeWindowsPath)(dir), {
    +                uid: this.uid,
    +                gid: this.gid,
    +                processUid: this.processUid,
    +                processGid: this.processGid,
    +                umask: this.processUmask,
    +                preserve: this.preservePaths,
    +                unlink: this.unlink,
    +                cache: this.dirCache,
    +                cwd: this.cwd,
    +                mode: mode,
    +            });
    +        }
    +        catch (er) {
    +            return er;
    +        }
    +    }
    +    [LINK](entry, linkpath, link, done) {
    +        const ls = `${link}Sync`;
    +        try {
    +            node_fs_1.default[ls](linkpath, String(entry.absolute));
    +            done();
    +            entry.resume();
    +        }
    +        catch (er) {
    +            return this[ONERROR](er, entry);
    +        }
    +    }
    +}
    +exports.UnpackSync = UnpackSync;
    +//# sourceMappingURL=unpack.js.map
     
    -/***/ 6717:
    -/***/ ((__unused_webpack_module, exports) => {
    +/***/ }),
     
    -                //     Underscore.js 1.13.6
    -                //     https://underscorejs.org
    -                //     (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
    -                //     Underscore may be freely distributed under the MIT license.
    -
    -                Object.defineProperty(exports, "__esModule", ({ value: true }));
    -
    -                // Current version.
    -                var VERSION = '1.13.6';
    -
    -                // Establish the root object, `window` (`self`) in the browser, `global`
    -                // on the server, or `this` in some virtual machines. We use `self`
    -                // instead of `window` for `WebWorker` support.
    -                var root = (typeof self == 'object' && self.self === self && self) ||
    -                    (typeof global == 'object' && global.global === global && global) ||
    -                    Function('return this')() ||
    -                    {};
    -
    -                // Save bytes in the minified (but not gzipped) version:
    -                var ArrayProto = Array.prototype, ObjProto = Object.prototype;
    -                var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
    -
    -                // Create quick reference variables for speed access to core prototypes.
    -                var push = ArrayProto.push,
    -                    slice = ArrayProto.slice,
    -                    toString = ObjProto.toString,
    -                    hasOwnProperty = ObjProto.hasOwnProperty;
    -
    -                // Modern feature detection.
    -                var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
    -                    supportsDataView = typeof DataView !== 'undefined';
    -
    -                // All **ECMAScript 5+** native function implementations that we hope to use
    -                // are declared here.
    -                var nativeIsArray = Array.isArray,
    -                    nativeKeys = Object.keys,
    -                    nativeCreate = Object.create,
    -                    nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
    -
    -                // Create references to these builtin functions because we override them.
    -                var _isNaN = isNaN,
    -                    _isFinite = isFinite;
    -
    -                // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
    -                var hasEnumBug = !{ toString: null }.propertyIsEnumerable('toString');
    -                var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
    -                    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
    -
    -                // The largest integer that can be represented exactly.
    -                var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
    -
    -                // Some functions take a variable number of arguments, or a few expected
    -                // arguments at the beginning and then a variable number of values to operate
    -                // on. This helper accumulates all remaining arguments past the function’s
    -                // argument length (or an explicit `startIndex`), into an array that becomes
    -                // the last argument. Similar to ES6’s "rest parameter".
    -                function restArguments(func, startIndex) {
    -                    startIndex = startIndex == null ? func.length - 1 : +startIndex;
    -                    return function () {
    -                        var length = Math.max(arguments.length - startIndex, 0),
    -                            rest = Array(length),
    -                            index = 0;
    -                        for (; index < length; index++) {
    -                            rest[index] = arguments[index + startIndex];
    -                        }
    -                        switch (startIndex) {
    -                            case 0: return func.call(this, rest);
    -                            case 1: return func.call(this, arguments[0], rest);
    -                            case 2: return func.call(this, arguments[0], arguments[1], rest);
    -                        }
    -                        var args = Array(startIndex + 1);
    -                        for (index = 0; index < startIndex; index++) {
    -                            args[index] = arguments[index];
    -                        }
    -                        args[startIndex] = rest;
    -                        return func.apply(this, args);
    -                    };
    -                }
    +/***/ 8780:
    +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
     
    -                // Is a given variable an object?
    -                function isObject(obj) {
    -                    var type = typeof obj;
    -                    return type === 'function' || (type === 'object' && !!obj);
    -                }
    +"use strict";
    +
    +// tar -u
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.update = void 0;
    +const options_js_1 = __nccwpck_require__(9060);
    +const replace_js_1 = __nccwpck_require__(5478);
    +// just call tar.r with the filter and mtimeCache
    +const update = (opt_, files, cb) => {
    +    const opt = (0, options_js_1.dealias)(opt_);
    +    if (!(0, options_js_1.isFile)(opt)) {
    +        throw new TypeError('file is required');
    +    }
    +    if (opt.gzip ||
    +        opt.brotli ||
    +        opt.file.endsWith('.br') ||
    +        opt.file.endsWith('.tbr')) {
    +        throw new TypeError('cannot append to compressed archives');
    +    }
    +    if (!files || !Array.isArray(files) || !files.length) {
    +        throw new TypeError('no files or directories specified');
    +    }
    +    files = Array.from(files);
    +    mtimeFilter(opt);
    +    return (0, replace_js_1.replace)(opt, files, cb);
    +};
    +exports.update = update;
    +const mtimeFilter = (opt) => {
    +    const filter = opt.filter;
    +    if (!opt.mtimeCache) {
    +        opt.mtimeCache = new Map();
    +    }
    +    opt.filter =
    +        filter ?
    +            (path, stat) => filter(path, stat) &&
    +                !(
    +                /* c8 ignore start */
    +                ((opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) >
    +                    (stat.mtime ?? 0))
    +                /* c8 ignore stop */
    +                )
    +            : (path, stat) => !(
    +            /* c8 ignore start */
    +            ((opt.mtimeCache?.get(path) ?? stat.mtime ?? 0) >
    +                (stat.mtime ?? 0))
    +            /* c8 ignore stop */
    +            );
    +};
    +//# sourceMappingURL=update.js.map
     
    -                // Is a given value equal to null?
    -                function isNull(obj) {
    -                    return obj === null;
    -                }
    +/***/ }),
     
    -                // Is a given variable undefined?
    -                function isUndefined(obj) {
    -                    return obj === void 0;
    -                }
    +/***/ 449:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                // Is a given value a boolean?
    -                function isBoolean(obj) {
    -                    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
    -                }
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.warnMethod = void 0;
    +const warnMethod = (self, code, message, data = {}) => {
    +    if (self.file) {
    +        data.file = self.file;
    +    }
    +    if (self.cwd) {
    +        data.cwd = self.cwd;
    +    }
    +    data.code =
    +        (message instanceof Error &&
    +            message.code) ||
    +            code;
    +    data.tarCode = code;
    +    if (!self.strict && data.recoverable !== false) {
    +        if (message instanceof Error) {
    +            data = Object.assign(message, data);
    +            message = message.message;
    +        }
    +        self.emit('warn', code, message, data);
    +    }
    +    else if (message instanceof Error) {
    +        self.emit('error', Object.assign(message, data));
    +    }
    +    else {
    +        self.emit('error', Object.assign(new Error(`${code}: ${message}`), data));
    +    }
    +};
    +exports.warnMethod = warnMethod;
    +//# sourceMappingURL=warn-method.js.map
     
    -                // Is a given value a DOM element?
    -                function isElement(obj) {
    -                    return !!(obj && obj.nodeType === 1);
    -                }
    +/***/ }),
     
    -                // Internal function for creating a `toString`-based type tester.
    -                function tagTester(name) {
    -                    var tag = '[object ' + name + ']';
    -                    return function (obj) {
    -                        return toString.call(obj) === tag;
    -                    };
    -                }
    +/***/ 4978:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                var isString = tagTester('String');
    +"use strict";
     
    -                var isNumber = tagTester('Number');
    +// When writing files on Windows, translate the characters to their
    +// 0xf000 higher-encoded versions.
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.decode = exports.encode = void 0;
    +const raw = ['|', '<', '>', '?', ':'];
    +const win = raw.map(char => String.fromCharCode(0xf000 + char.charCodeAt(0)));
    +const toWin = new Map(raw.map((char, i) => [char, win[i]]));
    +const toRaw = new Map(win.map((char, i) => [char, raw[i]]));
    +const encode = (s) => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s);
    +exports.encode = encode;
    +const decode = (s) => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s);
    +exports.decode = decode;
    +//# sourceMappingURL=winchars.js.map
     
    -                var isDate = tagTester('Date');
    +/***/ }),
     
    -                var isRegExp = tagTester('RegExp');
    +/***/ 4028:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
    +
    +"use strict";
    +
    +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    var desc = Object.getOwnPropertyDescriptor(m, k);
    +    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
    +      desc = { enumerable: true, get: function() { return m[k]; } };
    +    }
    +    Object.defineProperty(o, k2, desc);
    +}) : (function(o, m, k, k2) {
    +    if (k2 === undefined) k2 = k;
    +    o[k2] = m[k];
    +}));
    +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    +    Object.defineProperty(o, "default", { enumerable: true, value: v });
    +}) : function(o, v) {
    +    o["default"] = v;
    +});
    +var __importStar = (this && this.__importStar) || function (mod) {
    +    if (mod && mod.__esModule) return mod;
    +    var result = {};
    +    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    +    __setModuleDefault(result, mod);
    +    return result;
    +};
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.WriteEntryTar = exports.WriteEntrySync = exports.WriteEntry = void 0;
    +const fs_1 = __importDefault(__nccwpck_require__(7147));
    +const minipass_1 = __nccwpck_require__(4721);
    +const path_1 = __importDefault(__nccwpck_require__(1017));
    +const header_js_1 = __nccwpck_require__(2374);
    +const mode_fix_js_1 = __nccwpck_require__(1810);
    +const normalize_windows_path_js_1 = __nccwpck_require__(762);
    +const options_js_1 = __nccwpck_require__(9060);
    +const pax_js_1 = __nccwpck_require__(8567);
    +const strip_absolute_path_js_1 = __nccwpck_require__(1126);
    +const strip_trailing_slashes_js_1 = __nccwpck_require__(6018);
    +const warn_method_js_1 = __nccwpck_require__(449);
    +const winchars = __importStar(__nccwpck_require__(4978));
    +const prefixPath = (path, prefix) => {
    +    if (!prefix) {
    +        return (0, normalize_windows_path_js_1.normalizeWindowsPath)(path);
    +    }
    +    path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path).replace(/^\.(\/|$)/, '');
    +    return (0, strip_trailing_slashes_js_1.stripTrailingSlashes)(prefix) + '/' + path;
    +};
    +const maxReadSize = 16 * 1024 * 1024;
    +const PROCESS = Symbol('process');
    +const FILE = Symbol('file');
    +const DIRECTORY = Symbol('directory');
    +const SYMLINK = Symbol('symlink');
    +const HARDLINK = Symbol('hardlink');
    +const HEADER = Symbol('header');
    +const READ = Symbol('read');
    +const LSTAT = Symbol('lstat');
    +const ONLSTAT = Symbol('onlstat');
    +const ONREAD = Symbol('onread');
    +const ONREADLINK = Symbol('onreadlink');
    +const OPENFILE = Symbol('openfile');
    +const ONOPENFILE = Symbol('onopenfile');
    +const CLOSE = Symbol('close');
    +const MODE = Symbol('mode');
    +const AWAITDRAIN = Symbol('awaitDrain');
    +const ONDRAIN = Symbol('ondrain');
    +const PREFIX = Symbol('prefix');
    +class WriteEntry extends minipass_1.Minipass {
    +    path;
    +    portable;
    +    myuid = (process.getuid && process.getuid()) || 0;
    +    // until node has builtin pwnam functions, this'll have to do
    +    myuser = process.env.USER || '';
    +    maxReadSize;
    +    linkCache;
    +    statCache;
    +    preservePaths;
    +    cwd;
    +    strict;
    +    mtime;
    +    noPax;
    +    noMtime;
    +    prefix;
    +    fd;
    +    blockLen = 0;
    +    blockRemain = 0;
    +    buf;
    +    pos = 0;
    +    remain = 0;
    +    length = 0;
    +    offset = 0;
    +    win32;
    +    absolute;
    +    header;
    +    type;
    +    linkpath;
    +    stat;
    +    /* c8 ignore start */
    +    #hadError = false;
    +    constructor(p, opt_ = {}) {
    +        const opt = (0, options_js_1.dealias)(opt_);
    +        super();
    +        this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(p);
    +        // suppress atime, ctime, uid, gid, uname, gname
    +        this.portable = !!opt.portable;
    +        this.maxReadSize = opt.maxReadSize || maxReadSize;
    +        this.linkCache = opt.linkCache || new Map();
    +        this.statCache = opt.statCache || new Map();
    +        this.preservePaths = !!opt.preservePaths;
    +        this.cwd = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.cwd || process.cwd());
    +        this.strict = !!opt.strict;
    +        this.noPax = !!opt.noPax;
    +        this.noMtime = !!opt.noMtime;
    +        this.mtime = opt.mtime;
    +        this.prefix =
    +            opt.prefix ? (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.prefix) : undefined;
    +        if (typeof opt.onwarn === 'function') {
    +            this.on('warn', opt.onwarn);
    +        }
    +        let pathWarn = false;
    +        if (!this.preservePaths) {
    +            const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(this.path);
    +            if (root && typeof stripped === 'string') {
    +                this.path = stripped;
    +                pathWarn = root;
    +            }
    +        }
    +        this.win32 = !!opt.win32 || process.platform === 'win32';
    +        if (this.win32) {
    +            // force the \ to / normalization, since we might not *actually*
    +            // be on windows, but want \ to be considered a path separator.
    +            this.path = winchars.decode(this.path.replace(/\\/g, '/'));
    +            p = p.replace(/\\/g, '/');
    +        }
    +        this.absolute = (0, normalize_windows_path_js_1.normalizeWindowsPath)(opt.absolute || path_1.default.resolve(this.cwd, p));
    +        if (this.path === '') {
    +            this.path = './';
    +        }
    +        if (pathWarn) {
    +            this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, {
    +                entry: this,
    +                path: pathWarn + this.path,
    +            });
    +        }
    +        const cs = this.statCache.get(this.absolute);
    +        if (cs) {
    +            this[ONLSTAT](cs);
    +        }
    +        else {
    +            this[LSTAT]();
    +        }
    +    }
    +    warn(code, message, data = {}) {
    +        return (0, warn_method_js_1.warnMethod)(this, code, message, data);
    +    }
    +    emit(ev, ...data) {
    +        if (ev === 'error') {
    +            this.#hadError = true;
    +        }
    +        return super.emit(ev, ...data);
    +    }
    +    [LSTAT]() {
    +        fs_1.default.lstat(this.absolute, (er, stat) => {
    +            if (er) {
    +                return this.emit('error', er);
    +            }
    +            this[ONLSTAT](stat);
    +        });
    +    }
    +    [ONLSTAT](stat) {
    +        this.statCache.set(this.absolute, stat);
    +        this.stat = stat;
    +        if (!stat.isFile()) {
    +            stat.size = 0;
    +        }
    +        this.type = getType(stat);
    +        this.emit('stat', stat);
    +        this[PROCESS]();
    +    }
    +    [PROCESS]() {
    +        switch (this.type) {
    +            case 'File':
    +                return this[FILE]();
    +            case 'Directory':
    +                return this[DIRECTORY]();
    +            case 'SymbolicLink':
    +                return this[SYMLINK]();
    +            // unsupported types are ignored.
    +            default:
    +                return this.end();
    +        }
    +    }
    +    [MODE](mode) {
    +        return (0, mode_fix_js_1.modeFix)(mode, this.type === 'Directory', this.portable);
    +    }
    +    [PREFIX](path) {
    +        return prefixPath(path, this.prefix);
    +    }
    +    [HEADER]() {
    +        /* c8 ignore start */
    +        if (!this.stat) {
    +            throw new Error('cannot write header before stat');
    +        }
    +        /* c8 ignore stop */
    +        if (this.type === 'Directory' && this.portable) {
    +            this.noMtime = true;
    +        }
    +        this.header = new header_js_1.Header({
    +            path: this[PREFIX](this.path),
    +            // only apply the prefix to hard links.
    +            linkpath: this.type === 'Link' && this.linkpath !== undefined ?
    +                this[PREFIX](this.linkpath)
    +                : this.linkpath,
    +            // only the permissions and setuid/setgid/sticky bitflags
    +            // not the higher-order bits that specify file type
    +            mode: this[MODE](this.stat.mode),
    +            uid: this.portable ? undefined : this.stat.uid,
    +            gid: this.portable ? undefined : this.stat.gid,
    +            size: this.stat.size,
    +            mtime: this.noMtime ? undefined : this.mtime || this.stat.mtime,
    +            /* c8 ignore next */
    +            type: this.type === 'Unsupported' ? undefined : this.type,
    +            uname: this.portable ? undefined
    +                : this.stat.uid === this.myuid ? this.myuser
    +                    : '',
    +            atime: this.portable ? undefined : this.stat.atime,
    +            ctime: this.portable ? undefined : this.stat.ctime,
    +        });
    +        if (this.header.encode() && !this.noPax) {
    +            super.write(new pax_js_1.Pax({
    +                atime: this.portable ? undefined : this.header.atime,
    +                ctime: this.portable ? undefined : this.header.ctime,
    +                gid: this.portable ? undefined : this.header.gid,
    +                mtime: this.noMtime ? undefined : (this.mtime || this.header.mtime),
    +                path: this[PREFIX](this.path),
    +                linkpath: this.type === 'Link' && this.linkpath !== undefined ?
    +                    this[PREFIX](this.linkpath)
    +                    : this.linkpath,
    +                size: this.header.size,
    +                uid: this.portable ? undefined : this.header.uid,
    +                uname: this.portable ? undefined : this.header.uname,
    +                dev: this.portable ? undefined : this.stat.dev,
    +                ino: this.portable ? undefined : this.stat.ino,
    +                nlink: this.portable ? undefined : this.stat.nlink,
    +            }).encode());
    +        }
    +        const block = this.header?.block;
    +        /* c8 ignore start */
    +        if (!block) {
    +            throw new Error('failed to encode header');
    +        }
    +        /* c8 ignore stop */
    +        super.write(block);
    +    }
    +    [DIRECTORY]() {
    +        /* c8 ignore start */
    +        if (!this.stat) {
    +            throw new Error('cannot create directory entry without stat');
    +        }
    +        /* c8 ignore stop */
    +        if (this.path.slice(-1) !== '/') {
    +            this.path += '/';
    +        }
    +        this.stat.size = 0;
    +        this[HEADER]();
    +        this.end();
    +    }
    +    [SYMLINK]() {
    +        fs_1.default.readlink(this.absolute, (er, linkpath) => {
    +            if (er) {
    +                return this.emit('error', er);
    +            }
    +            this[ONREADLINK](linkpath);
    +        });
    +    }
    +    [ONREADLINK](linkpath) {
    +        this.linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(linkpath);
    +        this[HEADER]();
    +        this.end();
    +    }
    +    [HARDLINK](linkpath) {
    +        /* c8 ignore start */
    +        if (!this.stat) {
    +            throw new Error('cannot create link entry without stat');
    +        }
    +        /* c8 ignore stop */
    +        this.type = 'Link';
    +        this.linkpath = (0, normalize_windows_path_js_1.normalizeWindowsPath)(path_1.default.relative(this.cwd, linkpath));
    +        this.stat.size = 0;
    +        this[HEADER]();
    +        this.end();
    +    }
    +    [FILE]() {
    +        /* c8 ignore start */
    +        if (!this.stat) {
    +            throw new Error('cannot create file entry without stat');
    +        }
    +        /* c8 ignore stop */
    +        if (this.stat.nlink > 1) {
    +            const linkKey = `${this.stat.dev}:${this.stat.ino}`;
    +            const linkpath = this.linkCache.get(linkKey);
    +            if (linkpath?.indexOf(this.cwd) === 0) {
    +                return this[HARDLINK](linkpath);
    +            }
    +            this.linkCache.set(linkKey, this.absolute);
    +        }
    +        this[HEADER]();
    +        if (this.stat.size === 0) {
    +            return this.end();
    +        }
    +        this[OPENFILE]();
    +    }
    +    [OPENFILE]() {
    +        fs_1.default.open(this.absolute, 'r', (er, fd) => {
    +            if (er) {
    +                return this.emit('error', er);
    +            }
    +            this[ONOPENFILE](fd);
    +        });
    +    }
    +    [ONOPENFILE](fd) {
    +        this.fd = fd;
    +        if (this.#hadError) {
    +            return this[CLOSE]();
    +        }
    +        /* c8 ignore start */
    +        if (!this.stat) {
    +            throw new Error('should stat before calling onopenfile');
    +        }
    +        /* c8 ignore start */
    +        this.blockLen = 512 * Math.ceil(this.stat.size / 512);
    +        this.blockRemain = this.blockLen;
    +        const bufLen = Math.min(this.blockLen, this.maxReadSize);
    +        this.buf = Buffer.allocUnsafe(bufLen);
    +        this.offset = 0;
    +        this.pos = 0;
    +        this.remain = this.stat.size;
    +        this.length = this.buf.length;
    +        this[READ]();
    +    }
    +    [READ]() {
    +        const { fd, buf, offset, length, pos } = this;
    +        if (fd === undefined || buf === undefined) {
    +            throw new Error('cannot read file without first opening');
    +        }
    +        fs_1.default.read(fd, buf, offset, length, pos, (er, bytesRead) => {
    +            if (er) {
    +                // ignoring the error from close(2) is a bad practice, but at
    +                // this point we already have an error, don't need another one
    +                return this[CLOSE](() => this.emit('error', er));
    +            }
    +            this[ONREAD](bytesRead);
    +        });
    +    }
    +    /* c8 ignore start */
    +    [CLOSE](cb = () => { }) {
    +        /* c8 ignore stop */
    +        if (this.fd !== undefined)
    +            fs_1.default.close(this.fd, cb);
    +    }
    +    [ONREAD](bytesRead) {
    +        if (bytesRead <= 0 && this.remain > 0) {
    +            const er = Object.assign(new Error('encountered unexpected EOF'), {
    +                path: this.absolute,
    +                syscall: 'read',
    +                code: 'EOF',
    +            });
    +            return this[CLOSE](() => this.emit('error', er));
    +        }
    +        if (bytesRead > this.remain) {
    +            const er = Object.assign(new Error('did not encounter expected EOF'), {
    +                path: this.absolute,
    +                syscall: 'read',
    +                code: 'EOF',
    +            });
    +            return this[CLOSE](() => this.emit('error', er));
    +        }
    +        /* c8 ignore start */
    +        if (!this.buf) {
    +            throw new Error('should have created buffer prior to reading');
    +        }
    +        /* c8 ignore stop */
    +        // null out the rest of the buffer, if we could fit the block padding
    +        // at the end of this loop, we've incremented bytesRead and this.remain
    +        // to be incremented up to the blockRemain level, as if we had expected
    +        // to get a null-padded file, and read it until the end.  then we will
    +        // decrement both remain and blockRemain by bytesRead, and know that we
    +        // reached the expected EOF, without any null buffer to append.
    +        if (bytesRead === this.remain) {
    +            for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) {
    +                this.buf[i + this.offset] = 0;
    +                bytesRead++;
    +                this.remain++;
    +            }
    +        }
    +        const chunk = this.offset === 0 && bytesRead === this.buf.length ?
    +            this.buf
    +            : this.buf.subarray(this.offset, this.offset + bytesRead);
    +        const flushed = this.write(chunk);
    +        if (!flushed) {
    +            this[AWAITDRAIN](() => this[ONDRAIN]());
    +        }
    +        else {
    +            this[ONDRAIN]();
    +        }
    +    }
    +    [AWAITDRAIN](cb) {
    +        this.once('drain', cb);
    +    }
    +    write(chunk, encoding, cb) {
    +        /* c8 ignore start - just junk to comply with NodeJS.WritableStream */
    +        if (typeof encoding === 'function') {
    +            cb = encoding;
    +            encoding = undefined;
    +        }
    +        if (typeof chunk === 'string') {
    +            chunk = Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8');
    +        }
    +        /* c8 ignore stop */
    +        if (this.blockRemain < chunk.length) {
    +            const er = Object.assign(new Error('writing more data than expected'), {
    +                path: this.absolute,
    +            });
    +            return this.emit('error', er);
    +        }
    +        this.remain -= chunk.length;
    +        this.blockRemain -= chunk.length;
    +        this.pos += chunk.length;
    +        this.offset += chunk.length;
    +        return super.write(chunk, null, cb);
    +    }
    +    [ONDRAIN]() {
    +        if (!this.remain) {
    +            if (this.blockRemain) {
    +                super.write(Buffer.alloc(this.blockRemain));
    +            }
    +            return this[CLOSE](er => er ? this.emit('error', er) : this.end());
    +        }
    +        /* c8 ignore start */
    +        if (!this.buf) {
    +            throw new Error('buffer lost somehow in ONDRAIN');
    +        }
    +        /* c8 ignore stop */
    +        if (this.offset >= this.length) {
    +            // if we only have a smaller bit left to read, alloc a smaller buffer
    +            // otherwise, keep it the same length it was before.
    +            this.buf = Buffer.allocUnsafe(Math.min(this.blockRemain, this.buf.length));
    +            this.offset = 0;
    +        }
    +        this.length = this.buf.length - this.offset;
    +        this[READ]();
    +    }
    +}
    +exports.WriteEntry = WriteEntry;
    +class WriteEntrySync extends WriteEntry {
    +    [LSTAT]() {
    +        this[ONLSTAT](fs_1.default.lstatSync(this.absolute));
    +    }
    +    [SYMLINK]() {
    +        this[ONREADLINK](fs_1.default.readlinkSync(this.absolute));
    +    }
    +    [OPENFILE]() {
    +        this[ONOPENFILE](fs_1.default.openSync(this.absolute, 'r'));
    +    }
    +    [READ]() {
    +        let threw = true;
    +        try {
    +            const { fd, buf, offset, length, pos } = this;
    +            /* c8 ignore start */
    +            if (fd === undefined || buf === undefined) {
    +                throw new Error('fd and buf must be set in READ method');
    +            }
    +            /* c8 ignore stop */
    +            const bytesRead = fs_1.default.readSync(fd, buf, offset, length, pos);
    +            this[ONREAD](bytesRead);
    +            threw = false;
    +        }
    +        finally {
    +            // ignoring the error from close(2) is a bad practice, but at
    +            // this point we already have an error, don't need another one
    +            if (threw) {
    +                try {
    +                    this[CLOSE](() => { });
    +                }
    +                catch (er) { }
    +            }
    +        }
    +    }
    +    [AWAITDRAIN](cb) {
    +        cb();
    +    }
    +    /* c8 ignore start */
    +    [CLOSE](cb = () => { }) {
    +        /* c8 ignore stop */
    +        if (this.fd !== undefined)
    +            fs_1.default.closeSync(this.fd);
    +        cb();
    +    }
    +}
    +exports.WriteEntrySync = WriteEntrySync;
    +class WriteEntryTar extends minipass_1.Minipass {
    +    blockLen = 0;
    +    blockRemain = 0;
    +    buf = 0;
    +    pos = 0;
    +    remain = 0;
    +    length = 0;
    +    preservePaths;
    +    portable;
    +    strict;
    +    noPax;
    +    noMtime;
    +    readEntry;
    +    type;
    +    prefix;
    +    path;
    +    mode;
    +    uid;
    +    gid;
    +    uname;
    +    gname;
    +    header;
    +    mtime;
    +    atime;
    +    ctime;
    +    linkpath;
    +    size;
    +    warn(code, message, data = {}) {
    +        return (0, warn_method_js_1.warnMethod)(this, code, message, data);
    +    }
    +    constructor(readEntry, opt_ = {}) {
    +        const opt = (0, options_js_1.dealias)(opt_);
    +        super();
    +        this.preservePaths = !!opt.preservePaths;
    +        this.portable = !!opt.portable;
    +        this.strict = !!opt.strict;
    +        this.noPax = !!opt.noPax;
    +        this.noMtime = !!opt.noMtime;
    +        this.readEntry = readEntry;
    +        const { type } = readEntry;
    +        /* c8 ignore start */
    +        if (type === 'Unsupported') {
    +            throw new Error('writing entry that should be ignored');
    +        }
    +        /* c8 ignore stop */
    +        this.type = type;
    +        if (this.type === 'Directory' && this.portable) {
    +            this.noMtime = true;
    +        }
    +        this.prefix = opt.prefix;
    +        this.path = (0, normalize_windows_path_js_1.normalizeWindowsPath)(readEntry.path);
    +        this.mode =
    +            readEntry.mode !== undefined ?
    +                this[MODE](readEntry.mode)
    +                : undefined;
    +        this.uid = this.portable ? undefined : readEntry.uid;
    +        this.gid = this.portable ? undefined : readEntry.gid;
    +        this.uname = this.portable ? undefined : readEntry.uname;
    +        this.gname = this.portable ? undefined : readEntry.gname;
    +        this.size = readEntry.size;
    +        this.mtime =
    +            this.noMtime ? undefined : opt.mtime || readEntry.mtime;
    +        this.atime = this.portable ? undefined : readEntry.atime;
    +        this.ctime = this.portable ? undefined : readEntry.ctime;
    +        this.linkpath =
    +            readEntry.linkpath !== undefined ?
    +                (0, normalize_windows_path_js_1.normalizeWindowsPath)(readEntry.linkpath)
    +                : undefined;
    +        if (typeof opt.onwarn === 'function') {
    +            this.on('warn', opt.onwarn);
    +        }
    +        let pathWarn = false;
    +        if (!this.preservePaths) {
    +            const [root, stripped] = (0, strip_absolute_path_js_1.stripAbsolutePath)(this.path);
    +            if (root && typeof stripped === 'string') {
    +                this.path = stripped;
    +                pathWarn = root;
    +            }
    +        }
    +        this.remain = readEntry.size;
    +        this.blockRemain = readEntry.startBlockSize;
    +        this.header = new header_js_1.Header({
    +            path: this[PREFIX](this.path),
    +            linkpath: this.type === 'Link' && this.linkpath !== undefined ?
    +                this[PREFIX](this.linkpath)
    +                : this.linkpath,
    +            // only the permissions and setuid/setgid/sticky bitflags
    +            // not the higher-order bits that specify file type
    +            mode: this.mode,
    +            uid: this.portable ? undefined : this.uid,
    +            gid: this.portable ? undefined : this.gid,
    +            size: this.size,
    +            mtime: this.noMtime ? undefined : this.mtime,
    +            type: this.type,
    +            uname: this.portable ? undefined : this.uname,
    +            atime: this.portable ? undefined : this.atime,
    +            ctime: this.portable ? undefined : this.ctime,
    +        });
    +        if (pathWarn) {
    +            this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, {
    +                entry: this,
    +                path: pathWarn + this.path,
    +            });
    +        }
    +        if (this.header.encode() && !this.noPax) {
    +            super.write(new pax_js_1.Pax({
    +                atime: this.portable ? undefined : this.atime,
    +                ctime: this.portable ? undefined : this.ctime,
    +                gid: this.portable ? undefined : this.gid,
    +                mtime: this.noMtime ? undefined : this.mtime,
    +                path: this[PREFIX](this.path),
    +                linkpath: this.type === 'Link' && this.linkpath !== undefined ?
    +                    this[PREFIX](this.linkpath)
    +                    : this.linkpath,
    +                size: this.size,
    +                uid: this.portable ? undefined : this.uid,
    +                uname: this.portable ? undefined : this.uname,
    +                dev: this.portable ? undefined : this.readEntry.dev,
    +                ino: this.portable ? undefined : this.readEntry.ino,
    +                nlink: this.portable ? undefined : this.readEntry.nlink,
    +            }).encode());
    +        }
    +        const b = this.header?.block;
    +        /* c8 ignore start */
    +        if (!b)
    +            throw new Error('failed to encode header');
    +        /* c8 ignore stop */
    +        super.write(b);
    +        readEntry.pipe(this);
    +    }
    +    [PREFIX](path) {
    +        return prefixPath(path, this.prefix);
    +    }
    +    [MODE](mode) {
    +        return (0, mode_fix_js_1.modeFix)(mode, this.type === 'Directory', this.portable);
    +    }
    +    write(chunk, encoding, cb) {
    +        /* c8 ignore start - just junk to comply with NodeJS.WritableStream */
    +        if (typeof encoding === 'function') {
    +            cb = encoding;
    +            encoding = undefined;
    +        }
    +        if (typeof chunk === 'string') {
    +            chunk = Buffer.from(chunk, typeof encoding === 'string' ? encoding : 'utf8');
    +        }
    +        /* c8 ignore stop */
    +        const writeLen = chunk.length;
    +        if (writeLen > this.blockRemain) {
    +            throw new Error('writing more to entry than is appropriate');
    +        }
    +        this.blockRemain -= writeLen;
    +        return super.write(chunk, cb);
    +    }
    +    end(chunk, encoding, cb) {
    +        if (this.blockRemain) {
    +            super.write(Buffer.alloc(this.blockRemain));
    +        }
    +        /* c8 ignore start - just junk to comply with NodeJS.WritableStream */
    +        if (typeof chunk === 'function') {
    +            cb = chunk;
    +            encoding = undefined;
    +            chunk = undefined;
    +        }
    +        if (typeof encoding === 'function') {
    +            cb = encoding;
    +            encoding = undefined;
    +        }
    +        if (typeof chunk === 'string') {
    +            chunk = Buffer.from(chunk, encoding ?? 'utf8');
    +        }
    +        if (cb)
    +            this.once('finish', cb);
    +        chunk ? super.end(chunk, cb) : super.end(cb);
    +        /* c8 ignore stop */
    +        return this;
    +    }
    +}
    +exports.WriteEntryTar = WriteEntryTar;
    +const getType = (stat) => stat.isFile() ? 'File'
    +    : stat.isDirectory() ? 'Directory'
    +        : stat.isSymbolicLink() ? 'SymbolicLink'
    +            : 'Unsupported';
    +//# sourceMappingURL=write-entry.js.map
     
    -                var isError = tagTester('Error');
    +/***/ }),
     
    -                var isSymbol = tagTester('Symbol');
    +/***/ 4721:
    +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
     
    -                var isArrayBuffer = tagTester('ArrayBuffer');
    +"use strict";
     
    -                var isFunction = tagTester('Function');
    +var __importDefault = (this && this.__importDefault) || function (mod) {
    +    return (mod && mod.__esModule) ? mod : { "default": mod };
    +};
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.Minipass = exports.isWritable = exports.isReadable = exports.isStream = void 0;
    +const proc = typeof process === 'object' && process
    +    ? process
    +    : {
    +        stdout: null,
    +        stderr: null,
    +    };
    +const events_1 = __nccwpck_require__(2361);
    +const stream_1 = __importDefault(__nccwpck_require__(2781));
    +const string_decoder_1 = __nccwpck_require__(1576);
    +/**
    + * Return true if the argument is a Minipass stream, Node stream, or something
    + * else that Minipass can interact with.
    + */
    +const isStream = (s) => !!s &&
    +    typeof s === 'object' &&
    +    (s instanceof Minipass ||
    +        s instanceof stream_1.default ||
    +        (0, exports.isReadable)(s) ||
    +        (0, exports.isWritable)(s));
    +exports.isStream = isStream;
    +/**
    + * Return true if the argument is a valid {@link Minipass.Readable}
    + */
    +const isReadable = (s) => !!s &&
    +    typeof s === 'object' &&
    +    s instanceof events_1.EventEmitter &&
    +    typeof s.pipe === 'function' &&
    +    // node core Writable streams have a pipe() method, but it throws
    +    s.pipe !== stream_1.default.Writable.prototype.pipe;
    +exports.isReadable = isReadable;
    +/**
    + * Return true if the argument is a valid {@link Minipass.Writable}
    + */
    +const isWritable = (s) => !!s &&
    +    typeof s === 'object' &&
    +    s instanceof events_1.EventEmitter &&
    +    typeof s.write === 'function' &&
    +    typeof s.end === 'function';
    +exports.isWritable = isWritable;
    +const EOF = Symbol('EOF');
    +const MAYBE_EMIT_END = Symbol('maybeEmitEnd');
    +const EMITTED_END = Symbol('emittedEnd');
    +const EMITTING_END = Symbol('emittingEnd');
    +const EMITTED_ERROR = Symbol('emittedError');
    +const CLOSED = Symbol('closed');
    +const READ = Symbol('read');
    +const FLUSH = Symbol('flush');
    +const FLUSHCHUNK = Symbol('flushChunk');
    +const ENCODING = Symbol('encoding');
    +const DECODER = Symbol('decoder');
    +const FLOWING = Symbol('flowing');
    +const PAUSED = Symbol('paused');
    +const RESUME = Symbol('resume');
    +const BUFFER = Symbol('buffer');
    +const PIPES = Symbol('pipes');
    +const BUFFERLENGTH = Symbol('bufferLength');
    +const BUFFERPUSH = Symbol('bufferPush');
    +const BUFFERSHIFT = Symbol('bufferShift');
    +const OBJECTMODE = Symbol('objectMode');
    +// internal event when stream is destroyed
    +const DESTROYED = Symbol('destroyed');
    +// internal event when stream has an error
    +const ERROR = Symbol('error');
    +const EMITDATA = Symbol('emitData');
    +const EMITEND = Symbol('emitEnd');
    +const EMITEND2 = Symbol('emitEnd2');
    +const ASYNC = Symbol('async');
    +const ABORT = Symbol('abort');
    +const ABORTED = Symbol('aborted');
    +const SIGNAL = Symbol('signal');
    +const DATALISTENERS = Symbol('dataListeners');
    +const DISCARDED = Symbol('discarded');
    +const defer = (fn) => Promise.resolve().then(fn);
    +const nodefer = (fn) => fn();
    +const isEndish = (ev) => ev === 'end' || ev === 'finish' || ev === 'prefinish';
    +const isArrayBufferLike = (b) => b instanceof ArrayBuffer ||
    +    (!!b &&
    +        typeof b === 'object' &&
    +        b.constructor &&
    +        b.constructor.name === 'ArrayBuffer' &&
    +        b.byteLength >= 0);
    +const isArrayBufferView = (b) => !Buffer.isBuffer(b) && ArrayBuffer.isView(b);
    +/**
    + * Internal class representing a pipe to a destination stream.
    + *
    + * @internal
    + */
    +class Pipe {
    +    src;
    +    dest;
    +    opts;
    +    ondrain;
    +    constructor(src, dest, opts) {
    +        this.src = src;
    +        this.dest = dest;
    +        this.opts = opts;
    +        this.ondrain = () => src[RESUME]();
    +        this.dest.on('drain', this.ondrain);
    +    }
    +    unpipe() {
    +        this.dest.removeListener('drain', this.ondrain);
    +    }
    +    // only here for the prototype
    +    /* c8 ignore start */
    +    proxyErrors(_er) { }
    +    /* c8 ignore stop */
    +    end() {
    +        this.unpipe();
    +        if (this.opts.end)
    +            this.dest.end();
    +    }
    +}
    +/**
    + * Internal class representing a pipe to a destination stream where
    + * errors are proxied.
    + *
    + * @internal
    + */
    +class PipeProxyErrors extends Pipe {
    +    unpipe() {
    +        this.src.removeListener('error', this.proxyErrors);
    +        super.unpipe();
    +    }
    +    constructor(src, dest, opts) {
    +        super(src, dest, opts);
    +        this.proxyErrors = er => dest.emit('error', er);
    +        src.on('error', this.proxyErrors);
    +    }
    +}
    +const isObjectModeOptions = (o) => !!o.objectMode;
    +const isEncodingOptions = (o) => !o.objectMode && !!o.encoding && o.encoding !== 'buffer';
    +/**
    + * Main export, the Minipass class
    + *
    + * `RType` is the type of data emitted, defaults to Buffer
    + *
    + * `WType` is the type of data to be written, if RType is buffer or string,
    + * then any {@link Minipass.ContiguousData} is allowed.
    + *
    + * `Events` is the set of event handler signatures that this object
    + * will emit, see {@link Minipass.Events}
    + */
    +class Minipass extends events_1.EventEmitter {
    +    [FLOWING] = false;
    +    [PAUSED] = false;
    +    [PIPES] = [];
    +    [BUFFER] = [];
    +    [OBJECTMODE];
    +    [ENCODING];
    +    [ASYNC];
    +    [DECODER];
    +    [EOF] = false;
    +    [EMITTED_END] = false;
    +    [EMITTING_END] = false;
    +    [CLOSED] = false;
    +    [EMITTED_ERROR] = null;
    +    [BUFFERLENGTH] = 0;
    +    [DESTROYED] = false;
    +    [SIGNAL];
    +    [ABORTED] = false;
    +    [DATALISTENERS] = 0;
    +    [DISCARDED] = false;
    +    /**
    +     * true if the stream can be written
    +     */
    +    writable = true;
    +    /**
    +     * true if the stream can be read
    +     */
    +    readable = true;
    +    /**
    +     * If `RType` is Buffer, then options do not need to be provided.
    +     * Otherwise, an options object must be provided to specify either
    +     * {@link Minipass.SharedOptions.objectMode} or
    +     * {@link Minipass.SharedOptions.encoding}, as appropriate.
    +     */
    +    constructor(...args) {
    +        const options = (args[0] ||
    +            {});
    +        super();
    +        if (options.objectMode && typeof options.encoding === 'string') {
    +            throw new TypeError('Encoding and objectMode may not be used together');
    +        }
    +        if (isObjectModeOptions(options)) {
    +            this[OBJECTMODE] = true;
    +            this[ENCODING] = null;
    +        }
    +        else if (isEncodingOptions(options)) {
    +            this[ENCODING] = options.encoding;
    +            this[OBJECTMODE] = false;
    +        }
    +        else {
    +            this[OBJECTMODE] = false;
    +            this[ENCODING] = null;
    +        }
    +        this[ASYNC] = !!options.async;
    +        this[DECODER] = this[ENCODING]
    +            ? new string_decoder_1.StringDecoder(this[ENCODING])
    +            : null;
    +        //@ts-ignore - private option for debugging and testing
    +        if (options && options.debugExposeBuffer === true) {
    +            Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] });
    +        }
    +        //@ts-ignore - private option for debugging and testing
    +        if (options && options.debugExposePipes === true) {
    +            Object.defineProperty(this, 'pipes', { get: () => this[PIPES] });
    +        }
    +        const { signal } = options;
    +        if (signal) {
    +            this[SIGNAL] = signal;
    +            if (signal.aborted) {
    +                this[ABORT]();
    +            }
    +            else {
    +                signal.addEventListener('abort', () => this[ABORT]());
    +            }
    +        }
    +    }
    +    /**
    +     * The amount of data stored in the buffer waiting to be read.
    +     *
    +     * For Buffer strings, this will be the total byte length.
    +     * For string encoding streams, this will be the string character length,
    +     * according to JavaScript's `string.length` logic.
    +     * For objectMode streams, this is a count of the items waiting to be
    +     * emitted.
    +     */
    +    get bufferLength() {
    +        return this[BUFFERLENGTH];
    +    }
    +    /**
    +     * The `BufferEncoding` currently in use, or `null`
    +     */
    +    get encoding() {
    +        return this[ENCODING];
    +    }
    +    /**
    +     * @deprecated - This is a read only property
    +     */
    +    set encoding(_enc) {
    +        throw new Error('Encoding must be set at instantiation time');
    +    }
    +    /**
    +     * @deprecated - Encoding may only be set at instantiation time
    +     */
    +    setEncoding(_enc) {
    +        throw new Error('Encoding must be set at instantiation time');
    +    }
    +    /**
    +     * True if this is an objectMode stream
    +     */
    +    get objectMode() {
    +        return this[OBJECTMODE];
    +    }
    +    /**
    +     * @deprecated - This is a read-only property
    +     */
    +    set objectMode(_om) {
    +        throw new Error('objectMode must be set at instantiation time');
    +    }
    +    /**
    +     * true if this is an async stream
    +     */
    +    get ['async']() {
    +        return this[ASYNC];
    +    }
    +    /**
    +     * Set to true to make this stream async.
    +     *
    +     * Once set, it cannot be unset, as this would potentially cause incorrect
    +     * behavior.  Ie, a sync stream can be made async, but an async stream
    +     * cannot be safely made sync.
    +     */
    +    set ['async'](a) {
    +        this[ASYNC] = this[ASYNC] || !!a;
    +    }
    +    // drop everything and get out of the flow completely
    +    [ABORT]() {
    +        this[ABORTED] = true;
    +        this.emit('abort', this[SIGNAL]?.reason);
    +        this.destroy(this[SIGNAL]?.reason);
    +    }
    +    /**
    +     * True if the stream has been aborted.
    +     */
    +    get aborted() {
    +        return this[ABORTED];
    +    }
    +    /**
    +     * No-op setter. Stream aborted status is set via the AbortSignal provided
    +     * in the constructor options.
    +     */
    +    set aborted(_) { }
    +    write(chunk, encoding, cb) {
    +        if (this[ABORTED])
    +            return false;
    +        if (this[EOF])
    +            throw new Error('write after end');
    +        if (this[DESTROYED]) {
    +            this.emit('error', Object.assign(new Error('Cannot call write after a stream was destroyed'), { code: 'ERR_STREAM_DESTROYED' }));
    +            return true;
    +        }
    +        if (typeof encoding === 'function') {
    +            cb = encoding;
    +            encoding = 'utf8';
    +        }
    +        if (!encoding)
    +            encoding = 'utf8';
    +        const fn = this[ASYNC] ? defer : nodefer;
    +        // convert array buffers and typed array views into buffers
    +        // at some point in the future, we may want to do the opposite!
    +        // leave strings and buffers as-is
    +        // anything is only allowed if in object mode, so throw
    +        if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
    +            if (isArrayBufferView(chunk)) {
    +                //@ts-ignore - sinful unsafe type changing
    +                chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
    +            }
    +            else if (isArrayBufferLike(chunk)) {
    +                //@ts-ignore - sinful unsafe type changing
    +                chunk = Buffer.from(chunk);
    +            }
    +            else if (typeof chunk !== 'string') {
    +                throw new Error('Non-contiguous data written to non-objectMode stream');
    +            }
    +        }
    +        // handle object mode up front, since it's simpler
    +        // this yields better performance, fewer checks later.
    +        if (this[OBJECTMODE]) {
    +            // maybe impossible?
    +            /* c8 ignore start */
    +            if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    +                this[FLUSH](true);
    +            /* c8 ignore stop */
    +            if (this[FLOWING])
    +                this.emit('data', chunk);
    +            else
    +                this[BUFFERPUSH](chunk);
    +            if (this[BUFFERLENGTH] !== 0)
    +                this.emit('readable');
    +            if (cb)
    +                fn(cb);
    +            return this[FLOWING];
    +        }
    +        // at this point the chunk is a buffer or string
    +        // don't buffer it up or send it to the decoder
    +        if (!chunk.length) {
    +            if (this[BUFFERLENGTH] !== 0)
    +                this.emit('readable');
    +            if (cb)
    +                fn(cb);
    +            return this[FLOWING];
    +        }
    +        // fast-path writing strings of same encoding to a stream with
    +        // an empty buffer, skipping the buffer/decoder dance
    +        if (typeof chunk === 'string' &&
    +            // unless it is a string already ready for us to use
    +            !(encoding === this[ENCODING] && !this[DECODER]?.lastNeed)) {
    +            //@ts-ignore - sinful unsafe type change
    +            chunk = Buffer.from(chunk, encoding);
    +        }
    +        if (Buffer.isBuffer(chunk) && this[ENCODING]) {
    +            //@ts-ignore - sinful unsafe type change
    +            chunk = this[DECODER].write(chunk);
    +        }
    +        // Note: flushing CAN potentially switch us into not-flowing mode
    +        if (this[FLOWING] && this[BUFFERLENGTH] !== 0)
    +            this[FLUSH](true);
    +        if (this[FLOWING])
    +            this.emit('data', chunk);
    +        else
    +            this[BUFFERPUSH](chunk);
    +        if (this[BUFFERLENGTH] !== 0)
    +            this.emit('readable');
    +        if (cb)
    +            fn(cb);
    +        return this[FLOWING];
    +    }
    +    /**
    +     * Low-level explicit read method.
    +     *
    +     * In objectMode, the argument is ignored, and one item is returned if
    +     * available.
    +     *
    +     * `n` is the number of bytes (or in the case of encoding streams,
    +     * characters) to consume. If `n` is not provided, then the entire buffer
    +     * is returned, or `null` is returned if no data is available.
    +     *
    +     * If `n` is greater that the amount of data in the internal buffer,
    +     * then `null` is returned.
    +     */
    +    read(n) {
    +        if (this[DESTROYED])
    +            return null;
    +        this[DISCARDED] = false;
    +        if (this[BUFFERLENGTH] === 0 ||
    +            n === 0 ||
    +            (n && n > this[BUFFERLENGTH])) {
    +            this[MAYBE_EMIT_END]();
    +            return null;
    +        }
    +        if (this[OBJECTMODE])
    +            n = null;
    +        if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
    +            // not object mode, so if we have an encoding, then RType is string
    +            // otherwise, must be Buffer
    +            this[BUFFER] = [
    +                (this[ENCODING]
    +                    ? this[BUFFER].join('')
    +                    : Buffer.concat(this[BUFFER], this[BUFFERLENGTH])),
    +            ];
    +        }
    +        const ret = this[READ](n || null, this[BUFFER][0]);
    +        this[MAYBE_EMIT_END]();
    +        return ret;
    +    }
    +    [READ](n, chunk) {
    +        if (this[OBJECTMODE])
    +            this[BUFFERSHIFT]();
    +        else {
    +            const c = chunk;
    +            if (n === c.length || n === null)
    +                this[BUFFERSHIFT]();
    +            else if (typeof c === 'string') {
    +                this[BUFFER][0] = c.slice(n);
    +                chunk = c.slice(0, n);
    +                this[BUFFERLENGTH] -= n;
    +            }
    +            else {
    +                this[BUFFER][0] = c.subarray(n);
    +                chunk = c.subarray(0, n);
    +                this[BUFFERLENGTH] -= n;
    +            }
    +        }
    +        this.emit('data', chunk);
    +        if (!this[BUFFER].length && !this[EOF])
    +            this.emit('drain');
    +        return chunk;
    +    }
    +    end(chunk, encoding, cb) {
    +        if (typeof chunk === 'function') {
    +            cb = chunk;
    +            chunk = undefined;
    +        }
    +        if (typeof encoding === 'function') {
    +            cb = encoding;
    +            encoding = 'utf8';
    +        }
    +        if (chunk !== undefined)
    +            this.write(chunk, encoding);
    +        if (cb)
    +            this.once('end', cb);
    +        this[EOF] = true;
    +        this.writable = false;
    +        // if we haven't written anything, then go ahead and emit,
    +        // even if we're not reading.
    +        // we'll re-emit if a new 'end' listener is added anyway.
    +        // This makes MP more suitable to write-only use cases.
    +        if (this[FLOWING] || !this[PAUSED])
    +            this[MAYBE_EMIT_END]();
    +        return this;
    +    }
    +    // don't let the internal resume be overwritten
    +    [RESUME]() {
    +        if (this[DESTROYED])
    +            return;
    +        if (!this[DATALISTENERS] && !this[PIPES].length) {
    +            this[DISCARDED] = true;
    +        }
    +        this[PAUSED] = false;
    +        this[FLOWING] = true;
    +        this.emit('resume');
    +        if (this[BUFFER].length)
    +            this[FLUSH]();
    +        else if (this[EOF])
    +            this[MAYBE_EMIT_END]();
    +        else
    +            this.emit('drain');
    +    }
    +    /**
    +     * Resume the stream if it is currently in a paused state
    +     *
    +     * If called when there are no pipe destinations or `data` event listeners,
    +     * this will place the stream in a "discarded" state, where all data will
    +     * be thrown away. The discarded state is removed if a pipe destination or
    +     * data handler is added, if pause() is called, or if any synchronous or
    +     * asynchronous iteration is started.
    +     */
    +    resume() {
    +        return this[RESUME]();
    +    }
    +    /**
    +     * Pause the stream
    +     */
    +    pause() {
    +        this[FLOWING] = false;
    +        this[PAUSED] = true;
    +        this[DISCARDED] = false;
    +    }
    +    /**
    +     * true if the stream has been forcibly destroyed
    +     */
    +    get destroyed() {
    +        return this[DESTROYED];
    +    }
    +    /**
    +     * true if the stream is currently in a flowing state, meaning that
    +     * any writes will be immediately emitted.
    +     */
    +    get flowing() {
    +        return this[FLOWING];
    +    }
    +    /**
    +     * true if the stream is currently in a paused state
    +     */
    +    get paused() {
    +        return this[PAUSED];
    +    }
    +    [BUFFERPUSH](chunk) {
    +        if (this[OBJECTMODE])
    +            this[BUFFERLENGTH] += 1;
    +        else
    +            this[BUFFERLENGTH] += chunk.length;
    +        this[BUFFER].push(chunk);
    +    }
    +    [BUFFERSHIFT]() {
    +        if (this[OBJECTMODE])
    +            this[BUFFERLENGTH] -= 1;
    +        else
    +            this[BUFFERLENGTH] -= this[BUFFER][0].length;
    +        return this[BUFFER].shift();
    +    }
    +    [FLUSH](noDrain = false) {
    +        do { } while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) &&
    +            this[BUFFER].length);
    +        if (!noDrain && !this[BUFFER].length && !this[EOF])
    +            this.emit('drain');
    +    }
    +    [FLUSHCHUNK](chunk) {
    +        this.emit('data', chunk);
    +        return this[FLOWING];
    +    }
    +    /**
    +     * Pipe all data emitted by this stream into the destination provided.
    +     *
    +     * Triggers the flow of data.
    +     */
    +    pipe(dest, opts) {
    +        if (this[DESTROYED])
    +            return dest;
    +        this[DISCARDED] = false;
    +        const ended = this[EMITTED_END];
    +        opts = opts || {};
    +        if (dest === proc.stdout || dest === proc.stderr)
    +            opts.end = false;
    +        else
    +            opts.end = opts.end !== false;
    +        opts.proxyErrors = !!opts.proxyErrors;
    +        // piping an ended stream ends immediately
    +        if (ended) {
    +            if (opts.end)
    +                dest.end();
    +        }
    +        else {
    +            // "as" here just ignores the WType, which pipes don't care about,
    +            // since they're only consuming from us, and writing to the dest
    +            this[PIPES].push(!opts.proxyErrors
    +                ? new Pipe(this, dest, opts)
    +                : new PipeProxyErrors(this, dest, opts));
    +            if (this[ASYNC])
    +                defer(() => this[RESUME]());
    +            else
    +                this[RESUME]();
    +        }
    +        return dest;
    +    }
    +    /**
    +     * Fully unhook a piped destination stream.
    +     *
    +     * If the destination stream was the only consumer of this stream (ie,
    +     * there are no other piped destinations or `'data'` event listeners)
    +     * then the flow of data will stop until there is another consumer or
    +     * {@link Minipass#resume} is explicitly called.
    +     */
    +    unpipe(dest) {
    +        const p = this[PIPES].find(p => p.dest === dest);
    +        if (p) {
    +            if (this[PIPES].length === 1) {
    +                if (this[FLOWING] && this[DATALISTENERS] === 0) {
    +                    this[FLOWING] = false;
    +                }
    +                this[PIPES] = [];
    +            }
    +            else
    +                this[PIPES].splice(this[PIPES].indexOf(p), 1);
    +            p.unpipe();
    +        }
    +    }
    +    /**
    +     * Alias for {@link Minipass#on}
    +     */
    +    addListener(ev, handler) {
    +        return this.on(ev, handler);
    +    }
    +    /**
    +     * Mostly identical to `EventEmitter.on`, with the following
    +     * behavior differences to prevent data loss and unnecessary hangs:
    +     *
    +     * - Adding a 'data' event handler will trigger the flow of data
    +     *
    +     * - Adding a 'readable' event handler when there is data waiting to be read
    +     *   will cause 'readable' to be emitted immediately.
    +     *
    +     * - Adding an 'endish' event handler ('end', 'finish', etc.) which has
    +     *   already passed will cause the event to be emitted immediately and all
    +     *   handlers removed.
    +     *
    +     * - Adding an 'error' event handler after an error has been emitted will
    +     *   cause the event to be re-emitted immediately with the error previously
    +     *   raised.
    +     */
    +    on(ev, handler) {
    +        const ret = super.on(ev, handler);
    +        if (ev === 'data') {
    +            this[DISCARDED] = false;
    +            this[DATALISTENERS]++;
    +            if (!this[PIPES].length && !this[FLOWING]) {
    +                this[RESUME]();
    +            }
    +        }
    +        else if (ev === 'readable' && this[BUFFERLENGTH] !== 0) {
    +            super.emit('readable');
    +        }
    +        else if (isEndish(ev) && this[EMITTED_END]) {
    +            super.emit(ev);
    +            this.removeAllListeners(ev);
    +        }
    +        else if (ev === 'error' && this[EMITTED_ERROR]) {
    +            const h = handler;
    +            if (this[ASYNC])
    +                defer(() => h.call(this, this[EMITTED_ERROR]));
    +            else
    +                h.call(this, this[EMITTED_ERROR]);
    +        }
    +        return ret;
    +    }
    +    /**
    +     * Alias for {@link Minipass#off}
    +     */
    +    removeListener(ev, handler) {
    +        return this.off(ev, handler);
    +    }
    +    /**
    +     * Mostly identical to `EventEmitter.off`
    +     *
    +     * If a 'data' event handler is removed, and it was the last consumer
    +     * (ie, there are no pipe destinations or other 'data' event listeners),
    +     * then the flow of data will stop until there is another consumer or
    +     * {@link Minipass#resume} is explicitly called.
    +     */
    +    off(ev, handler) {
    +        const ret = super.off(ev, handler);
    +        // if we previously had listeners, and now we don't, and we don't
    +        // have any pipes, then stop the flow, unless it's been explicitly
    +        // put in a discarded flowing state via stream.resume().
    +        if (ev === 'data') {
    +            this[DATALISTENERS] = this.listeners('data').length;
    +            if (this[DATALISTENERS] === 0 &&
    +                !this[DISCARDED] &&
    +                !this[PIPES].length) {
    +                this[FLOWING] = false;
    +            }
    +        }
    +        return ret;
    +    }
    +    /**
    +     * Mostly identical to `EventEmitter.removeAllListeners`
    +     *
    +     * If all 'data' event handlers are removed, and they were the last consumer
    +     * (ie, there are no pipe destinations), then the flow of data will stop
    +     * until there is another consumer or {@link Minipass#resume} is explicitly
    +     * called.
    +     */
    +    removeAllListeners(ev) {
    +        const ret = super.removeAllListeners(ev);
    +        if (ev === 'data' || ev === undefined) {
    +            this[DATALISTENERS] = 0;
    +            if (!this[DISCARDED] && !this[PIPES].length) {
    +                this[FLOWING] = false;
    +            }
    +        }
    +        return ret;
    +    }
    +    /**
    +     * true if the 'end' event has been emitted
    +     */
    +    get emittedEnd() {
    +        return this[EMITTED_END];
    +    }
    +    [MAYBE_EMIT_END]() {
    +        if (!this[EMITTING_END] &&
    +            !this[EMITTED_END] &&
    +            !this[DESTROYED] &&
    +            this[BUFFER].length === 0 &&
    +            this[EOF]) {
    +            this[EMITTING_END] = true;
    +            this.emit('end');
    +            this.emit('prefinish');
    +            this.emit('finish');
    +            if (this[CLOSED])
    +                this.emit('close');
    +            this[EMITTING_END] = false;
    +        }
    +    }
    +    /**
    +     * Mostly identical to `EventEmitter.emit`, with the following
    +     * behavior differences to prevent data loss and unnecessary hangs:
    +     *
    +     * If the stream has been destroyed, and the event is something other
    +     * than 'close' or 'error', then `false` is returned and no handlers
    +     * are called.
    +     *
    +     * If the event is 'end', and has already been emitted, then the event
    +     * is ignored. If the stream is in a paused or non-flowing state, then
    +     * the event will be deferred until data flow resumes. If the stream is
    +     * async, then handlers will be called on the next tick rather than
    +     * immediately.
    +     *
    +     * If the event is 'close', and 'end' has not yet been emitted, then
    +     * the event will be deferred until after 'end' is emitted.
    +     *
    +     * If the event is 'error', and an AbortSignal was provided for the stream,
    +     * and there are no listeners, then the event is ignored, matching the
    +     * behavior of node core streams in the presense of an AbortSignal.
    +     *
    +     * If the event is 'finish' or 'prefinish', then all listeners will be
    +     * removed after emitting the event, to prevent double-firing.
    +     */
    +    emit(ev, ...args) {
    +        const data = args[0];
    +        // error and close are only events allowed after calling destroy()
    +        if (ev !== 'error' &&
    +            ev !== 'close' &&
    +            ev !== DESTROYED &&
    +            this[DESTROYED]) {
    +            return false;
    +        }
    +        else if (ev === 'data') {
    +            return !this[OBJECTMODE] && !data
    +                ? false
    +                : this[ASYNC]
    +                    ? (defer(() => this[EMITDATA](data)), true)
    +                    : this[EMITDATA](data);
    +        }
    +        else if (ev === 'end') {
    +            return this[EMITEND]();
    +        }
    +        else if (ev === 'close') {
    +            this[CLOSED] = true;
    +            // don't emit close before 'end' and 'finish'
    +            if (!this[EMITTED_END] && !this[DESTROYED])
    +                return false;
    +            const ret = super.emit('close');
    +            this.removeAllListeners('close');
    +            return ret;
    +        }
    +        else if (ev === 'error') {
    +            this[EMITTED_ERROR] = data;
    +            super.emit(ERROR, data);
    +            const ret = !this[SIGNAL] || this.listeners('error').length
    +                ? super.emit('error', data)
    +                : false;
    +            this[MAYBE_EMIT_END]();
    +            return ret;
    +        }
    +        else if (ev === 'resume') {
    +            const ret = super.emit('resume');
    +            this[MAYBE_EMIT_END]();
    +            return ret;
    +        }
    +        else if (ev === 'finish' || ev === 'prefinish') {
    +            const ret = super.emit(ev);
    +            this.removeAllListeners(ev);
    +            return ret;
    +        }
    +        // Some other unknown event
    +        const ret = super.emit(ev, ...args);
    +        this[MAYBE_EMIT_END]();
    +        return ret;
    +    }
    +    [EMITDATA](data) {
    +        for (const p of this[PIPES]) {
    +            if (p.dest.write(data) === false)
    +                this.pause();
    +        }
    +        const ret = this[DISCARDED] ? false : super.emit('data', data);
    +        this[MAYBE_EMIT_END]();
    +        return ret;
    +    }
    +    [EMITEND]() {
    +        if (this[EMITTED_END])
    +            return false;
    +        this[EMITTED_END] = true;
    +        this.readable = false;
    +        return this[ASYNC]
    +            ? (defer(() => this[EMITEND2]()), true)
    +            : this[EMITEND2]();
    +    }
    +    [EMITEND2]() {
    +        if (this[DECODER]) {
    +            const data = this[DECODER].end();
    +            if (data) {
    +                for (const p of this[PIPES]) {
    +                    p.dest.write(data);
    +                }
    +                if (!this[DISCARDED])
    +                    super.emit('data', data);
    +            }
    +        }
    +        for (const p of this[PIPES]) {
    +            p.end();
    +        }
    +        const ret = super.emit('end');
    +        this.removeAllListeners('end');
    +        return ret;
    +    }
    +    /**
    +     * Return a Promise that resolves to an array of all emitted data once
    +     * the stream ends.
    +     */
    +    async collect() {
    +        const buf = Object.assign([], {
    +            dataLength: 0,
    +        });
    +        if (!this[OBJECTMODE])
    +            buf.dataLength = 0;
    +        // set the promise first, in case an error is raised
    +        // by triggering the flow here.
    +        const p = this.promise();
    +        this.on('data', c => {
    +            buf.push(c);
    +            if (!this[OBJECTMODE])
    +                buf.dataLength += c.length;
    +        });
    +        await p;
    +        return buf;
    +    }
    +    /**
    +     * Return a Promise that resolves to the concatenation of all emitted data
    +     * once the stream ends.
    +     *
    +     * Not allowed on objectMode streams.
    +     */
    +    async concat() {
    +        if (this[OBJECTMODE]) {
    +            throw new Error('cannot concat in objectMode');
    +        }
    +        const buf = await this.collect();
    +        return (this[ENCODING]
    +            ? buf.join('')
    +            : Buffer.concat(buf, buf.dataLength));
    +    }
    +    /**
    +     * Return a void Promise that resolves once the stream ends.
    +     */
    +    async promise() {
    +        return new Promise((resolve, reject) => {
    +            this.on(DESTROYED, () => reject(new Error('stream destroyed')));
    +            this.on('error', er => reject(er));
    +            this.on('end', () => resolve());
    +        });
    +    }
    +    /**
    +     * Asynchronous `for await of` iteration.
    +     *
    +     * This will continue emitting all chunks until the stream terminates.
    +     */
    +    [Symbol.asyncIterator]() {
    +        // set this up front, in case the consumer doesn't call next()
    +        // right away.
    +        this[DISCARDED] = false;
    +        let stopped = false;
    +        const stop = async () => {
    +            this.pause();
    +            stopped = true;
    +            return { value: undefined, done: true };
    +        };
    +        const next = () => {
    +            if (stopped)
    +                return stop();
    +            const res = this.read();
    +            if (res !== null)
    +                return Promise.resolve({ done: false, value: res });
    +            if (this[EOF])
    +                return stop();
    +            let resolve;
    +            let reject;
    +            const onerr = (er) => {
    +                this.off('data', ondata);
    +                this.off('end', onend);
    +                this.off(DESTROYED, ondestroy);
    +                stop();
    +                reject(er);
    +            };
    +            const ondata = (value) => {
    +                this.off('error', onerr);
    +                this.off('end', onend);
    +                this.off(DESTROYED, ondestroy);
    +                this.pause();
    +                resolve({ value, done: !!this[EOF] });
    +            };
    +            const onend = () => {
    +                this.off('error', onerr);
    +                this.off('data', ondata);
    +                this.off(DESTROYED, ondestroy);
    +                stop();
    +                resolve({ done: true, value: undefined });
    +            };
    +            const ondestroy = () => onerr(new Error('stream destroyed'));
    +            return new Promise((res, rej) => {
    +                reject = rej;
    +                resolve = res;
    +                this.once(DESTROYED, ondestroy);
    +                this.once('error', onerr);
    +                this.once('end', onend);
    +                this.once('data', ondata);
    +            });
    +        };
    +        return {
    +            next,
    +            throw: stop,
    +            return: stop,
    +            [Symbol.asyncIterator]() {
    +                return this;
    +            },
    +        };
    +    }
    +    /**
    +     * Synchronous `for of` iteration.
    +     *
    +     * The iteration will terminate when the internal buffer runs out, even
    +     * if the stream has not yet terminated.
    +     */
    +    [Symbol.iterator]() {
    +        // set this up front, in case the consumer doesn't call next()
    +        // right away.
    +        this[DISCARDED] = false;
    +        let stopped = false;
    +        const stop = () => {
    +            this.pause();
    +            this.off(ERROR, stop);
    +            this.off(DESTROYED, stop);
    +            this.off('end', stop);
    +            stopped = true;
    +            return { done: true, value: undefined };
    +        };
    +        const next = () => {
    +            if (stopped)
    +                return stop();
    +            const value = this.read();
    +            return value === null ? stop() : { done: false, value };
    +        };
    +        this.once('end', stop);
    +        this.once(ERROR, stop);
    +        this.once(DESTROYED, stop);
    +        return {
    +            next,
    +            throw: stop,
    +            return: stop,
    +            [Symbol.iterator]() {
    +                return this;
    +            },
    +        };
    +    }
    +    /**
    +     * Destroy a stream, preventing it from being used for any further purpose.
    +     *
    +     * If the stream has a `close()` method, then it will be called on
    +     * destruction.
    +     *
    +     * After destruction, any attempt to write data, read data, or emit most
    +     * events will be ignored.
    +     *
    +     * If an error argument is provided, then it will be emitted in an
    +     * 'error' event.
    +     */
    +    destroy(er) {
    +        if (this[DESTROYED]) {
    +            if (er)
    +                this.emit('error', er);
    +            else
    +                this.emit(DESTROYED);
    +            return this;
    +        }
    +        this[DESTROYED] = true;
    +        this[DISCARDED] = true;
    +        // throw away all buffered data, it's never coming out
    +        this[BUFFER].length = 0;
    +        this[BUFFERLENGTH] = 0;
    +        const wc = this;
    +        if (typeof wc.close === 'function' && !this[CLOSED])
    +            wc.close();
    +        if (er)
    +            this.emit('error', er);
    +        // if no error to emit, still reject pending promises
    +        else
    +            this.emit(DESTROYED);
    +        return this;
    +    }
    +    /**
    +     * Alias for {@link isStream}
    +     *
    +     * Former export location, maintained for backwards compatibility.
    +     *
    +     * @deprecated
    +     */
    +    static get isStream() {
    +        return exports.isStream;
    +    }
    +}
    +exports.Minipass = Minipass;
    +//# sourceMappingURL=index.js.map
     
    -                // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
    -                // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
    -                var nodelist = root.document && root.document.childNodes;
    -                if (true && typeof Int8Array != 'object' && typeof nodelist != 'function') {
    -                    isFunction = function (obj) {
    -                        return typeof obj == 'function' || false;
    -                    };
    -                }
    +/***/ }),
     
    -                var isFunction$1 = isFunction;
    +/***/ 3796:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                var hasObjectTag = tagTester('Object');
    +"use strict";
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +exports.Node = exports.Yallist = void 0;
    +class Yallist {
    +    tail;
    +    head;
    +    length = 0;
    +    static create(list = []) {
    +        return new Yallist(list);
    +    }
    +    constructor(list = []) {
    +        for (const item of list) {
    +            this.push(item);
    +        }
    +    }
    +    *[Symbol.iterator]() {
    +        for (let walker = this.head; walker; walker = walker.next) {
    +            yield walker.value;
    +        }
    +    }
    +    removeNode(node) {
    +        if (node.list !== this) {
    +            throw new Error('removing node which does not belong to this list');
    +        }
    +        const next = node.next;
    +        const prev = node.prev;
    +        if (next) {
    +            next.prev = prev;
    +        }
    +        if (prev) {
    +            prev.next = next;
    +        }
    +        if (node === this.head) {
    +            this.head = next;
    +        }
    +        if (node === this.tail) {
    +            this.tail = prev;
    +        }
    +        this.length--;
    +        node.next = undefined;
    +        node.prev = undefined;
    +        node.list = undefined;
    +        return next;
    +    }
    +    unshiftNode(node) {
    +        if (node === this.head) {
    +            return;
    +        }
    +        if (node.list) {
    +            node.list.removeNode(node);
    +        }
    +        const head = this.head;
    +        node.list = this;
    +        node.next = head;
    +        if (head) {
    +            head.prev = node;
    +        }
    +        this.head = node;
    +        if (!this.tail) {
    +            this.tail = node;
    +        }
    +        this.length++;
    +    }
    +    pushNode(node) {
    +        if (node === this.tail) {
    +            return;
    +        }
    +        if (node.list) {
    +            node.list.removeNode(node);
    +        }
    +        const tail = this.tail;
    +        node.list = this;
    +        node.prev = tail;
    +        if (tail) {
    +            tail.next = node;
    +        }
    +        this.tail = node;
    +        if (!this.head) {
    +            this.head = node;
    +        }
    +        this.length++;
    +    }
    +    push(...args) {
    +        for (let i = 0, l = args.length; i < l; i++) {
    +            push(this, args[i]);
    +        }
    +        return this.length;
    +    }
    +    unshift(...args) {
    +        for (var i = 0, l = args.length; i < l; i++) {
    +            unshift(this, args[i]);
    +        }
    +        return this.length;
    +    }
    +    pop() {
    +        if (!this.tail) {
    +            return undefined;
    +        }
    +        const res = this.tail.value;
    +        const t = this.tail;
    +        this.tail = this.tail.prev;
    +        if (this.tail) {
    +            this.tail.next = undefined;
    +        }
    +        else {
    +            this.head = undefined;
    +        }
    +        t.list = undefined;
    +        this.length--;
    +        return res;
    +    }
    +    shift() {
    +        if (!this.head) {
    +            return undefined;
    +        }
    +        const res = this.head.value;
    +        const h = this.head;
    +        this.head = this.head.next;
    +        if (this.head) {
    +            this.head.prev = undefined;
    +        }
    +        else {
    +            this.tail = undefined;
    +        }
    +        h.list = undefined;
    +        this.length--;
    +        return res;
    +    }
    +    forEach(fn, thisp) {
    +        thisp = thisp || this;
    +        for (let walker = this.head, i = 0; !!walker; i++) {
    +            fn.call(thisp, walker.value, i, this);
    +            walker = walker.next;
    +        }
    +    }
    +    forEachReverse(fn, thisp) {
    +        thisp = thisp || this;
    +        for (let walker = this.tail, i = this.length - 1; !!walker; i--) {
    +            fn.call(thisp, walker.value, i, this);
    +            walker = walker.prev;
    +        }
    +    }
    +    get(n) {
    +        let i = 0;
    +        let walker = this.head;
    +        for (; !!walker && i < n; i++) {
    +            walker = walker.next;
    +        }
    +        if (i === n && !!walker) {
    +            return walker.value;
    +        }
    +    }
    +    getReverse(n) {
    +        let i = 0;
    +        let walker = this.tail;
    +        for (; !!walker && i < n; i++) {
    +            // abort out of the list early if we hit a cycle
    +            walker = walker.prev;
    +        }
    +        if (i === n && !!walker) {
    +            return walker.value;
    +        }
    +    }
    +    map(fn, thisp) {
    +        thisp = thisp || this;
    +        const res = new Yallist();
    +        for (let walker = this.head; !!walker;) {
    +            res.push(fn.call(thisp, walker.value, this));
    +            walker = walker.next;
    +        }
    +        return res;
    +    }
    +    mapReverse(fn, thisp) {
    +        thisp = thisp || this;
    +        var res = new Yallist();
    +        for (let walker = this.tail; !!walker;) {
    +            res.push(fn.call(thisp, walker.value, this));
    +            walker = walker.prev;
    +        }
    +        return res;
    +    }
    +    reduce(fn, initial) {
    +        let acc;
    +        let walker = this.head;
    +        if (arguments.length > 1) {
    +            acc = initial;
    +        }
    +        else if (this.head) {
    +            walker = this.head.next;
    +            acc = this.head.value;
    +        }
    +        else {
    +            throw new TypeError('Reduce of empty list with no initial value');
    +        }
    +        for (var i = 0; !!walker; i++) {
    +            acc = fn(acc, walker.value, i);
    +            walker = walker.next;
    +        }
    +        return acc;
    +    }
    +    reduceReverse(fn, initial) {
    +        let acc;
    +        let walker = this.tail;
    +        if (arguments.length > 1) {
    +            acc = initial;
    +        }
    +        else if (this.tail) {
    +            walker = this.tail.prev;
    +            acc = this.tail.value;
    +        }
    +        else {
    +            throw new TypeError('Reduce of empty list with no initial value');
    +        }
    +        for (let i = this.length - 1; !!walker; i--) {
    +            acc = fn(acc, walker.value, i);
    +            walker = walker.prev;
    +        }
    +        return acc;
    +    }
    +    toArray() {
    +        const arr = new Array(this.length);
    +        for (let i = 0, walker = this.head; !!walker; i++) {
    +            arr[i] = walker.value;
    +            walker = walker.next;
    +        }
    +        return arr;
    +    }
    +    toArrayReverse() {
    +        const arr = new Array(this.length);
    +        for (let i = 0, walker = this.tail; !!walker; i++) {
    +            arr[i] = walker.value;
    +            walker = walker.prev;
    +        }
    +        return arr;
    +    }
    +    slice(from = 0, to = this.length) {
    +        if (to < 0) {
    +            to += this.length;
    +        }
    +        if (from < 0) {
    +            from += this.length;
    +        }
    +        const ret = new Yallist();
    +        if (to < from || to < 0) {
    +            return ret;
    +        }
    +        if (from < 0) {
    +            from = 0;
    +        }
    +        if (to > this.length) {
    +            to = this.length;
    +        }
    +        let walker = this.head;
    +        let i = 0;
    +        for (i = 0; !!walker && i < from; i++) {
    +            walker = walker.next;
    +        }
    +        for (; !!walker && i < to; i++, walker = walker.next) {
    +            ret.push(walker.value);
    +        }
    +        return ret;
    +    }
    +    sliceReverse(from = 0, to = this.length) {
    +        if (to < 0) {
    +            to += this.length;
    +        }
    +        if (from < 0) {
    +            from += this.length;
    +        }
    +        const ret = new Yallist();
    +        if (to < from || to < 0) {
    +            return ret;
    +        }
    +        if (from < 0) {
    +            from = 0;
    +        }
    +        if (to > this.length) {
    +            to = this.length;
    +        }
    +        let i = this.length;
    +        let walker = this.tail;
    +        for (; !!walker && i > to; i--) {
    +            walker = walker.prev;
    +        }
    +        for (; !!walker && i > from; i--, walker = walker.prev) {
    +            ret.push(walker.value);
    +        }
    +        return ret;
    +    }
    +    splice(start, deleteCount = 0, ...nodes) {
    +        if (start > this.length) {
    +            start = this.length - 1;
    +        }
    +        if (start < 0) {
    +            start = this.length + start;
    +        }
    +        let walker = this.head;
    +        for (let i = 0; !!walker && i < start; i++) {
    +            walker = walker.next;
    +        }
    +        const ret = [];
    +        for (let i = 0; !!walker && i < deleteCount; i++) {
    +            ret.push(walker.value);
    +            walker = this.removeNode(walker);
    +        }
    +        if (!walker) {
    +            walker = this.tail;
    +        }
    +        else if (walker !== this.tail) {
    +            walker = walker.prev;
    +        }
    +        for (const v of nodes) {
    +            walker = insertAfter(this, walker, v);
    +        }
    +        return ret;
    +    }
    +    reverse() {
    +        const head = this.head;
    +        const tail = this.tail;
    +        for (let walker = head; !!walker; walker = walker.prev) {
    +            const p = walker.prev;
    +            walker.prev = walker.next;
    +            walker.next = p;
    +        }
    +        this.head = tail;
    +        this.tail = head;
    +        return this;
    +    }
    +}
    +exports.Yallist = Yallist;
    +// insertAfter undefined means "make the node the new head of list"
    +function insertAfter(self, node, value) {
    +    const prev = node;
    +    const next = node ? node.next : self.head;
    +    const inserted = new Node(value, prev, next, self);
    +    if (inserted.next === undefined) {
    +        self.tail = inserted;
    +    }
    +    if (inserted.prev === undefined) {
    +        self.head = inserted;
    +    }
    +    self.length++;
    +    return inserted;
    +}
    +function push(self, item) {
    +    self.tail = new Node(item, self.tail, undefined, self);
    +    if (!self.head) {
    +        self.head = self.tail;
    +    }
    +    self.length++;
    +}
    +function unshift(self, item) {
    +    self.head = new Node(item, undefined, self.head, self);
    +    if (!self.tail) {
    +        self.tail = self.head;
    +    }
    +    self.length++;
    +}
    +class Node {
    +    list;
    +    next;
    +    prev;
    +    value;
    +    constructor(value, prev, next, list) {
    +        this.list = list;
    +        this.value = value;
    +        if (prev) {
    +            prev.next = this;
    +            this.prev = prev;
    +        }
    +        else {
    +            this.prev = undefined;
    +        }
    +        if (next) {
    +            next.prev = this;
    +            this.next = next;
    +        }
    +        else {
    +            this.next = undefined;
    +        }
    +    }
    +}
    +exports.Node = Node;
    +//# sourceMappingURL=index.js.map
     
    -                // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
    -                // In IE 11, the most common among them, this problem also applies to
    -                // `Map`, `WeakMap` and `Set`.
    -                var hasStringTagBug = (
    -                    supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
    -                ),
    -                    isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
    +/***/ }),
     
    -                var isDataView = tagTester('DataView');
    +/***/ 6717:
    +/***/ ((__unused_webpack_module, exports) => {
     
    -                // In IE 10 - Edge 13, we need a different heuristic
    -                // to determine whether an object is a `DataView`.
    -                function ie10IsDataView(obj) {
    -                    return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
    -                }
    +//     Underscore.js 1.13.6
    +//     https://underscorejs.org
    +//     (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
    +//     Underscore may be freely distributed under the MIT license.
    +
    +Object.defineProperty(exports, "__esModule", ({ value: true }));
    +
    +// Current version.
    +var VERSION = '1.13.6';
    +
    +// Establish the root object, `window` (`self`) in the browser, `global`
    +// on the server, or `this` in some virtual machines. We use `self`
    +// instead of `window` for `WebWorker` support.
    +var root = (typeof self == 'object' && self.self === self && self) ||
    +          (typeof global == 'object' && global.global === global && global) ||
    +          Function('return this')() ||
    +          {};
    +
    +// Save bytes in the minified (but not gzipped) version:
    +var ArrayProto = Array.prototype, ObjProto = Object.prototype;
    +var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
    +
    +// Create quick reference variables for speed access to core prototypes.
    +var push = ArrayProto.push,
    +    slice = ArrayProto.slice,
    +    toString = ObjProto.toString,
    +    hasOwnProperty = ObjProto.hasOwnProperty;
    +
    +// Modern feature detection.
    +var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
    +    supportsDataView = typeof DataView !== 'undefined';
    +
    +// All **ECMAScript 5+** native function implementations that we hope to use
    +// are declared here.
    +var nativeIsArray = Array.isArray,
    +    nativeKeys = Object.keys,
    +    nativeCreate = Object.create,
    +    nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
    +
    +// Create references to these builtin functions because we override them.
    +var _isNaN = isNaN,
    +    _isFinite = isFinite;
    +
    +// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
    +var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
    +var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
    +  'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
    +
    +// The largest integer that can be represented exactly.
    +var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
    +
    +// Some functions take a variable number of arguments, or a few expected
    +// arguments at the beginning and then a variable number of values to operate
    +// on. This helper accumulates all remaining arguments past the function’s
    +// argument length (or an explicit `startIndex`), into an array that becomes
    +// the last argument. Similar to ES6’s "rest parameter".
    +function restArguments(func, startIndex) {
    +  startIndex = startIndex == null ? func.length - 1 : +startIndex;
    +  return function() {
    +    var length = Math.max(arguments.length - startIndex, 0),
    +        rest = Array(length),
    +        index = 0;
    +    for (; index < length; index++) {
    +      rest[index] = arguments[index + startIndex];
    +    }
    +    switch (startIndex) {
    +      case 0: return func.call(this, rest);
    +      case 1: return func.call(this, arguments[0], rest);
    +      case 2: return func.call(this, arguments[0], arguments[1], rest);
    +    }
    +    var args = Array(startIndex + 1);
    +    for (index = 0; index < startIndex; index++) {
    +      args[index] = arguments[index];
    +    }
    +    args[startIndex] = rest;
    +    return func.apply(this, args);
    +  };
    +}
     
    -                var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);
    +// Is a given variable an object?
    +function isObject(obj) {
    +  var type = typeof obj;
    +  return type === 'function' || (type === 'object' && !!obj);
    +}
     
    -                // Is a given value an array?
    -                // Delegates to ECMA5's native `Array.isArray`.
    -                var isArray = nativeIsArray || tagTester('Array');
    +// Is a given value equal to null?
    +function isNull(obj) {
    +  return obj === null;
    +}
     
    -                // Internal function to check whether `key` is an own property name of `obj`.
    -                function has$1(obj, key) {
    -                    return obj != null && hasOwnProperty.call(obj, key);
    -                }
    +// Is a given variable undefined?
    +function isUndefined(obj) {
    +  return obj === void 0;
    +}
     
    -                var isArguments = tagTester('Arguments');
    +// Is a given value a boolean?
    +function isBoolean(obj) {
    +  return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
    +}
     
    -                // Define a fallback version of the method in browsers (ahem, IE < 9), where
    -                // there isn't any inspectable "Arguments" type.
    -                (function () {
    -                    if (!isArguments(arguments)) {
    -                        isArguments = function (obj) {
    -                            return has$1(obj, 'callee');
    -                        };
    -                    }
    -                }());
    +// Is a given value a DOM element?
    +function isElement(obj) {
    +  return !!(obj && obj.nodeType === 1);
    +}
     
    -                var isArguments$1 = isArguments;
    +// Internal function for creating a `toString`-based type tester.
    +function tagTester(name) {
    +  var tag = '[object ' + name + ']';
    +  return function(obj) {
    +    return toString.call(obj) === tag;
    +  };
    +}
     
    -                // Is a given object a finite number?
    -                function isFinite$1(obj) {
    -                    return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
    -                }
    +var isString = tagTester('String');
     
    -                // Is the given value `NaN`?
    -                function isNaN$1(obj) {
    -                    return isNumber(obj) && _isNaN(obj);
    -                }
    +var isNumber = tagTester('Number');
     
    -                // Predicate-generating function. Often useful outside of Underscore.
    -                function constant(value) {
    -                    return function () {
    -                        return value;
    -                    };
    -                }
    +var isDate = tagTester('Date');
     
    -                // Common internal logic for `isArrayLike` and `isBufferLike`.
    -                function createSizePropertyCheck(getSizeProperty) {
    -                    return function (collection) {
    -                        var sizeProperty = getSizeProperty(collection);
    -                        return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
    -                    }
    -                }
    +var isRegExp = tagTester('RegExp');
     
    -                // Internal helper to generate a function to obtain property `key` from `obj`.
    -                function shallowProperty(key) {
    -                    return function (obj) {
    -                        return obj == null ? void 0 : obj[key];
    -                    };
    -                }
    +var isError = tagTester('Error');
     
    -                // Internal helper to obtain the `byteLength` property of an object.
    -                var getByteLength = shallowProperty('byteLength');
    +var isSymbol = tagTester('Symbol');
     
    -                // Internal helper to determine whether we should spend extensive checks against
    -                // `ArrayBuffer` et al.
    -                var isBufferLike = createSizePropertyCheck(getByteLength);
    +var isArrayBuffer = tagTester('ArrayBuffer');
     
    -                // Is a given value a typed array?
    -                var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
    -                function isTypedArray(obj) {
    -                    // `ArrayBuffer.isView` is the most future-proof, so use it when available.
    -                    // Otherwise, fall back on the above regular expression.
    -                    return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
    -                        isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
    -                }
    +var isFunction = tagTester('Function');
     
    -                var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);
    -
    -                // Internal helper to obtain the `length` property of an object.
    -                var getLength = shallowProperty('length');
    -
    -                // Internal helper to create a simple lookup structure.
    -                // `collectNonEnumProps` used to depend on `_.contains`, but this led to
    -                // circular imports. `emulatedSet` is a one-off solution that only works for
    -                // arrays of strings.
    -                function emulatedSet(keys) {
    -                    var hash = {};
    -                    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
    -                    return {
    -                        contains: function (key) { return hash[key] === true; },
    -                        push: function (key) {
    -                            hash[key] = true;
    -                            return keys.push(key);
    -                        }
    -                    };
    -                }
    +// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
    +// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
    +var nodelist = root.document && root.document.childNodes;
    +if ( true && typeof Int8Array != 'object' && typeof nodelist != 'function') {
    +  isFunction = function(obj) {
    +    return typeof obj == 'function' || false;
    +  };
    +}
     
    -                // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
    -                // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
    -                // needed.
    -                function collectNonEnumProps(obj, keys) {
    -                    keys = emulatedSet(keys);
    -                    var nonEnumIdx = nonEnumerableProps.length;
    -                    var constructor = obj.constructor;
    -                    var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto;
    -
    -                    // Constructor is a special case.
    -                    var prop = 'constructor';
    -                    if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);
    -
    -                    while (nonEnumIdx--) {
    -                        prop = nonEnumerableProps[nonEnumIdx];
    -                        if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
    -                            keys.push(prop);
    -                        }
    -                    }
    -                }
    +var isFunction$1 = isFunction;
     
    -                // Retrieve the names of an object's own properties.
    -                // Delegates to **ECMAScript 5**'s native `Object.keys`.
    -                function keys(obj) {
    -                    if (!isObject(obj)) return [];
    -                    if (nativeKeys) return nativeKeys(obj);
    -                    var keys = [];
    -                    for (var key in obj) if (has$1(obj, key)) keys.push(key);
    -                    // Ahem, IE < 9.
    -                    if (hasEnumBug) collectNonEnumProps(obj, keys);
    -                    return keys;
    -                }
    +var hasObjectTag = tagTester('Object');
     
    -                // Is a given array, string, or object empty?
    -                // An "empty" object has no enumerable own-properties.
    -                function isEmpty(obj) {
    -                    if (obj == null) return true;
    -                    // Skip the more expensive `toString`-based type checks if `obj` has no
    -                    // `.length`.
    -                    var length = getLength(obj);
    -                    if (typeof length == 'number' && (
    -                        isArray(obj) || isString(obj) || isArguments$1(obj)
    -                    )) return length === 0;
    -                    return getLength(keys(obj)) === 0;
    -                }
    +// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
    +// In IE 11, the most common among them, this problem also applies to
    +// `Map`, `WeakMap` and `Set`.
    +var hasStringTagBug = (
    +      supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
    +    ),
    +    isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
     
    -                // Returns whether an object has a given set of `key:value` pairs.
    -                function isMatch(object, attrs) {
    -                    var _keys = keys(attrs), length = _keys.length;
    -                    if (object == null) return !length;
    -                    var obj = Object(object);
    -                    for (var i = 0; i < length; i++) {
    -                        var key = _keys[i];
    -                        if (attrs[key] !== obj[key] || !(key in obj)) return false;
    -                    }
    -                    return true;
    -                }
    +var isDataView = tagTester('DataView');
     
    -                // If Underscore is called as a function, it returns a wrapped object that can
    -                // be used OO-style. This wrapper holds altered versions of all functions added
    -                // through `_.mixin`. Wrapped objects may be chained.
    -                function _$1(obj) {
    -                    if (obj instanceof _$1) return obj;
    -                    if (!(this instanceof _$1)) return new _$1(obj);
    -                    this._wrapped = obj;
    -                }
    +// In IE 10 - Edge 13, we need a different heuristic
    +// to determine whether an object is a `DataView`.
    +function ie10IsDataView(obj) {
    +  return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
    +}
     
    -                _$1.VERSION = VERSION;
    +var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);
     
    -                // Extracts the result from a wrapped and chained object.
    -                _$1.prototype.value = function () {
    -                    return this._wrapped;
    -                };
    +// Is a given value an array?
    +// Delegates to ECMA5's native `Array.isArray`.
    +var isArray = nativeIsArray || tagTester('Array');
     
    -                // Provide unwrapping proxies for some methods used in engine operations
    -                // such as arithmetic and JSON stringification.
    -                _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;
    +// Internal function to check whether `key` is an own property name of `obj`.
    +function has$1(obj, key) {
    +  return obj != null && hasOwnProperty.call(obj, key);
    +}
     
    -                _$1.prototype.toString = function () {
    -                    return String(this._wrapped);
    -                };
    +var isArguments = tagTester('Arguments');
     
    -                // Internal function to wrap or shallow-copy an ArrayBuffer,
    -                // typed array or DataView to a new view, reusing the buffer.
    -                function toBufferView(bufferSource) {
    -                    return new Uint8Array(
    -                        bufferSource.buffer || bufferSource,
    -                        bufferSource.byteOffset || 0,
    -                        getByteLength(bufferSource)
    -                    );
    -                }
    +// Define a fallback version of the method in browsers (ahem, IE < 9), where
    +// there isn't any inspectable "Arguments" type.
    +(function() {
    +  if (!isArguments(arguments)) {
    +    isArguments = function(obj) {
    +      return has$1(obj, 'callee');
    +    };
    +  }
    +}());
     
    -                // We use this string twice, so give it a name for minification.
    -                var tagDataView = '[object DataView]';
    -
    -                // Internal recursive comparison function for `_.isEqual`.
    -                function eq(a, b, aStack, bStack) {
    -                    // Identical objects are equal. `0 === -0`, but they aren't identical.
    -                    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
    -                    if (a === b) return a !== 0 || 1 / a === 1 / b;
    -                    // `null` or `undefined` only equal to itself (strict comparison).
    -                    if (a == null || b == null) return false;
    -                    // `NaN`s are equivalent, but non-reflexive.
    -                    if (a !== a) return b !== b;
    -                    // Exhaust primitive checks
    -                    var type = typeof a;
    -                    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
    -                    return deepEq(a, b, aStack, bStack);
    -                }
    +var isArguments$1 = isArguments;
     
    -                // Internal recursive comparison function for `_.isEqual`.
    -                function deepEq(a, b, aStack, bStack) {
    -                    // Unwrap any wrapped objects.
    -                    if (a instanceof _$1) a = a._wrapped;
    -                    if (b instanceof _$1) b = b._wrapped;
    -                    // Compare `[[Class]]` names.
    -                    var className = toString.call(a);
    -                    if (className !== toString.call(b)) return false;
    -                    // Work around a bug in IE 10 - Edge 13.
    -                    if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
    -                        if (!isDataView$1(b)) return false;
    -                        className = tagDataView;
    -                    }
    -                    switch (className) {
    -                        // These types are compared by value.
    -                        case '[object RegExp]':
    -                        // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
    -                        case '[object String]':
    -                            // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
    -                            // equivalent to `new String("5")`.
    -                            return '' + a === '' + b;
    -                        case '[object Number]':
    -                            // `NaN`s are equivalent, but non-reflexive.
    -                            // Object(NaN) is equivalent to NaN.
    -                            if (+a !== +a) return +b !== +b;
    -                            // An `egal` comparison is performed for other numeric values.
    -                            return +a === 0 ? 1 / +a === 1 / b : +a === +b;
    -                        case '[object Date]':
    -                        case '[object Boolean]':
    -                            // Coerce dates and booleans to numeric primitive values. Dates are compared by their
    -                            // millisecond representations. Note that invalid dates with millisecond representations
    -                            // of `NaN` are not equivalent.
    -                            return +a === +b;
    -                        case '[object Symbol]':
    -                            return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
    -                        case '[object ArrayBuffer]':
    -                        case tagDataView:
    -                            // Coerce to typed array so we can fall through.
    -                            return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
    -                    }
    +// Is a given object a finite number?
    +function isFinite$1(obj) {
    +  return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
    +}
     
    -                    var areArrays = className === '[object Array]';
    -                    if (!areArrays && isTypedArray$1(a)) {
    -                        var byteLength = getByteLength(a);
    -                        if (byteLength !== getByteLength(b)) return false;
    -                        if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
    -                        areArrays = true;
    -                    }
    -                    if (!areArrays) {
    -                        if (typeof a != 'object' || typeof b != 'object') return false;
    -
    -                        // Objects with different constructors are not equivalent, but `Object`s or `Array`s
    -                        // from different frames are.
    -                        var aCtor = a.constructor, bCtor = b.constructor;
    -                        if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
    -                            isFunction$1(bCtor) && bCtor instanceof bCtor)
    -                            && ('constructor' in a && 'constructor' in b)) {
    -                            return false;
    -                        }
    -                    }
    -                    // Assume equality for cyclic structures. The algorithm for detecting cyclic
    -                    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
    -
    -                    // Initializing stack of traversed objects.
    -                    // It's done here since we only need them for objects and arrays comparison.
    -                    aStack = aStack || [];
    -                    bStack = bStack || [];
    -                    var length = aStack.length;
    -                    while (length--) {
    -                        // Linear search. Performance is inversely proportional to the number of
    -                        // unique nested structures.
    -                        if (aStack[length] === a) return bStack[length] === b;
    -                    }
    +// Is the given value `NaN`?
    +function isNaN$1(obj) {
    +  return isNumber(obj) && _isNaN(obj);
    +}
     
    -                    // Add the first object to the stack of traversed objects.
    -                    aStack.push(a);
    -                    bStack.push(b);
    -
    -                    // Recursively compare objects and arrays.
    -                    if (areArrays) {
    -                        // Compare array lengths to determine if a deep comparison is necessary.
    -                        length = a.length;
    -                        if (length !== b.length) return false;
    -                        // Deep compare the contents, ignoring non-numeric properties.
    -                        while (length--) {
    -                            if (!eq(a[length], b[length], aStack, bStack)) return false;
    -                        }
    -                    } else {
    -                        // Deep compare objects.
    -                        var _keys = keys(a), key;
    -                        length = _keys.length;
    -                        // Ensure that both objects contain the same number of properties before comparing deep equality.
    -                        if (keys(b).length !== length) return false;
    -                        while (length--) {
    -                            // Deep compare each member
    -                            key = _keys[length];
    -                            if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
    -                        }
    -                    }
    -                    // Remove the first object from the stack of traversed objects.
    -                    aStack.pop();
    -                    bStack.pop();
    -                    return true;
    -                }
    +// Predicate-generating function. Often useful outside of Underscore.
    +function constant(value) {
    +  return function() {
    +    return value;
    +  };
    +}
     
    -                // Perform a deep comparison to check if two objects are equal.
    -                function isEqual(a, b) {
    -                    return eq(a, b);
    -                }
    +// Common internal logic for `isArrayLike` and `isBufferLike`.
    +function createSizePropertyCheck(getSizeProperty) {
    +  return function(collection) {
    +    var sizeProperty = getSizeProperty(collection);
    +    return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
    +  }
    +}
     
    -                // Retrieve all the enumerable property names of an object.
    -                function allKeys(obj) {
    -                    if (!isObject(obj)) return [];
    -                    var keys = [];
    -                    for (var key in obj) keys.push(key);
    -                    // Ahem, IE < 9.
    -                    if (hasEnumBug) collectNonEnumProps(obj, keys);
    -                    return keys;
    -                }
    +// Internal helper to generate a function to obtain property `key` from `obj`.
    +function shallowProperty(key) {
    +  return function(obj) {
    +    return obj == null ? void 0 : obj[key];
    +  };
    +}
     
    -                // Since the regular `Object.prototype.toString` type tests don't work for
    -                // some types in IE 11, we use a fingerprinting heuristic instead, based
    -                // on the methods. It's not great, but it's the best we got.
    -                // The fingerprint method lists are defined below.
    -                function ie11fingerprint(methods) {
    -                    var length = getLength(methods);
    -                    return function (obj) {
    -                        if (obj == null) return false;
    -                        // `Map`, `WeakMap` and `Set` have no enumerable keys.
    -                        var keys = allKeys(obj);
    -                        if (getLength(keys)) return false;
    -                        for (var i = 0; i < length; i++) {
    -                            if (!isFunction$1(obj[methods[i]])) return false;
    -                        }
    -                        // If we are testing against `WeakMap`, we need to ensure that
    -                        // `obj` doesn't have a `forEach` method in order to distinguish
    -                        // it from a regular `Map`.
    -                        return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
    -                    };
    -                }
    +// Internal helper to obtain the `byteLength` property of an object.
    +var getByteLength = shallowProperty('byteLength');
     
    -                // In the interest of compact minification, we write
    -                // each string in the fingerprints only once.
    -                var forEachName = 'forEach',
    -                    hasName = 'has',
    -                    commonInit = ['clear', 'delete'],
    -                    mapTail = ['get', hasName, 'set'];
    +// Internal helper to determine whether we should spend extensive checks against
    +// `ArrayBuffer` et al.
    +var isBufferLike = createSizePropertyCheck(getByteLength);
     
    -                // `Map`, `WeakMap` and `Set` each have slightly different
    -                // combinations of the above sublists.
    -                var mapMethods = commonInit.concat(forEachName, mapTail),
    -                    weakMapMethods = commonInit.concat(mapTail),
    -                    setMethods = ['add'].concat(commonInit, forEachName, hasName);
    +// Is a given value a typed array?
    +var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
    +function isTypedArray(obj) {
    +  // `ArrayBuffer.isView` is the most future-proof, so use it when available.
    +  // Otherwise, fall back on the above regular expression.
    +  return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
    +                isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
    +}
     
    -                var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
    +var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);
    +
    +// Internal helper to obtain the `length` property of an object.
    +var getLength = shallowProperty('length');
    +
    +// Internal helper to create a simple lookup structure.
    +// `collectNonEnumProps` used to depend on `_.contains`, but this led to
    +// circular imports. `emulatedSet` is a one-off solution that only works for
    +// arrays of strings.
    +function emulatedSet(keys) {
    +  var hash = {};
    +  for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
    +  return {
    +    contains: function(key) { return hash[key] === true; },
    +    push: function(key) {
    +      hash[key] = true;
    +      return keys.push(key);
    +    }
    +  };
    +}
     
    -                var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
    +// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
    +// be iterated by `for key in ...` and thus missed. Extends `keys` in place if
    +// needed.
    +function collectNonEnumProps(obj, keys) {
    +  keys = emulatedSet(keys);
    +  var nonEnumIdx = nonEnumerableProps.length;
    +  var constructor = obj.constructor;
    +  var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto;
    +
    +  // Constructor is a special case.
    +  var prop = 'constructor';
    +  if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);
    +
    +  while (nonEnumIdx--) {
    +    prop = nonEnumerableProps[nonEnumIdx];
    +    if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
    +      keys.push(prop);
    +    }
    +  }
    +}
     
    -                var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
    +// Retrieve the names of an object's own properties.
    +// Delegates to **ECMAScript 5**'s native `Object.keys`.
    +function keys(obj) {
    +  if (!isObject(obj)) return [];
    +  if (nativeKeys) return nativeKeys(obj);
    +  var keys = [];
    +  for (var key in obj) if (has$1(obj, key)) keys.push(key);
    +  // Ahem, IE < 9.
    +  if (hasEnumBug) collectNonEnumProps(obj, keys);
    +  return keys;
    +}
     
    -                var isWeakSet = tagTester('WeakSet');
    +// Is a given array, string, or object empty?
    +// An "empty" object has no enumerable own-properties.
    +function isEmpty(obj) {
    +  if (obj == null) return true;
    +  // Skip the more expensive `toString`-based type checks if `obj` has no
    +  // `.length`.
    +  var length = getLength(obj);
    +  if (typeof length == 'number' && (
    +    isArray(obj) || isString(obj) || isArguments$1(obj)
    +  )) return length === 0;
    +  return getLength(keys(obj)) === 0;
    +}
     
    -                // Retrieve the values of an object's properties.
    -                function values(obj) {
    -                    var _keys = keys(obj);
    -                    var length = _keys.length;
    -                    var values = Array(length);
    -                    for (var i = 0; i < length; i++) {
    -                        values[i] = obj[_keys[i]];
    -                    }
    -                    return values;
    -                }
    +// Returns whether an object has a given set of `key:value` pairs.
    +function isMatch(object, attrs) {
    +  var _keys = keys(attrs), length = _keys.length;
    +  if (object == null) return !length;
    +  var obj = Object(object);
    +  for (var i = 0; i < length; i++) {
    +    var key = _keys[i];
    +    if (attrs[key] !== obj[key] || !(key in obj)) return false;
    +  }
    +  return true;
    +}
     
    -                // Convert an object into a list of `[key, value]` pairs.
    -                // The opposite of `_.object` with one argument.
    -                function pairs(obj) {
    -                    var _keys = keys(obj);
    -                    var length = _keys.length;
    -                    var pairs = Array(length);
    -                    for (var i = 0; i < length; i++) {
    -                        pairs[i] = [_keys[i], obj[_keys[i]]];
    -                    }
    -                    return pairs;
    -                }
    +// If Underscore is called as a function, it returns a wrapped object that can
    +// be used OO-style. This wrapper holds altered versions of all functions added
    +// through `_.mixin`. Wrapped objects may be chained.
    +function _$1(obj) {
    +  if (obj instanceof _$1) return obj;
    +  if (!(this instanceof _$1)) return new _$1(obj);
    +  this._wrapped = obj;
    +}
     
    -                // Invert the keys and values of an object. The values must be serializable.
    -                function invert(obj) {
    -                    var result = {};
    -                    var _keys = keys(obj);
    -                    for (var i = 0, length = _keys.length; i < length; i++) {
    -                        result[obj[_keys[i]]] = _keys[i];
    -                    }
    -                    return result;
    -                }
    +_$1.VERSION = VERSION;
     
    -                // Return a sorted list of the function names available on the object.
    -                function functions(obj) {
    -                    var names = [];
    -                    for (var key in obj) {
    -                        if (isFunction$1(obj[key])) names.push(key);
    -                    }
    -                    return names.sort();
    -                }
    +// Extracts the result from a wrapped and chained object.
    +_$1.prototype.value = function() {
    +  return this._wrapped;
    +};
     
    -                // An internal function for creating assigner functions.
    -                function createAssigner(keysFunc, defaults) {
    -                    return function (obj) {
    -                        var length = arguments.length;
    -                        if (defaults) obj = Object(obj);
    -                        if (length < 2 || obj == null) return obj;
    -                        for (var index = 1; index < length; index++) {
    -                            var source = arguments[index],
    -                                keys = keysFunc(source),
    -                                l = keys.length;
    -                            for (var i = 0; i < l; i++) {
    -                                var key = keys[i];
    -                                if (!defaults || obj[key] === void 0) obj[key] = source[key];
    -                            }
    -                        }
    -                        return obj;
    -                    };
    -                }
    +// Provide unwrapping proxies for some methods used in engine operations
    +// such as arithmetic and JSON stringification.
    +_$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;
     
    -                // Extend a given object with all the properties in passed-in object(s).
    -                var extend = createAssigner(allKeys);
    +_$1.prototype.toString = function() {
    +  return String(this._wrapped);
    +};
     
    -                // Assigns a given object with all the own properties in the passed-in
    -                // object(s).
    -                // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
    -                var extendOwn = createAssigner(keys);
    +// Internal function to wrap or shallow-copy an ArrayBuffer,
    +// typed array or DataView to a new view, reusing the buffer.
    +function toBufferView(bufferSource) {
    +  return new Uint8Array(
    +    bufferSource.buffer || bufferSource,
    +    bufferSource.byteOffset || 0,
    +    getByteLength(bufferSource)
    +  );
    +}
     
    -                // Fill in a given object with default properties.
    -                var defaults = createAssigner(allKeys, true);
    +// We use this string twice, so give it a name for minification.
    +var tagDataView = '[object DataView]';
    +
    +// Internal recursive comparison function for `_.isEqual`.
    +function eq(a, b, aStack, bStack) {
    +  // Identical objects are equal. `0 === -0`, but they aren't identical.
    +  // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
    +  if (a === b) return a !== 0 || 1 / a === 1 / b;
    +  // `null` or `undefined` only equal to itself (strict comparison).
    +  if (a == null || b == null) return false;
    +  // `NaN`s are equivalent, but non-reflexive.
    +  if (a !== a) return b !== b;
    +  // Exhaust primitive checks
    +  var type = typeof a;
    +  if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
    +  return deepEq(a, b, aStack, bStack);
    +}
     
    -                // Create a naked function reference for surrogate-prototype-swapping.
    -                function ctor() {
    -                    return function () { };
    -                }
    +// Internal recursive comparison function for `_.isEqual`.
    +function deepEq(a, b, aStack, bStack) {
    +  // Unwrap any wrapped objects.
    +  if (a instanceof _$1) a = a._wrapped;
    +  if (b instanceof _$1) b = b._wrapped;
    +  // Compare `[[Class]]` names.
    +  var className = toString.call(a);
    +  if (className !== toString.call(b)) return false;
    +  // Work around a bug in IE 10 - Edge 13.
    +  if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
    +    if (!isDataView$1(b)) return false;
    +    className = tagDataView;
    +  }
    +  switch (className) {
    +    // These types are compared by value.
    +    case '[object RegExp]':
    +      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
    +    case '[object String]':
    +      // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
    +      // equivalent to `new String("5")`.
    +      return '' + a === '' + b;
    +    case '[object Number]':
    +      // `NaN`s are equivalent, but non-reflexive.
    +      // Object(NaN) is equivalent to NaN.
    +      if (+a !== +a) return +b !== +b;
    +      // An `egal` comparison is performed for other numeric values.
    +      return +a === 0 ? 1 / +a === 1 / b : +a === +b;
    +    case '[object Date]':
    +    case '[object Boolean]':
    +      // Coerce dates and booleans to numeric primitive values. Dates are compared by their
    +      // millisecond representations. Note that invalid dates with millisecond representations
    +      // of `NaN` are not equivalent.
    +      return +a === +b;
    +    case '[object Symbol]':
    +      return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
    +    case '[object ArrayBuffer]':
    +    case tagDataView:
    +      // Coerce to typed array so we can fall through.
    +      return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
    +  }
    +
    +  var areArrays = className === '[object Array]';
    +  if (!areArrays && isTypedArray$1(a)) {
    +      var byteLength = getByteLength(a);
    +      if (byteLength !== getByteLength(b)) return false;
    +      if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
    +      areArrays = true;
    +  }
    +  if (!areArrays) {
    +    if (typeof a != 'object' || typeof b != 'object') return false;
    +
    +    // Objects with different constructors are not equivalent, but `Object`s or `Array`s
    +    // from different frames are.
    +    var aCtor = a.constructor, bCtor = b.constructor;
    +    if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
    +                             isFunction$1(bCtor) && bCtor instanceof bCtor)
    +                        && ('constructor' in a && 'constructor' in b)) {
    +      return false;
    +    }
    +  }
    +  // Assume equality for cyclic structures. The algorithm for detecting cyclic
    +  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
    +
    +  // Initializing stack of traversed objects.
    +  // It's done here since we only need them for objects and arrays comparison.
    +  aStack = aStack || [];
    +  bStack = bStack || [];
    +  var length = aStack.length;
    +  while (length--) {
    +    // Linear search. Performance is inversely proportional to the number of
    +    // unique nested structures.
    +    if (aStack[length] === a) return bStack[length] === b;
    +  }
    +
    +  // Add the first object to the stack of traversed objects.
    +  aStack.push(a);
    +  bStack.push(b);
    +
    +  // Recursively compare objects and arrays.
    +  if (areArrays) {
    +    // Compare array lengths to determine if a deep comparison is necessary.
    +    length = a.length;
    +    if (length !== b.length) return false;
    +    // Deep compare the contents, ignoring non-numeric properties.
    +    while (length--) {
    +      if (!eq(a[length], b[length], aStack, bStack)) return false;
    +    }
    +  } else {
    +    // Deep compare objects.
    +    var _keys = keys(a), key;
    +    length = _keys.length;
    +    // Ensure that both objects contain the same number of properties before comparing deep equality.
    +    if (keys(b).length !== length) return false;
    +    while (length--) {
    +      // Deep compare each member
    +      key = _keys[length];
    +      if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
    +    }
    +  }
    +  // Remove the first object from the stack of traversed objects.
    +  aStack.pop();
    +  bStack.pop();
    +  return true;
    +}
     
    -                // An internal function for creating a new object that inherits from another.
    -                function baseCreate(prototype) {
    -                    if (!isObject(prototype)) return {};
    -                    if (nativeCreate) return nativeCreate(prototype);
    -                    var Ctor = ctor();
    -                    Ctor.prototype = prototype;
    -                    var result = new Ctor;
    -                    Ctor.prototype = null;
    -                    return result;
    -                }
    +// Perform a deep comparison to check if two objects are equal.
    +function isEqual(a, b) {
    +  return eq(a, b);
    +}
     
    -                // Creates an object that inherits from the given prototype object.
    -                // If additional properties are provided then they will be added to the
    -                // created object.
    -                function create(prototype, props) {
    -                    var result = baseCreate(prototype);
    -                    if (props) extendOwn(result, props);
    -                    return result;
    -                }
    +// Retrieve all the enumerable property names of an object.
    +function allKeys(obj) {
    +  if (!isObject(obj)) return [];
    +  var keys = [];
    +  for (var key in obj) keys.push(key);
    +  // Ahem, IE < 9.
    +  if (hasEnumBug) collectNonEnumProps(obj, keys);
    +  return keys;
    +}
     
    -                // Create a (shallow-cloned) duplicate of an object.
    -                function clone(obj) {
    -                    if (!isObject(obj)) return obj;
    -                    return isArray(obj) ? obj.slice() : extend({}, obj);
    -                }
    +// Since the regular `Object.prototype.toString` type tests don't work for
    +// some types in IE 11, we use a fingerprinting heuristic instead, based
    +// on the methods. It's not great, but it's the best we got.
    +// The fingerprint method lists are defined below.
    +function ie11fingerprint(methods) {
    +  var length = getLength(methods);
    +  return function(obj) {
    +    if (obj == null) return false;
    +    // `Map`, `WeakMap` and `Set` have no enumerable keys.
    +    var keys = allKeys(obj);
    +    if (getLength(keys)) return false;
    +    for (var i = 0; i < length; i++) {
    +      if (!isFunction$1(obj[methods[i]])) return false;
    +    }
    +    // If we are testing against `WeakMap`, we need to ensure that
    +    // `obj` doesn't have a `forEach` method in order to distinguish
    +    // it from a regular `Map`.
    +    return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
    +  };
    +}
     
    -                // Invokes `interceptor` with the `obj` and then returns `obj`.
    -                // The primary purpose of this method is to "tap into" a method chain, in
    -                // order to perform operations on intermediate results within the chain.
    -                function tap(obj, interceptor) {
    -                    interceptor(obj);
    -                    return obj;
    -                }
    +// In the interest of compact minification, we write
    +// each string in the fingerprints only once.
    +var forEachName = 'forEach',
    +    hasName = 'has',
    +    commonInit = ['clear', 'delete'],
    +    mapTail = ['get', hasName, 'set'];
     
    -                // Normalize a (deep) property `path` to array.
    -                // Like `_.iteratee`, this function can be customized.
    -                function toPath$1(path) {
    -                    return isArray(path) ? path : [path];
    -                }
    -                _$1.toPath = toPath$1;
    +// `Map`, `WeakMap` and `Set` each have slightly different
    +// combinations of the above sublists.
    +var mapMethods = commonInit.concat(forEachName, mapTail),
    +    weakMapMethods = commonInit.concat(mapTail),
    +    setMethods = ['add'].concat(commonInit, forEachName, hasName);
     
    -                // Internal wrapper for `_.toPath` to enable minification.
    -                // Similar to `cb` for `_.iteratee`.
    -                function toPath(path) {
    -                    return _$1.toPath(path);
    -                }
    +var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
     
    -                // Internal function to obtain a nested property in `obj` along `path`.
    -                function deepGet(obj, path) {
    -                    var length = path.length;
    -                    for (var i = 0; i < length; i++) {
    -                        if (obj == null) return void 0;
    -                        obj = obj[path[i]];
    -                    }
    -                    return length ? obj : void 0;
    -                }
    +var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
     
    -                // Get the value of the (deep) property on `path` from `object`.
    -                // If any property in `path` does not exist or if the value is
    -                // `undefined`, return `defaultValue` instead.
    -                // The `path` is normalized through `_.toPath`.
    -                function get(object, path, defaultValue) {
    -                    var value = deepGet(object, toPath(path));
    -                    return isUndefined(value) ? defaultValue : value;
    -                }
    +var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
     
    -                // Shortcut function for checking if an object has a given property directly on
    -                // itself (in other words, not on a prototype). Unlike the internal `has`
    -                // function, this public version can also traverse nested properties.
    -                function has(obj, path) {
    -                    path = toPath(path);
    -                    var length = path.length;
    -                    for (var i = 0; i < length; i++) {
    -                        var key = path[i];
    -                        if (!has$1(obj, key)) return false;
    -                        obj = obj[key];
    -                    }
    -                    return !!length;
    -                }
    +var isWeakSet = tagTester('WeakSet');
     
    -                // Keep the identity function around for default iteratees.
    -                function identity(value) {
    -                    return value;
    -                }
    +// Retrieve the values of an object's properties.
    +function values(obj) {
    +  var _keys = keys(obj);
    +  var length = _keys.length;
    +  var values = Array(length);
    +  for (var i = 0; i < length; i++) {
    +    values[i] = obj[_keys[i]];
    +  }
    +  return values;
    +}
     
    -                // Returns a predicate for checking whether an object has a given set of
    -                // `key:value` pairs.
    -                function matcher(attrs) {
    -                    attrs = extendOwn({}, attrs);
    -                    return function (obj) {
    -                        return isMatch(obj, attrs);
    -                    };
    -                }
    +// Convert an object into a list of `[key, value]` pairs.
    +// The opposite of `_.object` with one argument.
    +function pairs(obj) {
    +  var _keys = keys(obj);
    +  var length = _keys.length;
    +  var pairs = Array(length);
    +  for (var i = 0; i < length; i++) {
    +    pairs[i] = [_keys[i], obj[_keys[i]]];
    +  }
    +  return pairs;
    +}
     
    -                // Creates a function that, when passed an object, will traverse that object’s
    -                // properties down the given `path`, specified as an array of keys or indices.
    -                function property(path) {
    -                    path = toPath(path);
    -                    return function (obj) {
    -                        return deepGet(obj, path);
    -                    };
    -                }
    +// Invert the keys and values of an object. The values must be serializable.
    +function invert(obj) {
    +  var result = {};
    +  var _keys = keys(obj);
    +  for (var i = 0, length = _keys.length; i < length; i++) {
    +    result[obj[_keys[i]]] = _keys[i];
    +  }
    +  return result;
    +}
     
    -                // Internal function that returns an efficient (for current engines) version
    -                // of the passed-in callback, to be repeatedly applied in other Underscore
    -                // functions.
    -                function optimizeCb(func, context, argCount) {
    -                    if (context === void 0) return func;
    -                    switch (argCount == null ? 3 : argCount) {
    -                        case 1: return function (value) {
    -                            return func.call(context, value);
    -                        };
    -                        // The 2-argument case is omitted because we’re not using it.
    -                        case 3: return function (value, index, collection) {
    -                            return func.call(context, value, index, collection);
    -                        };
    -                        case 4: return function (accumulator, value, index, collection) {
    -                            return func.call(context, accumulator, value, index, collection);
    -                        };
    -                    }
    -                    return function () {
    -                        return func.apply(context, arguments);
    -                    };
    -                }
    +// Return a sorted list of the function names available on the object.
    +function functions(obj) {
    +  var names = [];
    +  for (var key in obj) {
    +    if (isFunction$1(obj[key])) names.push(key);
    +  }
    +  return names.sort();
    +}
     
    -                // An internal function to generate callbacks that can be applied to each
    -                // element in a collection, returning the desired result — either `_.identity`,
    -                // an arbitrary callback, a property matcher, or a property accessor.
    -                function baseIteratee(value, context, argCount) {
    -                    if (value == null) return identity;
    -                    if (isFunction$1(value)) return optimizeCb(value, context, argCount);
    -                    if (isObject(value) && !isArray(value)) return matcher(value);
    -                    return property(value);
    -                }
    +// An internal function for creating assigner functions.
    +function createAssigner(keysFunc, defaults) {
    +  return function(obj) {
    +    var length = arguments.length;
    +    if (defaults) obj = Object(obj);
    +    if (length < 2 || obj == null) return obj;
    +    for (var index = 1; index < length; index++) {
    +      var source = arguments[index],
    +          keys = keysFunc(source),
    +          l = keys.length;
    +      for (var i = 0; i < l; i++) {
    +        var key = keys[i];
    +        if (!defaults || obj[key] === void 0) obj[key] = source[key];
    +      }
    +    }
    +    return obj;
    +  };
    +}
     
    -                // External wrapper for our callback generator. Users may customize
    -                // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
    -                // This abstraction hides the internal-only `argCount` argument.
    -                function iteratee(value, context) {
    -                    return baseIteratee(value, context, Infinity);
    -                }
    -                _$1.iteratee = iteratee;
    +// Extend a given object with all the properties in passed-in object(s).
    +var extend = createAssigner(allKeys);
     
    -                // The function we call internally to generate a callback. It invokes
    -                // `_.iteratee` if overridden, otherwise `baseIteratee`.
    -                function cb(value, context, argCount) {
    -                    if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);
    -                    return baseIteratee(value, context, argCount);
    -                }
    +// Assigns a given object with all the own properties in the passed-in
    +// object(s).
    +// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
    +var extendOwn = createAssigner(keys);
     
    -                // Returns the results of applying the `iteratee` to each element of `obj`.
    -                // In contrast to `_.map` it returns an object.
    -                function mapObject(obj, iteratee, context) {
    -                    iteratee = cb(iteratee, context);
    -                    var _keys = keys(obj),
    -                        length = _keys.length,
    -                        results = {};
    -                    for (var index = 0; index < length; index++) {
    -                        var currentKey = _keys[index];
    -                        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
    -                    }
    -                    return results;
    -                }
    +// Fill in a given object with default properties.
    +var defaults = createAssigner(allKeys, true);
     
    -                // Predicate-generating function. Often useful outside of Underscore.
    -                function noop() { }
    +// Create a naked function reference for surrogate-prototype-swapping.
    +function ctor() {
    +  return function(){};
    +}
     
    -                // Generates a function for a given object that returns a given property.
    -                function propertyOf(obj) {
    -                    if (obj == null) return noop;
    -                    return function (path) {
    -                        return get(obj, path);
    -                    };
    -                }
    +// An internal function for creating a new object that inherits from another.
    +function baseCreate(prototype) {
    +  if (!isObject(prototype)) return {};
    +  if (nativeCreate) return nativeCreate(prototype);
    +  var Ctor = ctor();
    +  Ctor.prototype = prototype;
    +  var result = new Ctor;
    +  Ctor.prototype = null;
    +  return result;
    +}
     
    -                // Run a function **n** times.
    -                function times(n, iteratee, context) {
    -                    var accum = Array(Math.max(0, n));
    -                    iteratee = optimizeCb(iteratee, context, 1);
    -                    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
    -                    return accum;
    -                }
    +// Creates an object that inherits from the given prototype object.
    +// If additional properties are provided then they will be added to the
    +// created object.
    +function create(prototype, props) {
    +  var result = baseCreate(prototype);
    +  if (props) extendOwn(result, props);
    +  return result;
    +}
     
    -                // Return a random integer between `min` and `max` (inclusive).
    -                function random(min, max) {
    -                    if (max == null) {
    -                        max = min;
    -                        min = 0;
    -                    }
    -                    return min + Math.floor(Math.random() * (max - min + 1));
    -                }
    +// Create a (shallow-cloned) duplicate of an object.
    +function clone(obj) {
    +  if (!isObject(obj)) return obj;
    +  return isArray(obj) ? obj.slice() : extend({}, obj);
    +}
     
    -                // A (possibly faster) way to get the current timestamp as an integer.
    -                var now = Date.now || function () {
    -                    return new Date().getTime();
    -                };
    +// Invokes `interceptor` with the `obj` and then returns `obj`.
    +// The primary purpose of this method is to "tap into" a method chain, in
    +// order to perform operations on intermediate results within the chain.
    +function tap(obj, interceptor) {
    +  interceptor(obj);
    +  return obj;
    +}
     
    -                // Internal helper to generate functions for escaping and unescaping strings
    -                // to/from HTML interpolation.
    -                function createEscaper(map) {
    -                    var escaper = function (match) {
    -                        return map[match];
    -                    };
    -                    // Regexes for identifying a key that needs to be escaped.
    -                    var source = '(?:' + keys(map).join('|') + ')';
    -                    var testRegexp = RegExp(source);
    -                    var replaceRegexp = RegExp(source, 'g');
    -                    return function (string) {
    -                        string = string == null ? '' : '' + string;
    -                        return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
    -                    };
    -                }
    +// Normalize a (deep) property `path` to array.
    +// Like `_.iteratee`, this function can be customized.
    +function toPath$1(path) {
    +  return isArray(path) ? path : [path];
    +}
    +_$1.toPath = toPath$1;
     
    -                // Internal list of HTML entities for escaping.
    -                var escapeMap = {
    -                    '&': '&',
    -                    '<': '<',
    -                    '>': '>',
    -                    '"': '"',
    -                    "'": ''',
    -                    '`': '`'
    -                };
    +// Internal wrapper for `_.toPath` to enable minification.
    +// Similar to `cb` for `_.iteratee`.
    +function toPath(path) {
    +  return _$1.toPath(path);
    +}
     
    -                // Function for escaping strings to HTML interpolation.
    -                var _escape = createEscaper(escapeMap);
    +// Internal function to obtain a nested property in `obj` along `path`.
    +function deepGet(obj, path) {
    +  var length = path.length;
    +  for (var i = 0; i < length; i++) {
    +    if (obj == null) return void 0;
    +    obj = obj[path[i]];
    +  }
    +  return length ? obj : void 0;
    +}
     
    -                // Internal list of HTML entities for unescaping.
    -                var unescapeMap = invert(escapeMap);
    +// Get the value of the (deep) property on `path` from `object`.
    +// If any property in `path` does not exist or if the value is
    +// `undefined`, return `defaultValue` instead.
    +// The `path` is normalized through `_.toPath`.
    +function get(object, path, defaultValue) {
    +  var value = deepGet(object, toPath(path));
    +  return isUndefined(value) ? defaultValue : value;
    +}
     
    -                // Function for unescaping strings from HTML interpolation.
    -                var _unescape = createEscaper(unescapeMap);
    +// Shortcut function for checking if an object has a given property directly on
    +// itself (in other words, not on a prototype). Unlike the internal `has`
    +// function, this public version can also traverse nested properties.
    +function has(obj, path) {
    +  path = toPath(path);
    +  var length = path.length;
    +  for (var i = 0; i < length; i++) {
    +    var key = path[i];
    +    if (!has$1(obj, key)) return false;
    +    obj = obj[key];
    +  }
    +  return !!length;
    +}
     
    -                // By default, Underscore uses ERB-style template delimiters. Change the
    -                // following template settings to use alternative delimiters.
    -                var templateSettings = _$1.templateSettings = {
    -                    evaluate: /<%([\s\S]+?)%>/g,
    -                    interpolate: /<%=([\s\S]+?)%>/g,
    -                    escape: /<%-([\s\S]+?)%>/g
    -                };
    +// Keep the identity function around for default iteratees.
    +function identity(value) {
    +  return value;
    +}
     
    -                // When customizing `_.templateSettings`, if you don't want to define an
    -                // interpolation, evaluation or escaping regex, we need one that is
    -                // guaranteed not to match.
    -                var noMatch = /(.)^/;
    -
    -                // Certain characters need to be escaped so that they can be put into a
    -                // string literal.
    -                var escapes = {
    -                    "'": "'",
    -                    '\\': '\\',
    -                    '\r': 'r',
    -                    '\n': 'n',
    -                    '\u2028': 'u2028',
    -                    '\u2029': 'u2029'
    -                };
    +// Returns a predicate for checking whether an object has a given set of
    +// `key:value` pairs.
    +function matcher(attrs) {
    +  attrs = extendOwn({}, attrs);
    +  return function(obj) {
    +    return isMatch(obj, attrs);
    +  };
    +}
     
    -                var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
    +// Creates a function that, when passed an object, will traverse that object’s
    +// properties down the given `path`, specified as an array of keys or indices.
    +function property(path) {
    +  path = toPath(path);
    +  return function(obj) {
    +    return deepGet(obj, path);
    +  };
    +}
     
    -                function escapeChar(match) {
    -                    return '\\' + escapes[match];
    -                }
    +// Internal function that returns an efficient (for current engines) version
    +// of the passed-in callback, to be repeatedly applied in other Underscore
    +// functions.
    +function optimizeCb(func, context, argCount) {
    +  if (context === void 0) return func;
    +  switch (argCount == null ? 3 : argCount) {
    +    case 1: return function(value) {
    +      return func.call(context, value);
    +    };
    +    // The 2-argument case is omitted because we’re not using it.
    +    case 3: return function(value, index, collection) {
    +      return func.call(context, value, index, collection);
    +    };
    +    case 4: return function(accumulator, value, index, collection) {
    +      return func.call(context, accumulator, value, index, collection);
    +    };
    +  }
    +  return function() {
    +    return func.apply(context, arguments);
    +  };
    +}
     
    -                // In order to prevent third-party code injection through
    -                // `_.templateSettings.variable`, we test it against the following regular
    -                // expression. It is intentionally a bit more liberal than just matching valid
    -                // identifiers, but still prevents possible loopholes through defaults or
    -                // destructuring assignment.
    -                var bareIdentifier = /^\s*(\w|\$)+\s*$/;
    -
    -                // JavaScript micro-templating, similar to John Resig's implementation.
    -                // Underscore templating handles arbitrary delimiters, preserves whitespace,
    -                // and correctly escapes quotes within interpolated code.
    -                // NB: `oldSettings` only exists for backwards compatibility.
    -                function template(text, settings, oldSettings) {
    -                    if (!settings && oldSettings) settings = oldSettings;
    -                    settings = defaults({}, settings, _$1.templateSettings);
    -
    -                    // Combine delimiters into one regular expression via alternation.
    -                    var matcher = RegExp([
    -                        (settings.escape || noMatch).source,
    -                        (settings.interpolate || noMatch).source,
    -                        (settings.evaluate || noMatch).source
    -                    ].join('|') + '|$', 'g');
    -
    -                    // Compile the template source, escaping string literals appropriately.
    -                    var index = 0;
    -                    var source = "__p+='";
    -                    text.replace(matcher, function (match, escape, interpolate, evaluate, offset) {
    -                        source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
    -                        index = offset + match.length;
    -
    -                        if (escape) {
    -                            source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
    -                        } else if (interpolate) {
    -                            source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
    -                        } else if (evaluate) {
    -                            source += "';\n" + evaluate + "\n__p+='";
    -                        }
    +// An internal function to generate callbacks that can be applied to each
    +// element in a collection, returning the desired result — either `_.identity`,
    +// an arbitrary callback, a property matcher, or a property accessor.
    +function baseIteratee(value, context, argCount) {
    +  if (value == null) return identity;
    +  if (isFunction$1(value)) return optimizeCb(value, context, argCount);
    +  if (isObject(value) && !isArray(value)) return matcher(value);
    +  return property(value);
    +}
     
    -                        // Adobe VMs need the match returned to produce the correct offset.
    -                        return match;
    -                    });
    -                    source += "';\n";
    -
    -                    var argument = settings.variable;
    -                    if (argument) {
    -                        // Insure against third-party code injection. (CVE-2021-23358)
    -                        if (!bareIdentifier.test(argument)) throw new Error(
    -                            'variable is not a bare identifier: ' + argument
    -                        );
    -                    } else {
    -                        // If a variable is not specified, place data values in local scope.
    -                        source = 'with(obj||{}){\n' + source + '}\n';
    -                        argument = 'obj';
    -                    }
    +// External wrapper for our callback generator. Users may customize
    +// `_.iteratee` if they want additional predicate/iteratee shorthand styles.
    +// This abstraction hides the internal-only `argCount` argument.
    +function iteratee(value, context) {
    +  return baseIteratee(value, context, Infinity);
    +}
    +_$1.iteratee = iteratee;
     
    -                    source = "var __t,__p='',__j=Array.prototype.join," +
    -                        "print=function(){__p+=__j.call(arguments,'');};\n" +
    -                        source + 'return __p;\n';
    +// The function we call internally to generate a callback. It invokes
    +// `_.iteratee` if overridden, otherwise `baseIteratee`.
    +function cb(value, context, argCount) {
    +  if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);
    +  return baseIteratee(value, context, argCount);
    +}
     
    -                    var render;
    -                    try {
    -                        render = new Function(argument, '_', source);
    -                    } catch (e) {
    -                        e.source = source;
    -                        throw e;
    -                    }
    +// Returns the results of applying the `iteratee` to each element of `obj`.
    +// In contrast to `_.map` it returns an object.
    +function mapObject(obj, iteratee, context) {
    +  iteratee = cb(iteratee, context);
    +  var _keys = keys(obj),
    +      length = _keys.length,
    +      results = {};
    +  for (var index = 0; index < length; index++) {
    +    var currentKey = _keys[index];
    +    results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
    +  }
    +  return results;
    +}
     
    -                    var template = function (data) {
    -                        return render.call(this, data, _$1);
    -                    };
    +// Predicate-generating function. Often useful outside of Underscore.
    +function noop(){}
     
    -                    // Provide the compiled source as a convenience for precompilation.
    -                    template.source = 'function(' + argument + '){\n' + source + '}';
    +// Generates a function for a given object that returns a given property.
    +function propertyOf(obj) {
    +  if (obj == null) return noop;
    +  return function(path) {
    +    return get(obj, path);
    +  };
    +}
     
    -                    return template;
    -                }
    +// Run a function **n** times.
    +function times(n, iteratee, context) {
    +  var accum = Array(Math.max(0, n));
    +  iteratee = optimizeCb(iteratee, context, 1);
    +  for (var i = 0; i < n; i++) accum[i] = iteratee(i);
    +  return accum;
    +}
     
    -                // Traverses the children of `obj` along `path`. If a child is a function, it
    -                // is invoked with its parent as context. Returns the value of the final
    -                // child, or `fallback` if any child is undefined.
    -                function result(obj, path, fallback) {
    -                    path = toPath(path);
    -                    var length = path.length;
    -                    if (!length) {
    -                        return isFunction$1(fallback) ? fallback.call(obj) : fallback;
    -                    }
    -                    for (var i = 0; i < length; i++) {
    -                        var prop = obj == null ? void 0 : obj[path[i]];
    -                        if (prop === void 0) {
    -                            prop = fallback;
    -                            i = length; // Ensure we don't continue iterating.
    -                        }
    -                        obj = isFunction$1(prop) ? prop.call(obj) : prop;
    -                    }
    -                    return obj;
    -                }
    +// Return a random integer between `min` and `max` (inclusive).
    +function random(min, max) {
    +  if (max == null) {
    +    max = min;
    +    min = 0;
    +  }
    +  return min + Math.floor(Math.random() * (max - min + 1));
    +}
     
    -                // Generate a unique integer id (unique within the entire client session).
    -                // Useful for temporary DOM ids.
    -                var idCounter = 0;
    -                function uniqueId(prefix) {
    -                    var id = ++idCounter + '';
    -                    return prefix ? prefix + id : id;
    -                }
    +// A (possibly faster) way to get the current timestamp as an integer.
    +var now = Date.now || function() {
    +  return new Date().getTime();
    +};
     
    -                // Start chaining a wrapped Underscore object.
    -                function chain(obj) {
    -                    var instance = _$1(obj);
    -                    instance._chain = true;
    -                    return instance;
    -                }
    +// Internal helper to generate functions for escaping and unescaping strings
    +// to/from HTML interpolation.
    +function createEscaper(map) {
    +  var escaper = function(match) {
    +    return map[match];
    +  };
    +  // Regexes for identifying a key that needs to be escaped.
    +  var source = '(?:' + keys(map).join('|') + ')';
    +  var testRegexp = RegExp(source);
    +  var replaceRegexp = RegExp(source, 'g');
    +  return function(string) {
    +    string = string == null ? '' : '' + string;
    +    return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
    +  };
    +}
     
    -                // Internal function to execute `sourceFunc` bound to `context` with optional
    -                // `args`. Determines whether to execute a function as a constructor or as a
    -                // normal function.
    -                function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
    -                    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
    -                    var self = baseCreate(sourceFunc.prototype);
    -                    var result = sourceFunc.apply(self, args);
    -                    if (isObject(result)) return result;
    -                    return self;
    -                }
    +// Internal list of HTML entities for escaping.
    +var escapeMap = {
    +  '&': '&',
    +  '<': '<',
    +  '>': '>',
    +  '"': '"',
    +  "'": ''',
    +  '`': '`'
    +};
     
    -                // Partially apply a function by creating a version that has had some of its
    -                // arguments pre-filled, without changing its dynamic `this` context. `_` acts
    -                // as a placeholder by default, allowing any combination of arguments to be
    -                // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
    -                var partial = restArguments(function (func, boundArgs) {
    -                    var placeholder = partial.placeholder;
    -                    var bound = function () {
    -                        var position = 0, length = boundArgs.length;
    -                        var args = Array(length);
    -                        for (var i = 0; i < length; i++) {
    -                            args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
    -                        }
    -                        while (position < arguments.length) args.push(arguments[position++]);
    -                        return executeBound(func, bound, this, this, args);
    -                    };
    -                    return bound;
    -                });
    +// Function for escaping strings to HTML interpolation.
    +var _escape = createEscaper(escapeMap);
     
    -                partial.placeholder = _$1;
    +// Internal list of HTML entities for unescaping.
    +var unescapeMap = invert(escapeMap);
     
    -                // Create a function bound to a given object (assigning `this`, and arguments,
    -                // optionally).
    -                var bind = restArguments(function (func, context, args) {
    -                    if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
    -                    var bound = restArguments(function (callArgs) {
    -                        return executeBound(func, bound, context, this, args.concat(callArgs));
    -                    });
    -                    return bound;
    -                });
    +// Function for unescaping strings from HTML interpolation.
    +var _unescape = createEscaper(unescapeMap);
     
    -                // Internal helper for collection methods to determine whether a collection
    -                // should be iterated as an array or as an object.
    -                // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
    -                // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
    -                var isArrayLike = createSizePropertyCheck(getLength);
    -
    -                // Internal implementation of a recursive `flatten` function.
    -                function flatten$1(input, depth, strict, output) {
    -                    output = output || [];
    -                    if (!depth && depth !== 0) {
    -                        depth = Infinity;
    -                    } else if (depth <= 0) {
    -                        return output.concat(input);
    -                    }
    -                    var idx = output.length;
    -                    for (var i = 0, length = getLength(input); i < length; i++) {
    -                        var value = input[i];
    -                        if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
    -                            // Flatten current level of array or arguments object.
    -                            if (depth > 1) {
    -                                flatten$1(value, depth - 1, strict, output);
    -                                idx = output.length;
    -                            } else {
    -                                var j = 0, len = value.length;
    -                                while (j < len) output[idx++] = value[j++];
    -                            }
    -                        } else if (!strict) {
    -                            output[idx++] = value;
    -                        }
    -                    }
    -                    return output;
    -                }
    +// By default, Underscore uses ERB-style template delimiters. Change the
    +// following template settings to use alternative delimiters.
    +var templateSettings = _$1.templateSettings = {
    +  evaluate: /<%([\s\S]+?)%>/g,
    +  interpolate: /<%=([\s\S]+?)%>/g,
    +  escape: /<%-([\s\S]+?)%>/g
    +};
     
    -                // Bind a number of an object's methods to that object. Remaining arguments
    -                // are the method names to be bound. Useful for ensuring that all callbacks
    -                // defined on an object belong to it.
    -                var bindAll = restArguments(function (obj, keys) {
    -                    keys = flatten$1(keys, false, false);
    -                    var index = keys.length;
    -                    if (index < 1) throw new Error('bindAll must be passed function names');
    -                    while (index--) {
    -                        var key = keys[index];
    -                        obj[key] = bind(obj[key], obj);
    -                    }
    -                    return obj;
    -                });
    +// When customizing `_.templateSettings`, if you don't want to define an
    +// interpolation, evaluation or escaping regex, we need one that is
    +// guaranteed not to match.
    +var noMatch = /(.)^/;
    +
    +// Certain characters need to be escaped so that they can be put into a
    +// string literal.
    +var escapes = {
    +  "'": "'",
    +  '\\': '\\',
    +  '\r': 'r',
    +  '\n': 'n',
    +  '\u2028': 'u2028',
    +  '\u2029': 'u2029'
    +};
     
    -                // Memoize an expensive function by storing its results.
    -                function memoize(func, hasher) {
    -                    var memoize = function (key) {
    -                        var cache = memoize.cache;
    -                        var address = '' + (hasher ? hasher.apply(this, arguments) : key);
    -                        if (!has$1(cache, address)) cache[address] = func.apply(this, arguments);
    -                        return cache[address];
    -                    };
    -                    memoize.cache = {};
    -                    return memoize;
    -                }
    +var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
     
    -                // Delays a function for the given number of milliseconds, and then calls
    -                // it with the arguments supplied.
    -                var delay = restArguments(function (func, wait, args) {
    -                    return setTimeout(function () {
    -                        return func.apply(null, args);
    -                    }, wait);
    -                });
    +function escapeChar(match) {
    +  return '\\' + escapes[match];
    +}
     
    -                // Defers a function, scheduling it to run after the current call stack has
    -                // cleared.
    -                var defer = partial(delay, _$1, 1);
    -
    -                // Returns a function, that, when invoked, will only be triggered at most once
    -                // during a given window of time. Normally, the throttled function will run
    -                // as much as it can, without ever going more than once per `wait` duration;
    -                // but if you'd like to disable the execution on the leading edge, pass
    -                // `{leading: false}`. To disable execution on the trailing edge, ditto.
    -                function throttle(func, wait, options) {
    -                    var timeout, context, args, result;
    -                    var previous = 0;
    -                    if (!options) options = {};
    -
    -                    var later = function () {
    -                        previous = options.leading === false ? 0 : now();
    -                        timeout = null;
    -                        result = func.apply(context, args);
    -                        if (!timeout) context = args = null;
    -                    };
    +// In order to prevent third-party code injection through
    +// `_.templateSettings.variable`, we test it against the following regular
    +// expression. It is intentionally a bit more liberal than just matching valid
    +// identifiers, but still prevents possible loopholes through defaults or
    +// destructuring assignment.
    +var bareIdentifier = /^\s*(\w|\$)+\s*$/;
    +
    +// JavaScript micro-templating, similar to John Resig's implementation.
    +// Underscore templating handles arbitrary delimiters, preserves whitespace,
    +// and correctly escapes quotes within interpolated code.
    +// NB: `oldSettings` only exists for backwards compatibility.
    +function template(text, settings, oldSettings) {
    +  if (!settings && oldSettings) settings = oldSettings;
    +  settings = defaults({}, settings, _$1.templateSettings);
    +
    +  // Combine delimiters into one regular expression via alternation.
    +  var matcher = RegExp([
    +    (settings.escape || noMatch).source,
    +    (settings.interpolate || noMatch).source,
    +    (settings.evaluate || noMatch).source
    +  ].join('|') + '|$', 'g');
    +
    +  // Compile the template source, escaping string literals appropriately.
    +  var index = 0;
    +  var source = "__p+='";
    +  text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
    +    source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
    +    index = offset + match.length;
    +
    +    if (escape) {
    +      source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
    +    } else if (interpolate) {
    +      source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
    +    } else if (evaluate) {
    +      source += "';\n" + evaluate + "\n__p+='";
    +    }
    +
    +    // Adobe VMs need the match returned to produce the correct offset.
    +    return match;
    +  });
    +  source += "';\n";
    +
    +  var argument = settings.variable;
    +  if (argument) {
    +    // Insure against third-party code injection. (CVE-2021-23358)
    +    if (!bareIdentifier.test(argument)) throw new Error(
    +      'variable is not a bare identifier: ' + argument
    +    );
    +  } else {
    +    // If a variable is not specified, place data values in local scope.
    +    source = 'with(obj||{}){\n' + source + '}\n';
    +    argument = 'obj';
    +  }
    +
    +  source = "var __t,__p='',__j=Array.prototype.join," +
    +    "print=function(){__p+=__j.call(arguments,'');};\n" +
    +    source + 'return __p;\n';
    +
    +  var render;
    +  try {
    +    render = new Function(argument, '_', source);
    +  } catch (e) {
    +    e.source = source;
    +    throw e;
    +  }
    +
    +  var template = function(data) {
    +    return render.call(this, data, _$1);
    +  };
    +
    +  // Provide the compiled source as a convenience for precompilation.
    +  template.source = 'function(' + argument + '){\n' + source + '}';
    +
    +  return template;
    +}
     
    -                    var throttled = function () {
    -                        var _now = now();
    -                        if (!previous && options.leading === false) previous = _now;
    -                        var remaining = wait - (_now - previous);
    -                        context = this;
    -                        args = arguments;
    -                        if (remaining <= 0 || remaining > wait) {
    -                            if (timeout) {
    -                                clearTimeout(timeout);
    -                                timeout = null;
    -                            }
    -                            previous = _now;
    -                            result = func.apply(context, args);
    -                            if (!timeout) context = args = null;
    -                        } else if (!timeout && options.trailing !== false) {
    -                            timeout = setTimeout(later, remaining);
    -                        }
    -                        return result;
    -                    };
    +// Traverses the children of `obj` along `path`. If a child is a function, it
    +// is invoked with its parent as context. Returns the value of the final
    +// child, or `fallback` if any child is undefined.
    +function result(obj, path, fallback) {
    +  path = toPath(path);
    +  var length = path.length;
    +  if (!length) {
    +    return isFunction$1(fallback) ? fallback.call(obj) : fallback;
    +  }
    +  for (var i = 0; i < length; i++) {
    +    var prop = obj == null ? void 0 : obj[path[i]];
    +    if (prop === void 0) {
    +      prop = fallback;
    +      i = length; // Ensure we don't continue iterating.
    +    }
    +    obj = isFunction$1(prop) ? prop.call(obj) : prop;
    +  }
    +  return obj;
    +}
     
    -                    throttled.cancel = function () {
    -                        clearTimeout(timeout);
    -                        previous = 0;
    -                        timeout = context = args = null;
    -                    };
    +// Generate a unique integer id (unique within the entire client session).
    +// Useful for temporary DOM ids.
    +var idCounter = 0;
    +function uniqueId(prefix) {
    +  var id = ++idCounter + '';
    +  return prefix ? prefix + id : id;
    +}
     
    -                    return throttled;
    -                }
    +// Start chaining a wrapped Underscore object.
    +function chain(obj) {
    +  var instance = _$1(obj);
    +  instance._chain = true;
    +  return instance;
    +}
     
    -                // When a sequence of calls of the returned function ends, the argument
    -                // function is triggered. The end of a sequence is defined by the `wait`
    -                // parameter. If `immediate` is passed, the argument function will be
    -                // triggered at the beginning of the sequence instead of at the end.
    -                function debounce(func, wait, immediate) {
    -                    var timeout, previous, args, result, context;
    -
    -                    var later = function () {
    -                        var passed = now() - previous;
    -                        if (wait > passed) {
    -                            timeout = setTimeout(later, wait - passed);
    -                        } else {
    -                            timeout = null;
    -                            if (!immediate) result = func.apply(context, args);
    -                            // This check is needed because `func` can recursively invoke `debounced`.
    -                            if (!timeout) args = context = null;
    -                        }
    -                    };
    +// Internal function to execute `sourceFunc` bound to `context` with optional
    +// `args`. Determines whether to execute a function as a constructor or as a
    +// normal function.
    +function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
    +  if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
    +  var self = baseCreate(sourceFunc.prototype);
    +  var result = sourceFunc.apply(self, args);
    +  if (isObject(result)) return result;
    +  return self;
    +}
     
    -                    var debounced = restArguments(function (_args) {
    -                        context = this;
    -                        args = _args;
    -                        previous = now();
    -                        if (!timeout) {
    -                            timeout = setTimeout(later, wait);
    -                            if (immediate) result = func.apply(context, args);
    -                        }
    -                        return result;
    -                    });
    +// Partially apply a function by creating a version that has had some of its
    +// arguments pre-filled, without changing its dynamic `this` context. `_` acts
    +// as a placeholder by default, allowing any combination of arguments to be
    +// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
    +var partial = restArguments(function(func, boundArgs) {
    +  var placeholder = partial.placeholder;
    +  var bound = function() {
    +    var position = 0, length = boundArgs.length;
    +    var args = Array(length);
    +    for (var i = 0; i < length; i++) {
    +      args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
    +    }
    +    while (position < arguments.length) args.push(arguments[position++]);
    +    return executeBound(func, bound, this, this, args);
    +  };
    +  return bound;
    +});
     
    -                    debounced.cancel = function () {
    -                        clearTimeout(timeout);
    -                        timeout = args = context = null;
    -                    };
    +partial.placeholder = _$1;
     
    -                    return debounced;
    -                }
    +// Create a function bound to a given object (assigning `this`, and arguments,
    +// optionally).
    +var bind = restArguments(function(func, context, args) {
    +  if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
    +  var bound = restArguments(function(callArgs) {
    +    return executeBound(func, bound, context, this, args.concat(callArgs));
    +  });
    +  return bound;
    +});
     
    -                // Returns the first function passed as an argument to the second,
    -                // allowing you to adjust arguments, run code before and after, and
    -                // conditionally execute the original function.
    -                function wrap(func, wrapper) {
    -                    return partial(wrapper, func);
    -                }
    +// Internal helper for collection methods to determine whether a collection
    +// should be iterated as an array or as an object.
    +// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
    +// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
    +var isArrayLike = createSizePropertyCheck(getLength);
    +
    +// Internal implementation of a recursive `flatten` function.
    +function flatten$1(input, depth, strict, output) {
    +  output = output || [];
    +  if (!depth && depth !== 0) {
    +    depth = Infinity;
    +  } else if (depth <= 0) {
    +    return output.concat(input);
    +  }
    +  var idx = output.length;
    +  for (var i = 0, length = getLength(input); i < length; i++) {
    +    var value = input[i];
    +    if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
    +      // Flatten current level of array or arguments object.
    +      if (depth > 1) {
    +        flatten$1(value, depth - 1, strict, output);
    +        idx = output.length;
    +      } else {
    +        var j = 0, len = value.length;
    +        while (j < len) output[idx++] = value[j++];
    +      }
    +    } else if (!strict) {
    +      output[idx++] = value;
    +    }
    +  }
    +  return output;
    +}
     
    -                // Returns a negated version of the passed-in predicate.
    -                function negate(predicate) {
    -                    return function () {
    -                        return !predicate.apply(this, arguments);
    -                    };
    -                }
    +// Bind a number of an object's methods to that object. Remaining arguments
    +// are the method names to be bound. Useful for ensuring that all callbacks
    +// defined on an object belong to it.
    +var bindAll = restArguments(function(obj, keys) {
    +  keys = flatten$1(keys, false, false);
    +  var index = keys.length;
    +  if (index < 1) throw new Error('bindAll must be passed function names');
    +  while (index--) {
    +    var key = keys[index];
    +    obj[key] = bind(obj[key], obj);
    +  }
    +  return obj;
    +});
     
    -                // Returns a function that is the composition of a list of functions, each
    -                // consuming the return value of the function that follows.
    -                function compose() {
    -                    var args = arguments;
    -                    var start = args.length - 1;
    -                    return function () {
    -                        var i = start;
    -                        var result = args[start].apply(this, arguments);
    -                        while (i--) result = args[i].call(this, result);
    -                        return result;
    -                    };
    -                }
    +// Memoize an expensive function by storing its results.
    +function memoize(func, hasher) {
    +  var memoize = function(key) {
    +    var cache = memoize.cache;
    +    var address = '' + (hasher ? hasher.apply(this, arguments) : key);
    +    if (!has$1(cache, address)) cache[address] = func.apply(this, arguments);
    +    return cache[address];
    +  };
    +  memoize.cache = {};
    +  return memoize;
    +}
     
    -                // Returns a function that will only be executed on and after the Nth call.
    -                function after(times, func) {
    -                    return function () {
    -                        if (--times < 1) {
    -                            return func.apply(this, arguments);
    -                        }
    -                    };
    -                }
    +// Delays a function for the given number of milliseconds, and then calls
    +// it with the arguments supplied.
    +var delay = restArguments(function(func, wait, args) {
    +  return setTimeout(function() {
    +    return func.apply(null, args);
    +  }, wait);
    +});
     
    -                // Returns a function that will only be executed up to (but not including) the
    -                // Nth call.
    -                function before(times, func) {
    -                    var memo;
    -                    return function () {
    -                        if (--times > 0) {
    -                            memo = func.apply(this, arguments);
    -                        }
    -                        if (times <= 1) func = null;
    -                        return memo;
    -                    };
    -                }
    +// Defers a function, scheduling it to run after the current call stack has
    +// cleared.
    +var defer = partial(delay, _$1, 1);
    +
    +// Returns a function, that, when invoked, will only be triggered at most once
    +// during a given window of time. Normally, the throttled function will run
    +// as much as it can, without ever going more than once per `wait` duration;
    +// but if you'd like to disable the execution on the leading edge, pass
    +// `{leading: false}`. To disable execution on the trailing edge, ditto.
    +function throttle(func, wait, options) {
    +  var timeout, context, args, result;
    +  var previous = 0;
    +  if (!options) options = {};
    +
    +  var later = function() {
    +    previous = options.leading === false ? 0 : now();
    +    timeout = null;
    +    result = func.apply(context, args);
    +    if (!timeout) context = args = null;
    +  };
    +
    +  var throttled = function() {
    +    var _now = now();
    +    if (!previous && options.leading === false) previous = _now;
    +    var remaining = wait - (_now - previous);
    +    context = this;
    +    args = arguments;
    +    if (remaining <= 0 || remaining > wait) {
    +      if (timeout) {
    +        clearTimeout(timeout);
    +        timeout = null;
    +      }
    +      previous = _now;
    +      result = func.apply(context, args);
    +      if (!timeout) context = args = null;
    +    } else if (!timeout && options.trailing !== false) {
    +      timeout = setTimeout(later, remaining);
    +    }
    +    return result;
    +  };
    +
    +  throttled.cancel = function() {
    +    clearTimeout(timeout);
    +    previous = 0;
    +    timeout = context = args = null;
    +  };
    +
    +  return throttled;
    +}
     
    -                // Returns a function that will be executed at most one time, no matter how
    -                // often you call it. Useful for lazy initialization.
    -                var once = partial(before, 2);
    -
    -                // Returns the first key on an object that passes a truth test.
    -                function findKey(obj, predicate, context) {
    -                    predicate = cb(predicate, context);
    -                    var _keys = keys(obj), key;
    -                    for (var i = 0, length = _keys.length; i < length; i++) {
    -                        key = _keys[i];
    -                        if (predicate(obj[key], key, obj)) return key;
    -                    }
    -                }
    +// When a sequence of calls of the returned function ends, the argument
    +// function is triggered. The end of a sequence is defined by the `wait`
    +// parameter. If `immediate` is passed, the argument function will be
    +// triggered at the beginning of the sequence instead of at the end.
    +function debounce(func, wait, immediate) {
    +  var timeout, previous, args, result, context;
    +
    +  var later = function() {
    +    var passed = now() - previous;
    +    if (wait > passed) {
    +      timeout = setTimeout(later, wait - passed);
    +    } else {
    +      timeout = null;
    +      if (!immediate) result = func.apply(context, args);
    +      // This check is needed because `func` can recursively invoke `debounced`.
    +      if (!timeout) args = context = null;
    +    }
    +  };
    +
    +  var debounced = restArguments(function(_args) {
    +    context = this;
    +    args = _args;
    +    previous = now();
    +    if (!timeout) {
    +      timeout = setTimeout(later, wait);
    +      if (immediate) result = func.apply(context, args);
    +    }
    +    return result;
    +  });
    +
    +  debounced.cancel = function() {
    +    clearTimeout(timeout);
    +    timeout = args = context = null;
    +  };
    +
    +  return debounced;
    +}
     
    -                // Internal function to generate `_.findIndex` and `_.findLastIndex`.
    -                function createPredicateIndexFinder(dir) {
    -                    return function (array, predicate, context) {
    -                        predicate = cb(predicate, context);
    -                        var length = getLength(array);
    -                        var index = dir > 0 ? 0 : length - 1;
    -                        for (; index >= 0 && index < length; index += dir) {
    -                            if (predicate(array[index], index, array)) return index;
    -                        }
    -                        return -1;
    -                    };
    -                }
    +// Returns the first function passed as an argument to the second,
    +// allowing you to adjust arguments, run code before and after, and
    +// conditionally execute the original function.
    +function wrap(func, wrapper) {
    +  return partial(wrapper, func);
    +}
     
    -                // Returns the first index on an array-like that passes a truth test.
    -                var findIndex = createPredicateIndexFinder(1);
    -
    -                // Returns the last index on an array-like that passes a truth test.
    -                var findLastIndex = createPredicateIndexFinder(-1);
    -
    -                // Use a comparator function to figure out the smallest index at which
    -                // an object should be inserted so as to maintain order. Uses binary search.
    -                function sortedIndex(array, obj, iteratee, context) {
    -                    iteratee = cb(iteratee, context, 1);
    -                    var value = iteratee(obj);
    -                    var low = 0, high = getLength(array);
    -                    while (low < high) {
    -                        var mid = Math.floor((low + high) / 2);
    -                        if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
    -                    }
    -                    return low;
    -                }
    +// Returns a negated version of the passed-in predicate.
    +function negate(predicate) {
    +  return function() {
    +    return !predicate.apply(this, arguments);
    +  };
    +}
     
    -                // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
    -                function createIndexFinder(dir, predicateFind, sortedIndex) {
    -                    return function (array, item, idx) {
    -                        var i = 0, length = getLength(array);
    -                        if (typeof idx == 'number') {
    -                            if (dir > 0) {
    -                                i = idx >= 0 ? idx : Math.max(idx + length, i);
    -                            } else {
    -                                length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
    -                            }
    -                        } else if (sortedIndex && idx && length) {
    -                            idx = sortedIndex(array, item);
    -                            return array[idx] === item ? idx : -1;
    -                        }
    -                        if (item !== item) {
    -                            idx = predicateFind(slice.call(array, i, length), isNaN$1);
    -                            return idx >= 0 ? idx + i : -1;
    -                        }
    -                        for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
    -                            if (array[idx] === item) return idx;
    -                        }
    -                        return -1;
    -                    };
    -                }
    +// Returns a function that is the composition of a list of functions, each
    +// consuming the return value of the function that follows.
    +function compose() {
    +  var args = arguments;
    +  var start = args.length - 1;
    +  return function() {
    +    var i = start;
    +    var result = args[start].apply(this, arguments);
    +    while (i--) result = args[i].call(this, result);
    +    return result;
    +  };
    +}
     
    -                // Return the position of the first occurrence of an item in an array,
    -                // or -1 if the item is not included in the array.
    -                // If the array is large and already in sort order, pass `true`
    -                // for **isSorted** to use binary search.
    -                var indexOf = createIndexFinder(1, findIndex, sortedIndex);
    -
    -                // Return the position of the last occurrence of an item in an array,
    -                // or -1 if the item is not included in the array.
    -                var lastIndexOf = createIndexFinder(-1, findLastIndex);
    -
    -                // Return the first value which passes a truth test.
    -                function find(obj, predicate, context) {
    -                    var keyFinder = isArrayLike(obj) ? findIndex : findKey;
    -                    var key = keyFinder(obj, predicate, context);
    -                    if (key !== void 0 && key !== -1) return obj[key];
    -                }
    +// Returns a function that will only be executed on and after the Nth call.
    +function after(times, func) {
    +  return function() {
    +    if (--times < 1) {
    +      return func.apply(this, arguments);
    +    }
    +  };
    +}
     
    -                // Convenience version of a common use case of `_.find`: getting the first
    -                // object containing specific `key:value` pairs.
    -                function findWhere(obj, attrs) {
    -                    return find(obj, matcher(attrs));
    -                }
    +// Returns a function that will only be executed up to (but not including) the
    +// Nth call.
    +function before(times, func) {
    +  var memo;
    +  return function() {
    +    if (--times > 0) {
    +      memo = func.apply(this, arguments);
    +    }
    +    if (times <= 1) func = null;
    +    return memo;
    +  };
    +}
     
    -                // The cornerstone for collection functions, an `each`
    -                // implementation, aka `forEach`.
    -                // Handles raw objects in addition to array-likes. Treats all
    -                // sparse array-likes as if they were dense.
    -                function each(obj, iteratee, context) {
    -                    iteratee = optimizeCb(iteratee, context);
    -                    var i, length;
    -                    if (isArrayLike(obj)) {
    -                        for (i = 0, length = obj.length; i < length; i++) {
    -                            iteratee(obj[i], i, obj);
    -                        }
    -                    } else {
    -                        var _keys = keys(obj);
    -                        for (i = 0, length = _keys.length; i < length; i++) {
    -                            iteratee(obj[_keys[i]], _keys[i], obj);
    -                        }
    -                    }
    -                    return obj;
    -                }
    +// Returns a function that will be executed at most one time, no matter how
    +// often you call it. Useful for lazy initialization.
    +var once = partial(before, 2);
    +
    +// Returns the first key on an object that passes a truth test.
    +function findKey(obj, predicate, context) {
    +  predicate = cb(predicate, context);
    +  var _keys = keys(obj), key;
    +  for (var i = 0, length = _keys.length; i < length; i++) {
    +    key = _keys[i];
    +    if (predicate(obj[key], key, obj)) return key;
    +  }
    +}
     
    -                // Return the results of applying the iteratee to each element.
    -                function map(obj, iteratee, context) {
    -                    iteratee = cb(iteratee, context);
    -                    var _keys = !isArrayLike(obj) && keys(obj),
    -                        length = (_keys || obj).length,
    -                        results = Array(length);
    -                    for (var index = 0; index < length; index++) {
    -                        var currentKey = _keys ? _keys[index] : index;
    -                        results[index] = iteratee(obj[currentKey], currentKey, obj);
    -                    }
    -                    return results;
    -                }
    +// Internal function to generate `_.findIndex` and `_.findLastIndex`.
    +function createPredicateIndexFinder(dir) {
    +  return function(array, predicate, context) {
    +    predicate = cb(predicate, context);
    +    var length = getLength(array);
    +    var index = dir > 0 ? 0 : length - 1;
    +    for (; index >= 0 && index < length; index += dir) {
    +      if (predicate(array[index], index, array)) return index;
    +    }
    +    return -1;
    +  };
    +}
     
    -                // Internal helper to create a reducing function, iterating left or right.
    -                function createReduce(dir) {
    -                    // Wrap code that reassigns argument variables in a separate function than
    -                    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
    -                    var reducer = function (obj, iteratee, memo, initial) {
    -                        var _keys = !isArrayLike(obj) && keys(obj),
    -                            length = (_keys || obj).length,
    -                            index = dir > 0 ? 0 : length - 1;
    -                        if (!initial) {
    -                            memo = obj[_keys ? _keys[index] : index];
    -                            index += dir;
    -                        }
    -                        for (; index >= 0 && index < length; index += dir) {
    -                            var currentKey = _keys ? _keys[index] : index;
    -                            memo = iteratee(memo, obj[currentKey], currentKey, obj);
    -                        }
    -                        return memo;
    -                    };
    +// Returns the first index on an array-like that passes a truth test.
    +var findIndex = createPredicateIndexFinder(1);
    +
    +// Returns the last index on an array-like that passes a truth test.
    +var findLastIndex = createPredicateIndexFinder(-1);
    +
    +// Use a comparator function to figure out the smallest index at which
    +// an object should be inserted so as to maintain order. Uses binary search.
    +function sortedIndex(array, obj, iteratee, context) {
    +  iteratee = cb(iteratee, context, 1);
    +  var value = iteratee(obj);
    +  var low = 0, high = getLength(array);
    +  while (low < high) {
    +    var mid = Math.floor((low + high) / 2);
    +    if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
    +  }
    +  return low;
    +}
     
    -                    return function (obj, iteratee, memo, context) {
    -                        var initial = arguments.length >= 3;
    -                        return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
    -                    };
    -                }
    +// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
    +function createIndexFinder(dir, predicateFind, sortedIndex) {
    +  return function(array, item, idx) {
    +    var i = 0, length = getLength(array);
    +    if (typeof idx == 'number') {
    +      if (dir > 0) {
    +        i = idx >= 0 ? idx : Math.max(idx + length, i);
    +      } else {
    +        length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
    +      }
    +    } else if (sortedIndex && idx && length) {
    +      idx = sortedIndex(array, item);
    +      return array[idx] === item ? idx : -1;
    +    }
    +    if (item !== item) {
    +      idx = predicateFind(slice.call(array, i, length), isNaN$1);
    +      return idx >= 0 ? idx + i : -1;
    +    }
    +    for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
    +      if (array[idx] === item) return idx;
    +    }
    +    return -1;
    +  };
    +}
     
    -                // **Reduce** builds up a single result from a list of values, aka `inject`,
    -                // or `foldl`.
    -                var reduce = createReduce(1);
    +// Return the position of the first occurrence of an item in an array,
    +// or -1 if the item is not included in the array.
    +// If the array is large and already in sort order, pass `true`
    +// for **isSorted** to use binary search.
    +var indexOf = createIndexFinder(1, findIndex, sortedIndex);
    +
    +// Return the position of the last occurrence of an item in an array,
    +// or -1 if the item is not included in the array.
    +var lastIndexOf = createIndexFinder(-1, findLastIndex);
    +
    +// Return the first value which passes a truth test.
    +function find(obj, predicate, context) {
    +  var keyFinder = isArrayLike(obj) ? findIndex : findKey;
    +  var key = keyFinder(obj, predicate, context);
    +  if (key !== void 0 && key !== -1) return obj[key];
    +}
     
    -                // The right-associative version of reduce, also known as `foldr`.
    -                var reduceRight = createReduce(-1);
    +// Convenience version of a common use case of `_.find`: getting the first
    +// object containing specific `key:value` pairs.
    +function findWhere(obj, attrs) {
    +  return find(obj, matcher(attrs));
    +}
     
    -                // Return all the elements that pass a truth test.
    -                function filter(obj, predicate, context) {
    -                    var results = [];
    -                    predicate = cb(predicate, context);
    -                    each(obj, function (value, index, list) {
    -                        if (predicate(value, index, list)) results.push(value);
    -                    });
    -                    return results;
    -                }
    +// The cornerstone for collection functions, an `each`
    +// implementation, aka `forEach`.
    +// Handles raw objects in addition to array-likes. Treats all
    +// sparse array-likes as if they were dense.
    +function each(obj, iteratee, context) {
    +  iteratee = optimizeCb(iteratee, context);
    +  var i, length;
    +  if (isArrayLike(obj)) {
    +    for (i = 0, length = obj.length; i < length; i++) {
    +      iteratee(obj[i], i, obj);
    +    }
    +  } else {
    +    var _keys = keys(obj);
    +    for (i = 0, length = _keys.length; i < length; i++) {
    +      iteratee(obj[_keys[i]], _keys[i], obj);
    +    }
    +  }
    +  return obj;
    +}
     
    -                // Return all the elements for which a truth test fails.
    -                function reject(obj, predicate, context) {
    -                    return filter(obj, negate(cb(predicate)), context);
    -                }
    +// Return the results of applying the iteratee to each element.
    +function map(obj, iteratee, context) {
    +  iteratee = cb(iteratee, context);
    +  var _keys = !isArrayLike(obj) && keys(obj),
    +      length = (_keys || obj).length,
    +      results = Array(length);
    +  for (var index = 0; index < length; index++) {
    +    var currentKey = _keys ? _keys[index] : index;
    +    results[index] = iteratee(obj[currentKey], currentKey, obj);
    +  }
    +  return results;
    +}
     
    -                // Determine whether all of the elements pass a truth test.
    -                function every(obj, predicate, context) {
    -                    predicate = cb(predicate, context);
    -                    var _keys = !isArrayLike(obj) && keys(obj),
    -                        length = (_keys || obj).length;
    -                    for (var index = 0; index < length; index++) {
    -                        var currentKey = _keys ? _keys[index] : index;
    -                        if (!predicate(obj[currentKey], currentKey, obj)) return false;
    -                    }
    -                    return true;
    -                }
    +// Internal helper to create a reducing function, iterating left or right.
    +function createReduce(dir) {
    +  // Wrap code that reassigns argument variables in a separate function than
    +  // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
    +  var reducer = function(obj, iteratee, memo, initial) {
    +    var _keys = !isArrayLike(obj) && keys(obj),
    +        length = (_keys || obj).length,
    +        index = dir > 0 ? 0 : length - 1;
    +    if (!initial) {
    +      memo = obj[_keys ? _keys[index] : index];
    +      index += dir;
    +    }
    +    for (; index >= 0 && index < length; index += dir) {
    +      var currentKey = _keys ? _keys[index] : index;
    +      memo = iteratee(memo, obj[currentKey], currentKey, obj);
    +    }
    +    return memo;
    +  };
    +
    +  return function(obj, iteratee, memo, context) {
    +    var initial = arguments.length >= 3;
    +    return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
    +  };
    +}
     
    -                // Determine if at least one element in the object passes a truth test.
    -                function some(obj, predicate, context) {
    -                    predicate = cb(predicate, context);
    -                    var _keys = !isArrayLike(obj) && keys(obj),
    -                        length = (_keys || obj).length;
    -                    for (var index = 0; index < length; index++) {
    -                        var currentKey = _keys ? _keys[index] : index;
    -                        if (predicate(obj[currentKey], currentKey, obj)) return true;
    -                    }
    -                    return false;
    -                }
    +// **Reduce** builds up a single result from a list of values, aka `inject`,
    +// or `foldl`.
    +var reduce = createReduce(1);
    +
    +// The right-associative version of reduce, also known as `foldr`.
    +var reduceRight = createReduce(-1);
    +
    +// Return all the elements that pass a truth test.
    +function filter(obj, predicate, context) {
    +  var results = [];
    +  predicate = cb(predicate, context);
    +  each(obj, function(value, index, list) {
    +    if (predicate(value, index, list)) results.push(value);
    +  });
    +  return results;
    +}
     
    -                // Determine if the array or object contains a given item (using `===`).
    -                function contains(obj, item, fromIndex, guard) {
    -                    if (!isArrayLike(obj)) obj = values(obj);
    -                    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
    -                    return indexOf(obj, item, fromIndex) >= 0;
    -                }
    +// Return all the elements for which a truth test fails.
    +function reject(obj, predicate, context) {
    +  return filter(obj, negate(cb(predicate)), context);
    +}
     
    -                // Invoke a method (with arguments) on every item in a collection.
    -                var invoke = restArguments(function (obj, path, args) {
    -                    var contextPath, func;
    -                    if (isFunction$1(path)) {
    -                        func = path;
    -                    } else {
    -                        path = toPath(path);
    -                        contextPath = path.slice(0, -1);
    -                        path = path[path.length - 1];
    -                    }
    -                    return map(obj, function (context) {
    -                        var method = func;
    -                        if (!method) {
    -                            if (contextPath && contextPath.length) {
    -                                context = deepGet(context, contextPath);
    -                            }
    -                            if (context == null) return void 0;
    -                            method = context[path];
    -                        }
    -                        return method == null ? method : method.apply(context, args);
    -                    });
    -                });
    +// Determine whether all of the elements pass a truth test.
    +function every(obj, predicate, context) {
    +  predicate = cb(predicate, context);
    +  var _keys = !isArrayLike(obj) && keys(obj),
    +      length = (_keys || obj).length;
    +  for (var index = 0; index < length; index++) {
    +    var currentKey = _keys ? _keys[index] : index;
    +    if (!predicate(obj[currentKey], currentKey, obj)) return false;
    +  }
    +  return true;
    +}
     
    -                // Convenience version of a common use case of `_.map`: fetching a property.
    -                function pluck(obj, key) {
    -                    return map(obj, property(key));
    -                }
    +// Determine if at least one element in the object passes a truth test.
    +function some(obj, predicate, context) {
    +  predicate = cb(predicate, context);
    +  var _keys = !isArrayLike(obj) && keys(obj),
    +      length = (_keys || obj).length;
    +  for (var index = 0; index < length; index++) {
    +    var currentKey = _keys ? _keys[index] : index;
    +    if (predicate(obj[currentKey], currentKey, obj)) return true;
    +  }
    +  return false;
    +}
     
    -                // Convenience version of a common use case of `_.filter`: selecting only
    -                // objects containing specific `key:value` pairs.
    -                function where(obj, attrs) {
    -                    return filter(obj, matcher(attrs));
    -                }
    +// Determine if the array or object contains a given item (using `===`).
    +function contains(obj, item, fromIndex, guard) {
    +  if (!isArrayLike(obj)) obj = values(obj);
    +  if (typeof fromIndex != 'number' || guard) fromIndex = 0;
    +  return indexOf(obj, item, fromIndex) >= 0;
    +}
     
    -                // Return the maximum element (or element-based computation).
    -                function max(obj, iteratee, context) {
    -                    var result = -Infinity, lastComputed = -Infinity,
    -                        value, computed;
    -                    if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {
    -                        obj = isArrayLike(obj) ? obj : values(obj);
    -                        for (var i = 0, length = obj.length; i < length; i++) {
    -                            value = obj[i];
    -                            if (value != null && value > result) {
    -                                result = value;
    -                            }
    -                        }
    -                    } else {
    -                        iteratee = cb(iteratee, context);
    -                        each(obj, function (v, index, list) {
    -                            computed = iteratee(v, index, list);
    -                            if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) {
    -                                result = v;
    -                                lastComputed = computed;
    -                            }
    -                        });
    -                    }
    -                    return result;
    -                }
    +// Invoke a method (with arguments) on every item in a collection.
    +var invoke = restArguments(function(obj, path, args) {
    +  var contextPath, func;
    +  if (isFunction$1(path)) {
    +    func = path;
    +  } else {
    +    path = toPath(path);
    +    contextPath = path.slice(0, -1);
    +    path = path[path.length - 1];
    +  }
    +  return map(obj, function(context) {
    +    var method = func;
    +    if (!method) {
    +      if (contextPath && contextPath.length) {
    +        context = deepGet(context, contextPath);
    +      }
    +      if (context == null) return void 0;
    +      method = context[path];
    +    }
    +    return method == null ? method : method.apply(context, args);
    +  });
    +});
     
    -                // Return the minimum element (or element-based computation).
    -                function min(obj, iteratee, context) {
    -                    var result = Infinity, lastComputed = Infinity,
    -                        value, computed;
    -                    if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {
    -                        obj = isArrayLike(obj) ? obj : values(obj);
    -                        for (var i = 0, length = obj.length; i < length; i++) {
    -                            value = obj[i];
    -                            if (value != null && value < result) {
    -                                result = value;
    -                            }
    -                        }
    -                    } else {
    -                        iteratee = cb(iteratee, context);
    -                        each(obj, function (v, index, list) {
    -                            computed = iteratee(v, index, list);
    -                            if (computed < lastComputed || (computed === Infinity && result === Infinity)) {
    -                                result = v;
    -                                lastComputed = computed;
    -                            }
    -                        });
    -                    }
    -                    return result;
    -                }
    +// Convenience version of a common use case of `_.map`: fetching a property.
    +function pluck(obj, key) {
    +  return map(obj, property(key));
    +}
     
    -                // Safely create a real, live array from anything iterable.
    -                var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
    -                function toArray(obj) {
    -                    if (!obj) return [];
    -                    if (isArray(obj)) return slice.call(obj);
    -                    if (isString(obj)) {
    -                        // Keep surrogate pair characters together.
    -                        return obj.match(reStrSymbol);
    -                    }
    -                    if (isArrayLike(obj)) return map(obj, identity);
    -                    return values(obj);
    -                }
    +// Convenience version of a common use case of `_.filter`: selecting only
    +// objects containing specific `key:value` pairs.
    +function where(obj, attrs) {
    +  return filter(obj, matcher(attrs));
    +}
     
    -                // Sample **n** random values from a collection using the modern version of the
    -                // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
    -                // If **n** is not specified, returns a single random element.
    -                // The internal `guard` argument allows it to work with `_.map`.
    -                function sample(obj, n, guard) {
    -                    if (n == null || guard) {
    -                        if (!isArrayLike(obj)) obj = values(obj);
    -                        return obj[random(obj.length - 1)];
    -                    }
    -                    var sample = toArray(obj);
    -                    var length = getLength(sample);
    -                    n = Math.max(Math.min(n, length), 0);
    -                    var last = length - 1;
    -                    for (var index = 0; index < n; index++) {
    -                        var rand = random(index, last);
    -                        var temp = sample[index];
    -                        sample[index] = sample[rand];
    -                        sample[rand] = temp;
    -                    }
    -                    return sample.slice(0, n);
    -                }
    +// Return the maximum element (or element-based computation).
    +function max(obj, iteratee, context) {
    +  var result = -Infinity, lastComputed = -Infinity,
    +      value, computed;
    +  if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {
    +    obj = isArrayLike(obj) ? obj : values(obj);
    +    for (var i = 0, length = obj.length; i < length; i++) {
    +      value = obj[i];
    +      if (value != null && value > result) {
    +        result = value;
    +      }
    +    }
    +  } else {
    +    iteratee = cb(iteratee, context);
    +    each(obj, function(v, index, list) {
    +      computed = iteratee(v, index, list);
    +      if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) {
    +        result = v;
    +        lastComputed = computed;
    +      }
    +    });
    +  }
    +  return result;
    +}
     
    -                // Shuffle a collection.
    -                function shuffle(obj) {
    -                    return sample(obj, Infinity);
    -                }
    +// Return the minimum element (or element-based computation).
    +function min(obj, iteratee, context) {
    +  var result = Infinity, lastComputed = Infinity,
    +      value, computed;
    +  if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {
    +    obj = isArrayLike(obj) ? obj : values(obj);
    +    for (var i = 0, length = obj.length; i < length; i++) {
    +      value = obj[i];
    +      if (value != null && value < result) {
    +        result = value;
    +      }
    +    }
    +  } else {
    +    iteratee = cb(iteratee, context);
    +    each(obj, function(v, index, list) {
    +      computed = iteratee(v, index, list);
    +      if (computed < lastComputed || (computed === Infinity && result === Infinity)) {
    +        result = v;
    +        lastComputed = computed;
    +      }
    +    });
    +  }
    +  return result;
    +}
     
    -                // Sort the object's values by a criterion produced by an iteratee.
    -                function sortBy(obj, iteratee, context) {
    -                    var index = 0;
    -                    iteratee = cb(iteratee, context);
    -                    return pluck(map(obj, function (value, key, list) {
    -                        return {
    -                            value: value,
    -                            index: index++,
    -                            criteria: iteratee(value, key, list)
    -                        };
    -                    }).sort(function (left, right) {
    -                        var a = left.criteria;
    -                        var b = right.criteria;
    -                        if (a !== b) {
    -                            if (a > b || a === void 0) return 1;
    -                            if (a < b || b === void 0) return -1;
    -                        }
    -                        return left.index - right.index;
    -                    }), 'value');
    -                }
    +// Safely create a real, live array from anything iterable.
    +var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
    +function toArray(obj) {
    +  if (!obj) return [];
    +  if (isArray(obj)) return slice.call(obj);
    +  if (isString(obj)) {
    +    // Keep surrogate pair characters together.
    +    return obj.match(reStrSymbol);
    +  }
    +  if (isArrayLike(obj)) return map(obj, identity);
    +  return values(obj);
    +}
     
    -                // An internal function used for aggregate "group by" operations.
    -                function group(behavior, partition) {
    -                    return function (obj, iteratee, context) {
    -                        var result = partition ? [[], []] : {};
    -                        iteratee = cb(iteratee, context);
    -                        each(obj, function (value, index) {
    -                            var key = iteratee(value, index, obj);
    -                            behavior(result, value, key);
    -                        });
    -                        return result;
    -                    };
    -                }
    +// Sample **n** random values from a collection using the modern version of the
    +// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
    +// If **n** is not specified, returns a single random element.
    +// The internal `guard` argument allows it to work with `_.map`.
    +function sample(obj, n, guard) {
    +  if (n == null || guard) {
    +    if (!isArrayLike(obj)) obj = values(obj);
    +    return obj[random(obj.length - 1)];
    +  }
    +  var sample = toArray(obj);
    +  var length = getLength(sample);
    +  n = Math.max(Math.min(n, length), 0);
    +  var last = length - 1;
    +  for (var index = 0; index < n; index++) {
    +    var rand = random(index, last);
    +    var temp = sample[index];
    +    sample[index] = sample[rand];
    +    sample[rand] = temp;
    +  }
    +  return sample.slice(0, n);
    +}
     
    -                // Groups the object's values by a criterion. Pass either a string attribute
    -                // to group by, or a function that returns the criterion.
    -                var groupBy = group(function (result, value, key) {
    -                    if (has$1(result, key)) result[key].push(value); else result[key] = [value];
    -                });
    +// Shuffle a collection.
    +function shuffle(obj) {
    +  return sample(obj, Infinity);
    +}
     
    -                // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
    -                // when you know that your index values will be unique.
    -                var indexBy = group(function (result, value, key) {
    -                    result[key] = value;
    -                });
    +// Sort the object's values by a criterion produced by an iteratee.
    +function sortBy(obj, iteratee, context) {
    +  var index = 0;
    +  iteratee = cb(iteratee, context);
    +  return pluck(map(obj, function(value, key, list) {
    +    return {
    +      value: value,
    +      index: index++,
    +      criteria: iteratee(value, key, list)
    +    };
    +  }).sort(function(left, right) {
    +    var a = left.criteria;
    +    var b = right.criteria;
    +    if (a !== b) {
    +      if (a > b || a === void 0) return 1;
    +      if (a < b || b === void 0) return -1;
    +    }
    +    return left.index - right.index;
    +  }), 'value');
    +}
     
    -                // Counts instances of an object that group by a certain criterion. Pass
    -                // either a string attribute to count by, or a function that returns the
    -                // criterion.
    -                var countBy = group(function (result, value, key) {
    -                    if (has$1(result, key)) result[key]++; else result[key] = 1;
    -                });
    +// An internal function used for aggregate "group by" operations.
    +function group(behavior, partition) {
    +  return function(obj, iteratee, context) {
    +    var result = partition ? [[], []] : {};
    +    iteratee = cb(iteratee, context);
    +    each(obj, function(value, index) {
    +      var key = iteratee(value, index, obj);
    +      behavior(result, value, key);
    +    });
    +    return result;
    +  };
    +}
     
    -                // Split a collection into two arrays: one whose elements all pass the given
    -                // truth test, and one whose elements all do not pass the truth test.
    -                var partition = group(function (result, value, pass) {
    -                    result[pass ? 0 : 1].push(value);
    -                }, true);
    +// Groups the object's values by a criterion. Pass either a string attribute
    +// to group by, or a function that returns the criterion.
    +var groupBy = group(function(result, value, key) {
    +  if (has$1(result, key)) result[key].push(value); else result[key] = [value];
    +});
     
    -                // Return the number of elements in a collection.
    -                function size(obj) {
    -                    if (obj == null) return 0;
    -                    return isArrayLike(obj) ? obj.length : keys(obj).length;
    -                }
    +// Indexes the object's values by a criterion, similar to `_.groupBy`, but for
    +// when you know that your index values will be unique.
    +var indexBy = group(function(result, value, key) {
    +  result[key] = value;
    +});
     
    -                // Internal `_.pick` helper function to determine whether `key` is an enumerable
    -                // property name of `obj`.
    -                function keyInObj(value, key, obj) {
    -                    return key in obj;
    -                }
    +// Counts instances of an object that group by a certain criterion. Pass
    +// either a string attribute to count by, or a function that returns the
    +// criterion.
    +var countBy = group(function(result, value, key) {
    +  if (has$1(result, key)) result[key]++; else result[key] = 1;
    +});
     
    -                // Return a copy of the object only containing the allowed properties.
    -                var pick = restArguments(function (obj, keys) {
    -                    var result = {}, iteratee = keys[0];
    -                    if (obj == null) return result;
    -                    if (isFunction$1(iteratee)) {
    -                        if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
    -                        keys = allKeys(obj);
    -                    } else {
    -                        iteratee = keyInObj;
    -                        keys = flatten$1(keys, false, false);
    -                        obj = Object(obj);
    -                    }
    -                    for (var i = 0, length = keys.length; i < length; i++) {
    -                        var key = keys[i];
    -                        var value = obj[key];
    -                        if (iteratee(value, key, obj)) result[key] = value;
    -                    }
    -                    return result;
    -                });
    +// Split a collection into two arrays: one whose elements all pass the given
    +// truth test, and one whose elements all do not pass the truth test.
    +var partition = group(function(result, value, pass) {
    +  result[pass ? 0 : 1].push(value);
    +}, true);
     
    -                // Return a copy of the object without the disallowed properties.
    -                var omit = restArguments(function (obj, keys) {
    -                    var iteratee = keys[0], context;
    -                    if (isFunction$1(iteratee)) {
    -                        iteratee = negate(iteratee);
    -                        if (keys.length > 1) context = keys[1];
    -                    } else {
    -                        keys = map(flatten$1(keys, false, false), String);
    -                        iteratee = function (value, key) {
    -                            return !contains(keys, key);
    -                        };
    -                    }
    -                    return pick(obj, iteratee, context);
    -                });
    +// Return the number of elements in a collection.
    +function size(obj) {
    +  if (obj == null) return 0;
    +  return isArrayLike(obj) ? obj.length : keys(obj).length;
    +}
     
    -                // Returns everything but the last entry of the array. Especially useful on
    -                // the arguments object. Passing **n** will return all the values in
    -                // the array, excluding the last N.
    -                function initial(array, n, guard) {
    -                    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
    -                }
    +// Internal `_.pick` helper function to determine whether `key` is an enumerable
    +// property name of `obj`.
    +function keyInObj(value, key, obj) {
    +  return key in obj;
    +}
     
    -                // Get the first element of an array. Passing **n** will return the first N
    -                // values in the array. The **guard** check allows it to work with `_.map`.
    -                function first(array, n, guard) {
    -                    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
    -                    if (n == null || guard) return array[0];
    -                    return initial(array, array.length - n);
    -                }
    +// Return a copy of the object only containing the allowed properties.
    +var pick = restArguments(function(obj, keys) {
    +  var result = {}, iteratee = keys[0];
    +  if (obj == null) return result;
    +  if (isFunction$1(iteratee)) {
    +    if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
    +    keys = allKeys(obj);
    +  } else {
    +    iteratee = keyInObj;
    +    keys = flatten$1(keys, false, false);
    +    obj = Object(obj);
    +  }
    +  for (var i = 0, length = keys.length; i < length; i++) {
    +    var key = keys[i];
    +    var value = obj[key];
    +    if (iteratee(value, key, obj)) result[key] = value;
    +  }
    +  return result;
    +});
     
    -                // Returns everything but the first entry of the `array`. Especially useful on
    -                // the `arguments` object. Passing an **n** will return the rest N values in the
    -                // `array`.
    -                function rest(array, n, guard) {
    -                    return slice.call(array, n == null || guard ? 1 : n);
    -                }
    +// Return a copy of the object without the disallowed properties.
    +var omit = restArguments(function(obj, keys) {
    +  var iteratee = keys[0], context;
    +  if (isFunction$1(iteratee)) {
    +    iteratee = negate(iteratee);
    +    if (keys.length > 1) context = keys[1];
    +  } else {
    +    keys = map(flatten$1(keys, false, false), String);
    +    iteratee = function(value, key) {
    +      return !contains(keys, key);
    +    };
    +  }
    +  return pick(obj, iteratee, context);
    +});
     
    -                // Get the last element of an array. Passing **n** will return the last N
    -                // values in the array.
    -                function last(array, n, guard) {
    -                    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
    -                    if (n == null || guard) return array[array.length - 1];
    -                    return rest(array, Math.max(0, array.length - n));
    -                }
    +// Returns everything but the last entry of the array. Especially useful on
    +// the arguments object. Passing **n** will return all the values in
    +// the array, excluding the last N.
    +function initial(array, n, guard) {
    +  return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
    +}
     
    -                // Trim out all falsy values from an array.
    -                function compact(array) {
    -                    return filter(array, Boolean);
    -                }
    +// Get the first element of an array. Passing **n** will return the first N
    +// values in the array. The **guard** check allows it to work with `_.map`.
    +function first(array, n, guard) {
    +  if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
    +  if (n == null || guard) return array[0];
    +  return initial(array, array.length - n);
    +}
     
    -                // Flatten out an array, either recursively (by default), or up to `depth`.
    -                // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
    -                function flatten(array, depth) {
    -                    return flatten$1(array, depth, false);
    -                }
    +// Returns everything but the first entry of the `array`. Especially useful on
    +// the `arguments` object. Passing an **n** will return the rest N values in the
    +// `array`.
    +function rest(array, n, guard) {
    +  return slice.call(array, n == null || guard ? 1 : n);
    +}
     
    -                // Take the difference between one array and a number of other arrays.
    -                // Only the elements present in just the first array will remain.
    -                var difference = restArguments(function (array, rest) {
    -                    rest = flatten$1(rest, true, true);
    -                    return filter(array, function (value) {
    -                        return !contains(rest, value);
    -                    });
    -                });
    +// Get the last element of an array. Passing **n** will return the last N
    +// values in the array.
    +function last(array, n, guard) {
    +  if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
    +  if (n == null || guard) return array[array.length - 1];
    +  return rest(array, Math.max(0, array.length - n));
    +}
     
    -                // Return a version of the array that does not contain the specified value(s).
    -                var without = restArguments(function (array, otherArrays) {
    -                    return difference(array, otherArrays);
    -                });
    +// Trim out all falsy values from an array.
    +function compact(array) {
    +  return filter(array, Boolean);
    +}
     
    -                // Produce a duplicate-free version of the array. If the array has already
    -                // been sorted, you have the option of using a faster algorithm.
    -                // The faster algorithm will not work with an iteratee if the iteratee
    -                // is not a one-to-one function, so providing an iteratee will disable
    -                // the faster algorithm.
    -                function uniq(array, isSorted, iteratee, context) {
    -                    if (!isBoolean(isSorted)) {
    -                        context = iteratee;
    -                        iteratee = isSorted;
    -                        isSorted = false;
    -                    }
    -                    if (iteratee != null) iteratee = cb(iteratee, context);
    -                    var result = [];
    -                    var seen = [];
    -                    for (var i = 0, length = getLength(array); i < length; i++) {
    -                        var value = array[i],
    -                            computed = iteratee ? iteratee(value, i, array) : value;
    -                        if (isSorted && !iteratee) {
    -                            if (!i || seen !== computed) result.push(value);
    -                            seen = computed;
    -                        } else if (iteratee) {
    -                            if (!contains(seen, computed)) {
    -                                seen.push(computed);
    -                                result.push(value);
    -                            }
    -                        } else if (!contains(result, value)) {
    -                            result.push(value);
    -                        }
    -                    }
    -                    return result;
    -                }
    +// Flatten out an array, either recursively (by default), or up to `depth`.
    +// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
    +function flatten(array, depth) {
    +  return flatten$1(array, depth, false);
    +}
     
    -                // Produce an array that contains the union: each distinct element from all of
    -                // the passed-in arrays.
    -                var union = restArguments(function (arrays) {
    -                    return uniq(flatten$1(arrays, true, true));
    -                });
    +// Take the difference between one array and a number of other arrays.
    +// Only the elements present in just the first array will remain.
    +var difference = restArguments(function(array, rest) {
    +  rest = flatten$1(rest, true, true);
    +  return filter(array, function(value){
    +    return !contains(rest, value);
    +  });
    +});
     
    -                // Produce an array that contains every item shared between all the
    -                // passed-in arrays.
    -                function intersection(array) {
    -                    var result = [];
    -                    var argsLength = arguments.length;
    -                    for (var i = 0, length = getLength(array); i < length; i++) {
    -                        var item = array[i];
    -                        if (contains(result, item)) continue;
    -                        var j;
    -                        for (j = 1; j < argsLength; j++) {
    -                            if (!contains(arguments[j], item)) break;
    -                        }
    -                        if (j === argsLength) result.push(item);
    -                    }
    -                    return result;
    -                }
    +// Return a version of the array that does not contain the specified value(s).
    +var without = restArguments(function(array, otherArrays) {
    +  return difference(array, otherArrays);
    +});
     
    -                // Complement of zip. Unzip accepts an array of arrays and groups
    -                // each array's elements on shared indices.
    -                function unzip(array) {
    -                    var length = (array && max(array, getLength).length) || 0;
    -                    var result = Array(length);
    +// Produce a duplicate-free version of the array. If the array has already
    +// been sorted, you have the option of using a faster algorithm.
    +// The faster algorithm will not work with an iteratee if the iteratee
    +// is not a one-to-one function, so providing an iteratee will disable
    +// the faster algorithm.
    +function uniq(array, isSorted, iteratee, context) {
    +  if (!isBoolean(isSorted)) {
    +    context = iteratee;
    +    iteratee = isSorted;
    +    isSorted = false;
    +  }
    +  if (iteratee != null) iteratee = cb(iteratee, context);
    +  var result = [];
    +  var seen = [];
    +  for (var i = 0, length = getLength(array); i < length; i++) {
    +    var value = array[i],
    +        computed = iteratee ? iteratee(value, i, array) : value;
    +    if (isSorted && !iteratee) {
    +      if (!i || seen !== computed) result.push(value);
    +      seen = computed;
    +    } else if (iteratee) {
    +      if (!contains(seen, computed)) {
    +        seen.push(computed);
    +        result.push(value);
    +      }
    +    } else if (!contains(result, value)) {
    +      result.push(value);
    +    }
    +  }
    +  return result;
    +}
     
    -                    for (var index = 0; index < length; index++) {
    -                        result[index] = pluck(array, index);
    -                    }
    -                    return result;
    -                }
    +// Produce an array that contains the union: each distinct element from all of
    +// the passed-in arrays.
    +var union = restArguments(function(arrays) {
    +  return uniq(flatten$1(arrays, true, true));
    +});
     
    -                // Zip together multiple lists into a single array -- elements that share
    -                // an index go together.
    -                var zip = restArguments(unzip);
    -
    -                // Converts lists into objects. Pass either a single array of `[key, value]`
    -                // pairs, or two parallel arrays of the same length -- one of keys, and one of
    -                // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
    -                function object(list, values) {
    -                    var result = {};
    -                    for (var i = 0, length = getLength(list); i < length; i++) {
    -                        if (values) {
    -                            result[list[i]] = values[i];
    -                        } else {
    -                            result[list[i][0]] = list[i][1];
    -                        }
    -                    }
    -                    return result;
    -                }
    +// Produce an array that contains every item shared between all the
    +// passed-in arrays.
    +function intersection(array) {
    +  var result = [];
    +  var argsLength = arguments.length;
    +  for (var i = 0, length = getLength(array); i < length; i++) {
    +    var item = array[i];
    +    if (contains(result, item)) continue;
    +    var j;
    +    for (j = 1; j < argsLength; j++) {
    +      if (!contains(arguments[j], item)) break;
    +    }
    +    if (j === argsLength) result.push(item);
    +  }
    +  return result;
    +}
     
    -                // Generate an integer Array containing an arithmetic progression. A port of
    -                // the native Python `range()` function. See
    -                // [the Python documentation](https://docs.python.org/library/functions.html#range).
    -                function range(start, stop, step) {
    -                    if (stop == null) {
    -                        stop = start || 0;
    -                        start = 0;
    -                    }
    -                    if (!step) {
    -                        step = stop < start ? -1 : 1;
    -                    }
    +// Complement of zip. Unzip accepts an array of arrays and groups
    +// each array's elements on shared indices.
    +function unzip(array) {
    +  var length = (array && max(array, getLength).length) || 0;
    +  var result = Array(length);
     
    -                    var length = Math.max(Math.ceil((stop - start) / step), 0);
    -                    var range = Array(length);
    +  for (var index = 0; index < length; index++) {
    +    result[index] = pluck(array, index);
    +  }
    +  return result;
    +}
     
    -                    for (var idx = 0; idx < length; idx++, start += step) {
    -                        range[idx] = start;
    -                    }
    +// Zip together multiple lists into a single array -- elements that share
    +// an index go together.
    +var zip = restArguments(unzip);
    +
    +// Converts lists into objects. Pass either a single array of `[key, value]`
    +// pairs, or two parallel arrays of the same length -- one of keys, and one of
    +// the corresponding values. Passing by pairs is the reverse of `_.pairs`.
    +function object(list, values) {
    +  var result = {};
    +  for (var i = 0, length = getLength(list); i < length; i++) {
    +    if (values) {
    +      result[list[i]] = values[i];
    +    } else {
    +      result[list[i][0]] = list[i][1];
    +    }
    +  }
    +  return result;
    +}
     
    -                    return range;
    -                }
    +// Generate an integer Array containing an arithmetic progression. A port of
    +// the native Python `range()` function. See
    +// [the Python documentation](https://docs.python.org/library/functions.html#range).
    +function range(start, stop, step) {
    +  if (stop == null) {
    +    stop = start || 0;
    +    start = 0;
    +  }
    +  if (!step) {
    +    step = stop < start ? -1 : 1;
    +  }
    +
    +  var length = Math.max(Math.ceil((stop - start) / step), 0);
    +  var range = Array(length);
    +
    +  for (var idx = 0; idx < length; idx++, start += step) {
    +    range[idx] = start;
    +  }
    +
    +  return range;
    +}
     
    -                // Chunk a single array into multiple arrays, each containing `count` or fewer
    -                // items.
    -                function chunk(array, count) {
    -                    if (count == null || count < 1) return [];
    -                    var result = [];
    -                    var i = 0, length = array.length;
    -                    while (i < length) {
    -                        result.push(slice.call(array, i, i += count));
    -                    }
    -                    return result;
    -                }
    +// Chunk a single array into multiple arrays, each containing `count` or fewer
    +// items.
    +function chunk(array, count) {
    +  if (count == null || count < 1) return [];
    +  var result = [];
    +  var i = 0, length = array.length;
    +  while (i < length) {
    +    result.push(slice.call(array, i, i += count));
    +  }
    +  return result;
    +}
     
    -                // Helper function to continue chaining intermediate results.
    -                function chainResult(instance, obj) {
    -                    return instance._chain ? _$1(obj).chain() : obj;
    -                }
    +// Helper function to continue chaining intermediate results.
    +function chainResult(instance, obj) {
    +  return instance._chain ? _$1(obj).chain() : obj;
    +}
     
    -                // Add your own custom functions to the Underscore object.
    -                function mixin(obj) {
    -                    each(functions(obj), function (name) {
    -                        var func = _$1[name] = obj[name];
    -                        _$1.prototype[name] = function () {
    -                            var args = [this._wrapped];
    -                            push.apply(args, arguments);
    -                            return chainResult(this, func.apply(_$1, args));
    -                        };
    -                    });
    -                    return _$1;
    -                }
    +// Add your own custom functions to the Underscore object.
    +function mixin(obj) {
    +  each(functions(obj), function(name) {
    +    var func = _$1[name] = obj[name];
    +    _$1.prototype[name] = function() {
    +      var args = [this._wrapped];
    +      push.apply(args, arguments);
    +      return chainResult(this, func.apply(_$1, args));
    +    };
    +  });
    +  return _$1;
    +}
     
    -                // Add all mutator `Array` functions to the wrapper.
    -                each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function (name) {
    -                    var method = ArrayProto[name];
    -                    _$1.prototype[name] = function () {
    -                        var obj = this._wrapped;
    -                        if (obj != null) {
    -                            method.apply(obj, arguments);
    -                            if ((name === 'shift' || name === 'splice') && obj.length === 0) {
    -                                delete obj[0];
    -                            }
    -                        }
    -                        return chainResult(this, obj);
    -                    };
    -                });
    +// Add all mutator `Array` functions to the wrapper.
    +each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
    +  var method = ArrayProto[name];
    +  _$1.prototype[name] = function() {
    +    var obj = this._wrapped;
    +    if (obj != null) {
    +      method.apply(obj, arguments);
    +      if ((name === 'shift' || name === 'splice') && obj.length === 0) {
    +        delete obj[0];
    +      }
    +    }
    +    return chainResult(this, obj);
    +  };
    +});
     
    -                // Add all accessor `Array` functions to the wrapper.
    -                each(['concat', 'join', 'slice'], function (name) {
    -                    var method = ArrayProto[name];
    -                    _$1.prototype[name] = function () {
    -                        var obj = this._wrapped;
    -                        if (obj != null) obj = method.apply(obj, arguments);
    -                        return chainResult(this, obj);
    -                    };
    -                });
    +// Add all accessor `Array` functions to the wrapper.
    +each(['concat', 'join', 'slice'], function(name) {
    +  var method = ArrayProto[name];
    +  _$1.prototype[name] = function() {
    +    var obj = this._wrapped;
    +    if (obj != null) obj = method.apply(obj, arguments);
    +    return chainResult(this, obj);
    +  };
    +});
     
    -                // Named Exports
    -
    -                var allExports = {
    -                    __proto__: null,
    -                    VERSION: VERSION,
    -                    restArguments: restArguments,
    -                    isObject: isObject,
    -                    isNull: isNull,
    -                    isUndefined: isUndefined,
    -                    isBoolean: isBoolean,
    -                    isElement: isElement,
    -                    isString: isString,
    -                    isNumber: isNumber,
    -                    isDate: isDate,
    -                    isRegExp: isRegExp,
    -                    isError: isError,
    -                    isSymbol: isSymbol,
    -                    isArrayBuffer: isArrayBuffer,
    -                    isDataView: isDataView$1,
    -                    isArray: isArray,
    -                    isFunction: isFunction$1,
    -                    isArguments: isArguments$1,
    -                    isFinite: isFinite$1,
    -                    isNaN: isNaN$1,
    -                    isTypedArray: isTypedArray$1,
    -                    isEmpty: isEmpty,
    -                    isMatch: isMatch,
    -                    isEqual: isEqual,
    -                    isMap: isMap,
    -                    isWeakMap: isWeakMap,
    -                    isSet: isSet,
    -                    isWeakSet: isWeakSet,
    -                    keys: keys,
    -                    allKeys: allKeys,
    -                    values: values,
    -                    pairs: pairs,
    -                    invert: invert,
    -                    functions: functions,
    -                    methods: functions,
    -                    extend: extend,
    -                    extendOwn: extendOwn,
    -                    assign: extendOwn,
    -                    defaults: defaults,
    -                    create: create,
    -                    clone: clone,
    -                    tap: tap,
    -                    get: get,
    -                    has: has,
    -                    mapObject: mapObject,
    -                    identity: identity,
    -                    constant: constant,
    -                    noop: noop,
    -                    toPath: toPath$1,
    -                    property: property,
    -                    propertyOf: propertyOf,
    -                    matcher: matcher,
    -                    matches: matcher,
    -                    times: times,
    -                    random: random,
    -                    now: now,
    -                    escape: _escape,
    -                    unescape: _unescape,
    -                    templateSettings: templateSettings,
    -                    template: template,
    -                    result: result,
    -                    uniqueId: uniqueId,
    -                    chain: chain,
    -                    iteratee: iteratee,
    -                    partial: partial,
    -                    bind: bind,
    -                    bindAll: bindAll,
    -                    memoize: memoize,
    -                    delay: delay,
    -                    defer: defer,
    -                    throttle: throttle,
    -                    debounce: debounce,
    -                    wrap: wrap,
    -                    negate: negate,
    -                    compose: compose,
    -                    after: after,
    -                    before: before,
    -                    once: once,
    -                    findKey: findKey,
    -                    findIndex: findIndex,
    -                    findLastIndex: findLastIndex,
    -                    sortedIndex: sortedIndex,
    -                    indexOf: indexOf,
    -                    lastIndexOf: lastIndexOf,
    -                    find: find,
    -                    detect: find,
    -                    findWhere: findWhere,
    -                    each: each,
    -                    forEach: each,
    -                    map: map,
    -                    collect: map,
    -                    reduce: reduce,
    -                    foldl: reduce,
    -                    inject: reduce,
    -                    reduceRight: reduceRight,
    -                    foldr: reduceRight,
    -                    filter: filter,
    -                    select: filter,
    -                    reject: reject,
    -                    every: every,
    -                    all: every,
    -                    some: some,
    -                    any: some,
    -                    contains: contains,
    -                    includes: contains,
    -                    include: contains,
    -                    invoke: invoke,
    -                    pluck: pluck,
    -                    where: where,
    -                    max: max,
    -                    min: min,
    -                    shuffle: shuffle,
    -                    sample: sample,
    -                    sortBy: sortBy,
    -                    groupBy: groupBy,
    -                    indexBy: indexBy,
    -                    countBy: countBy,
    -                    partition: partition,
    -                    toArray: toArray,
    -                    size: size,
    -                    pick: pick,
    -                    omit: omit,
    -                    first: first,
    -                    head: first,
    -                    take: first,
    -                    initial: initial,
    -                    last: last,
    -                    rest: rest,
    -                    tail: rest,
    -                    drop: rest,
    -                    compact: compact,
    -                    flatten: flatten,
    -                    without: without,
    -                    uniq: uniq,
    -                    unique: uniq,
    -                    union: union,
    -                    intersection: intersection,
    -                    difference: difference,
    -                    unzip: unzip,
    -                    transpose: unzip,
    -                    zip: zip,
    -                    object: object,
    -                    range: range,
    -                    chunk: chunk,
    -                    mixin: mixin,
    -                    'default': _$1
    -                };
    +// Named Exports
    +
    +var allExports = {
    +  __proto__: null,
    +  VERSION: VERSION,
    +  restArguments: restArguments,
    +  isObject: isObject,
    +  isNull: isNull,
    +  isUndefined: isUndefined,
    +  isBoolean: isBoolean,
    +  isElement: isElement,
    +  isString: isString,
    +  isNumber: isNumber,
    +  isDate: isDate,
    +  isRegExp: isRegExp,
    +  isError: isError,
    +  isSymbol: isSymbol,
    +  isArrayBuffer: isArrayBuffer,
    +  isDataView: isDataView$1,
    +  isArray: isArray,
    +  isFunction: isFunction$1,
    +  isArguments: isArguments$1,
    +  isFinite: isFinite$1,
    +  isNaN: isNaN$1,
    +  isTypedArray: isTypedArray$1,
    +  isEmpty: isEmpty,
    +  isMatch: isMatch,
    +  isEqual: isEqual,
    +  isMap: isMap,
    +  isWeakMap: isWeakMap,
    +  isSet: isSet,
    +  isWeakSet: isWeakSet,
    +  keys: keys,
    +  allKeys: allKeys,
    +  values: values,
    +  pairs: pairs,
    +  invert: invert,
    +  functions: functions,
    +  methods: functions,
    +  extend: extend,
    +  extendOwn: extendOwn,
    +  assign: extendOwn,
    +  defaults: defaults,
    +  create: create,
    +  clone: clone,
    +  tap: tap,
    +  get: get,
    +  has: has,
    +  mapObject: mapObject,
    +  identity: identity,
    +  constant: constant,
    +  noop: noop,
    +  toPath: toPath$1,
    +  property: property,
    +  propertyOf: propertyOf,
    +  matcher: matcher,
    +  matches: matcher,
    +  times: times,
    +  random: random,
    +  now: now,
    +  escape: _escape,
    +  unescape: _unescape,
    +  templateSettings: templateSettings,
    +  template: template,
    +  result: result,
    +  uniqueId: uniqueId,
    +  chain: chain,
    +  iteratee: iteratee,
    +  partial: partial,
    +  bind: bind,
    +  bindAll: bindAll,
    +  memoize: memoize,
    +  delay: delay,
    +  defer: defer,
    +  throttle: throttle,
    +  debounce: debounce,
    +  wrap: wrap,
    +  negate: negate,
    +  compose: compose,
    +  after: after,
    +  before: before,
    +  once: once,
    +  findKey: findKey,
    +  findIndex: findIndex,
    +  findLastIndex: findLastIndex,
    +  sortedIndex: sortedIndex,
    +  indexOf: indexOf,
    +  lastIndexOf: lastIndexOf,
    +  find: find,
    +  detect: find,
    +  findWhere: findWhere,
    +  each: each,
    +  forEach: each,
    +  map: map,
    +  collect: map,
    +  reduce: reduce,
    +  foldl: reduce,
    +  inject: reduce,
    +  reduceRight: reduceRight,
    +  foldr: reduceRight,
    +  filter: filter,
    +  select: filter,
    +  reject: reject,
    +  every: every,
    +  all: every,
    +  some: some,
    +  any: some,
    +  contains: contains,
    +  includes: contains,
    +  include: contains,
    +  invoke: invoke,
    +  pluck: pluck,
    +  where: where,
    +  max: max,
    +  min: min,
    +  shuffle: shuffle,
    +  sample: sample,
    +  sortBy: sortBy,
    +  groupBy: groupBy,
    +  indexBy: indexBy,
    +  countBy: countBy,
    +  partition: partition,
    +  toArray: toArray,
    +  size: size,
    +  pick: pick,
    +  omit: omit,
    +  first: first,
    +  head: first,
    +  take: first,
    +  initial: initial,
    +  last: last,
    +  rest: rest,
    +  tail: rest,
    +  drop: rest,
    +  compact: compact,
    +  flatten: flatten,
    +  without: without,
    +  uniq: uniq,
    +  unique: uniq,
    +  union: union,
    +  intersection: intersection,
    +  difference: difference,
    +  unzip: unzip,
    +  transpose: unzip,
    +  zip: zip,
    +  object: object,
    +  range: range,
    +  chunk: chunk,
    +  mixin: mixin,
    +  'default': _$1
    +};
     
    -                // Default Export
    -
    -                // Add all of the Underscore functions to the wrapper object.
    -                var _ = mixin(allExports);
    -                // Legacy Node.js API.
    -                _._ = _;
    -
    -                exports.VERSION = VERSION;
    -                exports._ = _;
    -                exports._escape = _escape;
    -                exports._unescape = _unescape;
    -                exports.after = after;
    -                exports.allKeys = allKeys;
    -                exports.before = before;
    -                exports.bind = bind;
    -                exports.bindAll = bindAll;
    -                exports.chain = chain;
    -                exports.chunk = chunk;
    -                exports.clone = clone;
    -                exports.compact = compact;
    -                exports.compose = compose;
    -                exports.constant = constant;
    -                exports.contains = contains;
    -                exports.countBy = countBy;
    -                exports.create = create;
    -                exports.debounce = debounce;
    -                exports.defaults = defaults;
    -                exports.defer = defer;
    -                exports.delay = delay;
    -                exports.difference = difference;
    -                exports.each = each;
    -                exports.every = every;
    -                exports.extend = extend;
    -                exports.extendOwn = extendOwn;
    -                exports.filter = filter;
    -                exports.find = find;
    -                exports.findIndex = findIndex;
    -                exports.findKey = findKey;
    -                exports.findLastIndex = findLastIndex;
    -                exports.findWhere = findWhere;
    -                exports.first = first;
    -                exports.flatten = flatten;
    -                exports.functions = functions;
    -                exports.get = get;
    -                exports.groupBy = groupBy;
    -                exports.has = has;
    -                exports.identity = identity;
    -                exports.indexBy = indexBy;
    -                exports.indexOf = indexOf;
    -                exports.initial = initial;
    -                exports.intersection = intersection;
    -                exports.invert = invert;
    -                exports.invoke = invoke;
    -                exports.isArguments = isArguments$1;
    -                exports.isArray = isArray;
    -                exports.isArrayBuffer = isArrayBuffer;
    -                exports.isBoolean = isBoolean;
    -                exports.isDataView = isDataView$1;
    -                exports.isDate = isDate;
    -                exports.isElement = isElement;
    -                exports.isEmpty = isEmpty;
    -                exports.isEqual = isEqual;
    -                exports.isError = isError;
    -                exports.isFinite = isFinite$1;
    -                exports.isFunction = isFunction$1;
    -                exports.isMap = isMap;
    -                exports.isMatch = isMatch;
    -                exports.isNaN = isNaN$1;
    -                exports.isNull = isNull;
    -                exports.isNumber = isNumber;
    -                exports.isObject = isObject;
    -                exports.isRegExp = isRegExp;
    -                exports.isSet = isSet;
    -                exports.isString = isString;
    -                exports.isSymbol = isSymbol;
    -                exports.isTypedArray = isTypedArray$1;
    -                exports.isUndefined = isUndefined;
    -                exports.isWeakMap = isWeakMap;
    -                exports.isWeakSet = isWeakSet;
    -                exports.iteratee = iteratee;
    -                exports.keys = keys;
    -                exports.last = last;
    -                exports.lastIndexOf = lastIndexOf;
    -                exports.map = map;
    -                exports.mapObject = mapObject;
    -                exports.matcher = matcher;
    -                exports.max = max;
    -                exports.memoize = memoize;
    -                exports.min = min;
    -                exports.mixin = mixin;
    -                exports.negate = negate;
    -                exports.noop = noop;
    -                exports.now = now;
    -                exports.object = object;
    -                exports.omit = omit;
    -                exports.once = once;
    -                exports.pairs = pairs;
    -                exports.partial = partial;
    -                exports.partition = partition;
    -                exports.pick = pick;
    -                exports.pluck = pluck;
    -                exports.property = property;
    -                exports.propertyOf = propertyOf;
    -                exports.random = random;
    -                exports.range = range;
    -                exports.reduce = reduce;
    -                exports.reduceRight = reduceRight;
    -                exports.reject = reject;
    -                exports.rest = rest;
    -                exports.restArguments = restArguments;
    -                exports.result = result;
    -                exports.sample = sample;
    -                exports.shuffle = shuffle;
    -                exports.size = size;
    -                exports.some = some;
    -                exports.sortBy = sortBy;
    -                exports.sortedIndex = sortedIndex;
    -                exports.tap = tap;
    -                exports.template = template;
    -                exports.templateSettings = templateSettings;
    -                exports.throttle = throttle;
    -                exports.times = times;
    -                exports.toArray = toArray;
    -                exports.toPath = toPath$1;
    -                exports.union = union;
    -                exports.uniq = uniq;
    -                exports.uniqueId = uniqueId;
    -                exports.unzip = unzip;
    -                exports.values = values;
    -                exports.where = where;
    -                exports.without = without;
    -                exports.wrap = wrap;
    -                exports.zip = zip;
    -                //# sourceMappingURL=underscore-node-f.cjs.map
    -
    -
    -                /***/
    -}),
    +// Default Export
    +
    +// Add all of the Underscore functions to the wrapper object.
    +var _ = mixin(allExports);
    +// Legacy Node.js API.
    +_._ = _;
    +
    +exports.VERSION = VERSION;
    +exports._ = _;
    +exports._escape = _escape;
    +exports._unescape = _unescape;
    +exports.after = after;
    +exports.allKeys = allKeys;
    +exports.before = before;
    +exports.bind = bind;
    +exports.bindAll = bindAll;
    +exports.chain = chain;
    +exports.chunk = chunk;
    +exports.clone = clone;
    +exports.compact = compact;
    +exports.compose = compose;
    +exports.constant = constant;
    +exports.contains = contains;
    +exports.countBy = countBy;
    +exports.create = create;
    +exports.debounce = debounce;
    +exports.defaults = defaults;
    +exports.defer = defer;
    +exports.delay = delay;
    +exports.difference = difference;
    +exports.each = each;
    +exports.every = every;
    +exports.extend = extend;
    +exports.extendOwn = extendOwn;
    +exports.filter = filter;
    +exports.find = find;
    +exports.findIndex = findIndex;
    +exports.findKey = findKey;
    +exports.findLastIndex = findLastIndex;
    +exports.findWhere = findWhere;
    +exports.first = first;
    +exports.flatten = flatten;
    +exports.functions = functions;
    +exports.get = get;
    +exports.groupBy = groupBy;
    +exports.has = has;
    +exports.identity = identity;
    +exports.indexBy = indexBy;
    +exports.indexOf = indexOf;
    +exports.initial = initial;
    +exports.intersection = intersection;
    +exports.invert = invert;
    +exports.invoke = invoke;
    +exports.isArguments = isArguments$1;
    +exports.isArray = isArray;
    +exports.isArrayBuffer = isArrayBuffer;
    +exports.isBoolean = isBoolean;
    +exports.isDataView = isDataView$1;
    +exports.isDate = isDate;
    +exports.isElement = isElement;
    +exports.isEmpty = isEmpty;
    +exports.isEqual = isEqual;
    +exports.isError = isError;
    +exports.isFinite = isFinite$1;
    +exports.isFunction = isFunction$1;
    +exports.isMap = isMap;
    +exports.isMatch = isMatch;
    +exports.isNaN = isNaN$1;
    +exports.isNull = isNull;
    +exports.isNumber = isNumber;
    +exports.isObject = isObject;
    +exports.isRegExp = isRegExp;
    +exports.isSet = isSet;
    +exports.isString = isString;
    +exports.isSymbol = isSymbol;
    +exports.isTypedArray = isTypedArray$1;
    +exports.isUndefined = isUndefined;
    +exports.isWeakMap = isWeakMap;
    +exports.isWeakSet = isWeakSet;
    +exports.iteratee = iteratee;
    +exports.keys = keys;
    +exports.last = last;
    +exports.lastIndexOf = lastIndexOf;
    +exports.map = map;
    +exports.mapObject = mapObject;
    +exports.matcher = matcher;
    +exports.max = max;
    +exports.memoize = memoize;
    +exports.min = min;
    +exports.mixin = mixin;
    +exports.negate = negate;
    +exports.noop = noop;
    +exports.now = now;
    +exports.object = object;
    +exports.omit = omit;
    +exports.once = once;
    +exports.pairs = pairs;
    +exports.partial = partial;
    +exports.partition = partition;
    +exports.pick = pick;
    +exports.pluck = pluck;
    +exports.property = property;
    +exports.propertyOf = propertyOf;
    +exports.random = random;
    +exports.range = range;
    +exports.reduce = reduce;
    +exports.reduceRight = reduceRight;
    +exports.reject = reject;
    +exports.rest = rest;
    +exports.restArguments = restArguments;
    +exports.result = result;
    +exports.sample = sample;
    +exports.shuffle = shuffle;
    +exports.size = size;
    +exports.some = some;
    +exports.sortBy = sortBy;
    +exports.sortedIndex = sortedIndex;
    +exports.tap = tap;
    +exports.template = template;
    +exports.templateSettings = templateSettings;
    +exports.throttle = throttle;
    +exports.times = times;
    +exports.toArray = toArray;
    +exports.toPath = toPath$1;
    +exports.union = union;
    +exports.uniq = uniq;
    +exports.uniqueId = uniqueId;
    +exports.unzip = unzip;
    +exports.values = values;
    +exports.where = where;
    +exports.without = without;
    +exports.wrap = wrap;
    +exports.zip = zip;
    +//# sourceMappingURL=underscore-node-f.cjs.map
    +
    +
    +/***/ }),
     
     /***/ 5067:
     /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
     
    -                //     Underscore.js 1.13.6
    -                //     https://underscorejs.org
    -                //     (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
    -                //     Underscore may be freely distributed under the MIT license.
    +//     Underscore.js 1.13.6
    +//     https://underscorejs.org
    +//     (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors
    +//     Underscore may be freely distributed under the MIT license.
     
    -                var underscoreNodeF = __nccwpck_require__(6717);
    +var underscoreNodeF = __nccwpck_require__(6717);
     
     
     
    -                module.exports = underscoreNodeF._;
    -                //# sourceMappingURL=underscore-node.cjs.map
    +module.exports = underscoreNodeF._;
    +//# sourceMappingURL=underscore-node.cjs.map
     
     
    -                /***/
    -})
    +/***/ })
     
    -        /******/
    -});
    +/******/ 	});
     /************************************************************************/
     /******/ 	// The module cache
     /******/ 	var __webpack_module_cache__ = {};
    -/******/
    +/******/ 	
     /******/ 	// The require function
     /******/ 	function __nccwpck_require__(moduleId) {
     /******/ 		// Check if module is in cache
     /******/ 		var cachedModule = __webpack_module_cache__[moduleId];
     /******/ 		if (cachedModule !== undefined) {
     /******/ 			return cachedModule.exports;
    -            /******/
    -}
    +/******/ 		}
     /******/ 		// Create a new module (and put it into the cache)
     /******/ 		var module = __webpack_module_cache__[moduleId] = {
     /******/ 			// no module.id needed
     /******/ 			// no module.loaded needed
     /******/ 			exports: {}
    -            /******/
    -};
    -/******/
    +/******/ 		};
    +/******/ 	
     /******/ 		// Execute the module function
     /******/ 		var threw = true;
     /******/ 		try {
     /******/ 			__webpack_modules__[moduleId].call(module.exports, module, module.exports, __nccwpck_require__);
     /******/ 			threw = false;
    -            /******/
    -} finally {
    -/******/ 			if (threw) delete __webpack_module_cache__[moduleId];
    -            /******/
    -}
    -/******/
    +/******/ 		} finally {
    +/******/ 			if(threw) delete __webpack_module_cache__[moduleId];
    +/******/ 		}
    +/******/ 	
     /******/ 		// Return the exports of the module
     /******/ 		return module.exports;
    -        /******/
    -}
    -/******/
    +/******/ 	}
    +/******/ 	
     /************************************************************************/
     /******/ 	/* webpack/runtime/compat */
    -/******/
    +/******/ 	
     /******/ 	if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/";
    -/******/
    +/******/ 	
     /************************************************************************/
    -/******/
    +/******/ 	
     /******/ 	// startup
     /******/ 	// Load entry module and return exports
     /******/ 	// This entry module is referenced by other modules so it can't be inlined
     /******/ 	var __webpack_exports__ = __nccwpck_require__(399);
     /******/ 	module.exports = __webpack_exports__;
    -    /******/
    -    /******/
    -})()
    -    ;
    \ No newline at end of file
    +/******/ 	
    +/******/ })()
    +;
    \ No newline at end of file
    diff --git a/package.json b/package.json
    index 6f9b8853..1d7ae3f7 100644
    --- a/package.json
    +++ b/package.json
    @@ -72,11 +72,7 @@
       "devDependencies": {
         "@jest/globals": "^29.7.0",
         "@types/jest": "^29.5.12",
    -<<<<<<< HEAD
    -    "@types/node": "^20.13.0",
    -=======
         "@types/node": "^20.14.10",
    ->>>>>>> b5cac74e1522cb380b8058e12c6e2197447feadb
         "@types/tar": "^6.1.13",
         "@typescript-eslint/eslint-plugin": "^7.16.0",
         "@typescript-eslint/parser": "^7.16.0",
    @@ -92,4 +88,4 @@
         "ts-jest": "^29.2.0",
         "typescript": "5.5.3"
       }
    -}
    +}
    \ No newline at end of file
    
    From e374b9ed936d80eb0ea7ee431ffe2082cbcb94f4 Mon Sep 17 00:00:00 2001
    From: Ben 
    Date: Wed, 10 Jul 2024 13:05:35 +0100
    Subject: [PATCH 15/15] Only make files executable
    
    ---
     dist/index.js | 26 ++++++++++++++------------
     src/main.ts   | 28 +++++++++++++++-------------
     2 files changed, 29 insertions(+), 25 deletions(-)
    
    diff --git a/dist/index.js b/dist/index.js
    index 3c303c8b..fd157081 100644
    --- a/dist/index.js
    +++ b/dist/index.js
    @@ -31261,19 +31261,21 @@ async function run() {
                 // Make executables executable
                 for (const file of (0, node_fs_1.readdirSync)(out)) {
                     let full = (0, node_path_1.join)(out, file);
    -                const toSliceTo = /-(v?)[0-9]/.exec(file);
    -                if (toSliceTo) {
    -                    const old = full;
    -                    full = (0, node_path_1.join)(out, file.slice(0, toSliceTo.index));
    -                    (0, node_fs_1.renameSync)(old, full);
    -                    core.debug(`Renamed ${old} to ${full}`);
    +                if ((0, node_fs_1.statSync)(full).isFile()) {
    +                    const toSliceTo = /-(v?)[0-9]/.exec(file);
    +                    if (toSliceTo) {
    +                        const old = full;
    +                        full = (0, node_path_1.join)(out, file.slice(0, toSliceTo.index));
    +                        (0, node_fs_1.renameSync)(old, full);
    +                        core.debug(`Renamed ${old} to ${full}`);
    +                    }
    +                    const newMode = (0, node_fs_1.statSync)(full).mode |
    +                        node_fs_1.constants.S_IXUSR |
    +                        node_fs_1.constants.S_IXGRP |
    +                        node_fs_1.constants.S_IXOTH;
    +                    (0, node_fs_1.chmodSync)(full, newMode);
    +                    core.info(`Made ${full} executable`);
                     }
    -                const newMode = (0, node_fs_1.statSync)(full).mode |
    -                    node_fs_1.constants.S_IXUSR |
    -                    node_fs_1.constants.S_IXGRP |
    -                    node_fs_1.constants.S_IXOTH;
    -                (0, node_fs_1.chmodSync)(full, newMode);
    -                core.info(`Made ${full} executable`);
                 }
                 core.addPath(out);
                 core.info(`Added ${out} to PATH`);
    diff --git a/src/main.ts b/src/main.ts
    index b56ec601..3092e3f7 100644
    --- a/src/main.ts
    +++ b/src/main.ts
    @@ -43,20 +43,22 @@ async function run(): Promise {
           // Make executables executable
           for (const file of readdirSync(out)) {
             let full = join(out, file)
    -        const toSliceTo = /-(v?)[0-9]/.exec(file)
    -        if (toSliceTo) {
    -          const old = full
    -          full = join(out, file.slice(0, toSliceTo.index))
    -          renameSync(old, full)
    -          core.debug(`Renamed ${old} to ${full}`)
    +        if (statSync(full).isFile()) {
    +          const toSliceTo = /-(v?)[0-9]/.exec(file)
    +          if (toSliceTo) {
    +            const old = full
    +            full = join(out, file.slice(0, toSliceTo.index))
    +            renameSync(old, full)
    +            core.debug(`Renamed ${old} to ${full}`)
    +          }
    +          const newMode =
    +            statSync(full).mode |
    +            constants.S_IXUSR |
    +            constants.S_IXGRP |
    +            constants.S_IXOTH
    +          chmodSync(full, newMode)
    +          core.info(`Made ${full} executable`)
             }
    -        const newMode =
    -          statSync(full).mode |
    -          constants.S_IXUSR |
    -          constants.S_IXGRP |
    -          constants.S_IXOTH
    -        chmodSync(full, newMode)
    -        core.info(`Made ${full} executable`)
           }
           core.addPath(out)
           core.info(`Added ${out} to PATH`)